YueBao.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace App\Http\Controllers\admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\ActivityReward;
  5. use App\Models\YuebaoItem;
  6. use App\Models\YuebaoLog;
  7. use App\Services\ActivityRewardService;
  8. use App\Support\ActivityCatalog;
  9. use Exception;
  10. use App\Constants\HttpStatus;
  11. use Illuminate\Http\JsonResponse;
  12. use Illuminate\Support\Facades\DB;
  13. use Illuminate\Validation\ValidationException;
  14. class YueBao extends Controller
  15. {
  16. /**
  17. * 余额宝持仓列表
  18. */
  19. public function item()
  20. {
  21. try {
  22. $params = request()->validate([
  23. 'page' => ['nullable', 'integer', 'min:1'],
  24. 'limit' => ['nullable', 'integer', 'min:1'],
  25. 'id' => ['nullable', 'integer', 'min:1'],
  26. 'user_id' => ['nullable'],
  27. 'member_id' => ['nullable'],
  28. 'account' => ['nullable', 'string', 'max:64'],
  29. 'first_name' => ['nullable'],
  30. 'start_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:end_time'],
  31. 'end_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:start_time'],
  32. ]);
  33. $page = request()->input('page', 1);
  34. $limit = request()->input('limit', 15);
  35. $query = YuebaoItem::join('users', 'users.user_id', '=', 'yuebao_item.user_id')
  36. ->select("yuebao_item.*", "users.first_name", "users.member_id", "users.account", "users.admin_note as user_admin_note");
  37. \App\Support\MemberAudience::visibleUsers($query, 'users'); // 后台模拟会员只在模拟管理里出现
  38. if (!empty($params['id'])) {
  39. $query = $query->where('yuebao_item.id', $params['id']);
  40. }
  41. if (!empty($params['user_id'])) {
  42. $query = $query->where('yuebao_item.user_id', $params['user_id']);
  43. }
  44. if (!empty($params['member_id'])) {
  45. $query = $query->where('yuebao_item.user_id', $params['member_id']);
  46. }
  47. if (!empty($params['start_time'])) {
  48. $startTime = strtotime($params['start_time'] . " 00:00:00");
  49. $query = $query->where('yuebao_item.create_time', '>=', $startTime);
  50. }
  51. if (!empty($params['end_time'])) {
  52. $endTime = strtotime($params['end_time'] . " 23:59:59");
  53. $query = $query->where('yuebao_item.create_time', '<=', $endTime);
  54. }
  55. if (!empty($params['account'])) {
  56. $query = $query->where('users.account', 'like', '%' . trim((string)$params['account']) . '%');
  57. }
  58. if (isset($params['first_name']) && !empty($params['first_name'])) {
  59. $query = $query->where('users.first_name', 'like', "%" . $params['first_name'] . "%");
  60. }
  61. $count = $query->count();
  62. $list = $query
  63. ->forPage($page, $limit)
  64. ->orderByDesc('yuebao_item.create_time')
  65. ->get();
  66. } catch (Exception $e) {
  67. return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
  68. }
  69. return $this->success(['total' => $count, 'data' => $list]);
  70. }
  71. /**
  72. * 余额宝日志列表
  73. */
  74. public function log()
  75. {
  76. try {
  77. $params = request()->validate([
  78. 'page' => ['nullable', 'integer', 'min:1'],
  79. 'limit' => ['nullable', 'integer', 'min:1'],
  80. 'id' => ['nullable', 'integer', 'min:1'],
  81. 'item_id' => ['nullable', 'integer', 'min:1'],
  82. 'user_id' => ['nullable'],
  83. 'type' => ['nullable', 'integer'],
  84. 'start_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:end_time'],
  85. 'end_time' => ['nullable', 'date', 'date_format:Y-m-d', 'required_with:start_time'],
  86. ]);
  87. $page = request()->input('page', 1);
  88. $limit = request()->input('limit', 15);
  89. $query = new YuebaoLog();
  90. if (!empty($params['id'])) {
  91. $query = $query->where('id', $params['id']);
  92. }
  93. if (!empty($params['item_id'])) {
  94. $query = $query->where('item_id', $params['item_id']);
  95. }
  96. if (!empty($params['user_id'])) {
  97. $query = $query->where('user_id', $params['user_id']);
  98. }
  99. if (!empty($params['type'])) {
  100. $query = $query->where('type', $params['type']);
  101. }
  102. if (!empty($params['start_time'])) {
  103. $startTime = strtotime($params['start_time'] . " 00:00:00");
  104. $query = $query->where('create_time', '>=', $startTime);
  105. }
  106. if (!empty($params['end_time'])) {
  107. $endTime = strtotime($params['end_time'] . " 23:59:59");
  108. $query = $query->where('create_time', '<=', $endTime);
  109. }
  110. $count = $query->count();
  111. $list = $query
  112. ->forPage($page, $limit)
  113. ->orderByDesc('create_time')
  114. ->get();
  115. } catch (Exception $e) {
  116. return $this->error(HttpStatus::CUSTOM_ERROR,$e->getMessage());
  117. }
  118. return $this->success(['total' => $count, 'data' => $list]);
  119. }
  120. /** 余额宝配置固定为一条 type=6 活动行;与会员端选取顺序一致取排序最高、ID 最大的一条。 */
  121. private static function configRow(): ?ActivityReward
  122. {
  123. return ActivityReward::where('type', ActivityCatalog::YUEBAO_TYPE)
  124. ->orderByDesc('sort')->orderByDesc('id')->first();
  125. }
  126. /**
  127. * 余额宝配置详情
  128. */
  129. public function config(): JsonResponse
  130. {
  131. $row = self::configRow();
  132. if (!$row) {
  133. return $this->success(null);
  134. }
  135. $data = $row->toArray();
  136. $params = json_decode((string)$row->getRawOriginal('params'), true) ?: [];
  137. $data['daily_interest_rate'] = $params['daily_interest_rate'] ?? null;
  138. $data['number_of_consecutive_days_of_deposit'] = $params['number_of_consecutive_days_of_deposit'] ?? null;
  139. // 活动类型、游戏分类、点击行为、排序不属于余额宝配置。
  140. unset($data['params'], $data['type'], $data['type_name'], $data['game_category'], $data['game_category_name'],
  141. $data['click_type'], $data['link'], $data['link_pc'], $data['link_h5'], $data['click_position'], $data['can_jump'], $data['sort']);
  142. return $this->success($data);
  143. }
  144. /**
  145. * 保存余额宝配置(无则新建)
  146. */
  147. public function saveConfig(): JsonResponse
  148. {
  149. DB::beginTransaction();
  150. try {
  151. $params = request()->validate([
  152. 'title' => ['required', 'string', 'min:1', 'max:140'],
  153. 'sub_title' => ['required', 'string', 'min:1', 'max:140'],
  154. 'start_time' => ['nullable', 'required_with:end_time', 'date'],
  155. 'end_time' => ['nullable', 'required_with:start_time', 'date', 'after_or_equal:start_time'],
  156. 'detail_image' => ['required'],
  157. 'pc_image' => ['required'],
  158. 'status' => ['required', 'integer', 'in:0,1'],
  159. 'lang' => ['required', 'string'],
  160. 'content' => ['nullable', 'string'],
  161. 'daily_interest_rate' => ['required', 'numeric', 'min:0', 'max:100'],
  162. 'number_of_consecutive_days_of_deposit' => ['required', 'integer', 'min:1', 'max:3650'],
  163. ], [
  164. 'start_time.required_with' => '活动开始和结束时间必须同时填写或同时留空',
  165. 'end_time.required_with' => '活动开始和结束时间必须同时填写或同时留空',
  166. 'daily_interest_rate.required' => '请填写日化率',
  167. 'number_of_consecutive_days_of_deposit.required' => '请填写连续存款天数',
  168. ]);
  169. $row = self::configRow();
  170. $stored = $row ? (json_decode((string)$row->getRawOriginal('params'), true) ?: []) : [];
  171. $stored['daily_interest_rate'] = (string)$params['daily_interest_rate'];
  172. $stored['number_of_consecutive_days_of_deposit'] = (int)$params['number_of_consecutive_days_of_deposit'];
  173. unset($params['daily_interest_rate'], $params['number_of_consecutive_days_of_deposit']);
  174. $defaults = ActivityRewardService::configurationDefaults();
  175. unset($defaults['sort']);
  176. $params = array_merge($params, array_intersect_key(request()->all(), $defaults + ['budget' => true]));
  177. $params['type'] = ActivityCatalog::YUEBAO_TYPE;
  178. $params['params'] = json_encode($stored);
  179. if ($row) {
  180. $params['id'] = $row->id;
  181. }
  182. ActivityRewardService::submit($params);
  183. DB::commit();
  184. } catch (ValidationException $e) {
  185. DB::rollBack();
  186. return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first());
  187. } catch (Exception $e) {
  188. DB::rollBack();
  189. return $this->error($e->getCode() ?: HttpStatus::CUSTOM_ERROR, $e->getMessage());
  190. }
  191. return $this->success();
  192. }
  193. }