| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805 |
- <?php
- namespace app\index\controller;
- use think\Request;
- use think\Db;
- //sm4
- use Evit\PhpGmCrypto\Encryption\EvitSM4Encryption;
- class His extends \think\Controller
- {
- //主页
- public function index(){
- //判断用户设备是否是移动端
- if(isMobile() == true){
- $device = 'phone';
- }
- else{
- $device = 'pc';
- }
- //获取当前年份
- $year = date('Y',time());
- //获取公共路径
- $commonURL = commonURL();
- //获取公共路径
- $commonOpenURL = commonOpenURL();
- //获取当前时间
- $now = date('Y-m-d H:i:s',time());
-
- $recContent = db('medical_rec') -> limit(205) -> field('content',true) -> select();
- for($i = 0; $i < count($recContent); $i++){
- $mapPat['pat_visit_info_id'] = array('eq',$recContent[$i]['pat_visit_info_id']);
- $name = db('pat_visit_info') -> where($mapPat) -> value('pat_name');
- $patId = db('pat_visit_info') -> where($mapPat) -> value('pat_id');
- $pageId = db('pat_visit_info') -> where($mapPat) -> value('page_id');
- $recContent[$i]['name'] = mb_substr($name, 0, 1, 'UTF-8') . '**';
- $recContent[$i]['pat_id'] = $patId;
- $recContent[$i]['page_id'] = $pageId;
- }
- $user = request() -> param('user');
-
- //构造请求数据
- return view('index', [
- 'recContent' => $recContent,
- 'device' => $device,
- 'year' => $year,
- 'commonURL' => $commonURL,
- 'now' => $now,
- 'commonOpenURL' => $commonOpenURL,
- 'user' => $user,
- ]);
- }
-
- //整合最终的参数并发起请求
- public function wsRequest(){
- $user = request() -> param('user');
- $patId = request() -> param('patId');
- $pageId = request() -> param('pageId');
- $doc = request() -> param('doc');
- //查询病历唯一标识
- $mapPat['pat_id'] = array('eq',$patId);
- $mapPat['page_id'] = array('eq',$pageId);
- $patVisitId = db('pat_visit_info') -> where($mapPat) -> value('pat_visit_info_id');
- $name = db('pat_visit_info') -> where($mapPat) -> value('pat_name');
- //查询对应的病历原始文本
- $mapRec['pat_visit_info_id'] = array('eq',$patVisitId);
- $mapRec['type_name'] = array('eq',$doc);
- $recContent = db('medical_rec') -> where($mapRec) -> find();
- //自然文本质控
- $recContentInfo = '科室名称:'.$recContent['dept_name'].'。 诊疗文书原文:'.$recContent['content'];
-
- //json文本指控
- $mapRecContent['mr_id'] = array('eq',$recContent['mr_id']);
- $recContentJson = db('medical_rec_content') -> where($mapRecContent) -> select();
- foreach ($recContentJson as &$subarray) {
- // 移除 'id' 和 'mr_id' 键
- unset($subarray['id'], $subarray['mr_id']);
- }
- // 销毁引用以避免潜在问题
- unset($subarray);
- $dept['mr_title'] = '部门';
- $dept['mr_text'] = $recContent['dept_name'];
- $recContentJson[count($recContentJson)] = $dept;
- $recContentJson = json_encode($recContentJson,JSON_UNESCAPED_UNICODE);
-
- //最终输出
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $recContentJson
- ],
- ];
-
- //组装请求的数据为base64格式
- $data['model'] = 'emoon-E2-7B';
- $data['network'] = '1';
- $data['input'] = $recContentFinal;
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
-
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'iRMFdLrIrwV7xiep', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
-
- //创建最终的含有sm4的iv的数据
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = 'Vt8kKsWQqQhkTvhsdwIPYmcaZfPmCJp1';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- //构建最终的请求内容
- $dataRequest['user'] = $user;
- $dataRequest['name'] = mb_substr($name, 0, 1, 'UTF-8') . '**';
- $dataRequest['doc'] = $doc;
- $dataRequest['token'] = $token['token'];
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
- return '已将该「病历原文」发送至「医梦AI客户端」';
- }
-
- //中联web AI质控接口地址
- public function httpRequest(){
- //获取输入的内容
- $json = file_get_contents('php://input');
- $data = json_decode($json, true);
- //{"messages":[ {"role":"user","content":"请问你是什么模型?"}]}
- $message = $data['messages'] ?? null;
-
- //组装请求的数据为base64格式
- $data['model'] = 'deepseek-R1-8B';
- $data['network'] = '2';
- $data['input'] = $message;
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
-
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'sYq9QbK6E1FI2Hi9', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
-
- //创建最终的含有sm4的iv的数据
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = 'l5zI6lwxHLcCQ8LfQRwpvLLNv2WjMbj2';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- //构建最终的请求内容
- $dataRequest['token'] = $token['token'];
- $url = commonOpenURLHTTP();
- $result = curlPost($url,$dataRequest);
- return $result;
- }
-
- //创建实时质控页面
- public function qualityNow(){
- //判断用户设备是否是移动端
- if(isMobile() == true){
- $device = 'phone';
- }
- else{
- $device = 'pc';
- }
- //获取当前年份
- $year = date('Y',time());
- //获取公共路径
- $commonURL = commonURL();
- //获取公共路径
- $commonOpenURL = commonOpenURL();
- //获取当前时间
- $now = date('Y-m-d H:i:s',time());
- $user = request() -> param('user');
- //构造请求数据
- return view('qualityNow', [
- 'device' => $device,
- 'year' => $year,
- 'commonURL' => $commonURL,
- 'now' => $now,
- 'commonOpenURL' => $commonOpenURL,
- 'user' => $user,
- ]);
- }
-
- //创建实时获取病历列表
- public function getDoc(){
- // $data['patId'] = '4213806';
- // $data['pageId'] = '1';
- // $data['patId'] = request() -> param('patId');
- // $data['pageId'] = request() -> param('pageId');
- $url = commonDataURL().'/His/getDoc';
-
- $result = curlPost($url,$data);
- return json($result);
- }
-
- //创建实时获取病历内容
- public function getRec(){
- // $data['mrId'] = '2d26e278-7028-4103-8ba8-1b4625473d35';
- $dataMrId['mrId'] = request() -> param('mrId');
- $urlMrId = commonDataURL().'/His/getRec';
- $result = curlPost($urlMrId,$dataMrId);
- //请求websocket客户端发送数据
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $result
- ],
- ];
-
- //组装请求的数据为base64格式
- $data['model'] = 'emoon-E2-7B';
- $data['network'] = '1';
- $data['input'] = $recContentFinal;
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
-
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'iRMFdLrIrwV7xiep', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
-
- //创建最终的含有sm4的iv的数据
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = 'Vt8kKsWQqQhkTvhsdwIPYmcaZfPmCJp1';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- //构建最终的请求内容
- $user = request() -> param('user');
- $typeName = request() -> param('typeName');
- $name = substr($typeName,0,strpos($typeName, '-'));
- $doc = substr($typeName,strripos($typeName,"-")+1);
- $dataRequest['user'] = $user;
- $dataRequest['name'] = $name;
- $dataRequest['doc'] = $doc;
- $dataRequest['token'] = $token['token'];
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
- return '已将该「病历原文」发送至「医梦AI客户端」';
- }
-
- //his传入参数触发客户端质控
- public function hisOpen(){
- $user = request() -> param('user');
- $patId = request() -> param('patId');
- $pageId = request() -> param('pageId');
- $ragId = request() -> param('ragId');
-
- //获取当前用户的病历列表
- $dataDoc['patId'] = $patId;
- $dataDoc['pageId'] = $pageId;
- $urlGetDoc = commonDataURL().'/His/getDoc';
- $docs = curlPost($urlGetDoc,$dataDoc);
-
- $docsArray = json_decode($docs);
- // dump($docsArray);
- // exit;
- $docsArray = stdClassObjToArray($docsArray);
- $docsJson = json_encode($docsArray,JSON_UNESCAPED_UNICODE);
- //将令牌存储
- $tokenData['info'] = $docsJson;
- $tokenData['time'] = time();
- $docsJsonCut = substr($docsJson, 0, 20);
- $docsCode = md5($docsJsonCut.time().rand(10000,99999));
- $tokenData['token'] = $docsCode;
- // dump($docs);
- // exit;
- $urlGetIntel = commonDataURL().'/His/getintel';
- $dataIntel = curlPost($urlGetIntel,$dataDoc);
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
- $dataIntel = json_encode($dataIntel,JSON_UNESCAPED_UNICODE);
- $tokenData['intel'] = $dataIntel;
-
-
- db('token') -> insert($tokenData);
- // dump($tokenData);
- // exit;
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
- // dump($tokenData);
- // exit;
- //跳转chatbox
- if($ragId != null){
- $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode.'&ragId='.$ragId;
- }
- else{
- $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode;
- }
- $this -> redirect($url);
-
- }
-
- //his传入参数触发客户端质控
- public function hisOpendemo(){
- $user = request() -> param('user');
- $patId = request() -> param('patId');
- $pageId = request() -> param('pageId');
- $ragId = request() -> param('ragId');
-
- //获取当前用户的病历列表
- $dataDoc['patId'] = $patId;
- $dataDoc['pageId'] = $pageId;
- $urlGetDoc = commonDataURL().'/His/getDoc';
- $docs = curlPost($urlGetDoc,$dataDoc);
-
- $docsArray = json_decode($docs);
- // dump($docsArray);
- // exit;
- $docsArray = stdClassObjToArray($docsArray);
- $docsJson = json_encode($docsArray,JSON_UNESCAPED_UNICODE);
- //将令牌存储
- $tokenData['info'] = $docsJson;
- $tokenData['time'] = time();
- $docsJsonCut = substr($docsJson, 0, 20);
- $docsCode = md5($docsJsonCut.time().rand(10000,99999));
- $tokenData['token'] = $docsCode;
- // dump($docs);
- // exit;
- $urlGetIntel = commonDataURL().'/His/getintel';
- $dataIntel = curlPost($urlGetIntel,$dataDoc);
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
- $dataIntel = json_encode($dataIntel,JSON_UNESCAPED_UNICODE);
- $tokenData['intel'] = $dataIntel;
-
-
- db('token') -> insert($tokenData);
- // dump($tokenData);
- // exit;
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
- // dump($tokenData);
- // exit;
- //跳转chatbox
- if($ragId != null){
- $url = commonURL().'/Index/chatBox1?user='.$user.'&docsCode='.$docsCode;
- }
- else{
- $url = commonURL().'/Index/chatBox1?user='.$user.'&docsCode='.$docsCode;
- }
- $this -> redirect($url);
-
- }
-
- public function hisOpen3(){
- $user = request() -> param('user');
- $patId = request() -> param('patId');
- $pageId = request() -> param('pageId');
- $ragId = request() -> param('ragId');
- // $ragId="1968853249568628738";
- //获取当前用户的病历列表
- $dataDoc['patId'] = $patId;
- $dataDoc['pageId'] = $pageId;
- $urlGetDoc = commonDataURL().'/His/getDoc';
- $docs = curlPost($urlGetDoc,$dataDoc);
- $docsArray = json_decode($docs);
- $docsArray = stdClassObjToArray($docsArray);
- $docsJson = json_encode($docsArray,JSON_UNESCAPED_UNICODE);
- // dump($docsJson);
- // exit;
- //将令牌存储
- $tokenData['info'] = $docsJson;
- $tokenData['time'] = time();
- $docsJsonCut = substr($docsJson, 0, 20);
- $docsCode = md5($docsJsonCut.time().rand(10000,99999));
- $tokenData['token'] = $docsCode;
-
- $urlGetIntel = commonDataURL().'/His/getintel';
- $dataIntel = curlPost($urlGetIntel,$dataDoc);
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
- $dataIntel = json_encode($dataIntel,JSON_UNESCAPED_UNICODE);
- $tokenData['intel'] = $dataIntel;
- dump($dataIntel);
- exit;
-
- db('token') -> insert($tokenData);
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
- //跳转chatbox
- if($ragId != null){
- $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode.'&ragId='.$ragId;
- }
- else{
-
- $url = commonURL().'/Index/chatBox?user='.$user.'&docsCode='.$docsCode;
- }
- $this -> redirect($url);
-
- }
-
- //接受hisOpen发送过来的病历列表并推送
- public function hisOpenPush(){
- // $user = 6666;
- $user = request() -> param('user');
- $docsCode = request() -> param('docsCode');
- // $docsCode = "2fa0e00ffd00d6e92b04a24bbd6dac1d";
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
- $dataIntel = db('token') -> where($mapToken) -> value('intel');
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
-
- $tokenrole['pat_name'] = $dataIntel['pat_name'];
- $tokenrole['out_num'] = $dataIntel['out_num'];
- $tokenrole['in_num'] = $dataIntel['in_num'];
- $tokenrole['id_num'] = $dataIntel['id_num'];
- // return $docsJson;
- if(!$docsJson){
- return json('客户端短令牌错误!');
- }
-
- $docsArray = json_decode($docsJson);
- $docsArray = stdClassObjToArray($docsArray);
- // dump($docsJson);
- // exit;
- //通过病历列表获取病历原文
- for($i = 0; $i < count($docsArray); $i++){
- $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
- $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
- //请求病历原文
- $mrId = $docsArray[$i]["MR_ID"];
- $dataMrId['mrId'] = $mrId;
- $urlMrId = commonDataURL().'/His/getRec';
- $recs = curlPost($urlMrId,$dataMrId);
- $recs = json_decode($recs);
- $recs = stdClassObjToArray($recs);
- $keshi = $recs[count($recs)-1]['mr_text'];
- $tokenrole['DEPT_NAME'] = $keshi;
- $dataFinal = '';
- for($r=0;$r<count($recs);$r++){
- $dataFinal = $dataFinal.$recs[$r]["mr_title"].":".$recs[$r]["mr_text"]."brbr";
- }
- $recs[count($recs)]['mr_title'] = '标题';
- $recs[count($recs)-1]['mr_text'] = $docName;
- // $dataFinal = json_encode($recs,JSON_UNESCAPED_UNICODE);
- $map['emr'] = array('eq', $docName);
- $rulename = db('rulecounter')->where($map)->value('rulepath');
- if($rulename != null){
- $maprule['rulepath'] = array('like', '%'.$rulename.'%');
- // $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');
- $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');
- $maprule['ruleid'] = array('in', $ruleIdArray);
- $rulename = db('rulefinal')->where($maprule)->select();
- //dump(count($rulename));
- //exit;
- // //查询某一列数据
- // $rule = db('User')->column('name');
- for($j=0;$j<count($rulename);$j++){
- if($rulename[$j]['ruledetail'] == '暂无'){
- $rulename[$j]['ruledetail'] = '';
- }
-
- // $dataFinalcount = "你是一名专业的医疗病历质控员,请根据以下内容进行病历质控审查。\n";
- // $dataFinalcount .= "当前病历名称如下:\n{$docName}\n\n";
- // $dataFinalcount .= "当前病历原文如下:\n{$dataFinal}\n\n";
- // $dataFinalcount .= "质控规则如下:\n".$rulename[$j]['ruletype'].$rulename[$j]['ruledetail']."\n\n";
- // $dataFinalcount .= "请按照上述规则,判断当前病历是否符合质控要求。\n\n";
- // $dataFinalcount .= "如果病历完全符合所有规则,请严格输出以下内容:\n";
- // $dataFinalcount .= "
- // 【规则名称】质控的哪条规则
- // 【质控结果】病例校验通过。'\n\n";
- // $dataFinalcount .= "如果存在不符合规则的情况,请按以下格式逐条输出违规项,\n";
- // $dataFinalcount .= "不符合规则的列举格式如下,严格模仿以下结构输出:\n";
- // $dataFinalcount .= "【规则名称】列出违反了哪条规则\n\n";
- // $dataFinalcount .= "【质控结果】简要描述为什么违反了此条规则\n\n";
- // $dataFinalcount .= "\n\n注意事项:\n";
- // $dataFinalcount .= "1. 若有违规,按格式逐条列出,必须包含【规则名称】【质控结果】两个字段,最多只能输出一次。\n";
- // $dataFinalcount .= "2. 每个字段独占一行,使用【】标注字段名,后接内容,不加冒号或其他符号。\n";
- // $dataFinalcount .= "3. 禁止添加解释、总结、问候语或额外说明。\n";
- $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【质控原文】:(规则质控的具体原文的标题【‘:’前的文字。】,例如(主诉),严格输出原文的标题,不要输出其他内容,不能有任何偏差,)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释。";
- // exit;
- // dump($dataFinalcount.'-----------------------------------------------------');
- // exit;
- // $dataFinalcount = '我需要你扮演一位专业医疗病历质控员,现在要进行病历质控。下面是一份'.$docName.'病历,当前病历原文为:\n'.$dataFinal.'n请按照这个规则:\"'.$rule[$j]["ruletype"].$rule[$j]["ruledetail"].'\",为我判断当前病历原文是否正确。如果正确,请返回:\"病例校验结果:病例校验通过。\",详细分析质控过程并说明原因;如果不正确,请返回:\"病例校验结果:'.$rule[$j]['ruletype'].".".$rule[$j]['ruledetail'].'\",详细分析质控过程并说明原因。仅把返回结果放在</answer>和<answer>之间。"';
-
-
- //请求websocket客户端发送数据
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $dataFinalcount
- ],
- ];
- //组装请求的数据为base64格式
- $data = [];
- $data['model'] = 'gstcm-G1-14B';
- $data['network'] = '2';
- $data['input'] = $recContentFinal;
-
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
- //创建最终的含有sm4的iv的数据
- $modifiedData = [];
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- //推送消息至websocket
- $dataRequest['user'] = $user;
- $num = $i + 1;
- $dataRequest['name'] = $name;
- $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
- $dataRequest['doc'] = $docName;
- $dataRequest['token'] = $token['token'];
- $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
- $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
-
- $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
- $tokenrole['token'] = $token['token'];
- $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
- $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
- $tokenrole['content'] = $dataFinal;
- $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
- $tokenrole['keywords'] = $rulename[$j]['keywords'];
-
- if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
- $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
- }
- $tokenrole['time'] = time();
- db('tokenrole') -> insert($tokenrole);
- // dump($tokenrole);
- // exit;
-
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
-
- }
- }
- sleep(1);
- }
- return 'success';
-
- }
-
-
- //测试样例
- public function hisOpenPushMedical5(){
- $user = request() -> param('user');
- $docsCode = request() -> param('docsCode');
- $ragId = request() -> param('ragId');
-
- $mapclient['user'] = array('eq',$user);
- $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
- $strate = db('client') -> where($mapclient) -> value('strate');
- if($messageQueue != 0){
- return;
- }
- if($messageQueue != 0 && $strate == 0){
- return;
- }
- // $ragId ="1970054015201382402";
- // $ragId ="1970054015201382rqqww402";
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
- $dataIntel = db('token') -> where($mapToken) -> value('intel');
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
-
- $tokenrole['pat_name'] = $dataIntel['pat_name'];
- $tokenrole['out_num'] = $dataIntel['out_num'];
- $tokenrole['in_num'] = $dataIntel['in_num'];
- $tokenrole['id_num'] = $dataIntel['id_num'];
- // return $docsJson;
- if(!$docsJson){
- return json('客户端短令牌错误!');
- }
-
- $docsArray = json_decode($docsJson);
- $docsArray = stdClassObjToArray($docsArray);
-
- // dump($docsJson);
- // exit;
- //通过病历列表获取病历原文
- for($i = 0; $i < count($docsArray); $i++){
- $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
- $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
- //请求病历原文
- $mrId = $docsArray[$i]["MR_ID"];
- $dataMrId['mrId'] = $mrId;
- $urlMrId = commonDataURL().'/His/getMedicalRec';
- $recs = curlPost($urlMrId,$dataMrId);
- $recs = json_decode($recs);
- $recs = stdClassObjToArray($recs);
- // dump($recs);
- // exit;
- $keshi = $recs[1]['mr_text'];
- $tokenrole['DEPT_NAME'] = $keshi;
- $dataFinal = $recs[0];
-
- $recs[1]['mr_title'] = '标题';
- $recs[1]['mr_text'] = $docName;
- if($ragId!=null){
- $dataRag['input'] = $docName;
- $dataRag['kid'] = $ragId;
-
- // dump($docName);
-
- $urlRAG = 'http://192.168.10.115:3338/apis/ragData';
- $ragResult = curlPost($urlRAG,$dataRag);
- $ragResult = json_decode($ragResult);
- $ragResult = stdClassObjToArray($ragResult);
-
- if(array_key_exists('code', $ragResult)){
- }
- else{
- if($ragResult["nearest"]!=null){
- // dump($ragResult);
- $rulesArray = preg_split('/\s*(?=规则编号:)/', $ragResult["nearest"][0]["text"], -1, PREG_SPLIT_NO_EMPTY);
- // dump($rulesArray);
- // exit;
- // 去除每个规则文本前后的空白字符
- $rulesArray = array_map('trim', $rulesArray);
- for($j=1;$j<count($rulesArray);$j++){
-
- preg_match('/规则编号:(.*?)\s*规则详情:\s*(.*?)\s*规则描述:\s*(.*?)\s*扣分标准:\s*([\d.]+)/s', $rulesArray[$j], $matches);
-
- // 存储到数组中
- $ruleData = [
- 'ruleid' => isset($matches[1]) ? trim($matches[1]) : '',
- 'ruletype' => isset($matches[2]) ? trim($matches[2]) : '',
- 'ruledetail' => isset($matches[3]) ? trim($matches[3]) : '',
- 'rulescore' => isset($matches[4]) ? floatval(trim($matches[4])) : 0.0
- ];
- $signers = $recs[2];
- $signerNames = array();
- foreach ($signers as $signer) {
- if (isset($signer['SIGNER'])) {
- $signerNames[] = $signer['SIGNER'];
- }
- }
-
- $signerIndex = 0;
-
- $newDataFinal = preg_replace_callback(
- '/(签名:)(\s*)/',
- function($matches) use (&$signerIndex, $signerNames) {
- // 如果超过数组长度,使用最后一个签名者
- $name = ($signerIndex < count($signerNames))
- ? $signerNames[$signerIndex]
- : end($signerNames);
-
- $signerIndex++;
- return $matches[1] . $name . $matches[2];
- },
- $dataFinal
- );
- // $newDataFinal = preg_replace('/(签名:)(\s*)/', "签名:".$recs[2][0]["SIGNER"], $dataFinal);
- $dataFinalcount ="你是一名专业的医疗病历质控员,请根据以下内容严格按照质控规则进行病历质控审查。下面是一份".$docName."病历,当前病历原文为:\n".$newDataFinal."\n请按照这个规则: ".$rulesArray[$j].") 为我判断当前病历原文是否正确,严格按照质控规则进行质控,禁止增添质控规则外的内容。如果正确,请返回:'【规则名称】: (对应的规则详情,不是规则编号)\n【质控结果】:病例校验通过。';如果不正确,请返回: '【规则名称】:(对应的规则名称或者规则详情) \n【质控结果】:病例校验不通过\n【不通过原因】:(简要概述不通过的原因)',严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出()内的内容,当质控签名时,只要有任何一个签名,就判断质控结果为通过。";
-
- // dump($dataFinalcount);
- // exit;
- //请求websocket客户端发送数据
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $dataFinalcount
- ],
- ];
- //组装请求的数据为base64格式
- $data = [];
- $data['model'] = 'gstcm-G1-14B';
- $data['network'] = '2';
- $data['input'] = $recContentFinal;
-
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
- //创建最终的含有sm4的iv的数据
- $modifiedData = [];
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- //推送消息至websocket
- $dataRequest['user'] = $user;
- $num = $i + 1;
- $dataRequest['name'] = $name;
- $dataRequest['rule'] = $ruleData['ruletype'].$ruleData['ruledetail'];
- $dataRequest['doc'] = $docName;
- $dataRequest['token'] = $token['token'];
- $dataRequest['ruleid'] = $ruleData['ruleid'];
- $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
-
- $tokenrole['rulescore'] = $ruleData['rulescore'];//规则扣分
- $tokenrole['token'] = $token['token'];
- $tokenrole['ruleid'] = $ruleData['ruleid']; //规则ID
- $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
- $tokenrole['content'] = $dataFinal;
- $tokenrole['ruletype'] = $ruleData['ruletype'];//规则类型
- $tokenrole['keywords'] = "";
- $tokenrole['ruledetail'] = ''.$ruleData['ruledetail'];//规则详情
-
-
- $tokenrole['time'] = time();
- db('tokenrole') -> insert($tokenrole);
-
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
-
- }
- }
- }
- }
-
- $mapName['emr'] = array('eq', $docName);
- $rulename = db('rulecounter')->where($mapName)->value('rulepath');
-
- if($rulename != null){
- $maprule['rulepath'] = array('like', '%'.$rulename.'%');
- $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');
- $maprule['ruleid'] = array('in', $ruleIdArray);
- $rulename = db('rulefinal')->where($maprule)->select();
- $rulename = stdClassObjToArray($rulename);
-
- for($j=0;$j<count($rulename);$j++){
- if($rulename[$j]['ruledetail'] == '暂无'){
- $rulename[$j]['ruledetail'] = '';
- }
- $ruleId = $rulename[$j]['ruleid'];
-
-
- $mapmultirule['ruleid'] = array('eq', $ruleId);
- // $mapmultirule['ruleid'] = array('eq', "RYJLXBS0014");
- $multirule = db('multirule')->where($mapmultirule)->select();
- $multirule = stdClassObjToArray($multirule);
-
-
- $docNamepath="";
- for($g = 0; $g < count($multirule); $g++){
- if($g>=1){
- $docNamepath .= "、";
- }
- $docNamepath.=$multirule[$g]["medicalreport"];
- }
-
- $multipleCases="";
- for($q = 0; $q < count($multirule); $q++){
- for($g = 0; $g < count($docsArray); $g++){
- if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
- $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
- $urlMrId = commonDataURL().'/His/getMedicalRec';
- $recs = curlPost($urlMrId,$dataMrId);
- $recs = json_decode($recs);
- $recs = stdClassObjToArray($recs);
- $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
-
-
- }
- }
- }
-
- $signers = $recs[2];
- $signerNames = array();
- foreach ($signers as $signer) {
- if (isset($signer['SIGNER'])) {
- $signerNames[] = $signer['SIGNER'];
- }
- }
-
- $signerIndex = 0;
-
- $newMultipleCases = preg_replace_callback(
- '/(签名:)(\s*)/',
- function($matches) use (&$signerIndex, $signerNames) {
- // 如果超过数组长度,使用最后一个签名者
- $name = ($signerIndex < count($signerNames))
- ? $signerNames[$signerIndex]
- : end($signerNames);
-
- $signerIndex++;
- return $matches[1] . $name . $matches[2];
- },
- $multipleCases
- );
- $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【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
-
- //请求websocket客户端发送数据
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $dataFinalcount
- ],
- ];
- // dump($dataFinalcount);
- //组装请求的数据为base64格式
- $data = [];
- $data['model'] = 'gstcm-G1-14B';
- $data['network'] = '2';
- $data['input'] = $recContentFinal;
-
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
- //创建最终的含有sm4的iv的数据
- $modifiedData = [];
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- //推送消息至websocket
- $dataRequest['user'] = $user;
- $dataRequest['name'] = $name;
- $dataRequest['rule'] = $rulename[$j]['ruletype'].$rulename[$j]['ruledetail'];
- $dataRequest['doc'] = $docName;
- $dataRequest['token'] = $token['token'];
- $dataRequest['ruleid'] = $rulename[$j]['ruleid'];
- $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
-
- $tokenrole['rulescore'] = $rulename[$j]['rulescore'];
- $tokenrole['token'] = $token['token'];
- $tokenrole['ruleid'] = $rulename[$j]['ruleid'];
- $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
- $tokenrole['content'] = $dataFinal;
- $tokenrole['ruletype'] = $rulename[$j]['ruletype'];
- $tokenrole['keywords'] = $rulename[$j]['keywords'];
- if($rulename[$j]['ruletype'] != null or $rulename[$j]['ruletype'] !='暂无'){
- $tokenrole['ruledetail'] = ''.$rulename[$j]['ruledetail'];
- }
-
-
- $tokenrole['time'] = time();
- db('tokenrole') -> insert($tokenrole);
- // dump($tokenrole);
- // exit;
-
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
-
- }
- // exit;
- }
- sleep(1);
- }
- return 'success';
-
- }
- //测试样例新版
- public function hisOpenPushMedical(){
- $user = request() -> param('user');
- $docsCode = request() -> param('docsCode');
- $ragId = request() -> param('ragId');
- // $user = "6666";
- $mapclient['user'] = array('eq',$user);
- $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
- $strate = db('client') -> where($mapclient) -> value('strate');
- if($messageQueue != 0){
- return;
- }
- if($messageQueue != 0 && $strate == 0){
- return;
- }
- // $ragId ="1970054015201382402";
- // $ragId ="1970054015201382rqqww402";
- // $docsCode = "1d87d33a8d7339845010c94802c3bbe3";
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
-
- $dataIntel = db('token') -> where($mapToken) -> value('intel');
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
-
- $tokenrole['pat_name'] = $dataIntel['pat_name'];
- $tokenrole['out_num'] = $dataIntel['out_num'];
- $tokenrole['in_num'] = $dataIntel['in_num'];
- $tokenrole['id_num'] = $dataIntel['id_num'];
- $tokenrole['pat_id'] = $dataIntel['pat_id'];
- // return $docsJson;
- if(!$docsJson){
- return json('客户端短令牌错误!');
- }
-
- $docsArray = json_decode($docsJson);
- $docsArray = stdClassObjToArray($docsArray);
-
- $mapping = [
- "病案首页" => "0",
- "入院记录" => "1",
- "首次病程记录" => "2",
- "阶段小结" => "3",
- "日常病程记录" => "4",
- "上级医师查房记录" => "5",
- "会诊记录" => "6",
- "术前讨论" => "7",
- "麻醉记录" => "8",
- "有创操作记录" => "9",
- "术后病程记录" => "10",
- "检查检验记录" => "11",
- "护理记录" => "12",
- "评分表" => "13",
- "交接班记录" => "14",
- "抢救记录" => "15",
- "死亡记录" => "16",
- "出入转记录" => "17",
- ];
- $mapping1 = [
- "病案首页" => "0",
- "入院记录" => "1",
- "首次病程记录" => "2",
- "阶段小结" => "3",
- "日常病程记录" => "4",
- "上级医师查房记录" => "5",
- "会诊记录" => "6",
- "术前讨论" => "7",
- "麻醉记录" => "8",
- "有创操作记录" => "9",
- "术后病程记录" => "10",
- "检查检验记录" => "11",
- "护理记录" => "12",
- "评分表" => "13",
- "交接班记录" => "14",
- "抢救记录" => "15",
- "死亡记录" => "16",
- "出入转记录" => "17",
- ];
-
- //通过病历列表获取病历原文
- for($i = 0; $i < count($docsArray); $i++){
- $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
- $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
- //请求病历原文
- $mrId = $docsArray[$i]["MR_ID"];
- $dataMrId['mrId'] = $mrId;
- $urlMrId = commonDataURL().'/His/getMedicalRec';
-
- $recs = curlPost($urlMrId,$dataMrId);
- $recs = json_decode($recs);
- $recs = stdClassObjToArray($recs);
- // dump("====================");
- // dump($recs);
-
- // dump($recs);
- // exit;
- $keshi = $recs[1]['mr_text'];
- $tokenrole['DEPT_NAME'] = $keshi;
- $dataFinal = $recs[0];
-
- $recs[1]['mr_title'] = '标题';
- $recs[1]['mr_text'] = $docName;
- // dump($docName);
- $mapName['emr'] = array('eq', $docName);
- $rulename = db('rulecounter')->where($mapName)->value('rulepath');
-
- if($rulename != null){
- // $mapqcStage['qc_type_list'] = array('like', '%'.$mapping[$rulename].'%');
- // $mapqcStage['qc_behavior'] = array('eq', 'common');
- // //质控阶段与病例类型筛选后的规则
- // $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
- // $qcruleStage = stdClassObjToArray($qcruleStage);
- // dump($qcruleStage);
- // exit;
- $qcrulelink = db('quality_control_rule_sz')->select();
- $qcTypeList = [];
-
- if (array_key_exists($rulename, $mapping)) {
- //筛选质控病历类型所对应的参数。
- for($z = 0; $z < count($qcrulelink) ; $z++){
- // $qcrulelink[$i];
- // dump($qcrulelink[$i]["qc_type_list"]);
- $TypeList = json_decode($qcrulelink[$z]["qc_type_list"]);
- // 检查qcType是否在TypeList中
- if (is_array($TypeList) && in_array($mapping[$rulename], $TypeList)) {
- // 将对应的rule_code添加到qcTypeList数组中
- $qcTypeList[] = $qcrulelink[$z]["rule_code"];
- }
-
- }
- }
- $mapqcStage['rule_code'] = array('in', $qcTypeList);
- $mapqcStage['qc_behavior'] = array('eq', 'common');
- $mapqcStage['qc_stage'] = array('eq', 'PostEvent');
- $mapqcStage['is_enabled'] = array('eq', 1);
- //质控阶段与病例类型筛选后的规则
- $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
- // dump($qcruleStage);
- // exit;
- //规则适配的病例类型
- // $qcTypeList = $qcruleStage[0]["qc_type_list"];
- // $qcTypeList = json_decode($qcTypeList);
- // $qcTypeList = stdClassObjToArray($qcTypeList);
- $dataRag['medicalContent'] = $dataFinal;
- $dataRag['kid'] = 'Rule_Final';
-
- for($j=0;$j<count($qcruleStage);$j++){
- $ruleCode = $qcruleStage[$j]['rule_code'];
- $dataRag['ruleCode'] = $ruleCode;
-
- $urlRAG = 'http://192.168.10.115:3338/apis/ragDataMCQC';
- $ragResult = curlPost($urlRAG,$dataRag);
- $ragResult = json_decode($ragResult);
- $ragResult = stdClassObjToArray($ragResult);
-
- //医师签名
- $signers = $recs[2];
- $signerNames = array();
- foreach ($signers as $signer) {
- if (isset($signer['SIGNER'])) {
- $signerNames[] = $signer['SIGNER'];
- }
- }
- $signerIndex = 0;
- //将签名组装到病历里。
- $newMultipleCases = preg_replace_callback(
- '/(签名:)(\s*)/',
- function($matches) use (&$signerIndex, $signerNames) {
- // 如果超过数组长度,使用最后一个签名者
- $name = ($signerIndex < count($signerNames))
- ? $signerNames[$signerIndex]
- : end($signerNames);
-
- $signerIndex++;
- return $matches[1] . $name . $matches[2];
- },
- $dataFinal
- );
- // dump($dataFinal);
- // dump($newMultipleCases);
- // exit;
- // $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【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
- if(count($ragResult["data"]) != 0){
- //正确示例
- $PoExample = "";
- //错误示例
- $ErExample = "";
- for($Example = 0 ;$Example<count($ragResult["data"]);$Example++){
- if($ragResult["data"][$Example]["type"] == "positive"){
- $PoExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
- }
- else{
- $ErExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
- }
- }
- // dump($PoExample);
- // dump($ErExample);
-
- $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
- 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
- 请严格基于【病历原文】判断是否违反该规则。
- ***【质控规则】***
- 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
- 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
- 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
- ***【参考内容】***
- 正例(符合要求的写法):\n
- ".$PoExample."\n
- 反例(不符合要求的写法):\n
- ".$ErExample."\n
- ===【病历原文】===
- 以下为".$docName."部分:
- \n".$newMultipleCases."\n
- ===【输出要求】===
- 请严格以下列格式输出,不得输出解释性文字或额外内容。
-
- 如果病历完全符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验通过。
-
- 如果存在不符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验不通过\n
- 【不通过原因】:(简要概述不通过的原因)
- 【规则关键字】:违规位置及所属内容(必须只有一个关键字,如 ‘主诉’)',
-
- ===【注意事项】===
- - 严禁输出 Markdown 代码块(如 ```json)
- - 严禁输出解释性文字、分析过程或无关说明
- - 不得引用或复述【参考内容】中的文字
- - 若规则不适用于当前病历内容,应视为通过
- - 所有结论必须严格基于【病历原文】内容
- -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
- ";
-
-
- }
- else{
- $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
- 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
- 请严格基于【病历原文】判断是否违反该规则。
- ***【质控规则】***
- 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
- 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
- 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
- ===【病历原文】===
- 以下为".$docName."部分:
- \n".$newMultipleCases."\n
- ===【输出要求】===
- 请严格以下列格式输出,不得输出解释性文字或额外内容。
-
- 如果病历完全符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验通过。
-
- 如果存在不符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验不通过\n
- 【不通过原因】:(简要概述不通过的原因)\n
- 【规则关键字】:违规位置及内容(必须只有一个关键字,如 ‘主诉’)'
- ===【注意事项】===
- - 严禁输出 Markdown 代码块(如 ```json)
- - 严禁输出解释性文字、分析过程或无关说明
- - 若规则不适用于当前病历内容,应视为通过
- - 所有结论必须严格基于【病历原文】内容
- -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
- ";
- }
- // dump($dataFinalcount);
- // exit;
-
- //请求websocket客户端发送数据
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $dataFinalcount
- ],
- ];
- // dump($dataFinalcount);
- //组装请求的数据为base64格式
- $data = [];
- $data['model'] = 'gstcm-G1-14B';
- $data['network'] = '2';
- $data['input'] = $recContentFinal;
-
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
- //创建最终的含有sm4的iv的数据
- $modifiedData = [];
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- // dump($recContentFinal);
- // exit;
- //推送消息至websocket
- $dataRequest['user'] = $user;
- $dataRequest['name'] = $name;
- $dataRequest['rule'] = $qcruleStage[$j]['rule_content'];
- $dataRequest['doc'] = $docName;
- $dataRequest['token'] = $token['token'];
- $dataRequest['ruleid'] = $qcruleStage[$j]['rule_code'];
- $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
-
- $tokenrole['token'] = $token['token'];
- $tokenrole['ruleid'] = $qcruleStage[$j]['rule_code'];
- $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
- $tokenrole['content'] = $dataFinal;
- $tokenrole['ruletype'] = $qcruleStage[$j]['category'];
- $tokenrole['ruledetail'] = $qcruleStage[$j]['rule_content'];
- // dump($tokenrole);
- // exit;
- $tokenrole['time'] = time();
- db('tokenrole') -> insert($tokenrole);
- // dump($tokenrole);
- // exit;
-
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
-
- }
-
- }
- // // exit;
- //多病例融合
- // $docNamepath="";
- // for($g = 0; $g < count($multirule); $g++){
- // if($g>=1){
- // $docNamepath .= "、";
- // }
- // $docNamepath.=$multirule[$g]["medicalreport"];
- // }
-
- // $multipleCases="";
- // for($q = 0; $q < count($multirule); $q++){
- // for($g = 0; $g < count($docsArray); $g++){
- // if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
- // $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
- // $urlMrId = commonDataURL().'/His/getMedicalRec';
- // $recs = curlPost($urlMrId,$dataMrId);
- // $recs = json_decode($recs);
- // $recs = stdClassObjToArray($recs);
- // $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
-
-
- // }
- // }
- // }
- }
- // sleep(1);
-
- return 'success';
-
- }
- //测试样例新版
- public function hisOpenPushMedical_test(){
- $user = request() -> param('user');
- $docsCode = request() -> param('docsCode');
- $ragId = request() -> param('ragId');
- $user = "6666";
- $mapclient['user'] = array('eq',$user);
- $messageQueue = db('client') -> where($mapclient) -> value('messageQueue');
- $strate = db('client') -> where($mapclient) -> value('strate');
- if($messageQueue != 0){
- return;
- }
- if($messageQueue != 0 && $strate == 0){
- return;
- }
- // $ragId ="1970054015201382402";
- // $ragId ="1970054015201382rqqww402";
- $docsCode = "1a9bdc6db24a14fb1698cf854933dca5";
- $mapToken['token'] = array('eq',$docsCode);
- $docsJson = db('token') -> where($mapToken) -> value('info');
-
- $dataIntel = db('token') -> where($mapToken) -> value('intel');
- $dataIntel = json_decode($dataIntel);
- $dataIntel = stdClassObjToArray($dataIntel);
-
- $tokenrole['pat_name'] = $dataIntel['pat_name'];
- $tokenrole['out_num'] = $dataIntel['out_num'];
- $tokenrole['in_num'] = $dataIntel['in_num'];
- $tokenrole['id_num'] = $dataIntel['id_num'];
- $tokenrole['pat_id'] = $dataIntel['pat_id'];
-
- // return $docsJson;
- // dump($dataIntel);
- // exit;
- if(!$docsJson){
- return json('客户端短令牌错误!');
- }
-
- $docsArray = json_decode($docsJson);
- $docsArray = stdClassObjToArray($docsArray);
-
- $mapping = [
- "病案首页" => "0",
- "入院记录" => "1",
- "首次病程记录" => "2",
- "阶段小结" => "3",
- "日常病程记录" => "4",
- "上级医师查房记录" => "5",
- "会诊记录" => "6",
- "术前讨论" => "7",
- "麻醉记录" => "8",
- "有创操作记录" => "9",
- "术后病程记录" => "10",
- "检查检验记录" => "11",
- "护理记录" => "12",
- "评分表" => "13",
- "交接班记录" => "14",
- "抢救记录" => "15",
- "死亡记录" => "16",
- "出入转记录" => "17",
- ];
- $mapping1 = [
- "病案首页" => "0",
- "入院记录" => "1",
- "首次病程记录" => "2",
- "阶段小结" => "3",
- "日常病程记录" => "4",
- "上级医师查房记录" => "5",
- "会诊记录" => "6",
- "术前讨论" => "7",
- "麻醉记录" => "8",
- "有创操作记录" => "9",
- "术后病程记录" => "10",
- "检查检验记录" => "11",
- "护理记录" => "12",
- "评分表" => "13",
- "交接班记录" => "14",
- "抢救记录" => "15",
- "死亡记录" => "16",
- "出入转记录" => "17",
- ];
-
- //通过病历列表获取病历原文
- for($i = 0; $i < count($docsArray); $i++){
- $name = substr($docsArray[$i]['TYPE_NAME'],0,strpos($docsArray[$i]['TYPE_NAME'], '-'));
- $docName = substr($docsArray[$i]['TYPE_NAME'],strripos($docsArray[$i]['TYPE_NAME'],"-")+1);
- //请求病历原文
- $mrId = $docsArray[$i]["MR_ID"];
- $dataMrId['mrId'] = $mrId;
- $urlMrId = commonDataURL().'/His/getMedicalRec';
-
- $recs = curlPost($urlMrId,$dataMrId);
- $recs = json_decode($recs);
- $recs = stdClassObjToArray($recs);
- // dump("====================");
- // dump($recs);
-
- // dump($recs);
- // exit;
- $keshi = $recs[1]['mr_text'];
- $tokenrole['DEPT_NAME'] = $keshi;
- $dataFinal = $recs[0];
-
- $recs[1]['mr_title'] = '标题';
- $recs[1]['mr_text'] = $docName;
- // dump($docName);
- $mapName['emr'] = array('eq', $docName);
- $rulename = db('rulecounter')->where($mapName)->value('rulepath');
-
- if($rulename != null){
- // $mapqcStage['qc_type_list'] = array('like', '%'.$mapping[$rulename].'%');
- // $mapqcStage['qc_behavior'] = array('eq', 'common');
- // //质控阶段与病例类型筛选后的规则
- // $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
- // $qcruleStage = stdClassObjToArray($qcruleStage);
- // dump($qcruleStage);
- // exit;
- $qcrulelink = db('quality_control_rule_sz')->select();
- $qcTypeList = [];
-
- if (array_key_exists($rulename, $mapping)) {
- //筛选质控病历类型所对应的参数。
- for($z = 0; $z < count($qcrulelink) ; $z++){
- // $qcrulelink[$i];
- // dump($qcrulelink[$i]["qc_type_list"]);
- $TypeList = json_decode($qcrulelink[$z]["qc_type_list"]);
- // 检查qcType是否在TypeList中
- if (is_array($TypeList) && in_array($mapping[$rulename], $TypeList)) {
- // 将对应的rule_code添加到qcTypeList数组中
- $qcTypeList[] = $qcrulelink[$z]["rule_code"];
- }
-
- }
- }
- $mapqcStage['rule_code'] = array('in', $qcTypeList);
- $mapqcStage['qc_behavior'] = array('eq', 'common');
- $mapqcStage['qc_stage'] = array('eq', 'PostEvent');
- $mapqcStage['is_enabled'] = array('eq', 1);
- //质控阶段与病例类型筛选后的规则
- $qcruleStage = db('quality_control_rule_sz')->where($mapqcStage)->select();
- dump($qcruleStage);
- exit;
- //规则适配的病例类型
- // $qcTypeList = $qcruleStage[0]["qc_type_list"];
- // $qcTypeList = json_decode($qcTypeList);
- // $qcTypeList = stdClassObjToArray($qcTypeList);
- $dataRag['medicalContent'] = $dataFinal;
- $dataRag['kid'] = 'Rule_Final';
-
- for($j=0;$j<count($qcruleStage);$j++){
- $ruleCode = $qcruleStage[$j]['rule_code'];
- $dataRag['ruleCode'] = $ruleCode;
-
- $urlRAG = 'http://192.168.10.115:3338/apis/ragDataMCQC';
- $ragResult = curlPost($urlRAG,$dataRag);
- $ragResult = json_decode($ragResult);
- $ragResult = stdClassObjToArray($ragResult);
-
- //医师签名
- $signers = $recs[2];
- $signerNames = array();
- foreach ($signers as $signer) {
- if (isset($signer['SIGNER'])) {
- $signerNames[] = $signer['SIGNER'];
- }
- }
- $signerIndex = 0;
- //将签名组装到病历里。
- $newMultipleCases = preg_replace_callback(
- '/(签名:)(\s*)/',
- function($matches) use (&$signerIndex, $signerNames) {
- // 如果超过数组长度,使用最后一个签名者
- $name = ($signerIndex < count($signerNames))
- ? $signerNames[$signerIndex]
- : end($signerNames);
-
- $signerIndex++;
- return $matches[1] . $name . $matches[2];
- },
- $dataFinal
- );
- // dump($dataFinal);
- // dump($newMultipleCases);
- // exit;
- // $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【不通过原因】:(简要概述不通过的原因)',***严格按照上述回复格式回复,禁止添加解释、总结、问候语或额外说明,禁止添加其他内容解释,禁止输出规则解释()内的内容。当质控签名时,只要有任何一个签名,就判断质控结果为通过。***";
- if(count($ragResult["data"]) != 0){
- //正确示例
- $PoExample = "";
- //错误示例
- $ErExample = "";
- for($Example = 0 ;$Example<count($ragResult["data"]);$Example++){
- if($ragResult["data"][$Example]["type"] == "positive"){
- $PoExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
- }
- else{
- $ErExample.=$ragResult["data"][$Example]["exampleContent"]."\n";
- }
- }
- // dump($PoExample);
- // dump($ErExample);
-
- $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
- 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
- 请严格基于【病历原文】判断是否违反该规则。
- ***【质控规则】***
- 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
- 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
- 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
- ***【参考内容】***
- 正例(符合要求的写法):\n
- ".$PoExample."\n
- 反例(不符合要求的写法):\n
- ".$ErExample."\n
- ===【病历原文】===
- 以下为".$docName."部分:
- \n".$newMultipleCases."\n
- ===【输出要求】===
- 请严格以下列格式输出,不得输出解释性文字或额外内容。
-
- 如果病历完全符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验通过。
-
- 如果存在不符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验不通过\n
- 【不通过原因】:(简要概述不通过的原因)
- 【规则关键字】:违规位置及所属内容(必须只有一个关键字,如 ‘主诉’)',
-
- ===【注意事项】===
- - 严禁输出 Markdown 代码块(如 ```json)
- - 严禁输出解释性文字、分析过程或无关说明
- - 不得引用或复述【参考内容】中的文字
- - 若规则不适用于当前病历内容,应视为通过
- - 所有结论必须严格基于【病历原文】内容
- -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
- ";
-
-
- }
- else{
- $dataFinalcount = "你是一名专业的医疗病历质控员,需要依据【质控规则】对病历内容进行审核。
- 若提供了【参考内容】,仅用于理解规则,不得直接引用或照抄。
- 请严格基于【病历原文】判断是否违反该规则。
- ***【质控规则】***
- 规则编码: ".$qcruleStage[$j]["rule_code"]."\n
- 规则内容: ".$qcruleStage[$j]["rule_content"]."\n
- 规则解释: ".$qcruleStage[$j]["rule_desc"]."\n
- ===【病历原文】===
- 以下为".$docName."部分:
- \n".$newMultipleCases."\n
- ===【输出要求】===
- 请严格以下列格式输出,不得输出解释性文字或额外内容。
-
- 如果病历完全符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验通过。
-
- 如果存在不符合规则,请输出以下格式的内容:
- 【规则名称】: ".$qcruleStage[$j]['rule_content']."\n
- 【质控结果】:病例校验不通过\n
- 【不通过原因】:(简要概述不通过的原因)\n
- 【规则关键字】:违规位置及内容(必须只有一个关键字,如 ‘主诉’)'
- ===【注意事项】===
- - 严禁输出 Markdown 代码块(如 ```json)
- - 严禁输出解释性文字、分析过程或无关说明
- - 若规则不适用于当前病历内容,应视为通过
- - 所有结论必须严格基于【病历原文】内容
- -【不通过原因】的内容,禁止出现任何姓名信息,例如医师姓名,签名,人名,如果必须出现姓名,以’**‘这种方式来代替。
- ";
- }
- // dump($dataFinalcount);
- // exit;
-
- //请求websocket客户端发送数据
- $recContentFinal = [
- [
- 'role' => 'user',
- 'content' => $dataFinalcount
- ],
- ];
- // dump($dataFinalcount);
- //组装请求的数据为base64格式
- $data = [];
- $data['model'] = 'gstcm-G1-14B';
- $data['network'] = '2';
- $data['input'] = $recContentFinal;
-
- $data = json_encode($data,JSON_UNESCAPED_UNICODE);
- $data = base64_encode($data);
- //对请求的参数进行sm4加密
- $smIV = getSMIV();
- $config = [
- 'mode' => 'cbc',
- 'key' => 'kdOVYNCDa50ZaKQF', // 16 字节二进制密钥
- 'iv' => $smIV, // 16 字节二进制 IV
- 'hash' => false
- ];
- $sm4 = new EvitSM4Encryption($config);
- $encryptedBinary = $sm4->encrypt($data);
- // 将二进制结果转换为 Base64
- $encryptedBase64 = base64_encode($encryptedBinary);
- //创建最终的含有sm4的iv的数据
- $modifiedData = [];
- $modifiedData['encryptedBase64'] = $encryptedBase64;
- $modifiedData['smIV'] = $smIV;
- $modifiedData['publicKey'] = '6c5McfXGHnB0lmX2ir4sRvx6YBXlgxew';
- $modifiedData = json_encode($modifiedData,JSON_UNESCAPED_UNICODE);
- $modifiedData = base64_encode($modifiedData);
- // 将 '+' 替换为 '-','/' 替换为 '_'
- $modifiedData = strtr($modifiedData, '+/', '-_');
-
- //将加密的参数发送给开放平台,获取短令牌
- $urlOpen = commonOpenURL().'/Apis/getToken';
- $encryption['information'] = $modifiedData;
- $token = curlPost($urlOpen,$encryption);
- $token = stdClassObjToArray(json_decode($token));
-
- // dump($recContentFinal);
- // exit;
- //推送消息至websocket
- $dataRequest['user'] = $user;
- $dataRequest['name'] = $name;
- $dataRequest['rule'] = $qcruleStage[$j]['rule_content'];
- $dataRequest['doc'] = $docName;
- $dataRequest['token'] = $token['token'];
- $dataRequest['ruleid'] = $qcruleStage[$j]['rule_code'];
- $dataRequest['typename'] = $docsArray[$i]['TYPE_NAME'];
-
- $tokenrole['token'] = $token['token'];
- $tokenrole['ruleid'] = $qcruleStage[$j]['rule_code'];
- $tokenrole['typename'] = $docsArray[$i]['TYPE_NAME'];
- $tokenrole['content'] = $dataFinal;
- $tokenrole['ruletype'] = $qcruleStage[$j]['category'];
- $tokenrole['ruledetail'] = $qcruleStage[$j]['rule_content'];
- // dump($tokenrole);
- // exit;
- $tokenrole['time'] = time();
- db('tokenrole') -> insert($tokenrole);
- // dump($tokenrole);
- // exit;
-
- $url = commonURL().'/Send/websocket';
- curlPost($url,$dataRequest);
-
- }
-
- }
- // // exit;
- //多病例融合
- // $docNamepath="";
- // for($g = 0; $g < count($multirule); $g++){
- // if($g>=1){
- // $docNamepath .= "、";
- // }
- // $docNamepath.=$multirule[$g]["medicalreport"];
- // }
-
- // $multipleCases="";
- // for($q = 0; $q < count($multirule); $q++){
- // for($g = 0; $g < count($docsArray); $g++){
- // if(strpos($docsArray[$g]['TYPE_NAME'], $multirule[$q]["medicalreport"]) !== false){
- // $dataMrId['mrId'] = $docsArray[$g]['MR_ID'];
- // $urlMrId = commonDataURL().'/His/getMedicalRec';
- // $recs = curlPost($urlMrId,$dataMrId);
- // $recs = json_decode($recs);
- // $recs = stdClassObjToArray($recs);
- // $multipleCases.=$recs[0]."\n".$recs[1]["mr_title"].":".$recs[1]["mr_text"];
-
-
- // }
- // }
- // }
- }
- // sleep(1);
-
- return 'success';
-
- }
- //定时更新当前状态。
- public function onlineUpdate(){
- $user = request() -> param('user');
- $messageQueuelength = request() -> param('messageQueuelength');
- $strate = request() -> param('strate');
- // $user = 6666;
- $mapUser['user'] = array('eq',$user);
- $userData = db('client') -> where($mapUser) -> select();
- if($userData == null){
- $updateData["user"] = $user;
- $updateData["updatetime"] = time();
- $updateData["strate"] = 1;
- $updateData["messageQueue"] =$messageQueuelength;
- $data = db('client') -> insert($updateData);
- return $data;
-
- }
- else{
- $updateData["updatetime"] = time();
- $updateData["strate"] = $strate;
- $updateData["messageQueue"] =$messageQueuelength;
- $data = db('client') -> where($mapUser) -> update($updateData);
- return $data;
- }
- }
-
-
- public function test(){
- // $docsCode = "cf76da1345a1602c40e4583430363169";
- // $mapToken['token'] = array('eq',$docsCode);
- // $docsJson = db('token') -> where($mapToken) -> value('info');
- // $docsArray = json_decode($docsJson);
- // $docsArray = stdClassObjToArray($docsArray);
- // // $searchTerm[0] = "首次病程记录";
- // $searchTerm = "入院记录";
-
-
- // $maprule['rulepath'] = array('like', '%'.$searchTerm.'%');
- // $ruleIdArray = array('RYJLXBS0014');
- // $maprule['ruleid'] = array('in', $ruleIdArray);
- // $rulename = db('rulefinal')->where($maprule)->select();
- // $rulepath = json_decode($rulename[0]["rulepath"]);
- // $rulepath = stdClassObjToArray($rulepath);
- // dump($rulepath[0]);
- // // exit;
-
- // for($j = 0; $j < count($rulepath[0]); $j++){
- // for($i = 0; $i < count($docsArray); $i++){
- // // dump($docsArray[$i]['TYPE_NAME']);
- // if(strpos($docsArray[$i]['TYPE_NAME'], $rulepath[0][$j]) !== false){
- // // return ($docsArray[$i]['TYPE_NAME']);
- // $dataMrId['mrId'] = $docsArray[$i]['MR_ID'];
- // $urlMrId = commonDataURL().'/His/getMedicalRec';
- // $recs = curlPost($urlMrId,$dataMrId);
- // $recs = json_decode($recs);
- // $recs = stdClassObjToArray($recs);
- // dump($recs);
- // }
- // }
- // }
-
- $docsJson = db('rulefinal') -> select();
- for($i = 0; $i < count($docsJson); $i++){
- $data["ruleid"] = $docsJson[$i]["ruleid"];
- $data["medicalreport"] = $docsJson[$i]["rulepath"];
- db('multirule') -> insert($data);
- }
-
-
- dump($data);
-
-
- }
-
-
-
- private function getValueByLike($input, $mapping = null) {
- $mapping = $mapping ?: $this->mapping;
- foreach ($mapping as $key => $value) {
- if (strpos($input, $key) !== false) {
- return $value;
- }
- }
- return null;
- }
- }
|