431 lines
18 KiB
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;
|
|
}
|
|
}
|
|
} |