ActivityController.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: hp
  5. * Date: 2018/1/29
  6. * Time: 19:45
  7. */
  8. namespace App\Http\Controllers\Manage\Activity;
  9. use App\Http\Controllers\Controller;
  10. use App\Http\Controllers\Manage\Activity\Transformers\ActivityChargeInfoTransformer;
  11. use App\Http\Controllers\Manage\Activity\Transformers\ActivityTransformer;
  12. use App\Modules\Activity\Services\ActivityService;
  13. use App\Modules\Trade\Services\OrderService;
  14. use Illuminate\Http\Request;
  15. use OSS\Core\OssException;
  16. use OSS\OssClient;
  17. use App\Modules\Product\Services\ProductService;
  18. use Redis;
  19. use DB;
  20. use Storage;
  21. /**
  22. * 活动
  23. * Class ActivityController
  24. * @package App\Http\Controllers\Manage\Activity
  25. */
  26. class ActivityController extends Controller
  27. {
  28. /**
  29. * @apiDefine Activity 活动模块
  30. */
  31. /**
  32. * @apiVersion 1.0.0
  33. * @api {GET} activity/getActivities 获取活动信息
  34. * @apiGroup Activity
  35. * @apiName getActivities
  36. * @apiParam {Number} [activity_id] 活动ID
  37. * @apiParam {Number} [distribution_channel_id] 渠道ID
  38. * @apiParam {String} [start_time] 开始时间
  39. * @apiParam {String} [end_time] 结束时间
  40. * @apiSuccess {Number} id 活动ID.
  41. * @apiSuccess {String} name 活动名称
  42. * @apiSuccess {String} activity_page 活动页面地址
  43. * @apiSuccess {String} created_at 创建时间
  44. * @apiSuccess {String} start_time 开始时间
  45. * @apiSuccess {String} end_time 结束时间
  46. * @apiSuccess {Number} price 活动单价
  47. * @apiSuccess {Number} totalOrderCount 总订单数
  48. * @apiSuccess {Number} successOrderCount 成功订单数
  49. * @apiSuccess {Number} totalChargeAmount 活动的总充值额
  50. * @apiSuccessExample {json} Success-Response:
  51. *
  52. * {
  53. * "code": 0,
  54. * "msg": "",
  55. * "data": [
  56. * {
  57. * "id": 2,
  58. * "name": "活动1222",
  59. * "activity_page": "http://www.baidu.com",
  60. * "created_at": "2017-12-01 10:20:04",
  61. * "start_time": "2017-12-01 10:20:04",
  62. * "end_time": "2017-12-01 10:20:04",
  63. * "price": 30,
  64. * "totalChargeAmount": 1000,
  65. * "totalOrderCount": 50,
  66. * "successOrderCount": 50
  67. * }
  68. * ]
  69. * }
  70. */
  71. function getActivities(Request $request)
  72. {
  73. $params = [];
  74. $request->has('end_time') && $request->input('end_time') && $params['end_time'] = trim($request->input('end_time'));
  75. $request->has('start_time') && $request->input('start_time') && $params['begin_time'] = $request->input('start_time');
  76. $request->has('activity_id') && $request->input('activity_id') && $params['activity_id'] = $request->input('activity_id');
  77. $params['distribution_channel_id'] = [0];
  78. $activities = ActivityService::search($params);
  79. $distribution_channel_id = 0;
  80. foreach ($activities as $item) {
  81. $activity_id = $item->id;
  82. if ($distribution_channel_id) {
  83. $item->totalChargeAmount = OrderService::getAmount(['activity_id' => $activity_id, 'distribution_channel_id' => $distribution_channel_id]);
  84. $item->totalOrderCount = OrderService::getActivityOrderNum(['activity_id' => $activity_id, 'distribution_channel_id' => $distribution_channel_id]);
  85. $item->successOrderCount = OrderService::getActivityOrderNum(['activity_id' => $activity_id, 'status' => 'PAID', 'distribution_channel_id' => $distribution_channel_id]);
  86. } else {
  87. $item->totalChargeAmount = OrderService::getAmount(['activity_id' => $activity_id,'begin_time'=>$item->start_time,'end_time'=>$item->end_time]);
  88. $item->totalOrderCount = OrderService::getActivityOrderNum(['activity_id' => $activity_id,'begin_time'=>$item->start_time,'end_time'=>$item->end_time]);
  89. $item->successOrderCount = OrderService::getActivityOrderNum(['activity_id' => $activity_id, 'status' => 'PAID','begin_time'=>$item->start_time,'end_time'=>$item->end_time]);
  90. }
  91. }
  92. return response()->pagination(new ActivityTransformer(), $activities);
  93. }
  94. /**
  95. * @apiVersion 1.0.0
  96. * @api {GET} activity/delActivity 删除活动
  97. * @apiGroup Activity
  98. * @apiName delActivity
  99. * @apiParam {Number} activity_id 活动ID
  100. * @apiSuccessExample {json} Success-Response:
  101. *
  102. * {
  103. * "code": 0,
  104. * "msg": "",
  105. * "data": [
  106. * ]
  107. * }
  108. */
  109. function delActivity(Request $request){
  110. $activity_id = $request->has('activity_id') ? $request->input('activity_id') : '';
  111. if (empty($activity_id)) {
  112. return response()->error("PARAM_EMPTY");
  113. }
  114. //$activity = ActivityService::getById($activity_id);
  115. //if($activity)
  116. DB::table('activity')->where('id',$activity_id)->update(['distribution_channel_id'=>14,'updated_at'=>date('Y-m-d H:i:s')]);
  117. return response()->success();
  118. }
  119. /**
  120. * @apiVersion 1.0.0
  121. * @api {GET} activity/getActivityRechargeInfo 获取活动的充值明细
  122. * @apiGroup Activity
  123. * @apiName getActivityRechargeInfo
  124. * @apiParam {Number} [activity_id] 活动ID
  125. * @apiSuccess {Number} uid 用户id.
  126. * @apiSuccess {Number} price 充值金额.
  127. * @apiSuccess {String} trade_no 平台交易ID.
  128. * @apiSuccess {String} pay_end_at 支付完成时间.
  129. * @apiSuccess {String} activity_id 活动ID
  130. * @apiSuccess {Number} send_order_id 派单id
  131. * @apiSuccess {String} send_order_name 派单名称
  132. * @apiSuccess {String} created_at 创建时间
  133. * @apiSuccessExample {json} Success-Response:
  134. *
  135. * {
  136. * "code": 0,
  137. * "msg": "",
  138. * "data": [
  139. * {
  140. * "uid": 1,
  141. * "price": "1.00",
  142. * "trade_no": "201711301125401585459852216605",
  143. * "pay_end_at": "2017-12-01 10:20:04",
  144. * "activity_id": 1,
  145. * "send_order_id": 0,
  146. * "send_order_name": "",
  147. * "created_at": 1512094804,
  148. * }
  149. * ]
  150. * }
  151. */
  152. function getActivityRechargeInfo(Request $request)
  153. {
  154. $activity_id = $request->has('activity_id') ? $request->input('activity_id') : '';
  155. if (empty($activity_id)) {
  156. return response()->error("PARAM_EMPTY");
  157. }
  158. if (!is_numeric($activity_id)) {
  159. return response()->error("PARAM_ERROR");
  160. }
  161. $activitiesRechargeInfo = ActivityService::getActivityRechargeInfo(['activity_id' => $activity_id, 'status' => 'PAID']);
  162. return response()->pagination(new ActivityChargeInfoTransformer(), $activitiesRechargeInfo);
  163. }
  164. /**
  165. * @apiVersion 1.0.0
  166. * @api {GET} activity/ChannelActivityStats 获取明细
  167. * @apiGroup Activity
  168. * @apiName ChannelActivityStats
  169. * @apiParam {Number} activity_id 活动ID
  170. * @apiSuccess {Number} sum 充值金额.
  171. * @apiSuccess {Number} site_id site_id.
  172. * @apiSuccess {String} nickname 商户名称.
  173. * @apiSuccess {String} allorder 订单比数.
  174. * @apiSuccess {String} success 成功顶顶单数
  175. * @apiSuccess {Number} rate 成功订单率
  176. * @apiSuccessExample {json} Success-Response:
  177. *
  178. * {
  179. * "code": 0,
  180. * "msg": "",
  181. * "data": [
  182. * {
  183. * "uid": 1,
  184. * "price": "1.00",
  185. * "trade_no": "201711301125401585459852216605",
  186. * "pay_end_at": "2017-12-01 10:20:04",
  187. * "activity_id": 1,
  188. * "send_order_id": 0,
  189. * "send_order_name": "",
  190. * "created_at": 1512094804,
  191. * }
  192. * ]
  193. * }
  194. */
  195. function ChannelActivityStats(Request $request){
  196. $activity_id = $request->has('activity_id') ? $request->input('activity_id') : '';
  197. if (empty($activity_id)) {
  198. return response()->error("PARAM_EMPTY");
  199. }
  200. $activity = ActivityService::getById($activity_id);
  201. $sql_fromat = "SELECT a.*,distribution_channels.nickname from(
  202. SELECT a.sum,a.success,b.allorder,b.distribution_channel_id
  203. from (
  204. SELECT distribution_channel_id,SUM(price) as sum, COUNT(*) as success
  205. FROM orders WHERE created_at BETWEEN '%s' and '%s' and activity_id = %s and `status` = 'PAID' GROUP BY distribution_channel_id
  206. ) a
  207. RIGHT join (
  208. SELECT distribution_channel_id, COUNT(*) as allorder
  209. FROM orders WHERE created_at BETWEEN '%s' and '%s' and activity_id = %s GROUP BY distribution_channel_id
  210. ) b on a.distribution_channel_id =b.distribution_channel_id
  211. ) a join distribution_channels on a.distribution_channel_id=distribution_channels.id";
  212. $sql = sprintf($sql_fromat,$activity->start_time,$activity->end_time,$activity->id,$activity->start_time,$activity->end_time,$activity->id);
  213. $res = DB::select($sql);
  214. foreach ($res as &$v){
  215. $v->rate = '-';
  216. if(isset($v->success) && !empty($v->success) && isset($v->allorder) && !empty($v->allorder)){
  217. $v->rate = sprintf("%.2f", ($v->success/$v->allorder)*100).'%';
  218. }
  219. }
  220. return response()->success($res);
  221. }
  222. /**
  223. * @apiVersion 1.0.0
  224. * @api {POST} activity/createdActivity 创捷活动
  225. * @apiGroup Activity
  226. * @apiName createdActivity
  227. * @apiParam {String} name 活动名称
  228. * @apiParam {String} start_time 开始时间
  229. * @apiParam {String} end_time 结束时间
  230. * @apiParam {String} price 单价
  231. * @apiParam {String} page_bd_img 活动页面背景
  232. * @apiParam {String} page_btn_pre_img 活动未开始按钮
  233. * @apiParam {String} page_btn_doing_img 活动开始按钮
  234. * @apiParam {String} page_btn_end_img 活动结束按钮
  235. * @apiParam {String} template_name 模板名称
  236. * @apiParam {String} template_content 模板内容
  237. * @apiParam {String} common_template_id 模板id
  238. * @apiParam {String} customer_img 客服消息图片
  239. * @apiParam {String} customer_title 客服消息标题
  240. * @apiParam {String} wap_bottom_img 章节阅读页底部图片
  241. * @apiParam {String} sign_call_back_text 签到回调推广标题
  242. * @apiSuccessExample {json} Success-Response:
  243. *
  244. * {
  245. * "code": 0,
  246. * "msg": "",
  247. * "data": {}
  248. * }
  249. */
  250. public function createdActivity(Request $request)
  251. {
  252. $token = str_random(32);
  253. $param = [];
  254. $param['name'] = $request->input('name');
  255. $param['start_time'] = $request->input('start_time');
  256. $param['end_time'] = $request->input('end_time');
  257. $param['price'] = $request->input('price');
  258. $param['page_bd_img'] = $request->input('page_bd_img');
  259. $param['page_btn_pre_img'] = $request->input('page_btn_pre_img');
  260. $param['page_btn_doing_img'] = $request->input('page_btn_doing_img');
  261. $param['page_btn_end_img'] = $request->input('page_btn_end_img');
  262. $check = checkParam($param, ['name', 'start_time', 'end_time', 'price', 'page_bd_img', 'page_btn_pre_img', 'page_btn_doing_img', 'page_btn_end_img']);
  263. if ($check) {
  264. return response()->error("PARAM_EMPTY", ['lack' => $check]);
  265. }
  266. $reward = $request->input('reward');
  267. if ($reward) {
  268. $reward *= 100;
  269. }
  270. $product = ProductService::addProduct([
  271. 'price' => (int)$param['price'],
  272. 'type' => 'TICKET_RECHARGE',
  273. 'given' => $reward,
  274. 'is_default' => 0,
  275. 'is_enabled' => 0,
  276. ]);
  277. $activity_settng_key = 'activity:setting';
  278. $template_name = $request->input('template_name');
  279. $template_content = $request->has('template_content') ? $request->input('template_content') : '';
  280. $common_template_id = $request->has('common_template_id') ? $request->input('common_template_id') : '';
  281. $customer_img = $request->input('customer_img');
  282. $customer_title = $request->input('customer_title');
  283. $wap_bottom_img = $request->input('wap_bottom_img');
  284. $sign_call_back_text = $request->input('sign_call_back_text');
  285. Redis::del($activity_settng_key);
  286. $customer_msg = json_encode([
  287. 'pic' => $customer_img,
  288. 'title' => $customer_title
  289. ]);
  290. $page_img['page_bd_img'] = $param['page_bd_img'];
  291. $page_img['page_btn_pre_img'] = $param['page_btn_pre_img'];
  292. $page_img['page_btn_doing_img'] = $param['page_btn_doing_img'];
  293. $page_img['page_btn_end_img'] = $param['page_btn_end_img'];
  294. $activity = ActivityService::createActivity([
  295. 'name' => $param['name'],
  296. 'start_time' => $param['start_time'],
  297. 'end_time' => $param['end_time'],
  298. 'activity_page' => '/sale?token=' . $token,
  299. 'product_id' => $product->id,
  300. 'token' => $token,
  301. 'customer_msg' => $customer_msg,
  302. 'setting' => json_encode($page_img)
  303. ]);
  304. if ($template_content && $common_template_id) {
  305. $wechat_public_templates = DB::table('wechat_public_templates')->select('id')->where('common_template_id',$common_template_id)->first();
  306. if($wechat_public_templates){
  307. $id = DB::table('default_template_themes')->insertGetId([
  308. 'title' => $template_name,
  309. 'activity_id' => $activity->id,
  310. 'template_id' => $wechat_public_templates->id,
  311. 'template_content' => '['.$template_content.']',
  312. 'created_at' => date('Y-m-d H:i:s'),
  313. 'updated_at' => date('Y-m-d H:i:s'),
  314. ]);
  315. DB::table('activity')->where('id',$activity->id)->update([
  316. 'default_template_id' => $id
  317. ]);
  318. }
  319. }
  320. $setting = ['activity_id' => $activity->id, 'wap_bottom_img' => $wap_bottom_img, 'sign_call_back_text' => $sign_call_back_text,'activity_title'=>''];
  321. Redis::set($activity_settng_key, json_encode($setting));
  322. return response()->success();
  323. }
  324. public function uploadImg(Request $request)
  325. {
  326. if (!$request->hasFile('photo')) {
  327. return response()->error('PARAM_EMPTY');
  328. }
  329. $file = $request->file('photo');
  330. $extension = $file->extension();
  331. $file_name = date('YmdHis') . '.' . $extension;
  332. $upload_res = $this->ossObject()->uploadFile(env('OSS_BUCKET','zhuishuyun'), 'book/cover/' . $file_name, $file->path());
  333. $data = ['cover' => $upload_res['oss-request-url']];
  334. return response()->success($data);
  335. }
  336. private function ossObject()
  337. {
  338. $accessKeyId = env('OSS_ACCESS_ID');
  339. $accessKeySecret = env('OSS_ACCESS_KEY');
  340. $endpoint = env('OSS_END_POINT');
  341. $ossClient = null;
  342. try {
  343. $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
  344. } catch (OssException $e) {
  345. return null;
  346. }
  347. return $ossClient;
  348. }
  349. /**
  350. * 活动导出
  351. * @param Request $request
  352. * @return $this|\Symfony\Component\HttpFoundation\BinaryFileResponse
  353. */
  354. public function exportActivity(Request $request){
  355. set_time_limit(0);
  356. $id = $request->input('activity_id');
  357. if (!$id) {
  358. return response()->error("PARAM_EMPTY");
  359. }
  360. $info = ActivityService::ActivityStatsI($id);
  361. $filename = 'Activit'.date('YmdHis').'.csv';
  362. Storage::append($filename,mb_convert_encoding("日期,site id,活动页面访问uv,按钮uv,生成订单数,成功支付订单数,首充用户数,点击阅读页面文字链uv,阅读页面文字链订单数,阅读页面文字链成功订单数,阅读页面文字链首充用户数,签到回调文字链uv,签到回调文字链生成订单数,签到回调文字链成功成功订单数,签到回调文字链首充用户数",'gbk'));
  363. $str = '';
  364. foreach ($info as $val){
  365. $str .= "{$val['day']},{$val['siteid']},{$val['uv']},{$val['button_uv']},{$val['order_num']},{$val['success_order_num']},{$val['first_charge_num']},{$val['reader_uv']},{$val['reader_order']},{$val['reader_success_order']},{$val['reader_first_charge']},{$val['signcallback_uv']},{$val['signcallback_order']},{$val['signcallback_success_order']},{$val['signcallback_first_charge']}\r\n";
  366. }
  367. Storage::append($filename,mb_convert_encoding($str,'gbk'));
  368. return response()->download(storage_path('app/'.$filename))->deleteFileAfterSend(true);
  369. }
  370. /**
  371. * 包年活动导出
  372. * @param Request $request
  373. * @return $this|\Symfony\Component\HttpFoundation\BinaryFileResponse
  374. */
  375. public function yearActivityExport(Request $request){
  376. set_time_limit(0);
  377. $id = $request->input('activity_id');
  378. if (!$id) {
  379. return response()->error("PARAM_EMPTY");
  380. }
  381. $info = ActivityService::yearActivityStats($id);
  382. $filename = 'Activit'.date('YmdHis').'.csv';
  383. Storage::append($filename,mb_convert_encoding("site id,日期,充值档位,订单数,成功订单数,UV,首充人数,充值总额",'gbk'));
  384. $str = '';
  385. foreach ($info as $val){
  386. $str .= "{$val['siteid']},{$val['day']},{$val['price']},{$val['order_num']},{$val['success']},{$val['uv']},{$val['first_charge']},{$val['sums']}\r\n";
  387. }
  388. Storage::append($filename,mb_convert_encoding($str,'gbk'));
  389. return response()->download(storage_path('app/'.$filename))->deleteFileAfterSend(true);
  390. }
  391. }