0, '01' => 1, '02' => 2, '04' => 3]; $patientType = $patientTypeMapping[$visitTypeCode] ?? 9; $is_redirect = false; $url = ""; $entrust_ids = []; $termCodes = []; $execDeptCodes = []; if (!is_array($requestNoList)) { return \Yz::JsonReturn(false, 'requestNoList 参数必须是数组', []); } foreach ($requestNoList as $requestNo) { //1.查询his,获取申请单全部检查项目 $data = [ 'visitSqNo' => $visitSqNo, 'requestNo' => $requestNo, 'visitTypeCode' => $visitTypeCode, 'feeFlag' => 0, ]; $debug_roc_url = 'http://192.168.80.39:7801/roc/order-service/api/v1/apply/pacs/apply/create/query'; $debug_roc_params = $data; $His = new HisController(); $res = $His::Get("查询检查申请单", $data); $debug_hisResponse = $res; if ($res['code'] == 200) { $res_data = $res['data']; foreach ($res_data as $data_k => $data_v) { $date = DateTime::createFromFormat('YmdHis', $data_v['requestDate']); if ($date) { $entrust_datePart = $date->format('Y-m-d'); // 日期部分 $entrust_timePart = $date->format('H:i:s'); // 时间部分 } else { $entrust_datePart = ''; $entrust_timePart = ''; } $birthday_f = DateTime::createFromFormat('Ymd', $data_v['patientBirthDate']); if ($birthday_f) { $birthday = $birthday_f->format('Y-m-d'); }else{ $birthday=''; } $mapping = [ '03' => 0, // 住院 -> 0 '01' => 1, // 门诊 -> 1 '02' => 2, // 急诊 -> 2 '04' => 3, // 体检 -> 3 ]; $patientType = $mapping[$visitTypeCode] ?? 9; foreach ($data_v['itemList'] as $item_k => $item) { // 检查科室是否参与预约 $entrust_ids[] = $item['orderNo']; $termCodes[] = $item['termCode']; $execDeptCodes[] = $item['execDeptCode']; //查询库里是否存在该检医嘱 $db_item = DB::table('s_list')->where(['entrust_id' => $item['orderNo']])->first(); if (!$db_item) { //如果不存在则进行创建 $params = [ 'list_status' => 0, 'reg_num' => $data_v['cardNo'], 'user_name' =>$data_v['patientName'], 'user_sex' => $data_v['patientGenderName'] == '男' ? 1 : 2, 'entrust_code' => $item['termCode'], 'entrust' => $item['termName'], 'is_pay' => $data_v["chargeStatusName"] == '已收费' ? 1 : 0, 'reservation_department' =>$data_v["orderDeptName"], 'entrust_date' =>$entrust_datePart, 'entrust_time' =>$entrust_timePart, 'user_brithday' =>$birthday, 'docotr' => $data_v["orderPersonName"], 'patient_type' => $patientType, 'user_phone' => $data_v["mobile"], 'implement_department' =>$item['execDeptName'], 'entrust_id' => $item['orderNo'], 'episodeid' => $visitSqNo, // 'RISRExamID' => $order["RISRExamID"] ? $order["RISRExamID"] : null, //检查号,先屏蔽掉,获取不到 'RISRAcceptDeptCode' => $item["execDeptCode"], //接收科室代码 'warddesc' => $data_v["areaName"], //病区 'wardcode' => $data_v["areaCode"], //病区 'bedname' => $data_v["bedName"], //病床号 'bedno' => $data_v["bedNo"], //病床号 'app_num' => $data_v["requestNo"], //申请单号 'idCardNumber' => $data_v["idCardNumber"], //身份证号 'medicalHistory' => $data_v["medicalHistory"], //病史摘要 'diagnosisName' => $data_v["diagnosisName"], //临床诊断(诊断名称) 'his_is_emergency'=> intval($data_v["urgentFlag"]), //是否加急 'reservation_department_code' =>$data_v["orderDeptCode"],//申请科室代码 'doctor_code' => $data_v["orderPersonCode"],//申请医生代码 'requestComment' => $data_v["requestComment"] ?? null, //申请注意事项 ]; $list_id= DB::table('s_list')->insertGetId($params); if($list_id){ $i_log = DB::table('s_list_log')->insert([ 'list_id' =>$list_id, 'reg_num' => $data_v['cardNo'], 'old_status' => 0, 'new_status' => 0, 'create_user' => 'his', 'note' => '创建记录', 'data' => json_encode($params) ]); } }else{ //如果存在,更新一下部分字段 $params = [ 'medicalHistory' => $data_v["medicalHistory"], //病史摘要 'diagnosisName' => $data_v["diagnosisName"], //临床诊断(诊断名称) 'his_is_emergency'=> intval($data_v["urgentFlag"]), //是否加急 'reservation_department_code' =>$data_v["orderDeptCode"],//申请科室代码 'doctor_code' => $data_v["orderPersonCode"],//申请医生代码 'requestComment' => $data_v["requestComment"] ?? null, //申请注意事项 ]; // 如果 wardcode 一致但 warddesc 不一致,同步更新病区名称 if ($db_item->wardcode == $data_v["areaCode"] && $db_item->warddesc != $data_v["areaName"]) { $params['warddesc'] = $data_v["areaName"]; } DB::table('s_list')->where(['id' => $db_item->id])->update($params); } } } }else{ return \Yz::JsonError('Roc接口查询失败'); } } // 检查是否有诊室参与预约 $termCodes = array_unique($termCodes); $execDeptCodes = array_unique($execDeptCodes); // 检查 HIS 执行科室是否参与预约 $departmentEnabled = false; if (!empty($execDeptCodes)) { $enabledCount = DB::table("s_department") ->whereIn("department_number", $execDeptCodes) ->where("appointment_enabled", 1) ->count(); $departmentEnabled = ($enabledCount == count($execDeptCodes)); } $hasEnabledRoom = 0; if (!empty($termCodes)) { $hasEnabledRoom = DB::table('s_check_item') ->whereIn('s_check_item.item_code', $termCodes) ->join('s_check_item_device', 's_check_item.id', '=', 's_check_item_device.item_id') ->join('s_source_roster_detail_device', 's_check_item_device.device_id', '=', 's_source_roster_detail_device.device_id') ->join('s_source_roster_detail', 's_source_roster_detail_device.roster_detail_id', '=', 's_source_roster_detail.id') ->join('s_department_resources', 's_source_roster_detail.resources_id', '=', 's_department_resources.id') ->where('s_source_roster_detail.status', 1) ->where('s_source_roster_detail.is_del', 0) ->where('s_department_resources.is_del', 0) ->where('s_department_resources.department_resources_status', 1) ->where('s_department_resources.appointment_enabled', 1) ->whereRaw("FIND_IN_SET(?, s_source_roster_detail.patient_type)", [$patientType]) ->count(); } if ($departmentEnabled && $hasEnabledRoom > 0 && !in_array($patientType, [2, 3])) { $is_redirect = true; $url = $this->build_yiji_url($cardNo, $entrust_ids, $visitSqNo); } else { $is_redirect = false; $url = ''; } // 查询执行诊室名称 $roomNames = []; if (!empty($termCodes)) { $roomNames = DB::table('s_check_item') ->whereIn('s_check_item.item_code', $termCodes) ->join('s_check_item_device', 's_check_item.id', '=', 's_check_item_device.item_id') ->join('s_source_roster_detail_device', 's_check_item_device.device_id', '=', 's_source_roster_detail_device.device_id') ->join('s_source_roster_detail', 's_source_roster_detail_device.roster_detail_id', '=', 's_source_roster_detail.id') ->join('s_department_resources', 's_source_roster_detail.resources_id', '=', 's_department_resources.id') ->where('s_source_roster_detail.status', 1) ->where('s_source_roster_detail.is_del', 0) ->where('s_department_resources.is_del', 0) ->where('s_department_resources.department_resources_status', 1) ->where('s_department_resources.appointment_enabled', 1) ->whereRaw("FIND_IN_SET(?, s_source_roster_detail.patient_type)", [$patientType]) ->distinct() ->pluck('s_department_resources.department_resources_name') ->toArray(); } return \Yz::JsonReturn(true, '查询成功', ['is_redirect' => $is_redirect, 'url' => $url, 'room_names' => $roomNames, 'debug_termCodes' => $termCodes, 'debug_hisResponse' => $debug_hisResponse ?? [], 'debug_roc_url' => $debug_roc_url ?? '', 'debug_roc_params' => $debug_roc_params ?? []]); } catch (\Exception $e) { return \Yz::JsonReturn(false, '接口异常:' . $e->getMessage(), ['error_file' => $e->getFile(), 'error_line' => $e->getLine()]); } } public function CheckAppointmentTest() { try { $password = request('password'); $id = request('id'); // 密码校验 if ($password !== '609384AA-E90D-4BE7-8317-3D6D7DE0A442') { return \Yz::JsonReturn(false, '密钥错误', []); } // 查询 s_list 记录 $sList = DB::table('s_list')->where('id', $id)->first(); if (!$sList) { return \Yz::JsonReturn(false, '未找到该记录', []); } // 反向映射 patient_type → visitTypeCode(0→03住院, 1→01门诊, 2→02急诊, 3→04体检) $patientTypeMapping = [0 => '03', 1 => '01', 2 => '02', 3 => '04']; $visitTypeCode = $patientTypeMapping[$sList->patient_type] ?? '09'; $result = [ 's_list_info' => [ 'id' => $sList->id, 'entrust_id' => $sList->entrust_id, 'entrust_code' => $sList->entrust_code, 'entrust' => $sList->entrust, 'reg_num' => $sList->reg_num, 'episodeid' => $sList->episodeid, 'app_num' => $sList->app_num, 'RISRAcceptDeptCode' => $sList->RISRAcceptDeptCode, 'implement_department' => $sList->implement_department, 'patient_type' => $sList->patient_type, 'visitTypeCode' => $visitTypeCode, ], ]; // 1. 调用 HIS 接口查询申请单 $data = [ 'visitSqNo' => $sList->episodeid, 'requestNo' => $sList->app_num, 'visitTypeCode' => $visitTypeCode, 'feeFlag' => 0, ]; $His = new HisController(); $hisRes = $His::Get('查询检查申请单', $data); $result['his_query'] = [ 'params' => $data, 'response' => $hisRes, 'success' => ($hisRes['code'] == 200), ]; // 2. 检查科室是否参与预约 $dept = DB::table('s_department') ->where('department_number', $sList->RISRAcceptDeptCode) ->first(); $result['department_check'] = [ 'department_number' => $sList->RISRAcceptDeptCode, 'department_name' => $dept->department_name ?? '未找到', 'found' => $dept ? true : false, 'appointment_enabled' => $dept ? ($dept->appointment_enabled == 1) : false, ]; // 3. 检查项目 → 设备 → 检查室链路 $item = DB::table('s_check_item') ->where('item_code', $sList->entrust_code) ->first(); $roomCheck = []; if ($item) { $devices = DB::table('s_check_item_device') ->where('item_id', $item->id) ->get(); foreach ($devices as $device) { $rooms = DB::table('s_source_roster_detail_device') ->where('s_source_roster_detail_device.device_id', $device->device_id) ->join('s_source_roster_detail', 's_source_roster_detail_device.roster_detail_id', '=', 's_source_roster_detail.id') ->join('s_department_resources', 's_source_roster_detail.resources_id', '=', 's_department_resources.id') ->where('s_source_roster_detail.status', 1) ->where('s_source_roster_detail.is_del', 0) ->where('s_department_resources.is_del', 0) ->where('s_department_resources.department_resources_status', 1) ->whereRaw('FIND_IN_SET(?, s_source_roster_detail.patient_type)', [$sList->patient_type]) ->select( 's_source_roster_detail.id as schedule_id', 's_source_roster_detail.date as schedule_date', 's_department_resources.id as room_id', 's_department_resources.department_resources_name as room_name', 's_department_resources.appointment_enabled as room_appointment_enabled' ) ->get(); foreach ($rooms as $room) { $roomCheck[] = [ 'device_id' => $device->device_id, 'room_id' => $room->room_id, 'room_name' => $room->room_name, 'room_appointment_enabled' => $room->room_appointment_enabled == 1, 'schedule_date' => $room->schedule_date, ]; } } } $result['room_check'] = [ 'item_found' => $item ? true : false, 'item_name' => $item->item_name ?? '未找到', 'device_count' => isset($devices) ? count($devices) : 0, 'room_count' => count($roomCheck), 'rooms' => $roomCheck, ]; // 综合结论 $hasEnabledRoom = false; foreach ($roomCheck as $r) { if ($r['room_appointment_enabled']) { $hasEnabledRoom = true; break; } } $result['overall_result'] = [ 'can_redirect' => $result['department_check']['appointment_enabled'] && $hasEnabledRoom, 'department_ok' => $result['department_check']['appointment_enabled'], 'room_ok' => $hasEnabledRoom, ]; return \Yz::JsonReturn(true, '诊断完成', $result); } catch (\Exception $e) { return \Yz::JsonReturn(false, '接口异常:' . $e->getMessage(), [ 'error_file' => $e->getFile(), 'error_line' => $e->getLine() ]); } } function QueryHisShenQingDan() { } /** * 测试 HIS 回写接口入参收集 * 根据 s_list ID 查询 HIS 申请单,组装回写所需参数并返回,不实际调用回写接口 */ public function TestHisCallbackParams() { try { $id = request('id'); if (empty($id)) { return \Yz::JsonReturn(false, '参数 id 不能为空', []); } $sList = DB::table('s_list')->where('id', $id)->first(); if (!$sList) { return \Yz::JsonReturn(false, '未找到该记录', []); } $result = [ 's_list_info' => [ 'id' => $sList->id, 'entrust_id' => $sList->entrust_id, 'entrust_code' => $sList->entrust_code, 'entrust' => $sList->entrust, 'reg_num' => $sList->reg_num, 'episodeid' => $sList->episodeid, 'app_num' => $sList->app_num, 'patient_type' => $sList->patient_type, 'reservation_sources' => $sList->reservation_sources, 'RISRAcceptDeptCode' => $sList->RISRAcceptDeptCode, 'implement_department' => $sList->implement_department, ], ]; // 1. 获取 execDeptCode / execDeptName(通过排班→诊室资源→执行科室链路) $execDeptCode = ''; $execDeptName = ''; $execDeptInfo = []; if (!empty($sList->reservation_sources)) { $resource = DB::table('s_department_resources') ->where('id', $sList->reservation_sources) ->first(); if ($resource) { $deptId = $resource->execute_department_id ?: $resource->department_id; if ($deptId) { $dept = DB::table('s_department') ->where('id', $deptId) ->first(); if ($dept) { $execDeptCode = $dept->department_number; $execDeptName = $dept->department_name; $execDeptInfo = [ 'resources_id' => $sList->reservation_sources, 'execute_department_id' => $resource->execute_department_id, 'department_id' => $resource->department_id, 'dept_id_used' => $deptId, 'department_number' => $dept->department_number, 'department_name' => $dept->department_name, ]; } } } } $result['exec_dept_info'] = $execDeptInfo; // 2. 调 HIS 查询申请单接口 $patientHisTypeMap = [ 0 => '03', // 住院 1 => '01', // 门诊 2 => '02', // 急诊 3 => '04', // 体检 ]; $visitTypeCode = $patientHisTypeMap[$sList->patient_type] ?? '09'; $hisQueryData = [ 'visitSqNo' => $sList->episodeid, 'requestNo' => $sList->app_num, 'visitTypeCode' => $visitTypeCode, 'feeFlag' => 0, ]; $result['his_query'] = [ 'params' => $hisQueryData, ]; try { $hisRes = HisController::Get('查询检查申请单', $hisQueryData); $result['his_query']['response'] = $hisRes; $result['his_query']['success'] = ($hisRes['code'] == 200); if ($hisRes['code'] == 200 && !empty($hisRes['data'])) { $hisData = $hisRes['data'][0] ?? null; if ($hisData) { // 3. 提取申请单级数据 $comboNo = $hisData['requestNo'] ?? ''; // 住院取 episodeid,门诊取 reg_num $inpatientNo = $sList->patient_type == 0 ? $sList->episodeid : $sList->episodeid; // 4. 匹配项目级数据 $moOrder = ''; $hisOrderNo = ''; $matchedItem = []; if (!empty($hisData['itemList']) && is_array($hisData['itemList'])) { foreach ($hisData['itemList'] as $item) { if (($item['termCode'] ?? '') == $sList->entrust_code) { $moOrder = $item['orderNo'] ?? ''; $hisOrderNo = $item['chargeList'][0]['hisOrderNo'] ?? ''; $matchedItem = [ 'termCode' => $item['termCode'] ?? '', 'termName' => $item['termName'] ?? '', 'orderNo' => $item['orderNo'] ?? '', 'hisOrderNo' => $hisOrderNo, ]; break; } } } $result['matched_item'] = $matchedItem; // 5. 组装回写参数 $result['callback_params'] = [ 'moOrder' => $moOrder, 'execDeptCode' => $execDeptCode, 'execDeptName' => $execDeptName, 'inpatientNo' => $inpatientNo, 'hisOrderNo' => $hisOrderNo, 'comboNo' => $comboNo, 'itemCode' => $sList->entrust_code, ]; } } } catch (\Exception $e) { $result['his_query']['response'] = null; $result['his_query']['success'] = false; $result['his_query']['error'] = $e->getMessage(); } return \Yz::JsonReturn(true, '查询完成', $result); } catch (\Exception $e) { return \Yz::JsonReturn(false, '接口异常:' . $e->getMessage(), [ 'error_file' => $e->getFile(), 'error_line' => $e->getLine() ]); } } function build_yiji_url($regnum, $entrustid, $episodeid) { // 固定参数 $dotype = 1; $appointment_type = 1; // 判断 entrustid 是否为数组,如果是,则用逗号 , 拼接并分别进行 rawurlencode 编码 if (is_array($entrustid)) { // 对数组中的每个元素进行 rawurlencode 编码后再拼接 $entrustid_str = implode(',', array_map('rawurlencode', $entrustid)); } // 构造查询参数,并对 regnum 和 episodeid 使用 rawurlencode 编码 $params = [ 'regnum' => rawurlencode($regnum), 'entrustid' => $entrustid_str, 'episodeid' => rawurlencode($episodeid), 'dotype' => $dotype, 'appointment_type' => $appointment_type, ]; // 使用 http_build_query 构建查询字符串,注意设置第四个参数为 PHP_QUERY_RFC3986 // 以确保生成的 URL 符合 RFC 3986 标准 $query = http_build_query($params, '', '&', PHP_QUERY_RFC3986); // 返回完整 URL return "http://192.168.80.76/yiji?$query"; } }