<?php
namespace app\common\service\order;
use app\common\library\helper;
use app\common\model\User as UserModel;
use app\common\model\Order as OrderModel;
use app\common\model\user\PointsLog;
use app\common\model\Setting as SettingModel;
use app\common\model\dealer\Order as DealerOrderModel;
use app\common\service\wechat\wow\Order as WowService;
use app\common\enum\OrderType as OrderTypeEnum;
class Complete
{
private $model;
private $UserModel;
public function __construct()
{
$this->model = new OrderModel;
$this->UserModel = new UserModel;
}
public function complete($orderList, $orderType, $wxappId)
{
if (SettingModel::getItem('trade', $wxappId)['order']['refund_days'] == 0) {
$this->settled($orderList);
}
foreach ($orderList as $order) {
DealerOrderModel::grantMoney($order, $orderType);
}
if ($orderType == OrderTypeEnum::MASTER) {
(new WowService($wxappId))->update($orderList);
}
return true;
}
public function settled($orderList)
{
$orderIds = helper::getArrayColumn($orderList, 'order_id');
$this->setIncUserExpend($orderList);
$this->setGiftPointsBonus($orderList);
$this->model->onBatchUpdate($orderIds, ['is_settled' => 1]);
return true;
}
private function setGiftPointsBonus($orderList)
{
$userData = [];
$logData = [];
foreach ($orderList as $order) {
$pointsBonus = $order['points_bonus'];
if ($pointsBonus <= 0) continue;
foreach ($order['goods'] as $goods) {
if (
!empty($goods['refund'])
&& $goods['refund']['type']['value'] == 10 && $goods['refund']['is_agree']['value'] == 10 ) {
$pointsBonus -= $goods['points_bonus'];
}
}
!isset($userData[$order['user_id']]) && $userData[$order['user_id']] = 0;
$userData[$order['user_id']] += $pointsBonus;
$logData[] = [
'user_id' => $order['user_id'],
'value' => $pointsBonus,
'describe' => "订单赠送:{$order['order_no']}",
'wxapp_id' => $order['wxapp_id'],
];
}
if (!empty($userData)) {
$this->UserModel->onBatchIncPoints($userData);
(new PointsLog)->onBatchAdd($logData);
}
return true;
}
private function setIncUserExpend($orderList)
{
$userData = [];
foreach ($orderList as $order) {
$expendMoney = $order['pay_price'];
foreach ($order['goods'] as $goods) {
if (
!empty($goods['refund'])
&& $goods['refund']['type']['value'] == 10 && $goods['refund']['is_agree']['value'] == 10 ) {
$expendMoney -= $goods['refund']['refund_money'];
}
}
!isset($userData[$order['user_id']]) && $userData[$order['user_id']] = 0.00;
$expendMoney > 0 && $userData[$order['user_id']] += $expendMoney;
}
$this->UserModel->onBatchIncExpendMoney($userData);
return true;
}
}