LogController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. <?php
  2. /**
  3. * 各种分页记录
  4. * @author xiabian <xiabian666@gmail.com>
  5. * @date 2020-02-19 10:13:09
  6. */
  7. declare(strict_types=1);
  8. namespace Modules\Api\Controllers;
  9. use App\Constants\CommentConstant;
  10. use App\Constants\CommonConstant;
  11. use App\Constants\OrderConstrant;
  12. use App\Model\CoinsLogModel;
  13. use App\Model\InviteRuleModel;
  14. use App\Model\Mongo\MessageModel;
  15. use App\Repositories\ChangeLogRepository;
  16. use App\Repositories\Criterias\ChangeLogCriteria;
  17. use App\Repositories\Criterias\OrderLimitCriteria;
  18. use App\Repositories\Criterias\UserCriteria;
  19. use App\Repositories\UserRebateLevelRepoistory;
  20. use App\Repositories\UserRepository;
  21. use App\Repositories\Utils\M3u8CacheRepository;
  22. use Carbon\Carbon;
  23. use Hyperf\Validation\Contract\ValidatorFactoryInterface;
  24. use App\Model\CoinsOrderModel;
  25. use App\Model\VipOrderModel;
  26. use Modules\Api\Responses\LogChangeListResponse;
  27. use Psr\SimpleCache\CacheInterface;
  28. class LogController extends BaseController
  29. {
  30. /**
  31. * 金币购买记录
  32. */
  33. public function coinsList(ValidatorFactoryInterface $validatorFactory)
  34. {
  35. // 或 ->getUserId() 拿到到 都是非用户ID,仅用户到邀请码:user_code, 安全设计为此!
  36. $user_id = $this->getUserId();
  37. // 拿到客户端上传的json内容 {"data":{"page":1,"page_size":2,"moreparam":"vaule"}}
  38. $inputData = $this->getJsonData();
  39. $rules = [
  40. 'page' => 'required|int',
  41. 'page_size' => 'required|int',
  42. ];
  43. $validator = $validatorFactory->make($inputData, $rules);
  44. if ($validator->fails()) {
  45. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  46. return json_fail($validator->errors()->first());
  47. }
  48. $pageSize = $inputData['page_size'] ?? CommentConstant::PAGE_SIZE;
  49. if ($pageSize > 100) {
  50. $pageSize = CommentConstant::PAGE_SIZE;
  51. }
  52. $page = format_page($inputData['page']);
  53. $pageSize = intval($pageSize);
  54. if ($pageSize <= 0) {
  55. $pageSize = CommentConstant::PAGE_SIZE;
  56. }
  57. $result = CoinsOrderModel::query()
  58. ->where(['user_code' => $user_id])
  59. ->orderByDesc('id')
  60. ->paginate($pageSize, ['*'], 'page', $page);
  61. return json_success($result);
  62. }
  63. /**
  64. * 金币明细
  65. */
  66. public function coinsMore(ValidatorFactoryInterface $validatorFactory)
  67. {
  68. $user_id = $this->getUserId();
  69. $inputData = $this->getJsonData();
  70. $rules = [
  71. 'page' => 'required|int',
  72. 'page_size' => 'required|int',
  73. ];
  74. $validator = $validatorFactory->make($inputData, $rules);
  75. if ($validator->fails()) {
  76. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  77. return json_fail($validator->errors()->first());
  78. }
  79. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  80. if ($pageSize > 100) {
  81. $pageSize = CommonConstant::PAGE_SIZE;
  82. }
  83. $page = format_page($inputData['page']);
  84. $pageSize = intval($pageSize);
  85. if ($pageSize <= 0) {
  86. $pageSize = CommonConstant::PAGE_SIZE;
  87. }
  88. $result = CoinsLogModel::query()
  89. ->where(['user_code'=>$user_id])
  90. ->orderByDesc('id')
  91. ->paginate($pageSize, ['*'], 'page', $page);
  92. return json_success($result);
  93. }
  94. /**
  95. * vip购买记录
  96. */
  97. public function vipOrderList(ValidatorFactoryInterface $validatorFactory)
  98. {
  99. $user_id = $this->getUserId();
  100. $inputData = $this->getJsonData();
  101. $rules = [
  102. 'page' => 'required|int',
  103. 'page_size' => 'required|int',
  104. ];
  105. $validator = $validatorFactory->make($inputData, $rules);
  106. if ($validator->fails()) {
  107. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  108. return json_fail($validator->errors()->first());
  109. }
  110. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  111. if ($pageSize > 100) {
  112. $pageSize = CommonConstant::PAGE_SIZE;
  113. }
  114. $page = format_page($inputData['page']);
  115. $pageSize = intval($pageSize);
  116. if ($pageSize <= 0) {
  117. $pageSize = CommonConstant::PAGE_SIZE;
  118. }
  119. $where = ['user_code' => $user_id];
  120. $result = VipOrderModel::query()
  121. ->where($where)
  122. ->orderByDesc('vip_order.id')
  123. ->paginate(
  124. $pageSize,
  125. ['*'],
  126. 'page',
  127. $page
  128. );
  129. foreach ($result as $r) {
  130. $r->pay_type = OrderConstrant::$messages[$r->pay_type];
  131. }
  132. return json_success($result);
  133. }
  134. /**
  135. * 余额明细(暂缓-第一版暂不提供)
  136. */
  137. /**
  138. * 邀请记录
  139. *
  140. * 若不传别人的邀请码,则仅查看自己的邀请人记录; - code
  141. * 若传了邀请码,则表示查看别人的邀请人记录; - code
  142. * 表user
  143. */
  144. public function inviteList(ValidatorFactoryInterface $validatorFactory)
  145. {
  146. $inputData = $this->getJsonData();
  147. $rules = [
  148. 'page' => 'required|int',
  149. 'page_size' => 'required|int',
  150. 'doings_end_time' => 'nullable|string'
  151. ];
  152. $validator = $validatorFactory->make($inputData, $rules);
  153. if ($validator->fails()) {
  154. return json_fail($validator->errors()->first());
  155. }
  156. $code = isset($inputData['code']) ? $inputData['code'] : '';
  157. if ($code) { //若传了则是请求别人的邀请列表
  158. $user_code = $code;
  159. } else { //反之仅查自己的邀请列表
  160. $user_code = $this->getUserId();
  161. }
  162. $user_info = make(UserRepository::class)
  163. ->getUserInfoFromCache($user_code);
  164. if (!$user_info) {
  165. return json_fail('用户不存在');
  166. }
  167. $inputData['parent_uid'] = $user_info['code'];
  168. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  169. if ($pageSize > 100) {
  170. $pageSize = CommonConstant::PAGE_SIZE;
  171. }
  172. $page = format_page($inputData['page']);
  173. $pageSize = intval($pageSize);
  174. if ($pageSize <= 0) {
  175. $pageSize = CommonConstant::PAGE_SIZE;
  176. }
  177. $select = ['nick','created_at'];
  178. $result = make(UserRepository::class)->pushCriteria(new UserCriteria($inputData))->pushCriteria(new OrderLimitCriteria([['id', 'desc']]))->paginate($pageSize, $select, $page);
  179. return json_success($result);
  180. }
  181. /**
  182. * 邀请规则
  183. */
  184. public function inviteRule()
  185. {
  186. $cache = make(CacheInterface::class);
  187. $invite_rule = $cache->remember('invite_rule', 60 * 60, function () {
  188. return InviteRuleModel::query()->get(['person','day']);
  189. });
  190. return json_success($invite_rule);
  191. }
  192. /**
  193. * 帐变流水
  194. *
  195. * @param ValidatorFactoryInterface $validatorFactory
  196. * @return mixed|LogChangeListResponse
  197. */
  198. public function changeList(ValidatorFactoryInterface $validatorFactory)
  199. {
  200. $inputData = $this->getJsonData();
  201. $rules = [
  202. 'page' => 'required|int',
  203. 'page_size' => 'required|int',
  204. 'currency_type' => 'nullable|in:1,2',
  205. 'type' => 'nullable|int'
  206. ];
  207. $validator = $validatorFactory->make($inputData, $rules);
  208. if ($validator->fails()) {
  209. return json_fail($validator->errors()->first());
  210. }
  211. $inputData['user_uid'] = $this->getUserId();
  212. $orders = [
  213. ['created_at', 'DESC'],
  214. ];
  215. $page = $inputData['page'] ?? 1;
  216. $pageSize = $inputData['page_size'] ?? CommonConstant::PAGE_SIZE;
  217. if ($pageSize > 100) {
  218. $pageSize = CommonConstant::PAGE_SIZE;
  219. }
  220. $page = format_page($inputData['page']);
  221. $pageSize = intval($pageSize);
  222. if ($pageSize <= 0) {
  223. $pageSize = CommonConstant::PAGE_SIZE;
  224. }
  225. $field = ['type', 'currency_type', 'way', 'amount', 'before_amount', 'after_amount', 'created_at'];
  226. $res = make(ChangeLogRepository::class)->pushCriteria(new ChangeLogCriteria($inputData))->pushCriteria(new OrderLimitCriteria($orders))->paginate($pageSize, $field, $page);
  227. return new LogChangeListResponse($res);
  228. }
  229. /**
  230. * 聊天记录
  231. *
  232. * @param ValidatorFactoryInterface $validatorFactory
  233. * @return mixed
  234. */
  235. public function userChatRecord(ValidatorFactoryInterface $validatorFactory)
  236. {
  237. $inputData = $this->getJsonData();
  238. $rules = [
  239. 'receive_uid' => 'nullable|string',
  240. 'chat_type' => 'nullable|string',
  241. ];
  242. $validator = $validatorFactory->make($inputData, $rules);
  243. if ($validator->fails()) {
  244. // 如果有错误(可能是多个信息),这里只取第一个错误信息返回.
  245. return json_fail($validator->errors()->first());
  246. }
  247. $options = [
  248. 'limit' => 50,
  249. 'sort' => ['created_at' => -1],
  250. ];
  251. $where['$or'] = [
  252. ['from_uid' => $this->getUserId(), 'receive_uid' => $inputData['receive_uid']],
  253. ['receive_uid' => $this->getUserId(), 'from_uid' => $inputData['receive_uid']]
  254. ];
  255. if (isset($inputData['chat_type']) && $inputData['chat_type'] == 'user') {
  256. $where['receive_type'] = 'user';
  257. } else {
  258. $where['receive_type'] = 'shops';
  259. }
  260. $res = make(MessageModel::class)->db()->find($where, $options)->toArray();
  261. foreach ($res as $key => $val) {
  262. $content = json_decode($val['content'], true);
  263. $message = structureHandle($content['message'], $val['struct_type']);
  264. $res[$key]['message'] = json_encode($message);
  265. if ($inputData['chat_type'] == 'user') {
  266. $res[$key]['receive_avatar'] = M3u8CacheRepository::getImageUrl($res[$key]['receive_avatar']);
  267. $res[$key]['from_avatar'] = M3u8CacheRepository::getImageUrl($res[$key]['from_avatar']);
  268. }
  269. $res[$key]['msg_type'] = $val['struct_type'];
  270. $res[$key]['created_at'] = mongoIsoDateToCarbonTime($val['created_at'])->toDateTimeString();
  271. $res[$key]['updated_at'] = mongoIsoDateToCarbonTime($val['updated_at'])->toDateTimeString();
  272. unset($res[$key]['_id'], $res[$key]['subject'], $res[$key]['receive_type'], $res[$key]['from_type'], $res[$key]['struct_type'], $res[$key]['content']);
  273. }
  274. // 阅读时间修改
  275. make(MessageModel::class)->db()->updateMany(
  276. ['from_uid' => $inputData['receive_uid'], 'receive_uid' => $this->getUserId(), 'receive_type' => $where['receive_type']],
  277. ['$set' => ['read_at' => toMongoIsoDate(Carbon::parse(date('Y-m-d H:i:s')))]],
  278. );
  279. return json_success(array_reverse($res));
  280. }
  281. /**
  282. * 推广记录
  283. *
  284. * @param ValidatorFactoryInterface $validatorFactory
  285. * @return mixed
  286. */
  287. public function promoteList(ValidatorFactoryInterface $validatorFactory)
  288. {
  289. $inputData = $this->getJsonData();
  290. $rules = [
  291. 'page' => 'required|int',
  292. 'page_size' => 'required|int',
  293. ];
  294. $validator = $validatorFactory->make($inputData, $rules);
  295. if ($validator->fails()) {
  296. return json_fail($validator->errors()->first());
  297. }
  298. $pageSize = $inputData['page_size'] ?? CommentConstant::PAGE_SIZE;
  299. if ($pageSize > 100) {
  300. $pageSize = CommentConstant::PAGE_SIZE;
  301. }
  302. $page = format_page($inputData['page']);
  303. $pageSize = intval($pageSize);
  304. $res = make(UserRebateLevelRepoistory::class)->promoteLog($this->getUserId(), $page, $pageSize);
  305. return json_success($res);
  306. }
  307. }