* @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(); //详细订单 $product = AuctionProduct::where('id', $list['product_id'])->find(); $list['actual_price'] = round($list['price'] - $product['fictitious_price'], 2);// 实际支付价格 $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]])->order('id DESC')->page($data['page'], $data['limit'])->select(); //待上传订单 } else if ($data['type'] == 2) { $list = self::where([['uid', '=', $uid], ['status', '=', 2]])->order('id DESC')->page($data['page'], $data['limit'])->select(); //待审核订单 } else if ($data['type'] == 3) { $list = self::where([['uid', '=', $uid], ['status', '=', 3], ['is_gs', '=', 1]])->order('id DESC')->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']; $list[$k]['price'] = $v['hanging_price']; } } } else { $list = self::where([['uid', '=', $uid]])->order('id DESC')->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(); //详细订单 $product = AuctionProduct::where('id', $list['product_id'])->find(); $list['actual_price'] = $list['price'] - $product['fictitious_price'];// 实际支付价格 $list = empty($list) ? [] : $list->toArray(); return $list; } 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']]])->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($order) { $data = self::find($order); $userModel = new User(); $productModel = new AuctionProduct(); $auctionModel = new Auction(); $bookingModel = new AuctionBooking(); $frozenModel = new AuctionFrozen(); $user = \app\models\user\User::where('uid', $data['uid'])->find(); if ($user['spread_uid']) { $spread = $userModel->where('uid', $user['spread_uid'])->find(); $proportion = SystemConfigService::get('golden_bean')/100; $spread['golden_bean'] += $data['price'] * $proportion; $spread->save(); \app\models\user\UserBill::income('直推奖励金豆', $spread['uid'], 'golden_bean', 'ztjl_golden_bean', $data['price'] * $proportion, '', $spread['golden_bean'], '直推奖励金豆'); } $product = $productModel->where('id', $data['product_id'])->find(); $auction = $auctionModel->where('id', $product['auction_id'])->find(); $booking = $bookingModel->where('auction_id', $auction['id'])->where('uid', $user['uid'])->where('frequency', $data['frequency'])->find(); $fz = $frozenModel->where('order_id', $data['order_id'])->where('status', 1)->where('uid', $user['uid'])->find(); if ($fz){ $fz['status'] = 0; $anticipate = $fz['anticipate'] - $fz['deduction']; $user['anticipate'] = $user['anticipate'] + $anticipate;// 退还广告值 $user->save(); $fz->save(); UserBill::income('广告值退还',$user['uid'], 'anticipate', 'th_anticipate', $anticipate, $user['spread_uid'], $user['anticipate'], '退还订单'.$data['order_id'].'广告值,扣除' . $fz['deduction']); }else{ if ($booking['status'] > 0) { $booking['status'] = 0; $anticipate = $booking['anticipate'] - $booking['deduction']; $user['anticipate'] = $user['anticipate'] + $anticipate;// 退还广告值 $user->save(); $booking->save(); UserBill::income('广告值退还',$user['uid'], 'anticipate', 'th_anticipate', $anticipate, $user['spread_uid'], $user['anticipate'], '退还预约广告值扣除' . $booking['deduction']); } } } /** * 订单过期 * @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(); // 找到预约订单 $fz = AuctionFrozen::where('order_id', $v['order_id'])->where('status', 1)->find(); $userl = \app\models\user\User::where('uid', $v['uid'])->find();//买家 if ($fz) { if (strtotime($v['create_time']) <= $hour and strtotime($v['create_time']) > $time) { // 订单在一个小时到一个半小时内 if ($fz['deduction'] == 0) { $user = \app\models\user\User::where('uid', $v['collection_id'])->find(); $user['anticipate'] = $user['anticipate'] + $fz['anticipate'] / 2; // 卖家增加广告值 $fz['deduction'] = $fz['anticipate'] / 2; UserBill::income('超时增加', $v['collection_id'], 'anticipate', 'ad_anticipate', $fz['anticipate'] / 2, $v['uid'], $user['anticipate'], '(' . $userl['nickname'] . '-' . $userl['uid'] . ')超时付款,增加广告值'); UserBill::expend('超时扣除', $v['uid'], 'anticipate', 'dec_anticipate', $fz['anticipate'] / 2, $v['uid'], $fz['anticipate'] / 2, '超时付款,扣除订单'.$v['order_id'].'冻结'. ($fz['anticipate'] / 2) . '广告值'); $fz->save(); $user->save(); } } elseif (strtotime($v['create_time']) <= $time) { $user = \app\models\user\User::where('uid', $v['collection_id'])->find(); //卖家 $dedu = $fz['anticipate'] - $fz['deduction']; $user['anticipate'] += $dedu; // 卖家增加广告值 $fz['deduction'] = $fz['anticipate']; $fz['status'] = 2; $product['succeed_time'] = 0; $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'], '(' . $userl['nickname'] . '-' . $userl['uid'] . ')超时付款,增加广告值'); UserBill::expend('超时扣除', $v['uid'], 'anticipate', 'dec_anticipate', $dedu, $v['uid'], 0, '超时付款,扣除订单'.$v['order_id'].'冻结' . $dedu . '广告值'); $fz->save(); AuctionOrder::where('id', $v['id'])->where('status', '=', 1)->update(['status' => 0]); // 修改为已过期订单 } } else { 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'], '(' . $userl['nickname'] . '-' . $userl['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']; $booking['status'] = 2; $product['succeed_time'] = 0; $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'], '(' . $userl['nickname'] . '-' . $userl['uid'] . ')超时付款,增加广告值'); UserBill::expend('超时扣除', $v['uid'], 'anticipate', 'dec_anticipate', $dedu, $v['uid'], 0, '超时付款,扣除预约冻结' . $dedu . '广告值'); $booking->save(); AuctionOrder::where('id', $v['id'])->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(); } } } } public static function auction_time() { $auction = Auction::where('status', 1)->select(); if ($auction){ foreach ($auction as $item){ $addtime = strtotime($item['add_time']); if (($addtime-360) < time() and $addtime > time()){ $model = AuctionProduct::where('is_show', 1)->where('auction_id', $item['id'])->order('id DESC'); $list = $model->select(); $list = empty($list)? [] : $list->toArray(); $lists = []; if ($list){ foreach ($list as $k => $v) { $order = AuctionOrder::where('product_id', $v['id'])->where('status', '>', 0)->where('frequency', $item['frequency'])->find(); if ($order){ unset($list[$k]); }else{ if ($v['is_admin'] == 2){ $time = AuctionTime::where([['auction_id', '=', $item['id']], ['product_id', '=', $v['id']], ['add_time', '<=', strtotime(date('Y-m-d', time()))]])->find(); if (!$time){ unset($list[$k]); } else{ $lists[] = $list[$k]; } }else{ $lists[] = $list[$k]; } } } } $redis = new \Redis(); $redis->connect('127.0.0.1','6379', 3600); if ($redis->llen($item['id']) == 0) { foreach ($lists as $k => $v) { $redis->lPush($item['id'], json_encode($v)); } } } } } } }