His_old.php 135 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368
  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. db('token') -> insert($tokenData);
  385. $mapToken['token'] = array('eq',$docsCode);
  386. $docsJson = db('token') -> where($mapToken) -> value('info');
  387. //跳转chatbox
  388. if($ragId != null){
  389. $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode.'&ragId='.$ragId;
  390. }
  391. else{
  392. $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode;
  393. }
  394. $this -> redirect($url);
  395. }
  396. //接受hisOpen发送过来的病历列表并推送
  397. public function hisOpenPush(){
  398. // $user = 6666;
  399. $user = request() -> param('user');
  400. $docsCode = request() -> param('docsCode');
  401. // $docsCode = "2fa0e00ffd00d6e92b04a24bbd6dac1d";
  402. $mapToken['token'] = array('eq',$docsCode);
  403. $docsJson = db('token') -> where($mapToken) -> value('info');
  404. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  405. $dataIntel = json_decode($dataIntel);
  406. $dataIntel = stdClassObjToArray($dataIntel);
  407. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  408. $tokenrole['out_num'] = $dataIntel['out_num'];
  409. $tokenrole['in_num'] = $dataIntel['in_num'];
  410. $tokenrole['id_num'] = $dataIntel['id_num'];
  411. // return $docsJson;
  412. if(!$docsJson){
  413. return json('客户端短令牌错误!');
  414. }
  415. $docsArray = json_decode($docsJson);
  416. $docsArray = stdClassObjToArray($docsArray);
  417. // dump($docsJson);
  418. // exit;
  419. //通过病历列表获取病历原文
  420. for($i = 0; $i < count($docsArray); $i++){
  421. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  422. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  423. //请求病历原文
  424. $mrId = $docsArray[$i]["MR_ID"];
  425. $dataMrId['mrId'] = $mrId;
  426. $urlMrId = commonDataURL().'/His/getRec';
  427. $recs = curlPost($urlMrId,$dataMrId);
  428. $recs = json_decode($recs);
  429. $recs = stdClassObjToArray($recs);
  430. $keshi = $recs[count($recs)-1]['mr_text'];
  431. $tokenrole['DEPT_NAME'] = $keshi;
  432. $dataFinal = '';
  433. for($r=0;$r<count($recs);$r++){
  434. $dataFinal = $dataFinal.$recs[$r]["mr_title"].":".$recs[$r]["mr_text"]."brbr";
  435. }
  436. $recs[count($recs)]['mr_title'] = '标题';
  437. $recs[count($recs)-1]['mr_text'] = $docName;
  438. // $dataFinal = json_encode($recs,JSON_UNESCAPED_UNICODE);
  439. $map['emr'] = array('eq', $docName);
  440. $rulename = db('rulecounter')->where($map)->value('rulepath');
  441. if($rulename != null){
  442. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  443. // $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');
  444. $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');
  445. $maprule['ruleid'] = array('in', $ruleIdArray);
  446. $rulename = db('rulefinal')->where($maprule)->select();
  447. //dump(count($rulename));
  448. //exit;
  449. // //查询某一列数据
  450. // $rule = db('User')->column('name');
  451. for($j=0;$j<count($rulename);$j++){
  452. if($rulename[$j]['ruledetail'] == '暂无'){
  453. $rulename[$j]['ruledetail'] = '';
  454. }
  455. // $dataFinalcount = "你是一名专业的医疗病历质控员,请根据以下内容进行病历质控审查。\n";
  456. // $dataFinalcount .= "当前病历名称如下:\n{$docName}\n\n";
  457. // $dataFinalcount .= "当前病历原文如下:\n{$dataFinal}\n\n";
  458. // $dataFinalcount .= "质控规则如下:\n".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n\n";
  459. // $dataFinalcount .= "请按照上述规则,判断当前病历是否符合质控要求。\n\n";
  460. // $dataFinalcount .= "如果病历完全符合所有规则,请严格输出以下内容:\n";
  461. // $dataFinalcount .= "
  462. // 【规则名称】质控的哪条规则
  463. // 【质控结果】病例校验通过。'\n\n";
  464. // $dataFinalcount .= "如果存在不符合规则的情况,请按以下格式逐条输出违规项,\n";
  465. // $dataFinalcount .= "不符合规则的列举格式如下,严格模仿以下结构输出:\n";
  466. // $dataFinalcount .= "【规则名称】列出违反了哪条规则\n\n";
  467. // $dataFinalcount .= "【质控结果】简要描述为什么违反了此条规则\n\n";
  468. // $dataFinalcount .= "\n\n注意事项:\n";
  469. // $dataFinalcount .= "1. 若有违规,按格式逐条列出,必须包含【规则名称】【质控结果】两个字段,最多只能输出一次。\n";
  470. // $dataFinalcount .= "2. 每个字段独占一行,使用【】标注字段名,后接内容,不加冒号或其他符号。\n";
  471. // $dataFinalcount .= "3. 禁止添加解释、总结、问候语或额外说明。\n";
  472. $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【质控原文】:(规则质控的具体原文的标题【‘:’前的文字。】,例如(主诉),严格输出原文的标题,不要输出其他内容,不能有任何偏差,)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释。";
  473. // exit;
  474. // dump($dataFinalcount.'-----------------------------------------------------');
  475. // exit;
  476. // $dataFinalcount = '我需要你扮演一位专业医疗病历质控员,现在要进行病历质控。下面是一份'.$docName.'病历,当前病历原文为:\n'.$dataFinal.'n请按照这个规则:\"'.$rule[$j]["ruletype"].$rule[$j]["ruledetail"].'\",为我判断当前病历原文是否正确。如果正确,请返回:\"病例校验结果:病例校验通过。\",详细分析质控过程并说明原因;如果不正确,请返回:\"病例校验结果:'.$rule[$j]['ruletype'].".".$rule[$j]['ruledetail'].'\",详细分析质控过程并说明原因。仅把返回结果放在</answer>和<answer>之间。"';
  477. //请求websocket客户端发送数据
  478. $recContentFinal = [
  479. [
  480. 'role' => 'user',
  481. 'content' => $dataFinalcount
  482. ],
  483. ];
  484. //组装请求的数据为base64格式
  485. $data = [];
  486. $data['model'] = 'gstcm-G1-14B';
  487. $data['network'] = '2';
  488. $data['input'] = $recContentFinal;
  489. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  490. $data = base64_encode($data);
  491. //对请求的参数进行sm4加密
  492. $smIV = getSMIV();
  493. $config = [
  494. 'mode' => 'cbc',
  495. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  496. 'iv' => $smIV, // 16 字节二进制 IV
  497. 'hash' => false
  498. ];
  499. $sm4 = new EvitSM4Encryption($config);
  500. $encryptedBinary = $sm4->encrypt($data);
  501. // 将二进制结果转换为 Base64
  502. $encryptedBase64 = base64_encode($encryptedBinary);
  503. //创建最终的含有sm4的iv的数据
  504. $modifiedData = [];
  505. $modifiedData['encryptedBase64'] = $encryptedBase64;
  506. $modifiedData['smIV'] = $smIV;
  507. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  508. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  509. $modifiedData = base64_encode($modifiedData);
  510. // 将 '+' 替换为 '-','/' 替换为 '_'
  511. $modifiedData = strtr($modifiedData, '+/', '-_');
  512. //将加密的参数发送给开放平台,获取短令牌
  513. $urlOpen = commonOpenURL().'/Apis/getToken';
  514. $encryption['information'] = $modifiedData;
  515. $token = curlPost($urlOpen,$encryption);
  516. $token = stdClassObjToArray(json_decode($token));
  517. //推送消息至websocket
  518. $dataRequest['user'] = $user;
  519. $num = $i + 1;
  520. $dataRequest['name'] = $name;
  521. $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
  522. $dataRequest['doc'] = $docName;
  523. $dataRequest['token'] = $token['token'];
  524. $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
  525. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  526. $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
  527. $tokenrole['token'] = $token['token'];
  528. $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
  529. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  530. $tokenrole['content'] = $dataFinal;
  531. $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
  532. $tokenrole['keywords'] = $rulename[$j]['keywords'];
  533. if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
  534. $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
  535. }
  536. $tokenrole['time'] = time();
  537. db('tokenrole') -> insert($tokenrole);
  538. // dump($tokenrole);
  539. // exit;
  540. $url = commonURL().'/Send/websocket';
  541. curlPost($url,$dataRequest);
  542. }
  543. }
  544. sleep(1);
  545. }
  546. return 'success';
  547. }
  548. //全文质控
  549. public function hisOpenPushMedical1(){
  550. $user = request() -> param('user');
  551. $docsCode = request() -> param('docsCode');
  552. // $docsCode = "6a7a5edec3027e1990912c7cf98350b0";
  553. $ragId = request() -> param('ragId');
  554. $mapclient['user'] = array('eq',$user);
  555. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  556. $strate = db('client') -> where($mapclient) -> value('strate');
  557. if($messageQueue != 0){
  558. return;
  559. }
  560. if($messageQueue != 0 && $strate == 0){
  561. return;
  562. }
  563. $ragId ="1970054015201382402";
  564. // $ragId ="1970054015201382rqqww402";
  565. $mapToken['token'] = array('eq',$docsCode);
  566. $docsJson = db('token') -> where($mapToken) -> value('info');
  567. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  568. $dataIntel = json_decode($dataIntel);
  569. $dataIntel = stdClassObjToArray($dataIntel);
  570. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  571. $tokenrole['out_num'] = $dataIntel['out_num'];
  572. $tokenrole['in_num'] = $dataIntel['in_num'];
  573. $tokenrole['id_num'] = $dataIntel['id_num'];
  574. // return $docsJson;
  575. if(!$docsJson){
  576. return json('客户端短令牌错误!');
  577. }
  578. $docsArray = json_decode($docsJson);
  579. $docsArray = stdClassObjToArray($docsArray);
  580. // dump($docsJson);
  581. // exit;
  582. //通过病历列表获取病历原文
  583. for($i = 0; $i < count($docsArray); $i++){
  584. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  585. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  586. //请求病历原文
  587. $mrId = $docsArray[$i]["MR_ID"];
  588. $dataMrId['mrId'] = $mrId;
  589. $urlMrId = commonDataURL().'/His/getMedicalRec';
  590. $recs = curlPost($urlMrId,$dataMrId);
  591. $recs = json_decode($recs);
  592. $recs = stdClassObjToArray($recs);
  593. $keshi = $recs[count($recs)-1]['mr_text'];
  594. $tokenrole['DEPT_NAME'] = $keshi;
  595. $dataFinal = $recs[0];
  596. $recs[count($recs)]['mr_title'] = '标题';
  597. $recs[count($recs)-1]['mr_text'] = $docName;
  598. if($ragId!=null){
  599. $dataRag['input'] = $docName;
  600. $dataRag['kid'] = $ragId;
  601. // dump($docName);
  602. $urlRAG = 'http://192.168.10.115:3338/apis/ragData';
  603. $ragResult = curlPost($urlRAG,$dataRag);
  604. $ragResult = json_decode($ragResult);
  605. $ragResult = stdClassObjToArray($ragResult);
  606. if(array_key_exists('code', $ragResult)){
  607. }
  608. else{
  609. if($ragResult["nearest"]!=null){
  610. // dump($ragResult);
  611. $rulesArray = preg_split('/\s*(?=规则编号:)/', $ragResult["nearest"][0]["text"], -1, PREG_SPLIT_NO_EMPTY);
  612. // dump($rulesArray);
  613. // exit;
  614. // 去除每个规则文本前后的空白字符
  615. $rulesArray = array_map('trim', $rulesArray);
  616. for($j=1;$j<count($rulesArray);$j++){
  617. preg_match('/规则编号:(.*?)\s*规则详情:\s*(.*?)\s*规则描述:\s*(.*?)\s*扣分标准:\s*([\d.]+)/s', $rulesArray[$j], $matches);
  618. // 存储到数组中
  619. $ruleData = [
  620. 'ruleid' => isset($matches[1]) ? trim($matches[1]) : '',
  621. 'ruletype' => isset($matches[2]) ? trim($matches[2]) : '',
  622. 'ruledetail' => isset($matches[3]) ? trim($matches[3]) : '',
  623. 'rulescore' => isset($matches[4]) ? floatval(trim($matches[4])) : 0.0
  624. ];
  625. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$dataFinal."\n请按照这个规则: ".$rulesArray[$j].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: (对应的规则详情,不是规则编号)\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】:(对应的规则名称或者规则详情) \n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容。";
  626. // dump($dataFinalcount);
  627. // exit;
  628. //请求websocket客户端发送数据
  629. $recContentFinal = [
  630. [
  631. 'role' => 'user',
  632. 'content' => $dataFinalcount
  633. ],
  634. ];
  635. //组装请求的数据为base64格式
  636. $data = [];
  637. $data['model'] = 'gstcm-G1-14B';
  638. $data['network'] = '2';
  639. $data['input'] = $recContentFinal;
  640. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  641. $data = base64_encode($data);
  642. //对请求的参数进行sm4加密
  643. $smIV = getSMIV();
  644. $config = [
  645. 'mode' => 'cbc',
  646. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  647. 'iv' => $smIV, // 16 字节二进制 IV
  648. 'hash' => false
  649. ];
  650. $sm4 = new EvitSM4Encryption($config);
  651. $encryptedBinary = $sm4->encrypt($data);
  652. // 将二进制结果转换为 Base64
  653. $encryptedBase64 = base64_encode($encryptedBinary);
  654. //创建最终的含有sm4的iv的数据
  655. $modifiedData = [];
  656. $modifiedData['encryptedBase64'] = $encryptedBase64;
  657. $modifiedData['smIV'] = $smIV;
  658. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  659. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  660. $modifiedData = base64_encode($modifiedData);
  661. // 将 '+' 替换为 '-','/' 替换为 '_'
  662. $modifiedData = strtr($modifiedData, '+/', '-_');
  663. //将加密的参数发送给开放平台,获取短令牌
  664. $urlOpen = commonOpenURL().'/Apis/getToken';
  665. $encryption['information'] = $modifiedData;
  666. $token = curlPost($urlOpen,$encryption);
  667. $token = stdClassObjToArray(json_decode($token));
  668. //推送消息至websocket
  669. $dataRequest['user'] = $user;
  670. $num = $i + 1;
  671. $dataRequest['name'] = $name;
  672. $dataRequest['rule'] = $ruleData['ruletype'].$ruleData['ruledetail'];
  673. $dataRequest['doc'] = $docName;
  674. $dataRequest['token'] = $token['token'];
  675. $dataRequest['ruleid'] = $ruleData['ruleid'];
  676. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  677. $tokenrole['rulescore'] = $ruleData['rulescore'];//规则扣分
  678. $tokenrole['token'] = $token['token'];
  679. $tokenrole['ruleid'] = $ruleData['ruleid']; //规则ID
  680. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  681. $tokenrole['content'] = $dataFinal;
  682. $tokenrole['ruletype'] = $ruleData['ruletype'];//规则类型
  683. $tokenrole['keywords'] = "";
  684. $tokenrole['ruledetail'] = ''.$ruleData['ruledetail'];//规则详情
  685. $tokenrole['time'] = time();
  686. db('tokenrole') -> insert($tokenrole);
  687. $url = commonURL().'/Send/websocket';
  688. curlPost($url,$dataRequest);
  689. }
  690. }
  691. }
  692. }
  693. $mapName['emr'] = array('eq', $docName);
  694. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  695. if($rulename != null){
  696. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  697. $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');
  698. $maprule['ruleid'] = array('in', $ruleIdArray);
  699. $rulename = db('rulefinal')->where($maprule)->select();
  700. $rulename = stdClassObjToArray($rulename);
  701. for($j=0;$j<count($rulename);$j++){
  702. if($rulename[$j]['ruledetail'] == '暂无'){
  703. $rulename[$j]['ruledetail'] = '';
  704. }
  705. $ruleId = $rulename[$j]['ruleid'];
  706. $mapmultirule['ruleid'] = array('eq', $ruleId);
  707. //$mapmultirule['ruleid'] = array('eq', "RYJLXBS0014");
  708. $multirule = db('multirule')->where($mapmultirule)->select();
  709. $multirule = stdClassObjToArray($multirule);
  710. $docNamepath="";
  711. for($g = 0; $g < count($multirule); $g++){
  712. $docNamepath.=$multirule[$g]["medicalreport"]."、";
  713. }
  714. $multipleCases="";
  715. for($q = 0; $q < count($multirule); $q++){
  716. for($g = 0; $g < count($docsArray); $g++){
  717. if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  718. $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  719. $urlMrId = commonDataURL().'/His/getMedicalRec';
  720. $recs = curlPost($urlMrId,$dataMrId);
  721. $recs = json_decode($recs);
  722. $recs = stdClassObjToArray($recs);
  723. $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  724. }
  725. }
  726. }
  727. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是".$docNamepath."这几份病历,病历原文为:\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【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释。";
  728. //请求websocket客户端发送数据
  729. $recContentFinal = [
  730. [
  731. 'role' => 'user',
  732. 'content' => $dataFinalcount
  733. ],
  734. ];
  735. //组装请求的数据为base64格式
  736. $data = [];
  737. $data['model'] = 'gstcm-G1-14B';
  738. $data['network'] = '2';
  739. $data['input'] = $recContentFinal;
  740. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  741. $data = base64_encode($data);
  742. //对请求的参数进行sm4加密
  743. $smIV = getSMIV();
  744. $config = [
  745. 'mode' => 'cbc',
  746. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  747. 'iv' => $smIV, // 16 字节二进制 IV
  748. 'hash' => false
  749. ];
  750. $sm4 = new EvitSM4Encryption($config);
  751. $encryptedBinary = $sm4->encrypt($data);
  752. // 将二进制结果转换为 Base64
  753. $encryptedBase64 = base64_encode($encryptedBinary);
  754. //创建最终的含有sm4的iv的数据
  755. $modifiedData = [];
  756. $modifiedData['encryptedBase64'] = $encryptedBase64;
  757. $modifiedData['smIV'] = $smIV;
  758. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  759. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  760. $modifiedData = base64_encode($modifiedData);
  761. // 将 '+' 替换为 '-','/' 替换为 '_'
  762. $modifiedData = strtr($modifiedData, '+/', '-_');
  763. //将加密的参数发送给开放平台,获取短令牌
  764. $urlOpen = commonOpenURL().'/Apis/getToken';
  765. $encryption['information'] = $modifiedData;
  766. $token = curlPost($urlOpen,$encryption);
  767. $token = stdClassObjToArray(json_decode($token));
  768. //推送消息至websocket
  769. $dataRequest['user'] = $user;
  770. $dataRequest['name'] = $name;
  771. $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
  772. $dataRequest['doc'] = $docName;
  773. $dataRequest['token'] = $token['token'];
  774. $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
  775. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  776. $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
  777. $tokenrole['token'] = $token['token'];
  778. $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
  779. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  780. $tokenrole['content'] = $dataFinal;
  781. $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
  782. $tokenrole['keywords'] = $rulename[$j]['keywords'];
  783. if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
  784. $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
  785. }
  786. $tokenrole['time'] = time();
  787. db('tokenrole') -> insert($tokenrole);
  788. // // dump($tokenrole);
  789. // // exit;
  790. $url = commonURL().'/Send/websocket';
  791. curlPost($url,$dataRequest);
  792. }
  793. }
  794. sleep(1);
  795. }
  796. return 'success';
  797. }
  798. //测试样例
  799. public function hisOpenPushMedical(){
  800. $user = request() -> param('user');
  801. $docsCode = request() -> param('docsCode');
  802. $ragId = request() -> param('ragId');
  803. $mapclient['user'] = array('eq',$user);
  804. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  805. $strate = db('client') -> where($mapclient) -> value('strate');
  806. if($messageQueue != 0){
  807. return;
  808. }
  809. if($messageQueue != 0 && $strate == 0){
  810. return;
  811. }
  812. $ragId ="1970054015201382402";
  813. // $ragId ="1970054015201382rqqww402";
  814. $mapToken['token'] = array('eq',$docsCode);
  815. $docsJson = db('token') -> where($mapToken) -> value('info');
  816. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  817. $dataIntel = json_decode($dataIntel);
  818. $dataIntel = stdClassObjToArray($dataIntel);
  819. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  820. $tokenrole['out_num'] = $dataIntel['out_num'];
  821. $tokenrole['in_num'] = $dataIntel['in_num'];
  822. $tokenrole['id_num'] = $dataIntel['id_num'];
  823. // return $docsJson;
  824. if(!$docsJson){
  825. return json('客户端短令牌错误!');
  826. }
  827. $docsArray = json_decode($docsJson);
  828. $docsArray = stdClassObjToArray($docsArray);
  829. // dump($docsJson);
  830. // exit;
  831. //通过病历列表获取病历原文
  832. for($i = 0; $i < count($docsArray); $i++){
  833. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  834. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  835. //请求病历原文
  836. $mrId = $docsArray[$i]["MR_ID"];
  837. $dataMrId['mrId'] = $mrId;
  838. $urlMrId = commonDataURL().'/His/getMedicalRec';
  839. $recs = curlPost($urlMrId,$dataMrId);
  840. $recs = json_decode($recs);
  841. $recs = stdClassObjToArray($recs);
  842. // dump($recs);
  843. // exit;
  844. $keshi = $recs[1]['mr_text'];
  845. $tokenrole['DEPT_NAME'] = $keshi;
  846. $dataFinal = $recs[0];
  847. $recs[1]['mr_title'] = '标题';
  848. $recs[1]['mr_text'] = $docName;
  849. if($ragId!=null){
  850. $dataRag['input'] = $docName;
  851. $dataRag['kid'] = $ragId;
  852. // dump($docName);
  853. $urlRAG = 'http://192.168.10.115:3338/apis/ragData';
  854. $ragResult = curlPost($urlRAG,$dataRag);
  855. $ragResult = json_decode($ragResult);
  856. $ragResult = stdClassObjToArray($ragResult);
  857. if(array_key_exists('code', $ragResult)){
  858. }
  859. else{
  860. if($ragResult["nearest"]!=null){
  861. // dump($ragResult);
  862. $rulesArray = preg_split('/\s*(?=规则编号:)/', $ragResult["nearest"][0]["text"], -1, PREG_SPLIT_NO_EMPTY);
  863. // dump($rulesArray);
  864. // exit;
  865. // 去除每个规则文本前后的空白字符
  866. $rulesArray = array_map('trim', $rulesArray);
  867. for($j=1;$j<count($rulesArray);$j++){
  868. preg_match('/规则编号:(.*?)\s*规则详情:\s*(.*?)\s*规则描述:\s*(.*?)\s*扣分标准:\s*([\d.]+)/s', $rulesArray[$j], $matches);
  869. // 存储到数组中
  870. $ruleData = [
  871. 'ruleid' => isset($matches[1]) ? trim($matches[1]) : '',
  872. 'ruletype' => isset($matches[2]) ? trim($matches[2]) : '',
  873. 'ruledetail' => isset($matches[3]) ? trim($matches[3]) : '',
  874. 'rulescore' => isset($matches[4]) ? floatval(trim($matches[4])) : 0.0
  875. ];
  876. $signers = $recs[2];
  877. $signerNames = array();
  878. foreach ($signers as $signer) {
  879. if (isset($signer['SIGNER'])) {
  880. $signerNames[] = $signer['SIGNER'];
  881. }
  882. }
  883. $signerIndex = 0;
  884. $newDataFinal = preg_replace_callback(
  885. '/(签名:)(\s*)/',
  886. function($matches) use (&$signerIndex, $signerNames) {
  887. // 如果超过数组长度,使用最后一个签名者
  888. $name = ($signerIndex < count($signerNames))
  889. ? $signerNames[$signerIndex]
  890. : end($signerNames);
  891. $signerIndex++;
  892. return $matches[1] . $name . $matches[2];
  893. },
  894. $dataFinal
  895. );
  896. // $newDataFinal = preg_replace('/(签名:)(\s*)/', "签名:".$recs[2][0]["SIGNER"], $dataFinal);
  897. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$newDataFinal."\n请按照这个规则: ".$rulesArray[$j].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: (对应的规则详情,不是规则编号)\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】:(对应的规则名称或者规则详情) \n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容,当质控签名时,只要有任何一个签名,就判断质控结果为通过。";
  898. // dump($dataFinalcount);
  899. // exit;
  900. //请求websocket客户端发送数据
  901. $recContentFinal = [
  902. [
  903. 'role' => 'user',
  904. 'content' => $dataFinalcount
  905. ],
  906. ];
  907. //组装请求的数据为base64格式
  908. $data = [];
  909. $data['model'] = 'gstcm-G1-14B';
  910. $data['network'] = '2';
  911. $data['input'] = $recContentFinal;
  912. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  913. $data = base64_encode($data);
  914. //对请求的参数进行sm4加密
  915. $smIV = getSMIV();
  916. $config = [
  917. 'mode' => 'cbc',
  918. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  919. 'iv' => $smIV, // 16 字节二进制 IV
  920. 'hash' => false
  921. ];
  922. $sm4 = new EvitSM4Encryption($config);
  923. $encryptedBinary = $sm4->encrypt($data);
  924. // 将二进制结果转换为 Base64
  925. $encryptedBase64 = base64_encode($encryptedBinary);
  926. //创建最终的含有sm4的iv的数据
  927. $modifiedData = [];
  928. $modifiedData['encryptedBase64'] = $encryptedBase64;
  929. $modifiedData['smIV'] = $smIV;
  930. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  931. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  932. $modifiedData = base64_encode($modifiedData);
  933. // 将 '+' 替换为 '-','/' 替换为 '_'
  934. $modifiedData = strtr($modifiedData, '+/', '-_');
  935. //将加密的参数发送给开放平台,获取短令牌
  936. $urlOpen = commonOpenURL().'/Apis/getToken';
  937. $encryption['information'] = $modifiedData;
  938. $token = curlPost($urlOpen,$encryption);
  939. $token = stdClassObjToArray(json_decode($token));
  940. //推送消息至websocket
  941. $dataRequest['user'] = $user;
  942. $num = $i + 1;
  943. $dataRequest['name'] = $name;
  944. $dataRequest['rule'] = $ruleData['ruletype'].$ruleData['ruledetail'];
  945. $dataRequest['doc'] = $docName;
  946. $dataRequest['token'] = $token['token'];
  947. $dataRequest['ruleid'] = $ruleData['ruleid'];
  948. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  949. $tokenrole['rulescore'] = $ruleData['rulescore'];//规则扣分
  950. $tokenrole['token'] = $token['token'];
  951. $tokenrole['ruleid'] = $ruleData['ruleid']; //规则ID
  952. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  953. $tokenrole['content'] = $dataFinal;
  954. $tokenrole['ruletype'] = $ruleData['ruletype'];//规则类型
  955. $tokenrole['keywords'] = "";
  956. $tokenrole['ruledetail'] = ''.$ruleData['ruledetail'];//规则详情
  957. $tokenrole['time'] = time();
  958. db('tokenrole') -> insert($tokenrole);
  959. $url = commonURL().'/Send/websocket';
  960. curlPost($url,$dataRequest);
  961. }
  962. }
  963. }
  964. }
  965. $mapName['emr'] = array('eq', $docName);
  966. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  967. if($rulename != null){
  968. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  969. $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');
  970. $maprule['ruleid'] = array('in', $ruleIdArray);
  971. $rulename = db('rulefinal')->where($maprule)->select();
  972. $rulename = stdClassObjToArray($rulename);
  973. for($j=0;$j<count($rulename);$j++){
  974. if($rulename[$j]['ruledetail'] == '暂无'){
  975. $rulename[$j]['ruledetail'] = '';
  976. }
  977. $ruleId = $rulename[$j]['ruleid'];
  978. $mapmultirule['ruleid'] = array('eq', $ruleId);
  979. // $mapmultirule['ruleid'] = array('eq', "RYJLXBS0014");
  980. $multirule = db('multirule')->where($mapmultirule)->select();
  981. $multirule = stdClassObjToArray($multirule);
  982. $docNamepath="";
  983. for($g = 0; $g < count($multirule); $g++){
  984. if($g>=1){
  985. $docNamepath .= "、";
  986. }
  987. $docNamepath.=$multirule[$g]["medicalreport"];
  988. }
  989. $multipleCases="";
  990. for($q = 0; $q < count($multirule); $q++){
  991. for($g = 0; $g < count($docsArray); $g++){
  992. if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  993. $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  994. $urlMrId = commonDataURL().'/His/getMedicalRec';
  995. $recs = curlPost($urlMrId,$dataMrId);
  996. $recs = json_decode($recs);
  997. $recs = stdClassObjToArray($recs);
  998. $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  999. }
  1000. }
  1001. }
  1002. $signers = $recs[2];
  1003. $signerNames = array();
  1004. foreach ($signers as $signer) {
  1005. if (isset($signer['SIGNER'])) {
  1006. $signerNames[] = $signer['SIGNER'];
  1007. }
  1008. }
  1009. $signerIndex = 0;
  1010. $newMultipleCases = preg_replace_callback(
  1011. '/(签名:)(\s*)/',
  1012. function($matches) use (&$signerIndex, $signerNames) {
  1013. // 如果超过数组长度,使用最后一个签名者
  1014. $name = ($signerIndex < count($signerNames))
  1015. ? $signerNames[$signerIndex]
  1016. : end($signerNames);
  1017. $signerIndex++;
  1018. return $matches[1] . $name . $matches[2];
  1019. },
  1020. $multipleCases
  1021. );
  1022. $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【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
  1023. //请求websocket客户端发送数据
  1024. $recContentFinal = [
  1025. [
  1026. 'role' => 'user',
  1027. 'content' => $dataFinalcount
  1028. ],
  1029. ];
  1030. // dump($dataFinalcount);
  1031. //组装请求的数据为base64格式
  1032. $data = [];
  1033. $data['model'] = 'gstcm-G1-14B';
  1034. $data['network'] = '2';
  1035. $data['input'] = $recContentFinal;
  1036. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1037. $data = base64_encode($data);
  1038. //对请求的参数进行sm4加密
  1039. $smIV = getSMIV();
  1040. $config = [
  1041. 'mode' => 'cbc',
  1042. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1043. 'iv' => $smIV, // 16 字节二进制 IV
  1044. 'hash' => false
  1045. ];
  1046. $sm4 = new EvitSM4Encryption($config);
  1047. $encryptedBinary = $sm4->encrypt($data);
  1048. // 将二进制结果转换为 Base64
  1049. $encryptedBase64 = base64_encode($encryptedBinary);
  1050. //创建最终的含有sm4的iv的数据
  1051. $modifiedData = [];
  1052. $modifiedData['encryptedBase64'] = $encryptedBase64;
  1053. $modifiedData['smIV'] = $smIV;
  1054. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1055. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1056. $modifiedData = base64_encode($modifiedData);
  1057. // 将 '+' 替换为 '-','/' 替换为 '_'
  1058. $modifiedData = strtr($modifiedData, '+/', '-_');
  1059. //将加密的参数发送给开放平台,获取短令牌
  1060. $urlOpen = commonOpenURL().'/Apis/getToken';
  1061. $encryption['information'] = $modifiedData;
  1062. $token = curlPost($urlOpen,$encryption);
  1063. $token = stdClassObjToArray(json_decode($token));
  1064. //推送消息至websocket
  1065. $dataRequest['user'] = $user;
  1066. $dataRequest['name'] = $name;
  1067. $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
  1068. $dataRequest['doc'] = $docName;
  1069. $dataRequest['token'] = $token['token'];
  1070. $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
  1071. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1072. $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
  1073. $tokenrole['token'] = $token['token'];
  1074. $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
  1075. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1076. $tokenrole['content'] = $dataFinal;
  1077. $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
  1078. $tokenrole['keywords'] = $rulename[$j]['keywords'];
  1079. if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
  1080. $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
  1081. }
  1082. $tokenrole['time'] = time();
  1083. db('tokenrole') -> insert($tokenrole);
  1084. // dump($tokenrole);
  1085. // exit;
  1086. $url = commonURL().'/Send/websocket';
  1087. curlPost($url,$dataRequest);
  1088. }
  1089. // exit;
  1090. }
  1091. sleep(1);
  1092. }
  1093. return 'success';
  1094. }
  1095. //测试样例
  1096. public function hisOpenPushMedical2(){
  1097. $user = request() -> param('user');
  1098. $docsCode = request() -> param('docsCode');
  1099. $ragId = request() -> param('ragId');
  1100. $docsCode = "ac8dc63487dfa20ab5c0005603100c0b";
  1101. $mapclient['user'] = array('eq',$user);
  1102. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  1103. $strate = db('client') -> where($mapclient) -> value('strate');
  1104. if($messageQueue != 0){
  1105. return;
  1106. }
  1107. if($messageQueue != 0 && $strate == 0){
  1108. return;
  1109. }
  1110. $ragId ="1970054015201382402";
  1111. // $ragId ="1970054015201382rqqww402";
  1112. $mapToken['token'] = array('eq',$docsCode);
  1113. $docsJson = db('token') -> where($mapToken) -> value('info');
  1114. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  1115. $dataIntel = json_decode($dataIntel);
  1116. $dataIntel = stdClassObjToArray($dataIntel);
  1117. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  1118. $tokenrole['out_num'] = $dataIntel['out_num'];
  1119. $tokenrole['in_num'] = $dataIntel['in_num'];
  1120. $tokenrole['id_num'] = $dataIntel['id_num'];
  1121. // return $docsJson;
  1122. if(!$docsJson){
  1123. return json('客户端短令牌错误!');
  1124. }
  1125. $docsArray = json_decode($docsJson);
  1126. $docsArray = stdClassObjToArray($docsArray);
  1127. // dump($docsJson);
  1128. // exit;
  1129. //通过病历列表获取病历原文
  1130. for($i = 0; $i < count($docsArray); $i++){
  1131. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  1132. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  1133. //请求病历原文
  1134. $mrId = $docsArray[$i]["MR_ID"];
  1135. $dataMrId['mrId'] = $mrId;
  1136. $urlMrId = commonDataURL().'/His/getMedicalRec';
  1137. $recs = curlPost($urlMrId,$dataMrId);
  1138. $recs = json_decode($recs);
  1139. $recs = stdClassObjToArray($recs);
  1140. // dump($recs);
  1141. // exit;
  1142. $keshi = $recs[1]['mr_text'];
  1143. $tokenrole['DEPT_NAME'] = $keshi;
  1144. $dataFinal = $recs[0];
  1145. if($recs[2] == 1){
  1146. $dataname = "\n质控规则包含括号内的内容(无签字,无医师签字)时,质控结果必须通过。";
  1147. }
  1148. else{
  1149. $dataname = "";
  1150. }
  1151. $recs[1]['mr_title'] = '标题';
  1152. $recs[1]['mr_text'] = $docName;
  1153. if($ragId!=null){
  1154. $dataRag['input'] = $docName;
  1155. $dataRag['kid'] = $ragId;
  1156. // dump($docName);
  1157. $urlRAG = 'http://192.168.10.115:3338/apis/ragData';
  1158. $ragResult = curlPost($urlRAG,$dataRag);
  1159. $ragResult = json_decode($ragResult);
  1160. $ragResult = stdClassObjToArray($ragResult);
  1161. if(array_key_exists('code', $ragResult)){
  1162. }
  1163. else{
  1164. if($ragResult["nearest"]!=null){
  1165. // dump($ragResult);
  1166. $rulesArray = preg_split('/\s*(?=规则编号:)/', $ragResult["nearest"][0]["text"], -1, PREG_SPLIT_NO_EMPTY);
  1167. // dump($rulesArray);
  1168. // exit;
  1169. // 去除每个规则文本前后的空白字符
  1170. $rulesArray = array_map('trim', $rulesArray);
  1171. for($j=1;$j<count($rulesArray);$j++){
  1172. preg_match('/规则编号:(.*?)\s*规则详情:\s*(.*?)\s*规则描述:\s*(.*?)\s*扣分标准:\s*([\d.]+)/s', $rulesArray[$j], $matches);
  1173. // 存储到数组中
  1174. $ruleData = [
  1175. 'ruleid' => isset($matches[1]) ? trim($matches[1]) : '',
  1176. 'ruletype' => isset($matches[2]) ? trim($matches[2]) : '',
  1177. 'ruledetail' => isset($matches[3]) ? trim($matches[3]) : '',
  1178. 'rulescore' => isset($matches[4]) ? floatval(trim($matches[4])) : 0.0
  1179. ];
  1180. $signers = $recs[2];
  1181. $signerNames = array();
  1182. foreach ($signers as $signer) {
  1183. if (isset($signer['SIGNER'])) {
  1184. $signerNames[] = $signer['SIGNER'];
  1185. }
  1186. }
  1187. $signerIndex = 0;
  1188. $newDataFinal = preg_replace_callback(
  1189. '/(签名:)(\s*)/',
  1190. function($matches) use (&$signerIndex, $signerNames) {
  1191. // 如果超过数组长度,使用最后一个签名者
  1192. $name = ($signerIndex < count($signerNames))
  1193. ? $signerNames[$signerIndex]
  1194. : end($signerNames);
  1195. $signerIndex++;
  1196. return $matches[1] . $name . $matches[2];
  1197. },
  1198. $dataFinal
  1199. );
  1200. // $newDataFinal = preg_replace('/(签名:)(\s*)/', "签名:".$recs[2][0]["SIGNER"], $dataFinal);
  1201. $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$newDataFinal."\n请按照这个规则: ".$rulesArray[$j].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: (对应的规则详情,不是规则编号)\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】:(对应的规则名称或者规则详情) \n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容,当质控签名时,只要有任何一个签名,就判断质控结果为通过。";
  1202. // dump($dataFinalcount);
  1203. // exit;
  1204. //请求websocket客户端发送数据
  1205. $recContentFinal = [
  1206. [
  1207. 'role' => 'user',
  1208. 'content' => $dataFinalcount
  1209. ],
  1210. ];
  1211. //组装请求的数据为base64格式
  1212. $data = [];
  1213. $data['model'] = 'gstcm-G1-14B';
  1214. $data['network'] = '2';
  1215. $data['input'] = $recContentFinal;
  1216. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1217. $data = base64_encode($data);
  1218. //对请求的参数进行sm4加密
  1219. $smIV = getSMIV();
  1220. $config = [
  1221. 'mode' => 'cbc',
  1222. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1223. 'iv' => $smIV, // 16 字节二进制 IV
  1224. 'hash' => false
  1225. ];
  1226. $sm4 = new EvitSM4Encryption($config);
  1227. $encryptedBinary = $sm4->encrypt($data);
  1228. // 将二进制结果转换为 Base64
  1229. $encryptedBase64 = base64_encode($encryptedBinary);
  1230. //创建最终的含有sm4的iv的数据
  1231. $modifiedData = [];
  1232. $modifiedData['encryptedBase64'] = $encryptedBase64;
  1233. $modifiedData['smIV'] = $smIV;
  1234. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1235. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1236. $modifiedData = base64_encode($modifiedData);
  1237. // 将 '+' 替换为 '-','/' 替换为 '_'
  1238. $modifiedData = strtr($modifiedData, '+/', '-_');
  1239. //将加密的参数发送给开放平台,获取短令牌
  1240. $urlOpen = commonOpenURL().'/Apis/getToken';
  1241. $encryption['information'] = $modifiedData;
  1242. $token = curlPost($urlOpen,$encryption);
  1243. $token = stdClassObjToArray(json_decode($token));
  1244. //推送消息至websocket
  1245. $dataRequest['user'] = $user;
  1246. $num = $i + 1;
  1247. $dataRequest['name'] = $name;
  1248. $dataRequest['rule'] = $ruleData['ruletype'].$ruleData['ruledetail'];
  1249. $dataRequest['doc'] = $docName;
  1250. $dataRequest['token'] = $token['token'];
  1251. $dataRequest['ruleid'] = $ruleData['ruleid'];
  1252. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1253. $tokenrole['rulescore'] = $ruleData['rulescore'];//规则扣分
  1254. $tokenrole['token'] = $token['token'];
  1255. $tokenrole['ruleid'] = $ruleData['ruleid']; //规则ID
  1256. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1257. $tokenrole['content'] = $dataFinal;
  1258. $tokenrole['ruletype'] = $ruleData['ruletype'];//规则类型
  1259. $tokenrole['keywords'] = "";
  1260. $tokenrole['ruledetail'] = ''.$ruleData['ruledetail'];//规则详情
  1261. // $tokenrole['time'] = time();
  1262. // db('tokenrole') -> insert($tokenrole);
  1263. // $url = commonURL().'/Send/websocket';
  1264. // curlPost($url,$dataRequest);
  1265. }
  1266. }
  1267. }
  1268. }
  1269. $mapName['emr'] = array('eq', $docName);
  1270. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  1271. if($rulename != null){
  1272. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  1273. $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');
  1274. $maprule['ruleid'] = array('in', $ruleIdArray);
  1275. $rulename = db('rulefinal')->where($maprule)->select();
  1276. $rulename = stdClassObjToArray($rulename);
  1277. for($j=0;$j<count($rulename);$j++){
  1278. if($rulename[$j]['ruledetail'] == '暂无'){
  1279. $rulename[$j]['ruledetail'] = '';
  1280. }
  1281. $ruleId = $rulename[$j]['ruleid'];
  1282. $mapmultirule['ruleid'] = array('eq', $ruleId);
  1283. // $mapmultirule['ruleid'] = array('eq', "RYJLXBS0014");
  1284. $multirule = db('multirule')->where($mapmultirule)->select();
  1285. $multirule = stdClassObjToArray($multirule);
  1286. $docNamepath="";
  1287. for($g = 0; $g < count($multirule); $g++){
  1288. if($g>=1){
  1289. $docNamepath .= "、";
  1290. }
  1291. $docNamepath.=$multirule[$g]["medicalreport"];
  1292. }
  1293. $multipleCases="";
  1294. for($q = 0; $q < count($multirule); $q++){
  1295. for($g = 0; $g < count($docsArray); $g++){
  1296. if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  1297. $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  1298. $urlMrId = commonDataURL().'/His/getMedicalRec';
  1299. $recs = curlPost($urlMrId,$dataMrId);
  1300. $recs = json_decode($recs);
  1301. $recs = stdClassObjToArray($recs);
  1302. $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  1303. if($recs[2] == 1){
  1304. $datanameCases = "\n医师签名与上级医师签名都默认存在。";
  1305. }
  1306. else{
  1307. $datanameCases= "";
  1308. }
  1309. }
  1310. }
  1311. }
  1312. $signers = $recs[2];
  1313. $signerNames = array();
  1314. foreach ($signers as $signer) {
  1315. if (isset($signer['SIGNER'])) {
  1316. $signerNames[] = $signer['SIGNER'];
  1317. }
  1318. }
  1319. $signerIndex = 0;
  1320. $newMultipleCases = preg_replace_callback(
  1321. '/(签名:)(\s*)/',
  1322. function($matches) use (&$signerIndex, $signerNames) {
  1323. // 如果超过数组长度,使用最后一个签名者
  1324. $name = ($signerIndex < count($signerNames))
  1325. ? $signerNames[$signerIndex]
  1326. : end($signerNames);
  1327. $signerIndex++;
  1328. return $matches[1] . $name . $matches[2];
  1329. },
  1330. $multipleCases
  1331. );
  1332. $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【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容,当质控签名时,只要有任何一个签名,就判断质控结果为通过。";
  1333. //请求websocket客户端发送数据
  1334. $recContentFinal = [
  1335. [
  1336. 'role' => 'user',
  1337. 'content' => $dataFinalcount
  1338. ],
  1339. ];
  1340. dump($dataFinalcount);
  1341. exit;
  1342. //组装请求的数据为base64格式
  1343. $data = [];
  1344. $data['model'] = 'gstcm-G1-14B';
  1345. $data['network'] = '2';
  1346. $data['input'] = $recContentFinal;
  1347. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1348. $data = base64_encode($data);
  1349. //对请求的参数进行sm4加密
  1350. $smIV = getSMIV();
  1351. $config = [
  1352. 'mode' => 'cbc',
  1353. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1354. 'iv' => $smIV, // 16 字节二进制 IV
  1355. 'hash' => false
  1356. ];
  1357. $sm4 = new EvitSM4Encryption($config);
  1358. $encryptedBinary = $sm4->encrypt($data);
  1359. // 将二进制结果转换为 Base64
  1360. $encryptedBase64 = base64_encode($encryptedBinary);
  1361. //创建最终的含有sm4的iv的数据
  1362. $modifiedData = [];
  1363. $modifiedData['encryptedBase64'] = $encryptedBase64;
  1364. $modifiedData['smIV'] = $smIV;
  1365. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1366. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1367. $modifiedData = base64_encode($modifiedData);
  1368. // 将 '+' 替换为 '-','/' 替换为 '_'
  1369. $modifiedData = strtr($modifiedData, '+/', '-_');
  1370. //将加密的参数发送给开放平台,获取短令牌
  1371. $urlOpen = commonOpenURL().'/Apis/getToken';
  1372. $encryption['information'] = $modifiedData;
  1373. $token = curlPost($urlOpen,$encryption);
  1374. $token = stdClassObjToArray(json_decode($token));
  1375. //推送消息至websocket
  1376. $dataRequest['user'] = $user;
  1377. $dataRequest['name'] = $name;
  1378. $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
  1379. $dataRequest['doc'] = $docName;
  1380. $dataRequest['token'] = $token['token'];
  1381. $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
  1382. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1383. $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
  1384. $tokenrole['token'] = $token['token'];
  1385. $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
  1386. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1387. $tokenrole['content'] = $multipleCases;
  1388. $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
  1389. $tokenrole['keywords'] = $rulename[$j]['keywords'];
  1390. if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
  1391. $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
  1392. }
  1393. // $tokenrole['time'] = time();
  1394. // db('tokenrole') -> insert($tokenrole);
  1395. // dump($tokenrole);
  1396. // exit;
  1397. // $url = commonURL().'/Send/websocket';
  1398. // curlPost($url,$dataRequest);
  1399. }
  1400. // exit;
  1401. }
  1402. sleep(1);
  1403. }
  1404. return 'success';
  1405. }
  1406. //接受hisOpen发送过来的病历列表并推送
  1407. public function hisOpenPush1(){
  1408. // $docsJson = '[{"TYPE_NAME":"彭**-入院记录","MR_ID":"dbc9a263-7e41-43e3-be37-637a8ebac213"},{"TYPE_NAME":"彭**-首次病程记录","MR_ID":"3f2ea6c4-6d58-46b3-89e0-92b0266a0fd0"},{"TYPE_NAME":"彭**-中医特色专科病程记录","MR_ID":"c22d3c52-c538-455d-84ef-0c19ebc50e02"},{"TYPE_NAME":"彭**-会诊记录","MR_ID":"b9f795fa-dff5-4bca-81c5-86d67faa87ef"},{"TYPE_NAME":"彭**-主治医师首次查房记录","MR_ID":"5b013e76-ed60-4fd5-a6b2-6cec487fe05c"},{"TYPE_NAME":"彭**-科主任或具有副主任医师以上专业技术职务资格医师查房记录","MR_ID":"40358471-16b9-4a9e-ba93-344a562022bd"},{"TYPE_NAME":"彭**-日常病程记录","MR_ID":"0d14032c-8f00-4c61-b0f8-c4a6ebd0cf4c"},{"TYPE_NAME":"彭**-术前小结","MR_ID":"d52e01b1-48a5-421e-bbb6-d0a61c6079af"},{"TYPE_NAME":"彭**-术前讨论记录","MR_ID":"fafa4249-f0d5-4354-9907-f75c5195ceb1"},{"TYPE_NAME":"彭**-第一术者术前查房记录","MR_ID":"5d94412a-5622-4118-a948-6de7029267ca"},{"TYPE_NAME":"彭**-出院证明书","MR_ID":"58711e0c-23db-4f2f-9c3c-0f36b4f1e3bf"},{"TYPE_NAME":"彭**-术前讨论记录","MR_ID":"b9ea75de-564a-4c03-9946-e364dc7dbc70"},{"TYPE_NAME":"彭**-术后首次病程记录","MR_ID":"f3299242-8c1e-4f40-8283-51698ab6ab37"},{"TYPE_NAME":"彭**-主治医师日常查房记录","MR_ID":"9b3dfe6d-ce4b-43b5-8514-7ad0c5ba2a88"},{"TYPE_NAME":"彭**-出院记录","MR_ID":"4f434252-d7bd-40e4-ac51-be0c86e73dcd"},{"TYPE_NAME":"彭**-修正诊断","MR_ID":"1d5dbeca-e572-4963-81d2-8d1dd5a65a30"}]';
  1409. // $user = 8999;
  1410. $user = request() -> param('user');
  1411. $docsCode = request() -> param('docsCode');
  1412. // $docsCode = "2fa0e00ffd00d6e92b04a24bbd6dac1d";
  1413. $mapToken['token'] = array('eq',$docsCode);
  1414. //
  1415. $docsJson = db('token') -> where($mapToken) -> value('info');
  1416. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  1417. $dataIntel = json_decode($dataIntel);
  1418. $dataIntel = stdClassObjToArray($dataIntel);
  1419. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  1420. $tokenrole['out_num'] = $dataIntel['out_num'];
  1421. $tokenrole['in_num'] = $dataIntel['in_num'];
  1422. $tokenrole['id_num'] = $dataIntel['id_num'];
  1423. if(!$docsJson){
  1424. return json('客户端短令牌错误!');
  1425. }
  1426. $docsArray = json_decode($docsJson);
  1427. $docsArray = stdClassObjToArray($docsArray);
  1428. //通过病历列表获取病历原文
  1429. for($i = 0; $i < count($docsArray); $i++){
  1430. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  1431. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  1432. //请求病历原文
  1433. $mrId = $docsArray[$i]["MR_ID"];
  1434. $dataMrId['mrId'] = $mrId;
  1435. $urlMrId = commonDataURL().'/His/getRec';
  1436. $recs = curlPost($urlMrId,$dataMrId);
  1437. $recs = json_decode($recs);
  1438. $recs = stdClassObjToArray($recs);
  1439. $keshi = $recs[count($recs)-1]['mr_text'];
  1440. $tokenrole['DEPT_NAME'] = $keshi;
  1441. $dataFinal = '';
  1442. for($r=0;$r<count($recs);$r++){
  1443. $dataFinal = $dataFinal.$recs[$r]["mr_title"].":".$recs[$r]["mr_text"];
  1444. }
  1445. $recs[count($recs)]['mr_title'] = '标题';
  1446. $recs[count($recs)-1]['mr_text'] = $docName;
  1447. // $dataFinal = json_encode($recs,JSON_UNESCAPED_UNICODE);
  1448. $map['emr'] = array('eq', $docName);
  1449. $rulename = db('rulecounter')->where($map)->value('rulepath');
  1450. if($rulename != null){
  1451. $maprule['rulepath'] = array('like', '%'.$rulename.'%');
  1452. $ruleIdArray = array('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', 'RCBC0038', 'RCBC0039', 'RCBC0044', 'CYJL0002', 'CYJL0003', 'CYJL0004', 'CYJL0005', 'CYJL0006', 'CYJL0007', 'CYJL0008', 'CYJL0009', 'CYJL0011', 'CYJL0012', 'HZJL0000', 'HZJL0001', 'HZJL0002', 'HZJL0003', 'HZJL0004', 'HZJL0005', 'SQXJ0000', 'SQXJ0001', 'RCBC0040', 'RCBC0041');
  1453. $maprule['ruleid'] = array('in', $ruleIdArray);
  1454. $rulename = db('rulefinal')->where($maprule)->select();
  1455. // dump($rulename);
  1456. // exit;
  1457. //dump(count($rulename));
  1458. //exit;
  1459. // //查询某一列数据
  1460. // $rule = db('User')->column('name');
  1461. $rule = "";
  1462. $ruleid = "";
  1463. for($j=0;$j<count($rulename);$j++){
  1464. $rulenamecount = $j+1;
  1465. if($rulenamecount == count($rulename)){
  1466. $rulenamecount = $j;
  1467. }
  1468. if($rulename[$j]['ruledetail'] == '暂无'){
  1469. $rulename[$j]['ruledetail'] = '';
  1470. }
  1471. if($j == 0){
  1472. $rule .= $rulename[$j]['ruletype'];
  1473. $rule .= $rulename[$j]['ruledetail']."\n";
  1474. }
  1475. else{
  1476. if($rulename[$j-1]['ruletype'] == $rulename[$j]['ruletype']){
  1477. $rule .= $rulename[$j]['ruledetail'].",";
  1478. }
  1479. else{
  1480. $rule .= $rulename[$j]['ruletype'];
  1481. if($rulename[$rulenamecount]['ruletype'] == $rulename[$j]['ruletype']){
  1482. $rule .= $rulename[$j]['ruledetail'].",";
  1483. }
  1484. else{
  1485. $rule .= $rulename[$j]['ruledetail']."\n";
  1486. }
  1487. }
  1488. }
  1489. $ruleid .= $rulename[$j]['ruleid'];
  1490. }
  1491. $dataFinalcount = "你是一名专业的医疗病历质控员,请根据以下内容进行病历质控审查。\n";
  1492. $dataFinalcount .= "当前病历名称如下:\n{$docName}\n\n";
  1493. $dataFinalcount .= "当前病历原文如下:\n{$dataFinal}\n\n";
  1494. $dataFinalcount .= "质控规则如下:\n{$rule}\n\n";
  1495. $dataFinalcount .= "请按照上述规则,判断当前病历是否符合质控要求。\n\n";
  1496. $dataFinalcount .= "如果病历完全符合所有规则,请严格输出以下内容:\n";
  1497. $dataFinalcount .= "规则内容和病历校验结果:病例校验通过\n\n";
  1498. $dataFinalcount .= "如果存在不符合规则的情况,请按以下格式逐条输出违规项,必须以‘病历校验结果:’开头,\n";
  1499. $dataFinalcount .= "不符合规则输出的格式如下\n";
  1500. $dataFinalcount .= "【规则名称】列出违反了哪条规则\n\n";
  1501. $dataFinalcount .= "【质控结果】简要描述为什么违反了此条规则\n\n";
  1502. $dataFinalcount .= "不符合规则的列举格式如下,严格模仿以下结构输出:\n";
  1503. $dataFinalcount .= "病历校验结果:\n";
  1504. $dataFinalcount .= "【规则名称】缺入院记录(实习医师代写视为缺住院记录)\n\n";
  1505. $dataFinalcount .= "【质控结果】入院记录必须由执业医师书写或审签,实习医师单独代写且无上级医师签名视为缺失。\n\n";
  1506. $dataFinalcount .= "*****\n";
  1507. $dataFinalcount .= "【规则名称】未在患者入院24小时内完成入院记录\n\n";
  1508. $dataFinalcount .= "【质控结果】入院记录应在患者入院后24小时内完成,由经治医师或值班医师书写。\n\n";
  1509. $dataFinalcount .= "\n\n注意事项:\n";
  1510. $dataFinalcount .= "1. 若无任何违规,不违规本项规则,不得输出该规则。\n";
  1511. $dataFinalcount .= "2. 若有违规,必须先输出‘病历校验结果:’,然后按规则逐条列出,每条规则包含【规则名称】【质控结果】两个字段。\n";
  1512. $dataFinalcount .= "3. 每条不同的完整规则之间,必须添加一行分隔符:*****,最后一条规则结束时结尾不要添加任何字符、符号等\n";
  1513. $dataFinalcount .= "4. 每个字段独占一行,使用【】标注字段名,后接内容,不加冒号或其他符号。\n";
  1514. $dataFinalcount .= "5. 禁止添加解释、总结、问候语或额外说明。\n";
  1515. $dataFinalcount .= "5. 规则内容必须严格来自知识库,不得自行编造或推测。\n\n";
  1516. //请求websocket客户端发送数据
  1517. $recContentFinal = [
  1518. [
  1519. 'role' => 'user',
  1520. 'content' => $dataFinalcount
  1521. ],
  1522. ];
  1523. // dump($recContentFinal);
  1524. //组装请求的数据为base64格式
  1525. $data = [];
  1526. $data['model'] = 'gstcm-G1-14B';
  1527. $data['network'] = '2';
  1528. $data['input'] = $recContentFinal;
  1529. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1530. $data = base64_encode($data);
  1531. //对请求的参数进行sm4加密
  1532. $smIV = getSMIV();
  1533. $config = [
  1534. 'mode' => 'cbc',
  1535. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1536. 'iv' => $smIV, // 16 字节二进制 IV
  1537. 'hash' => false
  1538. ];
  1539. $sm4 = new EvitSM4Encryption($config);
  1540. $encryptedBinary = $sm4->encrypt($data);
  1541. // 将二进制结果转换为 Base64
  1542. $encryptedBase64 = base64_encode($encryptedBinary);
  1543. //创建最终的含有sm4的iv的数据
  1544. $modifiedData = [];
  1545. $modifiedData['encryptedBase64'] = $encryptedBase64;
  1546. $modifiedData['smIV'] = $smIV;
  1547. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1548. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1549. $modifiedData = base64_encode($modifiedData);
  1550. // 将 '+' 替换为 '-','/' 替换为 '_'
  1551. $modifiedData = strtr($modifiedData, '+/', '-_');
  1552. //将加密的参数发送给开放平台,获取短令牌
  1553. $urlOpen = commonOpenURL().'/Apis/getToken';
  1554. $encryption['information'] = $modifiedData;
  1555. $token = curlPost($urlOpen,$encryption);
  1556. $token = stdClassObjToArray(json_decode($token));
  1557. //推送消息至websocket
  1558. $dataRequest['user'] = $user;
  1559. $num = $i + 1;
  1560. $dataRequest['name'] = $name;
  1561. $dataRequest['rule'] = $rule;
  1562. $dataRequest['doc'] = $docName.'('.$num.'/'.count($docsArray).')';
  1563. $dataRequest['token'] = $token['token'];
  1564. $dataRequest['ruleid'] = $ruleid;
  1565. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1566. $tokenrole['token'] = $token['token'];
  1567. $tokenrole['ruleid'] = $ruleid;
  1568. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1569. $tokenrole['content'] = $dataFinal;
  1570. $tokenrole['ruletype'] = $rule;
  1571. $tokenrole['ruledetail'] = $rule;
  1572. $tokenrole['time'] = time();
  1573. db('tokenrole') -> insert($tokenrole);
  1574. $url = commonURL().'/Send/websocket';
  1575. curlPost($url,$dataRequest);
  1576. }
  1577. sleep(1);
  1578. }
  1579. return 'success';
  1580. }
  1581. //定时更新当前状态。
  1582. public function onlineUpdate(){
  1583. $user = request() -> param('user');
  1584. $messageQueuelength = request() -> param('messageQueuelength');
  1585. $strate = request() -> param('strate');
  1586. // $user = 6666;
  1587. $mapUser['user'] = array('eq',$user);
  1588. $userData = db('client') -> where($mapUser) -> select();
  1589. if($userData == null){
  1590. $updateData["user"] = $user;
  1591. $updateData["updatetime"] = time();
  1592. $updateData["strate"] = 1;
  1593. $updateData["messageQueue"] =$messageQueuelength;
  1594. $data = db('client') -> insert($updateData);
  1595. return $data;
  1596. }
  1597. else{
  1598. $updateData["updatetime"] = time();
  1599. $updateData["strate"] = $strate;
  1600. $updateData["messageQueue"] =$messageQueuelength;
  1601. $data = db('client') -> where($mapUser) -> update($updateData);
  1602. return $data;
  1603. }
  1604. }
  1605. public function test(){
  1606. // $docsCode = "cf76da1345a1602c40e4583430363169";
  1607. // $mapToken['token'] = array('eq',$docsCode);
  1608. // $docsJson = db('token') -> where($mapToken) -> value('info');
  1609. // $docsArray = json_decode($docsJson);
  1610. // $docsArray = stdClassObjToArray($docsArray);
  1611. // // $searchTerm[0] = "首次病程记录";
  1612. // $searchTerm = "入院记录";
  1613. // $maprule['rulepath'] = array('like', '%'.$searchTerm.'%');
  1614. // $ruleIdArray = array('RYJLXBS0014');
  1615. // $maprule['ruleid'] = array('in', $ruleIdArray);
  1616. // $rulename = db('rulefinal')->where($maprule)->select();
  1617. // $rulepath = json_decode($rulename[0]["rulepath"]);
  1618. // $rulepath = stdClassObjToArray($rulepath);
  1619. // dump($rulepath[0]);
  1620. // // exit;
  1621. // for($j = 0; $j < count($rulepath[0]); $j++){
  1622. // for($i = 0; $i < count($docsArray); $i++){
  1623. // // dump($docsArray[$i]['TYPE_NAME']);
  1624. // if(strpos($docsArray[$i]['TYPE_NAME'], $rulepath[0][$j]) !== false){
  1625. // // return ($docsArray[$i]['TYPE_NAME']);
  1626. // $dataMrId['mrId'] = $docsArray[$i]['MR_ID'];
  1627. // $urlMrId = commonDataURL().'/His/getMedicalRec';
  1628. // $recs = curlPost($urlMrId,$dataMrId);
  1629. // $recs = json_decode($recs);
  1630. // $recs = stdClassObjToArray($recs);
  1631. // dump($recs);
  1632. // }
  1633. // }
  1634. // }
  1635. $docsJson = db('rulefinal') -> select();
  1636. for($i = 0; $i < count($docsJson); $i++){
  1637. $data["ruleid"] = $docsJson[$i]["ruleid"];
  1638. $data["medicalreport"] = $docsJson[$i]["rulepath"];
  1639. db('multirule') -> insert($data);
  1640. }
  1641. dump($data);
  1642. }
  1643. //测试样例新版
  1644. public function hisOpenPushMedical5(){
  1645. $user = request() -> param('user');
  1646. $docsCode = request() -> param('docsCode');
  1647. $ragId = request() -> param('ragId');
  1648. $mapclient['user'] = array('eq',$user);
  1649. $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
  1650. $strate = db('client') -> where($mapclient) -> value('strate');
  1651. if($messageQueue != 0){
  1652. return;
  1653. }
  1654. if($messageQueue != 0 && $strate == 0){
  1655. return;
  1656. }
  1657. $ragId ="1970054015201382402";
  1658. // $ragId ="1970054015201382rqqww402";
  1659. // $docsCode = "4df3e9bd12b79a6e5c435b0f3883bee9";
  1660. $mapToken['token'] = array('eq',$docsCode);
  1661. $docsJson = db('token') -> where($mapToken) -> value('info');
  1662. $dataIntel = db('token') -> where($mapToken) -> value('intel');
  1663. $dataIntel = json_decode($dataIntel);
  1664. $dataIntel = stdClassObjToArray($dataIntel);
  1665. $tokenrole['pat_name'] = $dataIntel['pat_name'];
  1666. $tokenrole['out_num'] = $dataIntel['out_num'];
  1667. $tokenrole['in_num'] = $dataIntel['in_num'];
  1668. $tokenrole['id_num'] = $dataIntel['id_num'];
  1669. // return $docsJson;
  1670. if(!$docsJson){
  1671. return json('客户端短令牌错误!');
  1672. }
  1673. $docsArray = json_decode($docsJson);
  1674. $docsArray = stdClassObjToArray($docsArray);
  1675. $mapping = [
  1676. "病案首页" => "0",
  1677. "入院记录" => "1",
  1678. "首次病程记录" => "2",
  1679. "阶段小结" => "3",
  1680. "日常病程记录" => "4",
  1681. "上级医师查房记录" => "5",
  1682. "会诊记录" => "6",
  1683. "术前讨论" => "7",
  1684. "麻醉记录" => "8",
  1685. "有创操作记录" => "9",
  1686. "术后病程记录" => "10",
  1687. "检查检验记录" => "11",
  1688. "护理记录" => "12",
  1689. "评分表" => "13",
  1690. "交接班记录" => "14",
  1691. "抢救记录" => "15",
  1692. "死亡记录" => "16",
  1693. "出入转记录" => "17",
  1694. ];
  1695. //通过病历列表获取病历原文
  1696. for($i = 0; $i < count($docsArray); $i++){
  1697. $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
  1698. $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
  1699. //请求病历原文
  1700. $mrId = $docsArray[$i]["MR_ID"];
  1701. $dataMrId['mrId'] = $mrId;
  1702. $urlMrId = commonDataURL().'/His/getMedicalRec';
  1703. $recs = curlPost($urlMrId,$dataMrId);
  1704. $recs = json_decode($recs);
  1705. $recs = stdClassObjToArray($recs);
  1706. // dump($recs);
  1707. // exit;
  1708. $keshi = $recs[1]['mr_text'];
  1709. $tokenrole['DEPT_NAME'] = $keshi;
  1710. $dataFinal = $recs[0];
  1711. $recs[1]['mr_title'] = '标题';
  1712. $recs[1]['mr_text'] = $docName;
  1713. // dump($docName);
  1714. $mapName['emr'] = array('eq', $docName);
  1715. $rulename = db('rulecounter')->where($mapName)->value('rulepath');
  1716. if($ragId!=null){
  1717. $dataRag['input'] = $docName;
  1718. $dataRag['kid'] = $ragId;
  1719. // dump($docName);
  1720. $urlRAG = 'http://192.168.10.115:3338/apis/ragData';
  1721. $ragResult = curlPost($urlRAG,$dataRag);
  1722. $ragResult = json_decode($ragResult);
  1723. $ragResult = stdClassObjToArray($ragResult);
  1724. if(array_key_exists('code', $ragResult)){
  1725. }
  1726. else{
  1727. // if($ragResult["nearest"]!=null){
  1728. // // dump($ragResult);
  1729. // $rulesArray = preg_split('/\s*(?=规则编号:)/', $ragResult["nearest"][0]["text"], -1, PREG_SPLIT_NO_EMPTY);
  1730. // // dump($rulesArray);
  1731. // // exit;
  1732. // // 去除每个规则文本前后的空白字符
  1733. // $rulesArray = array_map('trim', $rulesArray);
  1734. // for($j=1;$j<count($rulesArray);$j++){
  1735. // preg_match('/规则编号:(.*?)\s*规则详情:\s*(.*?)\s*规则描述:\s*(.*?)\s*扣分标准:\s*([\d.]+)/s', $rulesArray[$j], $matches);
  1736. // // 存储到数组中
  1737. // $ruleData = [
  1738. // 'ruleid' => isset($matches[1]) ? trim($matches[1]) : '',
  1739. // 'ruletype' => isset($matches[2]) ? trim($matches[2]) : '',
  1740. // 'ruledetail' => isset($matches[3]) ? trim($matches[3]) : '',
  1741. // 'rulescore' => isset($matches[4]) ? floatval(trim($matches[4])) : 0.0
  1742. // ];
  1743. // $signers = $recs[2];
  1744. // $signerNames = array();
  1745. // foreach ($signers as $signer) {
  1746. // if (isset($signer['SIGNER'])) {
  1747. // $signerNames[] = $signer['SIGNER'];
  1748. // }
  1749. // }
  1750. // $signerIndex = 0;
  1751. // $newDataFinal = preg_replace_callback(
  1752. // '/(签名:)(\s*)/',
  1753. // function($matches) use (&$signerIndex, $signerNames) {
  1754. // // 如果超过数组长度,使用最后一个签名者
  1755. // $name = ($signerIndex < count($signerNames))
  1756. // ? $signerNames[$signerIndex]
  1757. // : end($signerNames);
  1758. // $signerIndex++;
  1759. // return $matches[1] . $name . $matches[2];
  1760. // },
  1761. // $dataFinal
  1762. // );
  1763. // // $newDataFinal = preg_replace('/(签名:)(\s*)/', "签名:".$recs[2][0]["SIGNER"], $dataFinal);
  1764. // $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$newDataFinal."\n请按照这个规则: ".$rulesArray[$j].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: (对应的规则详情,不是规则编号)\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】:(对应的规则名称或者规则详情) \n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容,当质控签名时,只要有任何一个签名,就判断质控结果为通过。";
  1765. // // dump($dataFinalcount);
  1766. // // exit;
  1767. // //请求websocket客户端发送数据
  1768. // $recContentFinal = [
  1769. // [
  1770. // 'role' => 'user',
  1771. // 'content' => $dataFinalcount
  1772. // ],
  1773. // ];
  1774. // //组装请求的数据为base64格式
  1775. // $data = [];
  1776. // $data['model'] = 'gstcm-G1-14B';
  1777. // $data['network'] = '2';
  1778. // $data['input'] = $recContentFinal;
  1779. // $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1780. // $data = base64_encode($data);
  1781. // //对请求的参数进行sm4加密
  1782. // $smIV = getSMIV();
  1783. // $config = [
  1784. // 'mode' => 'cbc',
  1785. // 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  1786. // 'iv' => $smIV, // 16 字节二进制 IV
  1787. // 'hash' => false
  1788. // ];
  1789. // $sm4 = new EvitSM4Encryption($config);
  1790. // $encryptedBinary = $sm4->encrypt($data);
  1791. // // 将二进制结果转换为 Base64
  1792. // $encryptedBase64 = base64_encode($encryptedBinary);
  1793. // //创建最终的含有sm4的iv的数据
  1794. // $modifiedData = [];
  1795. // $modifiedData['encryptedBase64'] = $encryptedBase64;
  1796. // $modifiedData['smIV'] = $smIV;
  1797. // $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  1798. // $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  1799. // $modifiedData = base64_encode($modifiedData);
  1800. // // 将 '+' 替换为 '-','/' 替换为 '_'
  1801. // $modifiedData = strtr($modifiedData, '+/', '-_');
  1802. // //将加密的参数发送给开放平台,获取短令牌
  1803. // $urlOpen = commonOpenURL().'/Apis/getToken';
  1804. // $encryption['information'] = $modifiedData;
  1805. // $token = curlPost($urlOpen,$encryption);
  1806. // $token = stdClassObjToArray(json_decode($token));
  1807. // //推送消息至websocket
  1808. // $dataRequest['user'] = $user;
  1809. // $num = $i + 1;
  1810. // $dataRequest['name'] = $name;
  1811. // $dataRequest['rule'] = $ruleData['ruletype'].$ruleData['ruledetail'];
  1812. // $dataRequest['doc'] = $docName;
  1813. // $dataRequest['token'] = $token['token'];
  1814. // $dataRequest['ruleid'] = $ruleData['ruleid'];
  1815. // $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  1816. // $tokenrole['rulescore'] = $ruleData['rulescore'];//规则扣分
  1817. // $tokenrole['token'] = $token['token'];
  1818. // $tokenrole['ruleid'] = $ruleData['ruleid']; //规则ID
  1819. // $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  1820. // $tokenrole['content'] = $dataFinal;
  1821. // $tokenrole['ruletype'] = $ruleData['ruletype'];//规则类型
  1822. // $tokenrole['keywords'] = "";
  1823. // $tokenrole['ruledetail'] = ''.$ruleData['ruledetail'];//规则详情
  1824. // $tokenrole['time'] = time();
  1825. // db('tokenrole') -> insert($tokenrole);
  1826. // $url = commonURL().'/Send/websocket';
  1827. // curlPost($url,$dataRequest);
  1828. // }
  1829. // }
  1830. }
  1831. }
  1832. if($rulename != null){
  1833. // $mapqcStage['qc_type_list'] = array('like', '%'.$mapping[$rulename].'%');
  1834. // $mapqcStage['qc_behavior'] = array('eq', 'common');
  1835. // //质控阶段与病例类型筛选后的规则
  1836. // $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
  1837. // $qcruleStage = stdClassObjToArray($qcruleStage);
  1838. // dump($qcruleStage);
  1839. // exit;
  1840. $qcrulelink = db('quality_control_rule_sz')->select();
  1841. $qcTypeList = [];
  1842. if (array_key_exists($rulename, $mapping)) {
  1843. //筛选质控病历类型所对应的参数。
  1844. for($z = 0; $z < count($qcrulelink) ; $z++){
  1845. // $qcrulelink[$i];
  1846. // dump($qcrulelink[$i]["qc_type_list"]);
  1847. $TypeList = json_decode($qcrulelink[$z]["qc_type_list"]);
  1848. // 检查qcType是否在TypeList中
  1849. if (is_array($TypeList) && in_array($mapping[$rulename], $TypeList)) {
  1850. // 将对应的rule_code添加到qcTypeList数组中
  1851. $qcTypeList[] = $qcrulelink[$z]["rule_code"];
  1852. }
  1853. }
  1854. }
  1855. $mapqcStage['rule_code'] = array('in', $qcTypeList);
  1856. $mapqcStage['qc_behavior'] = array('eq', 'common');
  1857. $mapqcStage['qc_stage'] = array('eq', 'PostEvent');
  1858. //质控阶段与病例类型筛选后的规则
  1859. $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
  1860. // dump($qcruleStage);
  1861. // exit;
  1862. //规则适配的病例类型
  1863. // $qcTypeList = $qcruleStage[0]["qc_type_list"];
  1864. // $qcTypeList = json_decode($qcTypeList);
  1865. // $qcTypeList = stdClassObjToArray($qcTypeList);
  1866. $dataRag['medicalContent'] = $dataFinal;
  1867. $dataRag['kid'] = 'Rule_Final';
  1868. for($j=0;$j<count($qcruleStage);$j++){
  1869. $ruleCode = $qcruleStage[$j]['rule_code'];
  1870. $dataRag['ruleCode'] = $ruleCode;
  1871. $urlRAG = 'http://192.168.10.115:3338/apis/ragDataMCQC';
  1872. $ragResult = curlPost($urlRAG,$dataRag);
  1873. $ragResult = json_decode($ragResult);
  1874. $ragResult = stdClassObjToArray($ragResult);
  1875. //医师签名
  1876. $signers = $recs[2];
  1877. $signerNames = array();
  1878. foreach ($signers as $signer) {
  1879. if (isset($signer['SIGNER'])) {
  1880. $signerNames[] = $signer['SIGNER'];
  1881. }
  1882. }
  1883. $signerIndex = 0;
  1884. //将签名组装到病历里。
  1885. $newMultipleCases = preg_replace_callback(
  1886. '/(签名:)(\s*)/',
  1887. function($matches) use (&$signerIndex, $signerNames) {
  1888. // 如果超过数组长度,使用最后一个签名者
  1889. $name = ($signerIndex < count($signerNames))
  1890. ? $signerNames[$signerIndex]
  1891. : end($signerNames);
  1892. $signerIndex++;
  1893. return $matches[1] . $name . $matches[2];
  1894. },
  1895. $dataFinal
  1896. );
  1897. // dump($dataFinal);
  1898. // dump($newMultipleCases);
  1899. // exit;
  1900. // $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【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
  1901. if(count($ragResult["data"]) != 0){
  1902. //正确示例
  1903. $PoExample = "";
  1904. //错误示例
  1905. $ErExample = "";
  1906. for($Example = 0 ;$Example<count($ragResult["data"]);$Example++){
  1907. if($ragResult["data"][$Example]["type"] == "positive"){
  1908. $PoExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
  1909. }
  1910. else{
  1911. $ErExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
  1912. }
  1913. }
  1914. // dump($PoExample);
  1915. // dump($ErExample);
  1916. $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
  1917. 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
  1918. 请严格基于【病历原文】判断是否违反该规则。
  1919. ***【质控规则】***
  1920. 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
  1921. 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
  1922. 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
  1923. ***【参考内容】***
  1924. 正例(符合要求的写法):\n
  1925. ".$PoExample."\n
  1926. 反例(不符合要求的写法):\n
  1927. ".$ErExample."\n
  1928. ===【病历原文】===
  1929. 以下为".$docName."部分:
  1930. \n".$newMultipleCases."\n
  1931. ===【输出要求】===
  1932. 请严格以下列格式输出,不得输出解释性文字或额外内容。
  1933. 如果病历完全符合规则,请输出以下格式的内容:
  1934. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1935. 【质控结果】:病例校验通过。
  1936. 如果存在不符合规则,请输出以下格式的内容:
  1937. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1938. 【质控结果】:病例校验不通过\n
  1939. 【不通过原因】:(简要概述不通过的原因)
  1940. 【规则关键字】:违规位置及所属内容(必须只有一个关键字,如 ‘主诉’)',
  1941. ===【注意事项】===
  1942. - 严禁输出 Markdown 代码块(如 ```json)
  1943. - 严禁输出解释性文字、分析过程或无关说明
  1944. - 不得引用或复述【参考内容】中的文字
  1945. - 若规则不适用于当前病历内容,应视为通过
  1946. - 所有结论必须严格基于【病历原文】内容
  1947. -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
  1948. ";
  1949. }
  1950. else{
  1951. $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
  1952. 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
  1953. 请严格基于【病历原文】判断是否违反该规则。
  1954. ***【质控规则】***
  1955. 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
  1956. 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
  1957. 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
  1958. ===【病历原文】===
  1959. 以下为".$docName."部分:
  1960. \n".$newMultipleCases."\n
  1961. ===【输出要求】===
  1962. 请严格以下列格式输出,不得输出解释性文字或额外内容。
  1963. 如果病历完全符合规则,请输出以下格式的内容:
  1964. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1965. 【质控结果】:病例校验通过。
  1966. 如果存在不符合规则,请输出以下格式的内容:
  1967. 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
  1968. 【质控结果】:病例校验不通过\n
  1969. 【不通过原因】:(简要概述不通过的原因)\n
  1970. 【规则关键字】:违规位置及内容(必须只有一个关键字,如 ‘主诉’)'
  1971. ===【注意事项】===
  1972. - 严禁输出 Markdown 代码块(如 ```json)
  1973. - 严禁输出解释性文字、分析过程或无关说明
  1974. - 若规则不适用于当前病历内容,应视为通过
  1975. - 所有结论必须严格基于【病历原文】内容
  1976. -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
  1977. ";
  1978. }
  1979. // dump($dataFinalcount);
  1980. // exit;
  1981. //请求websocket客户端发送数据
  1982. $recContentFinal = [
  1983. [
  1984. 'role' => 'user',
  1985. 'content' => $dataFinalcount
  1986. ],
  1987. ];
  1988. // dump($dataFinalcount);
  1989. //组装请求的数据为base64格式
  1990. $data = [];
  1991. $data['model'] = 'gstcm-G1-14B';
  1992. $data['network'] = '2';
  1993. $data['input'] = $recContentFinal;
  1994. $data = json_encode($data,JSON_UNESCAPED_UNICODE);
  1995. $data = base64_encode($data);
  1996. //对请求的参数进行sm4加密
  1997. $smIV = getSMIV();
  1998. $config = [
  1999. 'mode' => 'cbc',
  2000. 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
  2001. 'iv' => $smIV, // 16 字节二进制 IV
  2002. 'hash' => false
  2003. ];
  2004. $sm4 = new EvitSM4Encryption($config);
  2005. $encryptedBinary = $sm4->encrypt($data);
  2006. // 将二进制结果转换为 Base64
  2007. $encryptedBase64 = base64_encode($encryptedBinary);
  2008. //创建最终的含有sm4的iv的数据
  2009. $modifiedData = [];
  2010. $modifiedData['encryptedBase64'] = $encryptedBase64;
  2011. $modifiedData['smIV'] = $smIV;
  2012. $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
  2013. $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
  2014. $modifiedData = base64_encode($modifiedData);
  2015. // 将 '+' 替换为 '-','/' 替换为 '_'
  2016. $modifiedData = strtr($modifiedData, '+/', '-_');
  2017. //将加密的参数发送给开放平台,获取短令牌
  2018. $urlOpen = commonOpenURL().'/Apis/getToken';
  2019. $encryption['information'] = $modifiedData;
  2020. $token = curlPost($urlOpen,$encryption);
  2021. $token = stdClassObjToArray(json_decode($token));
  2022. // dump($recContentFinal);
  2023. // exit;
  2024. //推送消息至websocket
  2025. $dataRequest['user'] = $user;
  2026. $dataRequest['name'] = $name;
  2027. $dataRequest['rule'] = $qcruleStage[$j]['rule_content'];
  2028. $dataRequest['doc'] = $docName;
  2029. $dataRequest['token'] = $token['token'];
  2030. $dataRequest['ruleid'] = $qcruleStage[$j]['rule_code'];
  2031. $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
  2032. $tokenrole['token'] = $token['token'];
  2033. $tokenrole['ruleid'] = $qcruleStage[$j]['rule_code'];
  2034. $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
  2035. $tokenrole['content'] = $dataFinal;
  2036. $tokenrole['time'] = time();
  2037. db('tokenrole2') -> insert($tokenrole);
  2038. // dump($tokenrole);
  2039. // exit;
  2040. $url = commonURL().'/Send/websocket';
  2041. curlPost($url,$dataRequest);
  2042. }
  2043. }
  2044. // // exit;
  2045. //多病例融合
  2046. // $docNamepath="";
  2047. // for($g = 0; $g < count($multirule); $g++){
  2048. // if($g>=1){
  2049. // $docNamepath .= "、";
  2050. // }
  2051. // $docNamepath.=$multirule[$g]["medicalreport"];
  2052. // }
  2053. // $multipleCases="";
  2054. // for($q = 0; $q < count($multirule); $q++){
  2055. // for($g = 0; $g < count($docsArray); $g++){
  2056. // if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
  2057. // $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
  2058. // $urlMrId = commonDataURL().'/His/getMedicalRec';
  2059. // $recs = curlPost($urlMrId,$dataMrId);
  2060. // $recs = json_decode($recs);
  2061. // $recs = stdClassObjToArray($recs);
  2062. // $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
  2063. // }
  2064. // }
  2065. // }
  2066. }
  2067. // sleep(1);
  2068. return 'success';
  2069. }
  2070. private function getValueByLike($input, $mapping = null) {
  2071. $mapping = $mapping ?: $this->mapping;
  2072. foreach ($mapping as $key => $value) {
  2073. if (strpos($input, $key) !== false) {
  2074. return $value;
  2075. }
  2076. }
  2077. return null;
  2078. }
  2079. }