His.php 96 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805
  1. <?php
  2. namespace app\index\controller;
  3. use think\Request;
  4. use think\Db;
  5. //sm4
  6. use Evit\PhpGmCrypto\Encryption\EvitSM4Encryption;
  7. class His extends \think\Controller
  8. {
  9. //主页
  10. public function index(){
  11. //判断用户设备是否是移动端
  12. if(isMobile() == true){
  13. $device = 'phone';
  14. }
  15. else{
  16. $device = 'pc';
  17. }
  18. //获取当前年份
  19. $year = date('Y',time());
  20. //获取公共路径
  21. $commonURL = commonURL();
  22. //获取公共路径
  23. $commonOpenURL = commonOpenURL();
  24. //获取当前时间
  25. $now = date('Y-m-d H:i:s',time());
  26. $recContent = db('medical_rec') -> limit(205) -> field('content',true) -> select();
  27. for($i = 0; $i < count($recContent); $i++){
  28. $mapPat['pat_visit_info_id'] = array('eq',$recContent[$i]['pat_visit_info_id']);
  29. $name = db('pat_visit_info') -> where($mapPat) -> value('pat_name');
  30. $patId = db('pat_visit_info') -> where($mapPat) -> value('pat_id');
  31. $pageId = db('pat_visit_info') -> where($mapPat) -> value('page_id');
  32. $recContent[$i]['name'] = mb_substr($name, 0, 1, 'UTF-8') . '**';
  33. $recContent[$i]['pat_id'] = $patId;
  34. $recContent[$i]['page_id'] = $pageId;
  35. }
  36. $user = request() -> param('user');
  37. //构造请求数据
  38. return view('index', [
  39. 'recContent' => $recContent,
  40. 'device' => $device,
  41. 'year' => $year,
  42. 'commonURL' => $commonURL,
  43. 'now' => $now,
  44. 'commonOpenURL' => $commonOpenURL,
  45. 'user' => $user,
  46. ]);
  47. }
  48. //整合最终的参数并发起请求
  49. public function wsRequest(){
  50. $user = request() -> param('user');
  51. $patId = request() -> param('patId');
  52. $pageId = request() -> param('pageId');
  53. $doc = request() -> param('doc');
  54. //查询病历唯一标识
  55. $mapPat['pat_id'] = array('eq',$patId);
  56. $mapPat['page_id'] = array('eq',$pageId);
  57. $patVisitId = db('pat_visit_info') -> where($mapPat) -> value('pat_visit_info_id');
  58. $name = db('pat_visit_info') -> where($mapPat) -> value('pat_name');
  59. //查询对应的病历原始文本
  60. $mapRec['pat_visit_info_id'] = array('eq',$patVisitId);
  61. $mapRec['type_name'] = array('eq',$doc);
  62. $recContent = db('medical_rec') -> where($mapRec) -> find();
  63. //自然文本质控
  64. $recContentInfo = '科室名称:'.$recContent['dept_name'].'。 诊疗文书原文:'.$recContent['content'];
  65. //json文本指控
  66. $mapRecContent['mr_id'] = array('eq',$recContent['mr_id']);
  67. $recContentJson = db('medical_rec_content') -> where($mapRecContent) -> select();
  68. foreach ($recContentJson as &$subarray) {
  69. // 移除 'id' 和 'mr_id' 键
  70. unset($subarray['id'], $subarray['mr_id']);
  71. }
  72. // 销毁引用以避免潜在问题
  73. unset($subarray);
  74. $dept['mr_title'] = '部门';
  75. $dept['mr_text'] = $recContent['dept_name'];
  76. $recContentJson[count($recContentJson)] = $dept;
  77. $recContentJson = json_encode($recContentJson,JSON_UNESCAPED_UNICODE);
  78. //最终输出
  79. $recContentFinal = [
  80. [
  81. 'role' => 'user',
  82. 'content' => $recContentJson
  83. ],
  84. ];
  85. //组装请求的数据为base64格式
  86. $data['model'] = 'emoon-E2-7B';
  87. $data['network'] = '1';
  88. $data['input'] = $recContentFinal;
  89. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  90. $data = base64_encode($data);
  91. //对请求的参数进行sm4加密
  92. $smIV = getSMIV();
  93. $config = [
  94. 'mode' => 'cbc',
  95. 'key' => 'iRMFdLrIrwV7xiep', // 16 字节二进制密钥
  96. 'iv' => $smIV, // 16 字节二进制 IV
  97. 'hash' => false
  98. ];
  99. $sm4 = new EvitSM4Encryption($config);
  100. $encryptedBinary = $sm4->encrypt($data);
  101. // 将二进制结果转换为 Base64
  102. $encryptedBase64 = base64_encode($encryptedBinary);
  103. //创建最终的含有sm4的iv的数据
  104. $modifiedData['encryptedBase64'] = $encryptedBase64;
  105. $modifiedData['smIV'] = $smIV;
  106. $modifiedData['publicKey'] = 'Vt8kKsWQqQhkTvhsdwIPYmcaZfPmCJp1';
  107. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  108. $modifiedData = base64_encode($modifiedData);
  109. // 将 '+' 替换为 '-','/' 替换为 '_'
  110. $modifiedData = strtr($modifiedData, '+/', '-_');
  111. //将加密的参数发送给开放平台,获取短令牌
  112. $urlOpen = commonOpenURL().'/Apis/getToken';
  113. $encryption['information'] = $modifiedData;
  114. $token = curlPost($urlOpen,$encryption);
  115. $token = stdClassObjToArray(json_decode($token));
  116. //构建最终的请求内容
  117. $dataRequest['user'] = $user;
  118. $dataRequest['name'] = mb_substr($name, 0, 1, 'UTF-8') . '**';
  119. $dataRequest['doc'] = $doc;
  120. $dataRequest['token'] = $token['token'];
  121. $url = commonURL().'/Send/websocket';
  122. curlPost($url,$dataRequest);
  123. return '已将该「病历原文」发送至「医梦AI客户端」';
  124. }
  125. //中联web AI质控接口地址
  126. public function httpRequest(){
  127. //获取输入的内容
  128. $json = file_get_contents('php://input');
  129. $data = json_decode($json, true);
  130. //{"messages":[ {"role":"user","content":"请问你是什么模型?"}]}
  131. $message = $data['messages'] ?? null;
  132. //组装请求的数据为base64格式
  133. $data['model'] = 'deepseek-R1-8B';
  134. $data['network'] = '2';
  135. $data['input'] = $message;
  136. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  137. $data = base64_encode($data);
  138. //对请求的参数进行sm4加密
  139. $smIV = getSMIV();
  140. $config = [
  141. 'mode' => 'cbc',
  142. 'key' => 'sYq9QbK6E1FI2Hi9', // 16 字节二进制密钥
  143. 'iv' => $smIV, // 16 字节二进制 IV
  144. 'hash' => false
  145. ];
  146. $sm4 = new EvitSM4Encryption($config);
  147. $encryptedBinary = $sm4->encrypt($data);
  148. // 将二进制结果转换为 Base64
  149. $encryptedBase64 = base64_encode($encryptedBinary);
  150. //创建最终的含有sm4的iv的数据
  151. $modifiedData['encryptedBase64'] = $encryptedBase64;
  152. $modifiedData['smIV'] = $smIV;
  153. $modifiedData['publicKey'] = 'l5zI6lwxHLcCQ8LfQRwpvLLNv2WjMbj2';
  154. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  155. $modifiedData = base64_encode($modifiedData);
  156. // 将 '+' 替换为 '-','/' 替换为 '_'
  157. $modifiedData = strtr($modifiedData, '+/', '-_');
  158. //将加密的参数发送给开放平台,获取短令牌
  159. $urlOpen = commonOpenURL().'/Apis/getToken';
  160. $encryption['information'] = $modifiedData;
  161. $token = curlPost($urlOpen,$encryption);
  162. $token = stdClassObjToArray(json_decode($token));
  163. //构建最终的请求内容
  164. $dataRequest['token'] = $token['token'];
  165. $url = commonOpenURLHTTP();
  166. $result = curlPost($url,$dataRequest);
  167. return $result;
  168. }
  169. //创建实时质控页面
  170. public function qualityNow(){
  171. //判断用户设备是否是移动端
  172. if(isMobile() == true){
  173. $device = 'phone';
  174. }
  175. else{
  176. $device = 'pc';
  177. }
  178. //获取当前年份
  179. $year = date('Y',time());
  180. //获取公共路径
  181. $commonURL = commonURL();
  182. //获取公共路径
  183. $commonOpenURL = commonOpenURL();
  184. //获取当前时间
  185. $now = date('Y-m-d H:i:s',time());
  186. $user = request() -> param('user');
  187. //构造请求数据
  188. return view('qualityNow', [
  189. 'device' => $device,
  190. 'year' => $year,
  191. 'commonURL' => $commonURL,
  192. 'now' => $now,
  193. 'commonOpenURL' => $commonOpenURL,
  194. 'user' => $user,
  195. ]);
  196. }
  197. //创建实时获取病历列表
  198. public function getDoc(){
  199. // $data['patId'] = '4213806';
  200. // $data['pageId'] = '1';
  201. // $data['patId'] = request() -> param('patId');
  202. // $data['pageId'] = request() -> param('pageId');
  203. $url = commonDataURL().'/His/getDoc';
  204. $result = curlPost($url,$data);
  205. return json($result);
  206. }
  207. //创建实时获取病历内容
  208. public function getRec(){
  209. // $data['mrId'] = '2d26e278-7028-4103-8ba8-1b4625473d35';
  210. $dataMrId['mrId'] = request() -> param('mrId');
  211. $urlMrId = commonDataURL().'/His/getRec';
  212. $result = curlPost($urlMrId,$dataMrId);
  213. //请求websocket客户端发送数据
  214. $recContentFinal = [
  215. [
  216. 'role' => 'user',
  217. 'content' => $result
  218. ],
  219. ];
  220. //组装请求的数据为base64格式
  221. $data['model'] = 'emoon-E2-7B';
  222. $data['network'] = '1';
  223. $data['input'] = $recContentFinal;
  224. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  225. $data = base64_encode($data);
  226. //对请求的参数进行sm4加密
  227. $smIV = getSMIV();
  228. $config = [
  229. 'mode' => 'cbc',
  230. 'key' => 'iRMFdLrIrwV7xiep', // 16 字节二进制密钥
  231. 'iv' => $smIV, // 16 字节二进制 IV
  232. 'hash' => false
  233. ];
  234. $sm4 = new EvitSM4Encryption($config);
  235. $encryptedBinary = $sm4->encrypt($data);
  236. // 将二进制结果转换为 Base64
  237. $encryptedBase64 = base64_encode($encryptedBinary);
  238. //创建最终的含有sm4的iv的数据
  239. $modifiedData['encryptedBase64'] = $encryptedBase64;
  240. $modifiedData['smIV'] = $smIV;
  241. $modifiedData['publicKey'] = 'Vt8kKsWQqQhkTvhsdwIPYmcaZfPmCJp1';
  242. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  243. $modifiedData = base64_encode($modifiedData);
  244. // 将 '+' 替换为 '-','/' 替换为 '_'
  245. $modifiedData = strtr($modifiedData, '+/', '-_');
  246. //将加密的参数发送给开放平台,获取短令牌
  247. $urlOpen = commonOpenURL().'/Apis/getToken';
  248. $encryption['information'] = $modifiedData;
  249. $token = curlPost($urlOpen,$encryption);
  250. $token = stdClassObjToArray(json_decode($token));
  251. //构建最终的请求内容
  252. $user = request() -> param('user');
  253. $typeName = request() -> param('typeName');
  254. $name = substr($typeName,0,strpos($typeName, '-'));
  255. $doc = substr($typeName,strripos($typeName,"-")+1);
  256. $dataRequest['user'] = $user;
  257. $dataRequest['name'] = $name;
  258. $dataRequest['doc'] = $doc;
  259. $dataRequest['token'] = $token['token'];
  260. $url = commonURL().'/Send/websocket';
  261. curlPost($url,$dataRequest);
  262. return '已将该「病历原文」发送至「医梦AI客户端」';
  263. }
  264. //his传入参数触发客户端质控
  265. public function hisOpen(){
  266. $user = request() -> param('user');
  267. $patId = request() -> param('patId');
  268. $pageId = request() -> param('pageId');
  269. $ragId = request() -> param('ragId');
  270. //获取当前用户的病历列表
  271. $dataDoc['patId'] = $patId;
  272. $dataDoc['pageId'] = $pageId;
  273. $urlGetDoc = commonDataURL().'/His/getDoc';
  274. $docs = curlPost($urlGetDoc,$dataDoc);
  275. $docsArray = json_decode($docs);
  276. // dump($docsArray);
  277. // exit;
  278. $docsArray = stdClassObjToArray($docsArray);
  279. $docsJson = json_encode($docsArray,JSON_UNESCAPED_UNICODE);
  280. //将令牌存储
  281. $tokenData['info'] = $docsJson;
  282. $tokenData['time'] = time();
  283. $docsJsonCut = substr($docsJson, 0, 20);
  284. $docsCode = md5($docsJsonCut.time().rand(10000,99999));
  285. $tokenData['token'] = $docsCode;
  286. // dump($docs);
  287. // exit;
  288. $urlGetIntel = commonDataURL().'/His/getintel';
  289. $dataIntel = curlPost($urlGetIntel,$dataDoc);
  290. $dataIntel = json_decode($dataIntel);
  291. $dataIntel = stdClassObjToArray($dataIntel);
  292. $dataIntel = json_encode($dataIntel,JSON_UNESCAPED_UNICODE);
  293. $tokenData['intel'] = $dataIntel;
  294. db('token') -> insert($tokenData);
  295. // dump($tokenData);
  296. // exit;
  297. $mapToken['token'] = array('eq',$docsCode);
  298. $docsJson = db('token') -> where($mapToken) -> value('info');
  299. // dump($tokenData);
  300. // exit;
  301. //跳转chatbox
  302. if($ragId != null){
  303. $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode.'&ragId='.$ragId;
  304. }
  305. else{
  306. $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode;
  307. }
  308. $this -> redirect($url);
  309. }
  310. //his传入参数触发客户端质控
  311. public function hisOpendemo(){
  312. $user = request() -> param('user');
  313. $patId = request() -> param('patId');
  314. $pageId = request() -> param('pageId');
  315. $ragId = request() -> param('ragId');
  316. //获取当前用户的病历列表
  317. $dataDoc['patId'] = $patId;
  318. $dataDoc['pageId'] = $pageId;
  319. $urlGetDoc = commonDataURL().'/His/getDoc';
  320. $docs = curlPost($urlGetDoc,$dataDoc);
  321. $docsArray = json_decode($docs);
  322. // dump($docsArray);
  323. // exit;
  324. $docsArray = stdClassObjToArray($docsArray);
  325. $docsJson = json_encode($docsArray,JSON_UNESCAPED_UNICODE);
  326. //将令牌存储
  327. $tokenData['info'] = $docsJson;
  328. $tokenData['time'] = time();
  329. $docsJsonCut = substr($docsJson, 0, 20);
  330. $docsCode = md5($docsJsonCut.time().rand(10000,99999));
  331. $tokenData['token'] = $docsCode;
  332. // dump($docs);
  333. // exit;
  334. $urlGetIntel = commonDataURL().'/His/getintel';
  335. $dataIntel = curlPost($urlGetIntel,$dataDoc);
  336. $dataIntel = json_decode($dataIntel);
  337. $dataIntel = stdClassObjToArray($dataIntel);
  338. $dataIntel = json_encode($dataIntel,JSON_UNESCAPED_UNICODE);
  339. $tokenData['intel'] = $dataIntel;
  340. db('token') -> insert($tokenData);
  341. // dump($tokenData);
  342. // exit;
  343. $mapToken['token'] = array('eq',$docsCode);
  344. $docsJson = db('token') -> where($mapToken) -> value('info');
  345. // dump($tokenData);
  346. // exit;
  347. //跳转chatbox
  348. if($ragId != null){
  349. $url = commonURL().'/Index/chatBox1?user='.$user.'&docsCode='.$docsCode;
  350. }
  351. else{
  352. $url = commonURL().'/Index/chatBox1?user='.$user.'&docsCode='.$docsCode;
  353. }
  354. $this -> redirect($url);
  355. }
  356. public function hisOpen3(){
  357. $user = request() -> param('user');
  358. $patId = request() -> param('patId');
  359. $pageId = request() -> param('pageId');
  360. $ragId = request() -> param('ragId');
  361. // $ragId="1968853249568628738";
  362. //获取当前用户的病历列表
  363. $dataDoc['patId'] = $patId;
  364. $dataDoc['pageId'] = $pageId;
  365. $urlGetDoc = commonDataURL().'/His/getDoc';
  366. $docs = curlPost($urlGetDoc,$dataDoc);
  367. $docsArray = json_decode($docs);
  368. $docsArray = stdClassObjToArray($docsArray);
  369. $docsJson = json_encode($docsArray,JSON_UNESCAPED_UNICODE);
  370. // dump($docsJson);
  371. // exit;
  372. //将令牌存储
  373. $tokenData['info'] = $docsJson;
  374. $tokenData['time'] = time();
  375. $docsJsonCut = substr($docsJson, 0, 20);
  376. $docsCode = md5($docsJsonCut.time().rand(10000,99999));
  377. $tokenData['token'] = $docsCode;
  378. $urlGetIntel = commonDataURL().'/His/getintel';
  379. $dataIntel = curlPost($urlGetIntel,$dataDoc);
  380. $dataIntel = json_decode($dataIntel);
  381. $dataIntel = stdClassObjToArray($dataIntel);
  382. $dataIntel = json_encode($dataIntel,JSON_UNESCAPED_UNICODE);
  383. $tokenData['intel'] = $dataIntel;
  384. dump($dataIntel);
  385. exit;
  386. db('token') -> insert($tokenData);
  387. $mapToken['token'] = array('eq',$docsCode);
  388. $docsJson = db('token') -> where($mapToken) -> value('info');
  389. //跳转chatbox
  390. if($ragId != null){
  391. $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode.'&ragId='.$ragId;
  392. }
  393. else{
  394. $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode;
  395. }
  396. $this -> redirect($url);
  397. }
  398. //接受hisOpen发送过来的病历列表并推送
  399. public function hisOpenPush(){
  400. // $user = 6666;
  401. $user = request() -> param('user');
  402. $docsCode = request() -> param('docsCode');
  403. // $docsCode = "2fa0e00ffd00d6e92b04a24bbd6dac1d";
  404. $mapToken['token'] = array('eq',$docsCode);
  405. $docsJson = db('token') -> where($mapToken) -> value('info');
  406. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  407. $dataIntel = json_decode($dataIntel);
  408. $dataIntel = stdClassObjToArray($dataIntel);
  409. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  410. $tokenrole['out_num'] = $dataIntel['out_num'];
  411. $tokenrole['in_num'] = $dataIntel['in_num'];
  412. $tokenrole['id_num'] = $dataIntel['id_num'];
  413. // return $docsJson;
  414. if(!$docsJson){
  415. return json('客户端短令牌错误!');
  416. }
  417. $docsArray = json_decode($docsJson);
  418. $docsArray = stdClassObjToArray($docsArray);
  419. // dump($docsJson);
  420. // exit;
  421. //通过病历列表获取病历原文
  422. for($i = 0; $i < count($docsArray); $i++){
  423. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  424. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  425. //请求病历原文
  426. $mrId = $docsArray[$i]["MR_ID"];
  427. $dataMrId['mrId'] = $mrId;
  428. $urlMrId = commonDataURL().'/His/getRec';
  429. $recs = curlPost($urlMrId,$dataMrId);
  430. $recs = json_decode($recs);
  431. $recs = stdClassObjToArray($recs);
  432. $keshi = $recs[count($recs)-1]['mr_text'];
  433. $tokenrole['DEPT_NAME'] = $keshi;
  434. $dataFinal = '';
  435. for($r=0;$r<count($recs);$r++){
  436. $dataFinal = $dataFinal.$recs[$r]["mr_title"].":".$recs[$r]["mr_text"]."brbr";
  437. }
  438. $recs[count($recs)]['mr_title'] = '标题';
  439. $recs[count($recs)-1]['mr_text'] = $docName;
  440. // $dataFinal = json_encode($recs,JSON_UNESCAPED_UNICODE);
  441. $map['emr'] = array('eq', $docName);
  442. $rulename = db('rulecounter')->where($map)->value('rulepath');
  443. if($rulename != null){
  444. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  445. // $ruleIdArray = array( 'RYJLXBS0013', 'RYJLXBS0012','RYJL0002', 'RYJLXX0001', 'RYJLZS0000', 'RYJLZS0001', 'RYJLZS0002', 'RYJLZS0003', 'RYJLZS0004', 'RYJLZS0005', 'RYJLXBS0000', 'RYJLXBS0001', 'RYJLXBS0002', 'RYJLXBS0003', 'RYJLXBS0004', 'RYJLXBS0005', 'RYJLXBS0006', 'RYJLXBS0008', 'RYJLXBS0009', 'RYJLXBS0010', 'RYJLXBS0011', 'RYJLJWS0000', 'RYJLJWS0001', 'RYJLJWS0002', 'RYJLJWS0003', 'RYJLJWS0004', 'RYJLJWS0005', 'RYJLJWS0006', 'RYJLJWS0007', 'RYJLJWS0010', 'RYJLGRS0000', 'RYJLHY0002', 'RYJLJZS0000', 'RYJLJZS0001', 'RYJLTGJC0000', 'RYJLTGJC0001', 'RYJLTGJC0002', 'RYJLTGJC0003', 'RYJLTGJC0004', 'RYJLTGJC0005', 'RYJLTGJC0006', 'RYJLTGJC0007', 'RYJLTGJC0008', 'RYJLZKJC0000', 'RYJLZKJC0001', 'RYJLFZJC0000', 'RYJLFZJC0001', 'RYJLFZJC0002', 'RYJLFZJC0003', 'RYJLFZJC0004', 'RYJLFZJC0007', 'RYJLFZJC0008', 'RYJLCBZD0000', 'RYJLCBZD0001', 'SCBC0000', 'SCBC0001', 'SCBC0003', 'SCBC0004', 'SCBC0005', 'RCBC0000', 'RCBC0001', 'RCBC0003', 'RCBC0007', 'RCBC0015', 'RCBC0019', 'RCBC0020', 'RCBC0022', 'RCBC0023', 'RCBC0024', 'RCBC0025', 'RCBC0026', 'RCBC0027', 'RCBC0028', 'RCBC0038', 'RCBC0039', 'RCBC0044', 'CYJL0002', 'CYJL0003', 'CYJL0004', 'CYJL0005', 'CYJL0006', 'CYJL0007', 'CYJL0008', 'CYJL0009', 'CYJL0011', 'CYJL0012', 'HZJL0000', 'HZJL0001', 'HZJL0002', 'HZJL0003', 'HZJL0004', 'HZJL0005', 'SQXJ0000', 'SQXJ0001', 'RCBC0040', 'RCBC0041');
  446. $ruleIdArray = array('RYJLXBS0013', 'RYJLXBS0012','RYJL0002', 'RYJLXX0001', 'RYJLZS0000', 'RYJLZS0001', 'RYJLZS0002', 'RYJLZS0003', 'RYJLZS0004', 'RYJLZS0005', 'RYJLXBS0000', 'RYJLXBS0001', 'RYJLXBS0002', 'RYJLXBS0003', 'RYJLXBS0004', 'RYJLXBS0005', 'RYJLXBS0006', 'RYJLXBS0007', 'RYJLXBS0008', 'RYJLXBS0009', 'RYJLXBS0010', 'RYJLXBS0011', 'RYJLJWS0000', 'RYJLJWS0001', 'RYJLJWS0002', 'RYJLJWS0003', 'RYJLJWS0004', 'RYJLJWS0005', 'RYJLJWS0006', 'RYJLJWS0007', 'RYJLJWS0009', 'RYJLJWS0010', 'RYJLJWS0011', 'RYJLGRS0000', 'RYJLHY0002', 'RYJLJZS0000', 'RYJLJZS0001', 'RYJLTGJC0000', 'RYJLTGJC0001', 'RYJLTGJC0002', 'RYJLTGJC0003', 'RYJLTGJC0004', 'RYJLTGJC0005', 'RYJLTGJC0006', 'RYJLTGJC0007', 'RYJLTGJC0008', 'RYJLZKJC0000', 'RYJLZKJC0001', 'RYJLFZJC0000', 'RYJLFZJC0001', 'RYJLFZJC0002', 'RYJLFZJC0003', 'RYJLFZJC0004', 'RYJLFZJC0007', 'RYJLFZJC0008', 'RYJLCBZD0000', 'RYJLCBZD0001', 'SCBC0000', 'SCBC0001', 'SCBC0003', 'SCBC0004', 'SCBC0005', 'RCBC0001', 'RCBC0003', 'RCBC0007', 'RCBC0011', 'RCBC0015', 'RCBC0019', 'RCBC0024', 'RCBC0025', 'RCBC0026', 'RCBC0027', 'RCBC0038', 'RCBC0039', 'RCBC0044', 'CYJL0008', 'CYJL0009', 'CYJL0011', 'CYJL0012', 'HZJL0000', 'HZJL0001', 'HZJL0002', 'HZJL0003', 'HZJL0005', 'SQXJ0000', 'SQXJ0001', 'RCBC0040', 'RCBC0041', 'SCBC0002', 'SWJL0007', 'CYJL0013', 'ZQTY0012', 'ZQTY0013');
  447. $maprule['ruleid'] = array('in', $ruleIdArray);
  448. $rulename = db('rulefinal')->where($maprule)->select();
  449. //dump(count($rulename));
  450. //exit;
  451. // //查询某一列数据
  452. // $rule = db('User')->column('name');
  453. for($j=0;$j<count($rulename);$j++){
  454. if($rulename[$j]['ruledetail'] == '暂无'){
  455. $rulename[$j]['ruledetail'] = '';
  456. }
  457. // $dataFinalcount = "你是一名专业的医疗病历质控员,请根据以下内容进行病历质控审查。\n";
  458. // $dataFinalcount .= "当前病历名称如下:\n{$docName}\n\n";
  459. // $dataFinalcount .= "当前病历原文如下:\n{$dataFinal}\n\n";
  460. // $dataFinalcount .= "质控规则如下:\n".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n\n";
  461. // $dataFinalcount .= "请按照上述规则,判断当前病历是否符合质控要求。\n\n";
  462. // $dataFinalcount .= "如果病历完全符合所有规则,请严格输出以下内容:\n";
  463. // $dataFinalcount .= "
  464. // 【规则名称】质控的哪条规则
  465. // 【质控结果】病例校验通过。'\n\n";
  466. // $dataFinalcount .= "如果存在不符合规则的情况,请按以下格式逐条输出违规项,\n";
  467. // $dataFinalcount .= "不符合规则的列举格式如下,严格模仿以下结构输出:\n";
  468. // $dataFinalcount .= "【规则名称】列出违反了哪条规则\n\n";
  469. // $dataFinalcount .= "【质控结果】简要描述为什么违反了此条规则\n\n";
  470. // $dataFinalcount .= "\n\n注意事项:\n";
  471. // $dataFinalcount .= "1. 若有违规,按格式逐条列出,必须包含【规则名称】【质控结果】两个字段,最多只能输出一次。\n";
  472. // $dataFinalcount .= "2. 每个字段独占一行,使用【】标注字段名,后接内容,不加冒号或其他符号。\n";
  473. // $dataFinalcount .= "3. 禁止添加解释、总结、问候语或额外说明。\n";
  474. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$dataFinal."\n请按照这个规则: ".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."(" .$rulename[$j]['ruleread'].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: ".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】: ".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)\n【质控原文】:(规则质控的具体原文的标题【‘:’前的文字。】,例如(主诉),严格输出原文的标题,不要输出其他内容,不能有任何偏差,)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释。";
  475. // exit;
  476. // dump($dataFinalcount.'-----------------------------------------------------');
  477. // exit;
  478. // $dataFinalcount = '我需要你扮演一位专业医疗病历质控员,现在要进行病历质控。下面是一份'.$docName.'病历,当前病历原文为:\n'.$dataFinal.'n请按照这个规则:\"'.$rule[$j]["ruletype"].$rule[$j]["ruledetail"].'\",为我判断当前病历原文是否正确。如果正确,请返回:\"病例校验结果:病例校验通过。\",详细分析质控过程并说明原因;如果不正确,请返回:\"病例校验结果:'.$rule[$j]['ruletype'].".".$rule[$j]['ruledetail'].'\",详细分析质控过程并说明原因。仅把返回结果放在</answer>和<answer>之间。"';
  479. //请求websocket客户端发送数据
  480. $recContentFinal = [
  481. [
  482. 'role' => 'user',
  483. 'content' => $dataFinalcount
  484. ],
  485. ];
  486. //组装请求的数据为base64格式
  487. $data = [];
  488. $data['model'] = 'gstcm-G1-14B';
  489. $data['network'] = '2';
  490. $data['input'] = $recContentFinal;
  491. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  492. $data = base64_encode($data);
  493. //对请求的参数进行sm4加密
  494. $smIV = getSMIV();
  495. $config = [
  496. 'mode' => 'cbc',
  497. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  498. 'iv' => $smIV, // 16 字节二进制 IV
  499. 'hash' => false
  500. ];
  501. $sm4 = new EvitSM4Encryption($config);
  502. $encryptedBinary = $sm4->encrypt($data);
  503. // 将二进制结果转换为 Base64
  504. $encryptedBase64 = base64_encode($encryptedBinary);
  505. //创建最终的含有sm4的iv的数据
  506. $modifiedData = [];
  507. $modifiedData['encryptedBase64'] = $encryptedBase64;
  508. $modifiedData['smIV'] = $smIV;
  509. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  510. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  511. $modifiedData = base64_encode($modifiedData);
  512. // 将 '+' 替换为 '-','/' 替换为 '_'
  513. $modifiedData = strtr($modifiedData, '+/', '-_');
  514. //将加密的参数发送给开放平台,获取短令牌
  515. $urlOpen = commonOpenURL().'/Apis/getToken';
  516. $encryption['information'] = $modifiedData;
  517. $token = curlPost($urlOpen,$encryption);
  518. $token = stdClassObjToArray(json_decode($token));
  519. //推送消息至websocket
  520. $dataRequest['user'] = $user;
  521. $num = $i + 1;
  522. $dataRequest['name'] = $name;
  523. $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
  524. $dataRequest['doc'] = $docName;
  525. $dataRequest['token'] = $token['token'];
  526. $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
  527. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  528. $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
  529. $tokenrole['token'] = $token['token'];
  530. $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
  531. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  532. $tokenrole['content'] = $dataFinal;
  533. $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
  534. $tokenrole['keywords'] = $rulename[$j]['keywords'];
  535. if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
  536. $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
  537. }
  538. $tokenrole['time'] = time();
  539. db('tokenrole') -> insert($tokenrole);
  540. // dump($tokenrole);
  541. // exit;
  542. $url = commonURL().'/Send/websocket';
  543. curlPost($url,$dataRequest);
  544. }
  545. }
  546. sleep(1);
  547. }
  548. return 'success';
  549. }
  550. //测试样例
  551. public function hisOpenPushMedical5(){
  552. $user = request() -> param('user');
  553. $docsCode = request() -> param('docsCode');
  554. $ragId = request() -> param('ragId');
  555. $mapclient['user'] = array('eq',$user);
  556. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  557. $strate = db('client') -> where($mapclient) -> value('strate');
  558. if($messageQueue != 0){
  559. return;
  560. }
  561. if($messageQueue != 0 && $strate == 0){
  562. return;
  563. }
  564. // $ragId ="1970054015201382402";
  565. // $ragId ="1970054015201382rqqww402";
  566. $mapToken['token'] = array('eq',$docsCode);
  567. $docsJson = db('token') -> where($mapToken) -> value('info');
  568. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  569. $dataIntel = json_decode($dataIntel);
  570. $dataIntel = stdClassObjToArray($dataIntel);
  571. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  572. $tokenrole['out_num'] = $dataIntel['out_num'];
  573. $tokenrole['in_num'] = $dataIntel['in_num'];
  574. $tokenrole['id_num'] = $dataIntel['id_num'];
  575. // return $docsJson;
  576. if(!$docsJson){
  577. return json('客户端短令牌错误!');
  578. }
  579. $docsArray = json_decode($docsJson);
  580. $docsArray = stdClassObjToArray($docsArray);
  581. // dump($docsJson);
  582. // exit;
  583. //通过病历列表获取病历原文
  584. for($i = 0; $i < count($docsArray); $i++){
  585. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  586. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  587. //请求病历原文
  588. $mrId = $docsArray[$i]["MR_ID"];
  589. $dataMrId['mrId'] = $mrId;
  590. $urlMrId = commonDataURL().'/His/getMedicalRec';
  591. $recs = curlPost($urlMrId,$dataMrId);
  592. $recs = json_decode($recs);
  593. $recs = stdClassObjToArray($recs);
  594. // dump($recs);
  595. // exit;
  596. $keshi = $recs[1]['mr_text'];
  597. $tokenrole['DEPT_NAME'] = $keshi;
  598. $dataFinal = $recs[0];
  599. $recs[1]['mr_title'] = '标题';
  600. $recs[1]['mr_text'] = $docName;
  601. if($ragId!=null){
  602. $dataRag['input'] = $docName;
  603. $dataRag['kid'] = $ragId;
  604. // dump($docName);
  605. $urlRAG = 'http://192.168.10.115:3338/apis/ragData';
  606. $ragResult = curlPost($urlRAG,$dataRag);
  607. $ragResult = json_decode($ragResult);
  608. $ragResult = stdClassObjToArray($ragResult);
  609. if(array_key_exists('code', $ragResult)){
  610. }
  611. else{
  612. if($ragResult["nearest"]!=null){
  613. // dump($ragResult);
  614. $rulesArray = preg_split('/\s*(?=规则编号:)/', $ragResult["nearest"][0]["text"], -1, PREG_SPLIT_NO_EMPTY);
  615. // dump($rulesArray);
  616. // exit;
  617. // 去除每个规则文本前后的空白字符
  618. $rulesArray = array_map('trim', $rulesArray);
  619. for($j=1;$j<count($rulesArray);$j++){
  620. preg_match('/规则编号:(.*?)\s*规则详情:\s*(.*?)\s*规则描述:\s*(.*?)\s*扣分标准:\s*([\d.]+)/s', $rulesArray[$j], $matches);
  621. // 存储到数组中
  622. $ruleData = [
  623. 'ruleid' => isset($matches[1]) ? trim($matches[1]) : '',
  624. 'ruletype' => isset($matches[2]) ? trim($matches[2]) : '',
  625. 'ruledetail' => isset($matches[3]) ? trim($matches[3]) : '',
  626. 'rulescore' => isset($matches[4]) ? floatval(trim($matches[4])) : 0.0
  627. ];
  628. $signers = $recs[2];
  629. $signerNames = array();
  630. foreach ($signers as $signer) {
  631. if (isset($signer['SIGNER'])) {
  632. $signerNames[] = $signer['SIGNER'];
  633. }
  634. }
  635. $signerIndex = 0;
  636. $newDataFinal = preg_replace_callback(
  637. '/(签名:)(\s*)/',
  638. function($matches) use (&$signerIndex, $signerNames) {
  639. // 如果超过数组长度,使用最后一个签名者
  640. $name = ($signerIndex < count($signerNames))
  641. ? $signerNames[$signerIndex]
  642. : end($signerNames);
  643. $signerIndex++;
  644. return $matches[1] . $name . $matches[2];
  645. },
  646. $dataFinal
  647. );
  648. // $newDataFinal = preg_replace('/(签名:)(\s*)/', "签名:".$recs[2][0]["SIGNER"], $dataFinal);
  649. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$newDataFinal."\n请按照这个规则: ".$rulesArray[$j].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: (对应的规则详情,不是规则编号)\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】:(对应的规则名称或者规则详情) \n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容,当质控签名时,只要有任何一个签名,就判断质控结果为通过。";
  650. // dump($dataFinalcount);
  651. // exit;
  652. //请求websocket客户端发送数据
  653. $recContentFinal = [
  654. [
  655. 'role' => 'user',
  656. 'content' => $dataFinalcount
  657. ],
  658. ];
  659. //组装请求的数据为base64格式
  660. $data = [];
  661. $data['model'] = 'gstcm-G1-14B';
  662. $data['network'] = '2';
  663. $data['input'] = $recContentFinal;
  664. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  665. $data = base64_encode($data);
  666. //对请求的参数进行sm4加密
  667. $smIV = getSMIV();
  668. $config = [
  669. 'mode' => 'cbc',
  670. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  671. 'iv' => $smIV, // 16 字节二进制 IV
  672. 'hash' => false
  673. ];
  674. $sm4 = new EvitSM4Encryption($config);
  675. $encryptedBinary = $sm4->encrypt($data);
  676. // 将二进制结果转换为 Base64
  677. $encryptedBase64 = base64_encode($encryptedBinary);
  678. //创建最终的含有sm4的iv的数据
  679. $modifiedData = [];
  680. $modifiedData['encryptedBase64'] = $encryptedBase64;
  681. $modifiedData['smIV'] = $smIV;
  682. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  683. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  684. $modifiedData = base64_encode($modifiedData);
  685. // 将 '+' 替换为 '-','/' 替换为 '_'
  686. $modifiedData = strtr($modifiedData, '+/', '-_');
  687. //将加密的参数发送给开放平台,获取短令牌
  688. $urlOpen = commonOpenURL().'/Apis/getToken';
  689. $encryption['information'] = $modifiedData;
  690. $token = curlPost($urlOpen,$encryption);
  691. $token = stdClassObjToArray(json_decode($token));
  692. //推送消息至websocket
  693. $dataRequest['user'] = $user;
  694. $num = $i + 1;
  695. $dataRequest['name'] = $name;
  696. $dataRequest['rule'] = $ruleData['ruletype'].$ruleData['ruledetail'];
  697. $dataRequest['doc'] = $docName;
  698. $dataRequest['token'] = $token['token'];
  699. $dataRequest['ruleid'] = $ruleData['ruleid'];
  700. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  701. $tokenrole['rulescore'] = $ruleData['rulescore'];//规则扣分
  702. $tokenrole['token'] = $token['token'];
  703. $tokenrole['ruleid'] = $ruleData['ruleid']; //规则ID
  704. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  705. $tokenrole['content'] = $dataFinal;
  706. $tokenrole['ruletype'] = $ruleData['ruletype'];//规则类型
  707. $tokenrole['keywords'] = "";
  708. $tokenrole['ruledetail'] = ''.$ruleData['ruledetail'];//规则详情
  709. $tokenrole['time'] = time();
  710. db('tokenrole') -> insert($tokenrole);
  711. $url = commonURL().'/Send/websocket';
  712. curlPost($url,$dataRequest);
  713. }
  714. }
  715. }
  716. }
  717. $mapName['emr'] = array('eq', $docName);
  718. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  719. if($rulename != null){
  720. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  721. $ruleIdArray = array('RYJLXBS0013', 'RYJLXBS0012','RYJL0002', 'RYJLXX0001', 'RYJLZS0000', 'RYJLZS0001', 'RYJLZS0002', 'RYJLZS0003', 'RYJLZS0004', 'RYJLZS0005', 'RYJLXBS0000', 'RYJLXBS0001', 'RYJLXBS0002', 'RYJLXBS0003', 'RYJLXBS0004', 'RYJLXBS0005', 'RYJLXBS0006', 'RYJLXBS0007', 'RYJLXBS0008', 'RYJLXBS0009', 'RYJLXBS0010', 'RYJLXBS0011', 'RYJLJWS0000', 'RYJLJWS0001', 'RYJLJWS0002', 'RYJLJWS0003', 'RYJLJWS0004', 'RYJLJWS0005', 'RYJLJWS0006', 'RYJLJWS0007', 'RYJLJWS0009', 'RYJLJWS0010', 'RYJLJWS0011', 'RYJLGRS0000', 'RYJLHY0002', 'RYJLJZS0000', 'RYJLJZS0001', 'RYJLTGJC0000', 'RYJLTGJC0001', 'RYJLTGJC0002', 'RYJLTGJC0003', 'RYJLTGJC0004', 'RYJLTGJC0005', 'RYJLTGJC0006', 'RYJLTGJC0007', 'RYJLTGJC0008', 'RYJLZKJC0000', 'RYJLZKJC0001', 'RYJLFZJC0000', 'RYJLFZJC0001', 'RYJLFZJC0002', 'RYJLFZJC0003', 'RYJLFZJC0004', 'RYJLFZJC0007', 'RYJLFZJC0008', 'RYJLCBZD0000', 'RYJLCBZD0001', 'SCBC0000', 'SCBC0001', 'SCBC0003', 'SCBC0004', 'SCBC0005', 'RCBC0001', 'RCBC0003', 'RCBC0007', 'RCBC0011', 'RCBC0015', 'RCBC0019', 'RCBC0024', 'RCBC0025', 'RCBC0026', 'RCBC0027', 'RCBC0038', 'RCBC0039', 'RCBC0044', 'CYJL0008', 'CYJL0009', 'CYJL0011', 'CYJL0012', 'HZJL0000', 'HZJL0001', 'HZJL0002', 'HZJL0003', 'HZJL0005', 'SQXJ0000', 'SQXJ0001', 'RCBC0040', 'RCBC0041', 'SCBC0002', 'SWJL0007', 'CYJL0013', 'ZQTY0012', 'ZQTY0013', 'RYJLXBS0014');
  722. $maprule['ruleid'] = array('in', $ruleIdArray);
  723. $rulename = db('rulefinal')->where($maprule)->select();
  724. $rulename = stdClassObjToArray($rulename);
  725. for($j=0;$j<count($rulename);$j++){
  726. if($rulename[$j]['ruledetail'] == '暂无'){
  727. $rulename[$j]['ruledetail'] = '';
  728. }
  729. $ruleId = $rulename[$j]['ruleid'];
  730. $mapmultirule['ruleid'] = array('eq', $ruleId);
  731. // $mapmultirule['ruleid'] = array('eq', "RYJLXBS0014");
  732. $multirule = db('multirule')->where($mapmultirule)->select();
  733. $multirule = stdClassObjToArray($multirule);
  734. $docNamepath="";
  735. for($g = 0; $g < count($multirule); $g++){
  736. if($g>=1){
  737. $docNamepath .= "、";
  738. }
  739. $docNamepath.=$multirule[$g]["medicalreport"];
  740. }
  741. $multipleCases="";
  742. for($q = 0; $q < count($multirule); $q++){
  743. for($g = 0; $g < count($docsArray); $g++){
  744. if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  745. $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  746. $urlMrId = commonDataURL().'/His/getMedicalRec';
  747. $recs = curlPost($urlMrId,$dataMrId);
  748. $recs = json_decode($recs);
  749. $recs = stdClassObjToArray($recs);
  750. $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  751. }
  752. }
  753. }
  754. $signers = $recs[2];
  755. $signerNames = array();
  756. foreach ($signers as $signer) {
  757. if (isset($signer['SIGNER'])) {
  758. $signerNames[] = $signer['SIGNER'];
  759. }
  760. }
  761. $signerIndex = 0;
  762. $newMultipleCases = preg_replace_callback(
  763. '/(签名:)(\s*)/',
  764. function($matches) use (&$signerIndex, $signerNames) {
  765. // 如果超过数组长度,使用最后一个签名者
  766. $name = ($signerIndex < count($signerNames))
  767. ? $signerNames[$signerIndex]
  768. : end($signerNames);
  769. $signerIndex++;
  770. return $matches[1] . $name . $matches[2];
  771. },
  772. $multipleCases
  773. );
  774. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docNamepath.",病历原文为:\n".$newMultipleCases."\n***请按照这个规则: ".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."(" .$rulename[$j]['ruleread'].") 为我判断当前病历原文是否正确,是否符合规则,严格按照质控规则进行质控,禁止增添质控规则外的内容。***如果正确,请返回:'【规则名称】: ".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】: ".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
  775. //请求websocket客户端发送数据
  776. $recContentFinal = [
  777. [
  778. 'role' => 'user',
  779. 'content' => $dataFinalcount
  780. ],
  781. ];
  782. // dump($dataFinalcount);
  783. //组装请求的数据为base64格式
  784. $data = [];
  785. $data['model'] = 'gstcm-G1-14B';
  786. $data['network'] = '2';
  787. $data['input'] = $recContentFinal;
  788. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  789. $data = base64_encode($data);
  790. //对请求的参数进行sm4加密
  791. $smIV = getSMIV();
  792. $config = [
  793. 'mode' => 'cbc',
  794. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  795. 'iv' => $smIV, // 16 字节二进制 IV
  796. 'hash' => false
  797. ];
  798. $sm4 = new EvitSM4Encryption($config);
  799. $encryptedBinary = $sm4->encrypt($data);
  800. // 将二进制结果转换为 Base64
  801. $encryptedBase64 = base64_encode($encryptedBinary);
  802. //创建最终的含有sm4的iv的数据
  803. $modifiedData = [];
  804. $modifiedData['encryptedBase64'] = $encryptedBase64;
  805. $modifiedData['smIV'] = $smIV;
  806. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  807. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  808. $modifiedData = base64_encode($modifiedData);
  809. // 将 '+' 替换为 '-','/' 替换为 '_'
  810. $modifiedData = strtr($modifiedData, '+/', '-_');
  811. //将加密的参数发送给开放平台,获取短令牌
  812. $urlOpen = commonOpenURL().'/Apis/getToken';
  813. $encryption['information'] = $modifiedData;
  814. $token = curlPost($urlOpen,$encryption);
  815. $token = stdClassObjToArray(json_decode($token));
  816. //推送消息至websocket
  817. $dataRequest['user'] = $user;
  818. $dataRequest['name'] = $name;
  819. $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
  820. $dataRequest['doc'] = $docName;
  821. $dataRequest['token'] = $token['token'];
  822. $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
  823. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  824. $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
  825. $tokenrole['token'] = $token['token'];
  826. $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
  827. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  828. $tokenrole['content'] = $dataFinal;
  829. $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
  830. $tokenrole['keywords'] = $rulename[$j]['keywords'];
  831. if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
  832. $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
  833. }
  834. $tokenrole['time'] = time();
  835. db('tokenrole') -> insert($tokenrole);
  836. // dump($tokenrole);
  837. // exit;
  838. $url = commonURL().'/Send/websocket';
  839. curlPost($url,$dataRequest);
  840. }
  841. // exit;
  842. }
  843. sleep(1);
  844. }
  845. return 'success';
  846. }
  847. //测试样例新版
  848. public function hisOpenPushMedical(){
  849. $user = request() -> param('user');
  850. $docsCode = request() -> param('docsCode');
  851. $ragId = request() -> param('ragId');
  852. // $user = "6666";
  853. $mapclient['user'] = array('eq',$user);
  854. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  855. $strate = db('client') -> where($mapclient) -> value('strate');
  856. if($messageQueue != 0){
  857. return;
  858. }
  859. if($messageQueue != 0 && $strate == 0){
  860. return;
  861. }
  862. // $ragId ="1970054015201382402";
  863. // $ragId ="1970054015201382rqqww402";
  864. // $docsCode = "1d87d33a8d7339845010c94802c3bbe3";
  865. $mapToken['token'] = array('eq',$docsCode);
  866. $docsJson = db('token') -> where($mapToken) -> value('info');
  867. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  868. $dataIntel = json_decode($dataIntel);
  869. $dataIntel = stdClassObjToArray($dataIntel);
  870. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  871. $tokenrole['out_num'] = $dataIntel['out_num'];
  872. $tokenrole['in_num'] = $dataIntel['in_num'];
  873. $tokenrole['id_num'] = $dataIntel['id_num'];
  874. $tokenrole['pat_id'] = $dataIntel['pat_id'];
  875. // return $docsJson;
  876. if(!$docsJson){
  877. return json('客户端短令牌错误!');
  878. }
  879. $docsArray = json_decode($docsJson);
  880. $docsArray = stdClassObjToArray($docsArray);
  881. $mapping = [
  882. "病案首页" => "0",
  883. "入院记录" => "1",
  884. "首次病程记录" => "2",
  885. "阶段小结" => "3",
  886. "日常病程记录" => "4",
  887. "上级医师查房记录" => "5",
  888. "会诊记录" => "6",
  889. "术前讨论" => "7",
  890. "麻醉记录" => "8",
  891. "有创操作记录" => "9",
  892. "术后病程记录" => "10",
  893. "检查检验记录" => "11",
  894. "护理记录" => "12",
  895. "评分表" => "13",
  896. "交接班记录" => "14",
  897. "抢救记录" => "15",
  898. "死亡记录" => "16",
  899. "出入转记录" => "17",
  900. ];
  901. $mapping1 = [
  902. "病案首页" => "0",
  903. "入院记录" => "1",
  904. "首次病程记录" => "2",
  905. "阶段小结" => "3",
  906. "日常病程记录" => "4",
  907. "上级医师查房记录" => "5",
  908. "会诊记录" => "6",
  909. "术前讨论" => "7",
  910. "麻醉记录" => "8",
  911. "有创操作记录" => "9",
  912. "术后病程记录" => "10",
  913. "检查检验记录" => "11",
  914. "护理记录" => "12",
  915. "评分表" => "13",
  916. "交接班记录" => "14",
  917. "抢救记录" => "15",
  918. "死亡记录" => "16",
  919. "出入转记录" => "17",
  920. ];
  921. //通过病历列表获取病历原文
  922. for($i = 0; $i < count($docsArray); $i++){
  923. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  924. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  925. //请求病历原文
  926. $mrId = $docsArray[$i]["MR_ID"];
  927. $dataMrId['mrId'] = $mrId;
  928. $urlMrId = commonDataURL().'/His/getMedicalRec';
  929. $recs = curlPost($urlMrId,$dataMrId);
  930. $recs = json_decode($recs);
  931. $recs = stdClassObjToArray($recs);
  932. // dump("====================");
  933. // dump($recs);
  934. // dump($recs);
  935. // exit;
  936. $keshi = $recs[1]['mr_text'];
  937. $tokenrole['DEPT_NAME'] = $keshi;
  938. $dataFinal = $recs[0];
  939. $recs[1]['mr_title'] = '标题';
  940. $recs[1]['mr_text'] = $docName;
  941. // dump($docName);
  942. $mapName['emr'] = array('eq', $docName);
  943. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  944. if($rulename != null){
  945. // $mapqcStage['qc_type_list'] = array('like', '%'.$mapping[$rulename].'%');
  946. // $mapqcStage['qc_behavior'] = array('eq', 'common');
  947. // //质控阶段与病例类型筛选后的规则
  948. // $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
  949. // $qcruleStage = stdClassObjToArray($qcruleStage);
  950. // dump($qcruleStage);
  951. // exit;
  952. $qcrulelink = db('quality_control_rule_sz')->select();
  953. $qcTypeList = [];
  954. if (array_key_exists($rulename, $mapping)) {
  955. //筛选质控病历类型所对应的参数。
  956. for($z = 0; $z < count($qcrulelink) ; $z++){
  957. // $qcrulelink[$i];
  958. // dump($qcrulelink[$i]["qc_type_list"]);
  959. $TypeList = json_decode($qcrulelink[$z]["qc_type_list"]);
  960. // 检查qcType是否在TypeList中
  961. if (is_array($TypeList) && in_array($mapping[$rulename], $TypeList)) {
  962. // 将对应的rule_code添加到qcTypeList数组中
  963. $qcTypeList[] = $qcrulelink[$z]["rule_code"];
  964. }
  965. }
  966. }
  967. $mapqcStage['rule_code'] = array('in', $qcTypeList);
  968. $mapqcStage['qc_behavior'] = array('eq', 'common');
  969. $mapqcStage['qc_stage'] = array('eq', 'PostEvent');
  970. $mapqcStage['is_enabled'] = array('eq', 1);
  971. //质控阶段与病例类型筛选后的规则
  972. $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
  973. // dump($qcruleStage);
  974. // exit;
  975. //规则适配的病例类型
  976. // $qcTypeList = $qcruleStage[0]["qc_type_list"];
  977. // $qcTypeList = json_decode($qcTypeList);
  978. // $qcTypeList = stdClassObjToArray($qcTypeList);
  979. $dataRag['medicalContent'] = $dataFinal;
  980. $dataRag['kid'] = 'Rule_Final';
  981. for($j=0;$j<count($qcruleStage);$j++){
  982. $ruleCode = $qcruleStage[$j]['rule_code'];
  983. $dataRag['ruleCode'] = $ruleCode;
  984. $urlRAG = 'http://192.168.10.115:3338/apis/ragDataMCQC';
  985. $ragResult = curlPost($urlRAG,$dataRag);
  986. $ragResult = json_decode($ragResult);
  987. $ragResult = stdClassObjToArray($ragResult);
  988. //医师签名
  989. $signers = $recs[2];
  990. $signerNames = array();
  991. foreach ($signers as $signer) {
  992. if (isset($signer['SIGNER'])) {
  993. $signerNames[] = $signer['SIGNER'];
  994. }
  995. }
  996. $signerIndex = 0;
  997. //将签名组装到病历里。
  998. $newMultipleCases = preg_replace_callback(
  999. '/(签名:)(\s*)/',
  1000. function($matches) use (&$signerIndex, $signerNames) {
  1001. // 如果超过数组长度,使用最后一个签名者
  1002. $name = ($signerIndex < count($signerNames))
  1003. ? $signerNames[$signerIndex]
  1004. : end($signerNames);
  1005. $signerIndex++;
  1006. return $matches[1] . $name . $matches[2];
  1007. },
  1008. $dataFinal
  1009. );
  1010. // dump($dataFinal);
  1011. // dump($newMultipleCases);
  1012. // exit;
  1013. // $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docNamepath.",病历原文为:\n".$newMultipleCases."\n***请按照这个规则: ".$qcruleStage[$j]['ruletype'].$qcruleStage[$j]['ruledetail']."(" .$qcruleStage[$j]['ruleread'].") 为我判断当前病历原文是否正确,是否符合规则,严格按照质控规则进行质控,禁止增添质控规则外的内容。***如果正确,请返回:'【规则名称】: ".$qcruleStage[$j]['ruletype'].$qcruleStage[$j]['ruledetail']."\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】: ".$qcruleStage[$j]['ruletype'].$qcruleStage[$j]['ruledetail']."\n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
  1014. if(count($ragResult["data"]) != 0){
  1015. //正确示例
  1016. $PoExample = "";
  1017. //错误示例
  1018. $ErExample = "";
  1019. for($Example = 0 ;$Example<count($ragResult["data"]);$Example++){
  1020. if($ragResult["data"][$Example]["type"] == "positive"){
  1021. $PoExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
  1022. }
  1023. else{
  1024. $ErExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
  1025. }
  1026. }
  1027. // dump($PoExample);
  1028. // dump($ErExample);
  1029. $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
  1030. 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
  1031. 请严格基于【病历原文】判断是否违反该规则。
  1032. ***【质控规则】***
  1033. 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
  1034. 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
  1035. 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
  1036. ***【参考内容】***
  1037. 正例(符合要求的写法):\n
  1038. ".$PoExample."\n
  1039. 反例(不符合要求的写法):\n
  1040. ".$ErExample."\n
  1041. ===【病历原文】===
  1042. 以下为".$docName."部分:
  1043. \n".$newMultipleCases."\n
  1044. ===【输出要求】===
  1045. 请严格以下列格式输出,不得输出解释性文字或额外内容。
  1046. 如果病历完全符合规则,请输出以下格式的内容:
  1047. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1048. 【质控结果】:病例校验通过。
  1049. 如果存在不符合规则,请输出以下格式的内容:
  1050. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1051. 【质控结果】:病例校验不通过\n
  1052. 【不通过原因】:(简要概述不通过的原因)
  1053. 【规则关键字】:违规位置及所属内容(必须只有一个关键字,如 ‘主诉’)',
  1054. ===【注意事项】===
  1055. - 严禁输出 Markdown 代码块(如 ```json)
  1056. - 严禁输出解释性文字、分析过程或无关说明
  1057. - 不得引用或复述【参考内容】中的文字
  1058. - 若规则不适用于当前病历内容,应视为通过
  1059. - 所有结论必须严格基于【病历原文】内容
  1060. -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
  1061. ";
  1062. }
  1063. else{
  1064. $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
  1065. 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
  1066. 请严格基于【病历原文】判断是否违反该规则。
  1067. ***【质控规则】***
  1068. 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
  1069. 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
  1070. 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
  1071. ===【病历原文】===
  1072. 以下为".$docName."部分:
  1073. \n".$newMultipleCases."\n
  1074. ===【输出要求】===
  1075. 请严格以下列格式输出,不得输出解释性文字或额外内容。
  1076. 如果病历完全符合规则,请输出以下格式的内容:
  1077. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1078. 【质控结果】:病例校验通过。
  1079. 如果存在不符合规则,请输出以下格式的内容:
  1080. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1081. 【质控结果】:病例校验不通过\n
  1082. 【不通过原因】:(简要概述不通过的原因)\n
  1083. 【规则关键字】:违规位置及内容(必须只有一个关键字,如 ‘主诉’)'
  1084. ===【注意事项】===
  1085. - 严禁输出 Markdown 代码块(如 ```json)
  1086. - 严禁输出解释性文字、分析过程或无关说明
  1087. - 若规则不适用于当前病历内容,应视为通过
  1088. - 所有结论必须严格基于【病历原文】内容
  1089. -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
  1090. ";
  1091. }
  1092. // dump($dataFinalcount);
  1093. // exit;
  1094. //请求websocket客户端发送数据
  1095. $recContentFinal = [
  1096. [
  1097. 'role' => 'user',
  1098. 'content' => $dataFinalcount
  1099. ],
  1100. ];
  1101. // dump($dataFinalcount);
  1102. //组装请求的数据为base64格式
  1103. $data = [];
  1104. $data['model'] = 'gstcm-G1-14B';
  1105. $data['network'] = '2';
  1106. $data['input'] = $recContentFinal;
  1107. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1108. $data = base64_encode($data);
  1109. //对请求的参数进行sm4加密
  1110. $smIV = getSMIV();
  1111. $config = [
  1112. 'mode' => 'cbc',
  1113. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1114. 'iv' => $smIV, // 16 字节二进制 IV
  1115. 'hash' => false
  1116. ];
  1117. $sm4 = new EvitSM4Encryption($config);
  1118. $encryptedBinary = $sm4->encrypt($data);
  1119. // 将二进制结果转换为 Base64
  1120. $encryptedBase64 = base64_encode($encryptedBinary);
  1121. //创建最终的含有sm4的iv的数据
  1122. $modifiedData = [];
  1123. $modifiedData['encryptedBase64'] = $encryptedBase64;
  1124. $modifiedData['smIV'] = $smIV;
  1125. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1126. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1127. $modifiedData = base64_encode($modifiedData);
  1128. // 将 '+' 替换为 '-','/' 替换为 '_'
  1129. $modifiedData = strtr($modifiedData, '+/', '-_');
  1130. //将加密的参数发送给开放平台,获取短令牌
  1131. $urlOpen = commonOpenURL().'/Apis/getToken';
  1132. $encryption['information'] = $modifiedData;
  1133. $token = curlPost($urlOpen,$encryption);
  1134. $token = stdClassObjToArray(json_decode($token));
  1135. // dump($recContentFinal);
  1136. // exit;
  1137. //推送消息至websocket
  1138. $dataRequest['user'] = $user;
  1139. $dataRequest['name'] = $name;
  1140. $dataRequest['rule'] = $qcruleStage[$j]['rule_content'];
  1141. $dataRequest['doc'] = $docName;
  1142. $dataRequest['token'] = $token['token'];
  1143. $dataRequest['ruleid'] = $qcruleStage[$j]['rule_code'];
  1144. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1145. $tokenrole['token'] = $token['token'];
  1146. $tokenrole['ruleid'] = $qcruleStage[$j]['rule_code'];
  1147. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1148. $tokenrole['content'] = $dataFinal;
  1149. $tokenrole['ruletype'] = $qcruleStage[$j]['category'];
  1150. $tokenrole['ruledetail'] = $qcruleStage[$j]['rule_content'];
  1151. // dump($tokenrole);
  1152. // exit;
  1153. $tokenrole['time'] = time();
  1154. db('tokenrole') -> insert($tokenrole);
  1155. // dump($tokenrole);
  1156. // exit;
  1157. $url = commonURL().'/Send/websocket';
  1158. curlPost($url,$dataRequest);
  1159. }
  1160. }
  1161. // // exit;
  1162. //多病例融合
  1163. // $docNamepath="";
  1164. // for($g = 0; $g < count($multirule); $g++){
  1165. // if($g>=1){
  1166. // $docNamepath .= "、";
  1167. // }
  1168. // $docNamepath.=$multirule[$g]["medicalreport"];
  1169. // }
  1170. // $multipleCases="";
  1171. // for($q = 0; $q < count($multirule); $q++){
  1172. // for($g = 0; $g < count($docsArray); $g++){
  1173. // if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  1174. // $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  1175. // $urlMrId = commonDataURL().'/His/getMedicalRec';
  1176. // $recs = curlPost($urlMrId,$dataMrId);
  1177. // $recs = json_decode($recs);
  1178. // $recs = stdClassObjToArray($recs);
  1179. // $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  1180. // }
  1181. // }
  1182. // }
  1183. }
  1184. // sleep(1);
  1185. return 'success';
  1186. }
  1187. //测试样例新版
  1188. public function hisOpenPushMedical_test(){
  1189. $user = request() -> param('user');
  1190. $docsCode = request() -> param('docsCode');
  1191. $ragId = request() -> param('ragId');
  1192. $user = "6666";
  1193. $mapclient['user'] = array('eq',$user);
  1194. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  1195. $strate = db('client') -> where($mapclient) -> value('strate');
  1196. if($messageQueue != 0){
  1197. return;
  1198. }
  1199. if($messageQueue != 0 && $strate == 0){
  1200. return;
  1201. }
  1202. // $ragId ="1970054015201382402";
  1203. // $ragId ="1970054015201382rqqww402";
  1204. $docsCode = "1a9bdc6db24a14fb1698cf854933dca5";
  1205. $mapToken['token'] = array('eq',$docsCode);
  1206. $docsJson = db('token') -> where($mapToken) -> value('info');
  1207. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  1208. $dataIntel = json_decode($dataIntel);
  1209. $dataIntel = stdClassObjToArray($dataIntel);
  1210. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  1211. $tokenrole['out_num'] = $dataIntel['out_num'];
  1212. $tokenrole['in_num'] = $dataIntel['in_num'];
  1213. $tokenrole['id_num'] = $dataIntel['id_num'];
  1214. $tokenrole['pat_id'] = $dataIntel['pat_id'];
  1215. // return $docsJson;
  1216. // dump($dataIntel);
  1217. // exit;
  1218. if(!$docsJson){
  1219. return json('客户端短令牌错误!');
  1220. }
  1221. $docsArray = json_decode($docsJson);
  1222. $docsArray = stdClassObjToArray($docsArray);
  1223. $mapping = [
  1224. "病案首页" => "0",
  1225. "入院记录" => "1",
  1226. "首次病程记录" => "2",
  1227. "阶段小结" => "3",
  1228. "日常病程记录" => "4",
  1229. "上级医师查房记录" => "5",
  1230. "会诊记录" => "6",
  1231. "术前讨论" => "7",
  1232. "麻醉记录" => "8",
  1233. "有创操作记录" => "9",
  1234. "术后病程记录" => "10",
  1235. "检查检验记录" => "11",
  1236. "护理记录" => "12",
  1237. "评分表" => "13",
  1238. "交接班记录" => "14",
  1239. "抢救记录" => "15",
  1240. "死亡记录" => "16",
  1241. "出入转记录" => "17",
  1242. ];
  1243. $mapping1 = [
  1244. "病案首页" => "0",
  1245. "入院记录" => "1",
  1246. "首次病程记录" => "2",
  1247. "阶段小结" => "3",
  1248. "日常病程记录" => "4",
  1249. "上级医师查房记录" => "5",
  1250. "会诊记录" => "6",
  1251. "术前讨论" => "7",
  1252. "麻醉记录" => "8",
  1253. "有创操作记录" => "9",
  1254. "术后病程记录" => "10",
  1255. "检查检验记录" => "11",
  1256. "护理记录" => "12",
  1257. "评分表" => "13",
  1258. "交接班记录" => "14",
  1259. "抢救记录" => "15",
  1260. "死亡记录" => "16",
  1261. "出入转记录" => "17",
  1262. ];
  1263. //通过病历列表获取病历原文
  1264. for($i = 0; $i < count($docsArray); $i++){
  1265. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  1266. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  1267. //请求病历原文
  1268. $mrId = $docsArray[$i]["MR_ID"];
  1269. $dataMrId['mrId'] = $mrId;
  1270. $urlMrId = commonDataURL().'/His/getMedicalRec';
  1271. $recs = curlPost($urlMrId,$dataMrId);
  1272. $recs = json_decode($recs);
  1273. $recs = stdClassObjToArray($recs);
  1274. // dump("====================");
  1275. // dump($recs);
  1276. // dump($recs);
  1277. // exit;
  1278. $keshi = $recs[1]['mr_text'];
  1279. $tokenrole['DEPT_NAME'] = $keshi;
  1280. $dataFinal = $recs[0];
  1281. $recs[1]['mr_title'] = '标题';
  1282. $recs[1]['mr_text'] = $docName;
  1283. // dump($docName);
  1284. $mapName['emr'] = array('eq', $docName);
  1285. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  1286. if($rulename != null){
  1287. // $mapqcStage['qc_type_list'] = array('like', '%'.$mapping[$rulename].'%');
  1288. // $mapqcStage['qc_behavior'] = array('eq', 'common');
  1289. // //质控阶段与病例类型筛选后的规则
  1290. // $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
  1291. // $qcruleStage = stdClassObjToArray($qcruleStage);
  1292. // dump($qcruleStage);
  1293. // exit;
  1294. $qcrulelink = db('quality_control_rule_sz')->select();
  1295. $qcTypeList = [];
  1296. if (array_key_exists($rulename, $mapping)) {
  1297. //筛选质控病历类型所对应的参数。
  1298. for($z = 0; $z < count($qcrulelink) ; $z++){
  1299. // $qcrulelink[$i];
  1300. // dump($qcrulelink[$i]["qc_type_list"]);
  1301. $TypeList = json_decode($qcrulelink[$z]["qc_type_list"]);
  1302. // 检查qcType是否在TypeList中
  1303. if (is_array($TypeList) && in_array($mapping[$rulename], $TypeList)) {
  1304. // 将对应的rule_code添加到qcTypeList数组中
  1305. $qcTypeList[] = $qcrulelink[$z]["rule_code"];
  1306. }
  1307. }
  1308. }
  1309. $mapqcStage['rule_code'] = array('in', $qcTypeList);
  1310. $mapqcStage['qc_behavior'] = array('eq', 'common');
  1311. $mapqcStage['qc_stage'] = array('eq', 'PostEvent');
  1312. $mapqcStage['is_enabled'] = array('eq', 1);
  1313. //质控阶段与病例类型筛选后的规则
  1314. $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
  1315. dump($qcruleStage);
  1316. exit;
  1317. //规则适配的病例类型
  1318. // $qcTypeList = $qcruleStage[0]["qc_type_list"];
  1319. // $qcTypeList = json_decode($qcTypeList);
  1320. // $qcTypeList = stdClassObjToArray($qcTypeList);
  1321. $dataRag['medicalContent'] = $dataFinal;
  1322. $dataRag['kid'] = 'Rule_Final';
  1323. for($j=0;$j<count($qcruleStage);$j++){
  1324. $ruleCode = $qcruleStage[$j]['rule_code'];
  1325. $dataRag['ruleCode'] = $ruleCode;
  1326. $urlRAG = 'http://192.168.10.115:3338/apis/ragDataMCQC';
  1327. $ragResult = curlPost($urlRAG,$dataRag);
  1328. $ragResult = json_decode($ragResult);
  1329. $ragResult = stdClassObjToArray($ragResult);
  1330. //医师签名
  1331. $signers = $recs[2];
  1332. $signerNames = array();
  1333. foreach ($signers as $signer) {
  1334. if (isset($signer['SIGNER'])) {
  1335. $signerNames[] = $signer['SIGNER'];
  1336. }
  1337. }
  1338. $signerIndex = 0;
  1339. //将签名组装到病历里。
  1340. $newMultipleCases = preg_replace_callback(
  1341. '/(签名:)(\s*)/',
  1342. function($matches) use (&$signerIndex, $signerNames) {
  1343. // 如果超过数组长度,使用最后一个签名者
  1344. $name = ($signerIndex < count($signerNames))
  1345. ? $signerNames[$signerIndex]
  1346. : end($signerNames);
  1347. $signerIndex++;
  1348. return $matches[1] . $name . $matches[2];
  1349. },
  1350. $dataFinal
  1351. );
  1352. // dump($dataFinal);
  1353. // dump($newMultipleCases);
  1354. // exit;
  1355. // $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docNamepath.",病历原文为:\n".$newMultipleCases."\n***请按照这个规则: ".$qcruleStage[$j]['ruletype'].$qcruleStage[$j]['ruledetail']."(" .$qcruleStage[$j]['ruleread'].") 为我判断当前病历原文是否正确,是否符合规则,严格按照质控规则进行质控,禁止增添质控规则外的内容。***如果正确,请返回:'【规则名称】: ".$qcruleStage[$j]['ruletype'].$qcruleStage[$j]['ruledetail']."\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】: ".$qcruleStage[$j]['ruletype'].$qcruleStage[$j]['ruledetail']."\n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
  1356. if(count($ragResult["data"]) != 0){
  1357. //正确示例
  1358. $PoExample = "";
  1359. //错误示例
  1360. $ErExample = "";
  1361. for($Example = 0 ;$Example<count($ragResult["data"]);$Example++){
  1362. if($ragResult["data"][$Example]["type"] == "positive"){
  1363. $PoExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
  1364. }
  1365. else{
  1366. $ErExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
  1367. }
  1368. }
  1369. // dump($PoExample);
  1370. // dump($ErExample);
  1371. $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
  1372. 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
  1373. 请严格基于【病历原文】判断是否违反该规则。
  1374. ***【质控规则】***
  1375. 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
  1376. 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
  1377. 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
  1378. ***【参考内容】***
  1379. 正例(符合要求的写法):\n
  1380. ".$PoExample."\n
  1381. 反例(不符合要求的写法):\n
  1382. ".$ErExample."\n
  1383. ===【病历原文】===
  1384. 以下为".$docName."部分:
  1385. \n".$newMultipleCases."\n
  1386. ===【输出要求】===
  1387. 请严格以下列格式输出,不得输出解释性文字或额外内容。
  1388. 如果病历完全符合规则,请输出以下格式的内容:
  1389. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1390. 【质控结果】:病例校验通过。
  1391. 如果存在不符合规则,请输出以下格式的内容:
  1392. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1393. 【质控结果】:病例校验不通过\n
  1394. 【不通过原因】:(简要概述不通过的原因)
  1395. 【规则关键字】:违规位置及所属内容(必须只有一个关键字,如 ‘主诉’)',
  1396. ===【注意事项】===
  1397. - 严禁输出 Markdown 代码块(如 ```json)
  1398. - 严禁输出解释性文字、分析过程或无关说明
  1399. - 不得引用或复述【参考内容】中的文字
  1400. - 若规则不适用于当前病历内容,应视为通过
  1401. - 所有结论必须严格基于【病历原文】内容
  1402. -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
  1403. ";
  1404. }
  1405. else{
  1406. $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
  1407. 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
  1408. 请严格基于【病历原文】判断是否违反该规则。
  1409. ***【质控规则】***
  1410. 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
  1411. 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
  1412. 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
  1413. ===【病历原文】===
  1414. 以下为".$docName."部分:
  1415. \n".$newMultipleCases."\n
  1416. ===【输出要求】===
  1417. 请严格以下列格式输出,不得输出解释性文字或额外内容。
  1418. 如果病历完全符合规则,请输出以下格式的内容:
  1419. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1420. 【质控结果】:病例校验通过。
  1421. 如果存在不符合规则,请输出以下格式的内容:
  1422. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1423. 【质控结果】:病例校验不通过\n
  1424. 【不通过原因】:(简要概述不通过的原因)\n
  1425. 【规则关键字】:违规位置及内容(必须只有一个关键字,如 ‘主诉’)'
  1426. ===【注意事项】===
  1427. - 严禁输出 Markdown 代码块(如 ```json)
  1428. - 严禁输出解释性文字、分析过程或无关说明
  1429. - 若规则不适用于当前病历内容,应视为通过
  1430. - 所有结论必须严格基于【病历原文】内容
  1431. -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
  1432. ";
  1433. }
  1434. // dump($dataFinalcount);
  1435. // exit;
  1436. //请求websocket客户端发送数据
  1437. $recContentFinal = [
  1438. [
  1439. 'role' => 'user',
  1440. 'content' => $dataFinalcount
  1441. ],
  1442. ];
  1443. // dump($dataFinalcount);
  1444. //组装请求的数据为base64格式
  1445. $data = [];
  1446. $data['model'] = 'gstcm-G1-14B';
  1447. $data['network'] = '2';
  1448. $data['input'] = $recContentFinal;
  1449. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1450. $data = base64_encode($data);
  1451. //对请求的参数进行sm4加密
  1452. $smIV = getSMIV();
  1453. $config = [
  1454. 'mode' => 'cbc',
  1455. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1456. 'iv' => $smIV, // 16 字节二进制 IV
  1457. 'hash' => false
  1458. ];
  1459. $sm4 = new EvitSM4Encryption($config);
  1460. $encryptedBinary = $sm4->encrypt($data);
  1461. // 将二进制结果转换为 Base64
  1462. $encryptedBase64 = base64_encode($encryptedBinary);
  1463. //创建最终的含有sm4的iv的数据
  1464. $modifiedData = [];
  1465. $modifiedData['encryptedBase64'] = $encryptedBase64;
  1466. $modifiedData['smIV'] = $smIV;
  1467. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1468. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1469. $modifiedData = base64_encode($modifiedData);
  1470. // 将 '+' 替换为 '-','/' 替换为 '_'
  1471. $modifiedData = strtr($modifiedData, '+/', '-_');
  1472. //将加密的参数发送给开放平台,获取短令牌
  1473. $urlOpen = commonOpenURL().'/Apis/getToken';
  1474. $encryption['information'] = $modifiedData;
  1475. $token = curlPost($urlOpen,$encryption);
  1476. $token = stdClassObjToArray(json_decode($token));
  1477. // dump($recContentFinal);
  1478. // exit;
  1479. //推送消息至websocket
  1480. $dataRequest['user'] = $user;
  1481. $dataRequest['name'] = $name;
  1482. $dataRequest['rule'] = $qcruleStage[$j]['rule_content'];
  1483. $dataRequest['doc'] = $docName;
  1484. $dataRequest['token'] = $token['token'];
  1485. $dataRequest['ruleid'] = $qcruleStage[$j]['rule_code'];
  1486. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1487. $tokenrole['token'] = $token['token'];
  1488. $tokenrole['ruleid'] = $qcruleStage[$j]['rule_code'];
  1489. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1490. $tokenrole['content'] = $dataFinal;
  1491. $tokenrole['ruletype'] = $qcruleStage[$j]['category'];
  1492. $tokenrole['ruledetail'] = $qcruleStage[$j]['rule_content'];
  1493. // dump($tokenrole);
  1494. // exit;
  1495. $tokenrole['time'] = time();
  1496. db('tokenrole') -> insert($tokenrole);
  1497. // dump($tokenrole);
  1498. // exit;
  1499. $url = commonURL().'/Send/websocket';
  1500. curlPost($url,$dataRequest);
  1501. }
  1502. }
  1503. // // exit;
  1504. //多病例融合
  1505. // $docNamepath="";
  1506. // for($g = 0; $g < count($multirule); $g++){
  1507. // if($g>=1){
  1508. // $docNamepath .= "、";
  1509. // }
  1510. // $docNamepath.=$multirule[$g]["medicalreport"];
  1511. // }
  1512. // $multipleCases="";
  1513. // for($q = 0; $q < count($multirule); $q++){
  1514. // for($g = 0; $g < count($docsArray); $g++){
  1515. // if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  1516. // $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  1517. // $urlMrId = commonDataURL().'/His/getMedicalRec';
  1518. // $recs = curlPost($urlMrId,$dataMrId);
  1519. // $recs = json_decode($recs);
  1520. // $recs = stdClassObjToArray($recs);
  1521. // $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  1522. // }
  1523. // }
  1524. // }
  1525. }
  1526. // sleep(1);
  1527. return 'success';
  1528. }
  1529. //定时更新当前状态。
  1530. public function onlineUpdate(){
  1531. $user = request() -> param('user');
  1532. $messageQueuelength = request() -> param('messageQueuelength');
  1533. $strate = request() -> param('strate');
  1534. // $user = 6666;
  1535. $mapUser['user'] = array('eq',$user);
  1536. $userData = db('client') -> where($mapUser) -> select();
  1537. if($userData == null){
  1538. $updateData["user"] = $user;
  1539. $updateData["updatetime"] = time();
  1540. $updateData["strate"] = 1;
  1541. $updateData["messageQueue"] =$messageQueuelength;
  1542. $data = db('client') -> insert($updateData);
  1543. return $data;
  1544. }
  1545. else{
  1546. $updateData["updatetime"] = time();
  1547. $updateData["strate"] = $strate;
  1548. $updateData["messageQueue"] =$messageQueuelength;
  1549. $data = db('client') -> where($mapUser) -> update($updateData);
  1550. return $data;
  1551. }
  1552. }
  1553. public function test(){
  1554. // $docsCode = "cf76da1345a1602c40e4583430363169";
  1555. // $mapToken['token'] = array('eq',$docsCode);
  1556. // $docsJson = db('token') -> where($mapToken) -> value('info');
  1557. // $docsArray = json_decode($docsJson);
  1558. // $docsArray = stdClassObjToArray($docsArray);
  1559. // // $searchTerm[0] = "首次病程记录";
  1560. // $searchTerm = "入院记录";
  1561. // $maprule['rulepath'] = array('like', '%'.$searchTerm.'%');
  1562. // $ruleIdArray = array('RYJLXBS0014');
  1563. // $maprule['ruleid'] = array('in', $ruleIdArray);
  1564. // $rulename = db('rulefinal')->where($maprule)->select();
  1565. // $rulepath = json_decode($rulename[0]["rulepath"]);
  1566. // $rulepath = stdClassObjToArray($rulepath);
  1567. // dump($rulepath[0]);
  1568. // // exit;
  1569. // for($j = 0; $j < count($rulepath[0]); $j++){
  1570. // for($i = 0; $i < count($docsArray); $i++){
  1571. // // dump($docsArray[$i]['TYPE_NAME']);
  1572. // if(strpos($docsArray[$i]['TYPE_NAME'], $rulepath[0][$j]) !== false){
  1573. // // return ($docsArray[$i]['TYPE_NAME']);
  1574. // $dataMrId['mrId'] = $docsArray[$i]['MR_ID'];
  1575. // $urlMrId = commonDataURL().'/His/getMedicalRec';
  1576. // $recs = curlPost($urlMrId,$dataMrId);
  1577. // $recs = json_decode($recs);
  1578. // $recs = stdClassObjToArray($recs);
  1579. // dump($recs);
  1580. // }
  1581. // }
  1582. // }
  1583. $docsJson = db('rulefinal') -> select();
  1584. for($i = 0; $i < count($docsJson); $i++){
  1585. $data["ruleid"] = $docsJson[$i]["ruleid"];
  1586. $data["medicalreport"] = $docsJson[$i]["rulepath"];
  1587. db('multirule') -> insert($data);
  1588. }
  1589. dump($data);
  1590. }
  1591. private function getValueByLike($input, $mapping = null) {
  1592. $mapping = $mapping ?: $this->mapping;
  1593. foreach ($mapping as $key => $value) {
  1594. if (strpos($input, $key) !== false) {
  1595. return $value;
  1596. }
  1597. }
  1598. return null;
  1599. }
  1600. }