Files
2019-02-28 19:48:21 +08:00

339 lines
14 KiB
PHP

<?php
/**
* tpshop
* ============================================================================
* 版权所有 2015-2027 深圳搜豹网络科技有限公司,并保留所有权利。
* 网站地址: http://www.tp-shop.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
* ============================================================================
* Author: lhb
* Date: 2017-05-15
*/
namespace app\common\logic\team;
use app\common\logic\OrderLogic;
use app\common\model\Order;
use app\common\model\TeamActivity;
use app\common\model\TeamFollow;
use app\common\model\TeamFound;
use app\common\model\TeamGoodsItem;
use app\common\model\Users;
use app\common\util\TpshopException;
use think\Cache;
use think\Db;
/**
* 拼团活动逻辑类
*/
class Team
{
private $teamGoodsItem;
private $userId;
private $user;
private $teamActivity;
private $teamId;
private $foundId;
private $teamFound;
private $buyNum;
private $order;
private $teamGoods;//虚构的商品模型
private $orderCanUseCouponNum;//订单能使用的优惠券数量
public function setTeamGoodsItemById($goods_id, $item_id)
{
$this->teamGoodsItem = TeamGoodsItem::get(['goods_id' => $goods_id, 'item_id' => $item_id, 'deleted' => 0]);
if ($this->teamGoodsItem) {
$this->teamId = $this->teamGoodsItem['team_id'];
$this->teamActivity = $this->teamGoodsItem['team_activity'];
}
}
public function setTeamActivityById($team_id)
{
if($team_id > 0){
$this->teamId = $team_id;
$this->teamActivity = TeamActivity::get($team_id);
}
}
public function getTeamActivity()
{
return $this->teamActivity;
}
public function getFoundId()
{
return $this->foundId;
}
public function setTeamFoundById($found_id)
{
if($found_id){
$this->foundId = $found_id;
$this->teamFound = TeamFound::get($this->foundId);
}
}
public function setUserById($user_id)
{
if($user_id > 0){
$this->userId = $user_id;
$this->user = Users::get($user_id);
}
}
public function setBuyNum($buy_num)
{
$this->buyNum = $buy_num;
}
/**
* 设置order模型
* @param $order
*/
public function setOrder($order)
{
$this->order = $order;
}
/**
* 拼团支付后操作
* @throws \think\Exception
*/
public function doOrderPayAfter(){
$teamFound = TeamFound::get(['order_id' => $this->order['order_id']]);
//团长的单
if ($teamFound) {
$teamFound->found_time = time();
$teamFound->found_end_time = time() + intval($this->teamActivity['time_limit']);
$teamFound->status = 1;
$teamFound->save();
$team_found_queue = Cache::get('team_found_queue');
$team_found_queue[$teamFound->found_id] = $teamFound->need - $teamFound->join;
Cache::set('team_found_queue',$team_found_queue);
}else{
//团员的单
$teamFollow = TeamFollow::get(['order_id' => $this->order['order_id']]);
if($teamFollow){
$teamFollow->status = 1;
$teamFollow->save();
//更新团长的单
$teamFollow->team_found->join = $teamFollow['team_found']['join'] + 1;//参团人数+1
//如果参团人数满足成团条件
if($teamFollow->team_found->join >= $teamFollow->team_found->need){
$teamFollow->team_found->status = 2;//团长成团成功
//更新团员成团成功
Db::name('team_follow')->where(['found_id'=>$teamFollow->team_found->found_id,'status'=>1])->update(['status'=>2]);
}
$teamFollow->team_found->save();
}
}
}
/**
* 过滤拼团订单能使用的优惠券列表
* @param $userCouponList
* @return array
*/
public function getCouponOrderList($userCouponList)
{
$this->orderCanUseCouponNum = 0;
$userCouponArray = collection($userCouponList)->toArray();
$couponNewList = [];
foreach ($userCouponArray as $couponKey => $couponItem) {
if ($this->order['goods_price'] >= $userCouponArray[$couponKey]['coupon']['condition']) {
$userCouponArray[$couponKey]['coupon']['able'] = 1;
$this->orderCanUseCouponNum ++;
} else {
$userCouponArray[$couponKey]['coupon']['able'] = 0;
}
$couponNewList[] = $userCouponArray[$couponKey];
}
return $couponNewList;
}
/**
* 订单能使用的优惠券数量
* @return mixed
*/
public function getOrderCanUseCouponNum()
{
return $this->orderCanUseCouponNum;
}
/**
* 过滤拼团订单能使用的优惠券列表|api专用
* @param $userCouponList
* @return array
*/
public function getCouponOrderAbleList($userCouponList)
{
$userCouponArray = collection($userCouponList)->toArray();
$couponNewList = [];
foreach ($userCouponArray as $couponKey => $couponItem) {
if ($this->order['goods_price'] >= $userCouponArray[$couponKey]['coupon']['condition']) {
$coupon = $userCouponArray[$couponKey]['coupon'];
$coupon['id'] = $userCouponArray[$couponKey]['id'];
$coupon['cid'] = $userCouponArray[$couponKey]['cid'];
unset($coupon['goods_coupon']);
$couponNewList[] = $coupon;
}
}
return $couponNewList;
}
public function buy()
{
if (empty($this->teamActivity) || $this->teamActivity['status'] != 1) {
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该商品拼团活动不存在或者已下架', 'result' => '']);
}
if ($this->teamActivity['is_lottery'] == 1) {
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该商品拼团活动已开奖', 'result' => '']);
}
$this->teamGoods = $goods = $this->teamActivity->goods;
if (empty($goods) || $goods['is_on_sale'] != 1 || $goods['prom_type'] != 6) {
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该商品拼团活动不存在或者已下架', 'result' => '']);
}
if ($this->teamGoodsItem['item_id'] > 0) {
$spec_goods_price = $this->teamGoodsItem->specGoodsPrice;
$this->teamGoods['spec_key'] = $spec_goods_price['key'];
$this->teamGoods['spec_key_name'] = $spec_goods_price['key_name'];
$this->teamGoods['sku'] = $spec_goods_price['sku'];
$this->teamGoods['prom_id'] = $spec_goods_price['prom_id'];
$this->teamGoods['prom_type'] = $spec_goods_price['prom_type'];
$this->teamGoods['shop_price'] = $spec_goods_price['price'];
if(empty($spec_goods_price) || $spec_goods_price['prom_type'] != 6){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该商品拼团活动不存在或者已下架', 'result' => '']);
}
if($this->buyNum > $spec_goods_price['store_count']){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '商品库存仅剩余'.$spec_goods_price['store_count'], 'result' => '']);
}
}
if($this->buyNum > $goods['store_count']){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '商品库存仅剩余'.$goods['store_count'], 'result' => '']);
}
if ($this->buyNum <= 0) {
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '至少购买一份', 'result' => '']);
}
if ($this->teamActivity['buy_limit'] != 0 && $this->buyNum > $this->teamActivity['buy_limit']) {
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '购买数已超过该活动单次购买限制数(' . $this->teamActivity['buy_limit'] . ')', 'result' => '']);
}
if($this->foundId){
if(empty($this->teamFound) || $this->teamFound['status'] != 1){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该拼单数据不存在或已失效', 'result' => '']);
}
if($this->teamFound['user_id'] == $this->userId){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '不能自己开团自己拼', 'result' => '']);
}
if($this->teamActivity['team_type'] == 2){
//抽奖团,只能拼一次团
$teamYouSelfFollow = Db::name('team_follow')->where(['follow_user_id' => $this->userId, 'team_id' => $this->teamId, 'status' => ['in', '1,2']])->find();
if($teamYouSelfFollow){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '你已经参与过该拼团活动。', 'result' => '']);
}
}
if($this->teamFound['team_id'] != $this->teamActivity['team_id']){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该拼单数据不存在或已失效', 'result' => '']);
}
//拼团订单里有可能存在未支付订单。
$this->checkFollowNoPayByFound($this->teamFound);
if($this->teamFound['join'] >= $this->teamFound['need']){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该单已成功结束', 'result' => '']);
}
if(time() - $this->teamFound['found_time'] > $this->teamActivity['time_limit']){
throw new TpshopException('拼团购买商品',0,['status' => 0, 'msg' => '该拼单已过期', 'result' => '']);
}
}
$this->teamGoods['goods_price'] = $this->teamGoodsItem['team_price'];
$this->teamGoods['goods_num'] = $this->buyNum;
$this->teamGoods['member_goods_price'] = $this->teamGoodsItem['team_price'];
}
public function getTeamBuyGoods()
{
return $this->teamGoods;
}
public function log(Order $order)
{
if($this->teamFound){
/**团员拼团s**/
$team_follow_data = [
'follow_user_id' => $this->userId,
'follow_user_nickname' => $this->user['nickname'],
'follow_user_head_pic' => $this->user['head_pic'],
'follow_time' => time(),
'order_id' => $order['order_id'],
'found_id' => $this->teamFound['found_id'],
'found_user_id' => $this->teamFound['user_id'],
'team_id' => $this->teamActivity['team_id'],
];
Db::name('team_follow')->insert($team_follow_data);
/***团员拼团e***/
}else{
/***团长开团s***/
$team_found_data = [
'found_time'=>time(),
'found_end_time' => time() + intval($this->teamActivity['time_limit']),
'user_id' => $this->userId,
'team_id' => $this->teamActivity['team_id'],
'nickname' => $this->user['nickname'],
'head_pic' => $this->user['head_pic'],
'order_id' => $order['order_id'],
'need' => $this->teamActivity['needer'],
'price'=> $this->teamGoodsItem['team_price'],
'goods_price' => $this->teamGoods['shop_price'],
];
Db::name('team_found')->insert($team_found_data);
/***团长开团e***/
}
}
public function getTeamFound()
{
$team = $this->teamFound->teamActivity;
if(time() - $this->teamFound['found_time'] > $team['time_limit']){
//时间到了
if($this->teamFound['join'] < $this->teamFound['need']){
//人数没齐
$this->teamFound->status = 3;//成团失败
$this->teamFound->save();
//更新团员成团失败
Db::name('team_follow')->where(['found_id'=>$this->teamFound['found_id'],'status'=>1])->update(['status'=>3]);
}
}
if ($this->teamFound['status'] == 1) {
//拼团订单里有可能存在未支付订单。
$this->checkFollowNoPayByFound($this->teamFound);
}
return $this->teamFound;
}
/**
* 拼团订单里有可能存在未支付订单。
* @param $found|团长对象
*/
private function checkFollowNoPayByFound($found){
$noPayFollowOrderIds = Db::name('team_follow')->where(['status' => 0, 'found_id' => $found['found_id']])->column('order_id');
if ($noPayFollowOrderIds) {
$noPayOrderList = Db::name('order')->where(['order_id' => ['IN',$noPayFollowOrderIds], 'pay_status' => 0, 'order_status' => 0])->order('order_id asc')->select();
//找到最先未支付订单。然后查看是否超时未支付。如果超时,就将该订单做取消订单处理。
if($noPayOrderList){
$team_order_limit_time = tpCache('shopping.team_order_limit_time');
$limitTime = empty($team_order_limit_time) ? 1800 : $team_order_limit_time;
$orderLogic = new OrderLogic();
foreach($noPayOrderList as $order){
if ((time() - $order['add_time']) > $limitTime) {
$orderLogic->cancel_order($order['user_id'], $order['order_id']);
}
}
}
}
}
}