* @day: 2017/11/02 */ namespace app\models\auction; use app\admin\model\user\User; use app\admin\model\user\UserBill; use crmeb\services\product\Product; use crmeb\services\SystemConfigService; use crmeb\traits\ModelTrait; use crmeb\basic\BaseModel; /** * 预约 Model * Class WechatNews * @package app\admin\model\wechat */ class AuctionOrder extends BaseModel { use ModelTrait; protected $pk = 'id'; protected $name = 'auction_order'; protected $autoWriteTimestamp = true; /** * 用户订单 * @param $data * @param $uid * @return \think\Collection * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function userOrder($data,$uid) { if ($data['order_id']){ $list = self::alias('a') ->field('a.*,u.nickname,u.avatar,u.uid as user_id,c.nickname as c_nickname,pay.phone') ->leftJoin('user u', 'a.uid = u.uid') ->leftJoin('user c', 'a.collection_id = c.uid') ->leftJoin('auction_pay pay', 'a.collection_id = pay.uid') ->where('a.order_id', $data['order_id'])->find(); //详细订单 $pay = AuctionPay::where('uid', $list['collection_id'])->select(); $list['wx'] = []; $list['zfb'] = []; $list['bank'] = []; $list['time'] = strtotime($list['create_time']); if ($pay){ foreach ($pay as $k => $v){ if ($v['type'] == 1){ $list['wx'] = $v; }elseif ($v['type'] == 2){ $list['zfb'] = $v; }elseif ($v['type'] == 3){ $list['bank'] = $v; } } } }else{ if ($data['type'] == 1){ $list = self::where([['uid', '=', $uid], ['status', '=', 1]])->page($data['page'], $data['limit'])->select(); //待上传订单 }else if($data['type'] == 2){ $list = self::where([['uid', '=', $uid], ['status', '=', 2]])->page($data['page'], $data['limit'])->select(); //待审核订单 }else if($data['type'] == 3) { $list = self::where([['uid', '=', $uid], ['status', '=', 3], ['is_gs', '=', 1]])->page($data['page'], $data['limit'])->select(); //完成订单 }else if($data['type'] == 4) { $list = AuctionProduct::where([['uid', '=', $uid], ['is_show', '=', 0]]) ->page($data['page'], $data['limit']) ->select(); if ($list){ foreach ($list as $k => $v){ $list[$k]['product_id'] = $v['id']; $list[$k]['is_gs'] = 0; $list[$k]['order_id'] = $list[$k]['order']; } } }else{ $list = self::where([['uid', '=', $uid]])->page($data['page'], $data['limit'])->select(); //过期订单 } } $list = !empty($list)? $list->toArray(): []; return $list; } /** * 卖家订单 * @param $data * @param $uid * @return \think\Collection * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function seller_list($data,$uid) { if ($data['order_id']){ $list = self::alias('a') ->field('a.*,u.nickname,u.avatar,u.uid as user_id') ->leftJoin('user u', 'a.uid = u.uid') ->where('a.order_id', $data['order_id'])->find(); //详细订单 }else{ if ($data['type'] == 1){ $status = 1; }else if($data['type'] == 2){ $status = 2; }else if($data['type'] == 3) { $status = 3; }else{ $status = 0; } if ($data['type'] == 4){ $product = AuctionTime::alias('a') ->field('FROM_UNIXTIME(a.add_time,"%Y-%m-%d") as gs_time,au.nickname,b.*') ->order('a.id DESC') ->where([['a.uid', '=', $uid]]) ->leftJoin('auction_product b', 'a.product_id = b.id') ->leftJoin('auction au', 'au.id = a.auction_id') ->select(); }else{ if ($status == 0){ $list = self::alias('a') ->field('a.*,u.nickname,u.avatar,u.uid as user_id') ->leftJoin('user u', 'a.uid = u.uid') ->order('id DESC') ->where([['a.collection_id', '=', $uid]]) ->page($data['page'], $data['limit']) ->select(); //待上传订单 }else{ $list = self::alias('a') ->field('a.*,u.nickname,u.avatar,u.uid as user_id') ->leftJoin('user u', 'a.uid = u.uid') ->order('id DESC') ->where([['a.collection_id', '=', $uid], ['a.status', '=', $status]]) ->page($data['page'], $data['limit']) ->select(); //待上传订单 } } } if ($data['type'] != 4){ $list = !empty($list)? $list->toArray(): []; foreach ($list as $k => $v) { $pay = AuctionPay::where('uid', $v['uid'])->find(); $list[$k]['phone'] = $pay['phone']; } return $list; }else{ $product = empty($product) ? []: $product->toArray(); return $product; } } /** * 卖家操作 * @param $id //商品所属人 * @param $price //卖出价格 * @param $product //商品详情 * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function earn($id, $price,$product) { $userModel = new \app\models\user\User(); $productModel = new AuctionProduct(); $user = $userModel->find($id); if ($user['spread_uid'] > 0){ $s_price = round(($price - $product['price']) * 0.1, 2); // 卖出价格减去购买价格的百分之十 为上级直推奖励 $spread = $userModel->find($user['spread_uid']); $spread['integral'] = $spread['integral'] + $s_price; //积分增加 $spread->save(); \app\models\user\UserBill::income('直推奖励', $spread['uid'], 'anticipate', 'add_anticipate', $s_price, 0, $spread['integral'], '奖励趣豆'); } // $user['anticipate'] = $user['anticipate']-$price*($product['deduct']/100); // 扣除当前卖出价格百分比的预约卷 // $user->save(); // UserBill::expend('预约卷扣除', $user['uid'], 'anticipate','reduce_anticipate', $price*($product['deduct']/100), 0, $user['anticipate'] ,'卖出扣除预约卷'); AuctionTime::where([['product_id', '=', $product['id']], ['uid', '=', $id]])->delete(); $productModel->where('id', $product['id'])->save(['is_show' => 0]); //下架等待挂售 } /** * 购买成功退预约卷 * @param $id * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function return($id) { $data = self::find($id); $userModel = new User(); $productModel = new AuctionProduct(); $auctionModel = new Auction(); $bookingModel = new AuctionBooking(); $user = $userModel->find($data['uid']); if ($user['is_new'] == 1){ if ($user['spread_uid']) { $spread = $userModel->where('uid', $user['spread_uid'])->find(); if ($spread['green_time'] != strtotime(date('Y-m-d', strtotime('+1 day')))){ $spread['green_time'] = strtotime(date('Y-m-d', strtotime('+1 day'))); // 开启明天的绿色通道 $spread->save(); } } $orderCount = AuctionOrder::where([['uid', '=', $user['uid']], ['status','=', 3]])->count(); if ($orderCount >= 5){ $user['is_new'] = 0; } } $product = $productModel->where('id', $data['product_id'])->find(); $auction = $auctionModel->where('id', $product['auction_id'])->find(); $time = strtotime(date('Y-m-d' ,strtotime($data['create_time']))); // 订单当天时间段 $totime = strtotime(date('Y-m-d' ,strtotime($data['create_time']))) + 86400; // 订单凌晨时间段 $booking = $bookingModel->where('auction_id', $auction['id'])->where('uid', $user['uid'])->whereBetweenTime('create_time', $time, $totime)->find(); if ($booking['status'] > 0){ $booking['status'] = 0; $booking->save(); $anticipate = $booking['anticipate'] - $booking['deduction']; $user['anticipate'] = $user['anticipate'] + $anticipate;// 退还预约卷 $user->save(); \app\models\user\UserBill::create([ 'uid' => $user['uid'], 'pm' => 1, 'title' => '艺金券退还', 'category' => 'anticipate', 'type' => 'th_anticipate', 'mark' => '退还'.$anticipate.'艺金券扣除'.$booking['deduction'], 'add_time' => time(), 'number' => $anticipate, 'balance' => $user['anticipate'] ]); } } /** * 订单过期 * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function deduction() { $one = (int)SystemConfigService::get('one_time'); $tow = (int)SystemConfigService::get('tow_time'); $hour = time()-($one*60); // 一小时以前 $time = time()-($tow*60); // 一个半小时 $order = AuctionOrder::where('create_time', '<', $hour)->where('status', '=', 1)->select(); // 查询不在当前一个半小时内的所有订单 if ($order){ foreach ($order as $K => $v){ $product = AuctionProduct::where('id', $v['product_id'])->find(); $auction = Auction::where('id', $product['auction_id'])->find(); $booking = AuctionBooking::where([['uid', '=', $v['uid']], ['status', '=', 1], ['auction_id', '=', $auction['id']], ['frequency', '=', $auction['frequency']]])->find(); // 找到预约订单 if (strtotime($v['create_time']) <= $hour and strtotime($v['create_time']) > $time){ // 订单在一个小时到一个半小时内 if ($booking){ if ($booking['deduction'] == 0){ $user = \app\models\user\User::where('uid', $v['collection_id'])->find(); $user['anticipate'] = $user['anticipate'] + $booking['anticipate']/2; // 卖家增加预约卷 $booking['deduction'] = $booking['anticipate']/2; UserBill::income('超时增加', $v['collection_id'], 'anticipate', 'ad_anticipate', $booking['anticipate']/2, $v['uid'], $user['anticipate'], '('.$user['nickname'].'-'.$user['uid'].')超时付款'); UserBill::expend('超时扣除', $v['uid'], 'anticipate', 'dec_anticipate', $booking['anticipate']/2, $v['uid'], $booking['anticipate']/2, '超时付款,扣除冻结'.($booking['anticipate']/2).'艺金券'); $booking->save(); $user->save(); } } }elseif (strtotime($v['create_time']) <= $time){ if ($booking) { $user = \app\models\user\User::where('uid', $v['collection_id'])->find(); //卖家 $dedu = $booking['anticipate'] - $booking['deduction']; $user['anticipate'] += $dedu; // 卖家增加预约卷 $booking['deduction'] = $booking['anticipate']; $user->save(); \app\models\user\User::where('uid', $v['uid'])->update(['status' => 0,'freeze_time' => strtotime('+1 day')]); // 冻结用户 UserBill::income('超时增加', $v['collection_id'], 'anticipate', 'ad_anticipate', $dedu, $v['uid'], $user['anticipate'], '('.$user['nickname'].'-'.$user['uid'].')超时付款'); UserBill::expend('超时扣除', $v['uid'], 'anticipate', 'dec_anticipate', $dedu, $v['uid'], 0, '超时付款,扣除冻结'.$dedu.'艺金券'); $booking->save(); AuctionBooking::where('id', $booking['id'])->update(['status' => 2]); // 修改预约订单状态 为扣除 AuctionOrder::where('create_time', '<', $hour)->where('status', '=', 1)->update(['status' => 0]); // 修改为已过期订单 } } } } } /** * 退回预约卷 * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public static function th() { $auction = Auction::where('rend_time', '<', date('H:i:s', time()))->select(); if ($auction){ foreach ($auction as $k => $v){ $booking = AuctionBooking::where([['auction_id', '=', $v['id']], ['status','=' , 1]])->select(); if ($booking){ foreach ($booking as $key => $value){ $product = AuctionProduct::where('auction_id', $value['auction_id'])->column('id'); $order = AuctionOrder::where([['product_id', 'in', $product], ['frequency', '=', $value['frequency']], ['uid', '=', $value['uid']]])->find(); if (!$order){ $find = AuctionBooking::find($value['id']); $find['status'] = 0; $user = User::where('uid', $value['uid'])->find(); $user['anticipate'] = $user['anticipate'] + $value['anticipate']; $user->save(); $find->save(); UserBill::income('退回艺金券',$user['uid'], 'anticipate', 'add_anticipate', $value['anticipate'], 0, $user['anticipate'], '艺金券'.$value['anticipate'].'退回'); } } } } } } public static function goods() { $order = AuctionOrder::where('status', 2)->select(); if ($order){ foreach ($order as &$item) { $auction = Auction::where('id', $item['auction_id'])->value('goods_time'); $time = $item['voucher_time'] + ($auction * 60); // 自动放货时间 if (time() > $time){ // 如果当前时间已经过了 $product = AuctionProduct::where('id', $item['product_id'])->find(); $product['uid'] = $item['uid'];// 商品拥有人更新 $product['add_time'] = time(); $product['order'] = $item['order_id']; self::where('id', $item['id'])->update(['status' => 3]); self::earn($item['uid'],$item['price'], $product); self::return($item['id']); $product->save(); } } } } }