From 303db89f46eeee1f71821258a644037d2dc1eabc Mon Sep 17 00:00:00 2001 From: zayac Date: Mon, 17 Jun 2024 17:06:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E4=B8=8D=E8=83=BD?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=A6=96=E5=AD=98=E9=87=91=E9=A2=9D=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/zayac/admin/req/ActiveListReq.java | 17 ++ .../com/zayac/admin/resp/ActiveListResp.java | 17 +- .../zayac/admin/schedule/CheckRegAndDep.java | 2 +- .../zayac/admin/service/DepositService.java | 281 ++++++++++-------- .../admin/service/TelegramMessageService.java | 18 +- .../com/zayac/admin/utils/CommonUtils.java | 35 ++- 6 files changed, 213 insertions(+), 157 deletions(-) diff --git a/zayac-admin-agent/src/main/java/com/zayac/admin/req/ActiveListReq.java b/zayac-admin-agent/src/main/java/com/zayac/admin/req/ActiveListReq.java index 9a50e796..704eeb1d 100644 --- a/zayac-admin-agent/src/main/java/com/zayac/admin/req/ActiveListReq.java +++ b/zayac-admin-agent/src/main/java/com/zayac/admin/req/ActiveListReq.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.zayac.admin.req; import com.fasterxml.jackson.annotation.JsonFormat; @@ -26,6 +42,7 @@ public class ActiveListReq { /** * 是否重置 */ + @Builder.Default private Boolean isRest = false; /** diff --git a/zayac-admin-agent/src/main/java/com/zayac/admin/resp/ActiveListResp.java b/zayac-admin-agent/src/main/java/com/zayac/admin/resp/ActiveListResp.java index 4b4495eb..ce3e5d6e 100644 --- a/zayac-admin-agent/src/main/java/com/zayac/admin/resp/ActiveListResp.java +++ b/zayac-admin-agent/src/main/java/com/zayac/admin/resp/ActiveListResp.java @@ -1,3 +1,19 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.zayac.admin.resp; import lombok.AllArgsConstructor; @@ -5,7 +21,6 @@ import lombok.Data; import lombok.NoArgsConstructor; import java.math.BigDecimal; -import java.time.LocalDate; import java.time.LocalDateTime; /** diff --git a/zayac-admin-agent/src/main/java/com/zayac/admin/schedule/CheckRegAndDep.java b/zayac-admin-agent/src/main/java/com/zayac/admin/schedule/CheckRegAndDep.java index b36a5735..3f18445a 100644 --- a/zayac-admin-agent/src/main/java/com/zayac/admin/schedule/CheckRegAndDep.java +++ b/zayac-admin-agent/src/main/java/com/zayac/admin/schedule/CheckRegAndDep.java @@ -121,7 +121,7 @@ public class CheckRegAndDep { .processRegistration(minister, account, accountUsernameToUserMap, currentTeamInfo, prevTeamInfo, nowDate, asyncTaskExecutor); CompletableFuture depositProcess = depositService - .processDeposits(minister, accountUsernameToUserMap, account, currentTeamInfo, prevTeamInfo, nowDate, asyncTaskExecutor); + .processDeposits(minister, accountUsernameToUserMap, account, currentTeamInfo, prevTeamInfo, nowDate, nowDateTime, asyncTaskExecutor); return CompletableFuture.allOf(registrationProcess, depositProcess).thenRunAsync(() -> { teamService.updateTeamInfo(account, currentTeamInfo); diff --git a/zayac-admin-agent/src/main/java/com/zayac/admin/service/DepositService.java b/zayac-admin-agent/src/main/java/com/zayac/admin/service/DepositService.java index e87a8e7b..261015aa 100644 --- a/zayac-admin-agent/src/main/java/com/zayac/admin/service/DepositService.java +++ b/zayac-admin-agent/src/main/java/com/zayac/admin/service/DepositService.java @@ -16,6 +16,7 @@ package com.zayac.admin.service; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.StrUtil; import com.zayac.admin.common.enums.DisEnableStatusEnum; import com.zayac.admin.constant.ApiPathConstants; @@ -35,6 +36,7 @@ import org.springframework.stereotype.Service; import top.continew.starter.cache.redisson.util.RedisUtils; import top.continew.starter.core.exception.BusinessException; +import java.math.BigDecimal; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -49,7 +51,6 @@ import java.util.stream.Collectors; import static com.zayac.admin.common.constant.CacheConstants.SUCCESSFULLY_PAYED_ACCOUNTNAME; import static com.zayac.admin.utils.CommonUtils.findChangedTeamAccount; -import static com.zayac.admin.utils.CommonUtils.getLastNElements; @Slf4j @Service @@ -61,19 +62,19 @@ public class DepositService { private static final String BOT_TOKEN = "6013830443:AAHUOS4v6Ln19ziZkH-L28-HZQLJrGcvhto"; private static final Long TELEGRAM_CHAT_ID = 6054562838L; - public CompletableFuture processDeposits(UserWithRolesAndAccountsResp ministerUser, Map accountUsernameToUserMap, AccountResp account, Team currentTeam, Team previousTeam, LocalDate nowDate, + LocalDateTime nowDateTime, Executor asyncTaskExecutor) { if (previousTeam == null || currentTeam.getFirstDepositNum() <= previousTeam.getFirstDepositNum()) { return CompletableFuture.completedFuture(null); } - return processDepositRecords(ministerUser, accountUsernameToUserMap, account, currentTeam, previousTeam, nowDate, asyncTaskExecutor); + return processDepositRecords(ministerUser, accountUsernameToUserMap, account, currentTeam, previousTeam, nowDate, nowDateTime, asyncTaskExecutor); } private CompletableFuture processDepositRecords(UserWithRolesAndAccountsResp ministerUser, @@ -82,14 +83,15 @@ public class DepositService { Team currentTeam, Team previousTeam, LocalDate nowDate, + LocalDateTime nowDateTime, Executor asyncTaskExecutor) { List hasNewDepositAccounts = findChangedTeamAccount(previousTeam, currentTeam).stream() - .filter(teamAccountWithChange -> teamAccountWithChange.getNewDepositNum() > 0) - .toList(); + .filter(teamAccountWithChange -> teamAccountWithChange.getNewDepositNum() > 0) + .toList(); List> allTasks = hasNewDepositAccounts.stream() - .map(accountWithChange -> processAccountChanges(accountWithChange, ministerUser, accountUsernameToUserMap, account, nowDate, asyncTaskExecutor)) - .toList(); + .map(accountWithChange -> processAccountChanges(accountWithChange, ministerUser, accountUsernameToUserMap, account, nowDate, nowDateTime, asyncTaskExecutor)) + .toList(); return CompletableFuture.allOf(allTasks.toArray(new CompletableFuture[0])); } @@ -99,100 +101,124 @@ public class DepositService { Map accountUsernameToUserMap, AccountResp account, LocalDate nowDate, + LocalDateTime nowDateTime, Executor asyncTaskExecutor) { ActiveListReq req = ActiveListReq.builder() - .pageNum(1) - .activeType(3) - .topAgentName(accountWithChange.getAgentName()) - .date(nowDate) - .isRest(false) - .build(); + .pageNum(1) + .activeType(3) + .topAgentName(accountWithChange.getAgentName()) + .date(nowDate) + .pageSize(9999) + .isRest(false) + .build(); return completableFutureWebClientService - .fetchDataForAccount(account, ApiPathConstants.ACTIVE_LIST, req, new ParameterizedTypeReference>>>() { - }) - .thenComposeAsync(page -> fetchAndProcessActiveList(account, req, page, accountWithChange, ministerUser, accountUsernameToUserMap, asyncTaskExecutor), asyncTaskExecutor) - .exceptionally(ex -> { - // 处理异常 - log.error("Error processing account changes for account: {}", account, ex); - return null; - }); - } + .fetchDataForAccount(account, ApiPathConstants.ACTIVE_LIST, req, new ParameterizedTypeReference>>>() { + }) + .thenApply(Pagination::getList) + .thenComposeAsync(activeListResps -> { + // 过滤并排序 + List sortedList = activeListResps.stream() + .filter(resp -> resp.getFirstPayTime() != null && resp.getFirstPayTime() + .isAfter(nowDateTime.minusMinutes(5))) + .sorted(Comparator.comparing(ActiveListResp::getFirstPayTime)) + .collect(Collectors.toList()); - private CompletableFuture fetchAndProcessActiveList(AccountResp account, ActiveListReq req, Pagination> page, - TeamAccountWithChange accountWithChange, UserWithRolesAndAccountsResp ministerUser, - Map accountUsernameToUserMap, Executor asyncTaskExecutor) { - req.setPageNum(page.getPageNum()); - return completableFutureWebClientService - .fetchDataForAccount(account, ApiPathConstants.ACTIVE_LIST, req, new ParameterizedTypeReference>>>() { - }) - .thenApply(Pagination::getList) - .thenAcceptAsync(activeListResps -> { - List sortedList = activeListResps.stream() - .sorted(Comparator.comparing(ActiveListResp::getFirstPayTime)) - .collect(Collectors.toList()); - List activeListRespList = getLastNElements(sortedList, accountWithChange.getNewDepositNum()); - String depositResults = buildDepositResults(activeListRespList); - String notification = buildNotificationMessage(accountWithChange, depositResults); - sendNotifications(accountWithChange, ministerUser, accountUsernameToUserMap, notification); - }, asyncTaskExecutor); + // 截取后N个元素 + List activeListRespList = ListUtil.sub(sortedList, -accountWithChange + .getNewDepositNum(), sortedList.size()); + + // 异步处理每个响应 + List> futures = activeListRespList.stream().map(resp -> { + if (resp.getDeposit().compareTo(BigDecimal.ZERO) == 0) { + LocalDate startDate = nowDateTime.minusHours(1).toLocalDate(); + PayRecordsListReq payRecordsListReq = PayRecordsListReq.builder() + .startDate(startDate) + .endDate(nowDate) + .memberName(resp.getName()) + .pageSize(10) + .payState(2) + .agentName(accountWithChange.getAgentName()) + .build(); + + return completableFutureWebClientService + .fetchDataForAccount(account, ApiPathConstants.PAY_RECORDS_LIST_URL, payRecordsListReq, new ParameterizedTypeReference>>>() { + }) + .thenApply(Pagination::getList) + .thenAcceptAsync(payRecords -> { + if (payRecords != null && !payRecords.isEmpty()) { + resp.setDeposit(payRecords.get(0).getScoreAmount()); + } else { + log.warn("No pay records found for member: {}", resp.getName()); + } + }, asyncTaskExecutor); + } + return CompletableFuture.completedFuture(null); + }).toList(); + + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> activeListRespList); + }, asyncTaskExecutor) + .thenAcceptAsync(activeListRespList -> { + String depositResults = buildDepositResults(activeListRespList); + String notification = buildNotificationMessage(accountWithChange, depositResults); + sendNotifications(accountWithChange, ministerUser, accountUsernameToUserMap, notification); + }, asyncTaskExecutor) + .exceptionally(ex -> { + log.error("Error processing account changes for account: {}", account, ex); + return null; + }); } private String buildDepositResults(List activeListRespList) { StringBuilder depositResults = new StringBuilder(); - activeListRespList.forEach(activeListResp -> - depositResults.append(telegramMessageService.buildDepositResultsMessage(activeListResp.getName(), activeListResp.getDeposit())) - ); + activeListRespList.forEach(activeListResp -> depositResults.append(telegramMessageService + .buildDepositResultsMessage(activeListResp.getName(), activeListResp.getDeposit()))); return depositResults.toString(); } private String buildNotificationMessage(TeamAccountWithChange accountWithChange, String depositResults) { - return telegramMessageService.buildDepositMessage( - accountWithChange.getAgentName(), - accountWithChange.getNewDepositNum(), - depositResults, - accountWithChange.getFirstDepositNum() - ); + return telegramMessageService.buildDepositMessage(accountWithChange.getAgentName(), accountWithChange + .getNewDepositNum(), depositResults, accountWithChange.getFirstDepositNum()); } - private void sendNotifications(TeamAccountWithChange accountWithChange, UserWithRolesAndAccountsResp ministerUser, - Map accountUsernameToUserMap, String notification) { + private void sendNotifications(TeamAccountWithChange accountWithChange, + UserWithRolesAndAccountsResp ministerUser, + Map accountUsernameToUserMap, + String notification) { var currUser = accountUsernameToUserMap.get(accountWithChange.getAgentName()); if (currUser != null && DisEnableStatusEnum.ENABLE.equals(currUser.getNeedNotify())) { String botToken = StrUtil.isEmpty(currUser.getBotToken()) - ? ministerUser.getBotToken() - : currUser.getBotToken(); + ? ministerUser.getBotToken() + : currUser.getBotToken(); telegramMessageService.sendMessage(botToken, currUser.getRegAndDepIds(), notification); } telegramMessageService.sendMessage(BOT_TOKEN, TELEGRAM_CHAT_ID, notification); } - -// // 凌晨的时候查询存款记录时往前减一天 防止凌晨的时候出现查询不到存款记录的问题 -// LocalDate startDate = nowDateTime.minusHours(1).toLocalDate(); -// PayRecordsListReq req = PayRecordsListReq.builder() -// .startDate(startDate) -// .endDate(nowDate) -// .pageSize(100) -// .payState(2) -// .agentName(accountWithChange.getAgentName()) -// .build(); -// -// StringBuilder depositResults = new StringBuilder(); -// AtomicInteger depositCounter = new AtomicInteger(0); -// -// return completableFutureWebClientService -// .fetchDataForAccount(account, ApiPathConstants.PAY_RECORDS_LIST_URL, req, new ParameterizedTypeReference>>>() { -// }) -// .thenApply(Pagination::getList) -// .thenComposeAsync(payRecords -> processPayRecords(payRecords, accountWithChange, account, nowDate, nowDateTime, depositResults, depositCounter, asyncTaskExecutor), asyncTaskExecutor) -// .thenRunAsync(() -> sendNotification(accountWithChange, ministerUser, accountUsernameToUserMap, depositResults), asyncTaskExecutor) -// .exceptionally(ex -> { -// log.error("Error processing account changes for agent {}: {}", accountWithChange.getAgentName(), ex -// .getMessage()); -// return null; -// }); -// } + // // 凌晨的时候查询存款记录时往前减一天 防止凌晨的时候出现查询不到存款记录的问题 + // LocalDate startDate = nowDateTime.minusHours(1).toLocalDate(); + // PayRecordsListReq req = PayRecordsListReq.builder() + // .startDate(startDate) + // .endDate(nowDate) + // .pageSize(100) + // .payState(2) + // .agentName(accountWithChange.getAgentName()) + // .build(); + // + // StringBuilder depositResults = new StringBuilder(); + // AtomicInteger depositCounter = new AtomicInteger(0); + // + // return completableFutureWebClientService + // .fetchDataForAccount(account,ApiPathConstants.PAY_RECORDS_LIST_URL,req,new ParameterizedTypeReference>>>(){}).thenApply(Pagination::getList) + // .thenComposeAsync(payRecords-> processPayRecords(payRecords, accountWithChange, account, nowDate, nowDateTime, depositResults, depositCounter, asyncTaskExecutor),asyncTaskExecutor) + // .thenRunAsync(()->sendNotification(accountWithChange, ministerUser, accountUsernameToUserMap, depositResults),asyncTaskExecutor) + // .exceptionally(ex->{ + // log.error("Error processing account changes for agent {}: {}", accountWithChange.getAgentName(), ex + // .getMessage()); + // return null; + // }); + //} private CompletableFuture processPayRecords(List payRecords, TeamAccountWithChange accountWithChange, @@ -205,34 +231,34 @@ public class DepositService { //根据用户名去重,保留时间最早的支付记录 List sortedPayRecords = payRecords.stream() - .filter(record -> record.getCreatedAt().isAfter(nowDateTime.minusHours(1))) - .collect(Collectors.collectingAndThen(Collectors.toMap(PayRecord::getName, record -> record, ( - existingRecord, - newRecord) -> existingRecord - .getCreatedAt() - .isBefore(newRecord - .getCreatedAt()) - ? existingRecord - : newRecord, LinkedHashMap::new), map -> map - .values() - .stream() - .sorted(Comparator - .comparing(PayRecord::getCreatedAt) - .reversed()) - .filter(payRecord -> !RedisUtils - .hasKey(SUCCESSFULLY_PAYED_ACCOUNTNAME + payRecord - .getBillNo())) - .collect(Collectors - .toList()))); + .filter(record -> record.getCreatedAt().isAfter(nowDateTime.minusHours(1))) + .collect(Collectors.collectingAndThen(Collectors.toMap(PayRecord::getName, record -> record, ( + existingRecord, + newRecord) -> existingRecord + .getCreatedAt() + .isBefore(newRecord + .getCreatedAt()) + ? existingRecord + : newRecord, LinkedHashMap::new), map -> map + .values() + .stream() + .sorted(Comparator + .comparing(PayRecord::getCreatedAt) + .reversed()) + .filter(payRecord -> !RedisUtils + .hasKey(SUCCESSFULLY_PAYED_ACCOUNTNAME + payRecord + .getBillNo())) + .collect(Collectors + .toList()))); List> fetchMemberFutures = sortedPayRecords.stream() - .map(payRecord -> fetchMemberDetails(account, payRecord.getName(), nowDate, asyncTaskExecutor) - .thenAcceptAsync(member -> processMemberDetails(member, payRecord, accountWithChange, depositResults, depositCounter), asyncTaskExecutor) - .exceptionally(ex -> { - log.error("Error fetching details for member {}: {}", payRecord.getName(), ex.getMessage()); - return null; - })) - .toList(); + .map(payRecord -> fetchMemberDetails(account, payRecord.getName(), nowDate, asyncTaskExecutor) + .thenAcceptAsync(member -> processMemberDetails(member, payRecord, accountWithChange, depositResults, depositCounter), asyncTaskExecutor) + .exceptionally(ex -> { + log.error("Error fetching details for member {}: {}", payRecord.getName(), ex.getMessage()); + return null; + })) + .toList(); return CompletableFuture.allOf(fetchMemberFutures.toArray(new CompletableFuture[0])); } @@ -247,13 +273,13 @@ public class DepositService { if (!RedisUtils.hasKey(SUCCESSFULLY_PAYED_ACCOUNTNAME + payRecord.getBillNo())) { //如果订单记录有存款成功但是会员的首存时间还为空,数据未同步,也是首存 if ((member.getFirstPayAt() == null || payRecord.getCreatedAt() - .equals(member.getFirstPayAt())) && depositCounter.getAndIncrement() < accountWithChange + .equals(member.getFirstPayAt())) && depositCounter.getAndIncrement() < accountWithChange .getNewDepositNum()) { //把存款成功的用户保存起来,设置一个小时的缓存时间 防止重复用户 RedisUtils.set(SUCCESSFULLY_PAYED_ACCOUNTNAME + payRecord.getBillNo(), member.getName(), Duration - .ofHours(1)); + .ofHours(1)); depositResults.append(telegramMessageService.buildDepositResultsMessage(member.getName(), payRecord - .getScoreAmount())); + .getScoreAmount())); } } } @@ -264,50 +290,49 @@ public class DepositService { Map accountUsernameToUserMap, StringBuilder depositResults) { String notification = telegramMessageService.buildDepositMessage(accountWithChange - .getAgentName(), accountWithChange.getNewDepositNum(), depositResults.toString(), accountWithChange + .getAgentName(), accountWithChange.getNewDepositNum(), depositResults.toString(), accountWithChange .getFirstDepositNum()); var currUser = accountUsernameToUserMap.get(accountWithChange.getAgentName()); if (currUser != null && DisEnableStatusEnum.ENABLE.equals(currUser.getNeedNotify())) { String botToken = StrUtil.isEmpty(currUser.getBotToken()) - ? ministerUser.getBotToken() - : currUser.getBotToken(); + ? ministerUser.getBotToken() + : currUser.getBotToken(); telegramMessageService.sendMessage(botToken, currUser.getRegAndDepIds(), notification); } telegramMessageService.sendMessage(BOT_TOKEN, TELEGRAM_CHAT_ID, notification); } - private CompletableFuture fetchMemberDetails(AccountResp account, String name, LocalDate nowDate, Executor asyncTaskExecutor) { TeamMemberListReq memberListReq = TeamMemberListReq.builder() - .name(name) - .startDate(nowDate) - .endDate(nowDate) - .status(1) - .build(); + .name(name) + .startDate(nowDate) + .endDate(nowDate) + .status(1) + .build(); CompletableFuture>> memberFuture = completableFutureWebClientService - .fetchDataForAccount(account, ApiPathConstants.MEMBER_TEAM_LIST_URL, memberListReq, new ParameterizedTypeReference<>() { - }); + .fetchDataForAccount(account, ApiPathConstants.MEMBER_TEAM_LIST_URL, memberListReq, new ParameterizedTypeReference<>() { + }); return memberFuture.thenApplyAsync(MemberPagination::getList, asyncTaskExecutor) - .thenApplyAsync(list -> list.stream() - .findFirst() - .orElseThrow(() -> new BusinessException("没有找到匹配的成员信息")), asyncTaskExecutor) - .thenComposeAsync(member -> fetchDetailedMemberInfo(account, member.getId(), nowDate), asyncTaskExecutor); + .thenApplyAsync(list -> list.stream() + .findFirst() + .orElseThrow(() -> new BusinessException("没有找到匹配的成员信息")), asyncTaskExecutor) + .thenComposeAsync(member -> fetchDetailedMemberInfo(account, member.getId(), nowDate), asyncTaskExecutor); } private CompletableFuture fetchDetailedMemberInfo(AccountResp account, Long memberId, LocalDate nowDate) { MemberDetailsReq detailsReq = MemberDetailsReq.builder() - .id(memberId) - .startDate(nowDate) - .endDate(nowDate) - .build(); + .id(memberId) + .startDate(nowDate) + .endDate(nowDate) + .build(); return completableFutureWebClientService - .fetchDataForAccount(account, ApiPathConstants.MEMBER_DETAIL_URL, detailsReq, new ParameterizedTypeReference<>() { - }); + .fetchDataForAccount(account, ApiPathConstants.MEMBER_DETAIL_URL, detailsReq, new ParameterizedTypeReference<>() { + }); } } diff --git a/zayac-admin-agent/src/main/java/com/zayac/admin/service/TelegramMessageService.java b/zayac-admin-agent/src/main/java/com/zayac/admin/service/TelegramMessageService.java index 59ccc548..b1344136 100644 --- a/zayac-admin-agent/src/main/java/com/zayac/admin/service/TelegramMessageService.java +++ b/zayac-admin-agent/src/main/java/com/zayac/admin/service/TelegramMessageService.java @@ -61,7 +61,7 @@ public class TelegramMessageService { public void sendMessage(String botToken, String targetIds, String message) { convertStringToList(targetIds).parallelStream() - .forEach(targetId -> this.sendMessage(botToken, targetId, message)); + .forEach(targetId -> this.sendMessage(botToken, targetId, message)); } public static List convertStringToList(String str) { @@ -73,7 +73,7 @@ public class TelegramMessageService { private static String escapeMarkdown(String text) { List escapeChars = Arrays - .asList('_', '[', ']', '(', ')', '~', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'); + .asList('_', '[', ']', '(', ')', '~', '>', '#', '+', '-', '=', '|', '{', '}', '.', '!'); for (Character charItem : escapeChars) { text = text.replace(charItem.toString(), "\\" + charItem); } @@ -92,19 +92,19 @@ public class TelegramMessageService { String memberNames = accountMembers.stream().map(TeamMember::getName).collect(Collectors.joining(", ")); if (currUser != null) { return String.format("👏 [%s] %s 注册: %d 会员: `%s` 总数:*%d*", currUser.getNickname(), teamAccount - .getAgentName(), accountMembers.size(), memberNames, teamAccount.getSubMemberNum()); + .getAgentName(), accountMembers.size(), memberNames, teamAccount.getSubMemberNum()); } return String.format("👏 %s 注册: %d 会员: `%s` 总数:*%d*", teamAccount.getAgentName(), accountMembers - .size(), memberNames, teamAccount.getSubMemberNum()); + .size(), memberNames, teamAccount.getSubMemberNum()); } public String buildRegistrationMessage(List accountMembers, TeamAccountWithChange teamAccount) { String memberNames = accountMembers.stream() - .map(member -> "`" + member.getName() + "`") - .collect(Collectors.joining(", ")); + .map(member -> "`" + member.getName() + "`") + .collect(Collectors.joining(", ")); return String.format("👏 %s 注册: %d 会员: %s 总数:*%d*", teamAccount.getAgentName(), accountMembers - .size(), memberNames, teamAccount.getSubMemberNum()); + .size(), memberNames, teamAccount.getSubMemberNum()); } public String buildDepositMessage(String agentName, int newDepositNum, String depositResults, int firstDepositNum) { @@ -124,7 +124,7 @@ public class TelegramMessageService { StringBuilder message = new StringBuilder(); statics.forEach(stat -> { String formattedStat = String.format("%s\n注册: %s\n新增: %d\n日活: %d\n\n", stat.getAgentName(), stat - .getIsNew(), stat.getFirstCount(), stat.getCountBets()); + .getIsNew(), stat.getFirstCount(), stat.getCountBets()); message.append(formattedStat); }); return message.toString(); @@ -134,7 +134,7 @@ public class TelegramMessageService { StringBuilder message = new StringBuilder(); userFinancesList.forEach(financeDO -> { String formattedFinance = String.format("%s: *%s*\n", financeDO.getAgentName(), financeDO.getNetProfit() - .toPlainString()); + .toPlainString()); message.append(formattedFinance); }); return message.toString(); diff --git a/zayac-admin-agent/src/main/java/com/zayac/admin/utils/CommonUtils.java b/zayac-admin-agent/src/main/java/com/zayac/admin/utils/CommonUtils.java index a6b90726..172f4ff7 100644 --- a/zayac-admin-agent/src/main/java/com/zayac/admin/utils/CommonUtils.java +++ b/zayac-admin-agent/src/main/java/com/zayac/admin/utils/CommonUtils.java @@ -30,28 +30,27 @@ import java.util.stream.Collectors; public class CommonUtils { public static List findChangedTeamAccount(Team prevTeam, Team currTeam) { Map team2AccountMap = currTeam.getList() - .stream() - .collect(Collectors.toMap(TeamAccount::getId, account -> account)); + .stream() + .collect(Collectors.toMap(TeamAccount::getId, account -> account)); return prevTeam.getList() - .stream() - .filter(account1 -> team2AccountMap.containsKey(account1.getId())) - .map(account1 -> { - TeamAccount account2 = team2AccountMap.get(account1.getId()); - TeamAccountWithChange changedAccount = new TeamAccountWithChange(); - BeanUtil.copyProperties(account2, changedAccount); - if (account1.getFirstDepositNum() != account2.getFirstDepositNum()) { - changedAccount.setNewDepositNum(account2.getFirstDepositNum() - account1.getFirstDepositNum()); - } - if (account1.getSubMemberNum() != account2.getSubMemberNum()) { - changedAccount.setNewRegisterNum(account2.getSubMemberNum() - account1.getSubMemberNum()); - } - return changedAccount; - }) - .collect(Collectors.toList()); + .stream() + .filter(account1 -> team2AccountMap.containsKey(account1.getId())) + .map(account1 -> { + TeamAccount account2 = team2AccountMap.get(account1.getId()); + TeamAccountWithChange changedAccount = new TeamAccountWithChange(); + BeanUtil.copyProperties(account2, changedAccount); + if (account1.getFirstDepositNum() != account2.getFirstDepositNum()) { + changedAccount.setNewDepositNum(account2.getFirstDepositNum() - account1.getFirstDepositNum()); + } + if (account1.getSubMemberNum() != account2.getSubMemberNum()) { + changedAccount.setNewRegisterNum(account2.getSubMemberNum() - account1.getSubMemberNum()); + } + return changedAccount; + }) + .collect(Collectors.toList()); } - public static List getLastNElements(List list, int n) { if (list == null || list.isEmpty() || n <= 0) { return Collections.emptyList();