From 31f60317a9a039bf0b601ef63a6a65c38938f589 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Mon, 13 Oct 2025 16:20:39 +0300 Subject: [PATCH] =?utf8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?utf8?q?=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=D0=BE=20?= =?utf8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- erp24/api2/controllers/DataController.php | 8 ++ .../MarketplaceOrdersController.php | 25 ++++- .../controllers/NotificationController.php | 23 +---- erp24/records/MarketplaceOrderStatusTypes.php | 1 + erp24/services/MarketplaceService.php | 97 ++++++++++++++++--- 5 files changed, 114 insertions(+), 40 deletions(-) diff --git a/erp24/api2/controllers/DataController.php b/erp24/api2/controllers/DataController.php index 742f5dfc..4a236fc3 100644 --- a/erp24/api2/controllers/DataController.php +++ b/erp24/api2/controllers/DataController.php @@ -3259,6 +3259,7 @@ class DataController extends BaseController ->all(); $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]['id']; $readyStatusId = $statuses[MarketplaceOrderStatusTypes::READY_CODE]['id']; + $deliveredStatusId = $statuses['DELIVERED']['id']; $status = $mpOrder['status']; $marketplaceOrder = MarketplaceOrders::find() ->where(['guid' => $mpOrder['id']]) @@ -3314,6 +3315,13 @@ class DataController extends BaseController return $errorJson; } + // Проверяем, если заказ уже имеет статус CANCELLED или DELIVERED, то не меняем статусы + if ($marketplaceOrder->status_id === $cancelledStatusId || $marketplaceOrder->status_id === $deliveredStatusId) { + $result['status'] = 'no_change'; + $result['message'] = 'Заказ уже имеет финальный статус (CANCELLED или DELIVERED) ' . $mpOrder['id']; + return $result; + } + // Получаем статусы МП по статусу 1С /** @var $status MarketplaceOrderStatusTypes */ /** @var $substatus MarketplaceOrderStatusTypes */ diff --git a/erp24/controllers/MarketplaceOrdersController.php b/erp24/controllers/MarketplaceOrdersController.php index 10ca79ad..de671206 100644 --- a/erp24/controllers/MarketplaceOrdersController.php +++ b/erp24/controllers/MarketplaceOrdersController.php @@ -24,6 +24,7 @@ use yii\web\NotFoundHttpException; use yii\filters\VerbFilter; use yii_app\records\MarketplaceOrderStatusHistory; use yii_app\records\MarketplaceOrderStatusTypes; +use yii_app\records\MarketplaceOrder1cStatuses; use yii_app\records\MarketplaceStore; use yii_app\records\MatrixErp; use yii_app\records\Prices; @@ -749,7 +750,17 @@ class MarketplaceOrdersController extends Controller $model->status_id = $statusCancelled->id; $model->substatus_id = $substatusFailed->id; $model->cancelled_order_source = 'ERP'; - $model->cancelled_order_date = date('Y-m-d H:m:s'); + $model->cancelled_order_date = date('Y-m-d H:i:s'); + + // Устанавливаем status_processing_1c для отмены + $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() + ->where(['order_status_id' => $statusCancelled->id]) + ->andWhere(['marketplace_id' => $model->marketplace_id]) + ->asArray() + ->all(), 'id')[0] ?? null; + if ($status1cWithCancelledId !== null) { + $model->status_processing_1c = $status1cWithCancelledId; + } if ((int)$model->marketplace_id === MarketplaceStore::YANDEX_WAREHOUSE_ID) { $rawData = json_decode($model->raw_data, true, 512, JSON_THROW_ON_ERROR); $rawData['status'] = $statusCancelled->code; @@ -792,7 +803,17 @@ class MarketplaceOrdersController extends Controller $model->status_id = $statusCancelled->id; $model->substatus_id = $substatusFailed->id; $model->cancelled_order_source = 'ERP'; - $model->cancelled_order_date = date('Y-m-d H:m:s'); + $model->cancelled_order_date = date('Y-m-d H:i:s'); + + // Устанавливаем status_processing_1c для отмены + $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() + ->where(['order_status_id' => $statusCancelled->id]) + ->andWhere(['marketplace_id' => $model->marketplace_id]) + ->asArray() + ->all(), 'id')[0] ?? null; + if ($status1cWithCancelledId !== null) { + $model->status_processing_1c = $status1cWithCancelledId; + } if (!$model->save()) { Yii::error('Ошибка сохранения модели: ' . json_encode($model->getErrors(), JSON_UNESCAPED_UNICODE)); diff --git a/erp24/media/controllers/NotificationController.php b/erp24/media/controllers/NotificationController.php index 24902e34..894232e4 100644 --- a/erp24/media/controllers/NotificationController.php +++ b/erp24/media/controllers/NotificationController.php @@ -104,17 +104,7 @@ class NotificationController extends Controller } */ - $statuses = MarketplaceOrderStatusTypes::find() - ->select(['id', 'code']) - ->indexBy('code') - ->asArray() - ->all(); - $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]['id']; - $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() - ->where(['order_status_id' => $cancelledStatusId]) - ->andWhere(['marketplace_id' => 2]) - ->asArray() - ->all(), 'id'); + $rawBody = Yii::$app->request->getRawBody(); // if (!is_dir(self::getPathNotification())) { @@ -315,17 +305,6 @@ class NotificationController extends Controller ]); } $result = MarketplaceService::processOrders($orderData); - $order = MarketplaceOrders::find() - ->where(['marketplace_order_id' => (string)$orderId]) - ->one(); - if ($order) { - $order->cancelled_order_source = 'Yandex Market'; - $order->status_processing_1c = $status1cWithCancelledId; - $order->cancelled_order_date = date('Y-m-d H:m:s'); - if (!$order->save()) { - Yii::error('Ошибка сохранения заказа ' . json_encode($order->getErrors(), JSON_UNESCAPED_UNICODE)); - } - } return $this->asJson([ 'version' => '1.0.0', 'name' => 'БазаЦветов24', diff --git a/erp24/records/MarketplaceOrderStatusTypes.php b/erp24/records/MarketplaceOrderStatusTypes.php index 4a34061c..3475db92 100644 --- a/erp24/records/MarketplaceOrderStatusTypes.php +++ b/erp24/records/MarketplaceOrderStatusTypes.php @@ -26,6 +26,7 @@ class MarketplaceOrderStatusTypes extends \yii\db\ActiveRecord [ 'class' => TimestampBehavior::class, 'createdAtAttribute' => 'created_at', + 'updatedAtAttribute' => false, 'value' => new Expression('NOW()'), ], ]; diff --git a/erp24/services/MarketplaceService.php b/erp24/services/MarketplaceService.php index f39bf1d8..fb5c079d 100644 --- a/erp24/services/MarketplaceService.php +++ b/erp24/services/MarketplaceService.php @@ -1196,6 +1196,20 @@ class MarketplaceService $marketplaceOrder->raw_data = $newRawData; $marketplaceOrder->status_1c = MarketplaceOrders::STATUSES_1C_CREATED_IN_ERP; + // Логика отмены для Яндекс.Маркета: если заказ получен уже отмененным + if ($statusCode === 'CANCELLED') { + $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE] ?? null; + if ($cancelledStatusId) { + $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() + ->where(['order_status_id' => $cancelledStatusId]) + ->andWhere(['marketplace_id' => 2]) + ->asArray() + ->all(), 'id')[0] ?? null; + $marketplaceOrder->cancelled_order_source = 'Yandex Market'; + $marketplaceOrder->status_processing_1c = $status1cWithCancelledId; + $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s'); + } + } if ($marketplaceOrder->save()) { self::sendMessageToTelegram($marketplaceOrder->guid, "Новый заказ из ЯМ"); @@ -1348,7 +1362,21 @@ class MarketplaceService ) ); } - } else { + } else { + // Логика отмены для ЯндексМаркета: если статус обновлен на отмену + if ($statusCode === 'CANCELLED' && $marketplaceOrder) { + $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE] ?? null; + if ($cancelledStatusId) { + $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() + ->where(['order_status_id' => $cancelledStatusId]) + ->andWhere(['marketplace_id' => 2]) + ->asArray() + ->all(), 'id')[0] ?? null; + $marketplaceOrder->cancelled_order_source = 'Yandex Market'; + $marketplaceOrder->status_processing_1c = $status1cWithCancelledId; + $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s'); + } + } // создание чеков if ($marketplaceOrder->status->code == 'DELIVERED' && $marketplaceOrder->substatus->code == 'DELIVERY_SERVICE_DELIVERED' && @@ -1546,6 +1574,22 @@ class MarketplaceService $marketplaceOrder->save(); $updatedOrdersCount += 1; } + + // Логика отмены для ЯндексМаркета: если статус обновлен на отмену + if ($statusCode === 'CANCELLED' && $marketplaceOrder) { + $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE] ?? null; + if ($cancelledStatusId) { + $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() + ->where(['order_status_id' => $cancelledStatusId]) + ->andWhere(['marketplace_id' => 2]) + ->asArray() + ->all(), 'id')[0] ?? null; + $marketplaceOrder->cancelled_order_source = 'Yandex Market'; + $marketplaceOrder->status_processing_1c = $status1cWithCancelledId; + $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s'); + } + } + if (!$marketplaceOrder->delivery_to && $marketplaceOrder->readyto_1c === 0) { $delivery = $order->getDelivery(); $shipments = $delivery->getShipments(); @@ -1956,12 +2000,13 @@ class MarketplaceService ->indexBy('code') ->asArray() ->all(); - $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]['id']; + $statuses = ArrayHelper::map($statuses, 'code', 'id'); + $cancelledStatusId = $statuses[MarketplaceOrderStatusTypes::CANSELLED_CODE]; $status1cWithCancelledId = ArrayHelper::getColumn(MarketplaceOrder1cStatuses::find() ->where(['order_status_id' => $cancelledStatusId]) ->andWhere(['marketplace_id' => 1]) ->asArray() - ->all(), 'id'); + ->all(), 'id')[0] ?? null;; $order = self::getOrdersDataFromMessage($message); if ($message['subject_index'] == self::SUBJECT_INDEX[self::SUBJECT_NEW]) { @@ -1990,14 +2035,7 @@ class MarketplaceService $isCheckCreated = self::createCheckForMarketplaceOrder($marketplaceOrder); } if ($statusCode == MarketplaceOrderStatusTypes::CANSELLED_CODE && $substatusCode == 'USER_CHANGED_MIND' && $marketplaceOrder) { - Yii::error('Заказ ' . $marketplaceOrder->marketplace_order_id); - /* @var $marketplaceOrder MarketplaceOrders */ - $marketplaceOrder->cancelled_order_source = 'Flowwow'; - $marketplaceOrder->status_processing_1c = $status1cWithCancelledId; - $marketplaceOrder->cancelled_order_date = date('Y-m-d H:m:s'); - if (!$marketplaceOrder->save()) { - Yii::error('Метки отмены заказа не проставлены ' . $marketplaceOrder->marketplace_order_id); - } + self::cancelFlowwowOrder($marketplaceOrder, $status1cWithCancelledId, true); } } return $count; @@ -2334,11 +2372,6 @@ class MarketplaceService } } else { // отмена или успешное выполнение - if ($index == self::SUBJECT_INDEX[self::SUBJECT_CANCELLED]) { - /** @var $marketplaceOrder MarketplaceOrders */ - $marketplaceOrder->cancelled_order_source = 'Flowwow'; - $marketplaceOrder->cancelled_order_date = date('Y-m-d H:m:s'); - } if ($marketplaceOrder->save()) { self::createOrUpdateStatusHistory($marketplaceOrder->id, $statusId, $substatusId, $orderDetails); } else { @@ -2352,6 +2385,38 @@ class MarketplaceService return $newOrdersCount; } + /** + * Обработка отмены заказа Flowwow + * + * @param MarketplaceOrders $marketplaceOrder + * @param int|null $status1cWithCancelledId + * @param bool $logError + * @return bool + */ + private static function cancelFlowwowOrder($marketplaceOrder, $status1cWithCancelledId = null, $logError = false) + { + /** @var $marketplaceOrder MarketplaceOrders */ + $marketplaceOrder->cancelled_order_source = 'Flowwow'; + $marketplaceOrder->cancelled_order_date = date('Y-m-d H:i:s'); + + if ($status1cWithCancelledId !== null) { + $marketplaceOrder->status_processing_1c = $status1cWithCancelledId; + } + + if ($logError) { + Yii::error('Заказ ' . $marketplaceOrder->marketplace_order_id); + } + + if (!$marketplaceOrder->save()) { + if ($logError) { + Yii::error('Метки отмены заказа не проставлены ' . $marketplaceOrder->marketplace_order_id); + } + return false; + } + + return true; + } + public static function getOrCreateStatus($statusCode, &$statuses, &$statusCodes) { if (!in_array($statusCode, $statusCodes)) { -- 2.39.5