Files
hyperf_service/app/Amqp/Consumer/Statement/FinancesConsumer.php
2025-04-09 15:20:47 +08:00

131 lines
4.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Amqp\Consumer\Statement;
use App\Amqp\Producer\Statement\ChefProducer;
use App\Constants\Common\OrderCode;
use App\Lib\Log;
use App\Model\Cycle;
use App\Model\FinancesStatement;
use App\Model\Kitchen;
use App\Model\Order;
use Exception;
use Hyperf\Amqp\Message\Type;
use Hyperf\Amqp\Producer;
use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use Hyperf\Di\Annotation\Inject;
use PhpAmqpLib\Message\AMQPMessage;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
#[Consumer(exchange: 'Finances', routingKey: 'Finances', queue: 'Finances.statement', name: "FinancesConsumer", nums: 1)]
class FinancesConsumer extends ConsumerMessage
{
/**
* @var Type|string 消息类型
*/
protected Type|string $type = Type::DIRECT;
/**
* @var FinancesStatement
*/
#[Inject]
protected FinancesStatement $financesStatementModel;
/**
* @var Cycle
*/
#[Inject]
protected Cycle $cycleModel;
/**
* @var Kitchen
*/
#[Inject]
protected Kitchen $kitchenModel;
/**
* @var Order
*/
#[Inject]
protected Order $orderModel;
/**
* @var Producer
*/
#[Inject]
protected Producer $producer;
/**
* @var Log
*/
#[Inject]
protected Log $log;
/**
* @param $data
* @param AMQPMessage $message
* @return Result
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function consumeMessage($data, AMQPMessage $message): Result
{
try {
if (!$data['kitchen_id'] || !$data['cycle_id']) throw new Exception('FinancesConsumer:error:NoData:'.json_encode($data));
$kitchen = $this->kitchenModel->where('id',$data['kitchen_id'])->first();
$cycle = $this->cycleModel->where('id',$data['cycle_id'])->first();
if (empty($kitchen) || empty($cycle)) {
throw new Exception('FinancesConsumer:error:kitchenOrCycleError:'.json_encode([
'kitchen_id' => $data['kitchen_id'],
'cycle_id' => $data['cycle_id'],
'cycle' => $cycle,
'kitchen' => $kitchen,
'data' => $data,
]));
}
$statementInfo = $this->financesStatementModel->getStatementByCycleIdAndKitchenId((int)$data['cycle_id'],(int)$data['kitchen_id']);
if (!empty($statement)) $statementInfo->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()) {
throw new Exception('FinancesConsumer:error:FinancesStatement:'.json_encode([
'statement' => $statement,
'data' => $data,
]));
}
// 厨师商品结算节点 消息队列 - 生成结算数据
$chefMessage = new ChefProducer([
'cycle_id' => $data['cycle_id'],
'kitchen_id' => $data['kitchen_id'],
]);
$this->producer->produce($chefMessage);
return Result::ACK;
} catch (Exception $e) {
$this->log->error($e->getMessage());
return Result::ACK;
}
}
}