邮件改为接口兑换

master
bynt 1 year ago
parent 5cb2df28d7
commit c3d3732cb9

@ -0,0 +1,18 @@
package com.baiye.http;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Enzo
* @date 2023-8-2
*/
@Data
@NoArgsConstructor
public class InterfaceExchangeResponse {
private String reqId;
private Boolean result;
private String reason;
}

@ -32,7 +32,7 @@ public class Clue extends BaseClue {
@ApiModelProperty(value = "性别")
@Column(name = "gender")
private Integer gender = DefaultNumberConstants.ZERO_NUMBER;
private Integer gender = DefaultNumberConstants.MINUS_TWO_NUMBER;
@ApiModelProperty(value = "线索分配人")
@Transient

@ -8,12 +8,12 @@ import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.config.properties.ExchangeProperties;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.model.dto.SetCallBackDTO;
import com.baiye.modules.platform.domain.DeliveryRecord;
import com.baiye.modules.platform.repository.DeliveryRecordRepository;
import com.baiye.modules.platform.service.DeliveryRecordService;
import com.baiye.modules.platform.service.dto.ExchangeStripsDTO;
import com.baiye.modules.platform.service.dto.ImeiDTO;
import com.baiye.modules.platform.service.dto.SetCallBackDTO;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@ -1,4 +1,4 @@
package com.baiye.modules.platform.service.dto;
package com.baiye.model.dto;
import com.google.gson.annotations.SerializedName;
import lombok.Builder;

@ -1,6 +1,5 @@
package com.baiye.model.entity;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.util.JpaConverterAes;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -8,7 +7,10 @@ import org.hibernate.annotations.CreationTimestamp;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.io.Serializable;

@ -0,0 +1,22 @@
package com.baiye.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
/**
* @author Enzo
* @date : 2022/10/18
*/
@Data
@Configuration
@ConfigurationProperties(prefix = "gender")
public class GenderProperties {
private String orgCode;
private String callbackUrl;
private String submitUrl;
}

@ -0,0 +1,46 @@
package com.baiye.module.controller;
/**
* @author Enzo
* @date : 2023/8/2
*/
import com.baiye.annotation.Inner;
import com.baiye.http.CommonResponse;
import com.baiye.module.service.GenderRecordService;
import com.baiye.module.service.dto.InterfaceResponseDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author Enzo
* @date : 2023/6/12
*/
@Api(tags = "性别兑换")
@Slf4j
@RestController
@RequestMapping(value = "/gender/exchange/v1")
@AllArgsConstructor
public class InterfaceConfigController {
private GenderRecordService genderRecordService;
@Inner(value = false)
@ApiOperation(value = "设置回调接口")
@GetMapping("/set/url")
public CommonResponse<Object> queryNotApproved(String url){
return CommonResponse.createBySuccess(genderRecordService.setCallBackUrl(url));
}
@ApiOperation(value = "兑换接口回调")
@PostMapping("/callback")
public CommonResponse<Object> queryNotApproved(@RequestBody @Validated InterfaceResponseDTO interfaceResponseDTO){
log.info("================ The receiving batch number is {} ================", interfaceResponseDTO.getBatchId());
return genderRecordService.resourceCallback(interfaceResponseDTO);
}
}

@ -75,5 +75,5 @@ public class Clue extends BaseClue {
@ApiModelProperty(value = "性别")
@Column(name = "gender")
private Integer gender = DefaultNumberConstants.ZERO_NUMBER;
private Integer gender = DefaultNumberConstants.MINUS_TWO_NUMBER;
}

@ -1,6 +1,10 @@
package com.baiye.module.service;
import com.baiye.http.CommonResponse;
import com.baiye.module.entity.DeliveryGender;
import com.baiye.module.service.dto.InterfaceResponseDTO;
import java.util.List;
/**
* @author Enzo
@ -39,4 +43,25 @@ public interface GenderRecordService {
* @return
*/
Boolean updateStatusByTaskName(DeliveryGender taskName);
/**
*
* @param stringList
* @return
*/
Boolean sendInterfaceByTaskName(List<String> stringList);
/**
*
* @param url
* @return
*/
Boolean setCallBackUrl(String url);
/**
*
* @param interfaceResponseDTO
* @return
*/
CommonResponse<Object> resourceCallback(InterfaceResponseDTO interfaceResponseDTO);
}

@ -0,0 +1,43 @@
package com.baiye.module.service.dto;
import com.google.gson.annotations.SerializedName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* @author Enzo
* @date : 2023/5/9
*/
@Data
@Builder
public class ExchangeGenderDTO implements Serializable {
@SerializedName("req_id")
private String reqId;
@ApiModelProperty("批次号")
@SerializedName("batch_id")
private String batchId;
@SerializedName("org_code")
private String orgCode;
@SerializedName("level")
private Integer level = 0;
@SerializedName("datas")
private List<Data> datas;
@lombok.Data
public static class Data {
@SerializedName("data")
private String data;
}
}

@ -1,18 +1,40 @@
package com.baiye.module.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.StrPool;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baiye.config.properties.GenderProperties;
import com.baiye.constant.AdPlatFormConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.enums.MailRequestEnum;
import com.baiye.http.CommonResponse;
import com.baiye.http.InterfaceExchangeResponse;
import com.baiye.http.ResponseCode;
import com.baiye.model.dto.SetCallBackDTO;
import com.baiye.module.dao.DeliveryGenderRepository;
import com.baiye.module.dao.DeliveryRecordRepository;
import com.baiye.module.entity.DeliveryGender;
import com.baiye.module.entity.DeliveryRecord;
import com.baiye.module.service.DeliveryRecordService;
import com.baiye.module.service.ClueService;
import com.baiye.module.service.GenderRecordService;
import com.baiye.module.service.dto.ExchangeGenderDTO;
import com.baiye.module.service.dto.InterfaceResponseDTO;
import com.baiye.util.AESUtils;
import com.baiye.util.RedisUtils;
import com.baiye.util.ValidationUtil;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
/**
* @author Enzo
@ -23,8 +45,16 @@ import java.util.List;
@RequiredArgsConstructor
public class GenderRecordServiceImpl implements GenderRecordService {
private final DeliveryGenderRepository deliveryGenderRepository;
private final GenderProperties genderProperties;
private final ClueService clueService;
private final RedisUtils redisUtils;
@Override
public DeliveryGender findByTaskName(String taskName) {
// 防止重复提交数据
@ -41,7 +71,6 @@ public class GenderRecordServiceImpl implements GenderRecordService {
@Override
public Boolean saveDeliveryRecord(String taskImeiName, Integer num, Integer type) {
DeliveryGender deliveryRecord = new DeliveryGender();
deliveryRecord.setNum(num);
deliveryRecord.setType(type);
@ -54,4 +83,92 @@ public class GenderRecordServiceImpl implements GenderRecordService {
public Boolean updateStatusByTaskName(DeliveryGender taskName) {
return deliveryGenderRepository.save(taskName).getId() != null;
}
@Override
public Boolean sendInterfaceByTaskName(List<String> stringList) {
// 每次1000 数据
List<List<String>> partition = Lists.partition(stringList, DefaultNumberConstants.ONE_THOUSAND);
for (List<String> list : partition) {
String sendTaskName = redisUtils.acquisitionBatch(MailRequestEnum.GG.getCacheName());
List<ExchangeGenderDTO.Data> dataList = Lists.newArrayList();
list.forEach(encipherDTO -> {
ExchangeGenderDTO.Data data = new ExchangeGenderDTO.Data();
data.setData(Base64.encode(encipherDTO));
dataList.add(data);
});
String randomString = RandomUtil.randomString(DefaultNumberConstants.TWELVE_NUMBER);
ExchangeGenderDTO build = ExchangeGenderDTO.builder().batchId(sendTaskName).reqId(randomString).level
(DefaultNumberConstants.ZERO_NUMBER).orgCode(genderProperties.getOrgCode()).datas(dataList).build();
String post = HttpUtil.post(genderProperties.getSubmitUrl(), JSONUtil.toJsonStr(build));
InterfaceExchangeResponse bean = JSONUtil.toBean(post, InterfaceExchangeResponse.class);
if (ObjectUtil.isNotNull(bean) && Boolean.FALSE.equals(bean.getResult())){
return Boolean.FALSE;
}
this.saveDeliveryRecord(sendTaskName, list.size(), DefaultNumberConstants.ONE_NUMBER);
log.info("============ the submit result as {} =========", JSONUtil.toJsonStr(post));
}
return Boolean.TRUE;
}
@Override
public Boolean setCallBackUrl(String url) {
SetCallBackDTO build = SetCallBackDTO.builder().callBackUrl(url).reqId
(RandomUtil.randomString(DefaultNumberConstants.TEN_NUMBER)).orgCode
(genderProperties.getOrgCode()).build();
String post = HttpUtil.post(genderProperties.getCallbackUrl(), JSONUtil.toJsonStr(build));
if (post.contains("true")) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
@Override
@Transactional(rollbackFor = Exception.class)
public CommonResponse<Object> resourceCallback(InterfaceResponseDTO interfaceResponseDTO) {
String reqId = interfaceResponseDTO.getReqId();
String batchId = interfaceResponseDTO.getBatchId();
// 拆解批次号
if (StringUtils.isNotBlank(batchId)) {
batchId = batchId.substring(DefaultNumberConstants.ZERO_NUMBER, batchId.lastIndexOf(StrPool.DASHED));
}
List<InterfaceResponseDTO.Data> dataList = interfaceResponseDTO.getDatas();
Object objCache = redisUtils.get(reqId);
if (ObjectUtil.isNotNull(objCache)) {
return CommonResponse.createByErrorCodeMessage
(ResponseCode.BATCH_NUMBER_EXIST_OR_SEND.getCode(),
ResponseCode.BATCH_NUMBER_REPEAT_TRANSMISSION.getDesc());
}
// 设置五分钟缓存
redisUtils.set(reqId, reqId, DefaultNumberConstants.TEN_NUMBER, TimeUnit.MINUTES);
DeliveryGender byTaskName = this.findByTaskName(batchId);
if (ObjectUtil.isNotNull(byTaskName) &&
byTaskName.getStatus() == DefaultNumberConstants.ZERO_NUMBER) {
// 异步执行任务
CompletableFuture.runAsync(() -> updateGenderByData(dataList));
Boolean result = this.updateStatusByTaskName(DefaultNumberConstants.ONE_NUMBER, batchId);
log.info("================= change delivery record {} result as {} =================", batchId, result);
return CommonResponse.createBySuccess();
}
return CommonResponse.createByErrorCodeMessage
(ResponseCode.BATCH_NUMBER_EXIST_OR_SEND.getCode(),
ResponseCode.BATCH_NUMBER_REPEAT_TRANSMISSION.getDesc());
}
private void updateGenderByData(List<InterfaceResponseDTO.Data> dataList ) {
for (InterfaceResponseDTO.Data data : dataList) {
if (StringUtils.isNotBlank(data.getData())) {
List<String> stringList = Splitter.on(StrPool.COMMA).trimResults()
.omitEmptyStrings().splitToList(Base64.decodeStr(data.getData()));
String decrypt = AESUtils.dbDecrypt
(AdPlatFormConstants.AES_PASSWORD, stringList.get(DefaultNumberConstants.ZERO_NUMBER));
String numInteger = stringList.get(DefaultNumberConstants.ONE_NUMBER);
// 修改gender
clueService.updateGenderByZid(AESUtils.encrypt
(decrypt, AdPlatFormConstants.AD_PLATFORM), ValidationUtil.isInteger(numInteger)
? Integer.parseInt(numInteger) : DefaultNumberConstants.FOUR_NUMBER);
}
}
}
}

@ -11,13 +11,12 @@ import cn.hutool.core.util.ObjectUtil;
import com.baiye.config.properties.DeliveryProperties;
import com.baiye.constant.AdPlatFormConstants;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.enums.MailRequestEnum;
import com.baiye.module.entity.DeliveryGender;
import com.baiye.module.service.ClueService;
import com.baiye.module.service.GenderRecordService;
import com.baiye.module.service.dto.QueryClueDTO;
import com.baiye.util.*;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
@ -53,16 +52,15 @@ public class GenderConversionTask {
private final DeliveryProperties deliveryProperties;
private final GenderRecordService genderRecordService;
@Scheduled(cron = "0 0/20 0-6 * * ? ")
// @Scheduled(cron = "0 0/20 0-6 * * ? ")
@Transactional(rollbackFor = Exception.class)
public void exchangeResource() {
String fileUrl = deliveryProperties.getFileUrl();
// 单次查询10000
List<Map<Long, String>> resourceList = clueService.queryUnconvertedResource
(DefaultNumberConstants.ZERO_NUMBER, DefaultNumberConstants.TEN_THOUSAND);
if (resourceList.size() > DefaultNumberConstants.ONE_THOUSAND && CollUtil.isNotEmpty(resourceList)) {
(DefaultNumberConstants.MINUS_TWO_NUMBER, DefaultNumberConstants.TEN_THOUSAND);
if (CollUtil.isNotEmpty(resourceList) && resourceList.size() > DefaultNumberConstants.ONE_HUNDRED) {
// 对应转换
List<QueryClueDTO> list = Convert.toList(QueryClueDTO.class, resourceList);
// 第一id
@ -77,20 +75,21 @@ public class GenderConversionTask {
AESUtils.dbEncrypt(AdPlatFormConstants.AES_PASSWORD, decrypt) : CharSequenceUtil.EMPTY;
}).filter(StringUtils::isNotBlank).distinct()
.collect(Collectors.toList());
String taskImeiName = redisUtils.acquisitionBatch(MailRequestEnum.GG.getCacheName());
String file = fileUrl.concat(StrPool.SLASH).concat(taskImeiName);
// 压缩文件并发送
FileAndGenderUtil.zipFileAndSendGenderMail(stringList, file, taskImeiName, deliveryProperties);
clueService.updateGenderById(DefaultNumberConstants.FOUR_NUMBER, DefaultNumberConstants.ZERO_NUMBER, firstId, lastId);
genderRecordService.saveDeliveryRecord(taskImeiName, list.size(), DefaultNumberConstants.ONE_NUMBER);
Boolean sendResult = genderRecordService.sendInterfaceByTaskName(stringList);
if (Boolean.TRUE.equals(sendResult)) {
clueService.updateGenderById(DefaultNumberConstants.FOUR_NUMBER, DefaultNumberConstants.MINUS_TWO_NUMBER, firstId, lastId);
}
log.info("============== the save num as {} first id {} last id {} ================", stringList.size(), firstId, lastId);
}
}
/**
* @date 2023-8-2
* Example Modify an email as an interface
*/
@SneakyThrows
@Scheduled(cron = "0 0/10 0-6 * * ? ")
@Transactional(rollbackFor = Exception.class)
@Deprecated
public void receiveMail() {
// 获取邮件内容
List<Message> list = MailUtil.readMailByIMAP
@ -113,9 +112,7 @@ public class GenderConversionTask {
&& !byTaskName.getTaskNumStr().contains(taskName)) {
List<String> taskNumStr = byTaskName.getTaskNumStr();
taskNumStr.add(taskName);
log.info("================ the gender mail taskName as {} ==============", taskName);
List<String> zidList = Lists.newArrayList();
List<String> genderList = Lists.newArrayList();
log.info("================ the gender mail taskName as {} ==============", taskName);
CsvReader reader = CsvUtil.getReader();
// 解析附件内容并保存文件
String path = MailUtil.saveAttachMent
@ -129,21 +126,17 @@ public class GenderConversionTask {
(file.listFiles())[DefaultNumberConstants.ZERO_NUMBER];
// 解析文件
CsvData data = reader.read(parseFile);
// csv通配
data.getRows().forEach(clue -> {
zidList.add(AESUtils.dbDecrypt
(AdPlatFormConstants.AES_PASSWORD, clue.get(DefaultNumberConstants.ZERO_NUMBER)));
genderList.add(clue.get(DefaultNumberConstants.ONE_NUMBER));
});
Map<String, String> hashMap = Maps.newHashMap();
for (int i = 0; i < zidList.size(); i++) {
String genderType = genderList.get(i);
String letterToNum = zidList.get(i);
if (MobileUtil.checkPhone(letterToNum)) {
// csv通配
data.getRows().forEach(clue -> hashMap.put(AESUtils.dbDecrypt(AdPlatFormConstants.AES_PASSWORD,
clue.get(DefaultNumberConstants.ZERO_NUMBER)), clue.get(DefaultNumberConstants.ONE_NUMBER)));
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
if (MobileUtil.checkPhone(entry.getKey())) {
// 修改gender
clueService.updateGenderByZid(AESUtils.encrypt
(letterToNum, AdPlatFormConstants.AD_PLATFORM), ValidationUtil.isInteger(genderType)
? Integer.parseInt(genderType) + DefaultNumberConstants.ONE_NUMBER : DefaultNumberConstants.FOUR_NUMBER);
(entry.getKey(), AdPlatFormConstants.AD_PLATFORM), ValidationUtil.isInteger(entry.getValue())
? Integer.parseInt(entry.getValue()): DefaultNumberConstants.FOUR_NUMBER);
}
}
byTaskName.setStatus(DefaultNumberConstants.ONE_NUMBER);

@ -50,6 +50,7 @@ security:
- /oauth/check_token
- /open/v1/form/add
- /dmp/v1/exchange/callback
- /gender/exchange/v1/callback
#hutool雪花算法
snowflake:
@ -65,3 +66,8 @@ ribbon:
ConnectTimeout: 3000
#建立连接之后,读取响应资源超时时间
ReadTimeout: 3000
gender:
orgCode: org_bywx
submitUrl: http://proxy.hzdaba.cn:58899/pub/wx/submit
callbackUrl: http://proxy.hzdaba.cn:58899/pub/wx/set

Loading…
Cancel
Save