Files
littleTiger/application/common/logic/CouponLogic.php

285 lines
12 KiB
PHP
Raw Normal View History

2019-02-28 19:48:21 +08:00
<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
* 采用最新Thinkphp5助手函数特性实现单字母函数M D U等简写方式
* ============================================================================
* Author: dyr
* Date: 2016-08-09
*/
namespace app\common\logic;
use app\common\model\Coupon;
use app\common\model\CouponList;
use think\Model;
use think\Db;
/**
* 回复
* Class CatsLogic
* @package common\Logic
*/
class CouponLogic extends Model
{
/**
* 获取发放有效的优惠券金额
* @param type $coupon_id
* @param type $goods_id
* @param type $store_id
* @param type $cat_id
* @return boolean
*/
public function getSendValidCouponMoney($coupon_id, $goods_id, $cat_id)
{
$curtime = time();
$coupon = M('coupon')->where('id', $coupon_id)->find();
$goods_coupon = M('goods_coupon')->where('coupon_id', $coupon_id)->where(function ($query) use ($goods_id, $cat_id) {
$query->where('goods_id', $goods_id)->whereOr('goods_category_id',$cat_id);
})->select();
if ($goods_coupon && $coupon
&& $coupon['send_start_time'] <= $curtime
&& $coupon['send_end_time'] > $curtime
&& $coupon['createnum'] > $coupon['send_enum']) {
return $coupon['money'];
}
return false;
}
/**
* 获取用户可以使用的优惠券金额
* @param $user_id|用户id
* @param $coupon_id|优惠券id
* @return int|mixed
*/
public function getCouponMoney($user_id, $coupon_id)
{
if ($coupon_id == 0) {
return 0;
}
$couponList = M('CouponList')->where("uid", $user_id)->where('id', $coupon_id)->find(); // 获取用户的优惠券
if (empty($couponList)) {
return 0;
}
$coupon = M('Coupon')->where("id", $couponList['cid'])->find(); // 获取 优惠券类型表
$coupon['money'] = $coupon['money'] ? $coupon['money'] : 0;
return $coupon['money'];
}
/**
* 根据优惠券代码获取优惠券金额
* @param $couponCode|优惠券代码
* @param $orderMoney|订单金额
* @return array
*/
public function getCouponMoneyByCode($couponCode,$orderMoney)
{
$couponList = M('CouponList')->where("code", $couponCode)->find(); // 获取用户的优惠券
if(empty($couponList))
return array('status'=>-9,'msg'=>'优惠券码不存在','result'=>'');
if($couponList['order_id'] > 0){
return array('status'=>-20,'msg'=>'该优惠券已被使用','result'=>'');
}
$coupon = M('Coupon')->where("id", $couponList['cid'])->find(); // 获取优惠券类型表
if(time() < $coupon['use_start_time'])
return array('status'=>-13,'msg'=>'该优惠券开始使用时间'.date('Y-m-d H:i:s',$coupon['use_start_time']),'result'=>'');
if(time() > $coupon['use_end_time'])
return array('status'=>-10,'msg'=>'优惠券已经过期'.date('Y-m-d H:i:s',$coupon['use_start_time']),'result'=>'');
if($orderMoney < $coupon['condition'])
return array('status'=>-11,'msg'=>'金额没达到优惠券使用条件','result'=>'');
if($couponList['order_id'] > 0)
return array('status'=>-12,'msg'=>'优惠券已被使用','result'=>'');
return array('status'=>1,'msg'=>'','result'=>$coupon['money']);
}
/**
* 获取购物车中的优惠券
* $type: 0可用1不可用
* $size: 每页的数量null表示所有
*/
public function getCartCouponList($user_id, $type, $cartList, $p = 1, $size = null)
{
//商品优惠总价
$cartTotalPrice = array_sum(array_map(function($val){
return $val['total_fee'];
}, $cartList));
$now = time();
$where = "c1.status=1 AND c2.uid={$user_id} AND c1.use_end_time>{$now}";
if (!$type) {
$where .= " AND c1.use_start_time<{$now} AND c1.condition<={$cartTotalPrice}";
} else {
$where .= " AND (c1.use_start_time>{$now} OR c1.condition>{$cartTotalPrice}) ";
}
$query = Db::name('coupon')->alias('c1')
->field('c1.name,c1.money,c1.condition,c1.use_end_time, c2.*')
->join('__COUPON_LIST__ c2','c2.cid=c1.id AND c2.status=0', 'LEFT')
->where($where);
if ($size) {
return $query->page($p, $size)->select();
}
return $query->select();
}
/**
* 获取用户可用的优惠券
* @param $user_id|用户id
* @param array $goods_ids|限定商品ID数组
* @param array $goods_cat_id||限定商品分类ID数组
* @return array
*/
public function getUserAbleCouponList($user_id, $goods_ids = array(), $goods_cat_id = array())
{
$CouponList = new CouponList();
$Coupon = new Coupon();
$userCouponArr = [];
$userCouponList = $CouponList->where('uid', $user_id)->where('status', 0)->select();//用户优惠券
if(!$userCouponList){
return $userCouponArr;
}
$userCouponId = get_arr_column($userCouponList, 'cid');
$couponList = $Coupon->with('GoodsCoupon')
->where('id', 'IN', $userCouponId)
->where('status', 1)
->where('use_start_time', '<', time())
->where('use_end_time', '>', time())
->select();//检查优惠券是否可以用
foreach ($userCouponList as $userCoupon => $userCouponItem) {
foreach ($couponList as $coupon => $couponItem) {
if ($userCouponItem['cid'] == $couponItem['id']) {
//全店通用
if ($couponItem['use_type'] == 0) {
$tmp = $userCouponItem;
$tmp['coupon'] = $couponItem->append(['use_type_title'])->toArray();
$userCouponArr[] = $tmp;
}
//限定商品
if ($couponItem['use_type'] == 1 && !empty($couponItem['goods_coupon'])) {
foreach ($couponItem['goods_coupon'] as $goodsCoupon => $goodsCouponItem) {
if (in_array($goodsCouponItem['goods_id'], $goods_ids)) {
$tmp = $userCouponItem;
$tmp['coupon'] = array_merge($couponItem->append(['use_type_title'])->toArray(), $goodsCouponItem->toArray());
$userCouponArr[] = $tmp;
break;
}
}
}
//限定商品类型
if ($couponItem['use_type'] == 2 && !empty($couponItem['goods_coupon'])) {
foreach ($couponItem['goods_coupon'] as $goodsCoupon => $goodsCouponItem) {
if (in_array($goodsCouponItem['goods_category_id'], $goods_cat_id)) {
$tmp = $userCouponItem;
$tmp['coupon'] = array_merge($couponItem->append(['use_type_title'])->toArray(), $goodsCouponItem->toArray());
$userCouponArr[] = $tmp;
break;
}
}
}
}
}
}
return $userCouponArr;
}
/**
* 优惠券兑换
* @param type $user_id
* @param type $coupon_code
* @return json
*/
public function exchangeCoupon($user_id, $coupon_code)
{
if ($user_id == 0){
return ['status' => -100, 'msg' => "登录超时请重新登录!", 'result' => null];
}
if (!$coupon_code) {
return ['status' => '0', 'msg' => '请输入优惠券券码', 'result' => ''];
}
$coupon_list = Db::name('coupon_list')->where('code', $coupon_code)->find();
if (empty($coupon_list)){
return ['status' => 0, 'msg' => '优惠券码不存在', 'result' => ''];
}
if ($coupon_list['order_id'] > 0) {
return ['status' => 0, 'msg' => '该优惠券已被使用', 'result' => ''];
}
if ($coupon_list['uid'] > 0) {
return ['status' => 0, 'msg' => '该优惠券已兑换', 'result' => ''];
}
$coupon = Coupon::get($coupon_list['cid']); // 获取优惠券类型表
if (time() < $coupon['use_start_time']) {
return ['status' => 0, 'msg' => '该优惠券开始使用时间' . date('Y-m-d H:i:s', $coupon['use_start_time']), 'result' => ''];
}
if (time() > $coupon['use_end_time'] || $coupon['status'] == 2) {
return ['status' => 0, 'msg' => '优惠券已失效或过期', 'result' => ''];
}
$do_exchange = Db::name('coupon_list')->where('id',$coupon_list['id'])->update(['uid'=>$user_id]);
if ($do_exchange !== false) {
return ['status' => 1, 'msg' => '兑换成功',
'result' => ['coupon' => $coupon->append(['is_expiring','use_start_time_format_dot','use_end_time_format_dot'])->toArray(), 'coupon_list'=>$coupon_list]];
} else {
return ['status' => 0, 'msg' => '兑换失败', 'result' => ''];
}
}
/**
* 获取店铺商品可领取优惠券
* @param array $goods_ids|商品id数组
* @param array $goods_category_ids|商品分类数组
* @return array
*/
public function getStoreGoodsCoupon($goods_ids = [], $goods_category_ids = [])
{
//查询店铺下所有的优惠券
$storeCoupon = Db::name('coupon')->select();
$newStoreCoupon = $goodsCouponIds = [];//存放提取的优惠券|存放提取的优惠券id
foreach ($storeCoupon as $couponKey => $couponVal) {
//提取(免费领取,还有剩余发放数量,处于发放时间)优惠券,
if ((($couponVal['createnum'] - $couponVal['send_num']) > 0 || $couponVal['createnum'] == 0)
&& $couponVal['type'] == 2 && $couponVal['send_start_time'] < time() && $couponVal['send_end_time'] > time()
&& $couponVal['status'] == 1
) {
$newStoreCoupon[] = $couponVal;//存放提取的优惠券
//提取指定商品或者商品分类类型优惠券id
if ($couponVal['use_type'] == 1 || $couponVal['use_type'] == 2) {
$goodsCouponIds[] = $couponVal['id'];//存放提取的优惠券id
}
}
}
if ($goodsCouponIds) {
//查询(指定商品或者商品分类)优惠券记录
$goodsCouponList = Db::name('goods_coupon')->where('coupon_id', 'IN', $goodsCouponIds)->select();
if ($goodsCouponList) {
$newGoodsCouponIds = [];//存放指定商品Id和商品分类Id的优惠券ID
foreach ($goodsCouponList as $gcKey => $gcVal) {
//验证并提取指定商品或者商品分类优惠券id
if (in_array($gcVal['goods_id'], $goods_ids) || in_array($gcVal['goods_category_id'], $goods_category_ids)) {
if (!in_array($gcVal['coupon_id'], $newGoodsCouponIds)) {
array_push($newGoodsCouponIds, $gcVal['coupon_id']);
}
}
}
if ($newGoodsCouponIds) {
$tmp = [];
//过滤不存在的指定商品或者商品分类类型的优惠券
foreach ($newStoreCoupon as $newCouponKey => $newCouponVal) {
if (($newCouponVal['use_type'] == 1 || $newCouponVal['use_type'] == 2) && !in_array($newCouponVal['id'], $newGoodsCouponIds)) {
continue;
}
$tmp[] = $newCouponVal;
}
unset($newStoreCoupon);
$newStoreCoupon = $tmp;
}
}
}
return $newStoreCoupon;
}
}