From 005fc4879ae730287c1f5b0482acd4cde842937e Mon Sep 17 00:00:00 2001 From: ctexthuang Date: Fri, 21 Mar 2025 17:41:10 +0800 Subject: [PATCH] feat : statement --- app/Amqp/Consumer/Statement/ChefConsumer.php | 19 +++ .../Consumer/Statement/DriverConsumer.php | 19 +++ .../Consumer/Statement/FinancesConsumer.php | 113 ++++++++++++++++++ app/Amqp/Consumer/Statement/SiteConsumer.php | 19 +++ app/Amqp/Producer/Statement/ChefProducer.php | 24 ++++ .../Producer/Statement/DriverProducer.php | 24 ++++ .../Producer/Statement/FinancesProducer.php | 27 +++++ app/Amqp/Producer/Statement/SiteProducer.php | 24 ++++ app/Controller/Admin/OrderController.php | 12 +- app/Model/FinancesStatement.php | 54 +++++++++ app/Model/Order.php | 52 ++++++++ app/Service/Admin/Order/FinishService.php | 65 ++++++++++ 12 files changed, 450 insertions(+), 2 deletions(-) create mode 100644 app/Amqp/Consumer/Statement/ChefConsumer.php create mode 100644 app/Amqp/Consumer/Statement/DriverConsumer.php create mode 100644 app/Amqp/Consumer/Statement/FinancesConsumer.php create mode 100644 app/Amqp/Consumer/Statement/SiteConsumer.php create mode 100644 app/Amqp/Producer/Statement/ChefProducer.php create mode 100644 app/Amqp/Producer/Statement/DriverProducer.php create mode 100644 app/Amqp/Producer/Statement/FinancesProducer.php create mode 100644 app/Amqp/Producer/Statement/SiteProducer.php create mode 100644 app/Model/FinancesStatement.php create mode 100644 app/Service/Admin/Order/FinishService.php diff --git a/app/Amqp/Consumer/Statement/ChefConsumer.php b/app/Amqp/Consumer/Statement/ChefConsumer.php new file mode 100644 index 0000000..24720e1 --- /dev/null +++ b/app/Amqp/Consumer/Statement/ChefConsumer.php @@ -0,0 +1,19 @@ +log->error('FinancesConsumer:error:NoData:'.json_encode($data)); + return Result::ACK; + } + + $kitchen = $this->kitchenModel->where('id',$data['kitchen_id'])->first(); + $cycle = $this->cycleModel->where('id',$data['cycle_id'])->first(); + if (empty($kitchen) || empty($cycle)) { + $this->log->error('FinancesConsumer:error:kitchenOrCycleError:'.json_encode([ + 'kitchen_id' => $data['kitchen_id'], + 'cycle_id' => $data['cycle_id'], + 'cycle' => $cycle, + 'kitchen' => $kitchen, + 'data' => $data, + ])); + return Result::ACK; + } + + $statement = $this->financesStatementModel->getStatementByCycleIdAndKitchenId($data['cycle_id'],$data['kitchen_id']); + if (!empty($statement)) $statement->delete(); + + $statement = new FinancesStatement(); + + $statement->date = $cycle->dates; + $statement->cycle_id = $cycle->id; + $statement->kitchen_id = $kitchen->id; + $statement->discounts = $this->orderModel->getDiscountsByCycleIdAndKitchenId($cycle->id, $kitchen->id); + $statement->net_sales = $this->orderModel->getNetSalesByCycleIdAndKitchenId($cycle->id, $kitchen->id); + $statement->gross_sales = $statement->net_sales + $statement->discounts; + $statement->option_order_number = $this->orderModel->getOrderNumberByCycleIdAndKitchenId($cycle->id, $kitchen->id, OrderCode::ORDER_TYPE_OPTIONAL); + $statement->option_copies = $this->orderModel->getCopiesByCycleIdAndKitchenId($cycle->id, $kitchen->id, OrderCode::ORDER_TYPE_OPTIONAL); + $statement->meal_order_number = $this->orderModel->getOrderNumberByCycleIdAndKitchenId($cycle->id, $kitchen->id, OrderCode::ORDER_TYPE_MEAL); + $statement->meal_copies = $this->orderModel->getCopiesByCycleIdAndKitchenId($cycle->id, $kitchen->id, OrderCode::ORDER_TYPE_MEAL); + + if (!$statement->save()) { + $this->log->error('FinancesConsumer:error:FinancesStatement:'.json_encode([ + 'statement' => $statement, + 'data' => $data, + ])); + } + + return Result::ACK; + } +} diff --git a/app/Amqp/Consumer/Statement/SiteConsumer.php b/app/Amqp/Consumer/Statement/SiteConsumer.php new file mode 100644 index 0000000..bea2db8 --- /dev/null +++ b/app/Amqp/Consumer/Statement/SiteConsumer.php @@ -0,0 +1,19 @@ +payload = $data; + } +} diff --git a/app/Amqp/Producer/Statement/DriverProducer.php b/app/Amqp/Producer/Statement/DriverProducer.php new file mode 100644 index 0000000..3e21185 --- /dev/null +++ b/app/Amqp/Producer/Statement/DriverProducer.php @@ -0,0 +1,24 @@ +payload = $data; + } +} diff --git a/app/Amqp/Producer/Statement/FinancesProducer.php b/app/Amqp/Producer/Statement/FinancesProducer.php new file mode 100644 index 0000000..f027884 --- /dev/null +++ b/app/Amqp/Producer/Statement/FinancesProducer.php @@ -0,0 +1,27 @@ + {"kitchen_id":"kitchen_id","cycle_id":"cycle_id"} + */ + $this->payload = $data; + } +} diff --git a/app/Amqp/Producer/Statement/SiteProducer.php b/app/Amqp/Producer/Statement/SiteProducer.php new file mode 100644 index 0000000..f70532f --- /dev/null +++ b/app/Amqp/Producer/Statement/SiteProducer.php @@ -0,0 +1,24 @@ +payload = $data; + } +} diff --git a/app/Controller/Admin/OrderController.php b/app/Controller/Admin/OrderController.php index fbf1324..ec79b16 100644 --- a/app/Controller/Admin/OrderController.php +++ b/app/Controller/Admin/OrderController.php @@ -6,6 +6,7 @@ namespace App\Controller\Admin; use App\Controller\AbstractController; use App\Middleware\Admin\JwtAuthMiddleware; +use App\Service\Admin\Order\FinishService; use App\Service\Admin\Order\OrderInfoService; use App\Service\Admin\Order\OrderListService; use App\Service\Admin\Order\RefundService; @@ -29,18 +30,25 @@ class OrderController extends AbstractController */ #[RequestMapping(path: "list", methods: "GET")] #[Scene(scene: "list")] - public function list() + public function list(): array { return (new OrderListService())->handle(); } #[RequestMapping(path: "info", methods: "GET")] #[Scene(scene: "info")] - public function info() + public function info(): array { return (new OrderInfoService())->handle(); } + #[RequestMapping(path: "finish", methods: "GET")] + #[Scene(scene: "finish")] + public function finish(): array + { + return (new FinishService())->handle(); + } + /** * @return array * @throws ContainerExceptionInterface diff --git a/app/Model/FinancesStatement.php b/app/Model/FinancesStatement.php new file mode 100644 index 0000000..7b90460 --- /dev/null +++ b/app/Model/FinancesStatement.php @@ -0,0 +1,54 @@ + 'integer', 'cycle_id' => 'integer', 'kitchen_id' => 'integer', 'option_order_nnumber' => 'integer', 'option_copies' => 'integer', 'meal_order_number' => 'integer', 'meal_copies' => 'integer']; + + const string CREATED_AT = 'create_time'; + const null UPDATED_AT = null; + + /** + * @param int $cycleId + * @param int $kitchenId + * @return Builder|\Hyperf\Database\Model\Model|FinancesStatement|null + */ + public function getStatementByCycleIdAndKitchenId(int $cycleId,int $kitchenId): \Hyperf\Database\Model\Model|FinancesStatement|Builder|null + { + return $this->where('cycle_id',$cycleId)->where('kitchen_id',$kitchenId)->first(); + } +} diff --git a/app/Model/Order.php b/app/Model/Order.php index 2ad87cb..25986c2 100644 --- a/app/Model/Order.php +++ b/app/Model/Order.php @@ -87,4 +87,56 @@ class Order extends Model 'status' => OrderCode::PLAN ]); } + + /** + * @param int $cycleId + * @param int $kitchenId + * @return int|mixed|string + */ + public function getDiscountsByCycleIdAndKitchenId(int $cycleId, int $kitchenId): mixed + { + return $this->where('cycle_id',$cycleId)->where('kitchen_id',$kitchenId)->where('status',OrderCode::FINISH)->sum('discounts') ?? 0; + } + + /** + * @param int $cycleId + * @param int $kitchenId + * @return int|mixed|string + */ + public function getNetSalesByCycleIdAndKitchenId(int $cycleId, int $kitchenId): mixed + { + return $this->where('cycle_id',$cycleId)->where('kitchen_id',$kitchenId)->where('status',OrderCode::FINISH)->sum('actual_price') ?? 0; + } + + /** + * @param int $cycleId + * @param int $kitchenId + * @param int $type + * @return int + */ + public function getOrderNumberByCycleIdAndKitchenId(int $cycleId, int $kitchenId,int $type): int + { + return $this + ->where('cycle_id',$cycleId) + ->where('kitchen_id',$kitchenId) + ->where('type',$type) + ->where('status',OrderCode::FINISH) + ->count() ?? 0; + } + + /** + * @param int $cycleId + * @param int $kitchenId + * @param int $type + * @return int + */ + public function getCopiesByCycleIdAndKitchenId(int $cycleId, int $kitchenId,int $type): int + { + return $this + ->where('cycle_id',$cycleId) + ->where('kitchen_id',$kitchenId) + ->where('type',$type) + ->where('status',OrderCode::FINISH) + ->sum('copies') ?? 0; + } } diff --git a/app/Service/Admin/Order/FinishService.php b/app/Service/Admin/Order/FinishService.php new file mode 100644 index 0000000..7de0596 --- /dev/null +++ b/app/Service/Admin/Order/FinishService.php @@ -0,0 +1,65 @@ +request->input('kitchenId'); + $cycleId = (int)$this->request->input('cycleId'); + + $orderIds = $this->orderModel + ->where('kitchen_id', $kitchenId) + ->where('cycle_id', $cycleId) + ->whereIn('status', [ + OrderCode::PLAN, + OrderCode::DEPART, + OrderCode::ARRIVE, + ]) + ->pluck('id') + ->toArray(); + + Db::transaction(function () use ($orderIds) { + foreach (array_chunk($orderIds, 100) as $chunk) { + $orderFinish = $this->orderModel->whereIn('id', $chunk)->update(['status' => OrderCode::FINISH]); + + $orderGoodFinish = $this->orderGoodModel->whereIn('order_id', $chunk)->update(['status' => OrderCode::FINISH]); + + if (!$orderFinish && !$orderGoodFinish) throw new ErrException('更新失败,数据回滚,请重新操作'); + } + }); + + + + return $this->return->success(); + } +} \ No newline at end of file