id(); $wine_code = $request->input('wine_code'); if (empty($wine_code)) throw new \Exception("缺少参数酒码"); //手机号、验证码检测 $name = $request->input('name'); $mobile = $request->input('mobile'); $code = $request->input('code'); $res = Message::checkCode($mobile, $code); if (empty($res)) return $this->failure("验证码错误"); $shop_code = ShopCode::where('code', $wine_code)->first(); if (empty($shop_code)) return $this->failure("酒码无效"); $res = ShopCodeLog::code($shop_code->id)->receive()->exists(); if ($res) return $this->failure("酒码已被绑定"); ShopCodeLog::create(['mobile'=>$mobile, 'name'=>$name, 'code_id'=>$shop_code->id, 'user_id'=>$user_id, 'receive'=>1]); return $this->success('ok'); } public function bindPackCode(Request $request) { $user_id = auth()->id(); $pack_code = $request->input('pack_code'); if (empty($pack_code)) throw new \Exception("缺少参数包装码"); //手机号、验证码检测 // $name = $request->input('name'); // $mobile = $request->input('mobile'); // $code = $request->input('code'); // $res = Message::checkCode($mobile, $code); // if (empty($res)) return $this->failure("验证码错误"); $shop_codes = ShopCode::where('pack_code', $pack_code)->get(); if ($shop_codes->count() < 6) return $this->failure("包装码无效"); $verify_code = $request->input('verify_code'); Log::info("verify_code: ".strtoupper($verify_code)); Log::info("verify_code2: ".$shop_codes->first()->verify_code); if ($shop_codes->first()->verify_code != strtoupper($verify_code)) return $this->failure("防伪码错误"); $res = ShopCodeLog::codes($shop_codes->pluck('id')->toArray())->receive()->count(); if ($res >=6) return $this->failure("包装码已被绑定"); $data = []; foreach ($shop_codes as $shop_code) { $data[] = ['user_id'=>$user_id, 'mobile'=>null, 'name'=>null, 'code_id'=>$shop_code->id, 'type'=>ShopCodeLog::PACKTYPE, 'receive'=>1]; } ShopCodeLog::upsert($data, ['code_id'], ['code_id']); return $this->success('ok'); } public function wineCodeStatus(Request $request) { $user = auth()->user(); $wine_code = $request->input('wine_code'); if (empty($wine_code)) throw new \Exception("缺少参数酒码"); $shop_code = ShopCode::where('code', $wine_code)->first(); if (empty($shop_code)) return $this->failure("酒码无效"); //记录扫码记录 // ShopCodePreview::create(['code'=>$wine_code, 'user_id'=>$user_id, 'type'=>ShopCodePreview::WINETYPE]); //酒码是否有效 1:无效,0:有效 // $receive = ShopCodeLog::code($shop_code->id)->receive()->exists()?1:0; $log = ShopCodeLog::code($shop_code->id)->receive()->first(); if (empty($log)) { $log = ShopCodeLog::create( ['user_id'=>$user->id, 'mobile'=>null,'name'=>null, 'code_id'=>$shop_code->id, 'type'=>ShopCodeLog::WINETYPE, 'receive'=>1]); } $receive = 0; //返回酒编号 $number = $shop_code->number; //绑定时间 $created_at = $log->created_at->toDateTimeString(); //app下载码 // $download_qrcode = User::downloadQrcode($request->device); $download_qrcode = "https://images.health.ufutx.com/202402/19/6db174f81a6f1272cb6b13d68308428c.jpeg"; $res = WechatService::wechatUserByOfficialOpenid($user->officialWechat->openid); $is_subscribe = $res['subscribe']; //公众号二维码 $official_qrcode = 'https://ufutx-health.oss-cn-hangzhou.aliyuncs.com/202312/13/showqrcode.png'; return $this->success('ok',compact('receive', 'number', 'created_at', 'download_qrcode','is_subscribe','official_qrcode')); } public function packCodeStatus(Request $request) { $user = auth()->user(); $pack_code = $request->input('pack_code'); if (empty($pack_code)) throw new \Exception("缺少参数包装码"); $shop_codes = ShopCode::with('log')->where('pack_code', $pack_code)->orderBy('number')->get(); if ($shop_codes->count() < 6) return $this->failure("包装码无效"); //记录扫码记录 // ShopCodePreview::create(['code'=>$pack_code, 'user_id'=>$user_id, 'type'=>ShopCodePreview::PACKAGETYPE]); //酒码是否有效 $log = ShopCodeLog::codes($shop_codes->pluck('id')->toArray())->pack()->receive()->first(); $receive = $log?1:0; //返回酒编号 $number = $shop_codes->first()->pack_number; //绑定时间 $created_at = $log?$log->created_at->toDateTimeString():null; //app下载码 $download_qrcode = User::downloadQrcode($request->device); //是否关注公众号 $res = WechatService::wechatUserByOfficialOpenid($user->officialWechat->openid); $is_subscribe = $res['subscribe']; //公众号二维码 $official_qrcode = 'https://ufutx-health.oss-cn-hangzhou.aliyuncs.com/202312/13/showqrcode.png'; return $this->success('ok',compact('receive', 'number', 'created_at', 'download_qrcode', 'is_subscribe', 'official_qrcode')); } public function wineCodeLogs(Request $request) { $user = auth()->user(); $logs = ShopCodeLog::with(['shopCode'=>function($sql) { $sql->orderBy('shop_codes.pack_number'); }])->user($user->id)->receive()->simplePaginate(); foreach ($logs as $log) { $log->shopCode->number = $log->shopCode->pack_number."-".$log->shopCode->number; } return $this->success('ok', $logs); } public function sendSmsCode(Request $request) { $mobile = $request->input('mobile'); $code = CommonService::random(6, 1); $data = [ 'code' => $code, 'message' => '绑定酒码验证码:' . $code . ',十分钟有效【友福同享】', ]; $area_code = $request->input('area_code', 86); SendEasySms::dispatch($mobile, $data,$area_code)->onQueue('send.code.sms'); return $this->success('ok'); } public function serverBindWineCode(Request $request){ $package_code = $request->input('package_code'); if(empty($package_code)) return $this->failure('包装码无效'); Log::info("serverBindWineCode: $package_code"); $wine_code = $request->input('wine_code'); if(empty($wine_code) && count($wine_code) < 6) return $this->failure('酒码无效'); Log::info("serverBindWineCode: ".json_encode($wine_code)); $unique_array = array_unique($wine_code); if (count($wine_code) != count($unique_array)) { return $this->failure('酒码重复'); } $exists = ShopCode::where('pack_code', $package_code)->exists(); if(empty($exists)) return $this->failure('包装码不存在'); $shop_codes = ShopCode::where('pack_code', $package_code)->where('code','')->get(); if(empty($shop_codes)) return $this->failure('包装码无效'); $package_status = 0; if ($shop_codes->count() < 6) $package_status = 1; $wine_shop_code = ShopCode::whereIn('code', $wine_code)->pluck('code')?->toArray(); $wines = []; foreach ($wine_code as $key => $wine){ $wines[$key]['code'] = $wine; $wines[$key]['status'] = 0; if(in_array($wine,$wine_shop_code)){ $wines[$key]['status'] = 1; } } $shop_codes = $shop_codes->toArray(); if(!$package_status || empty($wine_shop_code)){ foreach ($shop_codes as $index => $item){ if(!isset($wine_code[$index])){ continue; } $package_info = ShopCode::where('id', $item['id'])->first(); $package_info->code = $wine_code[$index]; $package_info->number = (int)date('Ymd').'0'.$index+1; $package_info->save(); $wines[$index]['code'] = $wine; $wines[$index]['status'] = 0; } } return $this->success('ok',compact('package_status','wines')); } public function serverGetDetail(Request $request){ $package_code = $request->input('package_code'); if(empty($package_code)) return $this->failure('包装码无效'); $shop_codes = ShopCode::where('pack_code', $package_code)->get(); if(empty($shop_codes)) return $this->failure('包装码无效'); return $this->success('ok',$shop_codes); } public function serverGetPackList(Request $request){ $shop_codes = ShopCode::where(function($sql) { $sql->whereNotNull('code')->where('code', '<>', ''); })->groupBy('pack_code', 'pack_number')->select('pack_code', 'pack_number')->orderBy('pack_number')->paginate(); if(empty($shop_codes)) return $this->failure('包装码无效'); return $this->success('ok',$shop_codes); } public function agentShops(Request $request) { // $accid = auth()->user()->accid(); // $param = $request->all(); // $param['accid'] = $accid; // $param = http_build_query($param); // $url = config('app.shop_url')."agent/shops?$param"; // $res = $this->getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $shops = Shop::with('shopAgent')->whereHas("shopAgent", function ($sql) { $sql->show()->orderByDesc("id"); })->keyword()->paginate(); $shops = new AgentShopCollection($shops); return $this->success('ok', $shops); } public function agentShop(Request $request, Shop $shop) { $shop = new AgentShopResource($shop); return $this->success('ok', $shop); } public function payAgentShop(Request $request, Shop $shop) { $data = $request->all(); $sku_id = $request->input('sku_id'); $name = $request->input('name'); if (empty($name)) return $this->failure('请填写收货人'); $mobile = $request->input('mobile'); if (empty($mobile)) return $this->failure('请填写电话'); $num = $request->input('num'); if (empty($num)) return $this->failure('请选择数量'); $user = auth()->user(); $open_id = $user->officialWechat->openid; if (empty($open_id)) throw new \Exception('获取用户openid失败'); //批发商等级 $sku_arr = $shop->shopAgent->sku; $sku = null; if (is_array($sku_arr) && count($sku_arr)) {//含sku $sku = collect($sku_arr)->where('sku_id', $request->sku_id)->first(); $price = $sku['price']; }else { $price = $shop->price; } if ($shop->id != Shop::ZongZiId) { /** * 批发商半价, * 准批发商第一个原价第二件及以后半价并且成为批发商 * 非批发商原价 */ $level = $user->agentUser?$user->agentUser->level:0; if (!$level) {//非经销商 $data['price'] = $price * $data['num']; }elseif ($level == 2) {//非经销商除第一件,其他半价 $data['price'] = number_format($price + ($price / 2 * ($data['num'] - 1)), 2, '.', ''); }elseif ($level == 1) { $data['price'] = number_format($price / 2 * $data['num'], 2, '.', ''); } } else { $data['price'] = $price * $data['num']; } /** * 两件及以上包邮 */ if ($data['num'] > 1) { $data['freight'] = 0; }else { $data['freight'] = $shop->shopAgent->freight; } $data['price'] = number_format($data['price'] + $data['freight'], 2, '.', ''); //计算会员 $data['origin_price'] = number_format($price * $data['num'], 2, '.', '');; if ($data['price'] < 0) throw new \Exception("订单计算错误"); $data['pay_type'] = $data['price'] == 0?"free":"wechat"; $data['trade_no'] = CommonService::getTradeNo(); $data['shop_id'] = $shop->id; $data['sku_id'] = $sku?$sku['sku_id']:0; $data['user_id'] = $user->id; $data['desc'] = $shop->title."-".($sku?$sku['name']:''); $data['shop_info'] = ["id"=>$shop->id, 'title'=>$shop->title, 'pic'=>$shop->icon, 'sku'=>$sku]; $data['pay_status'] = $data['price'] > 0?"UNPAID":"PAID"; $data['from_user_id']= $request->input('from_user_id'); //代理商品比例 // $arr = ShopAgent::AGENT_SHOP; // $ratio = $arr['agent_sku_id'] == $data['sku_id']?$arr['ratio']:1; $ratio = 1; $data['stock'] = $data['remain_stock']= $data['num'] * $ratio; $data['sub_mch_id'] = "1663332225"; DB::beginTransaction(); //生成未支付订单 $order = AgentOrder::create($data); $config = []; if ($data['pay_status'] == 'UNPAID') { //获取支付配置 $callback = config('app.url')."/api/h5/agent/order/".$data['trade_no'].'/callback'; $appId = config('wechat.official_account.default.app_id')?:'wx5174eb5ba45228a4'; $config = WechatService::mpPay($data['trade_no'], $open_id, $data['price'], $data['desc'],$callback,$appId,$data['sub_mch_id']); }else { $this->markAgentOrder($order); } DB::commit(); return $this->success('ok', compact('order', 'config')); } public function payAgentShopV2(Request $request, Shop $shop) { $data = $request->all(); $sku_id = $request->input('sku_id'); // $name = $request->input('name'); // if (empty($name)) return $this->failure('请填写收货人'); // $mobile = $request->input('mobile'); // if (empty($mobile)) return $this->failure('请填写电话'); $num = $request->input('num'); if (empty($num)) return $this->failure('请选择数量'); $user = auth()->user(); $open_id = $user->officialWechat->openid; if (empty($open_id)) throw new \Exception('获取用户openid失败'); //批发商等级 $sku_arr = $shop->shopAgent->getSkus(); $sku = null; if (is_array($sku_arr) && count($sku_arr)) {//含sku $sku = $user->getGoodsSku($sku_arr, $sku_id); $price = $sku['price'] * $num; $data['origin_price'] = $sku['origin_price'] * $num; }else { $price = $shop->price * $num; $data['origin_price'] = $shop->price * $num; } //首单 $first_order = AgentOrder::owner($user->id)->where('shop_id', $shop->id)->paid()->exists()?0:1; //任何用户首单 第一件原价,后面每件半价 //修改为 除VIP用户外的任何用户首单 第一件原价,后面每件半价, VIP用户始终使用vip价格 $agent_user = $user->agentUser; if (!$agent_user || $agent_user->level != AgentUser::AgentVIP) { if($first_order) { if ($num == 1) { $price = $sku['origin_price']; }else { $over_num = $num - 1; $over_pirce = $sku['agent_price']; $price = number_format($sku['origin_price'] + $over_num * $over_pirce, 2, '.', ''); } } } //当前角色 // $agent_user = $user->agentUser; // if ($agent_user && ($agent_user->level == AgentUser::AgentLevelReady || $agent_user->level == AgentUser::AgentLevelBeing) && $first_order) { // //准批发价格另算 // if ($num <= $sku['before_num']) { // $price = number_format( $sku['before_price'] * $num, 2,'.',''); // }else { // $over_num = number_format($num - $sku['before_num']); // $price = number_format($sku['before_num'] * $sku['before_price'] + $over_num * $sku['over_price'], 2, '.',''); // } // } //快递费 $ship_fee = 0; if($data['is_online'] == AgentOrder::ONLINETYPE) { $ship_fee = AgentShop::getGoodsShip($sku, $data['num']); } $data['price'] = number_format($price + $ship_fee, 2, '.', ''); $data['freight'] = $ship_fee; if ($data['price'] < 0) throw new \Exception("订单计算错误"); $data['pay_type'] = $data['price'] == 0?"free":"wechat"; $data['trade_no'] = CommonService::getTradeNo(); $data['shop_id'] = $shop->id; $data['sku_id'] = $sku?$sku['sku_id']:0; $data['user_id'] = $user->id; $data['name'] = $user->name; $data['mobile'] = $user->mobile; $data['desc'] = $shop->title."-".($sku?$sku['name']:''); $lotto_code = $shop->shopAgent()->select("id","shop_id", 'is_show', 'lotto_code')->value('lotto_code'); $data['shop_info'] = ["id"=>$shop->id, 'title'=>$shop->title, 'pic'=>$shop->icon, 'sku'=>$sku, 'lotto_code'=>$lotto_code]; $data['pay_status'] = $data['price'] > 0?"UNPAID":"PAID"; $data['from_user_id']= $request->input('from_user_id'); //代理商品比例 // $arr = ShopAgent::AGENT_SHOP; // $ratio = $arr['agent_sku_id'] == $data['sku_id']?$arr['ratio']:1; $ratio = 1; $data['stock'] = $data['remain_stock']= $data['num'] * $ratio; if ($shop->id == 89) { $data['sub_mch_id'] = "1626601973"; }else { $data['sub_mch_id'] = $shop->shopAgent->payment?$shop->shopAgent->payment->sub_mch_id:'1626601973'; // $data['sub_mch_id'] = "1663332225"; } DB::beginTransaction(); //生成未支付订单 $order = AgentOrder::create($data); $order->status()->create(['status'=>AgentOrder::UNPAIDSTATUS]); $config = []; if ($data['pay_status'] == 'UNPAID') { //获取支付配置 $callback = config('app.url')."/api/h5/agent/order/".$data['trade_no'].'/callback'; $appId = config('wechat.official_account.default.app_id')?:'wx5174eb5ba45228a4'; $config = WechatService::mpPay($data['trade_no'], $open_id, $data['price'], $data['desc'],$callback,$appId,$data['sub_mch_id']); }else { $this->markAgentOrderV2($order); } DB::commit(); return $this->success('ok', compact('order', 'config')); } public function callbackAgentOrder($trade_no) { $order = AgentOrder::where('trade_no', $trade_no)->first(); if ($order->mobile == "") { $user = $order->user; $order->update(['name'=>$user->name, 'mobile'=>$user->mobile]); } if ($order->pay_status != "UNPAID") return; if ($order->pay_type == 'wechat') { $sub_mch_id = $order->sub_mch_id; if ($order->shop_id == 89) { $sub_mch_id = "1626601973"; } $res = WechatService::mpPaid($trade_no, $sub_mch_id); if ($res) return; // $this->markAgentOrder($order); $this->markAgentOrderV2($order); } } public function markAgentOrderV2($order) { DB::beginTransaction(); //修改订单状态 $order->update(['pay_status'=> 'PAID']); $order->status()->create(['status'=>AgentOrder::PAIDSTATUS]); if (($order->shop_info)['lotto_code']) {//是否需要生成抽奖码 for ($index =0; $index < $order->num; $index++) { $code = time().CommonService::random(6,1).strtoupper(CommonService::random(1)); //生成抽奖码 $order->lottoCode()->create(['user_id'=>$order->user_id, 'code'=>$code]); //加入抽奖池 if ($order->shop_id == ((config('app.env') == "production")? AgentShop::WINEID : AgentShop::ALPHA_WINEID)) { $lottery_id = (config('app.env') == "production")?AgentShop::LOTTERYID: AgentShop::ALPHA_LOTTERYID; LotteryMember::create(['user_id'=>$order->user_id, 'lottery_id'=>$lottery_id, 'name'=>$order->name, 'mobile'=>$order->mobile, 'code'=>$code]); } //手环加入抽奖 if ($order->shop_id == ((config('app.env') == "production")? AgentShop::BANDID : AgentShop::ALPHA_BANDID)) { $lottery_id = (config('app.env') == "production")?AgentShop::BAND_LOTTERY_ID: AgentShop::ALPHA_BAND_LOTTERY_ID; LotteryMember::create(['user_id'=>$order->user_id, 'lottery_id'=>$lottery_id, 'name'=>$order->name, 'mobile'=>$order->mobile, 'code'=>$code]); } } } //准批发商成为批发商 if (($order->shop_info)['sku']['is_agent']) { AgentUser::changeLevel($order->user_id, AgentUser::AgentLevelBeing,"购买".($order->shop_info)['title']."-".($order->shop_info)['sku']['name']); } DB::commit(); } public function storeLottoCode($trade_no) { $order = S2ShopOrder::where('trade_no', $trade_no)->first(); if (empty($order)) return $this->failure("订单不存在"); if ($order->status != 2) return $this->failure("订单状态不正确"); $extend = S2ShopSkuExtend::where('sku_id', $order->sku_id)->first(); if ($extend && $extend->open_lottery_code) {//是否需要生成抽奖码 $num = $order->lottoCode()->where('order_type', S2ShopOrder::class)->count(); for ($index =0; $index < $order->num - $num; $index++) { $code = time().CommonService::random(6,1).strtoupper(CommonService::random(1)); //生成抽奖码 $order->lottoCode()->create(['user_id'=>$order->user_id, 'code'=>$code, 'order_type'=>S2ShopOrder::class]); // //加入抽奖池 // if ($order->shop_id == ((config('app.env') == "production")? AgentShop::WINEID : AgentShop::ALPHA_WINEID)) { // $lottery_id = (config('app.env') == "production")?AgentShop::LOTTERYID: AgentShop::ALPHA_LOTTERYID; // LotteryMember::create(['user_id'=>$order->user_id, 'lottery_id'=>$lottery_id, 'name'=>$order->name, 'mobile'=>$order->mobile, 'code'=>$code]); // } // //手环加入抽奖 // if ($order->shop_id == ((config('app.env') == "production")? AgentShop::BANDID : AgentShop::ALPHA_BANDID)) { // $lottery_id = (config('app.env') == "production")?AgentShop::BAND_LOTTERY_ID: AgentShop::ALPHA_BAND_LOTTERY_ID; // LotteryMember::create(['user_id'=>$order->user_id, 'lottery_id'=>$lottery_id, 'name'=>$order->name, 'mobile'=>$order->mobile, 'code'=>$code]); // } } } } public function markAgentOrder($order) { $wine_id = config('app.env') == 'production'?AgentShop::WINEID:AgentShop::ALPHA_WINEID; DB::beginTransaction(); //修改订单状态 $order->update(['pay_status'=> 'PAID']); if ($order->shop_id == $wine_id) { for ($index =0; $index < $order->num; $index++) { $code = time().CommonService::random(6,1).strtoupper(CommonService::random(1)); //生成抽奖码 $order->lottoCode()->create(['user_id'=>$order->user_id, 'code'=>$code]); } } $num = $order->num; $order->shop->decrementShopStock($order->sku_id, $num, $type=Shop::AGENTSTOCKTYPE); //准批发商成为批发商 // $agent_user = AgentUser::where(['user_id'=>$order->user_id])->first(); if ($order->shop_id == $wine_id) { AgentUser::changeLevel($order->user_id, AgentUser::AgentLevelBeing,"购买渣酒"); } DB::commit(); } public function orderCallback(Request $request) { $trade_no = $request->get('trade_no'); if(empty($trade_no))return $this->failure('订单号不为空'); $user_id = $request->input('user_id'); $user = User::find($user_id); $num = $request->input('num'); $ratio = (User::AGENT_SHOP)['ratio']; $num = $num * $ratio; $goods_id = $request->input('goods_id'); $goods_name = $request->input('goods_name'); $sku_name = $request->input('sku_name'); $sku_stock = $request->input('sku_stock'); $map = []; $map['id'] = $goods_id; $map['name'] = $goods_name.'/'.$sku_name; $map['stock'] = $sku_stock; $map['num'] = $num; $map['after_num'] = $sku_stock-$num; $map['type'] = OperateStockLog::TYPE_AGENT; $map['remark'] = '经销商用户:'.$user->name.' 购买了商品:'.$goods_name.' 购买数量:'.$num.' 订单号:'.$trade_no; $map['operate_type'] = OperateStockLog::OPERATE_TYPE_OUT; $map['status'] = OperateStockLog::OPERATE_STATUS_PASS; OperateStockLog::addLog($user,$map); return $this->success('ok'); } public function agentOrders(Request $request) { $user_id = auth()->id(); $orders = AgentOrder::owner($user_id)->paid()->orderByDesc('id')->paginate(); foreach ($orders as $order) { $order->remain_stock = $order->num; } return $this->success('ok', $orders); } public function agentOrder(Request $request,AgentOrder $order) { // $accid = auth()->user()->accid(); // $param = $request->all(); // $param['accid'] = $accid; // $param = http_build_query($param); // $url = config('app.shop_url')."agent/shop/orders/$order_id?$param"; // $res = $this->getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $order->remain_stock = $order->num; $order->status; return $this->success('ok', $order); } public function agentTradeOrder(Request $request, $trade_no) { // $param = $request->all(); // $param = http_build_query($param); // $url = config('app.shop_url')."agent/shop/orders/no/$trade_no?$param"; // $res = $this->getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $res = explode('_', $trade_no); switch ($res[0]) { case "AG": //GO语言批发商商城订单 config(['database.connections.mysql.prefix' => '']); $order = DB::table('oa_agent_goods_order')->where('trade_no', $trade_no)->first(); if ($order) { $order->shop_info = json_decode($order->shop_info); $order->sku = json_decode($order->sku); $order->shop_info->sku = $order->sku; $order->order_type = 'oa_agent_shop'; } break; default : $order = AgentOrder::where('trade_no', $trade_no)->first(); $order->order_type = 'agent_shop'; } return $this->success('ok', $order); } public function agentShares(Request $request) { $accid = auth()->user()->accid(); $param = $request->all(); $param['accid'] = $accid; $param = http_build_query($param); $url = config('app.shop_url')."agent/shares?$param"; $res = $this->getData($url); if ($res['code'] == 1) return $this->failure($res['message']); $data = $res['data']; return $this->success('ok', $data); } public function agentLottoCodes(Request $request) { $user_id = auth()->id(); $logs = LottoCode::with('order:id,shop_info', 'winMember.award')->user($user_id)->orderByDesc('id')->paginate(); foreach ($logs as $log) { $log->award = $log->winMember->award->awards??null; unset($log->winMember); } return $this->success('ok', $logs); } public function getOutStock(Request $request, $order_id) { $data = $request->all(); $data['accid'] = auth()->user()->accid(); $url = config('app.shop_url')."agent/shop/orders/$order_id/stock"; $res = $this->postData($url, $data); if ($res['code'] == 1) return $this->failure($res['message']); $data = $res['data']; return $this->success('ok', $data); } public function getOutStockV2(Request $request, $shop_id) { $data = $request->only(['num','name','mobile','get_type','address']); $data['accid'] = auth()->user()->accid(); $url = config('app.shop_url')."agent/shop/$shop_id/stock"; $res = $this->postData($url, $data); if ($res['code'] == 1) return $this->failure($res['message']); $data = $res['data']; return $this->success('ok', $data); } public function agentInfo(Request $request) { // $param = $request->all(); // $param['accid'] = auth()->user()->accid(); // $param = http_build_query($param); // $url = config('app.shop_url')."agent/info?$param"; // $res = $this->getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // $data['qrcode'] = auth()->user()->getShopAgentQrcode(); // return $this->success('ok', $data); $user = auth()->user(); $amount = $user->earning(); $user->amount = $amount; //总库存 $total_stock = $user->agentOrders()->where('pay_status', AgentOrder::PAIDSTATUS)->sum("num"); //消耗库存 $consume_stock = 0; $stock = number_format($total_stock - $consume_stock, 0 , '.',''); $user->stock = $stock; $user->qrcode= $user->getShopAgentQrcode(); return $this->success('ok', $user); } public function agentEarning(Request $request) { // $param = $request->all(); // $param['accid'] = auth()->user()->accid(); // $param = http_build_query($param); // $url = config('app.shop_url')."agent/earning?$param"; // $res = $this->getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $amount = auth()->user()->earning(); return $this->success("ok", compact('amount')); } public function agentWithdraws(Request $request) { // $param = $request->all(); // $param['accid'] = auth()->user()->accid(); // $param = http_build_query($param); // $url = config('app.shop_url')."agent/withdraws?$param"; // $res = $this->getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $withdraws = auth()->user()->agentWithdraws()->orderByDesc('id')->simplePaginate(); return $this->success('ok', $withdraws); } public function agentWithdraw(Request $request) { // $param = $request->all(); // $param['accid'] = auth()->user()->accid(); // $url = config('app.shop_url')."agent/withdraw"; // $res = $this->postData($url,$param); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $user = auth()->user(); $amount = $user->earning(); $data = $request->all(); // if ($data['amount'] > $amount) return $this->failure("余额不足"); $data['user_id'] = $user->id; $data['status'] = 'AUDIT'; $user->agentWithdraws()->create($data); return $this->success('ok'); } public function agentShopQrcode(Request $request, $shop_id) { $qrcode = auth()->user()->getShopAgentQrcode($shop_id); return $this->success('ok', compact('qrcode')); } /** * 提取get请求公共代码 * @param $url * @return \Illuminate\Http\JsonResponse|mixed * @throws \GuzzleHttp\Exception\GuzzleException */ public function getData($url){ $headers = [ 'Key' => config('app.shop_key'), // 自定义头部参数(示例) ]; $client = new Client(); $response = $client->get($url, [ 'headers' => $headers, ]); $code = $response->getStatusCode(); if($code != 200){ return ['message'=>'请求失败','code'=>1]; } $body = $response->getBody()->getContents(); // 获取响应内容 $list = json_decode($body, true); return $list; } /** * 提取post请求公共代码 * @param $url * @param $params * @return \Illuminate\Http\JsonResponse|mixed * @throws \GuzzleHttp\Exception\GuzzleException */ public function postData($url,$params){ $headers = [ 'Key' => config('app.shop_key'), // 自定义头部参数(示例) ]; $client = new Client(); $response = $client->post($url, [ 'headers' => $headers, 'json' => $params ]); $code = $response->getStatusCode(); if($code != 200){ return ['message'=>'请求失败','code'=>1]; } $body = $response->getBody()->getContents(); // 获取响应内容 $list = json_decode($body, true); return $list; } public function putData($url,$params){ $headers = [ 'Key' => config('app.shop_key'), // 自定义头部参数(示例) ]; $client = new Client(); $response = $client->put($url, [ 'headers' => $headers, 'json' => $params ]); $code = $response->getStatusCode(); if($code != 200){ return ['message'=>'请求失败','code'=>1]; } $body = $response->getBody()->getContents(); // 获取响应内容 $list = json_decode($body, true); return $list; } public function deleteData($url,$params){ $headers = [ 'Key' => config('app.shop_key'), // 自定义头部参数(示例) ]; $client = new Client(); $response = $client->delete($url, [ 'headers' => $headers, 'json' => $params ]); $code = $response->getStatusCode(); if($code != 200){ return ['message'=>'请求失败','code'=>1]; } $body = $response->getBody()->getContents(); // 获取响应内容 $list = json_decode($body, true); return $list; } public function shopShareQrcode(Request $request, $shop_id) { $qrcode = auth()->user()->getShopAgentQrcode($shop_id, 'H5'); return $this->success('ok', ['qrcode'=>$qrcode]); } /** * 注册经销商 * @param Request $request * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse */ public function storeAgentUsers(Request $request) { DB::beginTransaction(); $user = auth()->user(); $data = $request->all(); //验证手机号和验证码 $res = Message::checkCode($data['mobile'], $data['code']); if (empty($res)) return $this->failure("验证码无效"); //判断手机号是否在其他微信注册 $mobile_user = User::whereHas("officialWechat")->where("mobile", $data['mobile'])->where("id", "<>", $user->id)->first(); if ($mobile_user) { //是否是虚拟openid if (!Wechat::isVirtualOpenid($mobile_user->officialWechat->openid))return $this->failure("手机号已存在其他微信账号"); $user->officialWechat->update(['user_id'=>$mobile_user->id]); $mobile_user->officialWechat->update(['user_id'=>null]); $user = $mobile_user; } $user->update($data); //同步活动订单用户 AgentUser::changeLevel($user->id, AgentUser::AgentLevelNot, "注冊经销商",true); $activity_order_count = ActivityOrder::where("mobile", $data['mobile'])->paid()->count(); if ($activity_order_count) { AgentUser::changeLevel($user->id, AgentUser::AgentLevelBeing, "系统检测含票活动订单", true); ActivityOrder::where("mobile", $data['mobile'])->paid()->update(['user_id'=>$user->id]); } //同步渣酒订单用户 $agent_order_count = AgentOrder::where("mobile", $data['mobile'])->where('shop_id', 3)->paid()->count(); if ($agent_order_count) { AgentUser::changeLevel($user->id, AgentUser::AgentLevelBeing, "系统检测含渣酒订单"); AgentOrder::where("mobile", $data['mobile'])->paid()->update(['user_id'=>$user->id]); //同步抽奖码 $agent_order_ids = AgentOrder::where("mobile", $data['mobile'])->paid()->pluck("id"); LottoCode::whereIn('order_id', $agent_order_ids)->update(["user_id"=> $user->id]); } //同步抽奖信息 LotteryMember::where('user_id', $user->id)->update(['name'=>$user->name, 'mobile'=>$user->mobile]); $user_ids = User::where("mobile", $data['mobile'])->where('id', '<>', $user->id)->pluck('id')->toArray(); //手机号对应的是否有agentUser $level = AgentUser::AgentLevelNot; if (count($user_ids)) { $level = AgentUser::whereIn("user_id", $user_ids)->where('level', '>', 0)->orderBy("level", "asc")->value('level'); } if ($level) { AgentUser::changeLevel($user->id, $level, "同步手机号账号"); } DB::commit(); return $this->success('ok'); } public function updateAgentUserInfo(Request $request){ try { $user = auth()->user(); $name = $request->input('name'); $avatar = $request->input('avatar'); $mobile = $request->input('mobile'); $user->name = $name; $user->avatar = $avatar; if ($mobile) { //判断手机号是否在其他微信注册 $mobile_user = User::whereHas("officialWechat")->where("mobile", $mobile)->where("id", "<>", $user->id)->first(); if ($mobile_user) return $this->failure("手机号已存在其他微信账号"); $user->mobile = $mobile; } $user->save(); //同步抽奖信息 LotteryMember::where('user_id', $user->id)->update(['name'=>$name, 'mobile'=>$mobile]); return $this->success('ok'); }catch (\Exception $e) { Log::error('updateAgentUserInfo:'.$e->getMessage()); return $this->jsonResponse(1, $e->getMessage()); } } /** * 经销商注册验证码 * @param Request $request */ public function agentUserCode(Request $request) { $mobile = $request->input('mobile'); if(empty($mobile)) throw new \Exception("缺少参数mobile"); $code = CommonService::random(6, 1); $data = [ 'code' => $code, 'message' => '手机号验证码:' . $code . ',十分钟有效【友福同享】', ]; SendEasySms::dispatch($mobile, $data)->onQueue('health'); return $this->success('ok'); } /** * 经销商已购商品列表 * @param Request $request * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\JsonResponse */ public function userAgentShops(Request $request) { // $accid = auth()->user()->accid(); // $param['accid'] = $accid; // $param = http_build_query($param); // $url = config('app.shop_url')."user/agent/shops?$param"; // $res = HttpService::getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $user_id = auth()->id(); $shops = Shop::whereHas("agentOrders", function ($sql) use($user_id){ $sql->where('user_id', $user_id); })->withCount(["agentOrders as stock"=>function($sql) use($user_id) { $sql->where('user_id', $user_id)->select(DB::raw("sum(num) as stock_sum")); }])->orderByDesc("stock")->paginate(); return $this->success('ok', $shops); } public function userAgentShop(Request $request, $shop_id) { // $accid = auth()->user()->accid(); // $param['accid'] = $accid; // $param = http_build_query($param); // $url = config('app.shop_url')."user/agent/shops/{$shop_id}?$param"; // $res = HttpService::getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $shop = Shop::find($shop_id); $user = auth()->user(); //总库存 $total_stock = $user->agentOrders()->where('shop_id', $shop_id)->where('pay_status', AgentOrder::PAIDSTATUS)->sum("num"); //已消耗庫存 $consume_stock = 0; $stock = number_format($total_stock - $consume_stock, 0 , '.',''); $shop->stock = $stock; return $this->success('ok', $shop); } public function agentShareInfo(Request $request) { // $from_user_id = $request->input('from_user_id'); // $from_accid = $from_user_id?User::userAccid($from_user_id):null; // $param['from_accid'] = $from_accid; // $param['shop_id'] = $request->input('shop_id'); // $param = http_build_query($param); // $url = config('app.shop_url')."agent/share/info?$param"; // $res = HttpService::getData($url); // if ($res['code'] == 1) return $this->failure($res['message']); // $data = $res['data']; // return $this->success('ok', $data); $shop_id = $request->input('shop_id'); $shop = Shop::find($shop_id); $from_user_id = $request->input('from_user_id'); $user = null; if ($from_user_id) { $user = User::find($from_user_id); } return $this->success('ok', compact('user', 'shop')); } public function signOrder(Request $request, AgentOrder $order) { if ($order->pay_status != AgentOrder::SENDSTATUS) return $this->failure("该订单状态暂不能签收"); $order->update(['pay_status'=>AgentOrder::SIGNEDSTATUS]); $order->status()->create(['status'=>AgentOrder::SIGNEDSTATUS]); return $this->success('ok'); } /** * 活动票明细 * @param Request $request */ public function residueAmount(Request $request) { $user = auth()->user(); //可退余额 $residue_amount = ActivityOrder::owner($user->id)->paid()->residue()->sum("residue_amount"); //明细 $logs = ActivityOrderLog::owner($user->id)->orderByDesc("id")->paginate(); foreach ($logs as $log) { $log->status = 1; $log->reason = ''; $refund = ActivityShareRefund::where('log_id', $log->id)->first(); if ($refund) { $log->status = $refund->status; $log->reason = $refund->reason; } } return $this->success('ok', compact('residue_amount', 'logs')); } /** * 申请余额退款 * @param Request $request */ public function applyRefundAmount(Request $request) { DB::beginTransaction(); $amount = $request->input('amount'); if (empty($amount)) return $this->failure("请输入退款金额"); $user = auth()->user(); //可退余额 $residue_amount = ActivityOrder::owner($user->id)->paid()->residue()->sum("residue_amount"); if ($amount > $residue_amount) return $this->failure("可退款金额不足"); //退款申请 $orders = ActivityOrder::owner($user->id)->paid()->residue()->get(); //剩余需要退金额 $remain = $amount; foreach ($orders as $order) { if ($remain == 0) break; if ($order->residue_amount >= $remain) { $order_amount = $remain; }else { $order_amount = $order->residue_amount; } ActivityIntroduceLog::create(['order_id'=>$order->id, 'amount'=>$order_amount, 'introduce_order_id'=>$order->id, 'type'=>ActivityIntroduceLog::REFUNDTYPE]); $log = ActivityOrderLog::addActivityOrderLog($order->user_id,$order->id,-$order_amount, "用户申请退款", null, null, ActivityOrderLog::REFUND_TYPE); $order->decrement('residue_amount', $order_amount); ActivityShareRefund::create([ 'user_id'=>$order->user_id, 'order_id'=>$order->id, 'target_order_id'=>$order->id, 'trade_no'=>$order->trade_no, 'refund_trade_no'=>CommonService::getTradeNO(), 'total_amount'=>$order->amount, 'amount'=>$order_amount, 'status'=>0, 'sub_mch_id'=>$order->sub_mch_id, 'type'=>ActivityShareRefund::ADMINTYPE, 'admin_id'=>null, 'check' => ActivityShareRefund::CHECK_TRUE, 'log_id'=>$log->id, ]); $remain -= $order_amount; } DB::commit();; return $this->success('ok'); } }