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.

199 lines
6.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\discount\service;
use app\discount\model\DiscountCoupon;
use app\discount\model\DiscountCouponMy;
use app\integral\logic\Integral;
use Godruoyi\Snowflake\Snowflake;
use think\facade\Db;
class MyCoupon extends Base
{
/**
* 插入我的优惠券
* @param array $coupon_ids 免费领取的优惠券ID数组
* @date 2022-10-17
*/
public function insertMyCoupon($coupon_ids = [])
{
$coupon_model = new DiscountCoupon();
$coupon_my_model = new DiscountCouponMy();
$integral_logic = new Integral();
$integral_service = new \app\integral\service\Integral();
$snow_flake_class = new Snowflake();
// 没有优惠券ID直接返回成功
if (empty($coupon_ids)) {
return sendSuccessArray();
}
// 获取优惠券列表
$coupon_list = $coupon_model->listCoupon([
['id', 'in', $coupon_ids]
], 'id,type,name,price,integral,brief,limit_price,total_number,receive_number,per_people_number,validity_type,start_time,end_time,validity_days');
// 获取我领取的优惠券以及张数
$my_coupon_number = $coupon_my_model->countMyCouponByCoupon();
// 我可以兑换的优惠券列表
$coupon_my_list = [];
$integral_log = []; //积分兑换优惠券数据明细
// 转为数组
$coupon_list = $coupon_list->toArray();
foreach ($coupon_list as $k => $v) {
// 个人领取数量到达上限 有领取该优惠券 && 限制数量 && 领取张数>=限制张数
if (isset($my_coupon_number[$v['id']]) && $v['per_people_number'] != 0 && $my_coupon_number[$v['id']] >= $v['per_people_number']) {
continue;
}
// 优惠券已抢光
if ($v['total_number'] - $v['receive_number'] <= 0) {
continue;
}
// 我的优惠券数据
$my_coupon = [
// 雪花ID
'id' => $snow_flake_class->id(),
'uid' => $this->mid,
'user_agent' => $this->userAgent,
'user_id' => $this->userId,
'coupon_id' => $v['id'],
// 优惠券类型 1--领取优惠券 2--首关优惠券 3--下单给自己送优惠券 4--分享给自己送优惠券 5--分享给别人送优惠券 6--生日优惠券 7--积分商城兑换优惠券 8--兑换码兑换优惠券
'coupon_type' => $v['type'],
'name' => $v['name'],
'limit_price' => $v['limit_price'],
'price' => $v['price'],
'brief' => $v['brief'],
'status' => 1,
'remark' => serialize([
'coupon_id' => $v['id']
]),
'create_time' => time(),
'update_time' => time()
];
// 优惠券有效时间类型 1--固定日期 2--X天后 3--永久有效
if ($v['validity_type'] == 1) {
$my_coupon['is_forever'] = 0;
$my_coupon['start_time'] = $v['start_time'];
$my_coupon['end_time'] = $v['end_time'];
} else if ($v['validity_type'] == 2) {
$my_coupon['is_forever'] = 0;
$my_coupon['start_time'] = strtotime(date("Y-m-d"));
$my_coupon['end_time'] = strtotime(date("Y-m-d")) + ($v['validity_days'] + 1) * 86400;
} else if ($v['validity_type'] == 3) {
$my_coupon['is_forever'] = 1;
$my_coupon['start_time'] = strtotime(date("Y-m-d"));
$my_coupon['end_time'] = 0;
}
// 追加到待添加我的优惠券列表
$coupon_my_list[] = $my_coupon;
// 优惠券表数据
$coupon_update_list[] = [
'id' => $v['id'],
// 已领取人数增加
'receive_number' => Db::raw('receive_number + 1'),
'update_time' => time()
];
// type=7时积分兑换优惠券
if ($v['type'] == 7) {
// 积分大于0时需要记录
if ($v['integral'] >= 0) {
$integral_log[] = [
// 兑换优惠券的积分数量
'integral' => $v['integral'],
'coupon_my_id' => $my_coupon['id'],
'coupon_id' => $v['id']
];
}
}
}
// 没有可以领取的优惠券
if (empty($coupon_my_list)) {
return sendErrorArray(3001, '没有可以领取的优惠券,有可能是优惠券可领取张数已达上限');
}
// 批量插入我的优惠券
$res = $coupon_my_model->insertAll($coupon_my_list);
if (!$res) {
return sendErrorArray(3002, '领取失败');
}
// 批量更新优惠券库存
$res = $coupon_model->saveAll($coupon_update_list);
if (!$res) {
return sendErrorArray(3003, '领取失败');
}
// 如果有积分兑换优惠券,则扣除积分
if (!empty($integral_log)) {
foreach ($integral_log as $k => $v) {
$res = $integral_service->change($this->userId, 6, -$v['integral'], '积分兑换优惠券', '', [
'coupon_id' => $v['coupon_id'],
'coupon_my_id' => $v['coupon_my_id']
]);
if ($res['code'] != 0) {
return $res;
}
}
}
return sendSuccessArray();
}
/**
* 选择我的优惠券列表
* @param float $price 商品总价钱
* @date 2022-10-17
*/
public function listChooseCoupon($price)
{
$coupon_my_model = new DiscountCouponMy();
// 可使用优惠券
$able_list = [];
// 不可使用优惠券
$unable_list = [];
// 获取所有有效优惠券
$where = [
['uid', '=', $this->mid],
['user_id', '=', $this->userId],
['status', '=', 1]
];
$field = 'id,name,price,brief,limit_price,start_time,end_time,is_forever,status';
$order = 'price desc';
$my_coupon_list = $coupon_my_model->listMyCoupon($where, $field, $order);
foreach ($my_coupon_list as $k => $v) {
if ($v['limit_price'] <= $price) {
// 是否可以使用 1--可以使用 2--不可以使用
$v['is_able'] = 1;
$v['unable_reason'] = '';
$able_list[] = $v;
} else {
$v['is_able'] = 0;
$v['unable_reason'] = '还差' . ($v['limit_price'] - $price) . '元可使用优惠券';
$unable_list[] = $v;
}
}
return sendSuccessArray([
'able_list' => $able_list,
'unable_list' => $unable_list
]);
}
}