Merge remote-tracking branch 'origin/master'
commit
8384dc6aad
@ -0,0 +1,46 @@
|
|||||||
|
package com.baiyee.adcallback.api.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/5/31
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
public class TfSourceDTO {
|
||||||
|
/**
|
||||||
|
* 点击时间
|
||||||
|
*/
|
||||||
|
private String clickTime;
|
||||||
|
/**
|
||||||
|
* '广告名称'
|
||||||
|
*/
|
||||||
|
private String adName;
|
||||||
|
/**
|
||||||
|
* '安卓设备id'
|
||||||
|
*/
|
||||||
|
private String imei;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* '苹果设备id'
|
||||||
|
*/
|
||||||
|
private String idfa;
|
||||||
|
/**
|
||||||
|
* mac地址
|
||||||
|
*/
|
||||||
|
private String mac;
|
||||||
|
/**
|
||||||
|
* '安卓系统移动终端补充设备标识'
|
||||||
|
*/
|
||||||
|
private String oaid;
|
||||||
|
/**
|
||||||
|
* '用于监测链接的自定义带参格式'
|
||||||
|
*/
|
||||||
|
private String tag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* '用于区分广告配置的地方'
|
||||||
|
*/
|
||||||
|
private Integer vpoint;
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
package com.baiyee.adcallback.repository;
|
||||||
|
|
||||||
|
import com.baiyee.adcallback.repository.entity.TbTfSourceEntity;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/5/31
|
||||||
|
*/
|
||||||
|
public interface TbTfSourceEntityRepository extends JpaRepository<TbTfSourceEntity, Long> {
|
||||||
|
}
|
@ -0,0 +1,89 @@
|
|||||||
|
package com.baiyee.adcallback.repository.entity;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.data.annotation.CreatedDate;
|
||||||
|
import org.springframework.data.annotation.LastModifiedBy;
|
||||||
|
import org.springframework.data.annotation.LastModifiedDate;
|
||||||
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
||||||
|
import org.springframework.format.annotation.DateTimeFormat;
|
||||||
|
|
||||||
|
import javax.persistence.*;
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/5/31
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@Entity
|
||||||
|
@Table(name = "tb_tf_source", schema = "db_ad")
|
||||||
|
@EntityListeners(AuditingEntityListener.class)
|
||||||
|
public class TbTfSourceEntity implements Serializable {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@Column(name = "id")
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@Column(name = "gmt_create")
|
||||||
|
@CreatedDate
|
||||||
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date gmtCreate;
|
||||||
|
|
||||||
|
@Column(name = "gmt_modified")
|
||||||
|
@LastModifiedDate
|
||||||
|
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
|
private Date gmtModified;
|
||||||
|
|
||||||
|
@LastModifiedBy
|
||||||
|
@Column(name = "operator")
|
||||||
|
private String operator;
|
||||||
|
|
||||||
|
@Column(name = "produce_time")
|
||||||
|
private String produceTime;
|
||||||
|
|
||||||
|
@Column(name = "ad_name")
|
||||||
|
private String adName;
|
||||||
|
|
||||||
|
@Column(name = "category")
|
||||||
|
private String category;
|
||||||
|
|
||||||
|
@Column(name = "file_name")
|
||||||
|
private String fileName;
|
||||||
|
|
||||||
|
@Column(name = "file_path")
|
||||||
|
private String filePath;
|
||||||
|
|
||||||
|
@Column(name = "file_pwd")
|
||||||
|
private String filePwd;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文件状态, 1-正在生成 2-正常 3-禁用 4-删除
|
||||||
|
*/
|
||||||
|
@Column(name = "file_status")
|
||||||
|
private Integer fileStatus;
|
||||||
|
|
||||||
|
@Column(name = "last_operator_time")
|
||||||
|
@LastModifiedDate
|
||||||
|
private Date lastOperatorTime;
|
||||||
|
|
||||||
|
@Column(name = "weight")
|
||||||
|
private Integer weight;
|
||||||
|
|
||||||
|
|
||||||
|
public TbTfSourceEntity addTbTfSourceEntity(String produceTime, String adName, String category, String fileName, String filePath, String filePwd) {
|
||||||
|
this.setProduceTime(produceTime);
|
||||||
|
this.setAdName(adName);
|
||||||
|
this.setCategory(category);
|
||||||
|
this.setFileName(fileName);
|
||||||
|
this.setFilePath(filePath);
|
||||||
|
this.setFilePwd(filePwd);
|
||||||
|
this.setFileStatus(2);
|
||||||
|
this.setWeight(0);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
@ -1,17 +0,0 @@
|
|||||||
package com.baiyee.adcallback.service;
|
|
||||||
|
|
||||||
import com.baiyee.adcallback.api.vo.*;
|
|
||||||
|
|
||||||
public interface AdTFPackageService {
|
|
||||||
|
|
||||||
void loadBDPackageData(BDMobileMonitorCallbackRequestNewVO vo);
|
|
||||||
|
|
||||||
void loadGDTPackageData(GdtMobileMonitorCallbackRequestNewVO vo);
|
|
||||||
|
|
||||||
void loadJLTFV1PackageData(JuliangMobileMonitorCallbackRequestNewV1VO vo);
|
|
||||||
|
|
||||||
|
|
||||||
void loadJLTFV2PackageData(JuliangMobileMonitorCallbackRequestNewV2VO vo);
|
|
||||||
|
|
||||||
void loadKSTFPackageData(KSNewMobileMonitorCallbackRequestVO vo);
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
package com.baiyee.adcallback.service.impl;
|
|
||||||
|
|
||||||
import com.baiyee.adcallback.api.constants.VpointEnum;
|
|
||||||
import com.baiyee.adcallback.api.vo.*;
|
|
||||||
import com.baiyee.adcallback.service.AdTFPackageService;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
@Slf4j
|
|
||||||
public class AdJLTFPackageServiceImpl implements AdTFPackageService {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadBDPackageData(BDMobileMonitorCallbackRequestNewVO vo) {
|
|
||||||
// log - 埋点
|
|
||||||
log.info("================================= [finish check, do data loading, AdJLTFPackageServiceImpl|loadBDPackageData, tag is {} , vpoint is {}] =================================",
|
|
||||||
vo.getTag(), VpointEnum.vPointCodeConvertStatus(vo.getVpoint()));
|
|
||||||
// TODO: 2023/5/26 0026
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public void loadKSTFPackageData(KSNewMobileMonitorCallbackRequestVO vo) {
|
|
||||||
// log - 埋点
|
|
||||||
log.info("================================= [finish check, do data loading, AdJLTFPackageServiceImpl|loadKSTFPackageData, tag is {} , vpoint is {}] =================================",
|
|
||||||
vo.getTag(), VpointEnum.vPointCodeConvertStatus(vo.getVpoint()));
|
|
||||||
// TODO: 2023/5/26 0026
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadGDTPackageData(GdtMobileMonitorCallbackRequestNewVO vo) {
|
|
||||||
// log - 埋点
|
|
||||||
log.info("================================= [finish check, do data loading, AdJLTFPackageServiceImpl|loadGDTPackageData, tag is {} , vpoint is {}] =================================",
|
|
||||||
vo.getTag(), VpointEnum.vPointCodeConvertStatus(vo.getVpoint()));
|
|
||||||
// TODO: 2023/5/26 0026
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadJLTFV1PackageData(JuliangMobileMonitorCallbackRequestNewV1VO vo) {
|
|
||||||
// log - 埋点
|
|
||||||
log.info("================================= [finish check, do data loading, AdJLTFPackageServiceImpl|loadJLTFV1PackageData, tag is {} , vpoint is {}] =================================",
|
|
||||||
vo.getTag(), VpointEnum.vPointCodeConvertStatus(vo.getVpoint()));
|
|
||||||
// TODO: 2023/5/18 0018
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void loadJLTFV2PackageData(JuliangMobileMonitorCallbackRequestNewV2VO vo) {
|
|
||||||
// log - 埋点
|
|
||||||
log.info("================================= [finish check, do data loading, AdJLTFPackageServiceImpl|loadJLTFV2PackageData, tag is {} , vpoint is {}] =================================",
|
|
||||||
vo.getTag(), VpointEnum.vPointCodeConvertStatus(vo.getVpoint()));
|
|
||||||
// TODO: 2023/5/18 0018
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
@ -0,0 +1,181 @@
|
|||||||
|
package com.baiyee.adcallback.task;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.convert.Convert;
|
||||||
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.text.csv.CsvWriter;
|
||||||
|
import cn.hutool.core.util.RandomUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import com.baiyee.adcallback.api.dto.TfSourceDTO;
|
||||||
|
import com.baiyee.adcallback.common.util.FileUtil;
|
||||||
|
import com.baiyee.adcallback.repository.*;
|
||||||
|
import com.baiyee.adcallback.repository.entity.*;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import net.lingala.zip4j.core.ZipFile;
|
||||||
|
import net.lingala.zip4j.exception.ZipException;
|
||||||
|
import net.lingala.zip4j.model.ZipParameters;
|
||||||
|
import net.lingala.zip4j.util.Zip4jConstants;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author wjt
|
||||||
|
* @date 2023/5/31
|
||||||
|
*/
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class TfSourceTask {
|
||||||
|
|
||||||
|
private final TbJLV2BackdataEntityRepository tbJLV2BackdataEntityRepository;
|
||||||
|
private final TbJLV1BackdataEntityRepository tbJLV1BackdataEntityRepository;
|
||||||
|
private final TbGdtNewBackdataEntityRepository tbGdtNewBackdataEntityRepository;
|
||||||
|
private final TbKSNewBackdataEntityRepository tbKSNewBackdataEntityRepository;
|
||||||
|
private final TbBDNewBackdataEntityRepository tbBDNewBackdataEntityRepository;
|
||||||
|
private final TbTfSourceEntityRepository tbTfSourceEntityRepository;
|
||||||
|
|
||||||
|
@Value("${tf.source.path}")
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每天晚上23点 30分
|
||||||
|
* <p>
|
||||||
|
* 所有今天的数据压缩成投放包
|
||||||
|
*/
|
||||||
|
@Scheduled(cron = "0 30 23 * * ? ")
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void tfSource() {
|
||||||
|
log.info("++++++++++++++++++++++TfSource Sync start time {} ++++++++++++++++", DateUtil.now());
|
||||||
|
String startTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd 00:00:00");
|
||||||
|
String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd 23:59:59");
|
||||||
|
List<TfSourceDTO> list = new ArrayList<>();
|
||||||
|
//jlv2
|
||||||
|
obtainDateByJlV2(startTime, endTime, list);
|
||||||
|
//jlv1
|
||||||
|
obtainDateByJlv1(startTime, endTime, list);
|
||||||
|
//gdt
|
||||||
|
obtainDateByGdt(startTime, endTime, list);
|
||||||
|
//ks
|
||||||
|
obtainDateByKs(startTime, endTime, list);
|
||||||
|
//bd
|
||||||
|
obtainDateByBd(startTime, endTime, list);
|
||||||
|
|
||||||
|
if (CollUtil.isEmpty(list)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//tag分组
|
||||||
|
HashMap<String, List<TfSourceDTO>> mapByTag = new HashMap<>(list.stream().collect(Collectors.groupingBy(TfSourceDTO::getTag, Collectors.toList())));
|
||||||
|
|
||||||
|
String format = DateUtil.format(DateUtil.date(), "yyyy-MM-dd");
|
||||||
|
List<TbTfSourceEntity> saveList = new ArrayList<>();
|
||||||
|
for (String tag : mapByTag.keySet()) {
|
||||||
|
String password = RandomUtil.randomString(6);
|
||||||
|
//压缩文件
|
||||||
|
String filePath = generateFile(tag, format, password, mapByTag.get(tag));
|
||||||
|
if (StrUtil.isNotBlank(filePath)) {
|
||||||
|
//保存文件记录
|
||||||
|
TbTfSourceEntity tbTfSourceEntity = new TbTfSourceEntity().addTbTfSourceEntity(format, null, null, tag, filePath, password);
|
||||||
|
saveList.add(tbTfSourceEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tbTfSourceEntityRepository.saveAll(saveList);
|
||||||
|
log.info("++++++++++++++++++++++TfSource Sync end time {} ++++++++++++++++", DateUtil.now());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成文件
|
||||||
|
*
|
||||||
|
* @param tag
|
||||||
|
* @param list
|
||||||
|
*/
|
||||||
|
private String generateFile(String tag, String format, String password, List<TfSourceDTO> list) {
|
||||||
|
String filePath = path + format;
|
||||||
|
File file = new File(filePath + File.separator + tag + ".csv");
|
||||||
|
CsvWriter writer = new CsvWriter(file, StandardCharsets.UTF_8);
|
||||||
|
writer.writeBeans(list);
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
|
return zipFile(file, filePath + File.separator + tag + ".zip", password);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成加密压缩包
|
||||||
|
*
|
||||||
|
* @param srcFile
|
||||||
|
* @param newPath
|
||||||
|
* @param password
|
||||||
|
*/
|
||||||
|
private String zipFile(File srcFile, String newPath, String password) {
|
||||||
|
ZipParameters zipParameters = new ZipParameters();
|
||||||
|
zipParameters.setEncryptionMethod(Zip4jConstants.COMP_DEFLATE);
|
||||||
|
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
|
||||||
|
if (StrUtil.isNotBlank(password)) {
|
||||||
|
zipParameters.setEncryptFiles(true);
|
||||||
|
zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
|
||||||
|
zipParameters.setPassword(password.toCharArray());
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
ZipFile zipFile = new ZipFile(newPath);
|
||||||
|
if (srcFile.isDirectory()) {
|
||||||
|
zipFile.addFolder(srcFile, zipParameters);
|
||||||
|
} else {
|
||||||
|
zipFile.addFile(srcFile, zipParameters);
|
||||||
|
}
|
||||||
|
FileUtil.del(srcFile);
|
||||||
|
return newPath;
|
||||||
|
} catch (ZipException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void obtainDateByJlV2(String startTime, String endTime, List<TfSourceDTO> list) {
|
||||||
|
List<TbJLBackDataV2Entity> jlV2Data = tbJLV2BackdataEntityRepository.queryByDate(startTime, endTime);
|
||||||
|
if (CollUtil.isNotEmpty(jlV2Data)) {
|
||||||
|
List<TfSourceDTO> tfSourceDTOS = Convert.toList(TfSourceDTO.class, jlV2Data);
|
||||||
|
list.addAll(tfSourceDTOS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void obtainDateByJlv1(String startTime, String endTime, List<TfSourceDTO> list) {
|
||||||
|
List<TbJLBackDataV1Entity> jlV1Data = tbJLV1BackdataEntityRepository.queryByDate(startTime, endTime);
|
||||||
|
if (CollUtil.isNotEmpty(jlV1Data)) {
|
||||||
|
List<TfSourceDTO> tfSourceDTOS = Convert.toList(TfSourceDTO.class, jlV1Data);
|
||||||
|
list.addAll(tfSourceDTOS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void obtainDateByGdt(String startTime, String endTime, List<TfSourceDTO> list) {
|
||||||
|
List<TbGdtNewBackdataEntity> jlV2Data = tbGdtNewBackdataEntityRepository.queryByDate(startTime, endTime);
|
||||||
|
if (CollUtil.isNotEmpty(jlV2Data)) {
|
||||||
|
List<TfSourceDTO> tfSourceDTOS = Convert.toList(TfSourceDTO.class, jlV2Data);
|
||||||
|
list.addAll(tfSourceDTOS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void obtainDateByKs(String startTime, String endTime, List<TfSourceDTO> list) {
|
||||||
|
List<TbKSNewBackdataEntity> jlV2Data = tbKSNewBackdataEntityRepository.queryByDate(startTime, endTime);
|
||||||
|
if (CollUtil.isNotEmpty(jlV2Data)) {
|
||||||
|
List<TfSourceDTO> tfSourceDTOS = Convert.toList(TfSourceDTO.class, jlV2Data);
|
||||||
|
list.addAll(tfSourceDTOS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void obtainDateByBd(String startTime, String endTime, List<TfSourceDTO> list) {
|
||||||
|
List<TbBdNewBackdataEntity> jlV2Data = tbBDNewBackdataEntityRepository.queryByDate(startTime, endTime);
|
||||||
|
if (CollUtil.isNotEmpty(jlV2Data)) {
|
||||||
|
List<TfSourceDTO> tfSourceDTOS = Convert.toList(TfSourceDTO.class, jlV2Data);
|
||||||
|
list.addAll(tfSourceDTOS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue