牛肉社团后端
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.
 
 
 
 
 
 
cow/addons/shopro/model/ActivityGroupon.php

180 lines
6.6 KiB

<?php
namespace addons\shopro\model;
use addons\shopro\exception\Exception;
use think\Model;
/**
* 活动-拼团
*/
class ActivityGroupon extends Model
{
// 表名,不含前缀
protected $name = 'shopro_activity_groupon';
// 自动写入时间戳字段
protected $autoWriteTimestamp = 'int';
// 定义时间戳字段名
protected $createTime = 'createtime';
protected $updateTime = 'updatetime';
protected $hidden = [];
// 追加属性
protected $append = [
];
// 获取正在进行中的团
public static function getActivityGroupon($params)
{
$goods_id = $params['goods_id'] ?? 0;
$activity_id = $params['activity_id'] ?? 0;
$activityGroupons = self::with('leader')
->where('goods_id', $goods_id)
->where('activity_id', $activity_id)
->where('status', 'ing')
->limit(10)
->select();
return $activityGroupons;
}
// 团详情
public static function getActivityGrouponDetail ($id) {
$activityGroupon = self::with(['my', 'grouponLog', 'activity' => function ($query) {
$query->removeOption('soft_delete')->with('activity_goods_sku_price'); // 关联团所属活动,并关联活动规格
}])->where('id', $id)->find();
if (!$activityGroupon) {
new Exception('团未找到');
}
$detail = Goods::getGoodsDetail($activityGroupon['goods_id']); // 正常团选规格时候要用
$activityGroupon['goods'] = $detail;
// 初始化拼团价为商品价,防止活动被物理删除
$activityGroupon['goods']['groupon_price'] = $activityGroupon['goods']['price'];
// 初始化活动状态为已结束
$activityGroupon['activity_status'] = 'ended';
// 处理当时的活动价格
if ($activityGroupon['activity']) {
$activity = $activityGroupon['activity'];
$activityGroupon['activity_status'] = $activity['status_code'];
$currentGoodsActivitySkuPrices = [];
foreach ($activity['activity_goods_sku_price'] as $k => $skuPrice) {
if ($skuPrice['status'] == 'up' && $skuPrice['goods_id'] == $activityGroupon['goods_id']) {
$currentGoodsActivitySkuPrices[] = $skuPrice;
}
}
if ($currentGoodsActivitySkuPrices) {
// 当时参加活动真实销量
$activityGroupon['goods']['sales'] = array_sum(array_column($currentGoodsActivitySkuPrices, 'sales'));
// 这个是活动最低价
$activityGroupon['goods']['groupon_price'] = $activityGroupon['goods']['price'] = min(array_column($currentGoodsActivitySkuPrices, 'price'));
}
}
return $activityGroupon;
}
/**
* 获取我的拼团列表
*
* @param [type] $type
* @return void
*/
public static function getMyGroupon($type) {
$user = User::info();
$logs = \addons\shopro\model\ActivityGrouponLog::with(['groupon', 'order.firstItem', 'goods' => function ($query) {
$query->removeOption('soft_delete'); // 商品查询包括被软删除的
}]);
if ($type != 'all') {
$type = $type == 'finish' ? ['finish', 'finish-fictitious'] : [$type];
$logs = $logs->whereExists(function ($query) use ($type) {
$log_name = (new \addons\shopro\model\ActivityGrouponLog())->getQuery()->getTable();
$groupon_name = (new \addons\shopro\model\ActivityGroupon())->getQuery()->getTable();
$query->table($groupon_name)->where('id=' . $log_name . '.groupon_id')
->where('status', 'in', $type);
});
}
$logs = $logs->where('user_id', $user->id)
->order('id', 'desc')
->paginate(10)->toArray();
// 将列表的显示价格,都查当时购买的价格,和当时对应的活动的 真实销量
if ($grouponLogs = $logs['data']) {
// 拿到所有活动 ids
$activity_ids = array_column($grouponLogs, 'activity_id');
// 一次获取所有活动,包括被软删除的活动,并关联规格
$activities = \addons\shopro\model\Activity::withTrashed()
->with('activityGoodsSkuPrice')
->where('id', 'in', $activity_ids)->select();
$activities = array_column($activities, null, 'id');
foreach ($grouponLogs as $key => $grouponLog) {
if (isset($grouponLog['goods']) && $grouponLog['goods'] && isset($activities[$grouponLog['activity_id']])) {
$activity = $activities[$grouponLog['activity_id']];
// 拿到当前商品对应的活动规格
$currentGoodsActivitySkuPrices = [];
foreach ($activity['activityGoodsSkuPrice'] as $k => $skuPrice) {
if ($skuPrice['status'] == 'up' && $skuPrice['goods_id'] == $grouponLog['goods_id']) {
$currentGoodsActivitySkuPrices[] = $skuPrice;
}
}
// 当时参加活动真实销量
if ($currentGoodsActivitySkuPrices) {
$grouponLogs[$key]['goods']['sales'] = array_sum(array_column($currentGoodsActivitySkuPrices, 'sales'));
}
// 这个是购买时候的活动单价
if (isset($grouponLog['order']['first_item'])) {
$grouponLogs[$key]['goods']['price'] = $grouponLog['order']['first_item']['goods_price'];
}
}
}
$logs['data'] = $grouponLogs;
}
return $logs;
}
public function activity()
{
return $this->belongsTo(\addons\shopro\model\Activity::class, 'activity_id', 'id');
}
public function grouponLog()
{
return $this->hasMany(\addons\shopro\model\ActivityGrouponLog::class, 'groupon_id', 'id');
}
public function leader() {
return $this->hasOne(\addons\shopro\model\ActivityGrouponLog::class, 'groupon_id', 'id')->where('is_leader', 1);
}
public function my() {
$user = User::info();
return $this->hasOne(\addons\shopro\model\ActivityGrouponLog::class, 'groupon_id', 'id')->where('user_id', ($user ? $user->id : 0));
}
public function goods()
{
return $this->belongsTo(\addons\shopro\model\Goods::class, 'goods_id', 'id');
}
}