@ -11,11 +11,13 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil ;
import com.baiye.config.properties.DeliveryProperties ;
import com.baiye.constant.DefaultNumberConstants ;
import com.baiye.constant.FileConstant ;
import com.baiye.modules.system.domain.Company ;
import com.baiye.modules.system.domain.TaskImei ;
import com.baiye.modules.system.service.* ;
import com.baiye.modules.system.service.dto.ImeiDTO ;
import com.baiye.modules.system.service.dto.TaskTagDto ;
import com.baiye.modules.telemarkting.entity.ClueMiddle ;
import com.baiye.util.* ;
import com.google.common.collect.Lists ;
import lombok.RequiredArgsConstructor ;
@ -48,12 +50,15 @@ public class DeliveryBalanceTask {
private final TaskImeiService taskImeiService ;
private final ClueTalkService clueTalkService ;
private final DownRecordService downRecordService ;
private final DeliveryProperties deliveryProperties ;
private final DeliveryRecordService deliveryRecordService ;
/ * *
* 修 改 时 间 为 8 点 至 21 点
* /
@ -64,8 +69,7 @@ public class DeliveryBalanceTask {
List < TaskImei > imeiList = taskImeiService . findByStatus ( DefaultNumberConstants . ZERO_NUMBER ) ;
if ( CollUtil . isNotEmpty ( imeiList ) ) {
// 根据任务id分组
Map < Long , List < TaskImei > > listMap = imeiList . stream ( )
. collect ( Collectors . groupingBy ( TaskImei : : getTaskId ) ) ;
Map < Long , List < TaskImei > > listMap = imeiList . stream ( ) . collect ( Collectors . groupingBy ( TaskImei : : getTaskId ) ) ;
for ( Map . Entry < Long , List < TaskImei > > map : listMap . entrySet ( ) ) {
Long taskId = map . getKey ( ) ;
List < TaskImei > list = listMap . get ( taskId ) ;
@ -76,111 +80,120 @@ public class DeliveryBalanceTask {
if ( ObjectUtil . isNotNull ( companyByUserId ) & &
// 判断价格
ObjectUtil . isNotNull ( companyByUserId . getDmpDeliveryFee ( ) ) ) {
boolean limitFlag = ObjectUtil . isNotNull ( companyByUserId . getDmpLimitNum ( ) ) & &
companyByUserId . getDmpLimitNum ( ) = = DefaultNumberConstants . ONE_HUNDRED ;
Integer dmpLimitNum = companyByUserId . getDmpLimitNum ( ) ;
// 判断余额
if ( companyByUserId . getUserBalance ( ) < = DefaultNumberConstants . ZERO_NUMBER | | limitFlag ) {
if ( companyByUserId . getUserBalance ( ) < = DefaultNumberConstants . ZERO_NUMBER ) {
continue ;
}
// 截取数据
if ( ObjectUtil . isNotNull ( companyByUserId . getDmpLimitNum ( ) )
& & companyByUserId . getDmpLimitNum ( ) > DefaultNumberConstants . ZERO_NUMBER
& & list . size ( ) > companyByUserId . getDmpLimitNum ( ) ) {
downList = CollUtil . sub ( list , companyByUserId . getDmpLimitNum ( ) , list . size ( ) ) ;
list = CollUtil . sub ( list , DefaultNumberConstants . ZERO_NUMBER , companyByUserId . getDmpLimitNum ( ) ) ;
if ( ObjectUtil . isNotNull ( dmpLimitNum )
& & dmpLimitNum > DefaultNumberConstants . ZERO_NUMBER ) {
// 统计今天数量
Integer count = taskImeiService . countByUserIdAndDate ( taskId , DefaultNumberConstants . FOUR_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 ) ;
}
// 每次100000 数据
List < List < TaskImei > > lists = Lists . partition
( list , DefaultNumberConstants . ONE_HUNDRED_THOUSAND ) ;
// 批量发送
for ( List < TaskImei > 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 < TaskImei > 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 < TaskImei > min = taskImeiList . stream ( ) . min ( comparing ) ;
if ( min . isPresent ( ) ) {
minId = min . get ( ) . getId ( ) ;
}
// 最大id
Optional < TaskImei > max = taskImeiList . stream ( ) . max ( comparing ) ;
if ( max . isPresent ( ) ) {
maxId = max . get ( ) . getId ( ) ;
}
if ( minId > DefaultNumberConstants . ZERO_NUMBER
& & maxId > DefaultNumberConstants . ZERO_NUMBER ) {
// 转换DTO
List < ImeiDTO > toList = Convert . toList ( ImeiDTO . class , taskImeiList ) ;
Integer batch = ObjectUtil . isNull ( num ) ?
DefaultNumberConstants . ONE_NUMBER : num + DefaultNumberConstants . ONE_NUMBER ;
String taskImeiName = "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 ( ".csv" ) ;
CSVFileUtil . createCsvFile ( toList , csvPath ) ;
String zipPath = file . concat ( ".zip" ) ;
// 设置压缩文件
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 ) ;
if ( CollUtil . isNotEmpty ( list ) ) {
// 每次100000 数据
List < List < TaskImei > > lists = Lists . partition
( list , DefaultNumberConstants . ONE_HUNDRED_THOUSAND ) ;
// 批量发送
for ( List < TaskImei > 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 < TaskImei > 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 < TaskImei > min = taskImeiList . stream ( ) . min ( comparing ) ;
if ( min . isPresent ( ) ) {
minId = min . get ( ) . getId ( ) ;
}
// 最大id
Optional < TaskImei > max = taskImeiList . stream ( ) . max ( comparing ) ;
if ( max . isPresent ( ) ) {
maxId = max . get ( ) . getId ( ) ;
}
if ( minId > DefaultNumberConstants . ZERO_NUMBER & &
maxId > DefaultNumberConstants . ZERO_NUMBER ) {
// 转换DTO
List < ImeiDTO > 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 ) ;
}
}
}
}
if ( CollUtil . isNotEmpty ( downList ) ) {
log . info ( "============================= down list size as {} =============================" , downList . size ( ) ) ;
Long minId = ( long ) DefaultNumberConstants . ZERO_NUMBER ;
Long maxId = ( long ) DefaultNumberConstants . ZERO_NUMBER ;
TaskTagDto taskTagDto = taskService . queryDmpTask ( taskId ) ;
Comparator < TaskImei > comparing = Comparator . comparing ( TaskImei : : getId ) ;
// 最小id
Optional < TaskImei > min = downList . stream ( ) . min ( comparing ) ;
if ( min . isPresent ( ) ) {
minId = min . get ( ) . getId ( ) ;
}
// 最大id
Optional < TaskImei > max = downList . stream ( ) . max ( comparing ) ;
if ( max . isPresent ( ) ) {
maxId = max . get ( ) . getId ( ) ;
}
String uuid = IdUtil . fastSimpleUUID ( ) ;
String file = deliveryProperties . getFileUrl ( ) . concat ( StrPool . SLASH ) . concat ( uuid ) ;
// 转换DTO
List < ImeiDTO > toList = Convert . toList ( ImeiDTO . class , downList ) ;
// 保存文件
String csvPath = file . concat ( ".csv" ) ;
CSVFileUtil . createCsvFile ( toList , csvPath ) ;
String zipPath = file . concat ( ".zip" ) ;
String filePath = deliveryProperties . getDmpDownPath ( ) . concat ( uuid ) . concat ( ".zip" ) ;
// 设置压缩文件
CompressUtil . decryptionCompression ( zipPath , csvPath , deliveryProperties . getZipPassword ( ) ) ;
downRecordService . createRecord ( downList . size ( ) , companyByUserId . getCompanyName ( ) , taskTagDto . getTaskName ( ) , zipPath , filePath , null , DefaultNumberConstants . ONE_NUMBER ) ;
// 修改状态
taskImeiService . updateBath ( taskId , CharSequenceUtil . EMPTY , DefaultNumberConstants . ONE_NUMBER , minId , maxId ) ;
// 处理下载包
zipDownList ( taskId , downList , companyByUserId ) ;
}
}
}
}
}
private void zipDownList ( Long taskId , List < TaskImei > downList , Company companyByUserId ) {
log . info ( "============================= down list size as {} =============================" , downList . size ( ) ) ;
Long minId = ( long ) DefaultNumberConstants . ZERO_NUMBER ;
Long maxId = ( long ) DefaultNumberConstants . ZERO_NUMBER ;
TaskTagDto taskTagDto = taskService . queryDmpTask ( taskId ) ;
Comparator < TaskImei > comparing = Comparator . comparing ( TaskImei : : getId ) ;
// 最小id
Optional < TaskImei > min = downList . stream ( ) . min ( comparing ) ;
if ( min . isPresent ( ) ) {
minId = min . get ( ) . getId ( ) ;
}
// 最大id
Optional < TaskImei > max = downList . stream ( ) . max ( comparing ) ;
if ( max . isPresent ( ) ) {
maxId = max . get ( ) . getId ( ) ;
}
String uuid = IdUtil . fastSimpleUUID ( ) ;
String file = deliveryProperties . getFileUrl ( ) . concat ( StrPool . SLASH ) . concat ( uuid ) ;
// 转换DTO
List < ImeiDTO > toList = Convert . toList ( ImeiDTO . class , downList ) ;
// 保存文件
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 ) ;
String filePath = deliveryProperties . getDmpDownPath ( ) . concat ( uuid ) . concat ( FileConstant . ZIP_FILE_SUB_NAME ) ;
// 设置压缩文件
CompressUtil . decryptionCompression ( zipPath , csvPath , deliveryProperties . getZipPassword ( ) ) ;
downRecordService . createRecord ( downList . size ( ) , companyByUserId . getCompanyName ( ) , taskTagDto . getTaskName ( ) , zipPath , filePath , null , DefaultNumberConstants . ONE_NUMBER ) ;
// 修改状态
taskImeiService . updateBath ( taskId , CharSequenceUtil . EMPTY , DefaultNumberConstants . ONE_NUMBER , minId , maxId ) ;
}
}