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.
 
 
 
 
 
 
ymww_backend/addons/shopro/library/activity/traits/GiveGift.php

269 lines
7.7 KiB

<?php
namespace addons\shopro\library\activity\traits;
use think\Db;
use addons\shopro\traits\CouponSend;
use app\admin\model\shopro\activity\GiftLog;
use addons\shopro\service\Wallet as WalletService;
/**
* 赠送赠品 (full_gift, groupon_lucky 幸运拼团未拼中)
*/
trait GiveGift
{
use CouponSend;
/**
* 按照规则添加赠送日志
* @param array|object $order
* @param array|object $user
* @param array $info {"full":"100","types":"coupon=优惠券|score=积分|money=余额|goods=商品","coupon_ids":"赠优惠券时存在","total":"赠送优惠券总金额","score":"积分","money":"余额","goods_ids":"商品时存在",gift_num:"礼品份数"}
* @return void
*/
public function addGiftsLog($order, $user, $info)
{
$rules = $info['discount_rule'];
Db::transaction(function () use ($order, $user, $info, $rules) {
$types = $rules['types'];
foreach ($types as $type) {
extract($this->getTypeGift($rules, $type));
$giftLog = new GiftLog();
$giftLog->activity_id = $info['activity_id'];
$giftLog->order_id = $order->id;
$giftLog->user_id = $user->id;
$giftLog->type = $type;
$giftLog->gift = $gift;
$giftLog->value = $value;
$giftLog->rules = $rules;
$giftLog->status = 'waiting';
$giftLog->save();
}
});
}
/**
* 标记礼品为赠送失败
*/
public function checkAndFailGift($order, $fail_msg, $errors = null)
{
// 找到所有没有赠送的礼品,设置为 fail,fail_msg 订单退款
$giftLogs = GiftLog::waiting()->where('order_id', $order->id)->lock(true)->select();
foreach ($giftLogs as $giftLog) {
$giftLog->status = 'fail';
$giftLog->fail_msg = $fail_msg;
$giftLog->errors = $errors;
$giftLog->save();
}
}
/**
* 检查并赠送礼品
*
* @param array|object $order
* @param array|object $user
* @param array $promoInfos
* @param string $event
* @return void
*/
public function checkAndGift($order, $user, $promoInfos, $event)
{
foreach ($promoInfos as $info) {
if ($info['activity_type'] == 'full_gift') {
$this->checkPromoAndGift($order, $user, $info, $event);
}
}
}
/**
* 检查并赠送礼品
*
* @param array|object $order
* @param array|object $user
* @param array $infos
* @param string $event
* @return void
*/
public function checkPromoAndGift($order, $user, $info, $event)
{
if ($info['event'] == $event) {
// 判断领取次数
$rules = $info['discount_rule'];
$gift_num = $rules['gift_num']; // 礼品数量
// 查询已发放数量
$send_num = GiftLog::where('activity_id', $info['activity_id'])->opered()->group('order_id')->count();
$giftLogs = GiftLog::waiting()
->where('activity_id', $info['activity_id'])
->where('order_id', $order->id)
->select();
if ($send_num >= $gift_num) {
// 礼品已经发放完毕
foreach ($giftLogs as $log) {
$log->status = 'fail';
$log->fail_msg = '礼品已经发完了';
$log->save();
}
return false;
}
// 查询当前用户已领取数量 (只算赠送成功的)
$user_send_num = GiftLog::where('user_id', $order->user_id)->where('activity_id', $info['activity_id'])->finish()->group('order_id')->count();
if ($info['limit_num'] > 0 && $user_send_num >= $info['limit_num']) {
// 已经领取过了
foreach ($giftLogs as $log) {
$log->status = 'fail';
$log->fail_msg = '已经领取过了,每人最多领取 ' . $info['limit_num'] . ' 份';
$log->save();
}
return false;
}
// 赠送礼品
foreach ($giftLogs as $giftLog) {
$this->{'gift' . $giftLog->type}($user, $giftLog);
}
}
}
/**
* 赠送优惠券
*
* @param array|object $user
* @param array|object $giftLog
* @return void
*/
public function giftCoupon($user, $giftLog)
{
$couponIds = explode(',', $giftLog->gift);
$result = $this->giveCoupons($user, $couponIds);
$giftLog->status = 'finish';
if ($result['errors']) {
$giftLog->status = 'fail';
$giftLog->fail_msg = $result['success'] ? '优惠券部分发放成功' : '优惠券发放失败';
$giftLog->errors = $result['errors'];
}
$giftLog->save();
}
/**
* 赠送积分
*
* @param array|object $user
* @param array|object $giftLog
* @return void
*/
public function giftScore($user, $giftLog)
{
$score = $giftLog->gift;
// 增加用户积分
WalletService::change($user, 'score', $score, 'activity_gift', [
'activity_id' => $giftLog->activity_id,
'order_id' => $giftLog->order_id,
'user_id' => $giftLog->user_id,
'type' => $giftLog->type,
'gift' => $giftLog->gift,
'value' => $giftLog->value,
]);
$giftLog->status = 'finish';
$giftLog->save();
}
/**
* 赠送余额
*
* @param array|object $user
* @param array|object $giftLog
* @return void
*/
public function giftMoney($user, $giftLog)
{
$money = $giftLog->gift;
// 增加用户余额
WalletService::change($user, 'money', $money, 'activity_gift', [
'activity_id' => $giftLog->activity_id,
'order_id' => $giftLog->order_id,
'user_id' => $giftLog->user_id,
'type' => $giftLog->type,
'gift' => $giftLog->gift,
'value' => $giftLog->value,
]);
$giftLog->status = 'finish';
$giftLog->save();
}
/**
* 赠送商品(暂不开发)
*
* @param array|object $user
* @param array|object $giftLog
* @return void
*/
public function giftGoods($user, $giftLog)
{
$goodsIds = explode(',', $giftLog->gift);
// 赠送商品,暂不开发
$giftLog->status = 'finish';
$giftLog->save();
}
/**
* 获取赠送的 gift 和价值
*
* @param array $rules
* @param string $type
* @return array
*/
private function getTypeGift($rules, $type)
{
$gift = null;
switch ($type) {
case 'coupon':
$gift = $rules['coupon_ids'];
$value = $rules['total'];
break;
case 'score':
$gift = $rules['score'];
$value = $rules['score'];
break;
case 'money':
$gift = $rules['money'];
$value = $rules['money'];
break;
case 'goods':
$gift = $rules['goods_ids'];
$value = $rules['goods_ids'];
break;
}
return compact('gift', 'value');
}
}