You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
yanzong/app/store/service/Coupon.php

89 lines
3.0 KiB

11 months ago
<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace app\store\service;
use app\store\model\Coupon as CouponModel;
use app\store\model\UserCoupon as UserCouponModel;
use app\common\service\BaseService;
use cores\exception\BaseException;
/**
* 优惠券服务类
* Class Coupon
* @package app\store\service
*/
class Coupon extends BaseService
{
/**
* 批量发放优惠券
* @param array $data
* @return bool
* @throws BaseException
*/
public function give(array $data): bool
{
// 获取优惠券信息
$couponInfo = CouponModel::detail($data['couponId']);
// 验证优惠券是否可领取
$this->checkReceive($couponInfo, $data);
// 发放给指定的用户
if ($data['type'] == 10) {
return $this->receive($couponInfo, $data['target']['userIds']);
}
return true;
}
/**
* 执行批量领取优惠券
* @param CouponModel $couponInfo 优惠券详情
* @param array $userIds 用户ID集
* @return bool
* @throws BaseException
*/
private function receive(CouponModel $couponInfo, array $userIds): bool
{
foreach ($userIds as $userId) {
// 验证当前用户是否已领取
if (UserCouponModel::checktUserCoupon($couponInfo['coupon_id'], $userId)) {
throwError("用户(ID:{$userId}) 已领取该优惠券,不能重复发放");
}
// 添加领取记录
$model = new UserCouponModel;
$model->add($userId, $couponInfo);
}
return true;
}
/**
* 验证优惠券是否可领取
* @param CouponModel $couponInfo 优惠券详情
* @param array $data
* @throws BaseException
*/
private function checkReceive(CouponModel $couponInfo, array $data)
{
// 验证优惠券状态是否可领取
$model = new CouponModel;
if (!$model->checkReceive($couponInfo)) {
throwError($model->getError());
}
// 验证优惠券数量是否充足
$quantity = 0;
if ($data['type'] == 10) {
$quantity = count($data['target']['userIds']);
}
if ($couponInfo['total_num'] > -1 && ($couponInfo['receive_num'] + $quantity) > $couponInfo['total_num']) {
throwError('很抱歉,优惠券剩余数量不足 无法发放');
}
}
}