diff --git a/addon/futures/api/controller/Futures.php b/addon/futures/api/controller/Futures.php index da4ce737..b233f48f 100644 --- a/addon/futures/api/controller/Futures.php +++ b/addon/futures/api/controller/Futures.php @@ -168,7 +168,7 @@ class Futures extends BaseApi{ return $this->response($this->error('','发布失败,价格不在允许范围内'.sprintf('%.2f',$date['unit_price'] * (1 + $basicsConfig['price_range']['min'] / 100)).'-'.sprintf('%.2f',$date['unit_price'] * (1 + $basicsConfig['price_range']['max'] / 100)))); } - //TODO 限制发布时间 + // 限制发布时间 return $this->response($futuresModel->release($id, $price, $agree_split_order)); } @@ -240,7 +240,8 @@ class Futures extends BaseApi{ $futuresModel = new FuturesModel; $basicsConfig = $futuresModel->getBasicsConfig($this->site_id)['data']['value']; $res = [ - 'price_range' => $basicsConfig['price_range'] + 'price_range' => $basicsConfig['price_range'], + 'service_price' => $basicsConfig['service_price'], ]; return $this->response($this->success($res)); } @@ -263,7 +264,7 @@ class Futures extends BaseApi{ return $this->response($detail); } - public function testBuyBack(){ - return $this->response(event('BuyBack')); - } + // public function testBuyBack(){ + // return $this->response(event('BuyBack')); + // } } \ No newline at end of file diff --git a/addon/futures/model/Futures.php b/addon/futures/model/Futures.php index 1e1ebc0e..ab8d0e42 100644 --- a/addon/futures/model/Futures.php +++ b/addon/futures/model/Futures.php @@ -1,6 +1,8 @@ error('','发布失败'); } + $basics = $this->getBasicsConfig($date['site_id'])['data']['value']; model('futures')->startTrans(); try{ //拆单 @@ -110,7 +115,7 @@ class Futures extends BaseModel{ $futuresInfo['status'] = 2; if($price >= $futuresInfo['market_price'] * $futuresInfo['total']){ $futuresInfo['total'] *= 2; - if($futuresInfo['total'] > pow(2,3)){//TODO 配置单订单商品最大裂变次数 + 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'); @@ -134,11 +139,14 @@ class Futures extends BaseModel{ } } } + $service_price = $price * $basics['service_price'] / 100; model('futures')->update([ 'status' => $futuresInfo['status'], - 'release_time' => time() + 3 * 24 * 60 * 60,//TODO 配置上线延迟时间 + 'release_time' => time() + $basics['release_wait'] * 24 * 60 * 60,// 配置上线延迟时间 'price' => $price, - 'total' => $futuresInfo['total'] + 'total' => $futuresInfo['total'], + 'service_price' => $service_price, + 'real_income' => $price - $service_price, ],[['id','=',$id]]); model('futures')->commit(); @@ -187,7 +195,15 @@ class Futures extends BaseModel{ 'status' => 5, ], [['id', '=', $id]]); - //TODO 提货用来减少用户买入限制 + + $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(); } @@ -198,10 +214,10 @@ class Futures extends BaseModel{ 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,'下单失败'); + return $this->error($date,'下单失败-1001'); } if(!Cache::store('redis_concurrent')->delete('addon_futures_'.$id)){ - return $this->error('','下单失败'); + return $this->error('','下单失败-1002'); } model('futures')->update([ 'status' => 6, @@ -209,8 +225,15 @@ class Futures extends BaseModel{ 'member_id' => $member_id ], [['id', '=', $id]]); - //TODO 提前秒杀扣除钻石 - //TODO 增加用户已下单次数 + // 增加用户已下单次数 + 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(); } @@ -242,7 +265,12 @@ class Futures extends BaseModel{ 'status' => 1, 'order_id' => $order_id, 'created_time' => time()]); - //TODO 给用户增加余额 + (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(); } @@ -262,6 +290,7 @@ class Futures extends BaseModel{ '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']) @@ -345,6 +374,7 @@ class Futures extends BaseModel{ if($times[$startTimeKey] <= $nowTime && $times[$endTimeKey] >= $nowTime){ $is_read = TRUE; $nowtimes = [ + 'original' => $times, 'start_time' => $times[$startTimeKey], 'end_time' => $times[$endTimeKey] ]; @@ -355,6 +385,11 @@ class Futures extends BaseModel{ 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); } } \ No newline at end of file diff --git a/addon/futures/model/User.php b/addon/futures/model/User.php index c61bc0bd..54d1dfe1 100644 --- a/addon/futures/model/User.php +++ b/addon/futures/model/User.php @@ -3,6 +3,7 @@ namespace addon\futures\model; use addon\futures\model\order\FuturesOrderCreate as OrderCreateModel; use app\model\BaseModel; +use app\model\system\Pay as PayModel; use think\Exception; use think\facade\Db; @@ -141,25 +142,31 @@ class User extends BaseModel{ return $this->error('',$e->getMessage()); } } - // 回收 + /** + * 回购 + * @return array + */ public function buyBack(){ $nowTime = time() - strtotime("today"); $futuresModel = new Futures(); $basics = $futuresModel->getBasicsConfig($this->site_id)['data']['value']; + if($basics['auto_buyback'] == 0){ + return $this->success('未达开启回购'); + } $status = 0; foreach($basics['times'] as $times){ - if($nowTime <= $times['jianlou_end_time'] && $nowTime >= $times['jianlou_end_time'] - 5 * 60){//TODO 配置在结束时间前多久开始回购 + if($nowTime <= $times['jianlou_end_time'] && $nowTime >= $times['jianlou_end_time'] - $basics['auto_buyback_time'] * 60){// 配置在结束时间前多久开始回购 $status = 7; break; } - if($nowTime <= $times['miaosha_end_time'] && $nowTime >= $times['miaosha_end_time'] - 5 * 60){//TODO 配置在结束时间前多久开始回购 + if($nowTime <= $times['miaosha_end_time'] && $nowTime >= $times['miaosha_end_time'] - $basics['auto_buyback_time'] * 60){// 配置在结束时间前多久开始回购 $status = 2; break; } } if($status == 0){ - return $this->success('','未达到回购时间'); + return $this->success('未达到回购时间'); } $menberList = model('futures_user')->getList([['is_special', '=', 1]]); @@ -167,40 +174,62 @@ class User extends BaseModel{ ['status', '=', $status], ['release_time', '<', time()] ]); + $log = []; foreach($futuresList as $futures){ //创建订单 $order_create = new OrderCreateModel(); $data = [ - 'futures_id' => $futures[ 'futures_id' ], + 'futures_id' => $futures[ 'id' ], 'member_id' => $menberList[0]['member_id'], 'site_id' => $this->site_id,//站点id 'order_from' => 'weapp', 'order_from_name' => '微信小程序', 'is_balance' => 0,//是否使用余额 'buyer_message' => '', - 'delivery' => isset($this->params[ 'delivery' ]) && !empty($this->params[ 'delivery' ]) ? json_decode($this->params[ 'delivery' ], true) : [], - 'coupon' => isset($this->params[ 'coupon' ]) && !empty($this->params[ 'coupon' ]) ? json_decode($this->params[ 'coupon' ], true) : [], - 'member_address' => isset($this->params[ 'member_address' ]) && !empty($this->params[ 'member_address' ]) ? json_decode($this->params[ 'member_address' ], true) : [], + 'delivery' => [], + 'coupon' => [], + 'member_address' => [], - 'latitude' => $this->params[ 'latitude' ] ?? '', - 'longitude' => $this->params[ 'longitude' ] ?? '', + 'latitude' => '', + 'longitude' => '', - 'is_invoice' => $this->params[ 'is_invoice' ] ?? 0, - 'invoice_type' => $this->params[ 'invoice_type' ] ?? 0, - 'invoice_title' => $this->params[ 'invoice_title' ] ?? '', - 'taxpayer_number' => $this->params[ 'taxpayer_number' ] ?? '', - 'invoice_content' => $this->params[ 'invoice_content' ] ?? '', - 'invoice_full_address' => $this->params[ 'invoice_full_address' ] ?? '', - 'is_tax_invoice' => $this->params[ 'is_tax_invoice' ] ?? 0, - 'invoice_email' => $this->params[ 'invoice_email' ] ?? '', - 'invoice_title_type' => $this->params[ 'invoice_title_type' ] ?? 0, - 'buyer_ask_delivery_time' => $this->params[ 'buyer_ask_delivery_time' ] ?? '', - 'form_data' => isset($this->params['form_data']) && !empty($this->params['form_data']) ? json_decode($this->params['form_data'], true) : [], - 'goods_sku_list' => !empty($this->params['goods_sku_list']) ? json_decode($this->params['goods_sku_list'], true) : [], - 'sku_id' => isset($this->params['sku_id']) ? $this->params['sku_id'] : '', + 'is_invoice' => 0, + 'invoice_type' => 0, + 'invoice_title' => '', + 'taxpayer_number' => '', + 'invoice_content' => '', + 'invoice_full_address' => '', + 'is_tax_invoice' => 0, + 'invoice_email' => '', + 'invoice_title_type' => 1, + 'buyer_ask_delivery_time' => '', + 'form_data' => [], + 'goods_sku_list' => [], + 'sku_id' => '', ]; $res = $order_create->create($data); + + //支付订单 + $pay_type = 'wechatpay'; + $out_trade_no = $res['data']; + $app_type = 'weapp'; + $return_url = 'https%3A%2F%2Fmiaogou.cdlfjy.com%2F%2Fpages_tool%2Fpay%2Fresult%3Fcode%3D16778287851484851000'; + $scene = 0; + $is_balance = 1; + $hb_fq_num = 0; + $pay = new PayModel(); + $info = $pay->pay($pay_type, $out_trade_no, $app_type, $menberList[0]['member_id'], $return_url, $is_balance, $scene, $hb_fq_num); + + $log[] = [ + 'create_order' => $res, + 'pay' => $info + ]; } + return $this->success([ + 'member_list' => $menberList, + 'futures_list' => $futuresList, + 'log' => $log + ]); } } \ No newline at end of file diff --git a/addon/futures/model/order/FuturesOrderCreate.php b/addon/futures/model/order/FuturesOrderCreate.php index 4a1d15ae..f227d34b 100644 --- a/addon/futures/model/order/FuturesOrderCreate.php +++ b/addon/futures/model/order/FuturesOrderCreate.php @@ -11,6 +11,7 @@ namespace addon\futures\model\order; use addon\cardservice\model\MemberCard; +use addon\fenxiao\model\FenxiaoAccount; use addon\futures\model\Futures; use addon\futures\model\Futures as FuturesModel; use app\model\order\Config; @@ -216,6 +217,7 @@ class FuturesOrderCreate extends OrderCreate // $member_card = new MemberCard(); // $use_result = $member_card->cardUse($card_use_params); + $futures_model = new Futures; $futures_info = $futures_model->orderCreate($data['futures_id'],$order_id,$data['member_id']); if ($futures_info[ 'code' ] != 0) { @@ -223,6 +225,11 @@ class FuturesOrderCreate extends OrderCreate return $futures_info; } + // 提前秒杀扣除钻石 + if($calculate_data['times']['is_early']){ + (new FenxiaoAccount())->addAccount($calculate_data['fenxiao_info']['fenxiao_id'], $calculate_data['fenxiao_info']['fenxiao_name'], 'diamond', -1, $data['futures_id'],'diamond', '提前秒杀扣除'); + } + $result_list = event('OrderCreate', [ 'order_id' => $order_id, 'site_id' => $shop_goods_list[ 'site_id' ],'create_data' => $calculate_data ]); if (!empty($result_list)) { foreach ($result_list as $k => $v) { @@ -273,13 +280,35 @@ class FuturesOrderCreate extends OrderCreate return $this->error([], '该秒杀不存在!'); $futuresModel = new FuturesModel; - $times = $futuresModel->checkTimes($site_id, $member_id, $futures_info['status']); - if($times['code'] != 0){ - return $times; + $data['times'] = $futuresModel->checkTimes($site_id, $member_id, $futures_info['status']); + if($data['times']['code'] != 0){ + return $data['times']; + } + $data['times'] = $data['times']['data']; + $data['fenxiao_info'] = model('fenxiao')->getInfo([['member_id','=',$data['member_id']]]); + $basics = $futuresModel->getBasicsConfig($site_id)['data']['value']; + $futuresUser = model('futures_user')->getInfo([['member_id', '=', $data['member_id']]]); + + //检查钻石数量 + if($data['times']['is_early'] && $futuresUser['is_special'] == 0){ + if($data['fenxiao_info']['diamond'] <= 0){ + return error(-1,'钻石不足,不可提前秒杀'); + } + } + // 判断用户是否有足够多的购买机会 + if($futuresUser['business_num'] >= $basics['order_restrictions_num'] && $futuresUser['is_special'] == 0){ + return error(-1,'下单次数达到限制,需提货恢复下单'); + } + + // 判断是否本人购买 + if($data['member_id'] == $futures_info['seller_uid'] && $futuresUser['is_special'] == 0){ + return error(-1,'本人订单不可本人购买'); + } + + // 判断惩罚时间 + if($futuresUser['punish_time'] <= time() && $futuresUser['is_special'] == 0){ + return error(-1,'有违规订单,在惩罚时间内,惩罚时间到 '.date("Y-m-d H:i:s", $futuresUser['punish_time'])); } - //TODO 判断用户是否有足够多的购买机会 - //TODO 判断是否本人购买 - //TODO 判断惩罚时间 $futures_id = $futures_info['id']; $data['futures_id'] = $futures_id; diff --git a/addon/futures/shop/view/config/basics.html b/addon/futures/shop/view/config/basics.html index 4f1368b7..770397c8 100644 --- a/addon/futures/shop/view/config/basics.html +++ b/addon/futures/shop/view/config/basics.html @@ -102,6 +102,14 @@ +