log->error('OrderGoodStockConsumer:error:NoData:'.json_encode($data)); return Result::ACK; } $orderId = (int)$data['order_id']; $this->orderGoodArr = []; $this->skuArr = []; $this->orderGoodArr = $this->orderGoodModel->getGoodIdsByOrderId($orderId); if (empty($this->orderGoodArr)) { $this->log->debug('OrderGoodStockConsumer:error:NoOrderGoodData:'.json_encode($orderId)); return Result::ACK; } $this->skuArr = $this->skuModel->getDataArrByIds(array_column($this->orderGoodArr, 'sku_id')); if (empty($this->skuArr)) { $this->log->debug('OrderGoodStockConsumer:error:NoSkuData:'.json_encode(array_column($this->orderGoodArr, 'sku_id'))); return Result::ACK; } $this->skuArr = array_column($this->skuArr, null,'id'); $this->updateArr = []; try { //todo 是否做个优化 截单后 不再增加库存 match ($data['type']) { OrderCode::WAIT_PAY => $this->waitPaySubStock(), OrderCode::CANCEL => $this->cancelAddStock(), OrderCode::FINISH_REFUND,OrderCode::UNCOMPLETED_REFUND => $this->RefundUpdateData($data), default => throw new Exception('OrderGoodStockConsumer:error:无效的订单类型') }; if (empty($this->updateArr)) { $this->log->debug('OrderGoodStockConsumer:error:NoUpdateData:skuInfo:'.json_encode($this->skuArr).':orderGoodArr:'.json_encode($this->orderGoodArr)); return Result::ACK; } if (!(new Sku)->update($this->updateArr)) { $this->log->debug('OrderGoodStockConsumer:error:UpdateSkuDataFail:'.json_encode($this->updateArr)); return Result::ACK; } return Result::ACK; } catch (Exception $e) { $this->log->error($e->getMessage()); return Result::ACK; } } /** * @return void */ private function waitPaySubStock(): void { foreach ($this->orderGoodArr as $orderGood) { $this->updateArr[] = [ 'id' => $orderGood['sku_id'], 'sales_num' => ($this->skuArr[$orderGood['sku_id']]['sales_num'] ?? 0) + $orderGood['quantity'], 'order_num' => ($this->skuArr[$orderGood['sku_id']]['order_num'] ?? 0) + 1, 'surplus_stock' => ($this->skuArr[$orderGood['sku_id']]['surplus_stock'] ?? 0) - $orderGood['quantity'], ]; } } /** * @param $data * @return void * @throws Exception */ private function RefundUpdateData($data): void { if (empty($data['refund_goods'])) throw new Exception('OrderGoodStockConsumer:error:UpdateSkuDataFail:'.json_encode($data)); foreach ($data['refund_goods'] as $orderGood) { $this->updateArr[] = [ 'id' => $orderGood['sku_id'], 'refund_num' => ($this->skuArr[$orderGood['sku_id']]['refund_num'] ?? 0) + $orderGood['quantity'], 'order_num' => ($this->skuArr[$orderGood['sku_id']]['order_num'] ?? 0) - 1, 'surplus_stock' => ($this->skuArr[$orderGood['sku_id']]['surplus_stock'] ?? 0) + $orderGood['quantity'], ]; } } /** * @return void */ private function cancelAddStock(): void { foreach ($this->orderGoodArr as $orderGood) { $this->updateArr[] = [ 'id' => $orderGood['sku_id'], 'cancel_num' => ($this->skuArr[$orderGood['sku_id']]['cancel_num'] ?? 0) + $orderGood['quantity'], 'order_num' => ($this->skuArr[$orderGood['sku_id']]['order_num'] ?? 0) - 1, 'surplus_stock' => ($this->skuArr[$orderGood['sku_id']]['surplus_stock'] ?? 0) + $orderGood['quantity'], ]; } } }