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); // $this->log->debug('OrderGoodStockConsumer:'.json_encode($this->orderGoodArr)); 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),//todo 退款后 库存不回收 因为存在退款一部分 无法核查 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; } $updateModel = new Sku(); try { Db::beginTransaction(); foreach (array_chunk($this->updateArr, 500) as $chunk) { foreach ($chunk as $item) { $updateModel->where('id',$item['id'])->update(array_diff_key($item, ['id' => null])); } } Db::commit(); // 确认提交 } catch (Throwable $e) { Db::rollBack(); // 出现异常时回滚 $this->log->debug('OrderGoodStockConsumer:error:UpdateSkuDataFail:msg:'.$e->getMessage().':data:'.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) + $orderGood['quantity'], '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) - $orderGood['quantity'], '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) - $orderGood['quantity'], 'surplus_stock' => ($this->skuArr[$orderGood['sku_id']]['surplus_stock'] ?? 0) + $orderGood['quantity'], ]; } } }