diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index 894a2231..a70bc51b 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -51,7 +51,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify", "/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease", "/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify", - "/notification","/api/account/activateNewEmail" + "/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback" ); @Override diff --git a/src/main/java/com/ai/da/common/task/AccountTask.java b/src/main/java/com/ai/da/common/task/AccountTask.java index 8b57b0f0..cfc65fd4 100644 --- a/src/main/java/com/ai/da/common/task/AccountTask.java +++ b/src/main/java/com/ai/da/common/task/AccountTask.java @@ -19,7 +19,7 @@ public class AccountTask { /** * 每周日晚上刷新 年付用户、月付用户的积分 */ - @Scheduled(cron = "59 59 23 ? * SUN") +// @Scheduled(cron = "59 59 23 ? * SUN") // @Scheduled(cron = "59 59 23 * * ?") public void refreshCreditsMonthly() { log.info("每周日晚11:59:59刷新付费用户积分为 6000"); @@ -33,7 +33,7 @@ public class AccountTask { } // 每天凌晨0点执行一次 - @Scheduled(cron = "0 0 0 * * ?") +// @Scheduled(cron = "0 0 0 * * ?") public void cancelActivityBenefits() { // 1、查询当前所有参与了活动且过期的用户 List accountList = accountService.getExpiredUserBySystemUser(4); @@ -46,7 +46,7 @@ public class AccountTask { } // 每天检测正式用户到期情况,每天凌晨0点执行 - @Scheduled(cron = "0 0 0 * * ?") +// @Scheduled(cron = "0 0 0 * * ?") public void paidUserToVisitor() { // 1、查询当前已过期正式用户或试用用户 List accountList = accountService.getExpiredUserBySystemUser(1); diff --git a/src/main/java/com/ai/da/common/websocket/NotificationConnection.java b/src/main/java/com/ai/da/common/websocket/NotificationConnection.java index 7dc7c7da..595f268a 100644 --- a/src/main/java/com/ai/da/common/websocket/NotificationConnection.java +++ b/src/main/java/com/ai/da/common/websocket/NotificationConnection.java @@ -1,7 +1,10 @@ package com.ai.da.common.websocket; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson2.JSON; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.RequestParam; import javax.websocket.*; import javax.websocket.server.PathParam; @@ -16,54 +19,55 @@ import java.util.concurrent.ConcurrentHashMap; @Slf4j public class NotificationConnection { - static Map sessionMap = new ConcurrentHashMap<>(); + //连接超时 + public static final long MAX_TIME_OUT = 3 * 60 * 1000; private Session session; + private Long userId; // 这里用ConcurrentHashMap 因为他是一个线程安全的Map private static ConcurrentHashMap websockets = new ConcurrentHashMap<>(); - //连接建立时执行的操作 - /*@OnOpen - public void onOpen(Session session){ - sessionMap.put(session.getId(),session); - log.info("websocket is open, sessionId: {}",session.getId()); - }*/ @OnOpen public void onOpen(Session session, @PathParam("id") String id) { // 接收到前端传来的用户ID this.session = session; + this.userId = Long.valueOf(id); + this.session.setMaxIdleTimeout(MAX_TIME_OUT); websockets.put(Long.parseLong(id), this); //将ID作为key,当前的对象作为Value log.info("【建立连接】 用户为:{}", this.session); log.info("【建立连接】 用户Id为:{}", id); - log.info("【建立连接】 总数为:{}", websockets.size()); + log.info("【当前连接总数】 为:{}", websockets.size()); } @OnClose - public void onClose() { - websockets.remove(this); // 将当前的对象从集合中删除 - log.info("【连接断开】 用户为:{}", this.session); -// log.info("【连接断开】 总数为:{}", websockets.size()); + public void onClose(CloseReason reason) { + log.info("【连接断开】 用户为:{}, sessionId: {}, 原因为{}", this.userId, this.session.getId(), reason); + log.info("【当前连接总数】 为:{}", websockets.size()); + websockets.remove(this.userId); // 将当前的对象从集合中删除 + } + + /** + * 错误时调用 + * @param throwable 异常 + */ + @OnError + public void onError(Throwable throwable) { + log.info("【连接异常】 用户为:{} , sessionId: {}", this.userId, this.session.getId(), throwable); + websockets.remove(this.userId); // 将当前的对象从集合中删除 + log.info("【当前连接总数】 为:{}", websockets.size()); } //收到了客户端消息执行的操作 @OnMessage - public void onMessage(String text){ - log.info("收到了一条消息:"+text); + public void onMessage(@RequestParam String text){ + Map textMap = JSONObject.parseObject(text, Map.class); + log.info("收到了一条来自 {} 的消息:{}, sessionId:{}", this.userId, textMap.get("text"), this.session.getId()); // return "已收到你的消息"; - } - /*//连接关闭的时候执行的操作 - @OnClose - public void onClose(Session session){ - sessionMap.remove(session.getId()); - log.info("websocket is close, sessionId: {}",session.getId()); - } - - public void sendMsg(String message) throws IOException { - for(String key:sessionMap.keySet()){ - sessionMap.get(key).getBasicRemote().sendText(message); + if (textMap.get("text").equals("PING")){ + sendMsg(JSON.toJSONString("PONG"), this.userId); } - }*/ + } - public void sendMsg(String message, Long userId) throws IOException { + public void sendMsg(String message, Long userId) { if (userId == null) { // 如果等于null则证明是群发 // 获取当前Map的一个迭代器,遍历Map的方式有很多种,看着来 // 这个就是遍历这个集合的过程.... @@ -73,7 +77,11 @@ public class NotificationConnection { NotificationConnection webSocket = entry.getValue(); // 接下来就是遍历群发 log.info("广播消息 【给用户】 :{}发送消息【{}】", webSocket, message); - webSocket.session.getBasicRemote().sendText(message); // 发送!!!!!!!!! + try { + webSocket.session.getBasicRemote().sendText(message); // 发送!!!!!!!!! + } catch (IOException e) { + log.error("Failed to send message to session {}: {}", webSocket.session.getId(), e.getMessage()); + } } } else { // 如果不是群发,则判断ID,其余步骤一致 // 获取当前Map的一个迭代器,遍历Map的方式有很多种,看着来 diff --git a/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java b/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java index df5b252b..9feb56a1 100644 --- a/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java +++ b/src/main/java/com/ai/da/common/websocket/config/WebSocketConfig.java @@ -6,8 +6,6 @@ import org.springframework.web.socket.server.standard.ServerEndpointExporter; /** * Configuration of WebSocket - * - * @author db1995 */ @Configuration public class WebSocketConfig { diff --git a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java index 7953b74a..ecc8fdd1 100644 --- a/src/main/java/com/ai/da/controller/ConvenientInquiryController.java +++ b/src/main/java/com/ai/da/controller/ConvenientInquiryController.java @@ -122,14 +122,16 @@ public class ConvenientInquiryController { @ApiOperation("试用用户到正式用户的转化率") @GetMapping("/conversionRate") - public Response> conversionRate() { - return Response.success(convenientInquiryService.conversionRate()); + public Response> conversionRate(@ApiParam(value = "startTime") @RequestParam(required = false) @Nullable String startTime, + @ApiParam(value = "endTime") @RequestParam(required = false) @Nullable String endTime) { + return Response.success(convenientInquiryService.conversionRate(startTime, endTime)); } @ApiOperation("试用用户国家/城市分布") @GetMapping("/trialUserCountry") - public Response>> trialUserCountry() { - return Response.success(convenientInquiryService.trialUserCountry()); + public Response>> trialUserCountry(@ApiParam(value = "startTime") @RequestParam(required = false) @Nullable String startTime, + @ApiParam(value = "endTime") @RequestParam(required = false) @Nullable String endTime) { + return Response.success(convenientInquiryService.trialUserCountry(startTime, endTime)); } @ApiOperation("添加用户") diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java index 0e7f95fd..e077fa8c 100644 --- a/src/main/java/com/ai/da/controller/ThirdPartyController.java +++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.security.cert.X509Certificate; @@ -114,4 +115,10 @@ public class ThirdPartyController { public Response updateNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) { return Response.success(accountService.updateNoLoginRequiredNew(noLoginRequiredDTO, request)); } + + @CrossOrigin + @GetMapping("/auth/google_callback") + public Response googleCallback(@RequestParam("code") String code, HttpSession session) { + return Response.success(accountService.googleCallback(code, session)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java b/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java index 65709299..d1de236e 100644 --- a/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java +++ b/src/main/java/com/ai/da/mapper/primary/TrialOrderMapper.java @@ -3,6 +3,7 @@ package com.ai.da.mapper.primary; import com.ai.da.common.config.mybatis.plus.CommonMapper; import com.ai.da.mapper.primary.entity.TrialOrder; +import java.util.List; import java.util.Map; /** @@ -15,6 +16,4 @@ public interface TrialOrderMapper extends CommonMapper { Map countOfficialUser(); - - } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java new file mode 100644 index 00000000..5742f0ec --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java @@ -0,0 +1,30 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("account_extend") +public class AccountExtend implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long accountId; + + private String authType; + + private String auth; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java new file mode 100644 index 00000000..312fa810 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java @@ -0,0 +1,17 @@ +package com.ai.da.mapper.primary.entity; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; + +import java.util.Date; +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountExtendMapper extends CommonMapper { + + +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java b/src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java new file mode 100644 index 00000000..b15410e8 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java @@ -0,0 +1,10 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +@Data +public class GoogleUser { + private String id; + private String email; + private String name; +} diff --git a/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java b/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java index b0713077..0b087213 100644 --- a/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java +++ b/src/main/java/com/ai/da/model/dto/UserDesignStatisticDTO.java @@ -15,6 +15,8 @@ public class UserDesignStatisticDTO { private String isTrial; + private String credits; + private String trialOrderId; private String title; diff --git a/src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java b/src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java new file mode 100644 index 00000000..f742d3c0 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java @@ -0,0 +1,10 @@ +package com.ai.da.model.vo; + +import lombok.Data; + +@Data +public class GoogleTokenResponse { + private String accessToken; + private String idToken; + +} diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 5db57bc8..bd9c99b4 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import java.util.List; import java.util.Map; @@ -181,4 +182,8 @@ public interface AccountService extends IService { String updateNoLoginRequiredNew(NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request); void halfPricePromotion(); + + String googleCallback(String code, HttpSession session); + + List getPaidCustomerEmail(); } diff --git a/src/main/java/com/ai/da/service/ConvenientInquiryService.java b/src/main/java/com/ai/da/service/ConvenientInquiryService.java index 49424df6..fa4210f4 100644 --- a/src/main/java/com/ai/da/service/ConvenientInquiryService.java +++ b/src/main/java/com/ai/da/service/ConvenientInquiryService.java @@ -32,9 +32,9 @@ public interface ConvenientInquiryService extends IService { Map> getActiveUserFunc(String startTime, String endTime, List ids); - Map conversionRate(); + Map conversionRate(String startTime, String endTime); - Map> trialUserCountry(); + Map> trialUserCountry(String startTime, String endTime); Boolean addUser(AccountAddDTO accountAddDTO); diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 0cf6e66e..2d826c03 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -34,10 +34,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.sql.DataSource; import java.math.BigDecimal; import java.sql.Connection; @@ -62,6 +64,9 @@ public class AccountServiceImpl extends ServiceImpl impl @Resource private AccountMapper accountMapper; + @Resource + private AccountExtendMapper accountExtendMapper; + @Resource private JWTTokenHelper jwtTokenHelper; @@ -571,6 +576,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setIsBeginner(1); account.setSystemUser(3); account.setValidStartTime(System.currentTimeMillis()); + account.setCountry(accountTrialDTO.getCountry()); if (link) { account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); } else { @@ -583,6 +589,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setUserPassword("Third-000000"); account.setUserEmail(trialOrder.getEmail()); account.setLanguage(Language.ENGLISH.name()); + account.setCountry(accountTrialDTO.getCountry()); account.setValidStartTime(System.currentTimeMillis()); if (link) { account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); @@ -1464,6 +1471,31 @@ public class AccountServiceImpl extends ServiceImpl impl } } + private static final String QUERY_PAID_CUSTOMER_EMAIL = "SELECT distinct c.email " + + "FROM `pmr_wc_order_stats` o " + + "inner join `pmr_wc_customer_lookup` c " + + "on o.customer_id = c.customer_id " + + "and o.net_total in (5000, 500, 250) " + + "and o.`status` != 'wc-failed' " + + "and c.email not in ('1779019091@qq.com', 'xupei3360@163.com', '1627315083@qq.com', 'gigiwu33@hotmail.com')"; + + public List getPaidCustomerEmail(){ + List paidCustomerEmail = new ArrayList<>(); + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_PAID_CUSTOMER_EMAIL)) { + try (ResultSet queryOrderResultSet = preparedStatement.executeQuery()) { + while (queryOrderResultSet.next()) { + paidCustomerEmail.add(queryOrderResultSet.getString("email")); + } + } + } catch (Exception e) { + // 记录异常并处理 + e.printStackTrace(); +// return null; + } + return paidCustomerEmail; + } + // 收集调查问卷的信息 @Override @Transactional(rollbackFor = Exception.class) @@ -1822,4 +1854,82 @@ public class AccountServiceImpl extends ServiceImpl impl log.info("邮箱绑定更改完成,用户id:{},新邮箱:{}", accountId, newMailbox); } + @Override + public String googleCallback(String code, HttpSession session) { + try { + log.info("code:" + code); + // 使用 code 获取 Google 用户信息 + GoogleUser googleUser = getGoogleUserFromCode(code); + log.info("googleUser:" + JSON.toJSONString(googleUser)); + + // 检查数据库中是否已有该用户 +// QueryWrapper qw = new QueryWrapper<>(); +// qw.lambda().eq(AccountExtend::getAuth, googleUser.getId()); +// List accountExtends = accountExtendMapper.selectList(qw); +// Account existingUser = findUserByGoogleId(googleUser.getId()); + return "Login successful"; +// if (CollectionUtil.isNotEmpty(accountExtends)) { +// // 用户已存在,直接登录 +//// session.setAttribute("user", existingUser); +// return "Login successful"; +// } else { +// // 用户不存在,创建新用户(自动注册) +//// User newUser = googleAuthService.registerNewUser(googleUser); +//// session.setAttribute("user", newUser); +// return "Registration and login successful"; +// } + } catch (Exception e) { + return "Error processing Google login: " + e.getMessage(); + } + } + + private static final String TOKEN_URL = "https://oauth2.googleapis.com/token"; + private static final String USER_INFO_URL = "https://www.googleapis.com/oauth2/v3/userinfo"; + private static final String CLIENT_ID = "194770296147-njd68pm7tnapgonkj2h48mhf63n15n3f.apps.googleusercontent.com"; + private static final String CLIENT_SECRET = "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"; + private static final String REDIRECT_URI = "https://develop.api.aida.com.hk/api/third/party/auth/google_callback"; + + public GoogleUser getGoogleUserFromCode(String code) { + // Step 1: Exchange code for access_token + String accessToken = getAccessToken(code); + log.info("accessToken" + accessToken); + + // Step 2: Use access_token to get Google User info + return getGoogleUserInfo(accessToken); + } + + private String getAccessToken(String code) { + RestTemplate restTemplate = new RestTemplate(); + Map params = new HashMap<>(); + params.put("client_id", CLIENT_ID); + params.put("client_secret", CLIENT_SECRET); + params.put("redirect_uri", REDIRECT_URI); + params.put("grant_type", "authorization_code"); + params.put("code", code); + + // 使用 RestTemplate 发起请求以获取 access_token + GoogleTokenResponse response = restTemplate.postForObject(TOKEN_URL, params, GoogleTokenResponse.class); + return response.getAccessToken(); + } + + private GoogleUser getGoogleUserInfo(String accessToken) { + RestTemplate restTemplate = new RestTemplate(); + String url = USER_INFO_URL + "?access_token=" + accessToken; + return restTemplate.getForObject(url, GoogleUser.class); + } + +// public User findUserByGoogleId(String googleId) { +// // 从数据库中根据 Google ID 查找用户 +// return userRepository.findByGoogleId(googleId); +// } + +// public User registerNewUser(GoogleUser googleUser) { +// // 创建并保存新用户 +// User newUser = new User(); +// newUser.setGoogleId(googleUser.getId()); +// newUser.setEmail(googleUser.getEmail()); +// newUser.setUsername(googleUser.getName()); +// return userRepository.save(newUser); +// } + } diff --git a/src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java b/src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java index 2bad5969..819dc95d 100644 --- a/src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java @@ -392,9 +392,15 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl conversionRate() { + public Map conversionRate(String startTime, String endTime) { QueryWrapper queryWrapper = new QueryWrapper<>(); + if (!StringUtils.isNullOrEmpty(startTime)){ + queryWrapper.gt("create_time", startTime); + } + if (!StringUtils.isNullOrEmpty(endTime)){ + queryWrapper.lt("create_time", endTime); + } // 获取试用用户总数 queryWrapper.select("count(distinct email) as count"); @@ -402,22 +408,40 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl officialMaps = trialOrderMapper.countOfficialUser(); - Long trialToOfficial = officialMaps.get("count"); + List paidCustomerEmail = accountService.getPaidCustomerEmail(); + QueryWrapper qw = new QueryWrapper<>(); + if (!StringUtils.isNullOrEmpty(startTime)){ + qw.gt("create_time", startTime); + } + if (!StringUtils.isNullOrEmpty(endTime)){ + qw.lt("create_time", endTime); + } + qw.in("email", paidCustomerEmail); + List paidTrialUsers = trialOrderMapper.selectList(qw); + +// Map officialMaps = trialOrderMapper.countOfficialUser(); +// Long trialToOfficial = officialMaps.get("count"); // 计算转化率 - HashMap resp = new HashMap<>(); + HashMap resp = new HashMap<>(); resp.put("trialUserCount", totalTrials.floatValue()); - resp.put("trialToOfficialCount", trialToOfficial.floatValue()); - resp.put("conversionRate", new BigDecimal(trialToOfficial).divide(new BigDecimal(totalTrials), 2, RoundingMode.HALF_UP).floatValue()); - + resp.put("trialToOfficialCount", (float) paidTrialUsers.size()); + resp.put("conversionRate", new BigDecimal(paidTrialUsers.size()).divide(new BigDecimal(totalTrials), 6, RoundingMode.HALF_UP).floatValue()); + resp.put("paidTrialUser", paidTrialUsers); return resp; } // 试用用户地区统计 - public Map> trialUserCountry() { + public Map> trialUserCountry(String startTime, String endTime) { QueryWrapper queryWrapper = new QueryWrapper<>(); + if (!StringUtils.isNullOrEmpty(startTime)){ + queryWrapper.gt("create_time", startTime); + } + if (!StringUtils.isNullOrEmpty(endTime)){ + queryWrapper.lt("create_time", endTime); + } + queryWrapper.select("country, count(id) as count") .groupBy("country"); List> countryCount = trialOrderMapper.selectMaps(queryWrapper); diff --git a/src/main/java/com/ai/da/service/impl/MessageCenterServiceImpl.java b/src/main/java/com/ai/da/service/impl/MessageCenterServiceImpl.java index f6c1b874..74a19386 100644 --- a/src/main/java/com/ai/da/service/impl/MessageCenterServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/MessageCenterServiceImpl.java @@ -204,11 +204,7 @@ public class MessageCenterServiceImpl extends ServiceImpl select d.*,c.id trialOrderId, c.title,c.surname,c.given_name,c.country,c.occupation,c.create_time from ( - select b.account_id,count(b.account_id) design_times,a.user_name,a.user_email,a.is_trial + select b.account_id,count(b.account_id) design_times,a.user_name,a.user_email,a.is_trial,a.credits from t_account a left join t_design b on a.id = b.account_id