Ocr.php 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Models\OcrLog;
  4. use Illuminate\Http\Request;
  5. use App\Services\ToolsServices;
  6. class Ocr
  7. {
  8. static $mustExtractEntity = [
  9. [
  10. 'entity' => '白细胞',
  11. 'company' => ['10^9/L','10^9/l'],
  12. 'code' => 'wbc'
  13. ],
  14. [
  15. 'entity' => '中性粒细胞',
  16. 'company' => ['10^9/L','10^9/l'],
  17. 'code' => 'meut'
  18. ],
  19. [
  20. 'entity' => '中性粒细胞百分比',
  21. 'company' => ['10^9/L','10^9/l'],
  22. 'code' => 'meut%'
  23. ],
  24. [
  25. 'entity' => '淋巴细胞',
  26. 'company' => ['10^9/L','10^9/l'],
  27. 'code' => 'lymph'
  28. ],
  29. [
  30. 'entity' => '单核细胞',
  31. 'company' => ['10^9/L','10^9/l'],
  32. 'code' => 'monocytes'
  33. ],
  34. [
  35. 'entity' => '嗜酸粒细胞',
  36. 'company' => ['10^9/L','10^9/l'],
  37. 'code' => 'eos'
  38. ],
  39. [
  40. 'entity' => '嗜碱性粒细胞',
  41. 'company' => ['10^9/L','10^9/l'],
  42. 'code' => 'basophil'
  43. ],
  44. [
  45. 'entity' => '红细胞',
  46. 'company' => ['10^12/L','10^12/l'],
  47. 'code' => 'rbc'
  48. ],
  49. [
  50. 'entity' => '血红蛋白',
  51. 'company' => ['10^12/L','10^12/l'],
  52. 'code' => 'hgb'
  53. ],
  54. [
  55. 'entity' => '红细胞比容/红细胞压积',
  56. 'company' => ['L/L'],
  57. 'code' => '红细胞比容/红细胞压积'
  58. ],
  59. [
  60. 'entity' => '红细胞平均体积',
  61. 'company' => ['fL','fl'],
  62. 'code' => 'mcv'
  63. ],
  64. [
  65. 'entity' => '平均血红蛋白含量',
  66. 'company' => ['g/L','g/l'],
  67. 'code' => 'mch'
  68. ],
  69. [
  70. 'entity' => '平均血红蛋白浓度',
  71. 'company' => ['g/L','g/l'],
  72. 'code' => 'mchc'
  73. ],
  74. [
  75. 'entity' => '红细胞分布宽度变异系数',
  76. 'company' => ['%'],
  77. 'code' => '红细胞分布宽度变异系数'
  78. ],
  79. [
  80. 'entity' => '红细胞分布宽度标准差',
  81. 'company' => ['fL','fl'],
  82. 'code' => '红细胞分布宽度标准差'
  83. ],
  84. [
  85. 'entity' => '血小板',
  86. 'company' => ['10^9/L','10^9/l'],
  87. 'code' => 'plt'
  88. ],
  89. [
  90. 'entity' => '平均血小板体积',
  91. 'company' => ['fL','fl'],
  92. 'code' => 'mpv'
  93. ],
  94. [
  95. 'entity' => '血小板体积分布宽度',
  96. 'company' => ['fL','fl'],
  97. 'code' => 'pdw'
  98. ],
  99. [
  100. 'entity' => '血小板压积',
  101. 'company' => ['%'],
  102. 'code' => 'pct'
  103. ],
  104. [
  105. 'entity' => '丙氨酸转氨酶(谷丙)',
  106. 'company' => ['U/L'],
  107. 'code' => 'alt'
  108. ],
  109. [
  110. 'entity' => '天门冬氨酸氨基转移酶',
  111. 'company' => ['U/L'],
  112. 'code' => 'ast'
  113. ],
  114. [
  115. 'entity' => '碱性磷酸酶',
  116. 'company' => ['U/L'],
  117. 'code' => 'alp'
  118. ],
  119. [
  120. 'entity' => 'γ-谷氨酰基转移酶',
  121. 'company' => ['U/L'],
  122. 'code' => 'ggt'
  123. ],
  124. [
  125. 'entity' => '胆碱酯酶',
  126. 'company' => ['U/L'],
  127. 'code' => 'che'
  128. ],
  129. [
  130. 'entity' => '总蛋白',
  131. 'company' => ['g/L','g/l'],
  132. 'code' => 'tp'
  133. ],
  134. [
  135. 'entity' => '白蛋白',
  136. 'company' => ['g/L','g/l'],
  137. 'code' => 'alb'
  138. ],
  139. [
  140. 'entity' => '球蛋白',
  141. 'company' => ['g/L','g/l'],
  142. 'code' => 'glb'
  143. ],
  144. [
  145. 'entity' => '白/球蛋白比值',
  146. 'company' => ['%'],
  147. 'code' => 'a:g'
  148. ],
  149. [
  150. 'entity' => '总胆红素',
  151. 'company' => ['umol/L','umol/l'],
  152. 'code' => 'tbil'
  153. ],
  154. [
  155. 'entity' => '直接胆红素',
  156. 'company' => ['umol/L','umol/l'],
  157. 'code' => 'dbil'
  158. ],
  159. [
  160. 'entity' => '间接胆红素',
  161. 'company' => ['umol/L','umol/l'],
  162. 'code' => 'ibil'
  163. ],
  164. [
  165. 'entity' => '岩藻糖苷酶',
  166. 'company' => ['umol/L','umol/l'],
  167. 'code' => '岩藻糖苷酶'
  168. ],
  169. [
  170. 'entity' => '尿素',
  171. 'company' => ['umol/L','umol/l'],
  172. 'code' => '尿素'
  173. ],
  174. [
  175. 'entity' => '尿酸',
  176. 'company' => ['umol/L','umol/l'],
  177. 'code' => 'uric'
  178. ],
  179. [
  180. 'entity' => '肌酐',
  181. 'company' => ['umol/L','umol/l'],
  182. 'code' => 'crea'
  183. ],
  184. [
  185. 'entity' => '葡萄糖',
  186. 'company' => ['umol/L','umol/l'],
  187. 'code' => 'glu'
  188. ],
  189. [
  190. 'entity' => '总胆固醇',
  191. 'company' => ['umol/L','umol/l'],
  192. 'code' => 'chol'
  193. ],
  194. [
  195. 'entity' => '甘油三酯',
  196. 'company' => ['umol/L','umol/l'],
  197. 'code' => 'tg'
  198. ],
  199. [
  200. 'entity' => '高密度脂蛋白',
  201. 'company' => ['umol/L','umol/l'],
  202. 'code' => 'hdl'
  203. ],
  204. [
  205. 'entity' => '低密度脂蛋白',
  206. 'company' => ['umol/L','umol/l'],
  207. 'code' => 'ldl'
  208. ],
  209. [
  210. 'entity' => '小而密低密度脂蛋白',
  211. 'company' => ['umol/L','umol/l'],
  212. 'code' => 'sdldl'
  213. ],
  214. [
  215. 'entity' => '载脂蛋白A1',
  216. 'company' => ['g/L','g/l'],
  217. 'code' => 'apoa1'
  218. ],
  219. [
  220. 'entity' => '载脂蛋白B',
  221. 'company' => ['g/L','g/l'],
  222. 'code' => 'apob'
  223. ],
  224. [
  225. 'entity' => '肌酸激酶',
  226. 'company' => ['U/L'],
  227. 'code' => 'ck'
  228. ],
  229. [
  230. 'entity' => '肌酸激酶同工酶',
  231. 'company' => ['U/L'],
  232. 'code' => 'ckmb'
  233. ],
  234. [
  235. 'entity' => 'α羟基丁酸脱氢酶',
  236. 'company' => ['U/L'],
  237. 'code' => 'α羟基丁酸脱氢酶'
  238. ],
  239. [
  240. 'entity' => '乳酸脱氢酶',
  241. 'company' => ['U/L'],
  242. 'code' => 'ldh'
  243. ],
  244. [
  245. 'entity' => '同型半胱氨酸',
  246. 'company' => ['μmol/L','μmol/l'],
  247. 'code' => 'hcy'
  248. ],
  249. [
  250. 'entity' => '钙',
  251. 'company' => ['mmol/L','mmol/l'],
  252. 'code' => 'ca'
  253. ],
  254. [
  255. 'entity' => '钾',
  256. 'company' => ['mmol/L','mmol/l'],
  257. 'code' => 'k'
  258. ],
  259. [
  260. 'entity' => '钠',
  261. 'company' => ['mmol/L','mmol/l'],
  262. 'code' => 'na'
  263. ],
  264. [
  265. 'entity' => '氯',
  266. 'company' => ['mmol/L','mmol/l'],
  267. 'code' => 'c1'
  268. ],
  269. [
  270. 'entity' => '铁',
  271. 'company' => ['mmol/L','mmol/l'],
  272. 'code' => 'fe'
  273. ],
  274. [
  275. 'entity' => '镁',
  276. 'company' => ['mmol/L','mmol/l'],
  277. 'code' => 'mg'
  278. ],
  279. [
  280. 'entity' => '总胆汁酸',
  281. 'company' => ['μmol/L','μmol/l','umol/l','umol/L'],
  282. 'code' => 'tba'
  283. ],
  284. [
  285. 'entity' => '超敏C反应蛋白',
  286. 'company' => ['mg/L'],
  287. 'code' => '超敏C反应蛋白'
  288. ],
  289. ];
  290. public function ocr(Request $request)
  291. {
  292. $file = $request->file('file');
  293. if ($file->getSize() > (4 * 1024 * 1024)) {
  294. return ToolsServices::error('文件大小超过限制');
  295. }
  296. // $rtn = self::run($file->getRealPath());
  297. // $content = json_decode($rtn, true);
  298. // dd($content);
  299. $rtn = self::callOcr($file);
  300. $word = self::formatTestSheet($rtn);
  301. $file = $file->store('image');
  302. // $content = json_decode($rtn, true);
  303. // $items = $content['words_result'];
  304. $result = [];
  305. $serCodes = [];
  306. foreach ($word as $key => $val) {
  307. //0参考区间
  308. //1单位
  309. //2参考区间
  310. //4 结果
  311. //6代号
  312. //7名称
  313. if (stripos($val['range'], '--') !== false) {
  314. $fanwei = explode('--', $val['range']);
  315. } else {
  316. $fanwei = explode('-', $val['range']);
  317. }
  318. if (!isset($fanwei[1]) || in_array($val['entity'], ['超敏肌钙蛋白I'])) {
  319. continue;
  320. }
  321. if (stripos($val['entity'], ')') !== false) {
  322. preg_match('/\((.*?)\)/', $val['entity'], $matches);
  323. if (!isset($matches[1])) {
  324. continue;
  325. }
  326. $val['code'] = $matches[1];
  327. }
  328. if (!empty($val['value']) && !empty($val['entity']) && empty($val['code'])) {
  329. $val['code'] = $this->getCode($val['entity'], $serCodes);
  330. $serCodes[] = $val['code'];
  331. }
  332. $fanwei = $this->fanwei($val['code'], $val['entity'], $val['value'], $fanwei);
  333. if (empty($fanwei)) {
  334. continue;
  335. }
  336. $result[] = $fanwei;
  337. }
  338. $qingxu = self::jisuan($result);
  339. $absQx = [];
  340. if (empty($qingxu)) {
  341. return ToolsServices::success([]);
  342. }
  343. foreach ($qingxu as $qxK => $qxV) {
  344. $absQx[$qxK] = abs($qxV);
  345. }
  346. arsort($absQx);
  347. $maxValues = array_slice($absQx, 0, 2);
  348. $sortData = [];
  349. foreach ($maxValues as $keys => $vals) {
  350. $sortData[] = [$keys, $vals];
  351. }
  352. if (count($sortData) == 2) {
  353. $one = $sortData[0];
  354. $two = $sortData[1];
  355. if ($one[1] > $two[1]) {
  356. $data[] = $sortData[0];
  357. } elseif ($one[1] == $two[1]) {
  358. $data = $sortData;
  359. } else {
  360. $data[] = $sortData[1];
  361. }
  362. } else {
  363. $data = $sortData;
  364. }
  365. $insert = [
  366. 'image'=>json_encode([$file]),
  367. 'ocr' => '1111',
  368. 'result' => json_encode($data)
  369. ];
  370. OcrLog::insertData($insert);
  371. return ToolsServices::success($data);
  372. }
  373. public function fanwei($xmdm, $name, $jieguo, $fanwei)
  374. {
  375. $fanwei[0] = (float)$fanwei[0];
  376. $fanwei[1] = (float)$fanwei[1];
  377. $average = ($fanwei[1] - $fanwei[0]) / 5;
  378. $averageArr = [];
  379. $levels = [3, 2, 1, 0, -1, -2, -3];
  380. $averageArr[0] = ['max' => $fanwei[1], 'level' => 3];
  381. for ($i = 1; $i <= 5; $i++) {
  382. if ($i == 1) {
  383. $max = $fanwei[1];
  384. $min = number_format($fanwei[1] - $average * $i, 1);
  385. } else {
  386. $max = number_format($fanwei[1] - $average * ($i - 1), 1);
  387. $min = number_format($fanwei[1] - $average * $i, 1);
  388. }
  389. $averageArr[$i] = ['max' => $max, 'min' => $min, 'level' => $levels[$i]];
  390. }
  391. array_push($averageArr, ['max' => $fanwei[0], 'level' => -3]);
  392. $rangeArr = [
  393. //1. 身体元素
  394. //铁
  395. 'fe' => ['3' => ['焦虑(中)'], '2' => ['焦虑(中)'], '1' => ['焦虑(轻)'], '-1' => ['抑郁(轻)', '愤怒(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  396. //钙
  397. 'ca' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-1' => ['焦虑(轻)', '愤怒(轻)'], '-2' => ['焦虑(中)', '易激惹(中)'], '-3' => ['焦虑(中)', '易激惹(中)']],
  398. //镁
  399. 'mg' => ['-2' => ['焦虑(中)', '易怒(中)', '抑郁(中)'], '-3' => ['焦虑(中)', '易怒(中)', '抑郁(中)']],
  400. //钾
  401. 'k' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  402. //钠
  403. 'na' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  404. //氯
  405. 'c1' => ['3' => ['愤怒(中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '恐惧(轻)'], '-1' => ['抑郁(轻)', '焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)']],
  406. //2. 心肝肾代谢
  407. //丙氨酸转氨酶(谷丙)
  408. 'alt' => ['3' => ['愤怒)中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  409. //天门冬氨酸氨基转移酶(谷草)
  410. 'ast' => ['3' => ['愤怒)中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  411. //碱性磷酸酶
  412. 'alp' => ['3' => ['愤怒)中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  413. //γ-谷氨酰基转移酶
  414. 'ggt' => ['3' => ['愤怒)中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  415. //胆碱酯酶
  416. 'che' => ['3' => ['愤怒)中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  417. //3. 胆功代谢
  418. //总胆红素
  419. 'tbil' => ['3' => ['愤怒(中)', '抑郁(中)'], '2' => ['愤怒(中)', '抑郁(中)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  420. //直接胆红素
  421. 'dbil' => ['3' => ['愤怒(中)', '抑郁(中)', '焦虑)中)'], '2' => ['愤怒(中)', '抑郁(中)', '焦虑(中)'], '1' => ['愤怒)轻)', '抑郁(轻)', '焦虑)轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)']],
  422. //间接胆红素
  423. 'ibil' => ['3' => ['抑郁(中)', '焦虑)中)'], '2' => ['抑郁(中)', '焦虑(中)'], '1' => ['抑郁(轻)', '焦虑(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  424. //4. 糖、脂肪、蛋白质代谢
  425. //同型半胱氨酸
  426. 'hcy' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  427. //葡萄糖
  428. 'glu' => ['3' => ['愤怒(中)', '抑郁(中)', '焦虑(中)'], '2' => ['恐惧(中)', '委屈(轻)', '抑郁(轻)', '焦虑(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  429. //总胆汁酸
  430. 'tba' => ['3' => ['焦虑(中)'], '2' => ['焦虑(中)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '愤怒(中)'], '-3' => ['抑郁(中)', '愤怒(中)']],
  431. //甘油三酯
  432. 'tg' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)'], '-2' => ['抑郁(中)']],
  433. //总胆固醇
  434. 'chol' => ['3' => ['愤怒(中)', '抑郁(中)', '焦虑(中)', '恐惧(中)'], '2' => ['愤怒(中)', '抑郁(中)', '焦虑(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '抑郁(轻)', '焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['焦虑(中)', '抑郁(中)'], '-3' => ['焦虑(中)', '抑郁(中)']],
  435. //高密度脂蛋白
  436. 'hdl' => ['3' => ['愤怒(中)', '焦虑(中)'], '2' => ['愤怒(中)', '焦虑(中)'], '1' => ['抑郁(轻)', '焦虑(轻)'], '-1' => ['愤怒(轻)', '焦虑(轻)'], '-2' => ['愤怒(中)', '焦虑(中)'], '-3' => ['愤怒(中)', '焦虑(中)']],
  437. //低密度脂蛋白
  438. 'ldl' => ['3' => ['抑郁(中)', '焦虑(中)'], '2' => ['抑郁(中)', '焦虑(中)'], '1' => ['抑郁(轻)', '焦虑(轻)'], '-1' => ['愤怒(轻)', '焦虑(轻)'], '-2' => ['愤怒(中)', '焦虑(中)'], '-3' => ['愤怒(中)', '焦虑(中)']],
  439. //小而密低密度脂蛋白
  440. 'sdldl' => ['3' => ['抑郁(中)', '焦虑(中)'], '2' => ['抑郁(中)', '焦虑(中)'], '1' => ['抑郁(轻)', '焦虑(轻)'], '-1' => ['愤怒(轻)', '焦虑(轻)'], '-2' => ['愤怒(中)', '焦虑(中)'], '-3' => ['愤怒(中)', '焦虑(中)']],
  441. //载脂蛋白A1
  442. 'apoa1' => ['3' => ['抑郁(中)', '焦虑(中)'], '2' => ['抑郁(中)', '焦虑(中)'], '1' => ['抑郁(轻)', '焦虑(轻)'], '-1' => ['愤怒(轻)', '焦虑(轻)'], '-2' => ['愤怒(中)', '焦虑(中)'], '-3' => ['愤怒(中)', '焦虑(中)']],
  443. //载脂蛋白B
  444. 'apob' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)']],
  445. //尿酸
  446. 'uric' => ['3' => ['焦虑(中)', '恐惧(中)'], '2' => ['焦虑(中)', '恐惧(中)'], '1' => ['焦虑(轻)']],
  447. // '尿素' => [],
  448. //5. 免疫
  449. //总蛋白
  450. 'tp' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '-2' => ['焦虑(中)', '恐惧(中)'], '-3' => ['焦虑(中)', '恐惧(中)']],
  451. //白蛋白
  452. 'alb' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '1' => ['焦虑(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['焦虑(中)', '恐惧(中)'], '-3' => ['焦虑(中)', '恐惧(中)']],
  453. //球蛋白
  454. 'glb' => ['3' => ['焦虑(中)', '恐惧(中)'], '2' => ['恐惧(中)', '焦虑(中)'], '1' => ['焦虑(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['焦虑(中)', '恐惧(中)'], '-3' => ['焦虑(中)', '恐惧(中)']],
  455. //白(中)球蛋白比值
  456. 'a:g' => ['3' => ['愤怒(中)', '易怒(中)'], '2' => ['愤怒(中)', '易怒(中)'], '1' => ['焦虑(轻)'], '-1' => ['焦虑(中)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  457. //6. 肌肉代谢
  458. //肌酐
  459. 'crea' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '-2' => ['焦虑(中)', '恐惧(中)'], '-3' => ['焦虑(中)', '恐惧(中)']],
  460. //肌酸激酶
  461. 'ck' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '1' => ['焦虑(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['焦虑(中)', '恐惧(中)'], '-3' => ['焦虑(中)', '恐惧(中)']],
  462. //肌酸激酶同工酶
  463. 'ckmb' => ['3' => ['焦虑(中)', '恐惧(中)'], '2' => ['恐惧(中)', '焦虑(中)'], '1' => ['焦虑(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  464. //乳酸脱氢酶
  465. 'ldh' => ['3' => ['焦虑(中)', '恐惧(中)'], '2' => ['恐惧(中)', '焦虑(中)'], '1' => ['焦虑(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  466. //7. 血常规免疫
  467. //白细胞
  468. 'wbc' => ['3' => ['抑郁(中)', '恐惧(中)'], '2' => ['抑郁(中)', '恐惧(中)'], '1' => ['焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  469. //中性粒细胞
  470. 'meut' => ['3' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '2' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '1' => ['愤怒(轻)', '焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)']],
  471. 'meut%' => ['3' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '2' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '1' => ['愤怒(轻)', '焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)']],
  472. //淋巴细胞
  473. 'lymph' => ['3' => ['焦虑(中)', '愤怒(中)'], '2' => ['焦虑(中)', '愤怒(中)'], '1' => ['焦虑(轻)', '愤怒(轻)'], '-1' => ['愤怒(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  474. //单核细胞
  475. 'monocytes' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  476. //嗜酸粒细胞
  477. 'eos' => ['3' => ['焦虑(中)', '恐惧(中)'], '2' => ['恐惧(中)', '焦虑(中)'], '1' => ['焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)']], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)'],
  478. //嗜碱性粒细胞
  479. 'basophil' => ['3' => ['愤怒(中)', '焦虑(中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '1' => ['焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)']],
  480. //8. 贫血
  481. //红细胞
  482. 'rbc' => ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '-1' => ['抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  483. //血红蛋白
  484. 'hgb' => ['3' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '2' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '1' => ['愤怒(轻)', '焦虑(轻)'], '-1' => ['抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  485. '红细胞比容/红细胞压积' => ['3' => ['愤怒(中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)'], '1' => ['愤怒(轻)', '焦虑(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  486. //红细胞平均体积
  487. 'mcv' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)']],
  488. //平均血红蛋白含量
  489. 'mch' => ['3' => ['抑郁(中)'], '2' => ['抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)']],
  490. //平均血红蛋白浓度
  491. 'mchc' => ['3' => ['愤怒(中)', '恐惧(中)'], '2' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '1' => ['焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)', '抑郁(轻)']], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)', '焦虑(中)'],
  492. //红细胞分布宽度
  493. 'rdw-cv' => ['3' => ['抑郁(中)'], '2' => ['抑郁(中)', '焦虑(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  494. //血小板
  495. 'plt' => ['3' => ['焦虑(中)', '愤怒(中)', '抑郁(中)'], '2' => ['抑郁(中)'], '1' => ['焦虑(轻)', '愤怒(轻)'], '-1' => ['愤怒(轻)', '抑郁(轻)'], '-2' => ['抑郁(中)'], '-3' => ['抑郁(中)']],
  496. //平均血小板体积
  497. 'mpv' => ['3' => ['焦虑(中)', '抑郁(中)'], '2' => ['焦虑(中)', '抑郁(中)'], '1' => ['焦虑(轻)', '抑郁(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  498. //血小板体积分布宽度
  499. 'pdw' => ['3' => ['抑郁(中)'], '2' => ['抑郁(中)'], '1' => ['焦虑(轻)', '恐惧(轻)']],
  500. //血小板压积
  501. 'pct' => ['3' => ['抑郁(中)'], '2' => ['抑郁(中)', '焦虑(中)'], '1' => ['焦虑(轻)', '恐惧(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']],
  502. ];
  503. $reslut = [];
  504. $xmdm = strtolower($xmdm);
  505. if (!isset($rangeArr[$xmdm])) {
  506. return $reslut;
  507. }
  508. $ra = $rangeArr[$xmdm];
  509. //范围
  510. foreach ($averageArr as $akey => $aval) {
  511. if ($jieguo > $averageArr[0]['max']) {
  512. if (!isset($ra[$averageArr[0]['level']])) {
  513. break;
  514. }
  515. $reslut[$xmdm] = ['name' => $name] + ['status' => $ra[$averageArr[0]['level']]] + ['level' => 3] + ['result' => $jieguo] + ['reference' => $fanwei[1] . '-' . $fanwei[0]] + ['range' => json_encode($averageArr)];
  516. break;
  517. } elseif (isset($aval['min']) && $jieguo > $aval['min'] && $jieguo < $aval['max']) {
  518. if (!isset($ra[$aval['level']])) {
  519. break;
  520. }
  521. $reslut[$xmdm] = ['name' => $name] + ['status' => $ra[$aval['level']]] + ['level' => $aval['level']] + ['result' => $jieguo] + ['reference' => $fanwei[1] . '-' . $fanwei[0]] + ['range' => json_encode($averageArr)];
  522. break;
  523. } elseif ($jieguo < $averageArr[6]['max']) {
  524. if (!isset($ra[$averageArr[6]['level']])) {
  525. break;
  526. }
  527. $reslut[$xmdm] = ['name' => $name] + ['status' => $ra[$averageArr[6]['level']]] + ['level' => -3] + ['result' => $jieguo] + ['reference' => $fanwei[1] . '-' . $fanwei[0]] + ['range' => json_encode($averageArr)];
  528. break;
  529. }
  530. }
  531. return $reslut;
  532. }
  533. public static function jisuan($data)
  534. {
  535. //身体元素 钾钠氯铁钙镁
  536. $shenti = ['k', 'na', 'c1', 'fe', 'ca', 'mg'];
  537. // $fe = ['-2' => -2 * 99, '-3' => -3 * 99];
  538. // $na = ['-3' => -3 * 99];
  539. $re = [];
  540. $xiangmuArr = [];
  541. $shentiRes = [];
  542. foreach ($data as $key => $item) {
  543. foreach ($item as $dm => $val) {
  544. if (in_array($dm, $shenti)) {
  545. if ($dm == 'fe') {
  546. if ($val['level'] == -2) {
  547. $val['level'] = -2 * 99;
  548. }
  549. if ($val['level'] == -3) {
  550. $val['level'] = -3 * 99;
  551. }
  552. }
  553. if ($dm == 'na') {
  554. if ($val['level'] == -3) {
  555. $val['level'] = -3 * 99;
  556. }
  557. }
  558. //var_dump($val['status'], $dm);
  559. foreach ($val['status'] as $sts) {
  560. if (!isset($shentiRes[$sts])) {
  561. $shentiRes[$sts] = $val['level'];
  562. } else {
  563. $shentiRes[$sts] += $val['level'];
  564. }
  565. }
  566. }
  567. $xiangmuArr[$dm] = $val;
  568. }
  569. }
  570. $re['shenti'] = $shentiRes;
  571. //【肝】 γ-谷氨酰基转移酶 --ggt
  572. $ganVal = [];
  573. $gxsRes = [];
  574. if (isset($xiangmuArr['ggt'])) {
  575. $ganFanWeiArr = ['3' => ['愤怒(中)'], '2' => ['愤怒(中)'], '1' => ['愤怒(轻)'], '-1' => ['焦虑(轻)'], '-2' => ['抑郁(中)', '焦虑(中)'], '-3' => ['抑郁(中)']];
  576. if (isset($ganFanWeiArr[$xiangmuArr['ggt']['level']])) {
  577. $ganVal = ['status' => $ganFanWeiArr[$xiangmuArr['ggt']['level']], 'val' => $xiangmuArr['ggt']['level']];
  578. foreach ($ganFanWeiArr[$xiangmuArr['ggt']['level']] as $gan) {
  579. if (!isset($gxsRes[$gan])) {
  580. $gxsRes[$gan] = $xiangmuArr['ggt']['level'];
  581. } else {
  582. $gxsRes[$gan] += $xiangmuArr['ggt']['level'];
  583. }
  584. }
  585. }
  586. }
  587. //【心】[丙氨基转移酶alt]*2-[γ-谷氨酰基转移酶ggt]=[心]
  588. $xinVal = [];
  589. if (isset($xiangmuArr['alt']) && isset($xiangmuArr['ggt'])) {
  590. $xinDiff = $xiangmuArr['alt']['level'] * 2 - $xiangmuArr['ggt']['level'] * 1;
  591. $xinFanWeiArr = ['6~9' => ['愤怒(中)', '恐惧(中)'], '3~5' => ['愤怒(中)', '恐惧(中)'], '1~2' => ['愤怒(轻)', '恐惧(轻)', '焦虑(轻)'], '-2~-1' => ['焦虑(轻)'], '-5~-3' => ['抑郁(中)', '焦虑(中)'], '-9~-6' => ['抑郁(中)']];
  592. foreach ($xinFanWeiArr as $xinKey => $xStatus) {
  593. $xnum = explode('~', $xinKey);
  594. if ($xinDiff > $xnum[0] && $xinDiff < $xnum[1]) {
  595. $xinVal = ['status' => $xStatus, 'val' => $xinDiff];
  596. foreach ($xStatus as $xin) {
  597. if (!isset($gxsRes[$xin])) {
  598. $gxsRes[$xin] = $xinDiff;
  599. } else {
  600. $gxsRes[$xin] += $xinDiff;
  601. }
  602. }
  603. }
  604. }
  605. }
  606. //【肾】[丙氨基转移酶]*3-[天门冬氨酸氨基转移酶]*2 --ast
  607. $shenVal = [];
  608. if (isset($xiangmuArr['alt']) && isset($xiangmuArr['ast'])) {
  609. $shenDiff = $xiangmuArr['alt']['level'] * 3 - $xiangmuArr['ast']['level'] * 1;
  610. $shenFanWeiArr = ['10~15' => ['愤怒(中)', '恐惧(中)'], '5~9' => ['愤怒(中)', '恐惧(中)', '焦虑(中)'], '1~4' => ['焦虑(轻)'], '-4~-1' => ['焦虑(轻)'], '-9~-5' => ['抑郁(中)', '焦虑(中)'], '-15~-10' => ['抑郁(中)', '焦虑(中)']];
  611. foreach ($shenFanWeiArr as $senKey => $senStatus) {
  612. $sennum = explode('~', $senKey);
  613. if ($shenDiff > $sennum[0] && $shenDiff < $sennum[1]) {
  614. $shenVal = ['status' => $senStatus, 'val' => $shenDiff];
  615. foreach ($senStatus as $sen) {
  616. if (!isset($gxsRes[$sen])) {
  617. $gxsRes[$sen] = $shenDiff;
  618. } else {
  619. $gxsRes[$sen] += $shenDiff;
  620. }
  621. }
  622. }
  623. }
  624. }
  625. //var_dump($ganVal,$xinVal,$shenVal);
  626. $re['xgs'] = $gxsRes;
  627. //3. 胆功代谢
  628. $zjdhs = [];//直接、间接胆红素
  629. $dhsjl = [];//胆红素结论
  630. if (isset($xiangmuArr['dbil']) && isset($xiangmuArr['ibil'])) {
  631. $dbilArr = [];
  632. $ibilArr = [];
  633. $dbVal = 0;
  634. $ibVal = 0;
  635. foreach ($xiangmuArr['dbil']['status'] as $dbil) {
  636. $dbVal += $xiangmuArr['dbil']['level'];
  637. if (isset($dbilArr[$dbil])) {
  638. $dbilArr[$dbil] += $xiangmuArr['dbil']['level'];
  639. } else {
  640. $dbilArr[$dbil] = $xiangmuArr['dbil']['level'];
  641. }
  642. }
  643. foreach ($xiangmuArr['ibil']['status'] as $ibil) {
  644. $ibVal += $xiangmuArr['ibil']['level'];
  645. if (isset($ibilArr[$ibil])) {
  646. $ibilArr[$ibil] += $xiangmuArr['ibil']['level'];
  647. } else {
  648. $ibilArr[$ibil] = $xiangmuArr['ibil']['level'];
  649. }
  650. }
  651. if (abs($dbVal) > abs($ibVal)) {
  652. $zjdhs = $dbilArr;
  653. } else {
  654. $zjdhs = $ibilArr;
  655. }
  656. //$re['dan'] = ['0' => $zjdhs];
  657. }
  658. if (isset($xiangmuArr['tbil']) && !empty($zjdhs)) {
  659. foreach ($xiangmuArr['tbil']['status'] as $tbil) {
  660. if (isset($dhsjl[$tbil])) {
  661. $dhsjl[$tbil] += $xiangmuArr['tbil']['level'];
  662. } else {
  663. $dhsjl[$tbil] = $xiangmuArr['tbil']['level'];
  664. }
  665. }
  666. foreach ($zjdhs as $zjdhKey => $zjdhVal) {
  667. if (isset($dhsjl[$zjdhKey])) {
  668. $dhsjl[$zjdhKey] += $zjdhVal;
  669. } else {
  670. $dhsjl[$zjdhKey] = $zjdhVal;
  671. }
  672. }
  673. }
  674. $re['dan'] = $dhsjl;
  675. //4. 糖、脂肪、蛋白质代谢
  676. //[同型半胱氨酸]+[葡萄糖]+[总胆汁酸]+[甘油三酯]+[总胆固醇]+[高密度脂蛋白]+[低密度脂蛋白]+[小而密低密度脂蛋白]+[载脂蛋白A1]+[载脂蛋白bB]+[尿酸]
  677. $dxie = ['hcy', 'glu', 'tba', 'tg', 'chol', 'hdl', 'hdl', 'ldl', 'sdldl', 'uric'];
  678. $dxieRes = [];
  679. foreach ($data as $key => $item) {
  680. foreach ($item as $dm => $val) {
  681. if (in_array($dm, $dxie)) {
  682. foreach ($val['status'] as $sts) {
  683. if (!isset($dxieRes[$sts])) {
  684. $dxieRes[$sts] = $val['level'];
  685. } else {
  686. $dxieRes[$sts] += $val['level'];
  687. }
  688. }
  689. }
  690. }
  691. }
  692. $re['daixie'] = $dxieRes;
  693. //5. 免疫
  694. //[总蛋白tp]+[白蛋白alb]+[球蛋白glb]+[白(中)][球蛋白比值a:g]
  695. $mianyiRes = [];
  696. $baiQiuArr = [];
  697. $qiuDanBaiArr = [];
  698. $qiuMaxArr = [];
  699. $albVal = 0;
  700. $glbVal = 0;
  701. if (isset($xiangmuArr['alb']) && isset($xiangmuArr['glb'])) {
  702. foreach ($xiangmuArr['alb']['status'] as $sts) {
  703. $albVal += $xiangmuArr['alb']['level'];
  704. if (isset($baiQiuArr[$sts])) {
  705. $baiQiuArr[$sts] += $xiangmuArr['alb']['level'];
  706. } else {
  707. $baiQiuArr[$sts] = $xiangmuArr['alb']['level'];
  708. }
  709. }
  710. foreach ($xiangmuArr['glb']['status'] as $sts) {
  711. $glbVal += $xiangmuArr['glb']['level'];
  712. if (isset($qiuDanBaiArr[$sts])) {
  713. $qiuDanBaiArr[$sts] += $xiangmuArr['glb']['level'];
  714. } else {
  715. $qiuDanBaiArr[$sts] = $xiangmuArr['glb']['level'];
  716. }
  717. }
  718. if (abs($albVal) > abs($glbVal)) {
  719. $qiuMaxArr = $baiQiuArr;
  720. } else {
  721. $qiuMaxArr = $qiuDanBaiArr;
  722. }
  723. }
  724. if (isset($xiangmuArr['tp']) && isset($xiangmuArr['a:g']) && !empty($biZhiArr)) {
  725. foreach ($xiangmuArr['tp']['status'] as $tpSts) {
  726. if (isset($mianyiRes[$tpSts])) {
  727. $mianyiRes[$tpSts] += $xiangmuArr['tp']['level'];
  728. } else {
  729. $mianyiRes[$tpSts] = $xiangmuArr['tp']['level'];
  730. }
  731. }
  732. foreach ($xiangmuArr['a:g']['status'] as $agSts) {
  733. if (isset($mianyiRes[$agSts])) {
  734. $mianyiRes[$agSts] += $xiangmuArr['a:g']['level'];
  735. } else {
  736. $mianyiRes[$agSts] = $xiangmuArr['a:g']['level'];
  737. }
  738. }
  739. foreach ($qiuMaxArr as $maxKey => $maxVal) {
  740. if (isset($mianyiRes[$maxKey])) {
  741. $mianyiRes[$maxKey] += $maxVal;
  742. } else {
  743. $mianyiRes[$maxKey] = $maxVal;
  744. }
  745. }
  746. }
  747. $re['mianyi'] = $mianyiRes;
  748. //6. 肌肉代谢
  749. //[肌酐][肌酸激酶][肌酸激酶同工酶][乳酸脱氢酶]
  750. $jirouDxie = ['crea', 'ckmb', 'ckmb', 'ldh'];
  751. $jrdxieRes = [];
  752. foreach ($data as $key => $item) {
  753. foreach ($item as $dm => $val) {
  754. if (in_array($dm, $jirouDxie)) {
  755. foreach ($val['status'] as $sts) {
  756. if (!isset($jrdxieRes[$sts])) {
  757. $jrdxieRes[$sts] = $val['level'];
  758. } else {
  759. $jrdxieRes[$sts] += $val['level'];
  760. }
  761. }
  762. }
  763. }
  764. }
  765. $re['jiroudx'] = $jrdxieRes;
  766. //7. 血常规免疫
  767. //[白细胞][中性粒细胞][中性粒细胞百分比][淋巴细胞][单核细胞][嗜酸粒细胞][嗜碱性粒细胞]
  768. $xue = ['wbc', 'meut', 'lymph', 'lymph', 'monocytes', 'eos', 'basophil'];
  769. $xueRes = [];
  770. foreach ($data as $key => $item) {
  771. foreach ($item as $dm => $val) {
  772. if (in_array($dm, $xue)) {
  773. foreach ($val['status'] as $sts) {
  774. if (!isset($xueRes[$sts])) {
  775. $xueRes[$sts] = $val['level'];
  776. } else {
  777. $xueRes[$sts] += $val['level'];
  778. }
  779. }
  780. }
  781. }
  782. }
  783. $re['xue'] = $xueRes;
  784. //8. 贫血
  785. //[红细胞][血红蛋白][红细胞比容/红细胞压积][红细胞平均体积][平均血红蛋白含量][平均血红蛋白浓度][红细胞分布宽度][血小板][平均血小板体积][血小板体积分布宽度][血小板压积]
  786. $pinXue = ['rbc', 'hgb', 'mcv', 'mch', 'mchc', 'rdw-cv', 'plt', 'mpv', 'pdw'];
  787. $pinXueRes = [];
  788. $pinXlevel = [
  789. 'rbc' => ['-2' => -198, '-3' => 287],
  790. 'hgb' => ['-2' => -198, '-3' => 287],
  791. 'mcv' => ['-2' => -198, '-3' => -287],
  792. 'rdw-cv' => ['-1' => -99, '-3' => -287],
  793. ];
  794. foreach ($data as $key => $item) {
  795. foreach ($item as $dm => $val) {
  796. if (in_array($dm, $pinXue)) {
  797. if (isset($pinXlevel[$dm][$val['level']])) {
  798. $level = $pinXlevel[$dm][$val['level']];
  799. } else {
  800. $level = $val['level'];
  801. }
  802. foreach ($val['status'] as $sts) {
  803. if (!isset($pinXueRes[$sts])) {
  804. $pinXueRes[$sts] = $level;
  805. } else {
  806. $pinXueRes[$sts] += $level;
  807. }
  808. }
  809. }
  810. }
  811. }
  812. $re['pinxue'] = $pinXueRes;
  813. $jieguo = [];
  814. foreach ($re as $rr) {
  815. if (!empty($rr)) {
  816. foreach ($rr as $st => $stVal) {
  817. if (isset($jieguo[$st])) {
  818. $jieguo[$st] += $stVal;
  819. } else {
  820. $jieguo[$st] = $stVal;
  821. }
  822. }
  823. }
  824. }
  825. return $jieguo;
  826. }
  827. public function getCode($name, $check)
  828. {
  829. $code = [
  830. 'fe' => '铁',
  831. //钙
  832. 'ca' => '钙',
  833. //镁
  834. 'mg' => '镁',
  835. //钾
  836. 'k' => '钾',
  837. //钠
  838. 'na' => '钠',
  839. //氯
  840. 'c1' => '氯',
  841. //2. 心肝肾代谢
  842. //丙氨酸转氨酶(谷丙)
  843. 'alt' => '丙氨酸转氨酶',
  844. //天门冬氨酸氨基转移酶(谷草)
  845. 'ast' => '天门冬氨酸氨基转移酶',
  846. //碱性磷酸酶
  847. 'alp' => '碱性磷酸酶',
  848. //γ-谷氨酰基转移酶
  849. 'ggt' => 'γ-谷氨酰基转移酶',
  850. //胆碱酯酶
  851. 'che' => '胆碱酯酶',
  852. //3. 胆功代谢
  853. //总胆红素
  854. 'tbil' => '总胆红素',
  855. //直接胆红素
  856. 'dbil' => '直接胆红素',
  857. //间接胆红素
  858. 'ibil' => '间接胆红素',
  859. //4. 糖、脂肪、蛋白质代谢
  860. //同型半胱氨酸
  861. 'hcy' => '同型半胱氨酸',
  862. //葡萄糖
  863. 'glu' => '葡萄糖',
  864. //总胆汁酸
  865. 'tba' => '总胆汁酸',
  866. //甘油三酯
  867. 'tg' => '甘油三酯',
  868. //总胆固醇
  869. 'chol' => '总胆固醇',
  870. //高密度脂蛋白
  871. 'hdl' => '高密度脂蛋白',
  872. //低密度脂蛋白
  873. 'ldl' => '低密度脂蛋白',
  874. //小而密低密度脂蛋白
  875. 'sdldl' => '小而密低密度脂蛋白',
  876. 'apoa1' => '载脂蛋白A1',
  877. 'apob' => '载脂蛋白B',
  878. //尿酸
  879. 'uric' => '尿酸',
  880. // '尿素' => [],
  881. //5. 免疫
  882. //总蛋白
  883. 'tp' => '总蛋白',
  884. //白蛋白
  885. 'alb' => '白蛋白',
  886. //球蛋白
  887. 'glb' => '球蛋白',
  888. //白(中)球蛋白比值
  889. 'a:g' => '白(中)球蛋白比值',
  890. //6. 肌肉代谢
  891. //肌酐
  892. 'crea' => '肌酐',
  893. //肌酸激酶
  894. 'ck' => '肌酸激酶',
  895. //肌酸激酶同工酶
  896. 'ckmb' => '肌酸激酶同工酶',
  897. //乳酸脱氢酶
  898. 'ldh' => '乳酸脱氢酶',
  899. //7. 血常规免疫
  900. //白细胞
  901. 'wbc' => '白细胞',
  902. //中性粒细胞
  903. 'meut' => '中性粒细胞',
  904. 'meut%' => '中性粒细胞百分比',
  905. //淋巴细胞
  906. 'lymph' => '淋巴细胞',
  907. 'monocytes' => '单核细胞',
  908. 'eos' => '嗜酸粒细胞',
  909. 'basophil' => '嗜碱性粒细胞',
  910. //8. 贫血
  911. //红细胞
  912. 'rbc' => '红细胞',
  913. //血红蛋白
  914. 'hgb' => '血红蛋白',
  915. '红细胞比容/红细胞压积' => '红细胞比容/红细胞压积',
  916. //红细胞平均体积
  917. 'mcv' => '红细胞平均体积',
  918. //平均血红蛋白含量
  919. 'mch' => '平均血红蛋白含量',
  920. //平均血红蛋白浓度
  921. 'mchc' => '平均血红蛋白浓度',
  922. //红细胞分布宽度
  923. 'rdw-cv' => '红细胞分布宽度',
  924. //血小板
  925. 'plt' => '血小板',
  926. //平均血小板体积
  927. 'mpv' => '平均血小板体积',
  928. //血小板体积分布宽度
  929. 'pdw' => '血小板体积分布宽度',
  930. 'pct' => '血小板压积',
  931. ];
  932. foreach ($code as $k => $v) {
  933. if (stripos($name, $v) !== false && !in_array($k, $check)) {
  934. return $k;
  935. }
  936. }
  937. }
  938. public static function callOcr($file){
  939. $appId = 'd33412c0';
  940. $apiKey = '5289860fd8cda40a979823dfb641610f';
  941. $apiSecret = 'YmIxZTEyYzcwZmEzZjMzMDg5NzZkZGUz';
  942. $url = 'https://api.xf-yun.com/v1/private/sf8e6aca1';
  943. $date = gmstrftime("%a, %d %b %Y %T %Z",time());
  944. $host = 'api.xf-yun.com';
  945. $signature = "host: api.xf-yun.com\ndate: $date\nPOST /v1/private/sf8e6aca1 HTTP/1.1";
  946. $signature = hash_hmac('sha256',$signature,$apiSecret,true);
  947. $signature = base64_encode($signature);
  948. $authorization = 'api_key="'.$apiKey.'",algorithm="hmac-sha256",headers="host date request-line",signature="'.$signature.'"';
  949. $authorization = base64_encode($authorization);
  950. $url = $url .'?authorization='.$authorization.'&host='.$host.'&date='.urlencode($date);
  951. $image = base64_encode(file_get_contents($file->getRealPath()));
  952. $data = [
  953. "header" => [
  954. "app_id"=> $appId,
  955. "status"=> 3
  956. ],
  957. 'parameter' => [
  958. 'sf8e6aca1' => [
  959. 'category' => 'ch_en_public_cloud',
  960. 'result' => [
  961. 'encoding' => 'utf8',
  962. 'compress' => 'raw',
  963. 'format' => 'json'
  964. ]
  965. ]
  966. ],
  967. 'payload' => [
  968. 'sf8e6aca1_data_1' => [
  969. 'encoding' => $file->getClientOriginalExtension(),
  970. 'status' => 3,
  971. 'image' => $image
  972. ]
  973. ]
  974. ];
  975. $strlen = strlen($image);
  976. if (strlen(base64_encode(file_get_contents($file->getRealPath()))) > 10485760){
  977. return '';
  978. }
  979. $data = json_encode($data);
  980. $result = self::sendPost($url,$data);
  981. if ($result['header']['code'] == 0){
  982. return $result['payload']['result']['text'];
  983. }else{
  984. return '';
  985. }
  986. }
  987. public static function sendPost($url,$data){
  988. $ch = curl_init();
  989. curl_setopt($ch, CURLOPT_URL, $url);
  990. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  991. curl_setopt($ch, CURLOPT_POST, true);
  992. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  993. curl_setopt($ch, CURLOPT_HEADER, false);
  994. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','host: api.xf-yun.com', 'app_id: 645ee768'));
  995. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  996. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  997. $output = curl_exec($ch);
  998. curl_close($ch);
  999. $output = json_decode($output,true);
  1000. return $output;
  1001. }
  1002. public static function formatTestSheet($text){
  1003. $text = str_replace(
  1004. [" ","\n","★","*"],
  1005. ['','','',''],
  1006. base64_decode($text));
  1007. $text = json_decode($text,true);
  1008. $wordArray = array_column($text['pages'][0]['lines'],'words');
  1009. foreach ($wordArray as $item){
  1010. $word[] = $item[0];
  1011. }
  1012. $word = array_values(array_filter(array_column($word,'content')));
  1013. $data = [];
  1014. $count = count($word);
  1015. for ($i = 0 ; $i < $count ; $i++){
  1016. $value = $word[$i];
  1017. //跳过没用的数据
  1018. if (strpos($value,'.') !== false){
  1019. continue;
  1020. }
  1021. if (strpos($value,'/') !== false){
  1022. continue;
  1023. }
  1024. if (in_array($value,['序号','项目名称','英文缩写','检查结果','单位','采集时间'])){
  1025. continue;
  1026. }
  1027. if (strpos($value,'-') !== false){
  1028. continue;
  1029. }
  1030. $value = preg_replace("/\\d+/",'', $value);
  1031. $value = preg_replace("/\s*(\w+#?)/i",'', $value);
  1032. foreach (self::$mustExtractEntity as $item){
  1033. //匹配实体
  1034. if (empty($value)){
  1035. continue;
  1036. }
  1037. $valueCount = mb_strpos($value,$item['entity']);
  1038. if ($valueCount !== false){
  1039. $temp = array_slice($word,$i,6);
  1040. if (count($temp) < 6){
  1041. $temp = array_pad($temp,6,'');
  1042. }
  1043. $tempValue = '';
  1044. $tempRange = '';
  1045. if (preg_match('/\d+$/',$temp[1]) && preg_match("/-|~/",$temp[1]) == 0){
  1046. $tempValue = $temp[1];
  1047. }elseif (preg_match('/\d+$/',$temp[2]) && preg_match("/-|~/",$temp[2]) == 0){
  1048. $tempValue = $temp[2];
  1049. }elseif (preg_match('/\d+$/',$temp[3]) && preg_match("/-|~/",$temp[3]) == 0){
  1050. $tempValue = $temp[3];
  1051. }elseif (preg_match('/\d+$/',$temp[4]) && preg_match("/-|~/",$temp[4]) == 0){
  1052. $tempValue = $temp[4];
  1053. }elseif (preg_match('/\d+$/',$temp[5]) && preg_match("/-|~/",$temp[5]) == 0){
  1054. $tempValue = $temp[5];
  1055. }
  1056. if (preg_match('/\d+-|~+\d+/',$temp[2])){
  1057. $tempRange = $temp[2];
  1058. }elseif (preg_match('/\d+-|~+\d+/',$temp[3])){
  1059. $tempRange = $temp[3];
  1060. }elseif (preg_match('/\d+-|~+\d+/',$temp[4])){
  1061. $tempRange = $temp[4];
  1062. }elseif (preg_match('/\d+-|~+\d+/',$temp[5])){
  1063. $tempRange = $temp[5];
  1064. }
  1065. if (empty($tempValue) || empty($tempRange)){
  1066. continue;
  1067. }else{
  1068. $tempRange = preg_replace("/[a-z]*\/[a-z]*/i",'', $tempRange);
  1069. if(!is_numeric($tempValue)){
  1070. continue;
  1071. }
  1072. if (!isset($data[$item['code']])){
  1073. $data[$item['code']] = [
  1074. 'entity' => $item['entity'],
  1075. 'value' => $tempValue,
  1076. 'range' => $tempRange,
  1077. 'code' => $item['code']
  1078. ];
  1079. }
  1080. }
  1081. }else{
  1082. continue;
  1083. }
  1084. }
  1085. }
  1086. return $data;
  1087. // $ocr['calculation'] = json_encode($data);
  1088. // $array = array_column($data,'symptom');
  1089. // $tem = [];
  1090. // foreach ($array as $item){
  1091. // $tem = array_merge($item,$tem);
  1092. // }
  1093. // $tem = array_count_values($tem);
  1094. // $symptom = '';
  1095. // foreach ($tem as $key=>$value){
  1096. // $symptom .= $key." + ".$value.'; ';
  1097. // }
  1098. // Ocr::query()->insert($ocr);
  1099. // return ['list'=>$data,'symptom'=>$symptom];
  1100. }
  1101. public static function run($filePath)
  1102. {
  1103. //10.jpg 18.png w1.jpeg w2.jpeg w3.png w66.jpeg w77.png w222.jpeg WechatIMG6.jpeg
  1104. $image = file_get_contents($filePath);///
  1105. $image = base64_encode($image);
  1106. $token = self::getAccessToken();
  1107. $curl = curl_init();
  1108. curl_setopt_array($curl, array(
  1109. CURLOPT_URL => "https://aip.baidubce.com/rest/2.0/ocr/v1/medical_report_detection?access_token=$token",
  1110. CURLOPT_TIMEOUT => 30,
  1111. CURLOPT_RETURNTRANSFER => true,
  1112. CURLOPT_SSL_VERIFYPEER => false,
  1113. CURLOPT_SSL_VERIFYHOST => false,
  1114. CURLOPT_CUSTOMREQUEST => 'POST',
  1115. CURLOPT_POSTFIELDS => http_build_query(array(
  1116. 'location' => 'false',
  1117. 'probability' => 'false',
  1118. 'image' => $image
  1119. )),
  1120. CURLOPT_HTTPHEADER => array(
  1121. 'Content-Type: application/x-www-form-urlencoded',
  1122. 'Accept: application/json'
  1123. ),
  1124. ));
  1125. $response = curl_exec($curl);
  1126. curl_close($curl);
  1127. return $response;
  1128. }
  1129. /**
  1130. * 使用 AK,SK 生成鉴权签名(Access Token)
  1131. * @return string 鉴权签名信息(Access Token)
  1132. */
  1133. private static function getAccessToken()
  1134. {
  1135. $curl = curl_init();
  1136. $postData = array(
  1137. 'grant_type' => 'client_credentials',
  1138. 'client_id' => env('API_KEY'),
  1139. 'client_secret' => env('SECRET_KEY')
  1140. );
  1141. curl_setopt_array($curl, array(
  1142. CURLOPT_URL => 'https://aip.baidubce.com/oauth/2.0/token',
  1143. CURLOPT_CUSTOMREQUEST => 'POST',
  1144. CURLOPT_SSL_VERIFYPEER => false,
  1145. CURLOPT_SSL_VERIFYHOST => false,
  1146. CURLOPT_RETURNTRANSFER => true,
  1147. CURLOPT_POSTFIELDS => http_build_query($postData)
  1148. ));
  1149. $response = curl_exec($curl);
  1150. curl_close($curl);
  1151. $rtn = json_decode($response);
  1152. return $rtn->access_token;
  1153. }
  1154. }