UserController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Controller\Api\v1;
  4. use App\Controller\AbstractController;
  5. use App\Model\Arts\CouponModel;
  6. use App\Model\Arts\DriverMessageModel;
  7. use App\Model\Arts\DriverModel;
  8. use App\Model\Arts\DriverWalletModel;
  9. use App\Model\Arts\MessageModel;
  10. use App\Model\Arts\UserAddressModel;
  11. use App\Model\Arts\UserCouponModel;
  12. use App\Model\Arts\UserModel;
  13. use App\Model\Arts\UserMoneyLogModel;
  14. use App\Model\Arts\UserWalletModel;
  15. use App\Request\Api\v1\User\AddressAddRequest;
  16. use App\Request\Api\v1\User\AddressDelRequest;
  17. use App\Request\Api\v1\User\AddressDetailRequest;
  18. use App\Request\Api\v1\User\AddressEditRequest;
  19. use App\Request\Api\v1\User\AddressListRequest;
  20. use App\Request\Api\v1\User\CouponsRequest;
  21. use App\Request\Api\v1\User\EditRequest;
  22. use App\Request\Api\v1\User\InviteRequest;
  23. use App\Request\Api\v1\User\MoneyLogRequest;
  24. use App\Request\Api\v1\User\OrderPageCouponsRequest;
  25. use App\Utils\AppResult;
  26. use App\Utils\Common;
  27. use App\Utils\Control\AuthUser;
  28. use Hyperf\DbConnection\Db;
  29. /**
  30. * 用户管理
  31. * UserController
  32. */
  33. class UserController extends AbstractController
  34. {
  35. // 日志模块名称
  36. const LOG_MODULE = 'v1/UserController';
  37. /**
  38. * 用户信息
  39. * @return string
  40. */
  41. public function info()
  42. {
  43. $user = AuthUser::getInstance()->get();
  44. unset($user['password'], $user['salt']);
  45. $user['money'] = UserWalletModel::getOne($user['id'], 'money');
  46. $model = new UserCouponModel();
  47. $list = $model->getList(
  48. params : [
  49. 'user_id' => $user['id'],
  50. 'is_use' => 0,
  51. 'valid' => 0
  52. ],
  53. orderBy: ['id' => 'desc']
  54. );
  55. $user['coupon'] = count($list);
  56. $user['avatar'] = cdn_url($user['avatar']);
  57. $user['credit'] = "{$user['over_order_num']}/{$user['order_num']}";
  58. return AppResult::success(result: $user);
  59. }
  60. // 个人信息编辑
  61. public function edit(EditRequest $request)
  62. {
  63. $params = $request->validated();
  64. $user = AuthUser::getInstance()->get();
  65. if (empty($params['avatar']) && empty($params['email']) && empty($params['nickname'])) {
  66. return AppResult::success('修改成功');
  67. }
  68. $data = [];
  69. !empty($params['nickname']) && $data['nickname'] = $params['nickname'];
  70. !empty($params['avatar']) && $data['avatar'] = $params['avatar'];
  71. !empty($params['email']) && $data['email'] = $params['email'];
  72. if (!UserModel::query()->where('id', $user['id'])->update($data)) {
  73. return AppResult::error('修改失败');
  74. }
  75. return AppResult::success('修改成功');
  76. }
  77. /**
  78. * 余额变动记录
  79. * @param MoneyLogRequest $request
  80. * @return string
  81. */
  82. public function money_log(MoneyLogRequest $request)
  83. {
  84. $params = $request->validated();// 获取校验通过的参数
  85. $user = AuthUser::getInstance()->get();
  86. if ($params['type_in'] == 1) {
  87. $params['type_in'] = [1, 4];
  88. } else {
  89. $params['type_in'] = [2, 3];
  90. }
  91. $model = new UserMoneyLogModel();
  92. $list = $model->getList(
  93. params: array_merge(['user_id' => $user['id']], $params), orderBy: ['id' => 'desc']
  94. );
  95. return AppResult::success('success', $list);
  96. }
  97. /**
  98. * 常用地址列表
  99. * @param AddressListRequest $request
  100. * @return string
  101. */
  102. public function address_list(AddressListRequest $request)
  103. {
  104. $params = $request->validated();// 获取校验通过的参数
  105. $user = AuthUser::getInstance()->get();
  106. $model = new UserAddressModel();
  107. $list = $model->getList(
  108. params: array_merge($params, ['user_id' => $user['id']])
  109. );
  110. return AppResult::success(result: $list);
  111. }
  112. public function address_detail(AddressDetailRequest $request)
  113. {
  114. $params = $request->validated();// 获取校验通过的参数
  115. $user = AuthUser::getInstance()->get();
  116. $model = new UserAddressModel();
  117. $list = $model->getDetail(
  118. params: array_merge($params, ['user_id' => $user['id']])
  119. );
  120. return AppResult::success(result: $list);
  121. }
  122. /**
  123. * 常用地址添加
  124. * @param AddressAddRequest $request
  125. * @return string
  126. */
  127. public function address_add(AddressAddRequest $request)
  128. {
  129. $params = $request->validated();// 获取校验通过的参数
  130. $user = AuthUser::getInstance()->get();
  131. $params = array_merge($params, ['user_id' => $user['id']]);
  132. if (!UserAddressModel::add($params)) {
  133. return AppResult::error('添加失败');
  134. }
  135. return AppResult::success('创建成功');
  136. }
  137. /**
  138. * 常用地址编辑
  139. * @param AddressEditRequest $request
  140. * @return string
  141. */
  142. public function address_edit(AddressEditRequest $request)
  143. {
  144. $params = $request->validated();// 获取校验通过的参数
  145. $user = AuthUser::getInstance()->get();
  146. $params = array_merge($params, ['user_id' => $user['id']]);
  147. if (!UserAddressModel::edit((int)$params['id'], $params)) {
  148. return AppResult::error('修改失败');
  149. }
  150. return AppResult::success('修改成功');
  151. }
  152. /**
  153. * 常用地址编辑
  154. * @param AddressDelRequest $request
  155. * @return string
  156. */
  157. public function address_del(AddressDelRequest $request)
  158. {
  159. $params = $request->validated();// 获取校验通过的参数
  160. $user = AuthUser::getInstance()->get();
  161. if (!UserAddressModel::del((int)$params['id'], (int)$user['id'])) {
  162. return AppResult::error('删除失败');
  163. }
  164. return AppResult::success('删除成功');
  165. }
  166. /**
  167. * 我的优惠券
  168. * @param CouponsRequest $request
  169. * @return \Psr\Http\Message\MessageInterface|\Psr\Http\Message\ResponseInterface
  170. * @throws \Psr\Container\ContainerExceptionInterface
  171. * @throws \Psr\Container\NotFoundExceptionInterface
  172. */
  173. public function coupons(CouponsRequest $request)
  174. {
  175. $params = $request->validated();
  176. $user = AuthUser::getInstance()->get();
  177. $model = new UserCouponModel();
  178. $list = $model->getList(
  179. params: array_merge($params, ['user_id' => $user['id']]), orderBy: ['id' => 'desc']
  180. );
  181. foreach ($list as $key => $val) {
  182. $list[$key]['valid_at'] = date('Y-m-d H:i:s', $val['valid_at']);
  183. }
  184. return AppResult::success(result: $list);
  185. }
  186. /**
  187. * 订单使用优惠券
  188. * @param OrderPageCouponsRequest $request
  189. * @return \Psr\Http\Message\MessageInterface|\Psr\Http\Message\ResponseInterface
  190. * @throws \Psr\Container\ContainerExceptionInterface
  191. * @throws \Psr\Container\NotFoundExceptionInterface
  192. */
  193. public function order_page_coupons(OrderPageCouponsRequest $request)
  194. {
  195. $params = $request->validated();
  196. $user = AuthUser::getInstance()->get();
  197. $model = new UserCouponModel();
  198. $list = $model->getList(
  199. params : [
  200. 'user_id' => $user['id'],
  201. 'type' => $params['type'],
  202. 'is_use' => 0,
  203. 'is_valid' => 0,
  204. 'min_money_min' => $params['total_amount']
  205. ],
  206. orderBy: ['id' => 'desc']
  207. );
  208. foreach ($list as $key => $val) {
  209. $total_amount = (string)round((float)bcsub($params['total_amount'], $val['money'], 2));// 四舍五入
  210. $rmb_total_amount = (string)round((float)bcmul($total_amount, site('dollar_to_rmb'), 2));// 四舍五入
  211. $list[$key]['valid_at'] = date('Y-m-d H:i:s', $val['valid_at']);
  212. $list[$key]['pay_amount'] = $total_amount;
  213. $list[$key]['rmb_pay_amount'] = $rmb_total_amount;
  214. }
  215. return AppResult::success(result: $list);
  216. }
  217. /**
  218. * 邀请用户
  219. * @param InviteRequest $request
  220. * @return \Psr\Http\Message\MessageInterface|\Psr\Http\Message\ResponseInterface
  221. * @throws \Psr\Container\ContainerExceptionInterface
  222. * @throws \Psr\Container\NotFoundExceptionInterface
  223. */
  224. public function invite(InviteRequest $request)
  225. {
  226. $params = $request->validated();
  227. $user = AuthUser::getInstance()->get();
  228. if (!empty($user['parent_id']) || !empty($user['driver_id'])) {
  229. return AppResult::error('已经被邀请过了');
  230. }
  231. if ($params['invite_code'] == $user['invite_code']) {
  232. return AppResult::error('不可以邀请自己');
  233. }
  234. $first = substr($params['invite_code'], 0, 1);
  235. if (!in_array($first, ['U', 'D'])) {
  236. return AppResult::error('邀请码错误');
  237. }
  238. if ($first == 'U') {
  239. $info = UserModel::query()->where('invite_code', $params['invite_code'])->where('status', 1)->first();
  240. $up['parent_id'] = $info['id'] ?? 0;
  241. } else {
  242. $info = DriverModel::query()->where('invite_code', $params['invite_code'])->where('status', 1)->first();
  243. $up['driver_id'] = $info['id'] ?? 0;
  244. }
  245. if (!$info) {
  246. return AppResult::error('邀请码异常');
  247. }
  248. Db::beginTransaction();
  249. if (!UserModel::query()->where('id', $user['id'])->update($up)) {
  250. Db::rollBack();
  251. return AppResult::error('操作失败');
  252. }
  253. $time = time();
  254. if ($first == 'U'){
  255. // 发放优惠券
  256. $coupon = CouponModel::getDetail(['id' => site('invite_user_coupon_id')]);
  257. if ($coupon){
  258. $insert = [
  259. 'user_id' => $up['parent_id'],
  260. 'coupon_id' => $coupon['id'],
  261. 'name' => $coupon['name'],
  262. 'type' => $coupon['type'],
  263. 'min_money' => $coupon['min_money'],
  264. 'money' => $coupon['money'],
  265. 'valid_at' => strtotime(date('Y-m-d 23:59:59', $time + ($coupon['valid_days'] * 24 * 60 * 60))),// 自领取之日起 计算过期时间
  266. 'remark' => '邀请用户奖励',
  267. 'status' => 1,
  268. 'create_time' => $time
  269. ];
  270. if (!UserCouponModel::query()->insert($insert)) {
  271. Db::rollBack();
  272. return AppResult::error('发放失败');
  273. }
  274. }
  275. // 发送系统消息
  276. MessageModel::add([
  277. 'user_id' => $up['parent_id'],
  278. 'type' => 1,
  279. 'name' => "邀请用户奖励",
  280. 'content' => "邀请用户成功,优惠券奖励已发放",
  281. 'value' => $coupon['id']
  282. ]);
  283. } else {
  284. // 发放奖金
  285. $invite_driver_amount = site('invite_driver_amount');
  286. if ($invite_driver_amount){
  287. $wallet = new DriverWalletModel();
  288. if (!$wallet->change($up['driver_id'], (float)$invite_driver_amount, "邀请用户奖励", 4)) {
  289. Db::rollBack();
  290. return AppResult::error($wallet->getMessage());
  291. }
  292. }
  293. // 发送系统消息
  294. DriverMessageModel::add([
  295. 'driver_id' => $up['driver_id'],
  296. 'type' => 1,
  297. 'name' => "邀请用户奖励",
  298. 'content' => "邀请用户成功,奖励金已发放",
  299. 'value' => ''
  300. ]);
  301. }
  302. Db::commit();
  303. return AppResult::success('操作成功');
  304. }
  305. }