diff --git a/src/main/java/com/ai/da/controller/AccountController.java b/src/main/java/com/ai/da/controller/AccountController.java index fdb35151..0300aca0 100644 --- a/src/main/java/com/ai/da/controller/AccountController.java +++ b/src/main/java/com/ai/da/controller/AccountController.java @@ -182,21 +182,21 @@ public class AccountController { * 填写调查问卷 * @return */ - @ApiOperation(value = "填写调查问卷") +/* @ApiOperation(value = "填写调查问卷") @PostMapping("/questionnaire") public Response questionnaire(@Valid @RequestBody String questionnaireInfo){ return Response.success(accountService.collectQuestionnaires(questionnaireInfo)); - } + }*/ /** * 参与活动 获取福利 * @return */ - @ApiOperation(value = "参与活动 获取福利") +/* @ApiOperation(value = "参与活动 获取福利") @GetMapping("/activity") public Response getActivityBenefits(){ return Response.success(accountService.getActivityBenefits()); - } + }*/ @ApiOperation(value = "将用户账号过期时间设置为过期当天的23:59:59") @GetMapping("/setUserValidToDayEnd") diff --git a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java index 5f054973..d23208d3 100644 --- a/src/main/java/com/ai/da/model/dto/AccountAddDTO.java +++ b/src/main/java/com/ai/da/model/dto/AccountAddDTO.java @@ -37,4 +37,18 @@ public class AccountAddDTO { private Integer systemUser; + private String organizationName; + + private Integer subAccountNum; + + public AccountAddDTO(String userEmail, String userName, String country, String validStartTime, String validEndTime, Integer isTrial, BigDecimal credits, Integer systemUser) { + this.userEmail = userEmail; + this.userName = userName; + this.country = country; + this.validStartTime = validStartTime; + this.validEndTime = validEndTime; + this.isTrial = isTrial; + this.credits = credits; + this.systemUser = systemUser; + } } diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index bc0d6c93..f0408c3a 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -16,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; +import java.math.BigDecimal; import java.util.List; import java.util.Map; import java.util.Set; @@ -140,8 +141,7 @@ public interface AccountService extends IService { void moveLibraryDate(); - void updateCreditsAndEndTime(Long accountId, String value); - void updateCreditsAndEndTime(Long accountId, String value, Long endTime); + void updateCreditsAndEndTime(Long accountId, String value, Long endTime, BigDecimal creditsUsage); Boolean designWorksRegister(AccountDesignWorksRegisterDTO accountDesignWorksRegisterDTO); diff --git a/src/main/java/com/ai/da/service/CreditsService.java b/src/main/java/com/ai/da/service/CreditsService.java index fbbb9fdb..ab74883e 100644 --- a/src/main/java/com/ai/da/service/CreditsService.java +++ b/src/main/java/com/ai/da/service/CreditsService.java @@ -13,10 +13,6 @@ public interface CreditsService extends IService { Boolean buyCredits(Long accountId, Float quantity); - void creditsIncrease(Long accountId, String event); - - void creditsDecrease(Long accountId, String event); - String getCredits(Long accountId); void creditsRefund(Long accountId, Integer quantity, String orderNo); 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 49f28f48..b0100365 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -59,6 +59,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; +import java.math.RoundingMode; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.GeneralSecurityException; @@ -1145,20 +1146,21 @@ public class AccountServiceImpl extends ServiceImpl impl // 未迁移过的进行迁移,注意模特数据迁移打点信息以及转换模特格式 } - public void updateCreditsAndEndTime(Long accountId, String value) { + public void updateCreditsAndEndTime(Long accountId, String value, Long endTime, BigDecimal creditsUsage) { Account account = new Account(); account.setId(accountId); account.setCredits(new BigDecimal(value)); - accountMapper.updateById(account); - } - // todo 将其与上一个合并 - public void updateCreditsAndEndTime(Long accountId, String value, Long endTime) { - Account account = new Account(); - account.setId(accountId); - account.setCredits(new BigDecimal(value)); - if (!Objects.isNull(endTime)){ + if (Objects.nonNull(endTime)){ account.setValidEndTime(toDayEnd(endTime)); } + if (Objects.nonNull(creditsUsage)){ + // 机构的积分使用量不会超过上限 + if (creditsUsage.compareTo(account.getCreditsUsageLimit()) > 0){ + account.setCreditsUsage(account.getCreditsUsageLimit()); + } else { + account.setCreditsUsage(creditsUsage); + } + } account.setUpdateDate(new Date()); accountMapper.updateById(account); } @@ -1206,7 +1208,7 @@ public class AccountServiceImpl extends ServiceImpl impl } account.setSystemUser(3); account.setIsTrial(1); - account.setCredits(BigDecimal.valueOf(100)); + account.setCredits(BigDecimal.valueOf(50)); account.setValidEndTime(toDayEnd(Instant.now().plus(5, ChronoUnit.DAYS).toEpochMilli())); account.setIsBeginner(1); account.setValidStartTime(Instant.now().toEpochMilli()); @@ -1253,15 +1255,15 @@ public class AccountServiceImpl extends ServiceImpl impl static { HikariConfig config = new HikariConfig(); - config.setJdbcUrl("jdbc:mysql://code-create.com.hk:3306/db1nfvsgmjp3b8"); - config.setUsername("uafqtz4gsvfrw"); - config.setPassword("aida123456."); +// config.setJdbcUrl("jdbc:mysql://code-create.com.hk:3306/db1nfvsgmjp3b8"); +// config.setUsername("uafqtz4gsvfrw"); +// config.setPassword("aida123456."); // config.setJdbcUrl("jdbc:mysql://18.167.251.121:33008/aida"); // config.setUsername("aida_con"); // config.setPassword("123456"); -// config.setJdbcUrl("jdbc:mysql://localhost:3306/code-create-local?serverTimezone=UTC"); -// config.setUsername("root"); -// config.setPassword("root"); + config.setJdbcUrl("jdbc:mysql://localhost:3306/code-create-local?serverTimezone=UTC"); + config.setUsername("root"); + config.setPassword("root"); config.addDataSourceProperty("cachePrepStmts", "true"); config.addDataSourceProperty("prepStmtCacheSize", "250"); config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); @@ -1329,11 +1331,11 @@ public class AccountServiceImpl extends ServiceImpl impl // 不管是不是新用户 都要更新用户角色和积分 String credits = "0"; if (totalSales == 5000.0){ - log.info("年付用户,初始积分6000"); - credits = CreditsEventsEnum.INIT_MONTHLY.getValue(); + log.info("年付用户,初始积分50000"); + credits = CreditsEventsEnum.INIT_YEARLY.getValue(); systemUserType = 1; }else if (totalSales == 500.0){ - log.info("月付用户,初始积分5000"); + log.info("月付用户,初始积分3500"); credits = CreditsEventsEnum.INIT_MONTHLY.getValue(); systemUserType = 2; }else if (totalSales == 0.0){ @@ -1591,7 +1593,7 @@ public class AccountServiceImpl extends ServiceImpl impl // 3.3、更新 t_account 表 if (account.getValidEndTime() != null && account.getValidEndTime() < 1720972799000L){ - updateCreditsAndEndTime(account.getId(), added.toString(), 1720972799000L); + updateCreditsAndEndTime(account.getId(), added.toString(), 1720972799000L, null); } } @@ -1658,16 +1660,20 @@ public class AccountServiceImpl extends ServiceImpl impl // 获取该管理员的所有子账号 List subAccounts = getSubAccountsByAdmin(adminAccount); - if (CollectionUtils.isEmpty(subAccounts)) { + if (CollectionUtils.isEmpty(subAccounts) + || Objects.isNull(adminAccount.getSubAccountNum()) + || adminAccount.getSubAccountNum() == 0) { log.debug("管理员 {} 没有子账号", adminAccount.getId()); continue; } + BigDecimal averageCredits = adminAccount.getCreditsUsageLimit().divide(new BigDecimal(adminAccount.getSubAccountNum()), RoundingMode.FLOOR); + // 批量更新子账号积分 - int processedCount = batchUpdateSubAccountsCredits(subAccounts); + int processedCount = batchUpdateSubAccountsCredits(subAccounts, averageCredits); totalProcessed += processedCount; - adminAccount.setCreditsUsage(new BigDecimal(3500).multiply(new BigDecimal(processedCount))); + adminAccount.setCreditsUsage(averageCredits.multiply(new BigDecimal(processedCount))); adminAccount.setCredits(adminAccount.getCreditsUsageLimit().subtract(adminAccount.getCreditsUsage())); adminAccount.setUpdateDate(new Date()); updateById(adminAccount); @@ -1696,13 +1702,13 @@ public class AccountServiceImpl extends ServiceImpl impl /** * 批量更新子账号积分 */ - private int batchUpdateSubAccountsCredits(List subAccounts) { + private int batchUpdateSubAccountsCredits(List subAccounts, BigDecimal averageCredits) { List accountsToUpdate = new ArrayList<>(); Date now = new Date(); for (Account subAcc : subAccounts) { try { - Account updatedAccount = calculateNewCredits(subAcc, now); + Account updatedAccount = calculateNewCredits(subAcc, now, averageCredits); accountsToUpdate.add(updatedAccount); } catch (Exception e) { @@ -1720,8 +1726,9 @@ public class AccountServiceImpl extends ServiceImpl impl /** * 计算新的积分值 + * 默认积分为学校总积分数 / 学校可使用子账号数 */ - private Account calculateNewCredits(Account subAcc, Date updateTime) { + private Account calculateNewCredits(Account subAcc, Date updateTime, BigDecimal averageCredits) { BigDecimal creditsUsageLimit = subAcc.getCreditsUsageLimit(); // 使用 Optional 替代 ObjectUtils.defaultIfNull BigDecimal creditsUsage = Optional.ofNullable(subAcc.getCreditsUsage()).orElse(BigDecimal.ZERO); @@ -1739,8 +1746,8 @@ public class AccountServiceImpl extends ServiceImpl impl // 确保个人积分不为负数 personalCredits = personalCredits.max(BigDecimal.ZERO); - // 新的总积分 = 个人积分 + 学校分配的新积分额度 todo 重新分配的积分是使用上个月分配的积分还是默认积分,暂时使用默认积分 3500 - BigDecimal newTotalCredits = personalCredits.add(new BigDecimal(3500)); + // 新的总积分 = 个人积分 + 学校分配的新积分额度 (重新分配的积分是使用上个月分配的积分还是默认积分,暂时使用平均积分) + BigDecimal newTotalCredits = personalCredits.add(averageCredits); // 记录积分变更日志(可选) logCreditChange(subAcc, currentCredits, newTotalCredits, creditsUsage); @@ -1750,7 +1757,7 @@ public class AccountServiceImpl extends ServiceImpl impl updatedAccount.setId(subAcc.getId()); updatedAccount.setCredits(newTotalCredits); updatedAccount.setCreditsUsage(BigDecimal.ZERO); // 重置已使用积分 - updatedAccount.setCreditsUsageLimit(new BigDecimal(3500)); // 重置为默认积分 + updatedAccount.setCreditsUsageLimit(averageCredits); // 重置为默认积分 updatedAccount.setUpdateDate(updateTime); return updatedAccount; @@ -2117,7 +2124,7 @@ public class AccountServiceImpl extends ServiceImpl impl newUser.setCreateDate(new Date()); newUser.setIsTrial(1); newUser.setIsBeginner(1); - newUser.setCredits(BigDecimal.valueOf(100)); + newUser.setCredits(BigDecimal.valueOf(50)); newUser.setSystemUser(3); accountMapper.insert(newUser); session.setAttribute("user", newUser); @@ -2424,6 +2431,7 @@ public class AccountServiceImpl extends ServiceImpl impl adminAcc.setCreditsUsage(adminAcc.getCreditsUsage().add(subAccount.getCreditsUsageLimit())); adminAcc.setCredits(adminAcc.getCreditsUsageLimit().subtract(adminAcc.getCreditsUsage())); adminAcc.setUpdateDate(new Date()); + log.debug("分配积分: remainingCredits={}, subAccId={}, setCredits={}", remainingCredits, subAccount.getId(), addSubAccountDTO.getCreditsUsageLimit()); }else { handleSubAccCredits(subAccount, adminAcc); } @@ -2457,6 +2465,7 @@ public class AccountServiceImpl extends ServiceImpl impl adminAcc.setCreditsUsage(adminAcc.getCreditsUsage().add(subAccount.getCreditsUsageLimit())); adminAcc.setCredits(adminAcc.getCreditsUsageLimit().subtract(adminAcc.getCreditsUsage())); adminAcc.setUpdateDate(new Date()); + log.debug("分配积分: remainingCredits={}, subAccId={}, setCredits={}", remainingCredits, subAccount.getId(), addSubAccountDTO.getCreditsUsageLimit()); } // 未指定积分使用上限 else { @@ -2584,8 +2593,8 @@ public class AccountServiceImpl extends ServiceImpl impl } if (Objects.nonNull(adminAcc.getCreditsUsageLimit()) && (Objects.isNull(subAcc.getCreditsUsageLimit()) || subAcc.getCreditsUsageLimit().compareTo(BigDecimal.ZERO) == 0)) { - // todo 需要先判断管理员的订阅类型 年付 -> 4200 月付 -> 3500 - BigDecimal defaultCredits = BigDecimal.valueOf(3500L); + // 默认使用平均积分 + BigDecimal defaultCredits = adminAcc.getCreditsUsageLimit().divide(new BigDecimal(adminAcc.getSubAccountNum()), RoundingMode.FLOOR);; if (remainingCredits.compareTo(defaultCredits) >= 0) { subAcc.setCreditsUsageLimit(defaultCredits); @@ -2597,7 +2606,7 @@ public class AccountServiceImpl extends ServiceImpl impl adminAcc.setCreditsUsage(adminAcc.getCreditsUsage().add(subAcc.getCreditsUsageLimit())); adminAcc.setCredits(adminAcc.getCreditsUsageLimit().subtract(adminAcc.getCreditsUsage())); adminAcc.setUpdateDate(new Date()); - log.debug("分配积分: subAccId={}, defaultCredits={}, remainingCredits={}", subAcc.getId(), defaultCredits, remainingCredits); + log.debug("分配积分: remainingCredits={}, subAccId={}, defaultCredits={}", remainingCredits, subAcc.getId(), defaultCredits); if (Objects.nonNull(subAcc.getCredits())) { subAcc.setCredits(subAcc.getCreditsUsageLimit().add(subAcc.getCredits())); @@ -2782,7 +2791,7 @@ public class AccountServiceImpl extends ServiceImpl impl newUser.setCreateDate(new Date()); newUser.setIsTrial(1); newUser.setIsBeginner(1); - newUser.setCredits(BigDecimal.valueOf(100)); + newUser.setCredits(BigDecimal.valueOf(50)); newUser.setSystemUser(3); accountMapper.insert(newUser); @@ -2886,7 +2895,7 @@ public class AccountServiceImpl extends ServiceImpl impl newUser.setCreateDate(new Date()); newUser.setIsTrial(1); newUser.setIsBeginner(1); - newUser.setCredits(BigDecimal.valueOf(100)); + newUser.setCredits(BigDecimal.valueOf(50)); newUser.setSystemUser(3); accountMapper.insert(newUser); @@ -3417,6 +3426,7 @@ public class AccountServiceImpl extends ServiceImpl impl } @Override + @Transactional public Boolean subAccountImport(MultipartFile file) { AuthPrincipalVo vo = UserContext.getUserHolder(); Account parent = accountMapper.selectById(vo.getId()); @@ -3443,14 +3453,13 @@ public class AccountServiceImpl extends ServiceImpl impl AddSubAccountDTO addSubAccountDTO = new AddSubAccountDTO(); addSubAccountDTO.setUserEmail(dto.getEmail()); + if (Objects.nonNull(dto.getCredisUsageLimit())) { + addSubAccountDTO.setCreditsUsageLimit(BigDecimal.valueOf(dto.getCredisUsageLimit())); + } addSubAccountDTO.setUserName(dto.getEmail().substring(0, dto.getEmail().indexOf("@"))); addSubAccountDTO.setUserPassword(md5(parent.getOrganizationName().toLowerCase() + "abc")); // 添加用户 - try { - addSubAccount(addSubAccountDTO); - } catch (BusinessException e){ - log.warn("批量导入业务报错, {}", e.getMsg()); - } + addSubAccount(addSubAccountDTO); } return true; 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 f71be2f9..fc481624 100644 --- a/src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/ConvenientInquiryServiceImpl.java @@ -479,6 +479,15 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl queryWrapper = new QueryWrapper<>(); @@ -489,8 +498,7 @@ public class ConvenientInquiryServiceImpl extends ServiceImpl i } public void doCreditsSubtract(Long accountId, CreditsEventsEnum event) { - BigDecimal existingCredits = accountService.getById(accountId).getCredits(); + Account account = accountService.getById(accountId); + BigDecimal existingCredits = account.getCredits(); BigDecimal subtract = existingCredits.subtract(new BigDecimal(event.getValue())); - accountService.updateCreditsAndEndTime(accountId, subtract.toString(), null); + BigDecimal creditsUsage = null; + if (!StringUtil.isNullOrEmpty(account.getOrganizationName())){ + creditsUsage = Objects.isNull(account.getCreditsUsage()) ? BigDecimal.ZERO : account.getCreditsUsage(); + creditsUsage = creditsUsage.add(new BigDecimal(event.getValue())); + } + accountService.updateCreditsAndEndTime(accountId, subtract.toString(), null, creditsUsage); creditsService.preInsert(accountId, event.getName(), null, Boolean.FALSE, event.getValue()); } diff --git a/src/main/resources/files/sub_account_import_template.xlsx b/src/main/resources/files/sub_account_import_template.xlsx index 67c8c351..a78955bc 100644 Binary files a/src/main/resources/files/sub_account_import_template.xlsx and b/src/main/resources/files/sub_account_import_template.xlsx differ