HrServies.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <?php
  2. declare (strict_types=1);
  3. namespace app\zskk\servies;
  4. use app\admin\model\hospital\Hrpatient;
  5. use app\admin\servies\HrpatientServies;
  6. use app\common\library\Gm;
  7. use app\zskk\model\CallRecord;
  8. use app\zskk\model\HospitalHrpatient;
  9. use app\zskk\model\HrRecord;
  10. use app\zskk\model\Patient;
  11. use think\Exception;
  12. use think\facade\Cache;
  13. use think\facade\Config;
  14. class HrServies
  15. {
  16. public $patientModel = null;
  17. public $hrpatientModel = null;
  18. private $patientServies = null;
  19. private $hrpatientServies = null;
  20. private $hrRecordModel = null;
  21. private $callRecordModel = null;
  22. public function __construct(
  23. PatientServies $patientServies,
  24. Patient $patientModel,
  25. Hrpatient $hrpatientModel,
  26. HrRecord $hrRecordModel,
  27. HrpatientServies $hrpatientServies,
  28. CallRecord $callRecordModel
  29. )
  30. {
  31. // parent::__construct();
  32. $this->patientServies = $patientServies;
  33. $this->patientModel = $patientModel;
  34. $this->hrpatientModel = $hrpatientModel;
  35. $this->hrpatientServies = $hrpatientServies;
  36. $this->hrRecordModel = $hrRecordModel;
  37. $this->callRecordModel = $callRecordModel;
  38. }
  39. public function getRecogData($ID_CARDNUM, $ORGCODE): array {
  40. $ID_CARDNUM = Gm::encrypt(Config::get('gm.key'),$ID_CARDNUM);
  41. $data = array();
  42. $patients = $this->patientModel->getPatientsByID_CARDNUM($ID_CARDNUM);
  43. foreach($patients as $patient) {
  44. $data[] = $this->getRecogViewDetailByPATIENT_CODE($patient['PATIENT_CODE'], $ORGCODE);
  45. }
  46. return ['DATA'=>$data];
  47. }
  48. public function getRecogViewDetailByToken($token): array {
  49. $params = Cache::get($token);
  50. if(empty($params))
  51. {
  52. // todo 错误返回 先登录
  53. return [];
  54. }
  55. $ID_CARDNUM = $params['ID_CARDNUM'];
  56. $ID_CARDNUM = Gm::encrypt(Config::get('gm.key'),$ID_CARDNUM);
  57. $HRORGCODE = $params['ORGCODE'];
  58. $_data = $this->getRecogViewDetail($ID_CARDNUM, $HRORGCODE);
  59. $patient = $_data[0]['PATIENT'];
  60. $data = [
  61. 'patient' => $patient,
  62. 'data' => $_data,
  63. ];
  64. // todo 容错处理
  65. $this->recordTokenRequestTime($token);
  66. $this->recordCallGetRecogViewDetail($params, $patient);
  67. return $data;
  68. }
  69. public function recordTokenRequestTime($token) {
  70. // TODO 记录token请求时间
  71. }
  72. public function recordCallGetRecogViewDetail($params, $patient) {
  73. $data = [
  74. 'MPI'=>$patient['MPI'],
  75. 'MPI_KEY'=>$patient['MPI_KEY'],
  76. 'ID_CARDNUM' => $params['ID_CARDNUM'],
  77. 'ORGCODE'=>$params['ORGCODE'],
  78. 'ORGNAME'=>$params['ORGNAME'],
  79. 'DOCTORNAME'=>$params['DOCTORNAME'],
  80. 'DOCTORCODE'=>$params['DOCTORCODE']
  81. ];
  82. $this->callRecordModel->save($data);
  83. }
  84. public function getRecogViewDetail($ID_CARDNUM, $HRORGCODE): array {
  85. $datas = array();
  86. $patients = $this->patientModel->getPatientsByID_CARDNUM($ID_CARDNUM);
  87. foreach($patients as $patient) {
  88. $data = $this->getRecogViewDetailByPATIENT_CODE($patient['PATIENT_CODE'], $HRORGCODE);
  89. $data['MEDICAL_INFORMATION']['PATIENT_CODE'] = $patient['PATIENT_CODE'];
  90. $HR_RECORDS = $this->hrpatientServies->_getHrpatientDetailByPATIENT_CODE($patient['PATIENT_CODE'], $HRORGCODE);
  91. $data['HR_RECORDS'] = $HR_RECORDS;
  92. $datas[] = $data;
  93. }
  94. return $datas;
  95. }
  96. public function getRecogViewDetailByPATIENT_CODE($PATIENT_CODE): array {
  97. $data = null;
  98. $data = $this->patientServies->getPatient(['PATIENT_CODE'=> $PATIENT_CODE]);
  99. return $data;
  100. }
  101. public function hanldeHR_RECORDS(&$HR_RECORDS) {
  102. foreach($HR_RECORDS as &$HR_RECORD) {
  103. $HR_RECORD['PATIENT_CODE'] = $this->getPATIENT_CODE($HR_RECORD['ID_CARDNUM'], $HR_RECORD['SERIESNUM'], $HR_RECORD['ORGCODE']);
  104. }
  105. }
  106. public function hanldeHR_RECORDSAndToken(&$HR_RECORDS, $TOKEN) {
  107. $data = Cache::get($TOKEN);
  108. $DOCTORCODE = $data['DOCTORCODE'];
  109. $DOCTORNAME = $data['DOCTORNAME'];
  110. $HRORGNAME = $data['ORGNAME'];
  111. $HRORGCODE = $data['ORGCODE'];
  112. foreach($HR_RECORDS as &$HR_RECORD) {
  113. $HR_RECORD['DOCTORCODE'] = $DOCTORCODE;
  114. $HR_RECORD['DOCTORNAME'] = $DOCTORNAME;
  115. $HR_RECORD['HRORGNAME'] = $HRORGNAME;
  116. $HR_RECORD['HRORGCODE'] = $HRORGCODE;
  117. }
  118. }
  119. public function getPATIENT_CODE($ID_CARDNUM, $SERIESNUM, $HRORGCODE) {
  120. return md5(md5($ID_CARDNUM).$HRORGCODE.$SERIESNUM);
  121. }
  122. public function saveRecogResult($HR_RECORDS): void {
  123. $this->hanldeHR_RECORDS($HR_RECORDS);
  124. $where = $this->_saveRecogViewDetail($HR_RECORDS);
  125. $this->saveHospitalHrPatient($where);
  126. }
  127. public function saveHospitalHrPatient($where)
  128. {
  129. unset($where['REPORTID']);
  130. $data = $this->makeHrPatient($where);
  131. // $hrPatient = $this->hrpatientModel->where($where)->find();
  132. // if(!empty($hrPatient))
  133. // {
  134. // $this->hrpatientModel->where($where)->update($data);
  135. // }else{
  136. // $this->hrpatientModel->insert($data);
  137. // }
  138. // todo
  139. $model= new HospitalHrpatient();
  140. $info = $model->where($where)->find();
  141. if(empty($info))
  142. {
  143. $model->save($data);
  144. }else{
  145. $info->save($data);
  146. }
  147. }
  148. public function makeHrPatient($where) {
  149. // $where
  150. // 'PATIENT_CODE' => $PATIENT_CODE,
  151. // 'ORGCODE' => $ORGCODE,
  152. // 'HRORGCODE' => $HRORGCODE,
  153. // 'REPORTID' => $REPORTID
  154. $arr = [];
  155. $patient = $this->patientModel->getPatient(['PATIENT_CODE'=>$where['PATIENT_CODE']]);
  156. $record = $this->hrRecordModel->where($where)->where('HR_STATUS','<>','0')->select();
  157. $medical = $this->patientModel->getMedical($where['PATIENT_CODE']);
  158. $data = [];
  159. $data['MPI_KEY'] = $patient['MPI_KEY'];
  160. $data['PATIENT_CODE'] = $patient['PATIENT_CODE'];
  161. $data['NAME'] = $patient['NAME'];
  162. $data['GENDER'] = $patient['GENDER'];
  163. $data['AGE'] = $medical['AGE'];
  164. $age_last = substr( $data['AGE'], -1);
  165. $age_num = substr( $data['AGE'], 0,-1);
  166. $last = match ($age_last) {
  167. 'Y' => '365',
  168. 'M' => '30',
  169. 'W' => '7',
  170. 'D' => '1',
  171. default => $age_last,
  172. };
  173. $data['AGE_DAY'] = $last*$age_num;
  174. $data['ID_CARDNUM'] = $patient['ID_CARDNUM'];
  175. $data['MPI'] = $patient['MPI'];
  176. $data['ENCOUNTER_DATE'] = $medical['ENCOUNTER_DATE']; // 就诊时间
  177. $data['CHIEFCOMPLAINT'] = $medical['CHIEFCOMPLAINT']; //主诉
  178. $data['DIAGNOSENAME'] = $medical['DIAGNOSENAME']; //诊断
  179. $data['INSUR_CARD_NO'] = $patient['INSUR_CARD_NO'];
  180. $data['ID_CARD_CODE'] = $patient['ID_CARD_CODE'];
  181. $data['ID_CARD'] = $patient['ID_CARD'];
  182. $data['GENDER_CODE'] = $patient['GENDER_CODE'];
  183. $data['BIRTH_DATE'] = $patient['BIRTH_DATE'];
  184. $data['MARITAL_STATUS_CODE'] = $patient['MARITAL_STATUS_CODE'];
  185. $data['MARITAL_STATUS'] = $patient['MARITAL_STATUS'];
  186. $data['ADDRESS'] = $patient['ADDRESS'];
  187. $data['ECARD_NO'] = $patient['ECARD_NO'];
  188. $data['SERIESNUM'] = $medical['SERIESNUM'];
  189. $data['CLASS_CODE'] = $medical['CLASS_CODE'];
  190. $data['CLASS'] = $medical['CLASS'];
  191. $data['ENCOUNTER_CARD_NO'] = $medical['ENCOUNTER_CARD_NO'];
  192. $data['RECORD_CODE'] = $medical['RECORD_CODE'];
  193. $data['HOS_EMPI'] = $medical['HOS_EMPI'];
  194. $data['DEPTNAME'] = $medical['DEPTNAME'];
  195. $data['DIAGNOSECODE'] = $medical['DIAGNOSECODE'];
  196. $data['ORGCODE'] = $record[0]['ORGCODE'];
  197. $data['ORGNAME'] = $record[0]['ORGNAME'];
  198. $data['HRORGNAME'] = $record[0]['HRORGNAME'];
  199. $data['HRORGCODE'] = $record[0]['HRORGCODE'];
  200. $data['create_time'] = $record[0]['HRTIME'];
  201. // $exam = $this->patientModel->getExam($where['PATIENT_CODE']);
  202. // $examCode = [];
  203. // $examItem = [];
  204. // $recordCode = array_column($record,'ITEMNAMECODE');
  205. // if(!empty($exam))
  206. // {
  207. // $examCode = array_column($exam,'HR_ITEMNAME_CODE');
  208. // $examItem = array_column($exam,'EXAM_ITEMNAME');
  209. // $hrExamCode = array_column($exam,'HR_ITEMNAME_CODE');
  210. // $hrExam = array_column($exam,'HR_ITEMNAME');
  211. // }
  212. // $medical = $this->patientModel->getMedical($where['PATIENT_CODE']);
  213. // $medicalCode = [];
  214. // $medicalItem = [];
  215. // if(!empty($medical))
  216. // {
  217. // $medicalCode = array_column($medical,'LAB_HR_ITEMNAME_CODE');
  218. // $medicalItem = array_column($medical,'LAB_ITEMNAME');
  219. // $hrInspectCode = array_column($exam,'LAB_HR_ITEMNAME_CODE');
  220. // $hrInspectExam = array_column($exam,'LAB_HR_ITEMNAME');
  221. // }
  222. $exam = [];
  223. $examCode = [];
  224. $lab = [];
  225. $labCode = [];
  226. $hrExam = [];
  227. $hrExamCode = [];
  228. $bhrExam = [];
  229. $bhrExamCode = [];
  230. $hrInspect = [];
  231. $hrInspectCode = [];
  232. $bhrInspect = [];
  233. $bhrInspectCode = [];
  234. foreach ($record as $v)
  235. {
  236. $data['HR_CODE'] = md5($v['ORGCODE'].$v['HRORGCODE'].$patient['PATIENT_CODE']);
  237. if($v['HR_STATUS'] == 1)
  238. {
  239. $status = '是';
  240. }elseif ($v['HR_STATUS'] == 2)
  241. {
  242. $status = '否';
  243. }else{
  244. continue;
  245. }
  246. if($v['ITEMNAMETYPE'] == 1)
  247. {
  248. //检查
  249. $exam[] = $v['ITEMNAME'].'('.$status.')'; //检查项目
  250. $examCode[] = $v['ITEMNAMECODE'].'('.$v['HR_STATUS'].')';
  251. if($v['HR_STATUS'] == 1)
  252. {
  253. $hrExam[] = $v['ITEMNAME'];
  254. $hrExamCode[] = $v['ITEMNAMECODE'];
  255. }elseif ($v['HR_STATUS'] == 2)
  256. {
  257. $bhrExam[] = $v['ITEMNAME'];
  258. $bhrExamCode[] = $v['ITEMNAMECODE'];
  259. }
  260. }else{
  261. //检验
  262. $lab[] = $v['ITEMNAME'].'('.$status.')';; //检验项目
  263. $labCode[] = $v['ITEMNAMECODE'].'('.$v['HR_STATUS'].')';
  264. if($v['HR_STATUS'] == 1)
  265. {
  266. $hrInspect[] = $v['ITEMNAME'];
  267. $hrInspectCode[] = $v['ITEMNAMECODE'];
  268. }elseif ($v['HR_STATUS'] == 2)
  269. {
  270. $bhrInspect[] = $v['ITEMNAME'];
  271. $bhrInspectCode[] = $v['ITEMNAMECODE'];
  272. }
  273. }
  274. $data['HRORGCODE'] = $v['HRORGCODE'];
  275. }
  276. if(!empty($exam))
  277. {
  278. $data['EXAM_ITEMNAME'] = implode(',',$exam);
  279. $data['EXAM_ITEMNAME_CODE'] = implode(',',$examCode);
  280. }
  281. if(!empty($lab))
  282. {
  283. $data['LAB_ITEMNAME'] = implode(',',$lab);
  284. $data['LAB_ITEMNAME_CODE'] = implode(',',$labCode);
  285. }
  286. if(!empty($hrExam))
  287. {
  288. $data['HR_EXAM_ITEMNAME'] = implode(',',$hrExam);
  289. $data['HR_EXAM_ITEMNAME_CODE'] = implode(',',$hrExamCode);
  290. }
  291. if(!empty($bhrExam))
  292. {
  293. $data['BHR_EXAM_ITEMNAME'] = implode(',',$bhrExam);
  294. $data['BHR_EXAM_ITEMNAME_CODE'] = implode(',',$bhrExamCode);
  295. }
  296. if(!empty($hrInspect))
  297. {
  298. $data['HR_LAB_ITEMNAME'] = implode(',',$hrInspect);
  299. $data['HR_LAB_ITEMNAME_CODE'] = implode(',',$hrInspectCode);
  300. }
  301. if(!empty($bhrInspect))
  302. {
  303. $data['BHR_LAB_ITEMNAME'] = implode(',',$bhrInspect);
  304. $data['BHR_LAB_ITEMNAME_CODE'] = implode(',',$bhrInspectCode);
  305. }
  306. return $data;
  307. }
  308. public function saveRecogViewDetail($HR_RECORDS, $TOKEN) {
  309. $this->hanldeHR_RECORDSAndToken($HR_RECORDS, $TOKEN);
  310. // 获取token请求时间和PATIENT_CODE删除时间和内容做对比
  311. $this->_saveRecogViewDetail($HR_RECORDS);
  312. }
  313. public function _saveRecogViewDetail($HR_RECORDS)
  314. {
  315. $data = $this->checkHR_RECORDS($HR_RECORDS);
  316. $where = $data['where'];
  317. // 删除 hr_record表
  318. $this->hrRecordModel->where($where)->delete();
  319. $news = $data['news'];
  320. // 存储hr_record表
  321. $this->hrRecordModel->saveAll($news);
  322. return $where;
  323. }
  324. /**
  325. * @throws Exception
  326. */
  327. public function checkHR_RECORDS($HR_RECORDS): array {
  328. if(count($HR_RECORDS) === 0) {
  329. //抛出异常 未传入互认数据
  330. throw new Exception('未传入互认数据');
  331. }
  332. $PATIENT_CODE = $HR_RECORDS[0]['PATIENT_CODE'];
  333. $ORGCODE = $HR_RECORDS[0]['ORGCODE'];
  334. $HRORGCODE = $HR_RECORDS[0]['HRORGCODE'];
  335. $REPORTID = array();
  336. $news = array();
  337. foreach($HR_RECORDS as $HR_RECORD) {
  338. $this->checkPATIENT_CODE($PATIENT_CODE, $HR_RECORD['PATIENT_CODE']);
  339. $this->checkORGCODE($ORGCODE, $HR_RECORD['ORGCODE'], $HR_RECORD['ORGNAME']);
  340. $this->checkHRORGCODE($HRORGCODE, $HR_RECORD['HRORGCODE'], $HR_RECORD['HRORGNAME']);
  341. $this->checkITEMNAME($HR_RECORD['REPORTID'], $HR_RECORD['ITEMNAME'], $HR_RECORD['ITEMNAMECODE'], $HR_RECORD['ITEMNAMETYPE']);
  342. $this->checkBHR_CODE($HR_RECORD['HR_STATUS'], $HR_RECORD['BHR_CODE'], $HR_RECORD['BHR_REASON']);
  343. $new = [
  344. 'DOCTORNAME' => $HR_RECORD['DOCTORNAME'],
  345. 'DOCTORCODE' => $HR_RECORD['DOCTORCODE'],
  346. 'REPORTID' => $HR_RECORD['REPORTID'],
  347. 'PATIENT_CODE' => $HR_RECORD['PATIENT_CODE'],
  348. 'ORGNAME' => $HR_RECORD['ORGNAME'],
  349. 'HRORGNAME' => $HR_RECORD['HRORGNAME'],
  350. 'ORGCODE' => $HR_RECORD['ORGCODE'],
  351. 'HRORGCODE' => $HR_RECORD['HRORGCODE'],
  352. 'ITEMNAME' => $HR_RECORD['ITEMNAME'],
  353. 'ITEMNAMECODE' => $HR_RECORD['ITEMNAMECODE'],
  354. 'HR_STATUS' => $HR_RECORD['HR_STATUS'],
  355. 'BHR_CODE' => $HR_RECORD['BHR_CODE'],
  356. 'ITEMNAMETYPE' => $HR_RECORD['ITEMNAMETYPE'],
  357. 'BHR_REASON' => $HR_RECORD['BHR_REASON'],
  358. 'HRTIME' => $HR_RECORD['HRTIME'] ?? date('Y-m-d H:i:s'),
  359. ];
  360. $news[] = $new;
  361. $REPORTID[] = $HR_RECORD['REPORTID'];
  362. }
  363. $where = [
  364. 'PATIENT_CODE' => $PATIENT_CODE,
  365. 'ORGCODE' => $ORGCODE,
  366. 'HRORGCODE' => $HRORGCODE,
  367. 'REPORTID' => $REPORTID
  368. ];
  369. // PATIENT_CODE
  370. // ORGNAME
  371. // HRORGNAME
  372. // ORGCODE
  373. // HRORGCODE
  374. // ITEMNAME
  375. // ITEMNAMECODE
  376. // HR_STATUS
  377. // BHR_CODE
  378. // ITEMNAMETYPE
  379. // BHR_REASON
  380. return [
  381. 'where' => $where,
  382. 'news' => $news,
  383. ];
  384. }
  385. /**
  386. * @throws Exception
  387. */
  388. public function checkPATIENT_CODE($_PATIENT_CODE, $PATIENT_CODE): void {
  389. if($_PATIENT_CODE !== $PATIENT_CODE) {
  390. //抛出患者标识不一致异常
  391. throw new Exception('患者标识不一致');
  392. }
  393. }
  394. /**
  395. * @throws Exception
  396. */
  397. public function checkORGCODE($_ORGCODE, $ORGCODE, $ORGNAME): void {
  398. if($_ORGCODE !== $ORGCODE) {
  399. // 抛出互认机构不一致异常
  400. throw new Exception('互认机构不一致');
  401. }
  402. // todo 校验医院编码和医院名称是否一致
  403. }
  404. /**
  405. * @throws Exception
  406. */
  407. public function checkHRORGCODE($_HRORGCODE, $HRORGCODE, $HRORGNAME): void {
  408. if($_HRORGCODE !== $HRORGCODE) {
  409. // 抛出就诊机构不一致异常
  410. throw new Exception('就诊机构不一致');
  411. }
  412. // todo 校验医院编码和医院名称是否一致 去机构名称校验
  413. }
  414. /**
  415. * @throws Exception
  416. */
  417. public function checkITEMNAME($REPORT_CODE, $ITEMNAME, $ITEMNAMECODE, $ITEMNAMETYPE): void {
  418. // todo 校验项目编码 项目名称 项目类型是否一致
  419. if(true)
  420. {
  421. // todo 类型-》检验、检查
  422. }else{
  423. throw new Exception('校验项目编码 项目名称 项目类型是否一致');
  424. }
  425. }
  426. /**
  427. * @throws Exception
  428. */
  429. public function checkBHR_CODE($HR_STATUS, $BHR_CODE, $BHR_REASON): void {
  430. // todo 校验互认状态 不互认编码 不互认原因是否一致和合法
  431. }
  432. }