添加建模操作
parent
8f580ac64d
commit
9488739766
@ -1,4 +1,4 @@
|
||||
package com.baiye.module.service.dto;
|
||||
package com.baiye.http;
|
||||
|
||||
public class SecretResponseBean {
|
||||
|
@ -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<String, Object> 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<String, Object> 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<String> encryptPhoneList(List<String> phoneSets) {
|
||||
List<String> encryptList = Lists.newArrayList();
|
||||
// 集合分割
|
||||
List<List<String>> partitions = ListUtil.partition(phoneSets, DefaultNumberConstants.ONE_THOUSAND);
|
||||
for (List<String> 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;
|
||||
}
|
||||
|
||||
}
|
@ -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());
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
||||
}
|
@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
@ -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<ModeRecord, Long>, JpaSpecificationExecutor<ModeRecord> {
|
||||
|
||||
|
||||
/**
|
||||
* 修改数量
|
||||
* @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<ModeRecord> findByParentId(Long parentId);
|
||||
}
|
@ -0,0 +1,99 @@
|
||||
/*
|
||||
* 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.rest;
|
||||
|
||||
import com.baiye.annotation.Inner;
|
||||
import com.baiye.annotation.Log;
|
||||
import com.baiye.constant.DefaultNumberConstants;
|
||||
import com.baiye.constant.SecurityConstants;
|
||||
import com.baiye.http.CommonResponse;
|
||||
import com.baiye.modules.platform.service.ModeRecordService;
|
||||
import com.baiye.modules.platform.service.dto.AgentQueryCriteria;
|
||||
import com.baiye.modules.platform.service.dto.DecryptionDTO;
|
||||
import com.baiye.modules.platform.service.dto.ModeRecordQueryCriteria;
|
||||
import com.baiye.util.SecurityUtils;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Enzo
|
||||
* @date 2022-08-13
|
||||
*/
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
@Api(tags = "广告建模")
|
||||
@RequestMapping("/api/mode/record")
|
||||
public class ModeRecordController {
|
||||
|
||||
private final ModeRecordService modeRecordService;
|
||||
|
||||
@ApiOperation("查询建模记录")
|
||||
@GetMapping
|
||||
public ResponseEntity<Object> 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<Object> 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<Object> 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<String> queryPath(Long downId) {
|
||||
String path = modeRecordService.findPath(downId);
|
||||
return new ResponseEntity<>(path, HttpStatus.OK);
|
||||
}
|
||||
|
||||
@Log("修改数量")
|
||||
@Inner
|
||||
@ApiOperation("修改数量")
|
||||
@GetMapping("/update/num")
|
||||
public CommonResponse<Object> updateQuantity(String path, Integer num, Long downId) {
|
||||
modeRecordService.updateNumById(path, num, downId);
|
||||
return CommonResponse.createBySuccess();
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
@ -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;
|
||||
}
|
@ -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<Timestamp> createTime;
|
||||
}
|
@ -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<ModelRecordDto> treeList;
|
||||
}
|
@ -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<ModeRecord> page = modeRecordRepository.findAll
|
||||
((root, criteriaQuery, criteriaBuilder) ->
|
||||
QueryHelp.getPredicate(root, criteria, criteriaBuilder), pageable);
|
||||
List<ModelRecordDto> dtoList = page.map(modeRecordMapper::toDto).getContent();
|
||||
dtoList.forEach(dto -> {
|
||||
List<ModeRecord> 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<ImeiDTO> stringList = Lists.newArrayList();
|
||||
for (MultipartFile file : files) {
|
||||
String originalFilename = file.getOriginalFilename();
|
||||
if (StringUtils.isNotBlank(originalFilename)) {
|
||||
stringList = parseFile(file, originalFilename);
|
||||
}
|
||||
}
|
||||
// 去除重复数据
|
||||
List<ImeiDTO> dtoArrayList = Lists.newArrayList(Sets.newHashSet(stringList));
|
||||
// 保存父类数据
|
||||
Long recordId = saveRecord(taskName, uploadType, userId, (long) DefaultNumberConstants.ZERO_NUMBER,
|
||||
DefaultNumberConstants.ONE_NUMBER, CharSequenceUtil.EMPTY, dtoArrayList);
|
||||
// tag分组
|
||||
Map<String, List<ImeiDTO>> collect = dtoArrayList.stream().
|
||||
collect(Collectors.groupingBy(ImeiDTO::getTag));
|
||||
for (Map.Entry<String, List<ImeiDTO>> entry : collect.entrySet()) {
|
||||
String tag = entry.getKey();
|
||||
List<ImeiDTO> imeiDTOList = entry.getValue();
|
||||
// 保存子类数据
|
||||
Long childrenId = saveRecord(taskName, uploadType, userId, recordId,
|
||||
DefaultNumberConstants.TWO_NUMBER, tag, imeiDTOList);
|
||||
if (uploadType < DefaultNumberConstants.TWO_NUMBER) {
|
||||
// 每次100000 数据
|
||||
List<List<ImeiDTO>> partition = Lists.partition
|
||||
(imeiDTOList, DefaultNumberConstants.ONE_HUNDRED_THOUSAND);
|
||||
for (List<ImeiDTO> 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<String> 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<ImeiDTO> 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<ImeiDTO> parseFile(MultipartFile file, String originalFilename) {
|
||||
List<ImeiDTO> 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<Object> 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;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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<ModelRecordDto, ModeRecord> {
|
||||
|
||||
}
|
@ -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<ImeiDTO> dtoArrayList, Long recordId, Long childrenId) {
|
||||
log.info("================== run task begin time {} ==================", DateUtil.now());
|
||||
StopWatch stopWatch = new StopWatch();
|
||||
String uuid = IdUtil.fastSimpleUUID();
|
||||
List<String> stringList = Lists.newArrayList();
|
||||
// 取出线程池
|
||||
Executor executor = threadConfig.getExecutor();
|
||||
List<CompletableFuture<List<String>>> results = Lists.newArrayList();
|
||||
// 取出值
|
||||
List<String> sendList = dtoArrayList.stream().map(ImeiDTO::getImei).collect(Collectors.toList());
|
||||
List<List<String>> partition = Lists.partition(sendList, DefaultNumberConstants.TWO_HUNDRED);
|
||||
int batchNum = partition.size();
|
||||
stopWatch.start();
|
||||
for (List<String> list : partition) {
|
||||
TimeUnit.MILLISECONDS.sleep(DefaultNumberConstants.ONE_THOUSAND);
|
||||
// 异步线程池
|
||||
CompletableFuture<List<String>> 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<String> 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<Void> allCompletableFuture = CompletableFuture.allOf
|
||||
(results.toArray(new CompletableFuture[batchNum]));
|
||||
List<List<String>> 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<String> stringList, Long id, String actId, String actName) {
|
||||
log.info("================== run task begin time {} ==================", DateUtil.now());
|
||||
int count = DefaultNumberConstants.ZERO_NUMBER;
|
||||
List<List<String>> partition = Lists.partition(stringList, DefaultNumberConstants.ONE_THOUSAND);
|
||||
// 调用推送地址进行推送
|
||||
CallImportDTO dto = new CallImportDTO();
|
||||
dto.setActId(actId);
|
||||
dto.setActName(actName);
|
||||
for (List<String> list : partition) {
|
||||
List<CallImportDTO.Source> 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());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue