From a79702513870d2609f2f91fd327b560f40b6e91a Mon Sep 17 00:00:00 2001 From: bynt Date: Tue, 14 Mar 2023 11:21:07 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=A3=E7=A0=81=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/baiye/timed/DeliveryBalanceTask.java | 157 ++++++++++-------- 1 file changed, 85 insertions(+), 72 deletions(-) diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java index d9effd72..11406044 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DeliveryBalanceTask.java @@ -32,6 +32,8 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Collectors; /** @@ -43,6 +45,8 @@ import java.util.stream.Collectors; @RequiredArgsConstructor public class DeliveryBalanceTask { + private final Lock lock = new ReentrantLock(); + private final RedisUtils redisUtils; private final TaskService taskService; @@ -81,7 +85,7 @@ public class DeliveryBalanceTask { UserDto userInfo = userService.findUserInfo(userId); if (ObjectUtil.isNotNull(userInfo) && Boolean.TRUE.equals(userInfo.getEnabled()) - && ObjectUtil.isNotNull(companyByUserId) + && ObjectUtil.isNotNull(companyByUserId) // 判断价格 && ObjectUtil.isNotNull(companyByUserId.getDmpDeliveryFee())) { Integer dmpLimitNum = companyByUserId.getDmpLimitNum(); @@ -90,85 +94,94 @@ public class DeliveryBalanceTask { || companyByUserId.getUserBalance() < DefaultNumberConstants.TWO_HUNDRED) { continue; } - // 截取数据 - if (ObjectUtil.isNotNull(dmpLimitNum) - && dmpLimitNum > DefaultNumberConstants.ZERO_NUMBER) { - // 统计今天数量 - Integer count = taskImeiService.countByUserIdAndDate(taskId, DefaultNumberConstants.ONE_NUMBER); - downList = CollUtil.sub(list, count >= - dmpLimitNum ? DefaultNumberConstants.ZERO_NUMBER : dmpLimitNum, list.size()); - list = CollUtil.sub(list, DefaultNumberConstants.ZERO_NUMBER, - count >= dmpLimitNum ? DefaultNumberConstants.ZERO_NUMBER : dmpLimitNum); - } - - if (CollUtil.isNotEmpty(list)) { - // 每次100000 数据 - List> lists = Lists.partition - (list, DefaultNumberConstants.ONE_HUNDRED_THOUSAND); - // 批量发送 - for (List taskImeiList : lists) { - Long minId = (long) DefaultNumberConstants.ZERO_NUMBER; - Long maxId = (long) DefaultNumberConstants.ZERO_NUMBER; - // 大于100 进行兑换 - if (taskImeiList.size() >= DefaultNumberConstants.ONE_HUNDRED) { - String fileUrl = deliveryProperties.getFileUrl(); - Comparator comparing = Comparator.comparing(TaskImei::getId); - String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); - Integer num = (Integer) redisUtils.get(CacheKey.DMP_REQUEST_ID.concat(format)); - // 最小id - Optional min = taskImeiList.stream().min(comparing); - if (min.isPresent()) { - minId = min.get().getId(); - } - // 最大id - Optional max = taskImeiList.stream().max(comparing); - if (max.isPresent()) { - maxId = max.get().getId(); - } - if (minId > DefaultNumberConstants.ZERO_NUMBER && - maxId > DefaultNumberConstants.ZERO_NUMBER) { - // 转换DTO - List toList = Convert.toList(ImeiDTO.class, taskImeiList); - Integer batch = ObjectUtil.isNull(num) ? - DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER; - String taskImeiName = FileConstant.BY.concat(StrPool.UNDERLINE). - concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch)); - String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName); - // 保存文件 - String csvPath = file.concat(StrPool.DOT).concat(FileConstant.CSV_FILE_SUB_NAME); - CSVFileUtil.createCsvFile(toList, csvPath); - String zipPath = file.concat(FileConstant.ZIP_FILE_SUB_NAME); - // 设置压缩文件 - CompressUtil.decryptionCompression(zipPath, csvPath, deliveryProperties.getZipPassword()); - // 发送邮件 - MailUtil.sendMail(deliveryProperties.getEmailAddress(), - deliveryProperties.getEmailPassword(), deliveryProperties.getToEmailAddress(), zipPath, taskImeiName); - - // 保存发送记录 - deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName, - taskImeiList.size(), taskId, userId, DefaultNumberConstants.ONE_NUMBER); - // 保存批次号 - redisUtils.set(CacheKey.DMP_REQUEST_ID.concat(format), batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS); - // 批次修改状态 - taskImeiService.updateBath(taskId, CharSequenceUtil.EMPTY, DefaultNumberConstants.ONE_NUMBER, minId, maxId); - - // 删除文件 - boolean csvResult = FileUtil.del(csvPath); - boolean zipResult = FileUtil.del(zipPath); - log.info("=========================== the csv path as {}, zip path as {} " + " csvResult as {} zipResult as {} ========================", csvPath, zipPath, csvResult, zipResult); - } + lock.lock(); + try { + // 截取数据 + if (ObjectUtil.isNotNull(dmpLimitNum) + && dmpLimitNum > DefaultNumberConstants.ZERO_NUMBER) { + // 统计今天数量 + Integer count = taskImeiService.countByUserIdAndDate(taskId, DefaultNumberConstants.ONE_NUMBER); + downList = CollUtil.sub(list, count >= + dmpLimitNum ? DefaultNumberConstants.ZERO_NUMBER : dmpLimitNum, list.size()); + list = CollUtil.sub(list, DefaultNumberConstants.ZERO_NUMBER, + count >= dmpLimitNum ? DefaultNumberConstants.ZERO_NUMBER : dmpLimitNum); + } + if (CollUtil.isNotEmpty(list)) { + // 每次100000 数据 + List> lists = Lists.partition + (list, DefaultNumberConstants.ONE_HUNDRED_THOUSAND); + // 批量发送 + for (List taskImeiList : lists) { + // 发送邮件并修改状态 + sendMailAndUpdateImeiStatus(taskId, userId, taskImeiList); } } - } - if (CollUtil.isNotEmpty(downList)) { - // 处理下载包 - zipDownList(taskId, downList, companyByUserId); + if (CollUtil.isNotEmpty(downList) && downList.size() > DefaultNumberConstants.ONE_HUNDRED) { + // 处理下载包 + zipDownList(taskId, downList, companyByUserId); + } + } finally { + lock.unlock(); } } } } } + private void sendMailAndUpdateImeiStatus(Long taskId, Long userId, List taskImeiList) { + Long minId = (long) DefaultNumberConstants.ZERO_NUMBER; + Long maxId = (long) DefaultNumberConstants.ZERO_NUMBER; + // 大于100 进行兑换 + if (taskImeiList.size() >= DefaultNumberConstants.ONE_HUNDRED) { + String fileUrl = deliveryProperties.getFileUrl(); + Comparator comparing = Comparator.comparing(TaskImei::getId); + String format = DateUtil.format(DateUtil.date(), DatePattern.PURE_DATE_PATTERN); + Integer num = (Integer) redisUtils.get(CacheKey.DMP_REQUEST_ID.concat(format)); + // 最小id + Optional min = taskImeiList.stream().min(comparing); + if (min.isPresent()) { + minId = min.get().getId(); + } + // 最大id + Optional max = taskImeiList.stream().max(comparing); + if (max.isPresent()) { + maxId = max.get().getId(); + } + if (minId > DefaultNumberConstants.ZERO_NUMBER && + maxId > DefaultNumberConstants.ZERO_NUMBER) { + // 转换DTO + List toList = Convert.toList(ImeiDTO.class, taskImeiList); + Integer batch = ObjectUtil.isNull(num) ? + DefaultNumberConstants.ONE_NUMBER : num + DefaultNumberConstants.ONE_NUMBER; + String taskImeiName = FileConstant.BY.concat(StrPool.UNDERLINE). + concat(format).concat(StrPool.UNDERLINE).concat(String.valueOf(batch)); + String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName); + // 保存文件 + String csvPath = file.concat(StrPool.DOT).concat(FileConstant.CSV_FILE_SUB_NAME); + CSVFileUtil.createCsvFile(toList, csvPath); + String zipPath = file.concat(FileConstant.ZIP_FILE_SUB_NAME); + // 设置压缩文件 + CompressUtil.decryptionCompression(zipPath, csvPath, deliveryProperties.getZipPassword()); + // 发送邮件 + MailUtil.sendMail(deliveryProperties.getEmailAddress(), + deliveryProperties.getEmailPassword(), deliveryProperties.getToEmailAddress(), zipPath, taskImeiName); + + // 保存发送记录 + deliveryRecordService.saveDeliveryRecord(zipPath, taskImeiName, + taskImeiList.size(), taskId, userId, DefaultNumberConstants.ONE_NUMBER); + // 保存批次号 + redisUtils.set(CacheKey.DMP_REQUEST_ID.concat(format), batch, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS); + // 批次修改状态 + taskImeiService.updateBath(taskId, CharSequenceUtil.EMPTY, DefaultNumberConstants.ONE_NUMBER, minId, maxId); + + // 删除文件 + boolean csvResult = FileUtil.del(csvPath); + boolean zipResult = FileUtil.del(zipPath); + log.info("=========================== the csv path as {}, zip path as {} " + " csvResult as {} zipResult as {} ========================", csvPath, zipPath, csvResult, zipResult); + } + } + } + private void zipDownList(Long taskId, List downList, Company companyByUserId) { log.info("============================= down list size as {} =============================", downList.size()); Long minId = (long) DefaultNumberConstants.ZERO_NUMBER; From 578142b92f90434a92ad843efb37b68b8d0dc01e Mon Sep 17 00:00:00 2001 From: bynt Date: Tue, 14 Mar 2023 16:33:21 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/controller/UserController.java | 8 +++--- .../modules/system/service/UserService.java | 5 ++-- .../system/service/impl/UserServiceImpl.java | 26 +++++++------------ 3 files changed, 16 insertions(+), 23 deletions(-) diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java index 2d499153..78a78503 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java @@ -190,8 +190,9 @@ public class UserController { UserDto userDto = JSONUtil.toBean(SecurityUtils.getUser(), UserDto.class); List userFavorOfExcels = ReadExcelUtils.readExcelByClass(file, UserFavorOfExcel.class); - return new ResponseEntity<>(userService.fileCreateUser - (userFavorOfExcels, userDto.getCompanyId(), userDto), HttpStatus.OK); + userService.fileCreateUser + (userFavorOfExcels, userDto.getCompanyId(), userDto); + return new ResponseEntity<>(HttpStatus.OK); } return new ResponseEntity<>(HttpStatus.OK); } @@ -199,7 +200,8 @@ public class UserController { @ApiOperation("创建或导入用户") @PostMapping(value = "/createUsers") public ResponseEntity> createUsers(@Validated @RequestBody CreateUserDTO userDTO) { - return new ResponseEntity<>(userService.createUserOrFile(userDTO), HttpStatus.OK); + userService.createUserOrFile(userDTO); + return new ResponseEntity<>(HttpStatus.OK); } @ApiOperation("删除用户") diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java index b855f191..7eb2ede2 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/UserService.java @@ -178,7 +178,7 @@ public interface UserService { * @return * @throws IOException */ - Map fileCreateUser(List file, Long companyId, UserDto userDto); + void fileCreateUser(List file, Long companyId, UserDto userDto); /** * 查询用户树状图 @@ -209,9 +209,8 @@ public interface UserService { * 创建用户 * * @param userDTO - * @return 返回信息 */ - Map createUserOrFile(CreateUserDTO userDTO); + void createUserOrFile(CreateUserDTO userDTO); /** * 批量开通用户过期时间 diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java index 7719b1b3..a9ab1435 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java @@ -76,7 +76,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.util.*; -import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; /** @@ -138,9 +137,8 @@ public class UserServiceImpl implements UserService { @Override @Transactional(rollbackFor = Exception.class) - public Map fileCreateUser(List excels, Long companyId, UserDto userDto) { + public void fileCreateUser(List excels, Long companyId, UserDto userDto) { Company byId = companyService.findById(companyId); - Map map = Maps.newConcurrentMap(); if (CollUtil.isNotEmpty(excels) && byId != null) { User copyUser; Set roles = new HashSet<>(); @@ -160,19 +158,16 @@ public class UserServiceImpl implements UserService { throw new EntityExistException(User.class, "phone", user.getPhone()); } // 随机密码 - String randomNumbers = RandomUtil.randomNumbers(DefaultNumberConstants.SIX_NUMBER); copyUser.setUsername(username); copyUser.setPassword(passwordEncoder.encode - (org.apache.commons.lang3.StringUtils.isEmpty(user.getPassword()) - ? user.getPassword() : randomNumbers)); + (StringUtils.isNotBlank(user.getPassword()) + ? user.getPassword() : "123456")); copyUser.setWhichUserId(userDto.getId()); copyUser.setCompanyId(companyId); copyUser.setEnabled(Boolean.FALSE); - map.put(username, randomNumbers); userRepository.save(copyUser); } } - return map; } @Override @@ -221,8 +216,7 @@ public class UserServiceImpl implements UserService { @Override @Transactional(rollbackFor = Exception.class) - public Map createUserOrFile(CreateUserDTO userDTO) { - Map userMap = Maps.newConcurrentMap(); + public void createUserOrFile(CreateUserDTO userDTO) { Long companyId = null; User user = new User(); boolean flag = Boolean.FALSE; @@ -247,7 +241,7 @@ public class UserServiceImpl implements UserService { String randomNumbers = RandomUtil.randomNumbers(DefaultNumberConstants.SIX_NUMBER); companyId = companyId != null ? companyId : SecurityUtils.getCompanyId(); - userDTO.setPassword(passwordEncoder.encode(randomNumbers)); + userDTO.setPassword(StringUtils.isNotBlank(userDTO.getPassword()) ? userDTO.getPassword() : "123456"); // 验证子账号 Integer sonUserNum = companyService.findCompanyInfo(companyId).getSonUserNum(); int size = userRepository.findByCompanyId(companyId).size(); @@ -262,9 +256,7 @@ public class UserServiceImpl implements UserService { user.setWhichUserId(userId); user.setIsReview(Boolean.FALSE); user.setTurnCrmNum(50); - userMap.put(user.getUsername(), randomNumbers); User userCreateResult = create(user); - //todo 如果是管理员 则创建任务 if (flag) { if (userDTO.getCompanyType() != null && userDTO.getCompanyType() == 1) { @@ -286,12 +278,9 @@ public class UserServiceImpl implements UserService { CompanyDto dto = new CompanyDto(); dto.setUserId(userCreateResult.getId()); List userFavorOfExcels = ReadExcelUtils.readExcelByClass(file, UserFavorOfExcel.class); - Map map = fileCreateUser(userFavorOfExcels, + fileCreateUser(userFavorOfExcels, companyId, Convert.convert(UserDto.class, userCreateResult)); - // 插入文件导入用户 - userMap.putAll(map); } - return userMap; } /** @@ -524,6 +513,9 @@ public class UserServiceImpl implements UserService { } } + if (StringUtils.isBlank(resources.getPassword())) { + user.setPassword(passwordEncoder.encode(resources.getPassword())); + } user.setIsReview(resources.getIsReview()); user.setEmail(resources.getEmail()); user.setEnabled(resources.getEnabled()); From 5dd0667cf3f63cd9a62a266c08be5d494e90870d Mon Sep 17 00:00:00 2001 From: bynt Date: Wed, 15 Mar 2023 10:39:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baiye/modules/system/service/impl/UserServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java index a9ab1435..eb152177 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java @@ -238,10 +238,10 @@ public class UserServiceImpl implements UserService { companyDto.setStatus(DefaultNumberConstants.ZERO_NUMBER); companyId = companyService.createCompany(companyDto).getId(); } - String randomNumbers = RandomUtil.randomNumbers(DefaultNumberConstants.SIX_NUMBER); + companyId = companyId != null ? companyId : SecurityUtils.getCompanyId(); - userDTO.setPassword(StringUtils.isNotBlank(userDTO.getPassword()) ? userDTO.getPassword() : "123456"); + userDTO.setPassword(passwordEncoder.encode(StringUtils.isNotBlank(userDTO.getPassword()) ? userDTO.getPassword() : "123456")); // 验证子账号 Integer sonUserNum = companyService.findCompanyInfo(companyId).getSonUserNum(); int size = userRepository.findByCompanyId(companyId).size(); From 595d90260011887a3031ceef2de984e8b908250b Mon Sep 17 00:00:00 2001 From: bynt Date: Wed, 15 Mar 2023 10:47:55 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=B0=86=E5=AF=86=E7=A0=81=E7=BD=AE?= =?UTF-8?q?=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../baiye/modules/system/controller/UserController.java | 2 +- .../modules/system/service/impl/UserServiceImpl.java | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java index 78a78503..67e2c994 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/controller/UserController.java @@ -128,7 +128,7 @@ public class UserController { @ApiOperation("查询用户") @GetMapping - @PreAuthorize("@el.check('task:source')") + @PreAuthorize("@el.check('user:list')") public ResponseEntity query(UserQueryCriteria criteria, Pageable pageable) { UserDto userDto = JSONUtil.toBean(SecurityUtils.getUser(), UserDto.class); if (userDto != null) { diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java index eb152177..06475173 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/system/service/impl/UserServiceImpl.java @@ -20,11 +20,9 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.StrPool; -import cn.hutool.core.util.IdUtil; -import cn.hutool.core.util.NumberUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.*; import com.baiye.config.BusinessConfig; import com.baiye.config.properties.FileProperties; import com.baiye.constant.DefaultNumberConstants; @@ -53,6 +51,7 @@ import com.baiye.modules.system.repository.UserRepository; import com.baiye.modules.system.service.UserService; import com.baiye.modules.telemarkting.service.ExtensionNumberService; import com.baiye.util.*; +import com.baiye.util.PageUtil; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -379,7 +378,7 @@ public class UserServiceImpl implements UserService { public Object queryAll(UserQueryCriteria criteria, Pageable pageable) { Page page = userRepository. findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable); - + page.getContent().forEach(user -> user.setPassword(CharSequenceUtil.EMPTY)); return PageUtil.toPage(page.map(userMapper::toDto)); }