432 lines
15 KiB
PHP
432 lines
15 KiB
PHP
<?php
|
|
|
|
|
|
namespace app\shop\logic\team;
|
|
|
|
|
|
use app\common\basics\Logic;
|
|
use app\common\enum\GoodsEnum;
|
|
use app\common\enum\OrderEnum;
|
|
use app\common\enum\OrderLogEnum;
|
|
use app\common\enum\TeamEnum;
|
|
use app\common\logic\OrderRefundLogic;
|
|
use app\common\model\bargain\Bargain;
|
|
use app\common\model\goods\Goods;
|
|
use app\common\model\order\Order;
|
|
use app\common\model\seckill\SeckillGoods;
|
|
use app\common\model\team\TeamActivity;
|
|
use app\common\model\team\TeamFound;
|
|
use app\common\model\team\TeamGoods;
|
|
use app\common\model\team\TeamJoin;
|
|
use Exception;
|
|
use think\facade\Db;
|
|
|
|
class ActivityLogic extends Logic
|
|
{
|
|
/**
|
|
* @Notes: 获取拼团活动
|
|
* @Author: 张无忌
|
|
* @param $get
|
|
* @param $shop_id
|
|
* @return array|bool
|
|
*/
|
|
public static function lists($get, $shop_id)
|
|
{
|
|
try {
|
|
|
|
$where[] = ['T.shop_id', '=', $shop_id];
|
|
$where[] = ['T.del', '=', 0];
|
|
if (!empty($get['datetime']) and $get['datetime']) {
|
|
list($start, $end) = explode(' - ', $get['datetime']);
|
|
$where[] = ['T.create_time', '>=', strtotime($start.' 00:00:00')];
|
|
$where[] = ['T.create_time', '<=', strtotime($end.' 23:59:59')];
|
|
}
|
|
|
|
if (!empty($get['name']) and $get['name']) {
|
|
$where[] = ['G.name', 'like', '%'.$get['name'].'%'];
|
|
}
|
|
|
|
if (isset($get['status']) and is_numeric($get['status'])) {
|
|
$where[] = ['T.status', '=', intval($get['status'])];
|
|
}
|
|
|
|
if (isset($get['type']) and $get['type']) {
|
|
$where[] = ['T.audit', '=', $get['type']-1];
|
|
}
|
|
|
|
$model = new TeamActivity();
|
|
$lists = $model->alias('T')->field(['T.*'])
|
|
->where($where)
|
|
->with(['goods'])
|
|
->join('goods G', 'G.id = T.goods_id')
|
|
->paginate([
|
|
'page' => $get['page'] ?? 1,
|
|
'list_rows' => $get['limit'] ?? 20,
|
|
'var_page' => 'page'
|
|
])->toArray();
|
|
|
|
$teamFoundModel = new TeamFound();
|
|
$teamJoinModel = new TeamJoin();
|
|
foreach ($lists['data'] as &$item) {
|
|
$item['activity_start_time'] = date('Y-m-d H:i', $item['activity_start_time']);
|
|
$item['activity_end_time'] = date('Y-m-d H:i', $item['activity_end_time']);
|
|
$item['status_text'] = TeamEnum::getTeamStatusDesc($item['status']);
|
|
$item['audit_text'] = TeamEnum::getTeamAuditDesc($item['audit']);
|
|
|
|
$item['team_count'] = $teamFoundModel->where(['team_activity_id'=>$item['id']])->count();
|
|
$item['success_found'] = $teamFoundModel->where(['status'=>1, 'team_activity_id'=>$item['id']])->count();
|
|
$item['join_found'] = $teamJoinModel->where(['team_activity_id'=>$item['id']])->count();
|
|
}
|
|
|
|
return ['count'=>$lists['total'], 'lists'=>$lists['data']];
|
|
} catch (Exception $e) {
|
|
static::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 选择拼团商品
|
|
* @Author: 张无忌
|
|
* @param $get
|
|
* @param $shop_id
|
|
* @return array
|
|
*/
|
|
public static function select($get, $shop_id)
|
|
{
|
|
try {
|
|
$where = [];
|
|
if (!empty($get['name']) and $get['name']) {
|
|
$where[] = ['name', 'like', '%'.$get['name'].'%'];
|
|
}
|
|
|
|
|
|
$model = (new Goods());
|
|
$lists = $model->field(['id,name,image,stock,max_price,min_price,market_price'])->where([
|
|
['shop_id', '=', $shop_id],
|
|
['audit_status', '=', 1],
|
|
['del', '=', 0],
|
|
['status', '=', 1],
|
|
['type', '=', GoodsEnum::TYPE_ACTUAL]
|
|
])->withAttr('is_activity', function ($value, $data) use($shop_id) {
|
|
unset($value);
|
|
// 是否是秒杀
|
|
$seckill = (new SeckillGoods())->where(['goods_id'=>$data['id']])
|
|
->where(['del'=>0, 'shop_id'=>$shop_id])
|
|
->findOrEmpty()->toArray();
|
|
if ($seckill) return '秒杀中';
|
|
// 是否是砍价
|
|
$bargain = (new Bargain())->where(['goods_id'=>$data['id']])
|
|
->where('del', '=', 0)
|
|
->where('shop_id', '=', $shop_id)
|
|
->findOrEmpty()->toArray();
|
|
if ($bargain) return '砍价中';
|
|
|
|
return '正常';
|
|
})->where($where)->with(['GoodsItem'])
|
|
->append(['is_activity'])
|
|
->paginate([
|
|
'page' => $get['page'] ?? 1,
|
|
'list_rows' => $get['limit'] ?? 20,
|
|
'var_page' => 'page'
|
|
])->toArray();
|
|
|
|
return ['count'=>$lists['total'], 'lists'=>$lists['data']];
|
|
} catch (Exception $e) {
|
|
return ['error'=>$e->getMessage()];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 数据统计
|
|
* @Author: 张无忌
|
|
* @param $shop_id
|
|
* @return mixed
|
|
*/
|
|
public static function statistics($shop_id)
|
|
{
|
|
$where[] = ['del', '=', 0];
|
|
$where[] = ['shop_id', '=', $shop_id];
|
|
|
|
$model = new TeamActivity();
|
|
$detail['total'] = $model->where($where)->count();
|
|
$detail['stayAudit'] = $model->where($where)->where(['audit'=>0])->count();
|
|
$detail['adoptAudit'] = $model->where($where)->where(['audit'=>1])->count();
|
|
$detail['refuseAudit'] = $model->where($where)->where(['audit'=>2])->count();
|
|
return $detail;
|
|
}
|
|
|
|
/**
|
|
* @Notes: 拼团活动详细
|
|
* @Author: 张无忌
|
|
* @param $id
|
|
* @return array
|
|
*/
|
|
public static function detail($id)
|
|
{
|
|
$model = new TeamActivity();
|
|
$detail = $model->field(true)
|
|
->with(['goods', 'teamGoods'])
|
|
->findOrEmpty($id)
|
|
->toArray();
|
|
|
|
$detail['activity_start_time'] = date('Y-m-d H:i:s', $detail['activity_start_time']);
|
|
$detail['activity_end_time'] = date('Y-m-d H:i:s', $detail['activity_end_time']);
|
|
return $detail;
|
|
}
|
|
|
|
/**
|
|
* @Notes: 新增拼团活动
|
|
* @Author: 张无忌
|
|
* @param $post
|
|
* @param $shop_id
|
|
* @return bool
|
|
*/
|
|
public static function add($post, $shop_id)
|
|
{
|
|
Db::startTrans();
|
|
try {
|
|
$goods = (new Goods())->findOrEmpty($post['goods_id'])->toArray();
|
|
if (!$goods) throw new \think\Exception('选择的商品不存在');
|
|
|
|
if (strtotime($post['activity_start_time']) >= strtotime($post['activity_end_time'])) {
|
|
throw new \think\Exception('团活动开始时间不能少于等于结束时间');
|
|
}
|
|
|
|
// 新增拼团活动信息
|
|
$team = TeamActivity::create([
|
|
'shop_id' => $shop_id,
|
|
'goods_id' => $post['goods_id'],
|
|
'people_num' => $post['people_num'],
|
|
'share_title' => $post['share_title'] ?? '',
|
|
'share_intro' => $post['share_intro'] ?? '',
|
|
'team_max_price' => self::getMaxOrMinPrice($post)['max'],
|
|
'team_min_price' => self::getMaxOrMinPrice($post)['min'],
|
|
'audit' => 0,
|
|
'del' => 0,
|
|
'status' => $post['status'],
|
|
'effective_time' => $post['effective_time'],
|
|
'activity_start_time' => strtotime($post['activity_start_time']),
|
|
'activity_end_time' => strtotime($post['activity_end_time']),
|
|
'create_time' => time()
|
|
]);
|
|
|
|
// 新增拼团商品规格
|
|
$lists = [];
|
|
foreach ($post['item'] as $key => $value) {
|
|
foreach ($value as $K => $item) {
|
|
$lists[] = [
|
|
'team_id' => $team['id'],
|
|
'goods_id' => $key,
|
|
'item_id' => $K,
|
|
'team_price' => $item
|
|
];
|
|
}
|
|
}
|
|
if (!empty($lists)) (new TeamGoods())->insertAll($lists);
|
|
|
|
Db::commit();
|
|
return true;
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
static::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 编辑拼团活动
|
|
* @Author: 张无忌
|
|
* @param $post
|
|
* @param $shop_id
|
|
* @return bool
|
|
*/
|
|
public static function edit($post, $shop_id)
|
|
{
|
|
Db::startTrans();
|
|
try {
|
|
$goods = (new Goods())->findOrEmpty($post['goods_id'])->toArray();
|
|
if (!$goods) throw new \think\Exception('选择的商品不存在');
|
|
|
|
if (strtotime($post['activity_start_time']) >= strtotime($post['activity_end_time'])) {
|
|
throw new \think\Exception('团活动开始时间不能少于等于结束时间');
|
|
}
|
|
|
|
$activity = (new TeamActivity())->findOrEmpty($post['id'])->toArray();
|
|
$audit = $activity['audit'] != 1 ? 0 : 1;
|
|
|
|
|
|
// 编辑拼团活动信息
|
|
TeamActivity::update([
|
|
'shop_id' => $shop_id,
|
|
'goods_id' => $post['goods_id'],
|
|
'people_num' => $post['people_num'],
|
|
'share_title' => $post['share_title'] ?? '',
|
|
'share_intro' => $post['share_intro'] ?? '',
|
|
'team_max_price' => self::getMaxOrMinPrice($post)['max'],
|
|
'team_min_price' => self::getMaxOrMinPrice($post)['min'],
|
|
'status' => $post['status'],
|
|
'audit' => $audit,
|
|
'effective_time' => $post['effective_time'],
|
|
'activity_start_time' => strtotime($post['activity_start_time']),
|
|
'activity_end_time' => strtotime($post['activity_end_time']),
|
|
], ['id'=>$post['id']]);
|
|
|
|
// 删除旧的拼团商品
|
|
(new TeamGoods())->where(['team_id'=>$post['id']])->delete();
|
|
|
|
// 更新拼团商品规格
|
|
$lists = [];
|
|
foreach ($post['item'] as $key => $value) {
|
|
foreach ($value as $K => $item) {
|
|
$lists[] = [
|
|
'team_id' => $post['id'],
|
|
'goods_id' => $key,
|
|
'item_id' => $K,
|
|
'team_price' => $item
|
|
];
|
|
}
|
|
}
|
|
if (!empty($lists)) (new TeamGoods())->insertAll($lists);
|
|
|
|
Db::commit();
|
|
return true;
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
static::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 删除拼团活动
|
|
* @Author: 张无忌
|
|
* @param $id
|
|
* @return bool
|
|
*/
|
|
public static function del($id)
|
|
{
|
|
try {
|
|
TeamActivity::update([
|
|
'del' => 1,
|
|
'update_time' => time()
|
|
], ['id'=>$id]);
|
|
|
|
return true;
|
|
} catch (Exception $e) {
|
|
static::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 停止拼团活动
|
|
* @Author: 张无忌
|
|
* @param $id
|
|
* @return bool
|
|
*/
|
|
public static function stop($id)
|
|
{
|
|
try {
|
|
TeamActivity::update([
|
|
'status' => 0,
|
|
'update_time' => time()
|
|
], ['id'=>$id]);
|
|
|
|
$team_ids = (new TeamFound())->where(['team_activity_id'=>$id, 'status'=>0])->column('id');
|
|
|
|
$teamJoin = (new TeamJoin())->alias('TJ')
|
|
->field(['TJ.*,O.order_sn,O.order_status,O.pay_status,O.refund_status,O.order_amount'])
|
|
->where('team_id', 'in', $team_ids)
|
|
->join('order O', 'O.id=TJ.order_id')
|
|
->select()->toArray();
|
|
|
|
self::teamFail($teamJoin, $team_ids, time());
|
|
|
|
return true;
|
|
} catch (Exception $e) {
|
|
static::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 开启拼团活动
|
|
* @Author: 张无忌
|
|
* @param $id
|
|
* @return bool
|
|
*/
|
|
public static function open($id)
|
|
{
|
|
try {
|
|
TeamActivity::update([
|
|
'status' => 1,
|
|
'update_time' => time()
|
|
], ['id'=>$id]);
|
|
|
|
return true;
|
|
} catch (Exception $e) {
|
|
static::$error = $e->getMessage();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @Notes: 查看最低活动价和最高活动价
|
|
* @Author: 张无忌
|
|
* @param $post
|
|
* @return array
|
|
*/
|
|
private static function getMaxOrMinPrice($post)
|
|
{
|
|
$team_price = [];
|
|
foreach ($post['item'] as $key => $value) {
|
|
foreach ($value as $K => $item) {
|
|
array_push($team_price, $item);
|
|
}
|
|
}
|
|
$team_max_price = !empty($team_price) ? max($team_price) : 0;
|
|
$team_min_price = !empty($team_price) ? min($team_price) : 0;
|
|
|
|
return [
|
|
'max' => $team_max_price,
|
|
'min' => $team_min_price
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @Notes: 拼团失败
|
|
* @Author: 张无忌
|
|
* @param $teamJoin (参团列表数据)
|
|
* @param $found_ids
|
|
* @param $time (时间)
|
|
* @throws \think\Exception
|
|
*/
|
|
private static function teamFail($teamJoin, $found_ids, $time)
|
|
{
|
|
Db::startTrans();
|
|
try {
|
|
(new TeamFound())->whereIn('id', $found_ids)
|
|
->update(['status'=>TeamEnum::TEAM_STATUS_FAIL, 'team_end_time'=>$time]);
|
|
|
|
foreach ($teamJoin as $item) {
|
|
TeamJoin::update(['status' => TeamEnum::TEAM_STATUS_FAIL, 'update_time' => $time], ['id' => $item['id']]);
|
|
if ($item['order_status'] == OrderEnum::ORDER_STATUS_DOWN) continue;
|
|
if ($item['refund_status'] != OrderEnum::REFUND_STATUS_NO_REFUND) continue;
|
|
$order = (new Order())->findOrEmpty($item['order_id'])->toArray();
|
|
// 取消订单
|
|
OrderRefundLogic::cancelOrder($order['id'], OrderLogEnum::TYPE_SYSTEM);
|
|
if ($order['pay_status'] == OrderEnum::PAY_STATUS_PAID) {
|
|
// 更新订单状态
|
|
OrderRefundLogic::cancelOrderRefundUpdate($order);
|
|
// 订单退款
|
|
OrderRefundLogic::refund($order, $order['order_amount'], $order['order_amount']);
|
|
}
|
|
}
|
|
Db::commit();
|
|
} catch (Exception $e) {
|
|
Db::rollback();
|
|
throw new \think\Exception($e->getMessage());
|
|
}
|
|
}
|
|
} |