Твой код рабочий. getLastId() берёт mysqli->insert_id, а он привязан к соединению, поэтому при одновременном оформлении заказов каждый получит свой ID, путаницы не будет.
Но я бы сделал иначе:
1. Не править ядро, а повесить событие. addOrder правят многие модули через OCMOD (быстрые заказы, CRM, обмен с 1С). Правка в ядре может конфликтовать с ними и слетит при обновлении. В OC 3 / ocStore 3 на это есть событие catalog/model/checkout/order/addOrder/after, и в $output приходит готовый order_id.
catalog/controller/extension/module/invoice_eq_order.php:
<?php
class ControllerExtensionModuleInvoiceEqOrder extends Controller {
public function setInvoice(&$route, &$args, &$output) {
$order_id = (int)$output;
if ($order_id) {
$this->db->query("UPDATE `" . DB_PREFIX . "order` SET invoice_no = '" . $order_id . "' WHERE order_id = '" . $order_id . "' AND invoice_no = 0");
}
}
}
Регистрация (в install() модуля или одним разом):
$this->load->model('setting/event');
$this->model_setting_event->addEvent('invoice_eq_order', 'catalog/model/checkout/order/addOrder/after', 'extension/module/invoice_eq_order/setInvoice');
2. Подумай, в какой момент присваивать номер. addOrder срабатывает уже на шаге подтверждения, когда заказ ещё в статусе 0. Брошенные и неоплаченные заказы тоже получат счёт, и в нумерации счетов появятся дыры. Если счёт нужен только по реальным заказам, вешай событие на catalog/model/checkout/order/addOrderHistory/after. Там order_id лежит в $args[0], а $args[1] — новый статус. Номер ставь, когда статус входит в config_processing_status / config_complete_status.
3. Префикс. В админке счёт выводится как invoice_prefix + invoice_no, по умолчанию получится INV-2026-00123. Если нужен просто номер заказа, очисти префикс в настройках магазина. Он сохраняется в заказ при создании, так что у старых заказов останется прежний.
4. Кнопка «Сгенерировать» в админке. Она показывается только при invoice_no = 0, поэтому у новых заказов её не будет и стандартный createInvoiceNo() (MAX+1) их не перебьёт.
5. Старые заказы, если нужно их выровнять:
UPDATE oc_order SET invoice_no = order_id WHERE invoice_no = 0 AND order_status_id > 0;