Files
littleTiger/application/common/logic/ActivityLogic.php
2019-02-28 19:48:21 +08:00

525 lines
20 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 采用最新Thinkphp5助手函数特性实现单字母函数M D U等简写方式
* ============================================================================
* Author: lhb
* Date: 2017-05-15
*/
namespace app\common\logic;
use app\common\model\Coupon;
use think\Model;
use think\Db;
/**
* 活动逻辑类
*/
class ActivityLogic extends Model
{
/**
* 团购总数
* @param type $sort_type
* @param type $page_index
* @param type $page_size
*/
public function getGroupBuyCount()
{
$group_by_where = array(
'start_time'=>array('lt',time()),
'end_time'=>array('gt',time()),
);
$count = M('group_buy')->alias('b')
->field('b.goods_id,b.rebate,b.virtual_num,b.buy_num,b.title,b.goods_price,b.end_time,b.price,b.order_num,g.comment_count')
->join('__GOODS__ g', 'b.goods_id=g.goods_id AND g.prom_type=2 AND g.is_on_sale=1')
->where($group_by_where)
->count();
return $count;
}
/**
* 团购列表
* @param type $sort_type
* @param type $page_index
* @param type $page_size
*/
public function getGroupBuyList($sort_type = '', $page_index = 1, $page_size = 20)
{
if ($sort_type == 'new') {
$type = 'start_time';
} elseif ($sort_type == 'comment') {
$type = 'g.comment_count';
} else {
$type = '';
}
$group_by_where = array(
'start_time'=>array('lt',time()),
'end_time'=>array('gt',time()),
'is_end' => 0
);
$list = M('group_buy')->alias('b')
->field('b.goods_id,b.item_id,b.rebate,b.virtual_num,b.buy_num,b.title,b.goods_price,b.end_time,b.price,b.order_num,g.comment_count')
->join('__GOODS__ g', 'b.goods_id=g.goods_id AND g.prom_type=2 AND g.is_on_sale=1')
->where($group_by_where)->page($page_index, $page_size)
->order($type, 'desc')
->select(); // 找出这个商品
$groups = array();
$server_time = time();
foreach ($list as $v) {
$v["server_time"] = $server_time;
$groups[] = $v;
}
return $groups;
}
/**
* 优惠促销列表
* @param type $sort_type
* @param type $page_index
* @param type $page_size
*/
public function getSalesList($sort_type = 0, $page_index = 1, $page_size = 4)
{
$map = array(
'start_time'=>array('lt',time()),
'end_time'=>array('gt',time()),
'is_end' => 0,
'type'=>$sort_type
);
$list = D('prom_goods')->with('prom_goods_item')->where($map)->field('id,type,expression,end_time')->page($page_index , $page_size)->order('id desc')->select();
$list && collection($list)->append(['prom_detail'])->toArray();
return $list;
}
/**
* 优惠券列表
* @param type $atype 排序类型 1:默认id排序2:即将过期3:面值最大
* @param $user_id 用户ID
* @param int $p 第几页
* @return array
*/
public function getCouponList($atype, $user_id, $p = 1)
{
$time = time();
$where = array('type' => 2,'status'=>1,'send_start_time'=>['elt',time()],'send_end_time'=>['egt',time()]);
$order = array('id' => 'desc');
if ($atype == 2) {
//即将过期
$order = ['spacing_time' => 'asc'];
$where["send_end_time-'$time'"] = ['egt', 0];
} elseif ($atype == 3) {
//面值最大
$order = ['money' => 'desc'];
}
$coupon_list = M('coupon')->field("*,send_end_time-'$time' as spacing_time")
->where($where)->page($p, 15)->order($order)->select();
if (is_array($coupon_list) && count($coupon_list) > 0) {
if ($user_id) {
$user_coupon = M('coupon_list')->where(['uid' => $user_id, 'type' => 2])->getField('cid',true);
}
if (!empty($user_coupon)) {
foreach ($coupon_list as $k => $val) {
$coupon_list[$k]['isget'] = 0;
if (in_array($val['id'],$user_coupon)) {
$coupon_list[$k]['isget'] = 1;
unset($coupon_list[$k]);
continue;
}
$coupon_list[$k]['use_scope'] = C('COUPON_USER_TYPE')[$coupon_list[$k]['use_type']];
}
}
}
return $coupon_list;
}
/**
* 获取优惠券查询对象
* @param int $queryType 0:count 1:select
* @param type $user_id
* @param int $type 查询类型 0:未使用1:已使用2:已过期
* @param type $orderBy 排序类型use_end_time、send_time,默认send_time
* @param int $order_money
* @return Query
*/
public function getCouponQuery($queryType, $user_id, $type = 0, $orderBy = null , $order_money = 0)
{
$where['l.uid'] = $user_id;
$where['c.status'] = 1;
//查询条件
if (empty($type)) {
// 未使用
$where['l.order_id'] = 0;
$where['c.use_end_time'] = array('gt', time());
$where['l.status'] = 0;
} elseif ($type == 1) {
//已使用
$where['l.order_id'] = array('gt', 0);
$where['l.use_time'] = array('gt', 0);
$where['l.status'] = 1;
} elseif ($type == 2) {
//已过期
$where['c.use_end_time'] = array('lt', time());
$where['l.status|c.status'] = array('neq', 1);
}
if ($orderBy == 'use_end_time') {
//即将过期,$type = 0 AND $orderBy = 'use_end_time'
$order['c.use_end_time'] = 'asc';
} elseif ($orderBy == 'send_time') {
//最近到账,$type = 0 AND $orderBy = 'send_time'
$where['l.send_time'] = array('lt',time());
$order['l.send_time'] = 'desc';
} elseif (empty($orderBy)) {
$order = array('l.send_time' => 'DESC', 'l.use_time');
}
$condition = floatval($order_money) ? ' AND c.condition <= '.$order_money : '';
$query = M('coupon_list')->alias('l')
->join('__COUPON__ c','l.cid = c.id'.$condition)
->where($where);
if ($queryType != 0) {
$query = $query->field('l.*,c.name,c.money,c.use_start_time,c.use_end_time,c.condition,c.use_type')
->order($order);
}
return $query;
}
/**
* 获取优惠券数目
* @param $user_id
* @param int $type
* @param null $orderBy
* @param int $order_money
* @return mixed
*/
public function getUserCouponNum($user_id, $type = 0, $orderBy = null,$order_money = 0)
{
$query = $this->getCouponQuery(0, $user_id, $type, $orderBy,$order_money);
return $query->count();
}
/**
* 获取用户优惠券列表
* @param $firstRow
* @param $listRows
* @param $user_id
* @param int $type
* @param null $orderBy
* @param int $order_money
* @return mixed
*/
public function getUserCouponList($firstRow, $listRows, $user_id, $type = 0, $orderBy = null,$order_money = 0)
{
$query = $this->getCouponQuery(1, $user_id, $type, $orderBy,$order_money);
return $query->limit($firstRow, $listRows)->select();
}
/**
* 领券中心
* @param type $cat_id 领券类型id
* @param type $user_id 用户id
* @param type $p 第几页
* @param type $goods_id 指定商品id
* @return type
*/
public function getCouponCenterList($cat_id, $user_id, $p = 1,$goods_id=0)
{
/* 获取优惠券列表 */
$cur_time = time();
$coupon_where = ['type'=>2, 'status'=>1, 'send_start_time'=>['elt',time()], 'send_end_time'=>['egt',time()]];
$query = db('coupon')->alias('c')
->field('gc.goods_id,gc.goods_category_id,c.use_type,c.name,c.id,c.money,c.condition,c.createnum,c.use_start_time,c.use_end_time,c.send_num,c.send_end_time-'.$cur_time.' as spacing_time')
->where('((createnum-send_num>0 AND createnum>0) OR (createnum=0))') //领完的也不要显示了
->where($coupon_where)->page($p, 15)
->order('condition', 'desc');
// if ($cat_id > 0) {
// $query = $query->join('__GOODS_COUPON__ gc', 'gc.coupon_id=c.id AND gc.goods_category_id='.$cat_id);
// }
$query = $query->join('__GOODS_COUPON__ gc', 'gc.coupon_id=c.id ','left');
$coupon_list = $query->select();
if (!(is_array($coupon_list) && count($coupon_list) > 0)) {
return [];
}
$user_coupon = [];
if ($user_id) {
$user_coupon = M('coupon_list')->where(['uid' => $user_id, 'type' => 2])->column('cid');
}
$types = [];
if ($cat_id) {
/* 优惠券类型格式转换 */
$couponType = $this->getCouponTypes();
foreach ($couponType as $v) {
$types[$v['id']] = $v['mobile_name'];
}
}
$store_logo = tpCache('shop_info.store_logo') ?: '';
$Coupon = new Coupon();
foreach ($coupon_list as $k => $coupon) {
/* 是否已获取 */
$coupon_list[$k]['use_type_title'] = $Coupon->getUseTypeTitleAttr(null, $coupon_list[$k]);
$coupon_list[$k]['isget'] = 0;
if (in_array($coupon['id'], $user_coupon)) {
$coupon_list[$k]['isget'] = 1;
}
/* 构造封面和标题 */
$coupon_list[$k]['image'] = $store_logo;
$coupon_list[$k]['use_end_time'] = date('Y-m-d',$coupon['use_end_time']);
$coupon_list[$k]['use_start_time'] = date('Y-m-d',$coupon['use_start_time']);
switch ($coupon['use_type']){
case 1;
if($goods_id > 0 && $goods_id != $coupon['goods_id']){
unset($coupon_list[$k]);
}
break;
case 2;
if($cat_id > 0 && $cat_id != $coupon['goods_category_id']){
unset($coupon_list[$k]);
}
break;
}
}
return $coupon_list;
}
/**
* 优惠券类型列表
* @param type $p 第几页
* @param type $num 每页多少null表示全部
* @return type
*/
public function getCouponTypes($p = 1, $num = null)
{
$list = M('coupon')->alias('c')
->join('__GOODS_COUPON__ gc', 'gc.coupon_id=c.id AND gc.goods_category_id!=0')
->where(['type' => 2, 'status' => 1])
->column('gc.goods_category_id');
$result = M('goods_category')->field('id, mobile_name')->where("id", "IN", $list)->page($p, $num)->select();
$result = $result ?: [];
array_unshift($result, ['id'=>0, 'mobile_name'=>'精选']);
return $result;
}
/**
* 领券
* @param $id 优惠券id
* @param $user_id
*/
public function get_coupon($id, $user_id)
{
if (empty($id)){
$return = ['status' => 0, 'msg' => '参数错误'];
}
if ($user_id) {
$_SERVER['HTTP_REFERER'] = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : U('Home/Activity/coupon_list');
$coupon_info = M('coupon')->where(array('id' => $id, 'status' => 1))->find();
if (empty($coupon_info)) {
$return = ['status' => 0, 'msg' => '活动已结束或不存在,看下其他活动吧~','return_url'=>$_SERVER['HTTP_REFERER']];
} elseif ($coupon_info['send_end_time'] < time()) {
//来晚了,过了领取时间
$return = ['status' => 0, 'msg' => '抱歉,已经过了领取时间','return_url'=>$_SERVER['HTTP_REFERER']];
} elseif ($coupon_info['send_num'] >= $coupon_info['createnum'] && $coupon_info['createnum'] != 0) {
//来晚了,优惠券被抢完了
$return = ['status' => 0, 'msg' => '来晚了,优惠券被抢完了','return_url'=>$_SERVER['HTTP_REFERER']];
} else {
if (M('coupon_list')->where(array('cid' => $id, 'uid' => $user_id))->find()) {
//已经领取过
$return = ['status' => 2, 'msg' => '您已领取过该优惠券','return_url'=>$_SERVER['HTTP_REFERER']];
} else {
$data = array('uid' => $user_id, 'cid' => $id, 'type' => 2, 'send_time' => time(),'status'=>0);
M('coupon_list')->add($data);
M('coupon')->where(array('id' => $id, 'status' => 1))->setInc('send_num');
$return = ['status' => 1, 'msg' => '恭喜您,抢到' . $coupon_info['money'] . '元优惠券!','return_url'=>$_SERVER['HTTP_REFERER']];
}
}
} else {
$return = ['status' => 0, 'msg' => '请先登录','return_url'=>U('User/login')];
}
return $return;
}
/**
* 获取活动简要信息
*/
public function getActivitySimpleInfo(&$goods, $user)
{
//1.商品促销
$activity = $this->getGoodsPromSimpleInfo($user, $goods);
//2.订单促销
$activity_order = $this->getOrderPromSimpleInfo($user, $goods);
if ($activity['data'] || $activity_order) {
empty($activity['data']) && $activity['data'] = [];
$activity['data'] = array_merge($activity['data'], $activity_order);
}
$activity['server_current_time'] = time();//服务器时间
return $activity;
}
/**
* 获取商品促销简单信息
*/
public function getGoodsPromSimpleInfo($user, &$goods)
{
$goods['prom_is_able'] = 0;
$activity['prom_type'] = 0;
//1.商品促销
$goodsPromFactory = new \app\common\logic\GoodsPromFactory;
if (!$goodsPromFactory->checkPromType($goods['prom_type'])) {
return $activity;
}
$goodsPromLogic = $goodsPromFactory->makeModule($goods, $goods['prom_id']);
//上面会自动更新商品活动状态,所以商品需要重新查询
$goods = M('Goods')->where('goods_id', $goods['goods_id'])->find();
unset($goods['goods_content']);
$goods['prom_is_able'] = 0;
//prom_type:0默认 1抢购 2团购 3优惠促销 4预售(不考虑)
if (!$goodsPromLogic->checkActivityIsAble()) {
return $activity;
}
$prom = $goodsPromLogic->getPromModel()->getData();
if (in_array($goods['prom_type'], [1, 2])) {
$prom['virtual_num'] = $prom['virtual_num'] + $prom['buy_num'];//参与人数
$goods['prom_is_able'] = 1;
$activity = [
'prom_type' => $goods['prom_type'],
'prom_price' => $prom['price'],
'virtual_num' => $prom['virtual_num']
];
if($prom['start_time']){
$activity['prom_start_time'] = $prom['start_time'];
}
if($prom['end_time']) {
$activity['prom_end_time'] = $prom['end_time'];
}
return $activity;
}
// 3优惠促销
$levels = explode(',', $prom['group']);
if ($prom['group'] && (isset($user['level']) && in_array($user['level'], $levels))) {
//type:0直接打折,1减价优惠,2固定金额出售,3买就赠优惠券
if ($prom['type'] == 0) {
$activityData[] = ['title' => '折扣', 'content' => "指定商品立打{$prom['expression']}"];
} elseif ($prom['type'] == 1) {
$activityData[] = ['title' => '直减', 'content' => "指定商品立减{$prom['expression']}"];
} elseif ($prom['type'] == 2) {
$activityData[] = ['title' => '促销', 'content' => "促销价{$prom['expression']}"];
} elseif ($prom['type'] == 3) {
$couponLogic = new \app\common\logic\CouponLogic;
$money = $couponLogic->getSendValidCouponMoney($prom['expression'], $goods['goods_id'], $goods['cat_id3']);
if ($money !== false) {
$activityData[] = ['title' => '送券', 'content' => "买就送代金券{$money}"];
}
}
if ($activityData) {
$goods['prom_is_able'] = 1;
$activity = [
'prom_type' => $goods['prom_type'],
'data' => $activityData
];
if($prom['start_time']){
$activity['prom_start_time'] = $prom['start_time'];
}
if($prom['end_time']) {
$activity['prom_end_time'] = $prom['end_time'];
}
}
}
return $activity;
}
/**
* 获取
* @param type $user_level
* @param type $cur_time
* @param type $goods
* @return string|array
*/
public function getOrderPromSimpleInfo($user, $goods)
{
$cur_time = time();
$sql = "select * from __PREFIX__prom_order where start_time <= $cur_time AND end_time > $cur_time";
$data = [];
$po = Db::query($sql);
if (!empty($po)) {
foreach ($po as $p) {
//type:0满额打折,1满额优惠金额,2满额送积分,3满额送优惠券
if ($p['type'] == 0) {
$data[] = ['title' => '折扣', 'content' => "{$p['money']}元打".round($p['expression']/10, 1).""];
} elseif ($p['type'] == 1) {
$data[] = ['title' => '优惠', 'content' => "{$p['money']}元优惠{$p['expression']}"];
} elseif ($p['type'] == 2) {
//积分暂不支持?
} elseif ($p['type'] == 3) {
$couponLogic = new \app\common\logic\CouponLogic;
$money = $couponLogic->getSendValidCouponMoney($p['expression'], $goods['goods_id'], $goods['cat_id']);
if ($money !== false) {
$data[] = ['title' => '送券', 'content' => "{$p['money']}元送{$money}元优惠券"];
}
}
}
}
return $data;
}
/**
* 订单支付时显示的优惠显示
* @param type $user
* @param type $store_id
* @return type
*/
public function getOrderPayProm($order_amount=0)
{
$cur_time = time();
$sql = "select * from __PREFIX__prom_order where type<2 and start_time <= $cur_time "
. "AND end_time > $cur_time AND money<=$order_amount order by money desc limit 1"; //显示满额打折,减价优惠信息
$data = '';
$po = Db::query($sql);
if (!empty($po)) {
foreach ($po as $p) {
//type:0满额打折,1满额优惠金额,2满额送积分,3满额送优惠券
if ($p['type'] == 0) {
$data = "{$p['money']}元打".round($p['expression']/10, 1)."";
} elseif ($p['type'] == 1) {
$data = "{$p['money']}元优惠{$p['expression']}";
}
}
}
return $data;
}
}