admin/app/common/services/finance/TransferDeductPointService.php

98 lines
3.0 KiB
PHP

<?php
namespace app\common\services\finance;
use app\common\events\member\MemberBalanceChangeEvent;
use app\common\exceptions\ShopException;
use app\common\facades\Setting;
use app\common\models\Member;
use app\common\services\credit\ConstService;
use Illuminate\Support\Facades\DB;
class TransferDeductPointService extends DeductPointService
{
/**
* @var MemberBalanceChangeEvent
*/
protected $event;
public function __construct()
{
$this->balanceSet = Setting::get('finance.balance');
$this->deductBalance = $this->balanceSet['deduct_balance'] ?: 1;
$this->deductPoint = $this->balanceSet['deduct_point'] ?: 1;
}
/**
* 验证
* @return bool
*/
protected function validate(): bool
{
$record = $this->event->getRecordData();
if (!$this->balanceSet['deduct_status']) {
return false;
}
//不是转账
if (ConstService::SOURCE_TRANSFER != $this->event->getSource()) {
return false;
}
//转账的操作者不是同一人
if ($record['operator_id'] != $record['member_id']) {
return false;
}
return true;
}
/**
* 扣除积分
* @param MemberBalanceChangeEvent $event
* @return void
*/
public function deductPoint(MemberBalanceChangeEvent $event)
{
$this->event = $event;
if (!$this->validate()) {
return;
}
$change_money = abs($event->getChangeValue());
$need_deduct_point = $this->getNeedDeductPoint($change_money);
$record = $event->getRecordData();
$credit1 = Member::where('uid', $event->getMember()->uid)->value('credit1') ?: 0;
if ($need_deduct_point > $credit1) {
throw new ShopException("转让需扣除" . $need_deduct_point . self::getPointName() . ",您的" . self::getPointName() . "不足");
}
try {
$remark = self::getBalanceName() . "转账{$change_money},
扣除{$need_deduct_point}" . self::getPointName() . ",
扣除比例{$this->deductBalance}:{$this->deductPoint}.
转账记录编号【{$record['serial_number']}
";
$this->changePoint($need_deduct_point, PointService::BALANCE_TRANSFER_DEDUCT_PONINT, $remark, PointService::POINT_INCOME_LOSE);
} catch (ShopException $e) {
\Log::debug('--余额转账扣除积分--失败', [
'uid' => $event->getMember()->uid,
'msg' => $e->getMessage(),
'transfer_balance_sn' => $record['serial_number'],
]);
throw $e;
}
}
protected function changePoint($point, string $pointMode, string $remark, int $pointIncomeType, $memberId = 0, $relationId = 0)
{
$memberId = $this->event->getMember()->uid;
$relationId = $this->event->getRecordData()['serial_number'];
return parent::changePoint($point, $pointMode, $remark, $pointIncomeType, $memberId, $relationId);
}
}