glhcp/server/app/api/logic/TeamLogic.php

431 lines
18 KiB
PHP

<?php
namespace app\api\logic;
use app\common\basics\Logic;
use app\common\enum\OrderEnum;
use app\common\enum\TeamEnum;
use app\common\model\goods\Goods;
use app\common\model\goods\GoodsItem;
use app\common\model\order\Order;
use app\common\model\order\OrderGoods;
use app\common\model\order\OrderTrade;
use app\common\model\shop\Shop;
use app\common\model\team\TeamActivity;
use app\common\model\team\TeamFound;
use app\common\model\team\TeamJoin;
use app\common\model\user\User;
use Exception;
use think\facade\Db;
class TeamLogic extends Logic
{
/**
* @Notes: 获取拼团活动
* @Author: 张无忌
* @param array $get
* @return array|bool
*/
public static function activity(array $get)
{
try {
$pageNo = $get['page_no'] ?? 1;
$pageSize = $get['page_size'] ?? 20;
$model = new TeamActivity();
$lists = $model->alias('T')->field([
'T.id,T.goods_id,T.people_num,T.team_max_price,T.team_min_price,sales_volume',
'G.name,G.image,G.max_price,G.min_price,G.market_price'
])
->where([
['T.audit', '=', 1],
['T.status', '=', 1],
['T.del', '=', 0],
['T.activity_start_time', '<=', time()],
['T.activity_end_time', '>=', time()],
['S.is_freeze', '=', 0],
['S.is_run', '=', 1],
])
->join('goods G', 'G.id = T.goods_id')
->join('shop S', 'S.id = T.shop_id')
->paginate([
'page' => $pageNo,
'list_rows' => $pageSize,
'var_page' => 'page'
])->toArray();
return [
'list' => $lists['data'],
'count' => $lists['total'],
'more' => is_more($lists['total'], $pageNo, $pageSize),
'page_no' => $pageNo,
'page_size' => $pageSize
];
} catch (Exception $e) {
static::$error = $e->getMessage();
return false;
}
}
/**
* @Notes: 开团信息
* @Author: 张无忌
* @param $post
* @param $user_id
* @return bool|array
*/
public static function kaituanInfo($post, $user_id)
{
try {
$teamActivity = (new TeamActivity())->alias('T')
->field([
'T.id as team_activity_id,T.shop_id,T.effective_time,GI.goods_id,GI.id as item_id,T.people_num,TG.team_price',
'G.name,G.image,GI.spec_value_str,GI.spec_value_ids,GI.market_price',
'GI.price,GI.stock'
])->where([
['T.goods_id', '=', (int)$post['goods_id']],
['T.audit', '=', 1],
['T.status', '=', 1],
['T.del', '=', 0],
['T.activity_start_time', '<=', time()],
['T.activity_end_time', '>=', time()],
['TG.goods_id', '=', (int)$post['goods_id']],
['TG.item_id', '=', (int)$post['item_id']],
])->join('team_goods TG', 'TG.team_id = T.id')
->join('goods G', 'G.id = TG.goods_id')
->join('goods_item GI', 'GI.id = TG.item_id')
->findOrEmpty()->toArray();
if (!$teamActivity) throw new \think\Exception('当前商品未参与拼团活动,下次再来吧');
if ($teamActivity['stock'] - intval($post['count']) < 0) throw new \think\Exception('抱歉,库存不足');
if (empty($post['address_id']) || !$post['address_id']) {
$address = UserAddressLogic::getDefaultAddress($user_id);
} else {
$address = UserAddressLogic::getOneAddress($user_id, ['id'=>$post['address_id']]);
}
// 校验发票信息 返回以店铺id为键,原发票参数为值的数组
$invoice = OrderInvoiceLogic::checkOrderInvoice($post);
if (false === $invoice) {
self::$error = OrderInvoiceLogic::getError();
return false;
}
$user = (new User())->findOrEmpty($user_id)->toArray();
$shop = (new Shop())->field(['id as shop_id,name as shop_name,open_invoice,spec_invoice'])->findOrEmpty($teamActivity['shop_id'])->toArray();
$shop['delivery_type'] = OrderEnum::DELIVERY_TYPE_EXPRESS;
$shop['delivery_type_text'] = Order::getDeliveryType(OrderEnum::DELIVERY_TYPE_EXPRESS);
$teamActivity['count'] = $post['count'];
$shop['goods'][] = $teamActivity;
return [
'team_id' => $post['team_id'] ?? 0,
'pay_way' => $post['pay_way'] ?? 1,
'order_type' => OrderEnum::TEAM_ORDER,
'total_amount' => round($teamActivity['team_price'] * $post['count'], 2),
'total_count' => intval($post['count']),
'shipping_price' => 0,
'user_money' => $user['user_money'],
'remark' => $post['remark'] ?? '',
'address' => $address,
'shop' => $shop,
'invoice' => array_values($invoice)
];
} catch (Exception $e) {
static::$error = $e->getMessage();
return false;
}
}
/**
* @Notes: 发起开团/参团
* @Author: 张无忌
* @param $info
* @param $user_id
* @return bool|array
*/
public static function kaituan($info, $userInfo)
{
// $userInfo['id']
Db::startTrans();
try {
$time = time();
$teamGoods = $info['shop']['goods'][0];
// 参团验证
if ($info['team_id']) {
$teamFound = (new TeamFound())->where(['id'=>$info['team_id']])->findOrEmpty()->toArray();
if (!$teamFound) throw new \think\Exception('选择的团不存在');
if ($teamFound['status'] != 0) throw new \think\Exception('当前拼团已结束,请重新选择拼团');
if ($teamFound['invalid_time'] <= time()) throw new \think\Exception('当前拼团已结束,请重新选择拼团');
if ($teamFound['user_id'] == $userInfo['id']) throw new \think\Exception('您已是该团成员了,不能重复参团哦!');
if ($teamFound['people'] == $teamFound['join']) throw new \think\Exception('当前拼团已满员,请重新选择拼团!');
// 获取已参团记录
$people = (new TeamJoin())->where(['team_id'=>$info['team_id'], 'user_id'=>$userInfo['id']])->findOrEmpty()->toArray();
if ($people) throw new \think\Exception('您已是该团成员了,不能重复参团哦!');
}
// 验证收货地址
if (empty($info['address']) || !$info['address']) {
throw new \think\Exception('请选择收货地址');
}
// 校验发票信息 返回以店铺id为键,原发票参数为值的数组
$invoice = OrderInvoiceLogic::checkOrderInvoice($info, 'team');
if (false === $invoice) {
throw new \think\Exception(OrderInvoiceLogic::getError());
}
// 创建交易单
$trade = OrderTrade::create([
't_sn' => createSn('order_trade', 't_sn'),
'user_id' => $userInfo['id'],
'goods_price' => $info['total_amount'],
'order_amount' => $info['total_amount'],
'total_amount' => $info['total_amount'],
'shop_id' => $info['shop']['shop_id'],
'create_time' => $time
]);
// 创建订单
$order = Order::create([
'trade_id' => $trade['id'],
'shop_id' => $info['shop']['shop_id'],
'order_sn' => createSn('order', 'order_sn'),
'user_id' => $userInfo['id'],
'order_type' => OrderEnum::TEAM_ORDER,
'order_source' => $userInfo['client'],
'delivery_type' => $info['shop']['delivery_type'],
'pay_way' => $info['pay_way'],
'consignee' => $info['address']['contact'],
'province' => $info['address']['province_id'],
'city' => $info['address']['city_id'],
'district' => $info['address']['district_id'],
'address' => $info['address']['address'],
'mobile' => $info['address']['telephone'],
'goods_price' => $info['total_amount'],
'total_amount' => $info['total_amount'],
'order_amount' => $info['total_amount'],
'total_num' => $info['total_count'],
'shipping_price' => $info['shipping_price'],
'discount_amount' => 0,
'user_remark' => $info['remark'] ?? '',
'create_time' => $time
]);
// 创建订单商品
OrderGoods::create([
'order_id' => $order['id'],
'goods_id' => $teamGoods['goods_id'],
'item_id' => $teamGoods['item_id'],
'goods_num' => $teamGoods['count'],
'goods_name' => $teamGoods['name'],
'goods_price' => $teamGoods['team_price'],
'total_price' => $teamGoods['team_price'],
'total_pay_price' => $teamGoods['team_price'],
'discount_price' => 0,
'spec_value' => $teamGoods['spec_value_str'],
'spec_value_ids' => $teamGoods['spec_value_ids'],
'image' => $teamGoods['image'],
'shop_id' => $info['shop']['shop_id']
]);
// 增加发票
OrderInvoiceLogic::insertOrderInvoice($info['shop']['shop_id'], $userInfo['id'], $order['id'], $invoice);
// 开新团
$team_id = 0;
if (!$info['team_id']) {
$teamFound = TeamFound::create([
'shop_id' => $info['shop']['shop_id'],
'team_activity_id' => $teamGoods['team_activity_id'],
'team_sn' => createSn('team_found', 'team_sn'),
'user_id' => $userInfo['id'],
'status' => 0,
'join' => 0,
'people' => $teamGoods['people_num'],
'goods_snap' => json_encode([
'id' => $teamGoods['goods_id'],
'shop_id' => $teamGoods['shop_id'],
'name' => $teamGoods['name'],
'image' => $teamGoods['image']
]),
'kaituan_time' => $time,
'invalid_time' => ($teamGoods['effective_time'] * 60 * 60) + time()
]);
$team_id = $teamFound['id'];
}
// 加入团
TeamJoin::create([
'shop_id' => $info['shop']['shop_id'],
'team_activity_id' => $teamGoods['team_activity_id'],
'team_id' => $team_id ?: $info['team_id'],
'sn' => createSn('team_join', 'sn'),
'user_id' => $userInfo['id'],
'order_id' => $order['id'],
'identity' => $info['team_id'] ? 2 : 1,
'team_snap' => json_encode($info['shop']['goods'][0], JSON_UNESCAPED_UNICODE),
'create_time' => $time,
'update_time' => $time
]);
// 扣减库存
(new GoodsItem())->where([
'goods_id'=>$teamGoods['goods_id'],
'id' =>$teamGoods['item_id']
])->update(['stock' => ['dec', $teamGoods['count']]]);
(new Goods())->where([
'id'=>$teamGoods['goods_id']
])->update(['stock' => ['dec', $teamGoods['count']]]);
// 更新参数人数
TeamFound::update([
'join' => ['inc', 1]
], ['id'=>$team_id ?: $info['team_id']]);
// 更新活动拼团数
TeamActivity::update([
'sales_volume' => ['inc', 1]
], ['id'=>$teamGoods['team_activity_id']]);
Db::commit();
return [
'team_id' => $team_id ?: $info['team_id'],
'type' => 'trade',
'trade_id' => $trade['id'],
'order_id' => $order['id']
];
} catch (Exception $e) {
Db::rollback();
static::$error = $e->getMessage();
return false;
}
}
/**
* @Notes: 获取拼团记录
* @Author: 张无忌
* @param $get
* @param $user_id
* @return array|bool
*/
public static function record($get, $user_id)
{
try {
$pageNo = $get['page_no'] ?? 1;
$pageSize = $get['page_size'] ?? 20;
$where = [];
if (isset($get['type']) and $get['type'] >= 0) {
$type = intval($get['type']);
$where[] = ['TJ.status', '=', $type];
}
$model = new TeamJoin();
$lists = $model->alias('TJ')->field(['TJ.*,S.name as shop_name,O.order_amount'])
->where(['TJ.user_id'=>$user_id])
->order('id desc')
->where($where)
->join('Shop S', 'S.id = TJ.shop_id')
->join('order O', 'O.id = TJ.order_id')
->paginate([
'page' => $pageNo,
'list_rows' => $pageSize,
'var_page' => 'page'
])->toArray();
$data = [];
foreach ($lists['data'] as &$item) {
$item['team_snap'] = json_decode($item['team_snap'], true);
$data[] = [
'id' => $item['id'],
'order_id' => $item['order_id'],
'shop_name' => $item['shop_name'],
'people_num' => $item['team_snap']['people_num'],
'name' => $item['team_snap']['name'],
'image' => $item['team_snap']['image'],
'price' => $item['team_snap']['price'],
'count' => $item['team_snap']['count'],
'spec_value_str' => $item['team_snap']['spec_value_str'],
'order_amount' => $item['order_amount'],
'status' => $item['status'],
'identity' => $item['identity'],
'identity_text' => $item['identity'] == 1 ? '团长' : '团员',
'status_text' => TeamEnum::getStatusDesc($item['status'])
];
}
return [
'list' => $data,
'count' => $lists['total'],
'more' => is_more($lists['total'], $pageNo, $pageSize),
'page_no' => $pageNo,
'page_size' => $pageSize
];
} catch (Exception $e) {
static::$error = $e->getMessage();
return false;
}
}
/**
* @Notes: 验证团
* @Author: 张无忌
* @param $post
* @param $user_id
* @return bool
*/
public static function check($post, $user_id)
{
try {
$teamActivity = (new TeamActivity())->alias('T')
->field([
'T.id as team_activity_id,T.shop_id,T.effective_time,GI.goods_id,GI.id as item_id,T.people_num,TG.team_price',
'G.name,G.image,GI.spec_value_str,GI.spec_value_ids,GI.market_price',
'GI.price,GI.stock'
])->where([
['T.goods_id', '=', (int)$post['goods_id']],
['T.audit', '=', 1],
['T.status', '=', 1],
['T.del', '=', 0],
['T.activity_start_time', '<=', time()],
['T.activity_end_time', '>=', time()],
['TG.goods_id', '=', (int)$post['goods_id']],
['TG.item_id', '=', (int)$post['item_id']],
])->join('team_goods TG', 'TG.team_id = T.id')
->join('goods G', 'G.id = TG.goods_id')
->join('goods_item GI', 'GI.id = TG.item_id')
->findOrEmpty()->toArray();
if (!$teamActivity) throw new \think\Exception('当前商品未参与拼团活动,下次再来吧');
if ($teamActivity['stock'] - intval($post['count']) < 0) throw new \think\Exception('抱歉,库存不足');
// 参团验证
if (!empty($post['team_id']) and $post['team_id']) {
$teamFound = (new TeamFound())->where(['id'=>$post['team_id']])->findOrEmpty()->toArray();
if (!$teamFound) throw new \think\Exception('选择的团不存在');
if ($teamFound['status'] != 0) throw new \think\Exception('当前拼团已结束,请重新选择拼团');
if ($teamFound['invalid_time'] <= time()) throw new \think\Exception('当前拼团已结束,请重新选择拼团');
if ($teamFound['user_id'] == $user_id) throw new \think\Exception('您已是该团成员了,不能重复参团哦!');
if ($teamFound['people'] == $teamFound['join']) throw new \think\Exception('当前拼团已满员,请重新选择拼团!');
// 获取已参团记录
$people = (new TeamJoin())->where(['team_id'=>$post['team_id'], 'user_id'=>$user_id])->findOrEmpty()->toArray();
if ($people) throw new \think\Exception('您已是该团成员了,不能重复参团哦!');
}
return true;
} catch (Exception $e) {
static::$error = $e->getMessage();
return false;
}
}
}