123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450 |
- <?php
- namespace app\api\controller;
- use addons\epay\library\Service;
- use app\common\controller\UserApi;
- use app\common\library\MobileConstant;
- use app\common\model\Area;
- use app\common\model\Mobile;
- use app\common\model\MobileInfo;
- use app\common\model\MobileOrder;
- use app\common\model\MobileOrderNo;
- use app\common\model\Payment;
- use app\common\model\SysConfig;
- use app\common\service\Jdpay;
- use app\common\service\SmsSend;
- use think\App;
- use think\Db;
- use think\db\Query;
- /**
- * 靓号管理
- */
- class MobileController extends UserApi
- {
- protected $noNeedLogin = "*";
- protected $noNeedRight = '*';
- /**
- * 列表
- * @ApiMethod (POST)
- * @ApiParams (name="type",description="1靓号,2流量卡,默认1")
- * @ApiParams (name="search_type",description="fuzzy模糊,precise精准")
- * @ApiParams (name="search_last",description="0,1是否搜索尾部")
- * @ApiParams (name="city_id",description="地区id")
- * @ApiParams (name="keyword",description="搜索内容,模糊就是字符串,精准就是数组")
- * @ApiParams (name="sort",description="price_asc价格从低到高,price_desc价格从高到低")
- * @ApiParams (name="network",description="网络")
- * @ApiParams (name="price_min",description="价格最低数字")
- * @ApiParams (name="price_max",description="价格最高数字")
- * @ApiParams (name="exclude_num",description="排除数字")
- * @ApiParams (name="num_max",description="数字较多,传数字")
- * @ApiParams (name="rule_position",description="规律位置,middle中间,tail尾部")
- * @ApiParams (name="rule_name",description="规律名,AAAA什么的")
- * @ApiParams (name="limit",description="limit")
- * @ApiParams (name="page",description="page")
- * @ApiReturnParams (name=id,description=id)
- * @ApiReturnParams (name="type",description="1靓号,2流量卡")
- * @ApiReturnParams (name=logo,description=缩略图)
- * @ApiReturnParams (name=name,description=号码名称)
- * @ApiReturnParams (name=no,description=手机号)
- * @ApiReturnParams (name=type,description=1靓号2流量卡)
- * @ApiReturnParams (name=network,description=运营商)
- * @ApiReturnParams (name=city,description=城市)
- * @ApiReturnParams (name=privince,description=省份)
- * @ApiReturnParams (name=amount,description=售价)
- * @ApiReturnParams (name=amount_original,description=原价)
- * @ApiReturnParams (name=amount_exists,description=含话费)
- * @ApiReturnParams (name=amount_base,description=售价)
- * @ApiReturnParams (name=amount_charge,description=预充)
- * @ApiReturnParams (name=summary,description=简介)
- * @ApiReturnParams (name=saled,description=是否已出售)
- * @ApiReturnParams (name=status,description=0正常1已售2已下架)
- * @ApiReturnParams (name=is_activity,description=是否特价号)
- * @ApiReturnParams (name=activity_time_end,description=特价过期时间null永不过期)
- * @ApiReturnParams (name=view_count,description=正在浏览人数)
- * @ApiReturnParams (name="info.free_app",description=免流APP列表)
- * @ApiReturnParams (name="info.describe",description="套餐说明|资费详情")
- * @ApiReturnParams (name="info.content",description="详细内容|注意事项")
- * @ApiReturnParams (name="info.flow_year",description="每年流量(G)")
- * @ApiReturnParams (name="info.fee",description="资费")
- * @ApiReturnParams (name="info.first_month_free",description="首月是否免月租")
- * @ApiReturnParams (name="info.discount_title",description="简要优惠介绍")
- * @ApiReturnParams (name="info.flow_free_limit",description="前多少名免单")
- */
- public function list(){
- $model=Mobile::show();
- $data=input();
- $this->validate($data,[
- 'keyword'=>['max:11'],
- 'num_max'=>['integer','between:0,9'],
- 'rule_position'=>['in:middle,tail'],
- ]);
- if(empty($data['type'])){
- $data['type']=1;
- }
- $model->where('type',$data['type']);
- if(!empty($data['search_type']) && !empty($data['keyword'])){
- if($data['search_type']=='fuzzy'){
- if(isset($data['search_last']) && $data['search_last']==1){
- $no=str_pad($data['keyword'],11,'-',STR_PAD_LEFT);
- for ($i=1;$i<=11;$i++){
- if(substr($no,$i-1,1)=='-'){
- continue;
- }
- $model->where("filter_no_pos_{$i}",substr($no,$i-1,1));
- }
- }else {
- $model->where('no', 'like', "%{$data['keyword']}%");
- }
- }elseif ($data['search_type']=='precise'){
- foreach ($data['keyword'] as $k=>$v){
- $pos=$k+1;
- if($pos==1||$v===""||is_null($v))continue;
- $model->where("filter_no_pos_{$pos}",$v);
- }
- }
- }
- if(!empty($data['city_id'])){
- $model->where('city_id',$data['city_id']);
- }
- if(!empty($data['sort'])){
- if($data['sort']=='price_asc'){
- $model->order('amount','asc');
- }elseif($data['sort']=='price_desc'){
- $model->order('amount','desc');
- }
- }else{
- $model->order('activity_time','desc')->order('create_time','desc');
- }
- if(!empty($data['network'])){
- $network=array_column(MobileConstant::getNetwork(),'search','name');
- $model->whereIn('network',$network[$data['network']]??[0]);
- }
- if(!empty($data['price_min']) && is_numeric($data['price_min'])){
- $model->where('amount','>=',$data['price_min']);
- }
- if(!empty($data['price_max']) && is_numeric($data['price_max'])){
- $model->where('amount','>=',$data['price_max']);
- }
- if(!empty($data['exclude_num'])){
- $model->whereNotLike('no',"%{$data['exclude_num']}%");
- }
- if(!empty($data['num_max'])){
- $model->where("filter_num_{$data['num_max']}",'>',3);
- }
- $rules=MobileConstant::getFilters();
- if(!empty($data['rule_name'])){
- if (!isset($rules[$data['rule_name']])) {
- $this->error('规律规则不支持');
- }
- $rule=$rules[$data['rule_name']];
- if(!empty($data['rule_position'])) {
- $model->where($rule[$data['rule_position']], 1);
- }else{
- $model->where(function (Query $query)use ($rule){
- $query->where($rule['middle'],1)->whereOr($rule['tail'],1);
- });
- }
- }
- $list=$model->paginate(input('limit',15));
- $this->success('',$list);
- }
- /**
- * 号码详情
- * @ApiParams (name=id,description=号码id)
- */
- public function show(){
- $data=$this->_validate([
- 'id'=>['require']
- ]);
- $mobile=Mobile::where('id','id')->with(['info'])->findOrFail($data['id']);
- $mobile->addViewCount();
- $mobile->append(['view_count']);
- $this->success('',$mobile);
- }
- /**
- * 下单
- * @ApiMethod (POST)
- * @ApiParams (name=mobile_id,description=手机号ID)
- * @ApiParams (name=name,description=姓名)
- * @ApiParams (name=phone,description=手机号)
- * @ApiParams (name=sms_code,description=验证码)
- * @ApiParams (name=id_no,description=身份号码)
- * @ApiParams (name=county,description="城市ID,区县id")
- * @ApiParams (name=address,description=详细地址)
- * @ApiParams (name=remark,description=备注)
- * @ApiParams (name=pay_type,description="1微信2支付宝3京东")
- * @ApiParams (name=return_url,description="支付完成回调页面链接")
- * @ApiReturnParams (name=pay_url,description="支付链接")
- *
- */
- public function apply(){
- $data=$this->_validate([
- 'mobile_id'=>'require',
- 'name'=>'require',
- 'phone'=>'require',
- 'id_no'=>'require',
- 'county'=>'require|integer',
- 'address'=>'require',
- ]);
- Db::startTrans();
- $mobile=Mobile::lock(true)->findOrFail($data['mobile_id']);
- if($mobile['type']==1){
- $this->_validate([
- 'pay_type'=>'require|in:1,2,3',
- ]);
- }
- $mobile->shouldBuy();
- Area::shouldSend($data['county']);
- SmsSend::setMobile($data['phone'])->setCode($data['sms_code'] ?? '')->setEvent('order')->check();
- $order = $data;
- $order['admin_id'] = $mobile['proxy_id'];
- $order['no'] = $mobile['no'];
- $order['city'] = implode(',', Area::getTreeId($data['county']));
- $order['amount_original'] = $mobile['amount_original'];
- $order['amount_hd'] = $mobile['amount'];
- $order['amount_charge'] = $mobile['amount_charge'];
- $order['amount'] = $mobile['amount'];
- $order['amount_di'] = $mobile['amount_di'];
- $order['type'] = $mobile['type'];
- unset($order['county'], $order['status'], $order['sms_code']);
- $mobileOrder = (new MobileOrder);
- $mobileOrder->allowField(true)->save($order);
- $succ=null;
- if($mobile['type']==1) {
- $succ = $this->pay($mobileOrder, $data);
- }
- Db::commit();
- $this->success('', $succ);
- }
- protected function pay(MobileOrder $mobileOrder,$data){
- $data['return_url']=sprintf("%s/build/#/pay-success/%d",request()->domain(),$mobileOrder['id']);
- $succ=[
- 'pay_url'=>'',
- 'id'=>$mobileOrder['id'],
- ];
- $payment=Payment::create([
- 'order_no'=>session_create_id(),
- 'amount'=>$mobileOrder['amount'],
- 'mobile_order_id'=>$mobileOrder['id'],
- ]);
- $filename=session_create_id(date('Ymd'));
- @mkdir(RUNTIME_PATH.'/payment/',0777,true);
- if($data['pay_type']==1){
- $info=Service::submitOrder($payment['amount'],
- $payment['order_no'],'wechat',"购买手机号{$mobileOrder['no']}",
- Service::notifyUrl('wechat',$payment['order_no']),$data['return_url']??'','wap');
- file_put_contents(RUNTIME_PATH.'/payment/'.$filename,$info->getContent());
- $succ['pay_url']=url('/index/index/payment/a/'.$filename,[],true,true);
- }elseif ($data['pay_type']==2){
- $info=Service::submitOrder($payment['amount'],
- $payment['order_no'],'alipay',"购买手机号{$mobileOrder['no']}",
- Service::notifyUrl('alipay',$payment['order_no']),$data['return_url']??'','wap');
- file_put_contents(RUNTIME_PATH.'/payment/'.$filename,view('alipay',['form'=>$info->getContent()])->getContent());
- $succ['pay_url']=url('/index/index/payment/a/'.$filename,[],true,true);
- }elseif ($data['pay_type']==3){
- $jdpay=App::invokeClass(Jdpay::class);
- $payData=$jdpay->order($payment['order_no'],$payment['amount'],"购买手机号{$mobileOrder['no']}");
- $succ=array_merge($succ,$payData);
- }
- return $succ;
- }
- /**
- * 继续支付
- * @ApiParams (name=id,description=订单id)
- * @ApiParams (name=pay_type,description=支付方式与下单一样)
- * @ApiParams (name=return_url,description="支付完成回调页面链接")
- */
- public function continue_pay(){
- $data=$this->_validate([
- 'id'=>['require'],
- 'pay_type'=>'require|in:1,2,3',
- ]);
- $mobileOrder=MobileOrder::whereNull('pay_time')->findOrFail($data['id']);
- $mobileOrder->continuePay();
- $succ=$this->pay($mobileOrder,$data);
- $this->success('',$succ);
- }
- /**
- * 订单详情
- * @ApiParams (name=id,description=订单id)
- * @ApiReturnParams (name=no,description=手机号)
- * @ApiReturnParams (name=order_no,description=订单号)
- * @ApiReturnParams (name=amount_hd,description=活动价)
- * @ApiReturnParams (name=amount_original,description=原价)
- * @ApiReturnParams (name=amount_charge,description=预充)
- * @ApiReturnParams (name=describe,description=套餐说明)
- * @ApiReturnParams (name=proxy.wx_qr,description=客服二维码)
- * @ApiReturnParams (name=name,description=收货人)
- * @ApiReturnParams (name=phone,description=收货人手机号)
- * @ApiReturnParams (name=id_no,description=收货人身份证)
- * @ApiReturnParams (name=address,description=收货地址)
- * @ApiReturnParams (name=remark,description=备注)
- * @ApiReturnParams (name=create_time,description=下单时间)
- * @ApiReturnParams (name=amount,description=订单金额)
- * @ApiReturnParams (name=trans_name,description=快递名称)
- * @ApiReturnParams (name=trans_no,description=快递单号)
- * @ApiReturnParams (name=status,description="0=>'待付款',10=>'已付款',15=>'可发货',17=>'有号码未发货',20=>'待开卡',25=>'已完成',30=>'申请退款',50=>'已关闭',60=>'无号码',70=>'换卡',80=>'争议单',90=>'已退款',")
- * @ApiReturnParams (name=open_uploaded,description=是否已上传开卡资料)
- * @ApiReturnParams (name=open_idcard_face_img,description=身份证正面照)
- * @ApiReturnParams (name=open_idcard_back_img,description=身份证反面照)
- * @ApiReturnParams (name=open_face_img,description=头像照)
- * @ApiReturnParams (name=open_name,description=姓名)
- * @ApiReturnParams (name=open_id_no,description=身份证号码)
- * @ApiReturnParams (name=open_phone,description=手机号)
- * @ApiReturnParams (name=pay_time,description=支付时间)
- * @ApiReturnParams (name=expire_time,description=过期时间)
- */
- public function order_detail(){
- $order=MobileOrder::with(['proxy'])->findOrFail(input('id'));
- $order['proxy']->hidden(['password']);
- $order['describe']=MobileInfo::where('mobile_id',$order['mobile_id'])->value('describe','');
- $this->success('',$order);
- }
- /**
- * 订单列表
- * @ApiParams (name=page,description=page)
- * @ApiParams (name=limit,description=limit)
- * @ApiParams (name=phone,description=手机号)
- */
- public function order_list(){
- $data=$this->_validate([
- 'phone|参数'=>['require'],
- ]);
- $order=MobileOrder::with('proxy')->where('phone',$data['phone'])->order('id','desc')->paginate(input('limit',15));
- $this->success('',$order);
- }
- /**
- * 筛选配置
- *
- */
- public function config(){
- $config=[];
- $networks=array_column(MobileConstant::getNetwork(),'name');
- $config['network']=$networks;
- $config['rule']=[
- 'AAA',
- 'AAAA',
- 'AAAAA',
- '6A',
- '7A',
- '8A',
- 'ABC',
- 'ABCD',
- 'ABCDE',
- 'ABCDEF',
- 'AAAB',
- 'AAAAB',
- 'AAAAAB',
- ];
- $this->success('',$config);
- }
- /**
- * 上传开卡资料
- * @ApiParams (name=id,description=订单id)
- * @ApiParams (name=idcard_face_img,description=身份证正面照片)
- * @ApiParams (name=idcard_back_img,description=身份证反面照片)
- * @ApiParams (name=face_img,description=本人照片)
- * @ApiParams (name=name,description=本人姓名)
- * @ApiParams (name=id_no,description=本人身份证号码)
- * @ApiParams (name=phone,description=本人联系电话)
- */
- public function upload_identity(){
- $data=$this->_validate([
- 'id'=>['require'],
- 'idcard_face_img'=>['require','url'],
- 'idcard_back_img'=>['require','url'],
- 'face_img'=>['require','url'],
- 'name'=>['require','max:10'],
- 'id_no'=>['require'],
- 'phone'=>['require','integer'],
- ]);
- $order=MobileOrder::findOrFail($data['id']);
- if($order['open_uploaded']){
- $this->error('请勿再次上传');
- }
- $order['open_uploaded']=1;
- $order['open_idcard_face_img']=$data['idcard_face_img'];
- $order['open_idcard_back_img']=$data['idcard_back_img'];
- $order['open_face_img']=$data['face_img'];
- $order['open_name']=$data['name'];
- $order['open_id_no']=$data['id_no'];
- $order['open_phone']=$data['phone'];
- if(!$order->save()){
- $this->error('保存失败');
- }
- $this->success('');
- }
- /**
- * 预定号码
- * @ApiParams (name=no,description=号码)
- * @ApiParams (name=price_min,description=最低承受价格)
- * @ApiParams (name=price_max,description=最高承受价格)
- * @ApiParams (name=remark,description=备注)
- * @ApiParams (name=name,description=姓名)
- * @ApiParams (name=phone,description=联系电话)
- * @ApiParams (name=county,description=区县ID)
- * @ApiParams (name=address,description=详细地址)
- */
- public function order_no(){
- $data=$this->_validate([
- 'no'=>['require','integer','length:3,8'],
- //'price_min'=>['require','integer','min:0'],
- 'price_max'=>['require','integer','min:0'],
- 'name'=>['require'],
- 'phone'=>['require','integer','length:11'],
- 'county'=>['require','integer'],
- 'address'=>['require','length:0,250'],
- ]);
- $no=new MobileOrderNo;
- $data['city']=implode(',',Area::getTreeId($data['county']));
- $no->allowField(true)->save($data);
- $this->success('');
- }
- /**
- * 横幅播报
- * @ApiReturnParams (name=ordered_num,description=已订购人数)
- * @ApiReturnParams (name=no,description=号码)
- * @ApiReturnParams (name=name,description=人名)
- */
- public function ordered_show(){
- $data=[];
- $data['ordered_num']=SysConfig::look('mo_ordered_num',0);
- $data['ordered_list']=MobileOrder::payed()
- ->order('id','desc')->limit(10)
- ->field('name,no')
- ->select();
- foreach ($data['ordered_list'] as $item){
- $item['no']=substr($item['no'],0,3).'****'.substr($item['no'],7,4);
- $item['name']=mb_substr($item['name'],0,mb_strlen($item['name'])-1).'*';
- }
- $this->success('',$data);
- }
- /**
- * 退款
- * @ApiMethod (POST)
- * @ApiParams (name=id,description=订单id)
- * @ApiParams (name=reason,description=退款原因)
- */
- public function refund(){
- $data=$this->_validate([
- 'id'=>'require',
- 'reason'=>'require|max:250',
- ]);
- Db::startTrans();
- $order=MobileOrder::findOrFail($data['id']);
- $order->checkAllowRefund();
- $order->makeRefund($data['reason']);
- Db::commit();
- $this->success();
- }
- }
|