MobileController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. <?php
  2. namespace app\api\controller;
  3. use addons\epay\library\Service;
  4. use app\common\controller\UserApi;
  5. use app\common\library\MobileConstant;
  6. use app\common\model\Area;
  7. use app\common\model\Mobile;
  8. use app\common\model\MobileInfo;
  9. use app\common\model\MobileOrder;
  10. use app\common\service\SmsSend;
  11. use think\Db;
  12. use think\db\Query;
  13. /**
  14. * 靓号管理
  15. */
  16. class MobileController extends UserApi
  17. {
  18. protected $noNeedLogin = "*";
  19. protected $noNeedRight = '*';
  20. /**
  21. * 列表
  22. * @ApiMethod (POST)
  23. * @ApiParams (name="type",description="1靓号,2流量卡,默认1")
  24. * @ApiParams (name="search_type",description="fuzzy模糊,precise精准")
  25. * @ApiParams (name="search_last",description="0,1是否搜索尾部")
  26. * @ApiParams (name="city_id",description="地区id")
  27. * @ApiParams (name="keyword",description="搜索内容,模糊就是字符串,精准就是数组")
  28. * @ApiParams (name="sort",description="price_asc价格从低到高,price_desc价格从高到低")
  29. * @ApiParams (name="network",description="网络")
  30. * @ApiParams (name="price_min",description="价格最低数字")
  31. * @ApiParams (name="price_max",description="价格最高数字")
  32. * @ApiParams (name="exclude_num",description="排除数字")
  33. * @ApiParams (name="num_max",description="数字较多,传数字")
  34. * @ApiParams (name="rule_position",description="规律位置,middle中间,tail尾部")
  35. * @ApiParams (name="rule_name",description="规律名,设计图字母变小写传过来")
  36. * @ApiParams (name="limit",description="limit")
  37. * @ApiParams (name="page",description="page")
  38. * @ApiReturnParams (name=id,description=id)
  39. * @ApiReturnParams (name="type",description="1靓号,2流量卡")
  40. * @ApiReturnParams (name=logo,description=缩略图)
  41. * @ApiReturnParams (name=name,description=号码名称)
  42. * @ApiReturnParams (name=no,description=手机号)
  43. * @ApiReturnParams (name=type,description=1靓号2流量卡)
  44. * @ApiReturnParams (name=network,description=运营商)
  45. * @ApiReturnParams (name=city,description=城市)
  46. * @ApiReturnParams (name=privince,description=省份)
  47. * @ApiReturnParams (name=amount,description=售价)
  48. * @ApiReturnParams (name=amount_original,description=原价)
  49. * @ApiReturnParams (name=amount_exists,description=含话费)
  50. * @ApiReturnParams (name=amount_base,description=售价)
  51. * @ApiReturnParams (name=amount_charge,description=预充)
  52. * @ApiReturnParams (name=summary,description=简介)
  53. * @ApiReturnParams (name=saled,description=是否已出售)
  54. * @ApiReturnParams (name=status,description=0正常1已售2已下架)
  55. * @ApiReturnParams (name=is_activity,description=是否特价号)
  56. * @ApiReturnParams (name=activity_time_end,description=特价过期时间null永不过期)
  57. * @ApiReturnParams (name="info.free_app",description=免流APP列表)
  58. * @ApiReturnParams (name="info.describe",description="套餐说明|资费详情")
  59. * @ApiReturnParams (name="info.content",description="详细内容|注意事项")
  60. * @ApiReturnParams (name="info.flow_year",description="每年流量(G)")
  61. * @ApiReturnParams (name="info.fee",description="资费")
  62. * @ApiReturnParams (name="info.first_month_free",description="首月是否免月租")
  63. * @ApiReturnParams (name="info.discount_title",description="简要优惠介绍")
  64. */
  65. public function list(){
  66. $model=Mobile::show();
  67. $data=input();
  68. $this->validate($data,[
  69. 'keyword'=>['max:11'],
  70. 'num_max'=>['integer','between:0,9'],
  71. 'rule_position'=>['in:middle,tail'],
  72. ]);
  73. if(empty($data['type'])){
  74. $data['type']=1;
  75. }
  76. $model->where('type',$data['type']);
  77. if(!empty($data['search_type']) && !empty($data['keyword'])){
  78. if($data['search_type']=='fuzzy'){
  79. if(isset($data['search_last']) && $data['search_last']==1){
  80. $no=str_pad($data['keyword'],11,'-',STR_PAD_LEFT);
  81. for ($i=1;$i<=11;$i++){
  82. if(substr($no,$i-1,1)=='-'){
  83. continue;
  84. }
  85. $model->where("filter_no_pos_{$i}",substr($no,$i-1,1));
  86. }
  87. }else {
  88. $model->where('no', 'like', "%{$data['keyword']}%");
  89. }
  90. }elseif ($data['search_type']=='precise'){
  91. foreach ($data['keyword'] as $k=>$v){
  92. $pos=$k+1;
  93. if($pos==1||is_null($v))continue;
  94. $model->where("filter_no_pos_{$pos}",$v);
  95. }
  96. }
  97. }
  98. if(!empty($data['city_id'])){
  99. $model->where('city_id',$data['city_id']);
  100. }
  101. if(!empty($data['sort'])){
  102. if($data['sort']=='price_asc'){
  103. $model->order('amount','asc');
  104. }elseif($data['sort']=='price_desc'){
  105. $model->order('amount','desc');
  106. }
  107. }else{
  108. $model->order('activity_time','desc')->order('create_time','desc');
  109. }
  110. if(!empty($data['network'])){
  111. $network=array_column(MobileConstant::getNetwork(),'search','name');
  112. $model->whereIn('network',$network[$data['network']]??[0]);
  113. }
  114. if(!empty($data['price_min']) && is_numeric($data['price_min'])){
  115. $model->where('amount','>=',$data['price_min']);
  116. }
  117. if(!empty($data['price_max']) && is_numeric($data['price_max'])){
  118. $model->where('amount','>=',$data['price_max']);
  119. }
  120. if(!empty($data['exclude_num'])){
  121. $model->whereNotLike('no',"%{$data['exclude_num']}%");
  122. }
  123. if(!empty($data['num_max'])){
  124. $model->where("filter_num_{$data['num_max']}",'>',3);
  125. }
  126. $rules=MobileConstant::getFilters();
  127. if(!empty($data['rule_name'])){
  128. if (!isset($rules[$data['rule_name']])) {
  129. $this->error('规律规则不支持');
  130. }
  131. $rule=$rules[$data['rule_name']];
  132. if(!empty($data['rule_position'])) {
  133. $model->where($rule[$data['rule_position']], 1);
  134. }else{
  135. $model->where(function (Query $query)use ($rule){
  136. $query->where($rule['middle'],1)->whereOr($rule['tail'],1);
  137. });
  138. }
  139. }
  140. $list=$model->paginate(input('limit',15));
  141. $this->success('',$list);
  142. }
  143. /**
  144. * 号码详情
  145. * @ApiParams (name=id,description=号码id)
  146. */
  147. public function show(){
  148. $data=$this->_validate([
  149. 'id'=>['require']
  150. ]);
  151. $mobile=Mobile::where('id','id')->with(['info'])->findOrFail($data['id']);
  152. $this->success('',$mobile);
  153. }
  154. /**
  155. * 下单
  156. * @ApiMethod (POST)
  157. * @ApiParams (name=mobile_id,description=手机号ID)
  158. * @ApiParams (name=name,description=姓名)
  159. * @ApiParams (name=phone,description=手机号)
  160. * @ApiParams (name=sms_code,description=验证码)
  161. * @ApiParams (name=id_no,description=身份号码)
  162. * @ApiParams (name=county,description="城市ID,区县id")
  163. * @ApiParams (name=address,description=详细地址)
  164. * @ApiParams (name=remark,description=备注)
  165. * @ApiParams (name=pay_type,description="1微信2支付宝3京东")
  166. * @ApiParams (name=return_url,description="支付完成回调页面链接")
  167. * @ApiReturnParams (name=pay_url,description="支付链接")
  168. *
  169. */
  170. public function apply(){
  171. $data=$this->_validate([
  172. 'mobile_id'=>'require',
  173. 'name'=>'require',
  174. 'phone'=>'require',
  175. 'id_no'=>'require',
  176. 'county'=>'require|integer',
  177. 'address'=>'require',
  178. 'pay_type'=>'require|in:1,2,3',
  179. ]);
  180. $mobile=Mobile::where('status',0)->findOrFail($data['mobile_id']);
  181. Db::startTrans();
  182. SmsSend::setMobile($data['phone'])->setCode($data['sms_code']??'')->setEvent('order')->check();
  183. $order=$data;
  184. $order['admin_id']=$mobile['proxy_id'];
  185. $order['no']=$mobile['no'];
  186. $order['city']=implode(',',Area::getTreeId($data['county']));
  187. $order['amount_original']=$mobile['amount_original'];
  188. $order['amount_hd']=$mobile['amount'];
  189. $order['amount_charge']=$mobile['amount_charge'];
  190. $order['amount']=$mobile['amount'];
  191. unset($order['county'],$order['status'],$order['sms_code']);
  192. $mobileOrder=(new MobileOrder);
  193. $mobileOrder->allowField(true)->save($order);
  194. $succ=[
  195. 'pay_url'=>'',
  196. ];
  197. if($data['pay_type']==1){
  198. $info=Service::submitOrder($mobileOrder['amount'],
  199. $mobileOrder['order_no'],'wechat',"购买手机号{$mobileOrder['no']}",
  200. Service::notifyUrl('wechat',$mobileOrder['no']),$data['return_url']??'','wap');
  201. $succ['pay_url']=$info->getTargetUrl();
  202. }elseif ($data['pay_type']==2){
  203. $info=Service::submitOrder($mobileOrder['amount'],
  204. $mobileOrder['order_no'],'alipay',"购买手机号{$mobileOrder['no']}",
  205. Service::notifyUrl('alipay',$mobileOrder['no']),$data['return_url']??'','wap');
  206. $succ['pay_url']=$info->getTargetUrl();
  207. }elseif ($data['pay_type']==3){
  208. }
  209. Db::commit();
  210. $this->success('',$succ);
  211. }
  212. /**
  213. * 订单详情
  214. * @ApiParams (name=id,description=订单id)
  215. * @ApiReturnParams (name=no,description=手机号)
  216. * @ApiReturnParams (name=order_no,description=订单号)
  217. * @ApiReturnParams (name=amount_hd,description=活动价)
  218. * @ApiReturnParams (name=amount_original,description=原价)
  219. * @ApiReturnParams (name=amount_charge,description=预充)
  220. * @ApiReturnParams (name=describe,description=套餐说明)
  221. * @ApiReturnParams (name=proxy.wx_qr,description=客服二维码)
  222. * @ApiReturnParams (name=name,description=收货人)
  223. * @ApiReturnParams (name=address,description=收货地址)
  224. * @ApiReturnParams (name=remark,description=备注)
  225. * @ApiReturnParams (name=create_time,description=下单时间)
  226. * @ApiReturnParams (name=amount,description=订单金额)
  227. * @ApiReturnParams (name=trans_name,description=快递名称)
  228. * @ApiReturnParams (name=trans_no,description=快递单号)
  229. * @ApiReturnParams (name=status,description="0=>'待付款',10=>'待发货',20=>'待收货',30=>'退款待处理',40=>'已退款',50=>'已关闭',")
  230. */
  231. public function order_detail(){
  232. $order=MobileOrder::with(['proxy'])->findOrFail(input('id'));
  233. $order['admin']->hidden(['password']);
  234. $order['describe']=MobileInfo::where('mobile_id',$order['mobile_id'])->value('describe','');
  235. $this->success('',$order);
  236. }
  237. /**
  238. * 订单列表
  239. * @ApiParams (name=page,description=page)
  240. * @ApiParams (name=limit,description=limit)
  241. * @ApiParams (name=phone,description=手机号)
  242. */
  243. public function order_list(){
  244. $data=$this->_validate([
  245. 'phone|参数'=>['require'],
  246. ]);
  247. $order=MobileOrder::with('proxy')->where('phone',$data['phone'])->order('id','desc')->paginate(input('limit',15));
  248. $this->success('',$order);
  249. }
  250. /**
  251. * 筛选配置
  252. *
  253. */
  254. public function config(){
  255. $config=[];
  256. $networks=array_column(MobileConstant::getNetwork(),'name');
  257. $config['network']=$networks;
  258. $config['rule']=[
  259. 'AAA',
  260. 'AAAA',
  261. 'AAAAA',
  262. '6A',
  263. '7A',
  264. '8A',
  265. 'ABC',
  266. 'ABCD',
  267. 'ABCDE',
  268. 'ABCDEF',
  269. 'AAAB',
  270. 'AAAAB',
  271. 'AAAAAB',
  272. ];
  273. $this->success('',$config);
  274. }
  275. }