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

525 lines
20 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: 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;
}
}