UserController.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. package com.cyksj.web.controller.user;
  2. import cn.hutool.core.date.DateTime;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.cyksj.common.annotation.NoSubmit;
  5. import com.cyksj.common.exception.BusinessRuntimeException;
  6. import com.cyksj.dto.Result;
  7. import com.cyksj.enums.GatewayApiCode;
  8. import com.cyksj.enums.GatewayResponse;
  9. import com.cyksj.mapper.OrderDonMapper;
  10. import com.cyksj.mapper.manage.coupon.CouponUserMapper;
  11. import com.cyksj.mapper.market.task.UserBindDetailMapper;
  12. import com.cyksj.model.dto.UserWhoami;
  13. import com.cyksj.model.entity.*;
  14. import com.cyksj.model.manage.views.GroupsRelationView;
  15. import com.cyksj.model.request.ExchangeCodeTicket;
  16. import com.cyksj.model.request.ReceiveBenefitsReq;
  17. import com.cyksj.model.request.WorkOrderReq;
  18. import com.cyksj.model.request.UserReq;
  19. import com.cyksj.model.views.RenewalView;
  20. import com.cyksj.model.views.UserAvailableGoodsTicketView;
  21. import com.cyksj.model.views.UserPersonalView;
  22. import com.cyksj.model.views.WorkOrderChatHistoryView;
  23. import com.cyksj.service.exchange.ExchangeCodeService;
  24. import com.cyksj.service.order.UserRealOrderBenefitsService;
  25. import com.cyksj.service.relation.GroupRelationFrontService;
  26. import com.cyksj.service.user.UserService;
  27. import com.cyksj.service.user.WorkOrderFrontService;
  28. import com.cyksj.web.util.StpUserUtil;
  29. import com.ejlchina.searcher.BeanSearcher;
  30. import com.ejlchina.searcher.SearchResult;
  31. import com.ejlchina.searcher.util.MapUtils;
  32. import lombok.RequiredArgsConstructor;
  33. import org.springframework.util.Assert;
  34. import org.springframework.validation.annotation.Validated;
  35. import org.springframework.web.bind.annotation.*;
  36. import javax.servlet.http.HttpServletRequest;
  37. import java.util.ArrayList;
  38. import java.util.List;
  39. /**
  40. * @author chan
  41. * @date 2021/10/11 下午11:05
  42. */
  43. @RequestMapping("/applets/user")
  44. @RestController
  45. @RequiredArgsConstructor
  46. public class UserController {
  47. private final UserService userService;
  48. private final ExchangeCodeService exchangeCodeService;
  49. private final GroupRelationFrontService groupRelationFrontService;
  50. private final CouponUserMapper couponUserMapper;
  51. private final OrderDonMapper orderDonMapper;
  52. private final UserBindDetailMapper UserBindDetailMapper;
  53. private final UserRealOrderBenefitsService userRealOrderBenefitsService;
  54. private final BeanSearcher beanSearcher;
  55. private final WorkOrderFrontService workOrderFrontService;
  56. private final HttpServletRequest request;
  57. @GetMapping(value = "/wx/whoami")
  58. public Result<UserWhoami> whoami() {
  59. long userId = StpUserUtil.getLoginIdAsLong();
  60. UserWhoami userWhoami = userService.whoami(userId);
  61. return GatewayResponse.SUCCESS.newBuilder().toResult(userWhoami);
  62. }
  63. /**
  64. * 兑换码兑换车票
  65. */
  66. @PostMapping("/get/ticket")
  67. public Result<String> getTicketByExchangeCode(@RequestBody ExchangeCodeTicket exchangeCodeTicket) {
  68. Long userId = StpUserUtil.getLoginIdAsLong();
  69. return exchangeCodeService.getTicketByExchangeCode(exchangeCodeTicket, userId);
  70. }
  71. /**
  72. * 个人中心详情
  73. */
  74. @GetMapping("/personal")
  75. public Result<UserPersonalView> getPersonalView() {
  76. long userId = StpUserUtil.getLoginIdAsLong();
  77. List<RenewalView> ticket = groupRelationFrontService.getMyTicket(userId, false);
  78. UserPersonalView personalView = new UserPersonalView();
  79. DateTime now = DateTime.now();
  80. //车票
  81. personalView.setNumOfTickets(ticket.size());
  82. //优惠券
  83. Integer couponSize = couponUserMapper.selectCount(Wrappers.lambdaQuery(CouponUser.class)
  84. .eq(CouponUser::getUserId, userId)
  85. .eq(CouponUser::getStatus, CouponUser.Status.unused)
  86. .le(CouponUser::getValidStartTime, now)
  87. .gt(CouponUser::getValidEndTime, now));
  88. personalView.setNumOfCoupons(couponSize);
  89. //积分
  90. User user = userService.getById(userId);
  91. personalView.setActivePoints(user.getActivePoints());
  92. //推广积分
  93. personalView.setPopularizePoints(user.getPoints());
  94. personalView.setBalance(user.getBalance());
  95. OrderDon orderDon = orderDonMapper.selectOne(Wrappers.lambdaQuery(OrderDon.class)
  96. .eq(OrderDon::getUserId, userId)
  97. .eq(OrderDon::getStatus, OrderDon.Status.noPayment).last("limit 1"));
  98. personalView.setIsNoPayment(orderDon != null ? true : false);
  99. UserBindDetail bindPhone = UserBindDetailMapper.selectOne(Wrappers.lambdaQuery(UserBindDetail.class)
  100. .eq(UserBindDetail::getUserId, userId).last("limit 1"));
  101. //手机号
  102. if (bindPhone != null) {
  103. personalView.setPhone(bindPhone.getPhone());
  104. }
  105. return GatewayResponse.SUCCESS.newBuilder().toResult(personalView);
  106. }
  107. /**
  108. * 用户已有实物权益 可选车票
  109. */
  110. @GetMapping("/get/available/benefits/tickets")
  111. public Result<List<UserAvailableGoodsTicketView>> getAvailableBenefitsTickets(Long orderId) {
  112. Long userId = StpUserUtil.getLoginIdAsLong();
  113. List<UserAvailableGoodsTicketView> tickets = userRealOrderBenefitsService.getAvailableBenefitsTickets(userId, orderId);
  114. return GatewayResponse.SUCCESS.newBuilder().toResult(tickets);
  115. }
  116. /**
  117. * 用户领取实物权益
  118. */
  119. @PostMapping("/receive/benefits")
  120. public Result<List<GroupsRelationView>> receiveRealGoodsBenefits(@RequestBody List<ReceiveBenefitsReq> reqList) {
  121. List<GroupsRelationView> re = new ArrayList<>();
  122. Long userId = StpUserUtil.getLoginIdAsLong();
  123. reqList.forEach(req -> {
  124. Long benefitsId = req.getBenefitsId(), goodsId = req.getGoodsId(), skuId = req.getSkuId(), relationId = req.getRelationId();
  125. Assert.notNull(benefitsId, "可获取的权益不存在");
  126. Assert.notNull(goodsId, "请选择对应平台");
  127. Assert.notNull(skuId, "请选择对应权益规格");
  128. Assert.notNull(relationId, "请选择对应车票");
  129. GroupsRelationView groupsRelationView = userRealOrderBenefitsService.receiveRealGoodsBenefits(userId, benefitsId, goodsId, skuId, relationId);
  130. re.add(groupsRelationView);
  131. });
  132. return GatewayResponse.SUCCESS.newBuilder().toResult(re);
  133. }
  134. /**
  135. * 用户提交工单
  136. */
  137. @PostMapping("/workOrder/submit")
  138. @NoSubmit
  139. public Result<String> submitWorkOrder(@RequestBody @Validated WorkOrderReq workOrderReq) {
  140. long userId = StpUserUtil.getLoginIdAsLong();
  141. workOrderReq.setUserId(userId);
  142. workOrderFrontService.submitWorkOrder(workOrderReq);
  143. return GatewayResponse.SUCCESS.newBuilder().toResult();
  144. }
  145. /**
  146. * 用户工单历史列表
  147. */
  148. @GetMapping("/workOrder/get")
  149. public Result<SearchResult<WorkOrder>> getWorkOrder() {
  150. long userId = StpUserUtil.getLoginIdAsLong();
  151. SearchResult<WorkOrder> search = beanSearcher.search(WorkOrder.class, MapUtils.flatBuilder(request.getParameterMap())
  152. .field(WorkOrder::getUserId, userId)
  153. .orderBy(WorkOrder::getId).desc()
  154. .onlySelect(WorkOrder::getId, WorkOrder::getTopic, WorkOrder::getStatus, WorkOrder::getCreatedTime)
  155. .build());
  156. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  157. }
  158. /**
  159. * 用户工单详情
  160. */
  161. @GetMapping("/workOrder/get/detail/{id}")
  162. public Result<SearchResult<WorkOrderChatHistoryView>> getWorkOrderDetails(@PathVariable Long id) {
  163. long userId = StpUserUtil.getLoginIdAsLong();
  164. SearchResult<WorkOrderChatHistoryView> search = beanSearcher.search(WorkOrderChatHistoryView.class, MapUtils.builder()
  165. .field(WorkOrderChatHistoryView::getUserId, userId)
  166. .field(WorkOrderChatHistoryView::getWorkOrderId, id)
  167. .orderBy(WorkOrderChatHistoryView::getId).desc()
  168. .selectExclude(WorkOrderChatHistoryView::getReplyCustomerServiceId,
  169. WorkOrderChatHistoryView::getCustomer)
  170. .build());
  171. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  172. }
  173. /**
  174. * 工单状态查询
  175. */
  176. @GetMapping("/workOrder/get/status/{id}")
  177. public Result<WorkOrder> getWorkOrderStatus(@PathVariable Long id) {
  178. long userId = StpUserUtil.getLoginIdAsLong();
  179. WorkOrder workOrder = beanSearcher.searchFirst(WorkOrder.class, MapUtils.builder()
  180. .field(WorkOrder::getUserId, userId)
  181. .field(WorkOrder::getId, id)
  182. .onlySelect(WorkOrder::getId, WorkOrder::getUserId, WorkOrder::getStatus)
  183. .build());
  184. if (workOrder == null) {
  185. throw BusinessRuntimeException.getInstance("该工单不存在");
  186. }
  187. return GatewayResponse.SUCCESS.newBuilder().toResult(workOrder);
  188. }
  189. /**
  190. * 用户回复客服
  191. */
  192. @PostMapping("/workOrder/reply")
  193. public Result<String> userReplyWorkOrder(@RequestBody @Validated WorkOrderChatHistory history) {
  194. long userId = StpUserUtil.getLoginIdAsLong();
  195. history.setUserId(userId);
  196. workOrderFrontService.replyCustomer(history);
  197. return GatewayResponse.SUCCESS.newBuilder().toResult();
  198. }
  199. /**
  200. * 用户修改头像
  201. */
  202. @PutMapping("/put/headImg")
  203. public Result<String> updateHeadImg(@RequestBody @Validated UserReq request) {
  204. long userId = StpUserUtil.getLoginIdAsLong();
  205. User user = userService.getById(userId);
  206. if (user == null) throw BusinessRuntimeException.getGatewayApiCode(GatewayApiCode.CMS_TOKEN_VALID);
  207. user.setSex(request.getSex());
  208. user.setHeadimgurl(request.getHeadImg());
  209. userService.updateById(user);
  210. return GatewayResponse.SUCCESS.newBuilder().toResult();
  211. }
  212. /**
  213. * 更新用户最后一次登录时间
  214. */
  215. @PutMapping("/update/lastTime")
  216. public Result<String> updateLastTime() {
  217. long userId = StpUserUtil.getLoginIdAsLong();
  218. User user = userService.getById(userId);
  219. if (user == null) {
  220. return GatewayResponse.SUCCESS.newBuilder().toResult();
  221. }
  222. user.setLastTime(DateTime.now());
  223. userService.updateById(user);
  224. return GatewayResponse.SUCCESS.newBuilder().toResult();
  225. }
  226. /**
  227. * 查看用户所有余额
  228. */
  229. @GetMapping("/get/balance")
  230. public Result<User> getUserBalance() {
  231. long userId = StpUserUtil.getLoginIdAsLong();
  232. User user = userService.getOne(Wrappers.lambdaQuery(User.class)
  233. .eq(User::getId, userId)
  234. .select(User::getNickname, User::getBalance)
  235. .last("limit 1"));
  236. return GatewayResponse.SUCCESS.newBuilder().toResult(user);
  237. }
  238. }