pageList($condition, $field, $order, $page, $page_size, $alias, $join); return $this->success($list); } /** * 详情 * @param $id * @param $site_id * @return array */ public function detail($id, $site_id){ $condition = [ ['a.id', '=', $id], ['a.site_id','=',$site_id] ]; // 获取内容 $field = [ 'seller.username as seller_username', 'seller.nickname as seller_nickname', 'seller.headimg as seller_headimg', 'g.goods_name', 'g.goods_image', 'g.goods_content', 'g.market_price', 'g.unit', 'a.service_price', 'a.real_income', 'a.site_id', 'a.seller_uid', 'a.goods_id', 'a.id', 'a.total', 'a.unit_price', 'a.order_id', 'a.price', 'a.status', 'a.release_time', 'a.sell_time', 'a.created_time', 'a.take_time', 'o.order_no', 'o.buyer_message', ]; // 表关联 $join = [ ['member seller', 'seller.member_id = a.seller_uid', 'left'],// 获取卖家信息 ['goods g', 'g.goods_id = a.goods_id', 'left'],// 获取商品信息 ['order o', 'o.order_id = a.order_id', 'left'],// 获取商品信息 ]; $detail = model('futures')->getInfo($condition, $field, 'a', $join); return $this->success($detail); } /** * 增加库存 * @param $data * @return array * @throws InvalidArgumentException */ public function add($data){ $id = model('futures')->add($data); if(!($id > 0)){ return $this->error('','添加失败'); } Cache::store('redis_concurrent')->set('addon_futures_stock_'.$id,'1'); return $this->success($id); } /** * 发布 * @param $id * @param $price * @return array * @throws InvalidArgumentException */ public function release($id, $price, $agree_split_order = 0){ $date = model('futures')->getInfo([['id', '=', $id]]); if(empty($date) || $date['status'] !== 1){ return $this->error('','发布失败'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_stock_'.$id)){ return $this->error('','发布失败'); } $basics = $this->getBasicsConfig($date['site_id'])['data']['value']; model('futures')->startTrans(); try{ //拆单 $futuresInfo = $this->detail($id,$date['site_id'])['data']; $futuresInfo['status'] = 2; if($price >= $futuresInfo['market_price'] * $futuresInfo['total']){ $futuresInfo['total'] *= 2; if($futuresInfo['total'] > pow(2,$basics['order_total_double_times'])){// 配置单订单商品最大裂变次数 if($agree_split_order == 0){ model('futures')->rollback(); Cache::store('redis_concurrent')->set('addon_futures_stock_'.$id,'1'); return error(-800, '订单价格达到订单拆分限制,是否同意订单拆分?'); } //拆单 $futuresInfo['status'] = 8; for($i = 0;$i < $futuresInfo['total'];$i++){ $newSmallFuturesId = $this->add([ 'site_id' => $futuresInfo['site_id'], 'seller_uid' => $futuresInfo['seller_uid'], 'old_futures_id' => $id, 'goods_id' => $futuresInfo['goods_id'], 'total' => 1, 'unit_price' => $futuresInfo['unit_price'] / $futuresInfo['total'], 'status' => 1, 'order_id' => $futuresInfo['order_id'], 'created_time' => time() ])['data']; $this->release($newSmallFuturesId,$price / $futuresInfo['total']); } } } $service_price = $price * $basics['service_price'] / 100; model('futures')->update([ 'status' => $futuresInfo['status'], 'release_time' => time() + $basics['release_wait'] * 24 * 60 * 60,// 配置上线延迟时间 'price' => $price, 'total' => $futuresInfo['total'], 'service_price' => $service_price, 'real_income' => $price - $service_price, ],[['id','=',$id]]); model('futures')->commit(); Cache::store('redis_concurrent')->set('addon_futures_'.$id,'1'); return $this->success(); } catch (\Exception $e) { model('futures')->rollback(); Cache::store('redis_concurrent')->set('addon_futures_stock_'.$id,'1'); return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine()); } } /** * 下架到库存 * @return array */ public function stock($id){ $date = model('futures')->getInfo([['id', '=', $id]]); if(empty($date) || $date['status'] !== 2){ return $this->error('','下架失败'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_'.$id)){ return $this->error('','下架失败'); } model('futures')->update([ 'status' => 1, ], [['id', '=', $id]]); return $this->success(); } /** * 提货 * @param $id * @return array * @throws InvalidArgumentException */ public function pickUp($id){ $date = model('futures')->getInfo([['id', '=', $id]]); if(empty($date) || $date['status'] !== 1){ return $this->error($date,'提货失败'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_stock_'.$id)){ return $this->error('','提货失败'); } model('futures')->update([ 'status' => 5, ], [['id', '=', $id]]); $basics = $this->getBasicsConfig($date['site_id'])[ 'data' ][ 'value' ]; // 提货用来减少用户买入限制 Db::name('futures_user') ->where('member_id',$date['member_id']) ->update([ 'business_num' => Db::raw('business_num-'.$basics['order_restrictions_num']), ]); return $this->success(); } /** * 订单创建 * @return array */ public function orderCreate($id, $order_id, $member_id){ $date = model('futures')->getInfo([['id', '=', $id]]); if(empty($date) || ($date['status'] !== 2 && $date['status'] !== 7)){ return $this->error($date,'下单失败-1001'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_'.$id)){ return $this->error('','下单失败-1002'); } model('futures')->update([ 'status' => 6, 'created_time' => time(), 'member_id' => $member_id ], [['id', '=', $id]]); // 增加用户已下单次数 Db::name('futures_user') ->where('member_id',$date['member_id']) ->update([ 'business_num' => Db::raw('business_num+1'), 'total_business_num' => Db::raw('total_business_num+1'), ]); (new Message())->addMessage($date['site_id'],'订单创建',1,$member_id,$id); Cache::store('redis_concurrent')->set('addon_futures_pay_'.$id,'1'); return $this->success(); } /** * 订单完成 * @return array */ public function orderComplete($id,$order_id){ $date = model('futures')->getInfo([['id', '=', $id]]); if(empty($date) || $date['status'] !== 6){ return $this->error($date,'完成失败'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_pay_'.$id)){ return $this->error('','完成失败'); } $date = model('futures')->getInfo([['id', '=', $id]]); model('futures')->update([ 'status' => 3, 'sell_time' => time() ], [['id', '=', $id]]); $this->add([ 'site_id' => $date['site_id'], 'seller_uid' => $date['member_id'], 'old_futures_id' => $id, 'goods_id' => (int)$date['goods_id'], 'total' => (int)$date['total'], 'unit_price' => $date['price'], 'status' => 1, 'order_id' => $order_id, 'created_time' => time()]); (new Message())->addMessage($date['site_id'],'订单完成',1,$date['member_id'],$id); (new Message())->addMessage($date['site_id'],'订单售卖完成',1,$date['seller_uid'],$id); // 给用户增加余额 $memberAccountModel = new MemberAccount(); $memberAccountModel->addMemberAccount($date['site_id'], $date['seller_uid'], 'balance_money', $date['price'], 'sell', $date['id'], '售卖产品', $date['id']); $memberAccountModel->addMemberAccount($date['site_id'], $date['seller_uid'], 'balance_money', -$date['service_price'], 'service_price', $date['id'], '服务费', $date['id']); return $this->success(); } /** * 订单取消 * @return array */ public function orderClose($id){ $date = model('futures')->getInfo([['id', '=', $id]]); if(empty($date) || $date['status'] !== 6){ return $this->error($date,'取消失败'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_pay_'.$id)){ return $this->error('','取消失败'); } model('futures')->update([ 'status' => 7, ], [['id', '=', $id]]); Cache::store('redis_concurrent')->set('addon_futures_'.$id,'1'); (new Message())->addMessage($date['site_id'],'订单取消',1,$date['member_id'],$id); // 订单取消后 添加违规次数 Db::name('futures_user') ->where('member_id',$date['member_id']) ->update([ 'violation_num' => Db::raw('violation_num+1'), 'total_violation_num' => Db::raw('total_violation_num+1'), ]); // 判断:如果当前次数已经到达限制 进行惩罚操作 $futuresUserInfo = Db::name('futures_user') ->field('violation_num,site_id,punish_time') ->where('member_id',$date['member_id']) ->find(); $basics = (new Futures())->getBasicsConfig($futuresUserInfo['site_id'])[ 'data' ][ 'value' ]; $violationHour = $basics['violation_hour'] ?? 0; $violationUnpaid = $basics['violation_unpaid'] ?? 0; if($violationUnpaid > 0 && $futuresUserInfo['violation_num'] >= $violationUnpaid){ $startTime = $futuresUserInfo['punish_time'] > time() ? $futuresUserInfo['punish_time'] : time(); Db::name('futures_user') ->where('member_id',$date['member_id']) ->update([ 'punish_time' => strtotime("+{$violationHour} hours", $startTime),// 添加惩罚时间 'violation_num' => Db::raw("violation_num - {$violationUnpaid}")// 减少违规次数 ]); } return $this->success(); } /** * 写入基本设置 * @param $data * @param $is_use * @param $site_id * @return array */ public function setBasicsConfig($data, $is_use, $site_id) { $config = new ConfigModel(); return $config->setConfig($data, '秒杀基本配置', $is_use, [['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', 'MIAOSHA_BASICS_CONFIG']]); } /** * 读取基本设置 * @param $site_id * @return array */ public function getBasicsConfig($site_id) { $config = new ConfigModel(); return $config->getConfig([['site_id', '=', $site_id], ['app_module', '=', 'shop'], ['config_key', '=', 'MIAOSHA_BASICS_CONFIG']]); } /** * 判断当前时间是否在秒杀开启时间,并区分有无钻石用户 * @param $site_id * @param $member_id * @param $status * @return array */ public function checkTimes($site_id, $member_id, $status = 2){ switch($status){ case '2': $startTimeKey = 'miaosha_start_time'; $endTimeKey = 'miaosha_end_time'; $fenxiao = model('fenxiao')->getInfo([['member_id', '=', $member_id]]); if(!empty($fenxiao) && $fenxiao['diamond'] > 0){ $startTimeKey = 'miaosha_early_start_time'; } break; case '7': $startTimeKey = 'jianlou_start_time'; $endTimeKey = 'jianlou_end_time'; break; default: return $this->error('','参数不合法'); break; } $nowTime = time() - strtotime("today"); $is_read = FALSE; $nowtimes = []; $basics = $this->getBasicsConfig($site_id)['data']['value']; foreach($basics['times'] as $times){ if($times[$startTimeKey] <= $nowTime && $times[$endTimeKey] >= $nowTime){ $is_read = TRUE; $nowtimes = [ 'original' => $times, 'start_time' => $times[$startTimeKey], 'end_time' => $times[$endTimeKey] ]; break; } } if(!$is_read){ return $this->error('','未到秒杀时间'); } //判断是否是提前秒杀 $nowtimes['is_early'] = FALSE; if($times['miaosha_early_start_time'] <= $nowTime && $times['miaosha_start_time'] >= $nowTime){ $nowtimes['is_early'] = TRUE; } return $this->success($nowtimes); } }