CpsBackLoginController.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package com.cyksj.web.controller.cps;
  2. import cn.hutool.core.date.DateTime;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import cn.hutool.json.JSONObject;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.cyksj.common.annotation.NoSubmit;
  9. import com.cyksj.common.exception.BusinessRuntimeException;
  10. import com.cyksj.common.snowflake.Sequence;
  11. import com.cyksj.common.util.Codec;
  12. import com.cyksj.common.util.Jsons;
  13. import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
  14. import com.cyksj.dto.Result;
  15. import com.cyksj.enums.GatewayResponse;
  16. import com.cyksj.mapper.GoodsDonMapper;
  17. import com.cyksj.mapper.UserMapper;
  18. import com.cyksj.mapper.manage.distribute.UserDistributeMapper;
  19. import com.cyksj.model.dto.AuthRedirect;
  20. import com.cyksj.model.dto.AuthToken;
  21. import com.cyksj.model.dto.CpsAuthDto;
  22. import com.cyksj.model.dto.GzhOAuth2UserInfo;
  23. import com.cyksj.model.entity.*;
  24. import com.cyksj.model.request.LoginReq;
  25. import com.cyksj.model.views.*;
  26. import com.cyksj.redis.RedisService;
  27. import com.cyksj.service.authorization.AuthorizationService;
  28. import com.cyksj.service.cps.CpsManageService;
  29. import com.cyksj.service.wechat.WeChatService;
  30. import com.cyksj.web.util.StpCpsManageUser;
  31. import com.ejlchina.searcher.BeanSearcher;
  32. import com.ejlchina.searcher.SearchResult;
  33. import com.ejlchina.searcher.util.MapBuilder;
  34. import com.ejlchina.searcher.util.MapUtils;
  35. import lombok.RequiredArgsConstructor;
  36. import org.springframework.web.bind.annotation.*;
  37. import javax.servlet.http.HttpServletRequest;
  38. import javax.servlet.http.HttpServletResponse;
  39. import java.math.BigDecimal;
  40. import java.math.RoundingMode;
  41. import java.util.List;
  42. import java.util.Map;
  43. import java.util.Optional;
  44. import java.util.stream.Collectors;
  45. /*
  46. *项目名: netflix
  47. *文件名: CpsBackLoginController
  48. *创建者: JavaZou
  49. *创建时间:2023/5/12 11:00
  50. */
  51. @RestController
  52. @RequestMapping("/cps/manage")
  53. @RequiredArgsConstructor
  54. public class CpsBackLoginController {
  55. private final CpsManageService cpsManageService;
  56. private final BeanSearcher beanSearcher;
  57. private final HttpServletRequest request;
  58. private final GoodsDonMapper goodsDonMapper;
  59. private final RedisService redisService;
  60. private final static Sequence SEQUENCE = new Sequence(0);
  61. private final WxOpenPlatYHLXLoginConfig wxOpenPlatYHLXLoginConfig;
  62. private final AuthorizationService authorizationService;
  63. private final WeChatService weChatService;
  64. private final UserMapper userMapper;
  65. private final UserDistributeMapper userDistributeMapper;
  66. /**
  67. * 获取登录验证码
  68. */
  69. @GetMapping("/get/LoginCode")
  70. @NoSubmit
  71. public Result getLoginCode(@RequestParam(defaultValue = "1") Integer type, String login, Integer cid) {
  72. cpsManageService.getLoginCode(type, login, cid);
  73. return GatewayResponse.SUCCESS.newBuilder().toResult();
  74. }
  75. /**
  76. * 手机号、邮箱登录
  77. */
  78. @PostMapping("/login")
  79. public Result login(@RequestBody LoginReq loginReq) {
  80. User user = cpsManageService.login(loginReq.getType(), loginReq.getLogin(), loginReq.getCode());
  81. StpCpsManageUser.login(user.getId());
  82. String cpsToken = StpCpsManageUser.getTokenValue();
  83. JSONObject re = new JSONObject();
  84. re.putOpt("satoken-cpsUser", cpsToken);
  85. re.putOpt("img", user.getHeadimgurl());
  86. re.putOpt("nickname", user.getNickname());
  87. return GatewayResponse.SUCCESS.newBuilder().toResult(re.toString());
  88. }
  89. /**
  90. * cps后台微信授权登录
  91. */
  92. @GetMapping("/wx/authLogin")
  93. public Result<CpsAuthDto> wxAuthorize() throws Exception {
  94. Object authUrlObj = redisService.get(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()));
  95. if (authUrlObj != null) {
  96. CpsAuthDto cpsAuthDto = Jsons.parseObject(authUrlObj.toString(), CpsAuthDto.class);
  97. return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
  98. }
  99. CpsAuthDto cpsAuthDto = new CpsAuthDto();
  100. Long mappingId = SEQUENCE.nextId();
  101. String authState = mappingId.toString();
  102. redisService.set(authState, authState, 60 * 60 * 24L);
  103. AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
  104. String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
  105. String wxAuthUrl = authorizationService.createWxAuthLoginUrl(state, wxOpenPlatYHLXLoginConfig.getAppId(), wxOpenPlatYHLXLoginConfig.getCpsRedirectUri());
  106. cpsAuthDto.setAuthUrl(wxAuthUrl);
  107. cpsAuthDto.setAuthState(authState);
  108. redisService.set(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat("cps", wxOpenPlatYHLXLoginConfig.getAppId()), Jsons.toJson(cpsAuthDto), RedisService.key.WX_LOGIN_AUTH_URI.getTimeout());
  109. return GatewayResponse.SUCCESS.newBuilder().toResult(cpsAuthDto);
  110. }
  111. /**
  112. * 网页微信授权后跳转
  113. */
  114. @GetMapping("/wx/authLogin/baseRedirect")
  115. public void wxAuthLoginRedirect(String code, String state, HttpServletResponse response) throws Exception {
  116. if (StrUtil.isEmpty(state)) throw BusinessRuntimeException.getInstance("授权错误,请重新授权");
  117. String json = Codec.DoBase64.custom().setData(state).decodeAsText();
  118. AuthRedirect re = Jsons.parseObject(json, AuthRedirect.class);
  119. AuthToken token = weChatService.getAuthToken(code, wxOpenPlatYHLXLoginConfig.getAppId());
  120. GzhOAuth2UserInfo userinfo = weChatService.getUserInfo(token.getAccessToken(), token.getOpenid());
  121. String unionId = userinfo.getUnionid();
  122. String openId = userinfo.getOpenid();
  123. User user = Optional.ofNullable(
  124. userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUnionid, unionId)
  125. .orderByAsc(User::getId)
  126. .last("limit 1")))
  127. .orElseGet(() -> userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId)
  128. .orderByAsc(User::getId)
  129. .last("limit 1")));
  130. if (user == null) throw BusinessRuntimeException.getInstance("用户信息不存在");
  131. UserDistribute userDistribute = userDistributeMapper.selectOne(Wrappers.lambdaQuery(UserDistribute.class).eq(UserDistribute::getUserId, user.getId()).select(UserDistribute::getId).last("limit 1"));
  132. if (userDistribute == null) throw BusinessRuntimeException.getInstance("只支持渠道分销用户登录");
  133. JSONObject res = new JSONObject();
  134. StpCpsManageUser.login(user.getId());
  135. String cpsToken = StpCpsManageUser.getTokenValue();
  136. res.putOpt("satoken-cpsUser", cpsToken);
  137. res.putOpt("img", user.getHeadimgurl());
  138. res.putOpt("nickname", user.getNickname());
  139. redisService.set(RedisService.key.CPS_AUTH_SUCCESS_KEY.getNameFormat(re.getMappingId()), res.toString(), RedisService.key.CPS_BACK_LOGIN_KEY.getTimeout());
  140. response.sendRedirect(wxOpenPlatYHLXLoginConfig.getCpsLoginUrl());
  141. }
  142. /**
  143. * 用户是否已授权
  144. */
  145. @GetMapping("/get/userInfo")
  146. public Result<String> getCpsUserInfo(String authState) {
  147. String key = RedisService.key.CPS_AUTH_SUCCESS_KEY.getNameFormat(authState);
  148. Object o = redisService.get(key);
  149. if (o == null) return GatewayResponse.SUCCESS.newBuilder().toResult();
  150. redisService.del(key);
  151. return GatewayResponse.SUCCESS.newBuilder().toResult(o.toString());
  152. }
  153. /**
  154. * 个人分销平台数据详情
  155. */
  156. @GetMapping("/get/distribute/detail")
  157. public Result<CpsUserDistributeDetailView> getDistributeDetail() {
  158. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  159. User user = beanSearcher.searchFirst(User.class, MapUtils.builder().field(User::getId, cpsUserId).onlySelect(User::getPoints).build());
  160. BigDecimal thresholdPoints = BigDecimal.valueOf(1000);
  161. BigDecimal wApplyMoney = user.getPoints().divide(thresholdPoints, 2, RoundingMode.DOWN);
  162. //已提现
  163. Number gotApplyMoney = beanSearcher.searchSum(DistributeMoneyApply.class, MapUtils.builder()
  164. .field(DistributeMoneyApply::getUserId, cpsUserId)
  165. .field(DistributeMoneyApply::getVerifyStatus, DistributeMoneyApply.Status.success.name())
  166. .build(), "money");
  167. Number reMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.success.name()).build(), "points");
  168. Number wMoneyPoints = beanSearcher.searchSum(DistributeWaitingSendPoints.class, MapUtils.builder().field(DistributeWaitingSendPoints::getSharedId, cpsUserId).field(DistributeWaitingSendPoints::getSendStatus, DistributeWaitingSendPoints.Status.waiting.name()).build(), "points");
  169. List<UserDistributeRateView> rateViews = beanSearcher.searchAll(UserDistributeRateView.class, MapUtils.builder()
  170. .put("distribute_id", String.format("and distribute_id = (select id from user_distribute where user_id = %s and deleted is true limit 1)", cpsUserId))
  171. .orderBy(UserDistributeRateView::getRate).desc()
  172. .build());
  173. CpsUserDistributeDetailView detailView = new CpsUserDistributeDetailView();
  174. Map<String, List<UserDistributeRateView>> collect = rateViews.stream().filter(ct -> StrUtil.isNotBlank(ct.getCategoryName())).collect(Collectors.groupingBy(UserDistributeRateView::getCategoryName));
  175. detailView.setRateViews(collect);
  176. detailView.setWMoney(BigDecimal.valueOf(wMoneyPoints.doubleValue()).divide(thresholdPoints, 2, RoundingMode.DOWN));
  177. detailView.setReMoney(BigDecimal.valueOf(reMoneyPoints.doubleValue()).divide(thresholdPoints, 2, RoundingMode.DOWN));
  178. detailView.setWApplyMoney(wApplyMoney);
  179. detailView.setGotApplyMoney(BigDecimal.valueOf(gotApplyMoney.doubleValue()).divide(BigDecimal.valueOf(100)));
  180. return GatewayResponse.SUCCESS.newBuilder().toResult(detailView);
  181. }
  182. /**
  183. * 待入账数据统计
  184. */
  185. @GetMapping("/get/wMoney/statisticsData")
  186. public Result<BrokenLineCpsUserWMoneyView> getWMoneyStatisticsDataView(Long firstDate, Long lastDate) {
  187. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  188. DateTime first = null;
  189. DateTime end = null;
  190. if (firstDate != null) {
  191. first = DateUtil.date(firstDate);
  192. }
  193. if (lastDate != null) {
  194. end = DateUtil.date(lastDate);
  195. }
  196. BrokenLineCpsUserWMoneyView brokenLineCpsUserWMoneyView = Optional.ofNullable(cpsManageService.getWMoneyStatisticsDate(cpsUserId, first, end)).orElse(new BrokenLineCpsUserWMoneyView());
  197. List<CpsUserWMoneyStatisticsDataView> dataView = cpsManageService.getWMoneyStatisticsDataView(cpsUserId, first, end);
  198. brokenLineCpsUserWMoneyView.setDataView(dataView);
  199. return GatewayResponse.SUCCESS.newBuilder().toResult(brokenLineCpsUserWMoneyView);
  200. }
  201. /**
  202. * 分销订单收入统计
  203. */
  204. @GetMapping("/get/distribute/orders/statistics")
  205. public Result<SearchResult<UserDistributeOrdersStatisticsView>> getUserDistributeOrdersStatisticsView(Long firstDate, Long lastDate) {
  206. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  207. String first = null;
  208. String end = null;
  209. String timeSql = StrUtil.EMPTY;
  210. if (firstDate != null) {
  211. first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd HH:mm:ss");
  212. timeSql += String.format(" and o.created_time >= '%s'", first);
  213. }
  214. if (lastDate != null) {
  215. end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd HH:mm:ss");
  216. timeSql += String.format(" and o.created_time < '%s'", end);
  217. }
  218. MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
  219. builder.put("sharedId", String.format("shared_id = %s", cpsUserId));
  220. if (StrUtil.isNotEmpty(timeSql)) {
  221. builder.put("time", timeSql);
  222. }
  223. SearchResult<UserDistributeOrdersStatisticsView> search = beanSearcher.search(UserDistributeOrdersStatisticsView.class, builder.build());
  224. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  225. }
  226. /**
  227. * 分销订单收入详细
  228. */
  229. @GetMapping("/get/distribute/orders/detail")
  230. public Result<SearchResult<UserDistributeOrdersDetailView>> getUserDistributeOrdersDetailView(Long firstDate, Long lastDate) {
  231. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  232. String first = null;
  233. String end = null;
  234. String timeSql = StrUtil.EMPTY;
  235. if (firstDate != null) {
  236. first = DateUtil.format(DateTime.of(firstDate), "yyyy-MM-dd HH:mm:ss");
  237. timeSql += String.format(" and o.created_time >= '%s'", first);
  238. }
  239. if (lastDate != null) {
  240. end = DateUtil.format(DateTime.of(lastDate), "yyyy-MM-dd HH:mm:ss");
  241. timeSql += String.format(" and o.created_time < '%s'", end);
  242. }
  243. MapBuilder builder = MapUtils.flatBuilder(request.getParameterMap());
  244. builder.put("sharedId", String.format("shared_id = %s", cpsUserId));
  245. if (StrUtil.isNotEmpty(timeSql)) {
  246. builder.put("time", timeSql);
  247. }
  248. SearchResult<UserDistributeOrdersDetailView> search = beanSearcher.search(UserDistributeOrdersDetailView.class, builder.build());
  249. return GatewayResponse.SUCCESS.newBuilder().toResult(search);
  250. }
  251. /**
  252. * 分销商品列表
  253. */
  254. @GetMapping("/get/goods")
  255. public Result<List<GoodsDon>> getGoodsList() {
  256. long cpsUserId = StpCpsManageUser.getLoginIdAsLong();
  257. List<GoodsDon> goodsDons = goodsDonMapper.getDistributeGoodsDetail(cpsUserId);
  258. return GatewayResponse.SUCCESS.newBuilder().toResult(goodsDons);
  259. }
  260. }