ChargeTJController.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. namespace Modules\Statistic\Http\Controllers;
  3. use Catch\Base\CatchController;
  4. use Illuminate\Foundation\Validation\ValidatesRequests;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\DB;
  7. use Modules\User\Http\Controllers\UserTrait;
  8. class ChargeTJController extends CatchController
  9. {
  10. use ValidatesRequests;
  11. use UserTrait;
  12. private function _sql(Request $request) {
  13. $this->validate($request, [
  14. 'start_at' => 'nullable|date_format:Y-m-d',
  15. 'end_at' => 'nullable|date_format:Y-m-d|after_or_equal:start_at',
  16. 'user_id' => 'nullable|integer|min:1',
  17. 'miniprogram_id' => 'nullable|integer|min:1'
  18. ]);
  19. $startAt = $request->input('start_at');
  20. $endAt = $request->input('end_at');
  21. $userId = $request->input('user_id');
  22. $miniprogramId = $request->input('miniprogram_id');
  23. $roles = $this->listUserRoles();
  24. if($roles->contains('company')) {
  25. $puserId = $this->getLoginUserId();
  26. } else {
  27. $puserId = null;
  28. $userId = $this->getLoginUserId();
  29. }
  30. return DB::table('tj_optimizer_day_charge')
  31. ->when($startAt, function ($query, $startAt){
  32. return $query->where('day_at', '>=', $startAt);
  33. })->when($endAt, function ($query, $endAt){
  34. return $query->where('day_at', '<=', $endAt);
  35. })->when($userId, function ($query, $userId){
  36. return $query->where('user_id', $userId);
  37. })->when($miniprogramId, function ($query, $miniprogramId) {
  38. return $query->where('miniprogram_id', $miniprogramId);
  39. })->when($puserId, function ($query, $puserId){
  40. return $query->where('puser_id', $puserId);
  41. })->orderBy('id', 'desc');
  42. }
  43. // 充值明细
  44. public function list(Request $request) {
  45. $sql = $this->_sql($request);
  46. $isExport = $request->input('is_export', false);
  47. if($isExport) {
  48. $result = $sql->get();
  49. } else {
  50. $result = $sql->paginate($request->input('limit', 15));
  51. }
  52. $users = DB::table('users')
  53. ->whereIn('id', $result->pluck('user_id'))
  54. ->select('id', 'username')
  55. ->get()->keyBy('id');
  56. $miniprograms = DB::table('miniprogram')
  57. ->whereIn('id', $result->pluck('miniprogram_id'))
  58. ->select('id','name')
  59. ->get()->keyBy('id');
  60. foreach ($result as $item) {
  61. $item->common_pay_money_per = $item->common_pay_uv ? bcdiv($item->common_pay_money, $item->common_pay_uv ,2 ) : 0;
  62. $item->vip_pay_money_per = $item->vip_pay_uv ? bcdiv($item->vip_pay_money, $item->vip_pay_uv ,2 ) : 0;
  63. $item->common_pay_rate = $item->common_pay_count ? bcdiv(100 * $item->common_pay_count, ($item->common_pay_count + $item->common_unpay_count) ,2 ) . '%' : 0 .'%';
  64. $item->vip_pay_rate = $item->vip_pay_count ? bcdiv(100 * $item->vip_pay_count , ($item->vip_pay_count + $item->vip_unpay_count), 2 ) . '%' : 0 .'%';
  65. $item->username = $users->get($item->user_id)->username ?? '';
  66. $item->miniprogram_name = $miniprograms->get($item->miniprogram_id)->name ?? '';
  67. }
  68. return $result;
  69. }
  70. // 充值明细中的累计
  71. public function listTotalCharge(Request $request) {
  72. $sql = $this->_sql($request);
  73. $info = $sql->select(
  74. DB::raw("sum(pay_money) as sum_pay_money"),
  75. DB::raw("sum(pay_count) as sum_pay_count"),
  76. )->first();
  77. if($info) {
  78. return [
  79. 'sum_pay_money' => $info->sum_pay_money,
  80. 'sum_pay_count' => $info->sum_pay_count,
  81. ];
  82. } else {
  83. return [
  84. 'sum_pay_money' => 0,
  85. 'sum_pay_count' => 0,
  86. ];
  87. }
  88. }
  89. // 今日充值
  90. public function todayCharge(Request $request) {
  91. $date = date('Y-m-d');
  92. $userId = $this->getLoginUserId();
  93. if($this->listUserRoles()->contains('company')) {
  94. $info = DB::table('orders')
  95. ->whereBetween('created_at', [$date, $date. ' 23:59:59'])
  96. ->where('puser_id', $userId)
  97. ->select(
  98. DB::raw("sum(if(status = 'unpaid', 0, price)) as pay_money"),
  99. DB::raw("sum(if(status <> 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_pay_count"),
  100. DB::raw("sum(if(status = 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_unpay_count"),
  101. DB::raw("sum(if(status <> 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_pay_count"),
  102. DB::raw("sum(if(status = 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_unpay_count"),
  103. )->first();
  104. } else {
  105. $info = DB::table('orders')
  106. ->whereBetween('created_at', [$date, $date. ' 23:59:59'])
  107. ->where('user_id', $userId)
  108. ->where('miniprogram_id', $request->input('miniprogram_id'))
  109. ->select(
  110. DB::raw("sum(if(status = 'unpaid', 0, price)) as pay_money"),
  111. DB::raw("sum(if(status <> 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_pay_count"),
  112. DB::raw("sum(if(status = 'unpaid' and order_type in ('coin', 'first_coin'), 1, 0)) as common_unpay_count"),
  113. DB::raw("sum(if(status <> 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_pay_count"),
  114. DB::raw("sum(if(status = 'unpaid' and order_type not in ('coin', 'first_coin'), 1, 0)) as vip_unpay_count"),
  115. )->first();
  116. }
  117. if($info) {
  118. $info->pay_money = intval($info->pay_money * 100) / 100;
  119. $info->common_pay_count = intval($info->common_pay_count);
  120. $info->common_unpay_count = intval($info->common_unpay_count);
  121. $info->vip_pay_count = intval($info->vip_pay_count);
  122. $info->vip_unpay_count = intval($info->vip_unpay_count);
  123. $info->company_pay_rate = $info->common_pay_count ? bcdiv($info->common_pay_count * 100,($info->common_pay_count + $info->common_unpay_count), 2) . '%' : '0%';
  124. $info->vip_pay_rate = $info->vip_pay_count ? bcdiv($info->vip_pay_count * 100, ($info->vip_pay_count + $info->vip_unpay_count) , 2) . '%' : '0%';
  125. }
  126. return $info;
  127. }
  128. // 本月充值
  129. public function currentMonthCharge(Request $request) {
  130. $userId = $this->getLoginUserId();
  131. if($this->listUserRoles()->contains('company')) {
  132. $info = DB::table('tj_company_day_charge')
  133. ->whereBetween('day_at', [date('Y-m-01'), date('Y-m-d', strtotime('yesterday'))])
  134. ->where('company_uid', $userId)
  135. ->select(
  136. DB::raw("sum(pay_money) as pay_money"),
  137. DB::raw("sum(common_pay_count) as common_pay_count"),
  138. DB::raw("sum(common_unpay_count) as common_unpay_count"),
  139. DB::raw("sum(vip_unpay_count) as vip_unpay_count"),
  140. DB::raw("sum(vip_pay_count) as vip_pay_count"),
  141. )->first();
  142. } else {
  143. $info = DB::table('tj_optimizer_day_charge')
  144. ->whereBetween('day_at', [date('Y-m-01'), date('Y-m-d', strtotime('yesterday'))])
  145. ->where('user_id', $userId)
  146. ->where('miniprogram_id', $request->input('miniprogram_id'))
  147. ->select(
  148. DB::raw("sum(pay_money) as pay_money"),
  149. DB::raw("sum(common_pay_count) as common_pay_count"),
  150. DB::raw("sum(common_unpay_count) as common_unpay_count"),
  151. DB::raw("sum(vip_unpay_count) as vip_unpay_count"),
  152. DB::raw("sum(vip_pay_count) as vip_pay_count"),
  153. )->first();
  154. }
  155. if($info) {
  156. $info->pay_money = intval($info->pay_money * 100) / 100;
  157. $info->common_pay_count = intval($info->common_pay_count);
  158. $info->common_unpay_count = intval($info->common_unpay_count);
  159. $info->vip_pay_count = intval($info->vip_pay_count);
  160. $info->vip_unpay_count = intval($info->vip_unpay_count);
  161. $info->company_pay_rate = $info->common_pay_count ? bcdiv($info->common_pay_count * 100,($info->common_pay_count + $info->common_unpay_count), 2) . '%' : '0%';
  162. $info->vip_pay_rate = $info->vip_pay_count ? bcdiv($info->vip_pay_count * 100, ($info->vip_pay_count + $info->vip_unpay_count), 2) . '%' : '0%';
  163. }
  164. return $info;
  165. }
  166. // 上月充值
  167. public function lastMonthCharge(Request $request) {
  168. $userId = $this->getLoginUserId();
  169. if($this->listUserRoles()->contains('company')) {
  170. $info = DB::table('tj_company_month_charge')
  171. ->where('month_at', date('Y-m-d', strtotime(date('Y-m-01')) - 10))
  172. ->where('company_uid', $userId)
  173. ->select(
  174. DB::raw("sum(pay_money) as pay_money"),
  175. DB::raw("sum(common_pay_count) as common_pay_count"),
  176. DB::raw("sum(common_unpay_count) as common_unpay_count"),
  177. DB::raw("sum(vip_unpay_count) as vip_unpay_count"),
  178. DB::raw("sum(vip_pay_count) as vip_pay_count"),
  179. )->first();
  180. } else {
  181. $info = DB::table('tj_optimizer_month_charge')
  182. ->where('month_at', date('Y-m-d', strtotime(date('Y-m-01')) - 10))
  183. ->where('user_id', $userId)
  184. ->where('miniprogram_id', $request->input('miniprogram_id'))
  185. ->select(
  186. DB::raw("sum(pay_money) as pay_money"),
  187. DB::raw("sum(common_pay_count) as common_pay_count"),
  188. DB::raw("sum(common_unpay_count) as common_unpay_count"),
  189. DB::raw("sum(vip_unpay_count) as vip_unpay_count"),
  190. DB::raw("sum(vip_pay_count) as vip_pay_count"),
  191. )->first();
  192. }
  193. if($info) {
  194. $info->pay_money = intval($info->pay_money * 100) / 100;
  195. $info->common_pay_count = intval($info->common_pay_count);
  196. $info->common_unpay_count = intval($info->common_unpay_count);
  197. $info->vip_pay_count = intval($info->vip_pay_count);
  198. $info->vip_unpay_count = intval($info->vip_unpay_count);
  199. $info->company_pay_rate = $info->common_pay_count ? bcdiv($info->common_pay_count * 100,($info->common_pay_count + $info->common_unpay_count), 2) . '%' : '0%';
  200. $info->vip_pay_rate = $info->vip_pay_count ? bcdiv($info->vip_pay_count * 100, ($info->vip_pay_count + $info->vip_unpay_count), 2) . '%' : '0%';
  201. }
  202. return $info;
  203. }
  204. // 累计充值
  205. public function totalCharge(Request $request) {
  206. $userId = $this->getLoginUserId();
  207. if($this->listUserRoles()->contains('company')) {
  208. $info = DB::table('tj_company_month_charge')
  209. ->where('month_at','<=', date('Y-m-d', strtotime(date('Y-m-01')) - 10))
  210. ->where('company_uid', $userId)
  211. ->select(
  212. DB::raw("sum(pay_money) as pay_money"),
  213. DB::raw("sum(common_pay_count) as common_pay_count"),
  214. DB::raw("sum(common_unpay_count) as common_unpay_count"),
  215. DB::raw("sum(vip_unpay_count) as vip_unpay_count"),
  216. DB::raw("sum(vip_pay_count) as vip_pay_count"),
  217. )->first();
  218. } else {
  219. $info = DB::table('tj_optimizer_month_charge')
  220. ->where('month_at', '<=',date('Y-m-d', strtotime(date('Y-m-01')) - 10))
  221. ->where('user_id', $userId)
  222. ->where('miniprogram_id', $request->input('miniprogram_id'))
  223. ->select(
  224. DB::raw("sum(pay_money) as pay_money"),
  225. DB::raw("sum(common_pay_count) as common_pay_count"),
  226. DB::raw("sum(common_unpay_count) as common_unpay_count"),
  227. DB::raw("sum(vip_unpay_count) as vip_unpay_count"),
  228. DB::raw("sum(vip_pay_count) as vip_pay_count"),
  229. )->first();
  230. }
  231. $currentMonthInfo = $this->currentMonthCharge($request);
  232. $result = (object)[
  233. 'pay_money' => $info->pay_money ?? 0 + $currentMonthInfo->pay_money ?? 0,
  234. 'common_pay_count' => $info->common_pay_count ?? 0 + $currentMonthInfo->common_pay_count ?? 0,
  235. 'common_unpay_count' => $info->common_unpay_count ?? 0 + $currentMonthInfo->common_unpay_count ?? 0,
  236. 'vip_unpay_count' => $info->vip_unpay_count ?? 0 + $currentMonthInfo->vip_unpay_count ?? 0,
  237. 'vip_pay_count' => $info->vip_pay_count ?? 0 + $currentMonthInfo->vip_pay_count ?? 0,
  238. ];
  239. $result->company_pay_rate = $result->common_pay_count ? bcdiv($result->common_pay_count * 100,($result->common_pay_count + $result->common_unpay_count), 2) . '%' : '0%';
  240. $result->vip_pay_rate = $result->vip_pay_count ? bcdiv($result->vip_pay_count * 100,($result->vip_pay_count + $result->vip_unpay_count), 2) . '%' : '0%';
  241. return $result;
  242. }
  243. }