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 d11877e0..32b98fb4 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 @@ -50,7 +50,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/third/party/existNoLoginRequired","/api/third/party/getRedirectUrl", "/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/account/designWorksRegister" + "/api/account/designWorksRegister","/api/account/questionnaire" ); @Override diff --git a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java index 1e7b4a1d..2b8a832b 100644 --- a/src/main/java/com/ai/da/common/utils/SendEmailUtil.java +++ b/src/main/java/com/ai/da/common/utils/SendEmailUtil.java @@ -450,6 +450,106 @@ public class SendEmailUtil { } } + private final static Long QUESTIONNAIRE_FEEDBACK_EN_ID = 124151L; + private final static Long QUESTIONNAIRE_FEEDBACK_CN_ID = 124156L; + public static void questionnaireRelatedNotify(String userName, String email, String language){ + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(CODE_CREATE_SEND_ADDRESS); + req.setDestination(new String[]{email}); + + // 根据邮件类型设置不同的主题和模板 + Template template = new Template(); + String subject = "Thank You for Completing the AiDA System Survey"; + template.setTemplateID(QUESTIONNAIRE_FEEDBACK_EN_ID); + if (language.equals("CN")) { + subject = "感谢您完成AiDA系统问卷调查"; + template.setTemplateID(QUESTIONNAIRE_FEEDBACK_CN_ID); + } + + JSONObject parameter = new JSONObject(); + parameter.put("userName", userName); + + template.setTemplateData(parameter.toJSONString()); + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + + + private final static Long NEW_USER_PAYMENT_NOTIFICATION_EN = 0L; + private final static Long NEW_USER_PAYMENT_NOTIFICATION_CN = 0L; + private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_EN = 0L; + private final static Long RENEWAL_NOTIFICATION_FOR_OLD_USER_CN = 0L; + + public static void notificationForPaidUser(String receiverAddress, int emailType, String country){ + try { + // 实例化一个认证对象 + Credential cred = new Credential(SECRET_ID, SECRET_KEy); + HttpProfile httpProfile = new HttpProfile(); + httpProfile.setEndpoint("ses.tencentcloudapi.com"); + ClientProfile clientProfile = new ClientProfile(); + clientProfile.setHttpProfile(httpProfile); + SesClient client = new SesClient(cred, "ap-hongkong", clientProfile); + SendEmailRequest req = new SendEmailRequest(); + req.setFromEmailAddress(SEND_ADDRESS); + req.setDestination(new String[]{receiverAddress}); + + // 根据邮件类型设置不同的主题和模板 + String subject = ""; + Template template = new Template(); + switch (emailType) { + // 新用户 + case 1: + subject = "Welcome to AiDA!"; + if (country.equals("China")) { + template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_CN); + }else { + template.setTemplateID(NEW_USER_PAYMENT_NOTIFICATION_EN); + } + break; + // 续费用户 + case 2: + subject = "Account renewal notification"; + if (country.equals("China")) { + template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_CN); + }else { + template.setTemplateID(RENEWAL_NOTIFICATION_FOR_OLD_USER_EN); + } + break; + default: + break; + +// template.setTemplateData(buildNotificationData(trialOrder, link)); + } + + req.setSubject(subject); + req.setTemplate(template); + + // 发送邮件 + SendEmailResponse resp = client.SendEmail(req); + log.info("短信发送结果res###{}", SendEmailResponse.toJsonString(resp)); + } catch (TencentCloudSDKException e) { + log.info("邮件发送失败###{}", e.toString()); + throw new BusinessException("failed.to.send.mail"); + } + } + public static Boolean designWorksRegister(String userEmail, String randomVerifyCode) { try { diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index 48769e5c..4b9087e3 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -167,4 +167,14 @@ public class AccountController { public Response designWorksRegisterCode(@Valid @RequestBody AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { return Response.success(accountService.designWorksRegisterCode(accountDesignWorksRegisterDTO)); } + + /** + * 填写调查问卷 + * @return + */ + @ApiOperation(value = "填写调查问卷") + @PostMapping("/questionnaire") + public Response questionnaire(@Valid @RequestBody String questionnaireInfo){ + return Response.success(accountService.collectQuestionnaires(questionnaireInfo)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java b/src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java new file mode 100644 index 00000000..844b3bd4 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/QuestionnaireMapper.java @@ -0,0 +1,7 @@ +package com.ai.da.mapper.primary; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; +import com.ai.da.mapper.primary.entity.Questionnaire; + +public interface QuestionnaireMapper extends CommonMapper { +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java b/src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java new file mode 100644 index 00000000..d6daff5b --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/Questionnaire.java @@ -0,0 +1,18 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +@Data +@TableName("t_questionnaire") +public class Questionnaire extends BaseEntity{ + + /** + * 用户所填调查问卷结果 + */ + private String questionnaireInfo; + /** + * 调查问卷标题 + */ + private String title; +} diff --git a/src/main/java/com/ai/da/model/vo/QuestionnaireVO.java b/src/main/java/com/ai/da/model/vo/QuestionnaireVO.java new file mode 100644 index 00000000..c1aeff6a --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/QuestionnaireVO.java @@ -0,0 +1,57 @@ +package com.ai.da.model.vo; + +import lombok.Data; +import java.util.List; + +@Data +public class QuestionnaireVO { + /** + * 用户名 + */ + private String userName; + /** + * 用户性别 + */ + private String gender; + /** + * 职业 + */ + private String occupation; + /** + * 国家 + */ + private String country; + /** + * 电子邮件 + */ + private String email; + /** + * 年龄区间 + */ + private String age; + /** + * How has AiDA been helpful to you? + */ + private List helpful; + /** + * What do you think AiDA should improve? + */ + private List improve; + /** + * Will you subscribe to AiDA 3.0 + */ + private String isSubscribe; + /** + * If NO, please share why: + */ + private List reasonForNotSubscribe; + /** + * Are you currently using any design tools? + */ + private String designTools; + /** + * 用户所选语言 + */ + private String language; + +} diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 496275ce..f6254484 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -134,4 +134,6 @@ public interface AccountService extends IService { Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); + + Boolean collectQuestionnaires(String questionnaireInfo); } diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index e6179e22..cf733baf 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -30,4 +30,6 @@ public interface CreditsService extends IService { Boolean creditsPreDeduction(CreditsEventsEnum event, Integer num); void taskCreditsDeduction(Long accountId, String taskId); + + CreditsDetail getByAccountIdAndChangeEvent(Long accountId, String changeEvent, String changedCredits); } 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 6a6fb2f0..3d41c2a2 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -3,31 +3,31 @@ package com.ai.da.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.ai.da.common.config.exception.BusinessException; import com.ai.da.common.context.UserContext; -import com.ai.da.common.enums.LoginTypeEnum; import com.ai.da.common.enums.AuthenticationOperationTypeEnum; +import com.ai.da.common.enums.LoginTypeEnum; import com.ai.da.common.response.ResultEnum; import com.ai.da.common.security.jwt.JWTTokenHelper; import com.ai.da.common.utils.*; import com.ai.da.mapper.primary.AccountMapper; +import com.ai.da.mapper.primary.QuestionnaireMapper; import com.ai.da.mapper.primary.TrialOrderMapper; -import com.ai.da.mapper.primary.entity.Account; -import com.ai.da.mapper.primary.entity.AccountLoginLog; -import com.ai.da.mapper.primary.entity.TrialOrder; +import com.ai.da.mapper.primary.entity.*; import com.ai.da.model.dto.*; import com.ai.da.model.enums.AutoApproved; import com.ai.da.model.enums.Language; import com.ai.da.model.vo.AccountLoginVO; import com.ai.da.model.vo.AccountPreLoginVO; import com.ai.da.model.vo.AuthPrincipalVo; -import com.ai.da.service.AccountLoginLogService; -import com.ai.da.service.AccountService; -import com.ai.da.service.LibraryService; -import com.ai.da.service.UserLikeGroupService; +import com.ai.da.model.vo.QuestionnaireVO; +import com.ai.da.service.*; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import io.netty.util.internal.StringUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -36,9 +36,16 @@ import org.springframework.util.Assert; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.sql.DataSource; import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.time.Instant; import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.List; @@ -72,6 +79,11 @@ public class AccountServiceImpl extends ServiceImpl impl @Resource private TrialOrderMapper trialOrderMapper; + @Resource + private QuestionnaireMapper questionnaireMapper; + + @Resource + private CreditsService creditsService; @Override @Transactional(rollbackFor = Exception.class) @@ -264,7 +276,7 @@ public class AccountServiceImpl extends ServiceImpl impl if (!verifyCode.equals(accountDTO.getEmailVerifyCode())) { throw new BusinessException("verification.code.error", ResultEnum.PROMPT.getCode()); } - }else { + } else { updatePwdByEmail(accountDTO.getPassword(), accountDTO.getEmail()); } return Boolean.TRUE; @@ -493,7 +505,7 @@ public class AccountServiceImpl extends ServiceImpl impl if (CollectionUtil.isNotEmpty(accountList)) { if (accountList.get(0).getIsTrial() == 1) { throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); - }else { + } else { Account account = accountList.get(0); if (null == account.getValidEndTime() || account.getValidEndTime() > System.currentTimeMillis()) { throw new BusinessException("The email has already been registered", ResultEnum.PROMPT.getCode()); @@ -523,11 +535,11 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidStartTime(System.currentTimeMillis()); if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); - }else { + } else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); } accountMapper.updateById(account); - }else { + } else { account.setUserName(trialOrder.getUserName()); account.setUserPassword("Third-000000"); account.setUserEmail(trialOrder.getEmail()); @@ -535,7 +547,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidStartTime(System.currentTimeMillis()); if (link) { account.setValidEndTime(Instant.now().plus(14, ChronoUnit.DAYS).toEpochMilli()); - }else { + } else { account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); } account.setCreateDate(new Date()); @@ -550,7 +562,7 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2); if (trialOrder.getCountry().equals("China")) { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); - }else { + } else { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), link); } } @@ -584,7 +596,7 @@ public class AccountServiceImpl extends ServiceImpl impl account.setValidStartTime(System.currentTimeMillis()); account.setValidEndTime(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli()); accountMapper.updateById(account); - }else { + } else { account.setUserName(trialOrder.getUserName()); account.setUserPassword("Third-000000"); account.setUserEmail(trialOrder.getEmail()); @@ -603,7 +615,7 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendCustomEmail("kaicpang.pang@connect.polyu.hk", null, trialOrder,2, trialOrder.getCountry()); if (trialOrder.getCountry().equals("China")) { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); - }else { + } else { SendEmailUtil.sendCustomEmail(account.getUserEmail(), null, trialOrder, 3, trialOrder.getCountry(), false); } } @@ -707,7 +719,7 @@ public class AccountServiceImpl extends ServiceImpl impl accountMapper.deleteById(accountDelete); userToBeUpdate.setUserName(userName); accountMapper.updateById(userToBeUpdate); - }else { + } else { accountMapper.deleteById(accountDelete); } } @@ -845,7 +857,7 @@ public class AccountServiceImpl extends ServiceImpl impl "                        \n" + "                        \n" + "                            \n" + "                        "; } @@ -889,7 +901,7 @@ public class AccountServiceImpl extends ServiceImpl impl throw new BusinessException("Illegal serial number."); } queryWrapperDelete.lambda().eq(Account::getUserName, "PolyU-SFT-" + noLoginRequiredDTO.getId()); - }else { + } else { queryWrapperDelete.lambda().like(Account::getBrowserIdentifiers, ipAddress); } List accountList = accountMapper.selectList(queryWrapperDelete); @@ -923,7 +935,7 @@ public class AccountServiceImpl extends ServiceImpl impl // SendEmailUtil.sendUpgradeNotification(account, null, 1); if (account.getLanguage().equals(Language.CHINESE_SIMPLIFIED.name())) { SendEmailUtil.sendUpgradeNotification(account, null, 0); - }else { + } else { // 英文 SendEmailUtil.sendUpgradeNotification(account, null, 1); } @@ -937,7 +949,7 @@ public class AccountServiceImpl extends ServiceImpl impl // 未迁移过的进行迁移,注意模特数据迁移打点信息以及转换模特格式 } - public void updateCredits(Long accountId, String value){ + public void updateCredits(Long accountId, String value) { Account account = new Account(); account.setId(accountId); account.setCredits(new BigDecimal(value)); @@ -954,7 +966,7 @@ public class AccountServiceImpl extends ServiceImpl impl } String randomVerifyCode = RandomsUtil.generateVerifyCode(100000L, 999999L); - LocalCacheUtils.setVerifyCodeCache("DesignWorksRegister"+ "_" + accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); + LocalCacheUtils.setVerifyCodeCache("DesignWorksRegister" + "_" + accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); Boolean b = SendEmailUtil.designWorksRegister(accountDesignWorksRegisterDTO.getUserEmail(), randomVerifyCode); if (!b) { @@ -966,7 +978,7 @@ public class AccountServiceImpl extends ServiceImpl impl @Override public AccountLoginVO designWorksRegisterCode(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO) { - String verifyCode = LocalCacheUtils.getVerifyCodeCache("DesignWorksRegister"+ "_" + accountDesignWorksRegisterDTO.getUserEmail()); + String verifyCode = LocalCacheUtils.getVerifyCodeCache("DesignWorksRegister" + "_" + accountDesignWorksRegisterDTO.getUserEmail()); if (StringUtils.isBlank(verifyCode)) { throw new BusinessException("the.verification.code.has.expired", ResultEnum.PROMPT.getCode()); } @@ -996,4 +1008,195 @@ public class AccountServiceImpl extends ServiceImpl impl response.setSystemUser(account.getSystemUser()); return response; } + + private static final String QUERY_ORDER = "SELECT * FROM pmr_wc_order_stats " + + "WHERE status = 'wc-processing' AND date_paid > '2024-06-10 00:00:00'" + + " ORDER BY order_id DESC "; + + private static final String QUERY_CUSTOMER_EMAIL = "SELECT username, email FROM pmr_wc_customer_lookup " + + "WHERE customer_id = ? "; + private static final String UPDATE_ORDER_STATUS = "UPDATE pmr_wc_order_stats " + + "SET status = 'wc-complete' , date_completed = ? " + + "WHERE order_id = ?"; + + private static final DataSource dataSource; + + static { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl("jdbc:mysql://code-create.com.hk:3306/db1nfvsgmjp3b8"); + config.setUsername("uafqtz4gsvfrw"); + config.setPassword("aida123456."); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + dataSource = new HikariDataSource(config); + } + + /** + * 为Code-Create的用户延长有效期 + * + * @return null + */ + public String extendValidityForCC() { + try (Connection connection = dataSource.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(QUERY_ORDER)) { +// preparedStatement.setString(1, "someCondition"); + try (ResultSet queryOrderResultSet = preparedStatement.executeQuery()) { + while (queryOrderResultSet.next()) { + /* 处理结果集 */ + int orderId = queryOrderResultSet.getInt("order_id"); + int customerId = queryOrderResultSet.getInt("customer_id"); + double totalSales = queryOrderResultSet.getDouble("total_sales"); + String email = ""; + String userName = ""; + // 1、查pmr_wc_customer_lookup表;确认当前订单对应的用户邮箱 + PreparedStatement preparedQueryEmail = connection.prepareStatement(QUERY_CUSTOMER_EMAIL); + preparedQueryEmail.setInt(1, customerId); + try (ResultSet queryEmailResultSet = preparedQueryEmail.executeQuery()) { + if (queryEmailResultSet.next()) { + email = queryEmailResultSet.getString("email"); + userName = queryEmailResultSet.getString("username"); + } else { + log.error("未知错误。code-create的用户表中没有付费用户的信息"); + throw new BusinessException("user info missing"); + } + } + + // 2、查t_account表中是否有该用户 + // 2.1 没有 新建用户 + Account userInfo = null; + Long validEndTime = null; + // 标志当前用户是不是新用户 + Boolean flag = Boolean.FALSE; + try { + // 不是新用户 直接延长使用期限 + userInfo = getOneByEmail(email); + } catch (BusinessException e) { + // 通过邮箱找不到用户 说明是新用户 => 创建用户 + flag = Boolean.TRUE; + } + if (!Objects.isNull(userInfo) && !Objects.isNull(userInfo.getValidEndTime())) + validEndTime = userInfo.getValidEndTime(); + + // 2、获取当前续费费用能延长多长时间 + Account account = extendValidity(validEndTime, totalSales); + + if (flag) { + // 是新用户 => 新增一条数据 + Boolean b = addUser(new AccountAddDTO(email, StringUtil.isNullOrEmpty(userName) ? email.substring(0, email.indexOf("@") - 1) : userName, account.getValidStartTime().toString(), account.getValidEndTime().toString(), 0)); + if (b) log.info("付费新用户新增成功!"); + } else { + userInfo.setValidEndTime(account.getValidEndTime()); + baseMapper.updateById(account); + log.info("付费用户续订成功"); + } + + // 3、todo 邮件通知 + // 3.1 判断用户语言 + + // 3.2 将用户信息填到邮件中 + + // 4、更新订单状态和日期 + PreparedStatement preparedUpdateOrder = connection.prepareStatement(UPDATE_ORDER_STATUS); + LocalDateTime localDateTime = LocalDateTime.now(); + String currentTime = localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + + preparedUpdateOrder.setString(1, currentTime); + preparedUpdateOrder.setInt(2, orderId); + int row = preparedUpdateOrder.executeUpdate(); + if (row == 1) log.info("表 pmr_wc_order_stats 订单状态更新成功"); + + + } + } + } catch (Exception e) { + // 记录异常并处理 + e.printStackTrace(); + } + + return null; + } + + private Account extendValidity(Long validEndTime, double totalSales) { + Instant specifiedInstant; + Account account = new Account(); + long epochMilli = Instant.now().toEpochMilli(); + if (!Objects.isNull(validEndTime) && validEndTime > epochMilli) { + // 将 Unix 毫秒级时间戳转换为 Instant + specifiedInstant = Instant.ofEpochMilli(validEndTime); + } else { + specifiedInstant = Instant.now(); + account.setValidStartTime(specifiedInstant.toEpochMilli()); + } + + // 指定时区 + ZoneId zoneId = ZoneId.of("Asia/Shanghai"); + // 将 Instant 转换为 ZonedDateTime,使用指定时区 + ZonedDateTime specifiedDateTime = ZonedDateTime.ofInstant(specifiedInstant, zoneId); + ZonedDateTime validityExtension; + if (totalSales == 500) { + // 一个月 + validityExtension = specifiedDateTime.plusMonths(1); + } else if (totalSales == 5000) { + // 一年 + validityExtension = specifiedDateTime.plusYears(1); + } else { + // 测试 一天 + validityExtension = specifiedDateTime.plusDays(1); + } + // 获取一个月之后的时间的 Unix 毫秒级时间戳 + account.setValidEndTime(validityExtension.toInstant().toEpochMilli()); + return account; + } + + // 收集调查问卷的信息 + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean collectQuestionnaires(String questionnaireInfo) { + log.info("调查问卷详细信息:{}", questionnaireInfo); + QuestionnaireVO questionnaireVO = JSON.parseObject(questionnaireInfo, QuestionnaireVO.class); + String email = questionnaireVO.getEmail(); + // 1、通过邮箱判断当前用户有无系统账号 + Account account; + try { + account = getOneByEmail(email); + } catch (BusinessException e) { + log.info(e.getMessage()); + log.warn("当前用户 {} 在AiDA中没有账号", email); + throw new BusinessException("user.has.no.account",ResultEnum.PROMPT.getCode()); + } + // 2、先判断当前用户是否已经填写过问卷 + CreditsDetail record = creditsService.getByAccountIdAndChangeEvent(account.getId(), "Fill out the questionnaire", "+100"); + if (!Objects.isNull(record)) { + log.info("当前用户 {} 已经填写过问卷", email); + throw new BusinessException("questionnaire.filled.out", ResultEnum.PROMPT.getCode()); + } + + // 3.1、将问卷信息存储到数据库 + Questionnaire questionnaire = new Questionnaire(); + questionnaire.setQuestionnaireInfo(questionnaireInfo); + questionnaire.setTitle("AiDA_3.0 Feedback Survey--06/2024"); + questionnaire.setCreateTime(LocalDateTime.now()); + int insert = questionnaireMapper.insert(questionnaire); + + if (insert == 1) { + // 3.2、更新 t_credits_detail表 + CreditsDetail creditsDetail = new CreditsDetail(); + creditsDetail.setAccountId(account.getId()); + creditsDetail.setChangeEvent("Fill out the questionnaire"); + creditsDetail.setChangedCredits("+100"); + BigDecimal added = account.getCredits().add(new BigDecimal("100")); + creditsDetail.setCredits(added); + creditsDetail.setCreateTime(LocalDateTime.now()); + creditsService.save(creditsDetail); + + // 3.3、更新 t_account 表 + updateCredits(account.getId(), added.toString()); + } + + // 4、发邮件 区分中英文 + SendEmailUtil.questionnaireRelatedNotify(questionnaireVO.getUserName(), email, questionnaireVO.getLanguage()); + return Boolean.TRUE; + } + } diff --git a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java index 13f380ce..2e2d9c66 100644 --- a/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/CreditsServiceImpl.java @@ -243,4 +243,13 @@ public class CreditsServiceImpl extends ServiceImpl qw = new QueryWrapper<>(); + qw.eq("account_id", accountId); + qw.eq("change_event", changeEvent); + qw.eq("changed_credits", changedCredits); + + return baseMapper.selectOne(qw); + } + } diff --git a/src/main/resources/messages_en.properties b/src/main/resources/messages_en.properties index 6da9e45b..aa36fa05 100644 --- a/src/main/resources/messages_en.properties +++ b/src/main/resources/messages_en.properties @@ -137,6 +137,8 @@ the.value.range.of.seed=The value range of seed is 0-99999 image.modify.failed=Image modification failed, please try again later. slogan.style.cannot.be.empty=Slogan style text cannot be empty. slogan.image.cannot.be.empty=Slogan image cannot be empty. +questionnaire.filled.out=You have filled out the current questionnaire. +user.has.no.account=The current user has no account! # 可能会报异常 # Informative: diff --git a/src/main/resources/messages_zh.properties b/src/main/resources/messages_zh.properties index 909ebb49..e4bbeb87 100644 --- a/src/main/resources/messages_zh.properties +++ b/src/main/resources/messages_zh.properties @@ -130,8 +130,10 @@ the.workspace.lastIndex.not.found=未找到工作区的lastIndex。 gender.cannot.be.empty=性别不能为空。 image.synthesis.failed=图像合成失败。 priority.cannot.be.repeated=优先级不能重复。 -slogan.style.cannot.be.empty=标语风格文本不能为空. -slogan.image.cannot.be.empty=标语图片不能为空. +slogan.style.cannot.be.empty=标语风格文本不能为空。 +slogan.image.cannot.be.empty=标语图片不能为空。 +questionnaire.filled.out=您已填写过当前问卷。 +user.has.no.account=当前用户没有账号。 # 可能会报异常 # Informative: