修改邮件为接口

master
bynt 1 year ago
parent 8a8ff4fee0
commit 1118b9b760

@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-06-21T17:29:40+0800",
date = "2023-08-03T13:20:50+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_251 (Oracle Corporation)"
)
@Component

@ -9,7 +9,7 @@ import org.springframework.stereotype.Component;
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-06-21T17:29:40+0800",
date = "2023-08-03T13:20:50+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_251 (Oracle Corporation)"
)
@Component

@ -33,6 +33,11 @@ public class DeliveryProperties {
@ApiModelProperty("emailPassword")
private String emailPassword;
@ApiModelProperty("orgCode")
private String orgCode;
@ApiModelProperty("submitUrl")
private String submitUrl;
@ApiModelProperty("toGenderEmailAddress")

@ -65,9 +65,9 @@ public class DeliveryGender implements Serializable {
@ApiModelProperty(value = "文件地址")
private String downPath;
@Column(name = "mail_name")
@ApiModelProperty(value = "文件地址")
private String mailName;
@Column(name = "batch_no")
@ApiModelProperty(value = "批次号")
private String batchNo;
@Column(name = "type")
@ApiModelProperty(value = "类型")
@ -78,6 +78,7 @@ public class DeliveryGender implements Serializable {
@ApiModelProperty(value = "用户id")
private Long userId;
@CreationTimestamp
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")

@ -0,0 +1,60 @@
package me.zhengjie.modules.gender.domain;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import javax.persistence.*;
import java.sql.Timestamp;
/**
* @author Enzo
* @date : 2023/8/2
*/
@Entity
@Getter
@Setter
@Table(name="tb_delivery_gender_batch_no")
public class DeliveryGenderBatchNo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
@ApiModelProperty(value = "id")
private Long id;
@Column(name = "delivery_id")
@ApiModelProperty(value = "投放id")
private Long deliveryId;
@Column(name = "request_id")
@ApiModelProperty(value = "请求id")
private String requestId;
@Column(name = "num")
@ApiModelProperty(value = "数量")
private Integer num;
@Column(name = "status")
@ApiModelProperty(value = "状态值")
private Integer status;
@Column(name = "batch_no")
@ApiModelProperty(value = "批次号")
private String batchNo;
@CreationTimestamp
@Column(name = "create_time")
@ApiModelProperty(value = "创建时间")
private Timestamp createTime;
@UpdateTimestamp
@Column(name = "update_time")
@ApiModelProperty(value = "更新时间")
private Timestamp updateTime;
}

@ -0,0 +1,41 @@
/*
* 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 me.zhengjie.modules.gender.repository;
import me.zhengjie.modules.gender.domain.DeliveryGender;
import me.zhengjie.modules.gender.domain.DeliveryGenderBatchNo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import java.util.List;
/**
* @author Enzo
* @date 2023-08-02
**/
public interface DeliveryGenderBatchNoRepository extends JpaRepository<DeliveryGenderBatchNo, Long>, JpaSpecificationExecutor<DeliveryGenderBatchNo> {
/**
*
*
* @param batchNo
* @return
*/
@Query(value = "from DeliveryGenderBatchNo where batchNo = ?1 order by id desc ")
List<DeliveryGenderBatchNo> findByBatchNo(String batchNo);
}

@ -42,24 +42,24 @@ public interface DeliveryGenderRepository extends JpaRepository<DeliveryGender,
/**
*
*
*
* @param taskName
* @param batchNo
* @return
*/
@Query(value = "from DeliveryGender where mailName = ?1 order by id desc ")
List<DeliveryGender> findByMailName(String taskName);
@Query(value = "from DeliveryGender where batchNo = ?1 order by id desc ")
List<DeliveryGender> findByBatchNo(String batchNo);
/**
*
*
* @param num
* @param taskName
* @param batchNo
* @return
*/
@Modifying
@Query("UPDATE DeliveryGender d set d.status = ?1 where d.taskName = ?2")
int updateStatusAndDecryptNum(Integer num, String taskName);
@Query("UPDATE DeliveryGender d set d.status = ?1 where d.batchNo = ?2")
int updateStatusByBatchNo(Integer num, String batchNo);
/**
*
@ -72,4 +72,31 @@ public interface DeliveryGenderRepository extends JpaRepository<DeliveryGender,
@Modifying
@Query("UPDATE DeliveryGender d set d.status = ?3,d.downUrl = ?1,d.downPath = ?2 where d.taskName = ?4")
int updateStatusAndDownUrlByTaskName(String downUrl, String zipPath, Integer number, String taskName);
/**
*
* @param downUrl
* @param zipPath
* @param batchNo
* @return
*/
@Modifying
@Query("UPDATE DeliveryGender d set d.downUrl = ?1,d.downPath = ?2 where d.batchNo = ?3")
void updateDownUrlByBatchName(String downUrl, String zipPath, String batchNo);
/**
*
*
* @param downUrl
* @param status
* @param zipPath
* @param id
* @return
*/
@Modifying
@Query("UPDATE DeliveryGender d set d.downUrl = ?1,d.status = ?2,d.downPath = ?3 where d.id = ?4")
void updateDownUrlAndStatusById(String downUrl, Integer status, String zipPath, Long id);
}

@ -15,12 +15,19 @@
*/
package me.zhengjie.modules.gender.rest;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.annotation.Log;
import me.zhengjie.common.http.CommonResponse;
import me.zhengjie.modules.gender.domain.DeliveryGender;
import me.zhengjie.modules.gender.service.DeliveryGenderService;
import me.zhengjie.modules.gender.service.dto.DeliveryGenderQueryCriteria;
import me.zhengjie.modules.gender.service.dto.GenderResponseDTO;
import me.zhengjie.modules.gender.service.dto.SetCallBackDTO;
import me.zhengjie.utils.SecurityUtils;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
@ -37,6 +44,7 @@ import java.io.IOException;
* @website https://el-admin.vip
* @date 2023-06-01
**/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/deliveryGender")
@ -91,4 +99,13 @@ public class DeliveryGenderController {
public ResponseEntity<Object> uploadFile(@RequestParam("file") MultipartFile[] files, @RequestParam(value = "taskName") String taskName) {
return new ResponseEntity<>(deliveryGenderService.uploadFile(files, taskName), HttpStatus.OK);
}
@ApiOperation(value = "兑换接口回调")
@PostMapping("/callback")
public CommonResponse<Object> queryNotApproved(@RequestBody @Validated GenderResponseDTO genderResponseDTO){
log.info("================ The receiving batch number is {} ================", genderResponseDTO.getBatchId());
return deliveryGenderService.resourceCallback(genderResponseDTO);
}
}

@ -15,16 +15,18 @@
*/
package me.zhengjie.modules.gender.service;
import me.zhengjie.common.http.CommonResponse;
import me.zhengjie.modules.gender.domain.DeliveryGender;
import me.zhengjie.modules.gender.service.dto.DeliveryGenderDto;
import me.zhengjie.modules.gender.service.dto.DeliveryGenderQueryCriteria;
import me.zhengjie.modules.gender.service.dto.GenderResponseDTO;
import org.springframework.data.domain.Pageable;
import org.springframework.web.multipart.MultipartFile;
import java.util.Map;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;
/**
* @website https://el-admin.vip
@ -107,4 +109,13 @@ public interface DeliveryGenderService {
* @param taskName
*/
Boolean updateStatusByTaskName(String downUrl, String zipPath, Integer number, String taskName);
/**
*
*
* @param genderResponseDTO
* @return
*/
CommonResponse<Object> resourceCallback(GenderResponseDTO genderResponseDTO);
}

@ -0,0 +1,43 @@
package me.zhengjie.modules.gender.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;
}
}

@ -0,0 +1,38 @@
package me.zhengjie.modules.gender.service.dto;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
/**
* @author Enzo
* @date : 2023/5/9
*/
@Data
public class GenderResponseDTO {
@SerializedName("req_id")
private String reqId;
@NotBlank
@SerializedName("bath_id")
private String batchId;
@SerializedName("org_code")
private String orgCode;
@SerializedName("result")
private Integer result;
@SerializedName("datas")
private List<Data> datas;
@lombok.Data
public static class Data {
@SerializedName("data")
private String data;
}
}

@ -0,0 +1,27 @@
package me.zhengjie.modules.gender.service.dto;
import com.google.gson.annotations.SerializedName;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
/**
* @author Enzo
* @date : 2023/5/9
*/
@Data
@Builder
public class SetCallBackDTO implements Serializable {
@SerializedName("req_id")
private String reqId;
@SerializedName("org_code")
private String orgCode;
@SerializedName("call_back_url")
private String callBackUrl;
}

@ -15,28 +15,38 @@
*/
package me.zhengjie.modules.gender.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.text.csv.CsvUtil;
import cn.hutool.core.text.csv.CsvWriter;
import cn.hutool.core.util.*;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.common.http.CommonResponse;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.constant.FileConstant;
import me.zhengjie.modules.gender.config.properties.DeliveryProperties;
import me.zhengjie.modules.gender.domain.DeliveryGender;
import me.zhengjie.modules.gender.domain.DeliveryGenderBatchNo;
import me.zhengjie.modules.gender.repository.DeliveryGenderBatchNoRepository;
import me.zhengjie.modules.gender.repository.DeliveryGenderRepository;
import me.zhengjie.modules.gender.service.DeliveryGenderService;
import me.zhengjie.modules.gender.service.dto.DeliveryGenderDto;
import me.zhengjie.modules.gender.service.dto.DeliveryGenderQueryCriteria;
import me.zhengjie.modules.gender.service.dto.ExchangeGenderDTO;
import me.zhengjie.modules.gender.service.dto.GenderResponseDTO;
import me.zhengjie.modules.gender.service.mapstruct.DeliveryGenderMapper;
import me.zhengjie.modules.uploadnew.util.AESUtils;
import me.zhengjie.modules.uploadnew.util.ToolExcelUtils;
import me.zhengjie.modules.uploadnew.util.TxtUtils;
import me.zhengjie.modules.uploadnew.util.ZipUtils;
import me.zhengjie.utils.PageUtil;
import me.zhengjie.utils.*;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
@ -48,11 +58,12 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Enzo
@ -65,6 +76,10 @@ import java.util.stream.Collectors;
@RequiredArgsConstructor
public class DeliveryGenderServiceImpl implements DeliveryGenderService {
private final Lock lock = new ReentrantLock();
private final DeliveryGenderBatchNoRepository deliveryGenderBatchNoRepository;
private final DeliveryGenderRepository deliveryGenderRepository;
private final DeliveryGenderMapper deliveryGenderMapper;
@ -139,7 +154,9 @@ public class DeliveryGenderServiceImpl implements DeliveryGenderService {
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public Boolean uploadFile(MultipartFile[] files, String taskName) {
if (files.length > 0) {
List<String> arrayList = Lists.newArrayList();
for (MultipartFile file : files) {
@ -166,37 +183,55 @@ public class DeliveryGenderServiceImpl implements DeliveryGenderService {
if (stringList.size() < 100) {
throw new BadRequestException("上传条数不能小于100条");
}
// 每次500000 数据
List<List<String>> partition = Lists.partition(stringList, 500000);
// 每次1000 数据
List<List<String>> partition = Lists.partition(stringList, 1000);
Long deliveryRecordId = this.saveDeliveryRecord(taskName, stringList.size(), SecurityUtils.getCurrentUserId(), 1);
for (List<String> list : partition) {
String uuid = IdUtil.fastSimpleUUID();
String sendMailName = redisUtils.acquisitionBatch(CacheKey.GR_REQUEST_TYPE);
String file = FileUtil.SYS_TEM_DIR.concat(StrUtil.SLASH).concat(uuid);
// 保存文件下载地址
ZipUtils.zipFileAndSendGenderMail(list, file, sendMailName, deliveryProperties);
this.saveDeliveryRecord(taskName, sendMailName, list.size(), SecurityUtils.getCurrentUserId(), 1);
String batch = redisUtils.acquisitionBatch(CacheKey.GR_REQUEST_TYPE);
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(12);
ExchangeGenderDTO build = ExchangeGenderDTO.builder().batchId(batch).reqId
(randomString).level(0).orgCode(deliveryProperties.getOrgCode()).datas(dataList).build();
String post = HttpUtil.post(deliveryProperties.getSubmitUrl(), JSONUtil.toJsonStr(build));
log.info("============ the submit result as {} =========", JSONUtil.toJsonStr(post));
this.saveBatchNoRecord(batch, list.size(), randomString, deliveryRecordId);
}
return Boolean.TRUE;
}
return Boolean.FALSE;
}
public Boolean saveDeliveryRecord(String taskImeiName, String sendMailName, Integer num, Long currentUserId, Integer type) {
private void saveBatchNoRecord(String batch, Integer size, String randomString, Long deliveryRecordId) {
DeliveryGenderBatchNo batchNo = new DeliveryGenderBatchNo();
batchNo.setNum(size);
batchNo.setStatus(0);
batchNo.setBatchNo(batch);
batchNo.setRequestId(randomString);
batchNo.setDeliveryId(deliveryRecordId);
deliveryGenderBatchNoRepository.save(batchNo);
}
public Long saveDeliveryRecord(String taskImeiName, Integer num, Long currentUserId, Integer type) {
DeliveryGender deliveryRecord = new DeliveryGender();
deliveryRecord.setNum(num);
deliveryRecord.setStatus(0);
deliveryRecord.setType(type);
deliveryRecord.setUserId(currentUserId);
deliveryRecord.setMailName(sendMailName);
deliveryRecord.setTaskName(taskImeiName);
return deliveryGenderRepository.save(deliveryRecord).getId() != null;
return deliveryGenderRepository.save(deliveryRecord).getId();
}
@Override
public DeliveryGender findByMailName(String taskName) {
// 防止重复提交数据
List<DeliveryGender> byTaskName =
deliveryGenderRepository.findByMailName(taskName);
deliveryGenderRepository.findByBatchNo(taskName);
return CollUtil.isNotEmpty(byTaskName) ? byTaskName.get(0) : null;
}
@ -205,5 +240,80 @@ public class DeliveryGenderServiceImpl implements DeliveryGenderService {
return deliveryGenderRepository.updateStatusAndDownUrlByTaskName(downUrl, zipPath, number, taskName) > 0;
}
}
@Override
@SneakyThrows
@Transactional(rollbackFor = Exception.class)
public CommonResponse<Object> resourceCallback(GenderResponseDTO genderResponseDTO) {
String batchId = genderResponseDTO.getBatchId();
if (StringUtils.isNotBlank(batchId)) {
batchId = batchId.substring(0, batchId.lastIndexOf(StrUtil.DASHED));
}
List<GenderResponseDTO.Data> dataList = genderResponseDTO.getDatas();
Object objCache = redisUtils.get(batchId);
if (ObjectUtil.isNotNull(objCache)) {
return CommonResponse.createByErrorCodeMessage(400, "该批次已解析");
}
// 设置五分钟缓存
redisUtils.set(batchId, batchId, 20, TimeUnit.MINUTES);
List<String> csvList = Lists.newArrayList();
List<DeliveryGenderBatchNo> byMailName = deliveryGenderBatchNoRepository.findByBatchNo(batchId);
lock.lock();
try {
if (CollUtil.isNotEmpty(byMailName)) {
DeliveryGenderBatchNo batchNo = byMailName.get(0);
DeliveryGender deliveryGender = deliveryGenderRepository.findById(batchNo.getDeliveryId()).orElseGet(DeliveryGender::new);
if (ObjectUtil.isNotNull(deliveryGender)) {
String downPath = deliveryGender.getDownPath();
for (GenderResponseDTO.Data data : dataList) {
if (StringUtils.isNotBlank(data.getData())) {
List<String> stringList = Splitter.on(StrUtil.COMMA).trimResults()
.omitEmptyStrings().splitToList(Base64.decodeStr(data.getData()));
String decrypt = AESUtils.dbDecrypt
(FileConstant.AES_PASSWORD, stringList.get(0));
String aesEncrypt = EncryptUtil.aesEncrypt(decrypt, FileConstant.PLAT_DECRYPTION);
List<String> collect = Stream.of(aesEncrypt, stringList.get(1)).collect(Collectors.toList());
String join = Joiner.on(StrUtil.COMMA).skipNulls().join(collect);
csvList.add(join);
}
}
if (StringUtils.isNotBlank(downPath)) {
// 解压文件
String unzipPath = CompressUtil.unzipFiles
(deliveryProperties.getFileUrl(), downPath, null);
File unzipFile = new File(unzipPath);
File parseFile = Objects.requireNonNull
(unzipFile.listFiles())[0];
FileUtil.writeToCsv(csvList, parseFile.getPath(), Boolean.TRUE);
// 设置压缩文件
CompressUtil.decryptionCompression(downPath, parseFile.getPath(), null);
batchNo.setStatus(1);
deliveryGenderBatchNoRepository.save(batchNo);
return CommonResponse.createBySuccess();
}
// 首次加载
String down = deliveryProperties.getFileUrl().concat(StrUtil.SLASH).concat(IdUtil.fastSimpleUUID());
String csvPath = down.concat(StrUtil.DOT).concat(FileConstant.CSV_FILE_SUB_NAME);
String zipPath = down.concat(StrUtil.DOT).concat(FileConstant.ZIP_FILE_SUB_NAME);
CsvWriter writer = CsvUtil.getWriter(csvPath, CharsetUtil.CHARSET_UTF_8);
writer.write(csvList);
writer.close();
// 设置压缩文件
CompressUtil.decryptionCompression(zipPath, csvPath, null);
String filePath = zipPath.substring
(zipPath.lastIndexOf(StrUtil.SLASH) + 1);
String downUrl = deliveryProperties.getDownPath().concat(filePath);
batchNo.setStatus(1);
deliveryGenderBatchNoRepository.save(batchNo);
deliveryGenderRepository.updateDownUrlAndStatusById(downUrl, 1, zipPath, deliveryGender.getId());
log.info("================ change down url {} zip url {} ================", zipPath, filePath);
return CommonResponse.createBySuccess();
}
}
} finally {
lock.unlock();
}
return CommonResponse.createByErrorMessage("该批次不存在");
}
}

@ -57,8 +57,11 @@ public class GenderConversionTask {
private final DeliveryGenderService deliveryGenderService;
/**
* @date 2023-8-2
* Example Modify an email as an interface
*/
@SneakyThrows
@Scheduled(cron = "0 0/15 * * * ? ")
@Transactional(rollbackFor = Exception.class)
public void receiveMail() {
// 获取邮件内容
@ -111,7 +114,7 @@ public class GenderConversionTask {
if (StringUtils.isNotBlank(byTaskName.getDownPath())) {
FileUtil.writeToCsv(joinList, parseFile.getPath(), Boolean.TRUE);
// 设置压缩文件
CompressUtil.decryptionCompression(path, parseFile.getPath(), null);
CompressUtil.decryptionCompression(byTaskName.getDownPath(), parseFile.getPath(), null);
deliveryGenderService.update(byTaskName);
return;
}

@ -119,7 +119,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/druid/**").permitAll()
// 放行发送短信接口 By Enzo
.antMatchers("/api/tbSendSms/url/**").permitAll()
.antMatchers("/api/deliveryGender/callback").permitAll()
.antMatchers("/api/smsConfiguration/detail").permitAll()
// 爬取数据请求 用户小程序过审 By Enzo
.antMatchers("/api/consult/**").permitAll()

Loading…
Cancel
Save