diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/constant/SecretConstant.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecretConstant.java similarity index 84% rename from ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/constant/SecretConstant.java rename to ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecretConstant.java index e3878b01..ec3b8d23 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/constant/SecretConstant.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecretConstant.java @@ -1,4 +1,4 @@ -package com.baiye.module.constant; +package com.baiye.constant; /** * 有关加解密的常量类 @@ -11,6 +11,12 @@ public class SecretConstant { public static final String SECRET_DECRYPT_YY_URL = "https://bd.hzdaba.cn:8085/v3/Accounts/yuyou_bd/BigData/DecryptTel"; + /** + * 加密链接 + */ + public static final String SECRET_ENCRYPT_YY_URL = "https://bd.hzdaba.cn:8085/v3/Accounts/yuyou_bd/BigData/EncryptTel"; + + /** * 是否黑名单 */ diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecurityConstants.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecurityConstants.java index ef3d69da..93a88b0e 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecurityConstants.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/constant/SecurityConstants.java @@ -60,7 +60,7 @@ public final class SecurityConstants { /** * 登录成功 */ - public static final String LOGIN_SUCCESS = "Success"; + public static final String SUCCESS = "Success"; /** * 注销 diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/MailRequestEnum.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/MailRequestEnum.java index 2a12fd56..5fb48107 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/MailRequestEnum.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/enums/MailRequestEnum.java @@ -16,6 +16,12 @@ public enum MailRequestEnum { */ MM("MM", "dmp::manual::"), + + /** + * 手动发送 + */ + MD("MD", "dmp::model::"), + /** * 性别 */ diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/http/EncryptJsonResponse.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/http/EncryptJsonResponse.java new file mode 100644 index 00000000..123eea38 --- /dev/null +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/http/EncryptJsonResponse.java @@ -0,0 +1,27 @@ +package com.baiye.http; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + + +/** + * 返回的Json解析 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class EncryptJsonResponse implements Serializable { + + private String result; + + private String reason; + + /** + * tels做base64解密后就是加密号码串,用逗号分隔 + */ + private String tels; + +} diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/dto/SecretResponseBean.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/http/SecretResponseBean.java similarity index 95% rename from ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/dto/SecretResponseBean.java rename to ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/http/SecretResponseBean.java index c314e5a6..63c74fbd 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/dto/SecretResponseBean.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/http/SecretResponseBean.java @@ -1,4 +1,4 @@ -package com.baiye.module.service.dto; +package com.baiye.http; public class SecretResponseBean { diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/DecryptPnoUtil.java similarity index 93% rename from ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java rename to ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/DecryptPnoUtil.java index c79fa18c..592794f9 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/DecryptPnoUtil.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/DecryptPnoUtil.java @@ -10,17 +10,15 @@ import cn.hutool.http.Header; import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; -import com.baiye.module.constant.SecretConstant; -import com.baiye.module.service.dto.SecretResponseBean; +import com.baiye.constant.SecretConstant; +import com.baiye.http.SecretResponseBean; import com.google.common.base.Joiner; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import java.util.Arrays; -import java.util.Date; -import java.util.HashMap; -import java.util.List; +import java.util.*; /** * @author jt @@ -30,7 +28,7 @@ public class DecryptPnoUtil { private static final String HTTP_RESPONSE_JSON_FORMATE = "application/x-www-form-urlencoded"; public static String decryptPno(String origins) { - HashMap paramMap = new HashMap<>(); + Map paramMap = Maps.newHashMap(); paramMap.put("sig", createSig()); paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID); paramMap.put("tels", Base64.encode(origins)); diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/EncryptPhoneUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/EncryptPhoneUtil.java new file mode 100644 index 00000000..edc8fc1a --- /dev/null +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/EncryptPhoneUtil.java @@ -0,0 +1,108 @@ +package com.baiye.util; + +import cn.hutool.core.codec.Base64; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.crypto.SecureUtil; +import cn.hutool.http.Header; +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.SecretConstant; +import com.baiye.http.SecretResponseBean; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; + +/** + * @author jt + */ +@Slf4j +public class EncryptPhoneUtil { + private static final String HTTP_RESPONSE_JSON_FORMATE = "application/x-www-form-urlencoded"; + + public static String encryptPno(String tels) { + HashMap paramMap = Maps.newHashMap(); + paramMap.put("sig", createSig()); + paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID); + paramMap.put("tels", Base64.encode(tels)); + //链式构建请求 + String result = HttpRequest.post(SecretConstant.SECRET_ENCRYPT_YY_URL) + .header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE) + .form(paramMap) + .timeout(2_000) + .execute().body(); + SecretResponseBean secretResponseBean = JSONUtil.toBean(result, SecretResponseBean.class); + String nid = Base64.decodeStr(secretResponseBean.getTels()); + + // 解析响应内容 + if (!MobileUtil.checkPhone(nid)) { + log.error("===========解密失败或者号码为空======="); + return null; + } + return nid; + } + + + /** + * 生成 sig 值 + * + * @return sig + */ + private static String createSig() { + return SecureUtil.md5( + SecretConstant.SECRET_DECRYPT_YY_ID + + SecretConstant.SECRET_DECRYPT_YY_SIG + + DateUtil.format(new Date(), SecretConstant.SECRET_DECRYPT_TIME_FORMATE)); + } + + + + /** + * 批量解密 + * + * @param origins 待处理的加密数据 + * @return 处理后的解密数据 + */ + public static SecretResponseBean batchEncryptPno(String origins) { + Map paramMap = Maps.newHashMap(); + paramMap.put("sig", createSig()); + paramMap.put("appid", SecretConstant.SECRET_DECRYPT_YY_ID); + paramMap.put("req_id", RandomUtil.randomString(DefaultNumberConstants.TEN_NUMBER)); + paramMap.put("tels", origins); + //链式构建请求 + String result = HttpRequest.post(SecretConstant.SECRET_ENCRYPT_YY_URL) + .header(Header.CONTENT_TYPE, HTTP_RESPONSE_JSON_FORMATE) + .form(paramMap) + .timeout(2_000) + .execute().body(); + // 解析响应内容 + return JSONUtil.toBean(result, SecretResponseBean.class); + } + + public static List encryptPhoneList(List phoneSets) { + List encryptList = Lists.newArrayList(); + // 集合分割 + List> partitions = ListUtil.partition(phoneSets, DefaultNumberConstants.ONE_THOUSAND); + for (List partition : partitions) { + String join = Joiner.on(StrPool.COMMA).skipNulls().join(partition); + // 批量解析号码 + SecretResponseBean responseBean = EncryptPhoneUtil.batchEncryptPno + (Base64.encode(StringUtils.substringBeforeLast(join, StrPool.COMMA))); + if (ObjectUtil.isNotNull(responseBean) && ObjectUtil.isNotNull(responseBean.getTels())) { + encryptList.addAll(Splitter.on(StrPool.COMMA).trimResults() + .omitEmptyStrings().splitToList(Base64.decodeStr(responseBean.getTels()))); + } + } + return encryptList; + } + +} diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileUtil.java index 78f8fcd1..f1bc5632 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileUtil.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileUtil.java @@ -20,7 +20,6 @@ import cn.hutool.core.io.IoUtil; import cn.hutool.core.text.StrPool; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.BigExcelWriter; import cn.hutool.poi.excel.ExcelUtil; import com.baiye.exception.BadRequestException; @@ -415,4 +414,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil { return files; } + + + } diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/FileZipUtil.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileZipUtil.java similarity index 89% rename from ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/FileZipUtil.java rename to ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileZipUtil.java index b810b876..908ff18d 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/FileZipUtil.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/FileZipUtil.java @@ -1,11 +1,16 @@ package com.baiye.util; import cn.hutool.core.io.FileUtil; -import com.baiye.exception.BadRequestException; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.text.csv.CsvUtil; +import cn.hutool.core.text.csv.CsvWriter; +import cn.hutool.core.util.CharsetUtil; import com.baiye.exception.CheckedException; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.io.*; +import java.util.Collection; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -13,6 +18,7 @@ import java.util.zip.ZipOutputStream; /** * 生成压缩文件 (zip,rar 格式) */ +@Slf4j public class FileZipUtil { /** * @param path 要压缩的文件路径 @@ -195,9 +201,35 @@ public class FileZipUtil { //刷新流,也就是把缓存中剩余的内容输出到文件 buffWriter.flush(); } catch (Exception e) { + throw new CheckedException("failed to write to csv"); } + + } + + /** + * 导出csv + * + * @param filePath + * @param lines + */ + public static void writeCSV(String filePath, Collection lines) { + //指定路径和编码 + CsvWriter writer = null; + try { + writer = CsvUtil.getWriter(filePath, CharsetUtil.CHARSET_UTF_8); + //按行写出 + writer.write(lines); + } catch (IORuntimeException e) { + log.error("the exception {} ", e.getMessage()); + throw new CheckedException("failed to write to csv"); + } finally { + assert writer != null; + writer.close(); + } + } + } diff --git a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/WebUtils.java b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/WebUtils.java index b3bd1ee3..de5fca4b 100644 --- a/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/WebUtils.java +++ b/ad-platform-common/ad-platform-common-core/src/main/java/com/baiye/util/WebUtils.java @@ -22,6 +22,7 @@ import com.baiye.exception.BadRequestException; import lombok.SneakyThrows; import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -37,6 +38,7 @@ import javax.validation.constraints.NotNull; import java.io.IOException; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.Optional; /** diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/config/thread/ThreadPoolConfig.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/config/thread/ThreadPoolConfig.java new file mode 100644 index 00000000..27a0a9d5 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/config/thread/ThreadPoolConfig.java @@ -0,0 +1,30 @@ +package com.baiye.config.thread; + +import com.baiye.constant.DefaultNumberConstants; +import org.apache.tomcat.util.threads.ThreadPoolExecutor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; + +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingDeque; +import java.util.concurrent.TimeUnit; + +/** + * @author Enzo + * @date + * 线程池配置总类,用于配置线程池 + */ +@Configuration +@EnableAsync +public class ThreadPoolConfig { + + + @Bean("WorkExecutor") + public Executor getExecutor() { + return new ThreadPoolExecutor(DefaultNumberConstants.TEN_NUMBER, Integer.MAX_VALUE, + DefaultNumberConstants.THREE_NUMBER, TimeUnit.MINUTES, new LinkedBlockingDeque<>(DefaultNumberConstants.THREE_NUMBER), + Executors.defaultThreadFactory(), new ThreadPoolExecutor.DiscardOldestPolicy()); + } +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/domain/ModeRecord.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/domain/ModeRecord.java new file mode 100644 index 00000000..ce5e6013 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/domain/ModeRecord.java @@ -0,0 +1,82 @@ +package com.baiye.modules.platform.domain; + +import com.baiye.model.base.BaseEntity; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import javax.persistence.*; +import java.io.Serializable; +import java.sql.Date; + +/** + * 建模记录 + * @author Enzo + * @date : 2024/1/4 + */ + +@Getter +@Setter +@Entity +@Table(name = "tb_mode_record") +@EntityListeners(AuditingEntityListener.class) +public class ModeRecord extends BaseEntity implements Serializable { + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ApiModelProperty("用户id") + @Column(name = "user_id") + private Long userId; + + @ApiModelProperty("发送状态") + @Column(name = "record_status") + private Integer recordStatus; + + @ApiModelProperty("发送类型") + @Column(name = "record_type") + private Integer recordType; + + @ApiModelProperty("任务名称") + @Column(name = "task_name") + private String taskName; + + @ApiModelProperty("上传数量") + @Column(name = "upload_num") + private Integer uploadNum; + + @ApiModelProperty("文件路径") + @Column(name = "upload_path") + private String uploadPath; + + @ApiModelProperty("解析数量") + @Column(name = "analysis_num") + private Integer analysisNum; + + @ApiModelProperty("发送数量") + @Column(name = "send_num") + private Integer sendNum; + + @ApiModelProperty("发送时间") + @Column(name = "build_time") + private Date buildTime; + + + @ApiModelProperty("层级") + @Column(name = "tree_level") + private Integer treeLevel; + + + @ApiModelProperty("父类id") + @Column(name = "parent_id") + private Long parentId; + + @ApiModelProperty("tag") + @Column(name = "tag_str") + private String tagStr; + +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/httpRequest/DecryptionJsonRequest.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/httpRequest/DecryptionJsonRequest.java new file mode 100644 index 00000000..2f57c2cc --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/httpRequest/DecryptionJsonRequest.java @@ -0,0 +1,35 @@ +package com.baiye.modules.platform.httpRequest; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author Enzo + * @date 2023-2-24 + */ + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class DecryptionJsonRequest implements Serializable { + + + private static final long serialVersionUID = 4871071085514651672L; + + @SerializedName("request_id") + private String requestId; + + + @SerializedName("cellphone_md5") + private String cellphoneMd5; + + + + +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/httpRequest/SendEncryptJsonRequest.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/httpRequest/SendEncryptJsonRequest.java new file mode 100644 index 00000000..3038d635 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/httpRequest/SendEncryptJsonRequest.java @@ -0,0 +1,48 @@ +package com.baiye.modules.platform.httpRequest; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @author Enzo + * @date + */ +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class SendEncryptJsonRequest implements Serializable { + + /** + * 签名校验 + * + * sig值= MD5(开发者账户ID + 开发者账户授权令牌 + 时间戳) + * MD5值共32位(注:转成大写) + * 时间戳是当前系统时间(24小时制),格式“yyyyMMddHHmmss”。时间戳有效时间为50分钟 + */ + @SerializedName("sig") + private String sig; + + /** + * 开发者账号下的APP ID + */ + @SerializedName("appid") + private String appId; + + /** + * 请求唯一id + * 随机生成的字符串, 8~16位字符串 + */ + @SerializedName("req_id") + private String reqId; + + /** + * 支持批量,逗号分隔,一次最多200个,然后对整个字符串做base64加密 + */ + @SerializedName("tels") + private String tels; + +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/ModeRecordRepository.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/ModeRecordRepository.java new file mode 100644 index 00000000..cecb38e9 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/ModeRecordRepository.java @@ -0,0 +1,76 @@ +package com.baiye.modules.platform.repository; + +import cn.hutool.core.date.DateTime; +import com.baiye.modules.platform.domain.ModeRecord; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author Enz + * @date 2024-1-4 + */ +@Repository +public interface ModeRecordRepository extends JpaRepository, JpaSpecificationExecutor { + + + /** + * 修改数量 + * @param num + * @param path + * @param size + * @param id + * @return + */ + @Modifying + @Query("UPDATE ModeRecord set recordStatus = ?1,uploadPath = ?2, analysisNum = analysisNum + ?3 where id = ?4") + int updateStatusAndPathById(Integer num, String path, Integer size, Long id); + + + + /** + * 修改数量 + * @param num + * @param size + * @param id + * @return + */ + @Modifying + @Query("UPDATE ModeRecord set recordStatus = ?1, analysisNum = analysisNum + ?2 where id = ?3") + int updateStatusNumById(Integer num, Integer size, Long id); + + /** + * 修改状态 + * @param num + * @param id + * @return + */ + @Modifying + @Query("UPDATE ModeRecord set recordStatus = ?1 where id = ?2") + int updateStatusById(Integer num, Long id); + + /** + * 修改时间状态 + * + * @param num + * @param date + * @param count + * @param id + * @return + */ + @Modifying + @Query("UPDATE ModeRecord set recordStatus = ?1,buildTime = ?2,sendNum = ?3 where id = ?4") + int updateStatusAndTimeById(Integer num, DateTime date, Integer count, Long id); + + + /** + * 父类id查询 + * @param parentId + * @return + */ + List findByParentId(Long parentId); +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/QualityScoreRepository.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/QualityScoreRepository.java index 95eba94c..9b5eb923 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/QualityScoreRepository.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/repository/QualityScoreRepository.java @@ -13,4 +13,11 @@ public interface QualityScoreRepository extends JpaRepository query(ModeRecordQueryCriteria criteria, Pageable pageable) { + Long currentUserId = SecurityUtils.getCurrentUserId(); + if (currentUserId != DefaultNumberConstants.ONE_NUMBER) { + criteria.setUserId(currentUserId); + } + criteria.setTreeLevel(DefaultNumberConstants.ONE_NUMBER); + return new ResponseEntity<>(modeRecordService.queryAll(criteria, pageable), HttpStatus.OK); + } + + + @ApiOperation("上传文件发送邮件") + @PostMapping("/upload/files") + public CommonResponse uploadFile(@RequestParam("file") MultipartFile[] files, + @RequestParam(value = "taskName") String taskName, + @RequestParam("uploadType") Integer uploadType) { + return Boolean.TRUE.equals(modeRecordService.uploadModeFile(files, taskName, uploadType)) + ? CommonResponse.createBySuccess() : CommonResponse.createByError(); + } + + + @ApiOperation("创建任务") + @GetMapping("/build") + public CommonResponse buildModel(@RequestParam("id") Long id, + @RequestParam(value = "actName") String actName, + @RequestParam("actId") String actId) { + return Boolean.TRUE.equals(modeRecordService.sendDataByActNameAndActId(id, actName, actId)) ? + CommonResponse.createBySuccess() : CommonResponse.createByError(); + } + + @Inner + @ApiOperation("下载id查询下载地址") + @GetMapping("/find/path") + public ResponseEntity queryPath(Long downId) { + String path = modeRecordService.findPath(downId); + return new ResponseEntity<>(path, HttpStatus.OK); + } + + @Log("修改数量") + @Inner + @ApiOperation("修改数量") + @GetMapping("/update/num") + public CommonResponse updateQuantity(String path, Integer num, Long downId) { + modeRecordService.updateNumById(path, num, downId); + return CommonResponse.createBySuccess(); + } + +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/ModeRecordService.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/ModeRecordService.java new file mode 100644 index 00000000..a2d26f2f --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/ModeRecordService.java @@ -0,0 +1,55 @@ +package com.baiye.modules.platform.service; + +import com.baiye.modules.platform.service.dto.ModeRecordQueryCriteria; +import org.springframework.data.domain.Pageable; +import org.springframework.web.multipart.MultipartFile; + +/** + * @author Enzo + * @date : 2024/1/4 + */ +public interface ModeRecordService { + + /** + * 查询建模记录 + * @param criteria + * @param pageable + * @return + */ + Object queryAll(ModeRecordQueryCriteria criteria, Pageable pageable); + + /** + * 上传文件 + * @param files + * @param taskName + * @param uploadType + * @return + */ + Boolean uploadModeFile(MultipartFile[] files, String taskName, Integer uploadType); + + /** + * id 查询路径 + * @param downId + * @return + */ + String findPath(Long downId); + + /** + * id修改路径 + * @param path + * @param num + * @param downId + * @return + */ + Boolean updateNumById(String path, Integer num, Long downId); + + /** + * 创建任务 + * + * @param id + * @param actName + * @param actId + * @return + */ + Boolean sendDataByActNameAndActId(Long id, String actName, String actId); +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/DecryptionDTO.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/DecryptionDTO.java new file mode 100644 index 00000000..fc26fce4 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/DecryptionDTO.java @@ -0,0 +1,28 @@ +package com.baiye.modules.platform.service.dto; + +import com.google.gson.annotations.SerializedName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author Enzo + * @date : 2023/2/24 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DecryptionDTO { + + @SerializedName("requestId") + private String requestId; + + @SerializedName("cell_phone") + private String cellPhone; + + @SerializedName("result") + private String result; + + @SerializedName("reason") + private String reason; +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ImeiDTO.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ImeiDTO.java index 37affbb5..59b90a9b 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ImeiDTO.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ImeiDTO.java @@ -12,7 +12,6 @@ import java.io.Serializable; @Data public class ImeiDTO implements Serializable { - private static final long serialVersionUID = -3271582444610218303L; /** diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ModeRecordQueryCriteria.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ModeRecordQueryCriteria.java new file mode 100644 index 00000000..409145c3 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ModeRecordQueryCriteria.java @@ -0,0 +1,51 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * 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.baiye.modules.platform.service.dto; + +import com.baiye.annotation.DataPermission; +import com.baiye.annotation.Query; +import lombok.Data; + +import java.sql.Timestamp; +import java.util.List; + +/** +* @author Enzo +* @date 2022-03-25 +*/ +@Data +@DataPermission(fieldName = "id") +public class ModeRecordQueryCriteria { + + @Query(type = Query.Type.INNER_LIKE) + private String taskName; + + @Query + private Integer recordType; + + @Query + private Integer recordStatus; + + @Query + private Long userId; + + + @Query + private Integer treeLevel; + + @Query(type = Query.Type.BETWEEN) + private List createTime; +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ModelRecordDto.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ModelRecordDto.java new file mode 100644 index 00000000..c3f83615 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/dto/ModelRecordDto.java @@ -0,0 +1,70 @@ +package com.baiye.modules.platform.service.dto; + +import com.baiye.model.base.BaseDTO; +import com.baiye.model.dto.TreeUserDTO; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +import javax.persistence.Column; +import java.io.Serializable; +import java.sql.Date; +import java.sql.Timestamp; +import java.util.List; + +/** +* @website https://el-admin.vip +* @description / +* @author Enzo +* @date 2021-12-16 +**/ +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ModelRecordDto extends BaseDTO implements Serializable { + private static final long serialVersionUID = 7917504710223840272L; + + /** 防止精度丢失 */ + @JsonSerialize(using= ToStringSerializer.class) + private Long id; + + @ApiModelProperty("用户id") + private Long userId; + + @ApiModelProperty("记录状态") + private Integer recordStatus; + + @ApiModelProperty("发送类型") + private Integer recordType; + + @ApiModelProperty("任务名称") + private String taskName; + + @ApiModelProperty("上传数量") + private Integer uploadNum; + + @ApiModelProperty("上传数量") + private String uploadPath; + + @ApiModelProperty("解析数量") + private Integer analysisNum; + + @ApiModelProperty("发送数量") + private Integer sendNum; + + @ApiModelProperty("发送时间") + private Date buildTime; + + @ApiModelProperty("tag") + private String tagStr; + + @ApiModelProperty("parentId") + private Long parentId; + + @ApiModelProperty("层级") + private Integer treeLevel; + + private List treeList; +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/ModelRecordServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/ModelRecordServiceImpl.java new file mode 100644 index 00000000..8dda6c48 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/ModelRecordServiceImpl.java @@ -0,0 +1,229 @@ +package com.baiye.modules.platform.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.text.csv.CsvData; +import cn.hutool.core.text.csv.CsvReader; +import cn.hutool.core.text.csv.CsvRow; +import cn.hutool.core.text.csv.CsvUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.poi.excel.ExcelReader; +import cn.hutool.poi.excel.ExcelUtil; +import com.baiye.config.properties.DeliveryProperties; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.FileConstant; +import com.baiye.enums.MailRequestEnum; +import com.baiye.exception.BadRequestException; +import com.baiye.modules.platform.domain.ModeRecord; +import com.baiye.modules.platform.repository.ModeRecordRepository; +import com.baiye.modules.platform.service.DeliveryRecordService; +import com.baiye.modules.platform.service.ModeRecordService; +import com.baiye.modules.platform.service.dto.ImeiDTO; +import com.baiye.modules.platform.service.dto.ModeRecordQueryCriteria; +import com.baiye.modules.platform.service.dto.ModelRecordDto; +import com.baiye.modules.platform.service.mapstruct.ModeRecordMapper; +import com.baiye.timed.DecryptTask; +import com.baiye.util.*; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author Enzo + * @date : 2022/1/21 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ModelRecordServiceImpl implements ModeRecordService { + + + private final DeliveryRecordService deliveryRecordService; + + private final ModeRecordRepository modeRecordRepository; + + private final DeliveryProperties deliveryProperties; + + private final ModeRecordMapper modeRecordMapper; + + private final DecryptTask decryptTask; + + private final RedisUtils redisUtils; + + + @Override + public Object queryAll(ModeRecordQueryCriteria criteria, Pageable pageable) { + Page page = modeRecordRepository.findAll + ((root, criteriaQuery, criteriaBuilder) -> + QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable); + List dtoList = page.map(modeRecordMapper::toDto).getContent(); + dtoList.forEach(dto -> { + List byParentId = modeRecordRepository.findByParentId(dto.getId()); + if (CollUtil.isNotEmpty(byParentId)) { + dto.setTreeList(modeRecordMapper.toDto(byParentId)); + } + }); + return PageUtil.toPage(dtoList, page.getTotalElements()); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean uploadModeFile(MultipartFile[] files, String taskName, Integer uploadType) { + Long userId = SecurityUtils.getCurrentUserId(); + List stringList = Lists.newArrayList(); + for (MultipartFile file : files) { + String originalFilename = file.getOriginalFilename(); + if (StringUtils.isNotBlank(originalFilename)) { + stringList = parseFile(file, originalFilename); + } + } + // 去除重复数据 + List dtoArrayList = Lists.newArrayList(Sets.newHashSet(stringList)); + // 保存父类数据 + Long recordId = saveRecord(taskName, uploadType, userId, (long) DefaultNumberConstants.ZERO_NUMBER, + DefaultNumberConstants.ONE_NUMBER, CharSequenceUtil.EMPTY, dtoArrayList); + // tag分组 + Map> collect = dtoArrayList.stream(). + collect(Collectors.groupingBy(ImeiDTO::getTag)); + for (Map.Entry> entry : collect.entrySet()) { + String tag = entry.getKey(); + List imeiDTOList = entry.getValue(); + // 保存子类数据 + Long childrenId = saveRecord(taskName, uploadType, userId, recordId, + DefaultNumberConstants.TWO_NUMBER, tag, imeiDTOList); + if (uploadType < DefaultNumberConstants.TWO_NUMBER) { + // 每次100000 数据 + List> partition = Lists.partition + (imeiDTOList, DefaultNumberConstants.ONE_HUNDRED_THOUSAND); + for (List list : partition) { + String taskImeiName = redisUtils.acquisitionBatch(MailRequestEnum.MD.getCacheName()); + Boolean result = deliveryRecordService.exchangeByInterFace + (list, taskImeiName, uploadType, deliveryProperties.getPublicKey(), deliveryProperties.getPrivateKey()); + if (Boolean.TRUE.equals(result)) { + deliveryRecordService.saveDeliveryRecord(null, taskImeiName, entry.getKey(), list.size(), null, + userId, DefaultNumberConstants.FIVE_NUMBER, uploadType, childrenId); + } + log.info("=========== the interface conversion result is {} =========== ", result); + } + continue; + } + // 调用异步任务 + decryptTask.doRunTask(imeiDTOList, recordId, childrenId); + } + return Boolean.TRUE; + } + + @Override + public String findPath(Long downId) { + ModeRecord downRecord = modeRecordRepository.findById(downId).orElseGet(ModeRecord::new); + return ObjectUtil.isNotNull(downRecord) && + StringUtils.isNotBlank(downRecord.getUploadPath()) ? downRecord.getUploadPath() : CharSequenceUtil.EMPTY; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean updateNumById(String path, Integer num, Long downId) { + ModeRecord downRecord = modeRecordRepository.findById(downId).orElseGet(ModeRecord::new); + if (ObjectUtil.isNull(downRecord) && ObjectUtil.isNull(downRecord.getId())) { + modeRecordRepository.updateStatusAndPathById(DefaultNumberConstants.ONE_NUMBER, path, num, downId); + modeRecordRepository.updateStatusNumById(DefaultNumberConstants.ONE_NUMBER, num, downRecord.getParentId()); + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + @Override + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + public Boolean sendDataByActNameAndActId(Long id, String actName, String actId) { + List stringList = Lists.newArrayList(); + ModeRecord downRecord = modeRecordRepository.findById(id).orElseGet(ModeRecord::new); + if (ObjectUtil.isNull(downRecord) || + downRecord.getRecordStatus() != DefaultNumberConstants.ONE_NUMBER) { + throw new BadRequestException("该批次暂不能建模!"); + } + // 解压文件 + String unzipPath = CompressUtil.unzipFiles + (deliveryProperties.getFileUrl(), downRecord.getUploadPath(), deliveryProperties.getZipPassword()); + File unzipFile = new File(unzipPath); + File parseFile = Objects.requireNonNull + (unzipFile.listFiles())[DefaultNumberConstants.ZERO_NUMBER]; + CsvReader reader = CsvUtil.getReader(); + CsvData data = reader.read(parseFile); + // csv通配 + data.getRows().forEach(str -> stringList.add(str.size() > + DefaultNumberConstants.THREE_NUMBER ? str.get(DefaultNumberConstants.TWO_NUMBER) + : str.get(DefaultNumberConstants.ZERO_NUMBER))); + cn.hutool.core.io.FileUtil.del(unzipPath); + // 修改状态 + modeRecordRepository.updateStatusById(DefaultNumberConstants.TWO_NUMBER, id); + // 调用异步任务 + decryptTask.doRunSendTask(stringList, id, actId, actName); + log.info("============= the request str list {} =============", stringList.size()); + return Boolean.TRUE; + } + + private Long saveRecord(String taskName, Integer uploadType, Long userId, Long parentId, Integer levelNum, String tagStr, List dtoArrayList) { + ModeRecord modeRecord = new ModeRecord(); + modeRecord.setUserId(userId); + modeRecord.setTagStr(tagStr); + modeRecord.setParentId(parentId); + modeRecord.setTaskName(taskName); + modeRecord.setTreeLevel(levelNum); + modeRecord.setRecordType(uploadType); + modeRecord.setUploadNum(dtoArrayList.size()); + modeRecord.setAnalysisNum(DefaultNumberConstants.ZERO_NUMBER); + modeRecord.setRecordStatus(DefaultNumberConstants.ZERO_NUMBER); + return modeRecordRepository.save(modeRecord).getId(); + } + + private List parseFile(MultipartFile file, String originalFilename) { + List dtoList = Lists.newArrayList(); + // 解析 文件 + File upload = FileUtil.multiToFile(file); + if (ObjectUtil.isNotNull(upload)) { + if (originalFilename.endsWith(FileConstant.XLS_FILE_SUB_NAME) + || originalFilename.endsWith(FileConstant.XLSX_FILE_SUB_NAME)) { + ExcelReader reader = ExcelUtil.getReader(upload); + for (List objects : reader.read()) { + if (objects.size() > DefaultNumberConstants.ONE_NUMBER) { + ImeiDTO dto = new ImeiDTO(); + dto.setTag(objects.get(DefaultNumberConstants.ONE_NUMBER).toString()); + dto.setImei(objects.get(DefaultNumberConstants.ZERO_NUMBER).toString()); + dtoList.add(dto); + } + } + } + if (originalFilename.endsWith(FileConstant.CSV_FILE_SUB_NAME)) { + CsvReader reader = CsvUtil.getReader(); + CsvData read = reader.read(upload); + for (CsvRow row : read.getRows()) { + if (row.size() > DefaultNumberConstants.ONE_NUMBER) { + ImeiDTO dto = new ImeiDTO(); + dto.setTag(row.get(DefaultNumberConstants.ONE_NUMBER)); + dto.setImei(row.get(DefaultNumberConstants.ZERO_NUMBER)); + dtoList.add(dto); + } + } + } + } + return dtoList; + } + + +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/QualityScoreServiceImpl.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/QualityScoreServiceImpl.java index 7a424d03..b8129576 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/QualityScoreServiceImpl.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/impl/QualityScoreServiceImpl.java @@ -1,5 +1,7 @@ package com.baiye.modules.platform.service.impl; +import cn.hutool.core.util.ObjectUtil; +import com.baiye.constant.DefaultNumberConstants; import com.baiye.modules.platform.domain.QualityScore; import com.baiye.modules.platform.domain.UserQuality; import com.baiye.modules.platform.repository.QualityScoreRepository; @@ -11,7 +13,10 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author wjt @@ -31,6 +36,9 @@ public class QualityScoreServiceImpl implements QualityScoreService { @Override public Map query() { QualityScore query = qualityScoreRepository.query(SecurityUtils.getCurrentUserId()); + if (ObjectUtil.isNull(query) || ObjectUtil.isNull(query.getId())) { + query = qualityScoreRepository.selectRand(); + } QualityScore qualityScore = qualityScoreRepository.findById(1L).orElseGet(QualityScore::new); Map map = new HashMap<>(2); map.put("reality", dealData(query)); diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/mapstruct/ModeRecordMapper.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/mapstruct/ModeRecordMapper.java new file mode 100644 index 00000000..9da89265 --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/modules/platform/service/mapstruct/ModeRecordMapper.java @@ -0,0 +1,18 @@ +package com.baiye.modules.platform.service.mapstruct; + +import com.baiye.model.base.BaseMapper; +import com.baiye.modules.platform.domain.Label; +import com.baiye.modules.platform.domain.ModeRecord; +import com.baiye.modules.platform.service.dto.ModelRecordDto; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; + +/** +* @website https://el-admin.vip +* @author Enzo +* @date 2021-12-16 +**/ +@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface ModeRecordMapper extends BaseMapper { + +} 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 5d1dc152..52c7d6b5 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 @@ -35,9 +35,7 @@ import com.baiye.feign.IRemoteAuthService; import com.baiye.feign.SourceClueClient; import com.baiye.model.dto.*; import com.baiye.model.enums.ResponseCode; -import com.baiye.modules.agent.repository.ChannelCustomRepository; import com.baiye.modules.agent.entity.ChannelCustom; -import com.baiye.modules.agent.service.ChannelManageService; import com.baiye.modules.agent.service.CustomManageService; import com.baiye.modules.platform.domain.*; import com.baiye.modules.platform.repository.*; @@ -280,11 +278,13 @@ public class UserServiceImpl implements UserService { companyId = companyService.createCompany(companyDto).getId(); } companyId = companyId != null ? companyId : SecurityUtils.getCompanyId(); - // 验证子账号 - Integer sonUserNum = companyService.findCompanyInfo(companyId).getSonUserNum(); - int size = userRepository.findByCompanyId(companyId).size(); - if (!flag && sonUserNum < size) { - throw new BadRequestException("子账号超过上限,请联系管理员"); + if (ObjectUtil.isNotNull(companyId)) { + // 验证子账号 + Integer sonUserNum = companyService.findCompanyInfo(companyId).getSonUserNum(); + int size = userRepository.findByCompanyId(companyId).size(); + if (!flag && sonUserNum < size) { + throw new BadRequestException("子账号超过上限,请联系管理员"); + } } BeanUtil.copyProperties(userDTO, user); user.setCompanyId(companyId); @@ -311,7 +311,7 @@ public class UserServiceImpl implements UserService { if (userDTO.getIsChannelActive() == null || !userDTO.getIsChannelActive()) { customManageService.saveChannelCustom(userDTO.getUsername(), userDTO.getPhone(), user.getId(), userId); } - //添加质量图 + // 添加质量图 qualityScoreService.addDefault(userCreateResult.getId()); //todo 创建默认的支付模板 (因为这快业务已经不需要了,为了避免多余业务操作,默认创建一个) payFatherTemplateService.addDefaultTemplate(userCreateResult.getUsername(),userCreateResult.getId(),userCreateResult.getExpirationTime(),companyId); diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DecryptTask.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DecryptTask.java new file mode 100644 index 00000000..8e76f68d --- /dev/null +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/DecryptTask.java @@ -0,0 +1,167 @@ +package com.baiye.timed; + +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.config.properties.DeliveryProperties; +import com.baiye.config.thread.ThreadPoolConfig; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.FileConstant; +import com.baiye.constant.SecurityConstants; +import com.baiye.modules.platform.httpRequest.DecryptionJsonRequest; +import com.baiye.modules.platform.repository.ModeRecordRepository; +import com.baiye.modules.platform.service.dto.DecryptionDTO; +import com.baiye.modules.platform.service.dto.ImeiDTO; +import com.baiye.modules.telemarkting.entity.dto.CallImportDTO; +import com.baiye.util.CompressUtil; +import com.baiye.util.EncryptPhoneUtil; +import com.baiye.util.FileZipUtil; +import com.google.common.base.Joiner; +import com.google.common.collect.Lists; +import com.google.gson.Gson; +import com.sun.org.apache.xalan.internal.XalanConstants; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StopWatch; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +/** + * @author Enzo + * @date : 2024/1/4 + */ + +@Slf4j +@Component +@RequiredArgsConstructor +public class DecryptTask { + + @Value(value = "${inter.decryptAddress}") + private String decryptAddress; + + @Value(value = "${inter.sendClientAddress}") + private String sendClientAddress; + + + private final ThreadPoolConfig threadConfig; + + private final DeliveryProperties deliveryProperties; + + private final ModeRecordRepository modeRecordRepository; + + /** + * 该用法将MD5转换为正常数并同时转化为24位加密信息 + * + * @param dtoArrayList list + * @param recordId id + * @param childrenId + */ + @SneakyThrows + @Async(value = "WorkExecutor") + @Transactional(rollbackFor = Exception.class) + public void doRunTask(List dtoArrayList, Long recordId, Long childrenId) { + log.info("================== run task begin time {} ==================", DateUtil.now()); + StopWatch stopWatch = new StopWatch(); + String uuid = IdUtil.fastSimpleUUID(); + List stringList = Lists.newArrayList(); + // 取出线程池 + Executor executor = threadConfig.getExecutor(); + List>> results = Lists.newArrayList(); + // 取出值 + List sendList = dtoArrayList.stream().map(ImeiDTO::getImei).collect(Collectors.toList()); + List> partition = Lists.partition(sendList, DefaultNumberConstants.TWO_HUNDRED); + int batchNum = partition.size(); + stopWatch.start(); + for (List list : partition) { + TimeUnit.MILLISECONDS.sleep(DefaultNumberConstants.ONE_THOUSAND); + // 异步线程池 + CompletableFuture> future = CompletableFuture.supplyAsync(() -> { + Gson gson = new Gson(); + // 转换 + String encryptStr = StringUtils.substringBeforeLast(Joiner.on(StrPool.COMMA).skipNulls().join(list), StrPool.COMMA); + // 构造请求 + DecryptionJsonRequest build = + DecryptionJsonRequest.builder().cellphoneMd5 + (encryptStr).requestId(RandomUtil.randomString(DefaultNumberConstants.TEN_NUMBER)).build(); + // 调用HTTP请求发送数据 + DecryptionDTO decryptionDTO = JSONUtil.toBean(HttpUtil.post(decryptAddress, gson.toJson(build)), DecryptionDTO.class); + if (StringUtils.isNotBlank(decryptionDTO.getReason()) + && SecurityConstants.SUCCESS.equalsIgnoreCase(decryptionDTO.getReason()) && (StringUtils.isNotBlank(decryptionDTO.getCellPhone()))) { + List parseArray = JSONUtil.toList(decryptionDTO.getCellPhone(), String.class); + if (!parseArray.isEmpty()) { + parseArray = parseArray.stream().filter + (StringUtils::isNotBlank).collect(Collectors.toList()); + log.info("================ response size as {} ================", parseArray.size()); + return EncryptPhoneUtil.encryptPhoneList(parseArray); + } + } + return Lists.newArrayList(); + }, executor); + results.add(future); + } + // 线程结束取出结果集 + CompletableFuture allCompletableFuture = CompletableFuture.allOf + (results.toArray(new CompletableFuture[batchNum])); + List> result = allCompletableFuture.thenApply(e -> results.stream().map + (CompletableFuture::join).collect(Collectors.toList())).join(); + result.forEach(stringList::addAll); + stopWatch.stop(); + String file = deliveryProperties.getFileUrl().concat(StrPool.SLASH).concat(uuid); + // 进行文件保存 + String csvPath = file.concat(StrPool.DOT).concat(FileConstant.CSV_FILE_SUB_NAME); + String zipPath = file.concat(FileConstant.ZIP_FILE_SUB_NAME); + log.info("============= the save path as {} ,num {} ===================", csvPath, stringList.size()); + FileZipUtil.writeCSV(csvPath, stringList); + // 设置压缩文件 + CompressUtil.decryptionCompression(zipPath, csvPath, null); + // 修改状态并更改 + modeRecordRepository.updateStatusAndPathById(DefaultNumberConstants.ONE_NUMBER, zipPath, stringList.size(), childrenId); + modeRecordRepository.updateStatusNumById(DefaultNumberConstants.ONE_NUMBER, stringList.size(), recordId); + FileUtil.del(csvPath); + log.info("================== run task end time {} ==================", DateUtil.now()); + } + + @Async(value = "WorkExecutor") + @Transactional(rollbackFor = Exception.class) + public void doRunSendTask(List stringList, Long id, String actId, String actName) { + log.info("================== run task begin time {} ==================", DateUtil.now()); + int count = DefaultNumberConstants.ZERO_NUMBER; + List> partition = Lists.partition(stringList, DefaultNumberConstants.ONE_THOUSAND); + // 调用推送地址进行推送 + CallImportDTO dto = new CallImportDTO(); + dto.setActId(actId); + dto.setActName(actName); + for (List list : partition) { + List sendClientList = Lists.newArrayList(); + list.forEach(str -> { + CallImportDTO.Source client = new CallImportDTO.Source(); + client.setCellphone(str); + sendClientList.add(client); + }); + dto.setClientList(sendClientList); + String post = HttpUtil.post(sendClientAddress, JSONUtil.toJsonStr(dto)); + if (post.contains(XalanConstants.FEATURE_TRUE)){ + count += list.size(); + } + log.info("============ the submit result as {} =========", JSONUtil.toJsonStr(post)); + } + if (count > DefaultNumberConstants.ZERO_NUMBER){ + modeRecordRepository.updateStatusAndTimeById(DefaultNumberConstants.THREE_NUMBER, DateUtil.date(), count, id); + } + log.info("================== run task end time {} ==================", DateUtil.now()); + } +} diff --git a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/PreTestTokenTask.java b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/PreTestTokenTask.java index c56db29e..99c9c702 100644 --- a/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/PreTestTokenTask.java +++ b/ad-platform-manage/ad-platform-management/src/main/java/com/baiye/timed/PreTestTokenTask.java @@ -1,5 +1,6 @@ package com.baiye.timed; +import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.StrUtil; import com.baiye.modules.telemarkting.dao.PreTestAccountRepository; import com.baiye.modules.telemarkting.entity.PreTestAccount; @@ -30,7 +31,7 @@ public class PreTestTokenTask { List list = new ArrayList<>(); for (PreTestAccount preTestAccount : all) { String token = preTestReq.getToken(preTestAccount.getDbUserName(), preTestAccount.getDbUserPassword()); - if (StrUtil.isEmpty(token)) { + if (CharSequenceUtil.isEmpty(token)) { preTestAccount.setStatus(false); } preTestAccount.setToken(token); diff --git a/ad-platform-manage/ad-platform-management/src/main/resources/config/application-dev.yml b/ad-platform-manage/ad-platform-management/src/main/resources/config/application-dev.yml index 7cfaf646..ef8e5bb8 100644 --- a/ad-platform-manage/ad-platform-management/src/main/resources/config/application-dev.yml +++ b/ad-platform-manage/ad-platform-management/src/main/resources/config/application-dev.yml @@ -234,3 +234,8 @@ channel: logstash: url: localhost:9601 + +exchange: + org-code: org_by_test + callback-url: http://proxy.hzdaba.cn:58888/pub/data/set + submit-url: http://proxy.hzdaba.cn:58888/pub/data/submit diff --git a/ad-platform-manage/ad-platform-management/src/main/resources/config/application-prod.yml b/ad-platform-manage/ad-platform-management/src/main/resources/config/application-prod.yml index e4aea615..1d44fb36 100644 --- a/ad-platform-manage/ad-platform-management/src/main/resources/config/application-prod.yml +++ b/ad-platform-manage/ad-platform-management/src/main/resources/config/application-prod.yml @@ -136,6 +136,10 @@ double: statusUrl: https://baiyee.vip/api/back/status stopUrl: http://ax.hzdaba.cn/callback/Accounts/dbby_hangzhoubaiyehl/Hw/CallBackStop +exchange: + org-code: org_by + callback-url: http://proxy.hzdaba.cn:58888/pub/data/set + submit-url: http://proxy.hzdaba.cn:58888/pub/data/submit #axb地址 axb: diff --git a/ad-platform-manage/ad-platform-management/src/main/resources/config/application.yml b/ad-platform-manage/ad-platform-management/src/main/resources/config/application.yml index 638c1612..319477da 100644 --- a/ad-platform-manage/ad-platform-management/src/main/resources/config/application.yml +++ b/ad-platform-manage/ad-platform-management/src/main/resources/config/application.yml @@ -108,9 +108,10 @@ generate: url: https://cb.tuoz.net -exchange: - org-code: org_by - callback-url: http://proxy.hzdaba.cn:58888/pub/data/set - submit-url: http://proxy.hzdaba.cn:58888/pub/data/submit - +inter: + decryptAddress: http://proxy.hzdaba.cn:32288/v2/Accounts/dabakeji/Calls/Getcellphone + address: https://bd.hzdaba.cn:8085/v3/Accounts/yuyoukeji/BigData/EncryptTel + appid: yuyoukeji + tk: e3fb7090b4babe44a5113601487af433 + sendClientAddress: https://ai.hzdaba.cn/api/activity/addclient diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/feign/DeliveryRecordClient.java b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/feign/DeliveryRecordClient.java index 9db497b7..77eab949 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/feign/DeliveryRecordClient.java +++ b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/feign/DeliveryRecordClient.java @@ -9,6 +9,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestParam; +import java.util.List; + /** * @author jt */ @@ -17,7 +19,10 @@ public interface DeliveryRecordClient { String TRIPARTITE_DOWN_PREFIX = "/api/tripartite/record"; - String PAY_PREFIX = "/api/down/record"; + String DOWN_PREFIX = "/api/down/record"; + + + String MODEL_PREFIX = "/api/mode/record"; String AGENT_PREFIX = "/api/custom"; @@ -31,7 +36,7 @@ public interface DeliveryRecordClient { * @return */ @ApiOperation("修改下载链接") - @GetMapping(PAY_PREFIX + "/update/path") + @GetMapping(DOWN_PREFIX + "/update/path") ResponseEntity updatePath( @RequestParam("filePath") String filePath, @RequestParam("path") String path, @RequestParam("downId") Long downId, @RequestHeader(SecurityConstants.FROM) String from); @@ -60,10 +65,24 @@ public interface DeliveryRecordClient { * @return */ @ApiOperation("下载地址获取链接") - @GetMapping(PAY_PREFIX + "/find/path") + @GetMapping(DOWN_PREFIX + "/find/path") ResponseEntity queryPath(@RequestParam("downId") Long downId, @RequestHeader(SecurityConstants.FROM) String from); + + /** + * id获取配置路径 + * + * @param downId + * @param from + * @return + */ + @ApiOperation("下载地址获取链接") + @GetMapping(MODEL_PREFIX + "/find/path") + ResponseEntity queryDownPath(@RequestParam("downId") Long downId, @RequestHeader(SecurityConstants.FROM) String from); + + + /** * id获取配置路径 * @@ -102,4 +121,17 @@ public interface DeliveryRecordClient { @ApiOperation("保存链接地址") @GetMapping(TRIPARTITE_DOWN_PREFIX + "/update/num") void updateOriginAndSize(@RequestParam("sourceData") Long userId, @RequestParam("dateStr") String format,@RequestParam("totalNumber") Integer size, @RequestHeader(SecurityConstants.FROM) String fromIn); + + + /** + * 修改数量 + * @param csvPath + * @param num + * @param downId + * @param fromIn + * @return + */ + @ApiOperation("下载地址获取链接") + @GetMapping(MODEL_PREFIX + "/update/num") + ResponseEntity updateNumPathById(@RequestParam("path") String csvPath, @RequestParam("num") Integer num,@RequestParam("downId") Long downId, @RequestHeader(SecurityConstants.FROM) String fromIn); } diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/listener/TokerListener.java b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/listener/TokerListener.java index 83629f88..e91900ed 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/listener/TokerListener.java +++ b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/listener/TokerListener.java @@ -11,7 +11,7 @@ import com.baiye.module.entity.Clue; import com.baiye.module.listener.dto.BaseExcelListenerDto; import com.baiye.module.listener.dto.TokerListenerDto; import com.baiye.module.service.ClueService; -import com.baiye.module.service.dto.SecretResponseBean; +import com.baiye.http.SecretResponseBean; import com.baiye.util.DecryptPnoUtil; import com.google.common.base.Splitter; import org.apache.commons.lang.StringUtils; diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DmpCallbackServiceImpl.java b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DmpCallbackServiceImpl.java index ac7ec4e6..b9f7da6e 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DmpCallbackServiceImpl.java +++ b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/module/service/impl/DmpCallbackServiceImpl.java @@ -121,7 +121,8 @@ public class DmpCallbackServiceImpl implements DmpCallbackService { if (byTaskName.getType() == DefaultNumberConstants.ONE_NUMBER) { saveClue(bathNo, byTaskName, taskId, tagList, responseList); } - if (byTaskName.getType() == DefaultNumberConstants.TWO_NUMBER) { + if (byTaskName.getType() == DefaultNumberConstants.TWO_NUMBER || + byTaskName.getType() == DefaultNumberConstants.FIVE_NUMBER) { // 异步方式下载 List finalResponseList = responseList; CompletableFuture.runAsync(() -> downResource(bathNo, byTaskName, originalList, finalResponseList)); @@ -141,8 +142,8 @@ public class DmpCallbackServiceImpl implements DmpCallbackService { return CommonResponse.createBySuccess(HttpStatus.SC_OK); } return CommonResponse.createByErrorCodeMessage - (ResponseCode.BATCH_NUMBER_EXIST_OR_SEND.getCode(), - ResponseCode.BATCH_NUMBER_EXIST_OR_SEND.getDesc()); + (ResponseCode.BATCH_NUMBER_EXIST_OR_SEND.getCode(), + ResponseCode.BATCH_NUMBER_EXIST_OR_SEND.getDesc()); } @@ -187,15 +188,16 @@ public class DmpCallbackServiceImpl implements DmpCallbackService { @SneakyThrows(value = ZipException.class) private void downResource(String taskName, DeliveryRecord byTaskName, List> originalList, List responseList) { + Integer type = byTaskName.getType(); String uuid = IdUtil.fastSimpleUUID(); List csvList = Lists.newArrayList(); originalList = Lists.newArrayList(Sets.newHashSet(originalList)); String file = deliveryProperties.getFileUrl().concat(StrPool.SLASH).concat(uuid); - Object objPath = redisUtils.get(CacheKey.DMP_DOWN_URL.concat(String.valueOf(byTaskName.getDownId()))); + Object objPath = redisUtils.get(CacheKey.DMP_DOWN_URL.concat(String.valueOf(byTaskName.getDownId())).concat(String.valueOf(type))); String path = ObjectUtil.isNotNull(objPath) ? - String.valueOf(objPath) : deliveryRecordClient.queryPath - (byTaskName.getDownId(), SecurityConstants.FROM_IN).getBody(); - + String.valueOf(objPath) : type == DefaultNumberConstants.TWO_NUMBER ? + deliveryRecordClient.queryPath(byTaskName.getDownId(), SecurityConstants.FROM_IN).getBody() : + deliveryRecordClient.queryDownPath(byTaskName.getDownId(), SecurityConstants.FROM_IN).getBody(); if (ObjectUtil.isNotNull(path)) { // 解压文件 String unzipPath = CompressUtil.unzipFiles @@ -213,6 +215,9 @@ public class DmpCallbackServiceImpl implements DmpCallbackService { FileZipUtil.writeToCsv(csvList, parseFile.getPath(), Boolean.TRUE); // 设置压缩文件 CompressUtil.decryptionCompression(path, parseFile.getPath(), null); + if (type == DefaultNumberConstants.FIVE_NUMBER) { + deliveryRecordClient.updateNumPathById(path, originalList.size(), byTaskName.getDownId(), SecurityConstants.FROM_IN); + } deliveryRecordService.updateStatusByTaskName(DefaultNumberConstants.ONE_NUMBER, responseList.size(), taskName); FileUtil.del(unzipPath); return; @@ -233,9 +238,14 @@ public class DmpCallbackServiceImpl implements DmpCallbackService { (zipPath.lastIndexOf(StrPool.SLASH) + DefaultNumberConstants.ONE_NUMBER); FileUtil.del(csvPath); String downUrl = deliveryProperties.getDmpDownPath().concat(filePath); - deliveryRecordClient.updatePath(zipPath, downUrl, byTaskName.getDownId(), SecurityConstants.FROM_IN); + if (type == DefaultNumberConstants.TWO_NUMBER) { + deliveryRecordClient.updatePath(zipPath, downUrl, byTaskName.getDownId(), SecurityConstants.FROM_IN); + } + if (type == DefaultNumberConstants.FIVE_NUMBER) { + deliveryRecordClient.updateNumPathById(zipPath, originalList.size(), byTaskName.getDownId(), SecurityConstants.FROM_IN); + } deliveryRecordService.updateStatusByTaskName(DefaultNumberConstants.ONE_NUMBER, responseList.size(), taskName); - redisUtils.set(CacheKey.DMP_DOWN_URL.concat(String.valueOf(byTaskName.getDownId())), zipPath, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS); + redisUtils.set(CacheKey.DMP_DOWN_URL.concat(String.valueOf(byTaskName.getDownId()).concat(String.valueOf(type))), zipPath, DefaultNumberConstants.ONE_NUMBER, TimeUnit.DAYS); } @SneakyThrows(value = ZipException.class) diff --git a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/IsBlackUtil.java b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/IsBlackUtil.java index 799ede95..034311cd 100644 --- a/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/IsBlackUtil.java +++ b/ad-platform-services/ad-platform-source/src/main/java/com/baiye/util/IsBlackUtil.java @@ -7,7 +7,7 @@ import cn.hutool.http.HttpRequest; import cn.hutool.json.JSONUtil; import com.baiye.constant.DefaultNumberConstants; import com.baiye.model.enums.ResponseCode; -import com.baiye.module.constant.SecretConstant; +import com.baiye.constant.SecretConstant; import com.baiye.module.service.dto.IsBlackListDTO; import com.baiye.module.service.dto.IsBlackResponse; import com.baiye.module.service.dto.IsOnlineBlackResponse;