CmsUserController.java 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package com.cyksj.web.controller.manage;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.cyksj.common.constant.Constant;
  6. import com.cyksj.dto.Result;
  7. import com.cyksj.enums.GatewayResponse;
  8. import com.cyksj.mapper.GroupsRelationMapper;
  9. import com.cyksj.mapper.OrderDonMapper;
  10. import com.cyksj.mapper.UserMapper;
  11. import com.cyksj.mapper.corp.CorpUserFollowRelationMapper;
  12. import com.cyksj.model.entity.*;
  13. import com.cyksj.model.manage.views.UserView;
  14. import com.cyksj.model.views.GoodsDonSkuView;
  15. import com.cyksj.model.views.RenewalView;
  16. import com.cyksj.model.views.UserDistributeBusinessInfoView;
  17. import com.cyksj.model.views.UserOrderDonDetail;
  18. import com.cyksj.service.relation.GroupRelationClearService;
  19. import com.cyksj.service.relation.GroupRelationFrontService;
  20. import com.ejlchina.searcher.BeanSearcher;
  21. import com.ejlchina.searcher.SearchResult;
  22. import com.ejlchina.searcher.param.Operator;
  23. import com.ejlchina.searcher.util.MapBuilder;
  24. import com.ejlchina.searcher.util.MapUtils;
  25. import lombok.RequiredArgsConstructor;
  26. import lombok.extern.slf4j.Slf4j;
  27. import org.springframework.web.bind.annotation.*;
  28. import javax.servlet.http.HttpServletRequest;
  29. import java.math.BigDecimal;
  30. import java.math.RoundingMode;
  31. import java.util.List;
  32. import java.util.Optional;
  33. /**
  34. * @author chan
  35. * @date 2022/9/27 4:42 PM
  36. */
  37. @Slf4j
  38. @RequiredArgsConstructor
  39. @RestController
  40. @RequestMapping("/manage/user")
  41. public class CmsUserController{
  42. private final HttpServletRequest request;
  43. private final BeanSearcher beanSearcher;
  44. private final GroupsRelationMapper relationMapper;
  45. private final UserMapper userMapper;
  46. private final GroupRelationClearService groupRelationClearService;
  47. private final GroupsRelationMapper groupsRelationMapper;
  48. private final GroupRelationFrontService groupRelationFrontService;
  49. private final CorpUserFollowRelationMapper cmsUserFollowRelationMapper;
  50. private final OrderDonMapper orderDonMapper;
  51. @GetMapping("/get")
  52. @SaCheckPermission("user:view")
  53. public Result<SearchResult<UserView>> get(String otherPhone, Long sharedId, String userid, Long businessId, String sort, String order) {
  54. MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
  55. String otherSql = StrUtil.EMPTY;
  56. if (StrUtil.isNotBlank(otherPhone)) {
  57. otherSql += String.format("(u.id in (select user_id from user_bind_detail where phone like '%s%%') or u.login_phone like '%s%%')", otherPhone, otherPhone);
  58. }
  59. if (businessId != null) {
  60. if (StrUtil.isNotBlank(otherSql)) {
  61. otherSql += " and ";
  62. }
  63. otherSql += String.format("us.shared_id in (select user_id from user_distribute where business_id = %s)", businessId);
  64. }
  65. if (StrUtil.isNotBlank(otherSql)) {
  66. builder.put("otherConditionSql", otherSql);
  67. }
  68. SearchResult<UserView> search = beanSearcher.search(UserView.class, builder.build());
  69. search.getDataList().forEach(data->{
  70. Long userId = data.getId();
  71. UserBindDetail userBindDetail = beanSearcher.searchFirst(UserBindDetail.class, MapUtils.builder().field(UserBindDetail::getUserId, userId).onlySelect(UserBindDetail::getPhone, UserBindDetail::getEmail).build());
  72. Optional.ofNullable(userBindDetail).ifPresent(bind->{
  73. data.setBindEmail(bind.getEmail());
  74. data.setBindPhone(bind.getPhone());
  75. });
  76. if (data.getSharedId() != null) {
  77. UserDistributeBusinessInfoView userDistributeBusinessInfoView = beanSearcher.searchFirst(UserDistributeBusinessInfoView.class, MapUtils.builder().field(UserDistributeBusinessInfoView::getUserId, data.getSharedId()).build());
  78. Optional.ofNullable(userDistributeBusinessInfoView).ifPresent(info->{
  79. data.setDistributeName(info.getDistributeName());
  80. data.setBusinessName(info.getBusinessName());
  81. });
  82. }
  83. });
  84. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  85. }
  86. /**
  87. * 修改用户的拉黑状态
  88. */
  89. @PutMapping("/put/black/status/{id}")
  90. @SaCheckPermission("user:black")
  91. public Result<String> putBlackStatus(@PathVariable Long id) {
  92. User user = userMapper.selectById(id);
  93. Optional.ofNullable(user).ifPresent(u -> {
  94. u.setIsBlack(!u.getIsBlack());
  95. if (u.getIsBlack()) {
  96. List<RenewalView> groupsRelations = groupRelationFrontService.getMyTicket(u.getId(), null);
  97. groupsRelations.forEach(ticket -> {
  98. GroupsRelation relation = groupsRelationMapper.selectById(ticket.getRelationId());
  99. groupRelationClearService.clearTicket(relation, UserTicketClearedRecord.Source.black);
  100. });
  101. }
  102. userMapper.updateById(u);
  103. });
  104. return GatewayResponse.SUCCESS.newBuilder().toResult();
  105. }
  106. /**
  107. * 用户加入企业微信客服详情
  108. */
  109. @GetMapping("/get/corpFollow/detail/{userId}")
  110. public Result<String> getCorpFollowDetailById(@PathVariable Long userId) {
  111. User user = userMapper.selectById(userId);
  112. if (user == null || StrUtil.isEmpty(user.getUnionid())) {
  113. return GatewayResponse.SUCCESS.newBuilder().toResult();
  114. }
  115. String corpCustomers = cmsUserFollowRelationMapper.selectCorpCustomers(user.getUnionid());
  116. return GatewayResponse.SUCCESS.newBuilder().toResult(corpCustomers);
  117. }
  118. /**
  119. * 企业微信客服列表
  120. */
  121. @GetMapping("/get/corpFollow")
  122. public Result<List<CorpFollow>> getCorpFollow() {
  123. List<CorpFollow> corpFollows = beanSearcher.searchAll(CorpFollow.class, MapUtils.flatBuilder(request.getParameterMap())
  124. .field(CorpFollow::getWxCorpId, 2)
  125. .build());
  126. return GatewayResponse.SUCCESS.newBuilder().toResult(corpFollows);
  127. }
  128. /**
  129. * 用户订单详情title
  130. */
  131. @GetMapping("/get/order/title")
  132. public Result<UserView> getUserOrderDetailTitle(Long userId) {
  133. UserView userView = new UserView();
  134. List<OrderDon> orderDons = orderDonMapper.selectList(Wrappers.lambdaQuery(OrderDon.class)
  135. .eq(OrderDon::getUserId, userId)
  136. .notIn(OrderDon::getStatus, Constant.noOrderStatus)
  137. .orderByAsc(OrderDon::getId));
  138. //首单产品
  139. Optional<OrderDon> firstOrder = orderDons.stream().filter(don -> don.getStatus() != OrderDon.Status.refund).findFirst();
  140. if (firstOrder.isPresent()) {
  141. OrderDon orderDon = firstOrder.get();
  142. BigDecimal money = orderDon.getMoney().divide(BigDecimal.valueOf(100));
  143. Optional.ofNullable(beanSearcher.searchFirst(GoodsDonSkuView.class, MapUtils.builder().field(GoodsDonSkuView::getSkuId, orderDon.getSkuId()).onlySelect(GoodsDonSkuView::getGoodsTitle, GoodsDonSkuView::getSpecVal).build()))
  144. .ifPresent(goodsDonSkuView -> {
  145. String msg = String.format("%s%s %s元", goodsDonSkuView.getGoodsTitle(), goodsDonSkuView.getSpecVal(), money);
  146. if (orderDon.getCouponUserId() != 0) {
  147. BigDecimal subMoney = orderDon.getCouponMoney().divide(BigDecimal.valueOf(100));
  148. msg = String.format("%s(减免%s元)", msg, subMoney);
  149. }
  150. userView.setFirstOrderDetail(msg);
  151. });
  152. }
  153. //有无路由器订单
  154. Optional<OrderDon> routeOrder = orderDons.stream().filter(don -> don.getGoodsId() == 15).findFirst();
  155. userView.setIsHadRouteOrder(routeOrder.isPresent() ? true : false);
  156. Integer noRefundOrders = 0;
  157. Integer refundOrders = 0;
  158. //除去退款 下单金额
  159. BigDecimal orderMoney = BigDecimal.ZERO;
  160. BigDecimal refundMoney = BigDecimal.ZERO;
  161. for (OrderDon orderDon : orderDons) {
  162. if (orderDon.getStatus() == OrderDon.Status.refund) {
  163. refundOrders++;
  164. if (orderDon.getRefundMoney() != null) {
  165. refundMoney = refundMoney.add(orderDon.getRefundMoney());
  166. }
  167. }else {
  168. noRefundOrders++;
  169. orderMoney = orderMoney.add(orderDon.getMoney());
  170. }
  171. }
  172. BigDecimal refundRate = BigDecimal.ZERO;
  173. if (!orderDons.isEmpty()) {
  174. //退款率
  175. refundRate = BigDecimal.valueOf(refundOrders).divide(BigDecimal.valueOf(orderDons.size()), 2, RoundingMode.HALF_UP);
  176. }
  177. userView.setOrderMoney(orderMoney);
  178. userView.setNumOfOrder(noRefundOrders);
  179. userView.setRefundMoney(refundMoney);
  180. userView.setRefundRate(refundRate);
  181. return GatewayResponse.SUCCESS.newBuilder().toResult(userView);
  182. }
  183. /**
  184. * 用户下单详情
  185. */
  186. @GetMapping("/get/order/list")
  187. public Result<SearchResult<UserOrderDonDetail>> getUserOrderDetails() {
  188. SearchResult<UserOrderDonDetail> search = beanSearcher.search(UserOrderDonDetail.class, MapUtils.flatBuilder(request.getParameterMap())
  189. .field(UserOrderDonDetail::getStatus, Constant.noOrderAllStatus).op(Operator.NotIn)
  190. .build());
  191. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  192. }
  193. }