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