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; } } }