From 6aa484e0c2b2f6ded5df4891344cdb1e089b1f43 Mon Sep 17 00:00:00 2001 From: sa0ChunLuyu Date: Mon, 3 Aug 2026 09:09:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=B6=E7=AB=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/API/Third/YiJiController.php | 143 +++++++++++------- 1 file changed, 89 insertions(+), 54 deletions(-) diff --git a/Laravel/app/Http/Controllers/API/Third/YiJiController.php b/Laravel/app/Http/Controllers/API/Third/YiJiController.php index 2a7a3e9..319c566 100644 --- a/Laravel/app/Http/Controllers/API/Third/YiJiController.php +++ b/Laravel/app/Http/Controllers/API/Third/YiJiController.php @@ -72,61 +72,96 @@ public function CheckAppointment() $entrust_ids[] = $item['orderNo']; $termCodes[] = $item['termCode']; $execDeptCodes[] = $item['execDeptCode']; - // UPSERT:原子操作,消除 SELECT + INSERT 之间的竞态 - $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, - '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, - ]; - - $columns = '`' . implode('`, `', array_keys($params)) . '`'; - $holders = implode(', ', array_fill(0, count($params), '?')); - $assigns = implode(', ', array_map(fn($k) => "`$k` = VALUES(`$k`)", array_keys($params))); - - $sql = "INSERT INTO `s_list` ({$columns}) VALUES ({$holders}) ON DUPLICATE KEY UPDATE {$assigns}"; - DB::statement($sql, array_values($params)); - - $rowCount = DB::select("SELECT ROW_COUNT() AS `affected`")[0]->affected; - $note = ($rowCount == 1) ? '创建记录' : 'MQ冲突更新'; + // 先查 s_list,区分"已存在"和"MQ 冲突"两种场景 + $db_item = DB::table('s_list')->where(['entrust_id' => $item['orderNo']])->first(); + + if ($db_item) { + // 情景 A:已存在,更新部分字段即可 + $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, + ]; + 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); + + DB::table('s_list_log')->insert([ + 'list_id' => $db_item->id, + 'reg_num' => $data_v['cardNo'], + 'old_status' => 0, + 'new_status' => 0, + 'create_user' => 'his', + 'note' => '创建记录', + 'data' => json_encode($params), + ]); + } else { + // 情景 B:不存在,全量 UPSERT 兜底(极短窗口内的 MQ 并发) + $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, + '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')->where('entrust_id', $item['orderNo'])->value('id'); + $columns = '`' . implode('`, `', array_keys($params)) . '`'; + $holders = implode(', ', array_fill(0, count($params), '?')); - 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' => $note, - 'data' => json_encode($params), - ]); + $updateFields = [ + 'medicalHistory', 'diagnosisName', 'his_is_emergency', + 'reservation_department_code', 'doctor_code', 'requestComment', + ]; + $assigns = implode(', ', array_map(fn($k) => "`$k` = VALUES(`$k`)", $updateFields)); + $assigns .= ", `warddesc` = IF(`wardcode` = VALUES(`wardcode`) AND `warddesc` != VALUES(`warddesc`), VALUES(`warddesc`), `warddesc`)"; + + $sql = "INSERT INTO `s_list` ({$columns}) VALUES ({$holders}) ON DUPLICATE KEY UPDATE {$assigns}"; + DB::statement($sql, array_values($params)); + + $rowCount = DB::select("SELECT ROW_COUNT() AS `affected`")[0]->affected; + $note = ($rowCount == 1) ? '创建记录' : 'MQ冲突更新'; + + $list_id = DB::table('s_list')->where('entrust_id', $item['orderNo'])->value('id'); + + 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' => $note, + 'data' => json_encode($params), + ]); + } } } }else{ @@ -707,4 +742,4 @@ public function TestGetApplyDetail() ])->setEncodingOptions(JSON_UNESCAPED_UNICODE); } } -} +} \ No newline at end of file