where('store_id', $storeId)->where('id_card', $idCard)->find(); if (!$row) { try { Db::name('qyt_driver')->insert([ 'id_card' => $idCard, 'name' => $name, 'mobile' => $mobile, 'last_order_time' => $now, 'store_id' => $storeId, 'create_time' => $now, 'update_time' => $now, ]); } catch (\Throwable $e) { if (strpos($e->getMessage(), 'Duplicate') === false) { throw $e; } } $row = Db::name('qyt_driver')->where('store_id', $storeId)->where('id_card', $idCard)->find(); } $notes = self::detectConflicts($row, $name, $mobile); // 同一手机号挂在别的身份证号上:两边都标记 if ($mobile !== '') { $others = Db::name('qyt_driver') ->where('store_id', $storeId)->where('mobile', $mobile)->where('id_card', '<>', $idCard) ->column('driver_id'); if ($others) { $notes[] = '同一手机号对应多个身份证号'; Db::name('qyt_driver')->whereIn('driver_id', $others) ->update(['conflict' => 1, 'conflict_text' => '同一手机号对应多个身份证号', 'update_time' => $now]); } } $update = [ 'name' => $name !== '' ? $name : $row['name'], 'mobile' => $mobile !== '' ? $mobile : $row['mobile'], 'last_order_time' => $now, 'update_time' => $now, ]; if ($notes) { $update['conflict'] = 1; $update['conflict_text'] = mb_substr(implode(';', array_unique($notes)), 0, 250); } Db::name('qyt_driver')->where('driver_id', $row['driver_id'])->update($update); } catch (\Throwable $e) { (new QytOil())->saveLog('司机档案更新失败 order=' . ($order['order_id'] ?? '') . ':' . $e->getMessage()); } } /** * 纯函数:对比已有档案与本次下单的姓名 / 手机号 */ public static function detectConflicts(array $row, string $name, string $mobile): array { $notes = []; $oldName = (string) ($row['name'] ?? ''); $oldMobile = (string) ($row['mobile'] ?? ''); if ($oldName !== '' && $name !== '' && $oldName !== $name) { $notes[] = "同一身份证号出现不同姓名:{$oldName} / {$name}"; } if ($oldMobile !== '' && $mobile !== '' && $oldMobile !== $mobile) { $notes[] = '手机号变更:' . QytOil::maskMobile($oldMobile) . ' → ' . QytOil::maskMobile($mobile); } return $notes; } }