<?php
namespace app\api\behavior\order;
use app\common\service\Message as MessageService;
use app\common\service\order\Printer as PrinterService;
use app\common\service\wechat\wow\Order as WowOrder;
use app\common\enum\OrderType as OrderTypeEnum;
use app\common\enum\OrderStatus as OrderStatusEnum;
use app\common\enum\order\OrderSource as OrderSourceEnum;
class PaySuccess
{
private $order;
private $orderType;
private $wxappId;
protected $sourceCallbackClass = [
OrderSourceEnum::MASTER => 'app\api\service\master\order\PaySuccess',
OrderSourceEnum::BARGAIN => 'app\api\service\bargain\order\PaySuccess',
OrderSourceEnum::SHARP => 'app\api\service\sharp\order\PaySuccess',
];
public function run($order, $orderType = OrderTypeEnum::MASTER)
{
$this->setAttribute($order, $orderType);
$this->onCommonEvent();
if ($orderType == OrderTypeEnum::MASTER) {
$this->onMasterEvent();
}
$this->onSourceCallback();
return true;
}
private function setAttribute($order, $orderType = OrderTypeEnum::MASTER)
{
$this->order = $order;
$this->wxappId = $this->order['wxapp_id'];
$this->orderType = $orderType;
}
private function onCommonEvent()
{
(new MessageService)->payment($this->order, $this->orderType);
(new PrinterService)->printTicket($this->order, OrderStatusEnum::ORDER_PAYMENT);
}
private function onMasterEvent()
{
(new WowOrder($this->wxappId))->import([$this->order], true);
}
private function onSourceCallback()
{
if (!isset($this->order['order_source'])) {
return false;
}
if (!isset($this->sourceCallbackClass[$this->order['order_source']])) {
return false;
}
$class = $this->sourceCallbackClass[$this->order['order_source']];
return !is_null($class) ? (new $class)->onPaySuccess($this->order) : false;
}
}