AdverController.php 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Modes\AccountLog;
  4. use App\Modes\AdverActivity;
  5. use App\Modes\AdverActivityLog;
  6. use App\Modes\Advertising;
  7. use App\Modes\Area;
  8. use App\Modes\Config;
  9. use App\Modes\ErrorLog;
  10. use App\Modes\Industry;
  11. use App\Modes\MsgTemplate;
  12. use App\Modes\Order;
  13. use App\Modes\Upgrade;
  14. use App\Modes\User;
  15. use App\Modes\UserMsg;
  16. use App\Service\PayDispatchService;
  17. use Illuminate\Http\Request;
  18. use App\Http\Controllers\Controller;
  19. use \App\Modes\Proxy;
  20. use Illuminate\Support\Facades\Validator;
  21. use Mockery\Exception;
  22. use Yansongda\Pay\Gateways\Alipay;
  23. use Yansongda\Pay\Pay;
  24. class AdverController extends Controller
  25. {
  26. /**
  27. * 检查发布广告参数
  28. * @author lyh
  29. * @date 2019/3/22
  30. * @param $param
  31. * @param Proxy $proxyConfig
  32. * @return bool|string
  33. * @description
  34. */
  35. private static function checkParam($param, $proxyConfig)
  36. {
  37. // 检查发布地区关系
  38. if ($isRelation = Area::isRealation($param['province'], $param['city'], $param['district']) == false) {
  39. return '地区从属关系不符';
  40. }
  41. if ($param['start_time'] > $param['end_time']) {
  42. return '有效开始时间不能大于结束时间';
  43. }
  44. // if ($param['guarantee'] == 1 && ($param['bet_start_time'] > $param['bet_end_time'])) {
  45. // return '担保开始时间不能大于结束时间';
  46. // }
  47. if ($proxyConfig['money'] != $param['price']) {
  48. return '抱歉,单价数据不一致,请重新提交';
  49. }
  50. if (($proxyConfig['money'] * $param['total_num']) != ($param['price'] * $param['total_num'])) {
  51. return '抱歉,总价不一致,请重新提交';
  52. }
  53. /*if ($proxyConfig['min_money'] > ($param['price'] * $param['total_num'])) {
  54. return '抱歉,未达到广告发布最低额度';
  55. }*/
  56. return true;
  57. }
  58. /*
  59. * 对赌广告上传协议数据
  60. *wsl 20190730
  61. * */
  62. public function userGuarantee(Request $request){
  63. $params=$request->all();
  64. if(empty($params['id']))return showJsonErr('广告id不能为空');
  65. if(empty($params['user_guarantee_url']))return showJsonErr('担保协议必传');
  66. $info=Advertising::whereId($params['id'])->first();
  67. if(empty($info)){
  68. return showJsonErr('广告不存在');
  69. }
  70. $bet=\DB::table('advertising_bet')->where('advertising_id','=',$params['id'])->first();
  71. if(empty($bet)) return showJsonErr('对赌广告数据错误');
  72. if($info->status!=2){
  73. return showJsonErr('当前广告状态不允许修改协议内容');
  74. }
  75. $data=['user_guarantee_url'=>$params['user_guarantee_url']];
  76. $res=\DB::table('advertising_bet')->where('id','=',$bet->id)->update($data);
  77. Advertising::whereId($params['id'])->update(['guarantee_url'=>$params['user_guarantee_url']]);
  78. if($res>=0){
  79. return showJsonSucc('上传成功,请等待上级确认');
  80. }else return showJsonErr('上传失败');
  81. }
  82. /*
  83. * 对赌广告上传业绩数据
  84. *wsl 20190730
  85. * */
  86. public function userAchievement(Request $request){
  87. $params=$request->all();
  88. if(empty($params['id']))return showJsonErr('广告id不能为空');
  89. if(empty($params['user_achievement_url']))return showJsonErr('业绩数据必传');
  90. $info=Advertising::whereId($params['id'])->first();
  91. if(empty($info)){
  92. return showJsonErr('广告不存在');
  93. }
  94. $bet=\DB::table('advertising_bet')->where('advertising_id','=',$params['id'])->first();
  95. if(empty($bet)) return showJsonErr('对赌广告数据错误');
  96. /*if($bet->bet_end_time>date('Y-m-d H:i:s')){
  97. return showJsonErr('对赌结束时间为'.$bet->bet_end_time.',请在该时间之后上传业务数据');
  98. }*/
  99. if($info->status !=3){
  100. return showJsonErr('抱歉,当前广告状态不允许修改内容');
  101. }
  102. $data=['user_achievement_url'=>$params['user_achievement_url']];
  103. $res=\DB::table('advertising_bet')->where('id','=',$bet->id)->update($data);
  104. if($res>=0){
  105. return showJsonSucc('上传成功,请耐心等待平台审核完成');
  106. }else return showJsonErr('上传失败');
  107. }
  108. /**
  109. * 代理广告
  110. * @author lyh
  111. * @date 2019/3/21
  112. * @description
  113. */
  114. public function index(Request $request)
  115. {
  116. $type = $request->input('type',0);
  117. if (!in_array($type, [0,1,2])) {
  118. return showJsonErr('type错误');
  119. }
  120. if ($type == 1) {//间1
  121. $uids = User::getInviteeOne(\Auth::id());
  122. } elseif ($type == 2) {//间2
  123. $uids = User::getInviteeTwo(\Auth::id());
  124. } else {//直推
  125. $uids = User::whereInvitor(\Auth::id())->pluck('id');
  126. }
  127. if ($uids->isEmpty()) {
  128. return showJsonErr('数据为空');
  129. }
  130. // 合并查询字段
  131. $select = ['id', 'uid', 'title', 'image', 'content', 'bet_status', 'guarantee', 'status', 'created_at','end_time'];
  132. // 合并查询字段
  133. $userSelect = ['id', 'nick_name'];
  134. $res = Advertising::whereIn('uid',$uids)
  135. ->with(['User' => function ($query) use ($userSelect) {
  136. $query->select($userSelect);
  137. }])
  138. ->orderByDesc('id')
  139. ->select($select);
  140. $res->whereIn('status',[2,3,4,5,6,9]);
  141. $r=$res->paginate(perPage());
  142. if($r->isNotEmpty()){
  143. collect($r->items())->each(function ($item, $key) {
  144. if($item->end_time<date('Y-m-d H:i:S')){
  145. $item->status=9;
  146. }
  147. if($item->guarantee==1){
  148. $item->bet=\DB::table('advertising_bet')->where('advertising_id','=',$item->id)->first();
  149. }
  150. });
  151. }
  152. return showJsonSucc(1001, $r);
  153. }
  154. /**
  155. * 首页-代理明细
  156. * @author lyh
  157. * @date 2019/3/21
  158. * @param Request $request
  159. * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
  160. * @description
  161. */
  162. public function adver(Request $request)
  163. {
  164. $validator = \Validator::make($param = $request->post(), [
  165. 'type' => 'required|between:0,2',
  166. 'page' => 'required|numeric'
  167. ]);
  168. if ($validator->fails()) {
  169. return showJson(102, $validator->errors()->first());
  170. }
  171. $userinfo=User::whereId(\Auth::id())->first()->toArray();
  172. if ($param['type'] == 1) {
  173. $ids = User::getInviteeOne(\Auth::id());
  174. //获取当前间1配置的百分比
  175. $pct=Proxy::getJianPct($userinfo,1,2,$ids);
  176. } elseif ($param['type'] == 2) {
  177. $ids = User::getInviteeTwo(\Auth::id());
  178. //获取当前间2配置的百分比
  179. $pct=Proxy::getJianPct($userinfo,2,2,$ids);
  180. } else {
  181. $ids = User::getInvitee(\Auth::id());
  182. $pctarr = Proxy::getSettingByAreaAndLevel($userinfo['level'],$userinfo['province'],$userinfo['city'],$userinfo['district']);
  183. $pct=$pctarr['adver_invite'];
  184. }
  185. $user = User::getList($ids, ['nick_name', 'id', 'mobile']);
  186. if ($user->isNotEmpty()) {
  187. collect($user->items())->each(function ($item, $key) {
  188. $item['adverNum'] = Advertising::whereUid($item['id'])->whereIn('status', [3, 4, 9])->count('id'); // 广告笔数
  189. $item['performance'] = Advertising::whereUid($item['id'])->whereIn('status', [3, 4, 9])->sum('total_price'); // 广告业绩总额
  190. });
  191. }
  192. return showJsonSucc('获取数据成功', [
  193. 'user' => $user,
  194. 'pct' => $pct,
  195. 'totalPerformance' => Advertising::whereIn('uid', $ids)->whereStatus(3)->sum('total_price'), // 代理费总额
  196. 'count' => count($ids),//总人数
  197. ]);
  198. }
  199. /*
  200. * 新发布广告流程
  201. * wsl
  202. * 20190729
  203. * */
  204. public function add(Request $request){
  205. $validator = \Validator::make($param = $request->post(), [
  206. 'title' => 'required|string',
  207. 'image' => 'string',
  208. 'scene' => 'integer|between:1,3',
  209. 'image_group' => 'string',
  210. 'industry' => 'required',
  211. 'content' => 'string',
  212. 'redirect' => 'url',
  213. 'province' => 'required|numeric',
  214. 'city' => 'required|numeric',
  215. 'district' => 'required|numeric',
  216. 'start_time' => 'required|date',
  217. 'end_time' => 'required|date',
  218. 'total_num' => 'required|numeric',
  219. 'price' => 'required|numeric',
  220. 'total_price' => 'required|numeric',
  221. 'pay_type' => 'required|integer',
  222. 'guarantee_content' => 'string',
  223. 'is_company' => 'required|between:1,2',
  224. 'license' => 'required_if:is_company,2',
  225. 'license_number' => 'required_if:is_company,2',
  226. 'idcard_number'=>'required_if:is_company,1',
  227. 'idcard_front'=>'required_if:is_company,1',
  228. 'idcard_reverse'=>'required_if:is_company,1',
  229. 'bet_start_time'=>'required_if:guarantee,1',
  230. 'bet_end_time'=>'required_if:guarantee,1',
  231. 'bet_address'=>'required_if:guarantee,1',
  232. 'bet_province'=>'required_if:guarantee,1',
  233. 'bet_city'=>'required_if:guarantee,1',
  234. 'bet_district'=>'required_if:guarantee,1',
  235. 'real_name'=>'required|string',//投放人姓名
  236. 'address'=>'required|string',//联系地址
  237. ]);
  238. if ($validator->fails()) {
  239. return showJson(102, $validator->errors()->first());
  240. }
  241. if (\Auth::user()->level == 0 || empty(\Auth::user()->province)|| empty(\Auth::user()->city) || empty(\Auth::user()->district)) {
  242. return showJsonErr('请完善用户信息');
  243. }
  244. $proxyConfig = Proxy::getConfig(\Auth::id(), $param['province'], $param['city'], $param['district']);
  245. $proxyc = Proxy::whereUserLevel(\Auth::user()->level)->whereStatus(1)->whereUid(\Auth::id())->whereAreaType(4)->first();
  246. if(empty($proxyc->id) || !empty($param['guarantee'])){
  247. $proxyc=Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
  248. }else $proxyc->toArray();
  249. if (($checkParam = self::checkParam($param, $proxyc)) !== true) {
  250. return showJsonErr($checkParam);
  251. }
  252. //已发布的广告条数
  253. $free_yfb=Advertising::whereUid(\Auth::id())->whereIn('status',[2,3,4])->sum('total_num');
  254. // 判断支付价格
  255. $free_num = Proxy::getActivityFreeNum(\Auth::id(),\Auth::user()->province,\Auth::user()->city,\Auth::user()->district,\Auth::user()->level);; // 获取剩余发布广告免费次数
  256. //剩余可使用的免费次数
  257. $free_num=$free_num-$free_yfb<=0?0:$free_num-$free_yfb;
  258. if ($free_num >= $param['total_num']) {
  259. $totalPrice = 0;
  260. } elseif(!empty($free_num)&&$free_num<$param['total_num']) {
  261. $totalPrice = ($param['total_num'] - $free_num) * $proxyc['money'];
  262. }else{
  263. $totalPrice=$param['total_num']*$proxyc['money'];
  264. }
  265. if (bccomp($totalPrice,$param['total_price'],2)!=0) {
  266. return showJsonErr('广告价格不正确', [
  267. 'total_price' => $totalPrice,
  268. 'free_num' => $free_num
  269. ]);
  270. }
  271. if(empty($free_num) && $totalPrice==0 ){
  272. return showJsonErr('抱歉,您的免费次数已用完');
  273. }
  274. //判断是否是担保广告
  275. if(!empty($param['guarantee'])){
  276. $proxyc['min_money']=$proxyc['guarantee_min_money'];
  277. }
  278. // 最低额度限制
  279. /*if ($free_num-$param['total_num']< 0 && ($proxyc['min_money'] > $param['total_price'])) {
  280. return showJsonErr('抱歉,广告价格未达到最低额度要求');
  281. }*/
  282. if (($free_num == 0 ||$free_num<$param['total_num']) && $proxyc['min_money'] > $param['total_price']) {
  283. return showJsonErr('抱歉,广告价格未达到最低额度要求');
  284. }
  285. $param['residue_num'] = $param['total_num'];
  286. \DB::beginTransaction();
  287. try {
  288. // 如果是担保广告,则需要上级用户审核
  289. if (!empty($param['guarantee']) && $param['guarantee'] == 1) {
  290. $param['bet_status'] = 0;
  291. } else {
  292. $param['bet_status'] = 3;
  293. }
  294. $param['order_no'] = $orderNo = Order::makeOrderNo();
  295. $param['uid'] = \Auth::id();
  296. if (!empty($param['image_group'])) {
  297. $param['image'] = explode(',', $param['image_group'])[0];
  298. }
  299. $payData = [];
  300. //$param['total_price']=0.01;
  301. $adverActivityLogStatus = 2;
  302. $adverStatus = 1; //待支付
  303. // 如果是免费发布广告则不需要支付,生成订单信息
  304. if ($param['total_price'] > 0) {
  305. $pay = PayDispatchService::dispatch($param['pay_type']);
  306. // $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 获取支付信息
  307. //判断支付方式生成支付代码
  308. if($param['pay_type']==2){//支付宝
  309. $payData = $pay->getAppPayInfo($orderNo,$param['total_price'] , \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
  310. }elseif($param['pay_type']==3){//微信
  311. $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
  312. }elseif($param['pay_type']==21){
  313. $pay = PayDispatchService::dispatch(2);
  314. $payData = $pay->getPayInfo($orderNo,$param['total_price'] , \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
  315. }elseif($param['pay_type']==31){
  316. $pay = PayDispatchService::dispatch(3);
  317. $getPayInfoh5Data = $pay->getPayInfoh5($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
  318. $payData['url'] = env('APP_URL').'/re.php?re='.urlencode($getPayInfoh5Data->getTargetUrl());
  319. }
  320. // 生成订单
  321. $orderId = Order::insertData([
  322. 'uid' => \Auth::id(),
  323. 'type' => 2,
  324. 'order_no' => $orderNo,
  325. 'pay_no' => $pay_no = $orderNo,
  326. 'price' => $param['total_price'],
  327. 'is_pay' => 0,
  328. 'pay_type' => $param['pay_type'],
  329. 'status' => 2,
  330. ]);
  331. if (empty($orderId)) {
  332. \DB::rollBack();
  333. return showJsonErr('生成订单失败');
  334. }
  335. $adverActivityLogStatus = 1;
  336. $adverStatus = 1; //待支付
  337. } else {
  338. $param['pay_type'] = 0;//如果金额为0,
  339. $adverStatus = 2; //如果金额为0,,已支付待审核
  340. }
  341. if ($proxyConfig->uid = \Auth::id() && $proxyConfig->free_num > 0) {
  342. $activity_id = 0;//单独设置的即使有活动也没用
  343. } else {
  344. $activity_id = AdverActivity::getCurrentActivityId();
  345. }
  346. // 营销活动-如果使用了免费次数则生成记录
  347. $aalId = AdverActivityLog::insertGetId([
  348. 'uid' => \Auth::id(),
  349. 'activity_id' => $activity_id,
  350. 'total_price' => $param['total_price'],
  351. 'price' => $param['price'],
  352. 'free_num' => $free_num,
  353. 'mininum_money' => $proxyc['min_money'],
  354. 'status' => $adverActivityLogStatus,
  355. ]);
  356. $param['activity_id'] = $aalId;
  357. $param['status'] = $adverStatus;
  358. // 添加广告发布记录
  359. $sparam=$param;
  360. if(isset($param['bet_end_time']))unset($param['bet_end_time']);
  361. if(isset($param['bet_start_time']))unset($param['bet_start_time']);
  362. if(isset($param['bet_address']))unset($param['bet_address']);
  363. if(isset($param['bet_province']))unset($param['bet_province']);
  364. if(isset($param['bet_city']))unset($param['bet_city']);
  365. if(isset($param['bet_district']))unset($param['bet_district']);
  366. $advertID = Advertising::insertGetId($param);
  367. //如果是对赌广告
  368. if($param['guarantee']==1){
  369. $betdata=[
  370. 'advertising_id'=>$advertID,
  371. 'bet_start_time'=>$sparam['bet_start_time'],
  372. 'bet_end_time'=>$sparam['bet_end_time'],
  373. 'bet_address'=>$sparam['bet_address'],
  374. 'bet_province'=>$sparam['bet_province'],
  375. 'bet_city'=>$sparam['bet_city'],
  376. 'bet_district'=>$sparam['bet_district'],
  377. 'bet_money'=>$proxyc['guarantee_min_money'],
  378. 'bet_state'=>0,//等待上级确认
  379. ];
  380. \DB::table('advertising_bet')->insert($betdata);
  381. }
  382. if (!$advertID) {
  383. \DB::rollBack();
  384. ErrorLog::saveMsg('发布广告失败', $sparam);
  385. return showJsonErr('发布广告失败');
  386. }
  387. \DB::commit();
  388. return showJsonSucc('提交发布广告成功', [
  389. 'payData' => $payData
  390. ]);
  391. } catch (Exception $exception) {
  392. \DB::rollBack();
  393. ErrorLog::saveMsg('发布广告失败,出现异常问题', ['msg' => $exception->getMessage(),
  394. 'line' => $exception->getLine(),
  395. 'file' => $exception->getFile(),]);
  396. return showJsonErr('发布广告失败');
  397. }
  398. }
  399. /**
  400. * 发布广告pc
  401. * @author wsl
  402. * @date 2019/7/1
  403. * @param Request $request
  404. * @descriptiona
  405. */
  406. public function pcadd(Request $request){
  407. $validator = \Validator::make($param = $request->post(), [
  408. 'title' => 'required|string',
  409. 'image' => 'string',
  410. 'scene' => 'integer|between:1,3',
  411. 'image_group' => 'string',
  412. 'industry' => 'required',
  413. 'content' => 'string',
  414. 'redirect' => 'url',
  415. 'province' => 'required|numeric',
  416. 'city' => 'required|numeric',
  417. 'district' => 'required|numeric',
  418. 'start_time' => 'required|date',
  419. 'end_time' => 'required|date',
  420. 'total_num' => 'required|numeric',
  421. 'price' => 'required|numeric',
  422. 'total_price' => 'required|numeric',
  423. 'pay_type' => 'required|integer|between:1,3',
  424. 'guarantee_content' => 'string',
  425. 'is_company' => 'required|between:1,2',
  426. 'license' => 'required_if:is_company,2',
  427. 'license_number' => 'required_if:is_company,2',
  428. 'idcard_number'=>'required_if:is_company,1',
  429. 'idcard_front'=>'required_if:is_company,1',
  430. 'idcard_reverse'=>'required_if:is_company,1',
  431. 'bet_start_time'=>'required_if:guarantee,1',
  432. 'bet_end_time'=>'required_if:guarantee,1',
  433. 'bet_address'=>'required_if:guarantee,1',
  434. 'bet_province'=>'required_if:guarantee,1',
  435. 'bet_city'=>'required_if:guarantee,1',
  436. 'bet_district'=>'required_if:guarantee,1',
  437. 'pay_type' => 'required|between:1,5', // 0-未支付 1-现金 2-支付宝 3-微信 4-银行转账 5-桃牛支付
  438. 'real_name'=>'required|string',//投放人姓名
  439. 'address'=>'required|string',//联系地址
  440. ]);
  441. if ($validator->fails()) {
  442. return showJson(102, $validator->errors()->first());
  443. }
  444. if (\Auth::user()->level == 0 || empty(\Auth::user()->province)|| empty(\Auth::user()->city) || empty(\Auth::user()->district)) {
  445. return showJsonErr('请完善用户信息');
  446. }
  447. $proxyConfig = Proxy::getConfig(\Auth::id(), $param['province'], $param['city'], $param['district']);
  448. $proxyc = Proxy::whereUserLevel(\Auth::user()->level)->whereStatus(1)->whereUid(\Auth::id())->whereAreaType(4)->first();
  449. if(empty($proxyc->id) || !empty($param['guarantee'])){
  450. $proxyc=Proxy::getSettingByAreaAndLevel(\Auth::user()->level,\Auth::user()->province,\Auth::user()->city,\Auth::user()->district);
  451. }else $proxyc->toArray();
  452. if (($checkParam = self::checkParam($param, $proxyc)) !== true) {
  453. return showJsonErr($checkParam);
  454. }
  455. //已发布的广告条数
  456. $free_yfb=Advertising::whereUid(\Auth::id())->whereIn('status',[2,3,4])->sum('total_num');
  457. // 判断支付价格
  458. $free_num = Proxy::getActivityFreeNum(\Auth::id(),\Auth::user()->province,\Auth::user()->city,\Auth::user()->district,\Auth::user()->level);; // 获取剩余发布广告免费次数
  459. //剩余可使用的免费次数
  460. $free_num=$free_num-$free_yfb<=0?0:$free_num-$free_yfb;
  461. if ($free_num >= $param['total_num']) {
  462. $totalPrice = 0;
  463. } elseif(!empty($free_num)&&$free_num<$param['total_num']) {
  464. $totalPrice = ($param['total_num'] - $free_num) * $proxyc['money'];
  465. }else{
  466. $totalPrice=$param['total_num']*$proxyc['money'];
  467. }
  468. if (bccomp($totalPrice,$param['total_price'],2)!=0) {
  469. return showJsonErr('广告价格不正确', [
  470. 'total_price' => $totalPrice,
  471. 'free_num' => $free_num
  472. ]);
  473. }
  474. if(empty($free_num) && $totalPrice==0 ){
  475. return showJsonErr('抱歉,您的免费次数已用完');
  476. }
  477. //判断是否是担保广告
  478. if(!empty($param['guarantee'])){
  479. $proxyc['min_money']=$proxyc['guarantee_min_money'];
  480. }
  481. // 最低额度限制
  482. if (($free_num == 0 ||$free_num<$param['total_num']) && $proxyc['min_money'] > $param['total_price']) {
  483. return showJsonErr('抱歉,广告价格未达到最低额度要求');
  484. }
  485. $param['residue_num'] = $param['total_num'];
  486. \DB::beginTransaction();
  487. try {
  488. // 如果是担保广告,则需要上级用户审核
  489. if (!empty($param['guarantee']) && $param['guarantee'] == 1) {
  490. $param['bet_status'] = 0;
  491. } else {
  492. $param['bet_status'] = 3;
  493. }
  494. $param['order_no'] = $orderNo = Order::makeOrderNo();
  495. $param['uid'] = \Auth::id();
  496. if (!empty($param['image_group'])) {
  497. $param['image'] = explode(',', $param['image_group'])[0];
  498. }
  499. $payData = [];
  500. //$param['total_price']=0.01;
  501. $adverActivityLogStatus = 2;
  502. $adverStatus = 1; //待支付
  503. // 如果是免费发布广告则不需要支付,生成订单信息
  504. if ($param['total_price'] > 0) {
  505. $pay = PayDispatchService::dispatch($param['pay_type']);
  506. // $payData = $pay->getPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 获取支付信息
  507. //判断支付方式生成支付代码
  508. if($param['pay_type']==2){//支付宝
  509. $payData = $pay->getPcPayInfo($orderNo,$param['total_price'] , \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
  510. }
  511. if($param['pay_type']==3){//微信
  512. $payData = $pay->getPcPayInfo($orderNo, $param['total_price'], \Auth::user()->mobile . '购买广告位'); // 测试,金额一致为0.01
  513. }
  514. // 生成订单
  515. $orderId = Order::insertData([
  516. 'uid' => \Auth::id(),
  517. 'type' => 2,
  518. 'order_no' => $orderNo,
  519. 'pay_no' => $pay_no = $orderNo,
  520. 'price' => $param['total_price'],
  521. 'is_pay' => 0,
  522. 'pay_type' => $param['pay_type'],
  523. 'status' => 2,
  524. ]);
  525. if (empty($orderId)) {
  526. \DB::rollBack();
  527. return showJsonErr('生成订单失败');
  528. }
  529. $adverActivityLogStatus = 1;
  530. $adverStatus = 1; //待支付
  531. } else {
  532. $param['pay_type'] = 0;//如果金额为0,
  533. $adverStatus = 2; //如果金额为0,,已支付待审核
  534. }
  535. if ($proxyConfig->uid = \Auth::id() && $proxyConfig->free_num > 0) {
  536. $activity_id = 0;//单独设置的即使有活动也没用
  537. } else {
  538. $activity_id = AdverActivity::getCurrentActivityId();
  539. }
  540. // 营销活动-如果使用了免费次数则生成记录
  541. $aalId = AdverActivityLog::insertGetId([
  542. 'uid' => \Auth::id(),
  543. 'activity_id' => $activity_id,
  544. 'total_price' => $param['total_price'],
  545. 'price' => $param['price'],
  546. 'free_num' => $free_num,
  547. 'mininum_money' => $proxyc['min_money'],
  548. 'status' => $adverActivityLogStatus,
  549. ]);
  550. $param['activity_id'] = $aalId;
  551. $param['status'] = $adverStatus;
  552. // 添加广告发布记录
  553. $sparam=$param;
  554. if(isset($param['bet_end_time']))unset($param['bet_end_time']);
  555. if(isset($param['bet_start_time']))unset($param['bet_start_time']);
  556. if(isset($param['bet_address']))unset($param['bet_address']);
  557. if(isset($param['bet_province']))unset($param['bet_province']);
  558. if(isset($param['bet_city']))unset($param['bet_city']);
  559. if(isset($param['bet_district']))unset($param['bet_district']);
  560. $advertID = Advertising::insertGetId($param);
  561. //如果是对赌广告
  562. if($param['guarantee']==1){
  563. $betdata=[
  564. 'advertising_id'=>$advertID,
  565. 'bet_start_time'=>$sparam['bet_start_time'],
  566. 'bet_end_time'=>$sparam['bet_end_time'],
  567. 'bet_address'=>$sparam['bet_address'],
  568. 'bet_province'=>$sparam['bet_province'],
  569. 'bet_city'=>$sparam['bet_city'],
  570. 'bet_district'=>$sparam['bet_district'],
  571. 'bet_money'=>$proxyc['guarantee_min_money'],
  572. ];
  573. \DB::table('advertising_bet')->insert($betdata);
  574. }
  575. if (!$advertID) {
  576. \DB::rollBack();
  577. ErrorLog::saveMsg('发布广告失败', $sparam);
  578. return showJsonErr('发布广告失败');
  579. }
  580. \DB::commit();
  581. return showJsonSucc('提交发布广告成功', [
  582. 'payData' => $payData
  583. ]);
  584. } catch (Exception $exception) {
  585. \DB::rollBack();
  586. ErrorLog::saveMsg('发布广告失败,出现异常问题', ['msg' => $exception->getMessage(),
  587. 'line' => $exception->getLine(),
  588. 'file' => $exception->getFile(),]);
  589. return showJsonErr('发布广告失败');
  590. }
  591. }
  592. /**
  593. * 发布记录
  594. * @author lyh
  595. * @date 2019/3/26
  596. * @description
  597. */
  598. public function publish(Request $request)
  599. {
  600. $validator = \Validator::make($param = $request->all(), [
  601. 'type' => 'required|in:0,2,3,4,5,9' //广告状态 1-待支付 2-待审核 3-发布中 4-屏蔽 5-拒绝 9-过期
  602. ]);
  603. if ($validator->fails()) {
  604. return showJsonErr($validator->errors()->first());
  605. }
  606. //$where = ['uid' => \Auth::id(),['in' => ['status' => [2,3,4,5,6,9]]]];
  607. $where = ['uid' => \Auth::id()];
  608. if(@$param['ad_type']==1){
  609. //已有广告
  610. $where[]=['redirect','!=',''];
  611. }
  612. if(@$param['ad_type']==2){
  613. //新广告
  614. $where[]=['redirect','=',''];
  615. }
  616. $field = ['redirect', 'image_group', 'is_update'];
  617. $res = Advertising::getList($where, $field, [], $param);
  618. return showJsonSucc(1001, $res);
  619. }
  620. /**
  621. * 邀请人审核担保
  622. * @author lyh
  623. * @date 2019/3/26
  624. * @param Request $request
  625. * @description
  626. */
  627. public function auditBet(Request $request)
  628. {
  629. $validator = Validator::make($param = $request->all(), [
  630. 'id' => 'required|exists:advertising,id',
  631. 'bet_status' => 'required|integer|between:1,3',
  632. 'bet_rejuse_remark' => 'string'
  633. ]);
  634. if ($validator->fails()) {
  635. return showJsonErr($validator->errors()->first());
  636. }
  637. $adver = Advertising::whereId($param['id'])->first();
  638. $bet=\DB::table('advertising_bet')->where('advertising_id',$adver->id)->first();
  639. if(empty($bet)){
  640. return showJsonErr('对赌广告数据错误');
  641. }
  642. if ($adver->status != 2) {
  643. return showJsonErr('抱歉,当前广告状态不允许操作');
  644. }
  645. if ($bet->bet_state != 0) {
  646. return showJsonErr('您不能操作当前广告状态');
  647. }
  648. //如果拒绝的话
  649. if($param['bet_status']==2){
  650. //退款操作wsl 20190628
  651. if($adver->total_price!='0.000'&&$adver->total_price>0){
  652. $order=Order::where('order_no','=',$adver->order_no)
  653. ->select('order_no','pay_no','price','pay_type','is_pay')
  654. ->first();
  655. if(empty($order))return showJsonErr('当前订单数据不完整无法原路退款!');
  656. $remark='原路退款异常';
  657. //如果订单为未付款就不走退款操作了
  658. try{
  659. if($order->is_pay==1){
  660. if(in_array($order->pay_type,[2,21]) && $adver->status!=5){
  661. $pay = \App::make('aliPay');
  662. $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price);
  663. if($r->code==10000){
  664. $remark='您发布的广告-'.$adver->title.'-审核不通过,资金原路退回支付宝';
  665. }
  666. }elseif(in_array($order->pay_type,[3,31]) && $adver->status!=5){
  667. //微信退款
  668. $pay = \App::make('wechat');
  669. $r=$pay->getReturnInfo($order->order_no, $order->pay_no,$order->price,$order->price);
  670. if($r->return_code=='SUCCESS'){
  671. $remark='您发布的广告-'.$adver->title.'-审核不通过,资金原路退回微信账户';
  672. }
  673. }
  674. AccountLog::saveDataByPost($adver->uid,44,$order->price,User::whereId($adver->uid)->value('balance'),2,1,$remark);
  675. }
  676. }catch(\Exception $e){
  677. return showJsonErr($e->getMessage());
  678. }
  679. }
  680. $msg_content=MsgTemplate::getTemplateContent(3,['date' => $adver->created_at, 'adverid' => $adver->id, 'title' => $adver->title, 'totalprice' => $adver->total_price]);
  681. $msgarr=['title'=>'广告审核通知','uid'=>$adver->uid,'type'=>12,'content'=>$msg_content];
  682. UserMsg::SendGetui($msgarr);
  683. $param['status']=5;
  684. $betdata=[
  685. 'refuse_desc'=>$param['bet_rejuse_remark']
  686. ];
  687. \DB::table('advertising_bet')->where('id','=',$bet->id)->update($betdata);
  688. }
  689. if(isset($param['bet_rejuse_remark']))unset($param['bet_rejuse_remark']);
  690. unset($param['s']);
  691. if (!Advertising::whereId($param['id'])->update($param)) {
  692. return showJsonErr('审核失败');
  693. }
  694. return showJsonSucc('审核成功');
  695. }
  696. /**
  697. * 广告详情
  698. * @author lyh
  699. * @date 2019/4/23
  700. * @param Request $request
  701. * @description
  702. * edit by wsl 20190730
  703. */
  704. public function show(Request $request)
  705. {
  706. if(empty($request->post('id'))){
  707. return showJsonErr('id不能为空');
  708. }
  709. $adver = Advertising::whereId($request->post('id'))->select()->first();
  710. if ($adver) {
  711. if($adver->industry!='all'){
  712. $arr=explode(',',$adver->industry);
  713. $adver->industry = Industry::whereIn('id',$arr)->select(['id','content'])->get();
  714. }
  715. if($adver->guarantee==1){
  716. $adver->bet=\DB::table('advertising_bet')->where('advertising_id','=',$adver->id)->first();
  717. }
  718. $adver->image = $adver->image? getUrl($adver->image) : '';
  719. $adver->provincestr=Area::whereId($adver->province)->value('name');
  720. $adver->citystr=Area::whereId($adver->city)->value('name');
  721. $adver->districtstr=Area::whereId($adver->district)->value('name');
  722. }
  723. return showJsonSucc(1001, $adver);
  724. }
  725. /**
  726. * 更新广告
  727. * @author lyh
  728. * @date 2019/4/23
  729. * @param Request $request
  730. * @return \Illuminate\Contracts\Routing\ResponseFactory|\Symfony\Component\HttpFoundation\Response
  731. * @description
  732. */
  733. public function modify(Request $request)
  734. {
  735. $validator = Validator::make($param = $request->all(), [
  736. 'id' => 'required|exists:advertising,id',
  737. 'title' => 'required|string',
  738. 'scene' => 'between:1,3',
  739. 'image' => 'string',
  740. // 'content' => '',
  741. 'industry' => 'required|exists:industry,id',
  742. 'province' => 'required|exists:area,id',
  743. 'city' => 'required|exists:area,id',
  744. 'district' => 'required|exists:area,id'
  745. ]);
  746. if ($validator->fails()) {
  747. return showJsonErr($validator->errors()->first());
  748. }
  749. $adver = Advertising::find($param['id']);
  750. if ($adver->status == 3 && $adver->is_update == 1) {
  751. return showJsonErr('抱歉,广告不能编辑');
  752. }
  753. if ($adver->guarantee == 1) {
  754. $param['bet_status'] = 3;
  755. }
  756. if (!empty($param['image'])) {
  757. $param['image_group']=$param['image'];
  758. $param['image'] = explode(',', $param['image_group'])[0];
  759. }
  760. $param['status'] = 2;
  761. $param['is_update'] = 1;
  762. $result = Advertising::whereId($param['id'])->update($param);
  763. if (!$result) {
  764. return showJsonErr('编辑广告失败');
  765. }
  766. return showJsonSucc('编辑广告成功,已重新提交审核');
  767. }
  768. }