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