MiniServiceImpl.java 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. package com.cyksj.service.mini.impl;
  2. import cn.hutool.core.util.RandomUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.cyksj.common.util.Times;
  7. import com.cyksj.config.TgMiniConfig;
  8. import com.cyksj.config.YhCertMiniConfig;
  9. import com.cyksj.config.YhMiniConfig;
  10. import com.cyksj.dto.Result;
  11. import com.cyksj.enums.GatewayResponse;
  12. import com.cyksj.mapper.UserMapper;
  13. import com.cyksj.mapper.mini.ArticleMapper;
  14. import com.cyksj.mapper.mini.ArticleUserMarkMapper;
  15. import com.cyksj.mapper.mini.MiniPopularizeUserMapper;
  16. import com.cyksj.model.dto.MiniProgramSession;
  17. import com.cyksj.model.entity.Article;
  18. import com.cyksj.model.entity.ArticleUserMark;
  19. import com.cyksj.model.entity.MiniPopularizeUser;
  20. import com.cyksj.model.entity.User;
  21. import com.cyksj.model.request.MiniArticleReq;
  22. import com.cyksj.model.request.MiniSchemaReq;
  23. import com.cyksj.model.request.TargetAppletSchemeReq;
  24. import com.cyksj.model.views.ArticleDetailView;
  25. import com.cyksj.model.wechat.MiniURLLink;
  26. import com.cyksj.redis.RedisService;
  27. import com.cyksj.service.mini.MiniService;
  28. import com.cyksj.service.wechat.WeChatService;
  29. import lombok.RequiredArgsConstructor;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.springframework.dao.DuplicateKeyException;
  32. import org.springframework.stereotype.Service;
  33. import org.springframework.transaction.annotation.Transactional;
  34. import java.util.Optional;
  35. /*
  36. *项目名: netflix
  37. *文件名: MiniServiceImpl
  38. *创建者: JavaZou
  39. *创建时间:2023/5/11 18:07
  40. */
  41. @Service
  42. @RequiredArgsConstructor
  43. @Slf4j
  44. public class MiniServiceImpl implements MiniService {
  45. private final WeChatService weChatService;
  46. private final YhMiniConfig yhMiniConfig;
  47. private final UserMapper userMapper;
  48. private final ArticleUserMarkMapper articleUserMarkMapper;
  49. private final ArticleMapper articleMapper;
  50. private final YhCertMiniConfig certMiniConfig;
  51. private final RedisService redisService;
  52. private final MiniPopularizeUserMapper miniPopularizeUserMapper;
  53. private final TgMiniConfig tgMiniConfig;
  54. @Override
  55. public String getMiniURLLink(String path, String query) throws Exception {
  56. MiniURLLink miniURLLink = new MiniURLLink();
  57. miniURLLink.setPath(path);
  58. miniURLLink.setQuery(query);
  59. String accessToken = weChatService.getAccessToken(yhMiniConfig.getAppId());
  60. String linkUrl = weChatService.getMiniURLLink(accessToken, miniURLLink);
  61. return linkUrl;
  62. }
  63. @Override
  64. public User wxlogin(String code, String appId) throws Exception {
  65. MiniProgramSession code2Session = weChatService.code2Session(appId, code);
  66. String unionId = code2Session.getUnionid();
  67. String openId = code2Session.getOpenid();
  68. User user = Optional.ofNullable(
  69. userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getUnionid, unionId)
  70. .last("limit 1")))
  71. .orElseGet(() -> userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getOpenId, openId)
  72. .last("limit 1")));
  73. user = Optional.ofNullable(user).orElseGet(() -> new User().setOpenId(openId).setUnionid(unionId));
  74. user.setUnionid(unionId);
  75. user.setOpenId(openId);
  76. user.setRegisterEnv(User.RegisterEnv.h5.name());
  77. if (user.getId() == null) {
  78. user.setNickname(String.format("银河小程序用户%s", RandomUtil.randomString(5)));
  79. userMapper.insert(user);
  80. //推广小程序用户 新注册发送GPT画图使用额度
  81. sendGptMirrorImageNumIfPopularizeMini(user.getId(), appId);
  82. } else {
  83. userMapper.updateById(user);
  84. }
  85. return user;
  86. }
  87. @Override
  88. @Transactional(rollbackFor = Throwable.class)
  89. public Result<String> markArticle(MiniArticleReq miniArticleReq) {
  90. Long userId = miniArticleReq.getUserId();
  91. Long articleId = miniArticleReq.getId();
  92. Integer type = miniArticleReq.getType();
  93. ArticleUserMark mark = articleUserMarkMapper.selectOne(Wrappers.lambdaQuery(ArticleUserMark.class)
  94. .eq(ArticleUserMark::getUserId, userId)
  95. .eq(ArticleUserMark::getArticleId, articleId).last("limit 1"));
  96. if (mark == null) {
  97. mark = new ArticleUserMark();
  98. mark.setUserId(userId);
  99. mark.setArticleId(articleId);
  100. if (type == 1) mark.setIsDz(true);
  101. if (type == 2) mark.setIsCol(true);
  102. try {
  103. articleUserMarkMapper.insert(mark);
  104. updateArticleMarkNum(type, articleId, 1);
  105. } catch (DuplicateKeyException e) {
  106. }
  107. if (type == 1) return GatewayResponse.SUCCESS.newBuilder().toResult("点赞成功");
  108. if (type == 2) return GatewayResponse.SUCCESS.newBuilder().toResult("收藏成功");
  109. }
  110. if (type == 1) {
  111. Boolean isDz = mark.getIsDz();
  112. mark.setIsDz(!isDz);
  113. articleUserMarkMapper.updateById(mark);
  114. if (!isDz) {
  115. updateArticleMarkNum(type, articleId, 1);
  116. return GatewayResponse.SUCCESS.newBuilder().toResult("点赞成功");
  117. }
  118. updateArticleMarkNum(type, articleId, -1);
  119. return GatewayResponse.SUCCESS.newBuilder().toResult("取消成功");
  120. }
  121. if (type == 2) {
  122. Boolean isCol = mark.getIsCol();
  123. mark.setIsCol(!isCol);
  124. articleUserMarkMapper.updateById(mark);
  125. if (!isCol) {
  126. updateArticleMarkNum(type, articleId, 1);
  127. return GatewayResponse.SUCCESS.newBuilder().toResult("收藏成功");
  128. }
  129. updateArticleMarkNum(type, articleId, -1);
  130. return GatewayResponse.SUCCESS.newBuilder().toResult("取消成功");
  131. }
  132. return GatewayResponse.SUCCESS.newBuilder().toResult();
  133. }
  134. @Override
  135. public ArticleDetailView getArticleDetailView(Long articleId, Long userId) {
  136. ArticleDetailView detailView = articleMapper.getArticleDetailById(articleId);
  137. if (userId != null) {
  138. Optional.ofNullable(articleUserMarkMapper.selectOne(Wrappers.lambdaQuery(ArticleUserMark.class)
  139. .eq(ArticleUserMark::getUserId, userId)
  140. .eq(ArticleUserMark::getArticleId, articleId)
  141. .last("limit 1"))).ifPresentOrElse(mark -> {
  142. detailView.setIsDz(mark.getIsDz());
  143. detailView.setIsCol(mark.getIsCol());
  144. }, () -> {
  145. detailView.setIsDz(false);
  146. detailView.setIsCol(false);
  147. });
  148. }
  149. return detailView;
  150. }
  151. @Override
  152. public void getStudentIdentity(User user, String code) throws Exception {
  153. weChatService.getMiniStudentIdentity(user.getOpenId(), code);
  154. }
  155. @Override
  156. public String generateSchema(MiniSchemaReq req) throws Exception {
  157. //跳转路径
  158. req.setPath("pages/index/index");
  159. String query = StrUtil.EMPTY;
  160. if (StrUtil.isNotBlank(req.getDsCode())) {
  161. query = "dsCode=" + req.getDsCode();
  162. }
  163. //调用微信小程序接口
  164. String accessToken = weChatService.getAccessToken(certMiniConfig.getAppId());
  165. TargetAppletSchemeReq targetAppletSchemeReq = new TargetAppletSchemeReq();
  166. targetAppletSchemeReq.setExpireType(0l);
  167. targetAppletSchemeReq.setExpireTime((System.currentTimeMillis() / 1000) + Times.second_per_day);
  168. targetAppletSchemeReq.setIsExpired(false);
  169. TargetAppletSchemeReq.JumpWxa jumpWxa = new TargetAppletSchemeReq.JumpWxa(req.getPath(), query);
  170. targetAppletSchemeReq.setJumpWxa(jumpWxa);
  171. String miniSchema = weChatService.generateSchema(accessToken, targetAppletSchemeReq);
  172. return miniSchema;
  173. }
  174. @Override
  175. public byte[] generateCode(MiniSchemaReq req) throws Exception {
  176. req.setPath("pages/index/index");
  177. //调用微信小程序接口
  178. if (StrUtil.isNotBlank(req.getDsCode())) {
  179. req.setPath(req.getPath() + "?dsCode=" + req.getDsCode());
  180. }
  181. String accessToken = weChatService.getAccessToken(certMiniConfig.getAppId());
  182. return weChatService.generateCode(accessToken, req.getPath());
  183. }
  184. public void updateArticleMarkNum(Integer type, Long articleId, Integer offset) {
  185. Integer success = 0;
  186. while (success != 1) {
  187. //文章累计点赞数、收藏数
  188. Article article = articleMapper.selectById(articleId);
  189. if (article == null) {
  190. break;
  191. }
  192. Integer dzNum = article.getDzNum();
  193. Integer colNum = article.getColNum();
  194. if (type == 1) {
  195. success = articleMapper.updateDzNum(articleId, dzNum, offset);
  196. } else {
  197. success = articleMapper.updateColNum(articleId, colNum, offset);
  198. }
  199. }
  200. }
  201. private void sendGptMirrorImageNumIfPopularizeMini(Long userId, String appId) {
  202. if (StrUtil.equals(tgMiniConfig.getAppId(), appId)) {
  203. MiniPopularizeUser user = new MiniPopularizeUser();
  204. user.setUserId(userId);
  205. user.setNum(5);
  206. try {
  207. miniPopularizeUserMapper.insert(user);
  208. } catch (DuplicateKeyException e) {
  209. }
  210. }
  211. }
  212. }