|
|
@ -15,28 +15,38 @@
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
package me.zhengjie.modules.gender.service.impl;
|
|
|
|
package me.zhengjie.modules.gender.service.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import cn.hutool.core.codec.Base64;
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
import cn.hutool.core.util.IdUtil;
|
|
|
|
import cn.hutool.core.text.csv.CsvUtil;
|
|
|
|
import cn.hutool.core.util.ObjectUtil;
|
|
|
|
import cn.hutool.core.text.csv.CsvWriter;
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
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.Lists;
|
|
|
|
import com.google.common.collect.Sets;
|
|
|
|
import com.google.common.collect.Sets;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import lombok.SneakyThrows;
|
|
|
|
import lombok.SneakyThrows;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
|
|
|
import me.zhengjie.common.http.CommonResponse;
|
|
|
|
import me.zhengjie.exception.BadRequestException;
|
|
|
|
import me.zhengjie.exception.BadRequestException;
|
|
|
|
import me.zhengjie.modules.constant.FileConstant;
|
|
|
|
import me.zhengjie.modules.constant.FileConstant;
|
|
|
|
import me.zhengjie.modules.gender.config.properties.DeliveryProperties;
|
|
|
|
import me.zhengjie.modules.gender.config.properties.DeliveryProperties;
|
|
|
|
import me.zhengjie.modules.gender.domain.DeliveryGender;
|
|
|
|
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.repository.DeliveryGenderRepository;
|
|
|
|
import me.zhengjie.modules.gender.service.DeliveryGenderService;
|
|
|
|
import me.zhengjie.modules.gender.service.DeliveryGenderService;
|
|
|
|
import me.zhengjie.modules.gender.service.dto.DeliveryGenderDto;
|
|
|
|
import me.zhengjie.modules.gender.service.dto.DeliveryGenderDto;
|
|
|
|
import me.zhengjie.modules.gender.service.dto.DeliveryGenderQueryCriteria;
|
|
|
|
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.gender.service.mapstruct.DeliveryGenderMapper;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.AESUtils;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.AESUtils;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.ToolExcelUtils;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.ToolExcelUtils;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.TxtUtils;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.TxtUtils;
|
|
|
|
import me.zhengjie.modules.uploadnew.util.ZipUtils;
|
|
|
|
import me.zhengjie.utils.PageUtil;
|
|
|
|
import me.zhengjie.utils.*;
|
|
|
|
import me.zhengjie.utils.*;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.springframework.data.domain.Page;
|
|
|
|
import org.springframework.data.domain.Page;
|
|
|
@ -48,11 +58,12 @@ import org.springframework.web.multipart.MultipartFile;
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.File;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.*;
|
|
|
|
import java.util.LinkedHashMap;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.concurrent.locks.Lock;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.concurrent.locks.ReentrantLock;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* @author Enzo
|
|
|
|
* @author Enzo
|
|
|
@ -65,6 +76,10 @@ import java.util.stream.Collectors;
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
public class DeliveryGenderServiceImpl implements DeliveryGenderService {
|
|
|
|
public class DeliveryGenderServiceImpl implements DeliveryGenderService {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final Lock lock = new ReentrantLock();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private final DeliveryGenderBatchNoRepository deliveryGenderBatchNoRepository;
|
|
|
|
|
|
|
|
|
|
|
|
private final DeliveryGenderRepository deliveryGenderRepository;
|
|
|
|
private final DeliveryGenderRepository deliveryGenderRepository;
|
|
|
|
|
|
|
|
|
|
|
|
private final DeliveryGenderMapper deliveryGenderMapper;
|
|
|
|
private final DeliveryGenderMapper deliveryGenderMapper;
|
|
|
@ -139,7 +154,9 @@ public class DeliveryGenderServiceImpl implements DeliveryGenderService {
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
@SneakyThrows
|
|
|
|
@SneakyThrows
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
public Boolean uploadFile(MultipartFile[] files, String taskName) {
|
|
|
|
public Boolean uploadFile(MultipartFile[] files, String taskName) {
|
|
|
|
|
|
|
|
|
|
|
|
if (files.length > 0) {
|
|
|
|
if (files.length > 0) {
|
|
|
|
List<String> arrayList = Lists.newArrayList();
|
|
|
|
List<String> arrayList = Lists.newArrayList();
|
|
|
|
for (MultipartFile file : files) {
|
|
|
|
for (MultipartFile file : files) {
|
|
|
@ -166,37 +183,55 @@ public class DeliveryGenderServiceImpl implements DeliveryGenderService {
|
|
|
|
if (stringList.size() < 100) {
|
|
|
|
if (stringList.size() < 100) {
|
|
|
|
throw new BadRequestException("上传条数不能小于100条");
|
|
|
|
throw new BadRequestException("上传条数不能小于100条");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 每次500000 数据
|
|
|
|
// 每次1000 数据
|
|
|
|
List<List<String>> partition = Lists.partition(stringList, 500000);
|
|
|
|
List<List<String>> partition = Lists.partition(stringList, 1000);
|
|
|
|
|
|
|
|
Long deliveryRecordId = this.saveDeliveryRecord(taskName, stringList.size(), SecurityUtils.getCurrentUserId(), 1);
|
|
|
|
for (List<String> list : partition) {
|
|
|
|
for (List<String> list : partition) {
|
|
|
|
String uuid = IdUtil.fastSimpleUUID();
|
|
|
|
String batch = redisUtils.acquisitionBatch(CacheKey.GR_REQUEST_TYPE);
|
|
|
|
String sendMailName = redisUtils.acquisitionBatch(CacheKey.GR_REQUEST_TYPE);
|
|
|
|
List<ExchangeGenderDTO.Data> dataList = Lists.newArrayList();
|
|
|
|
String file = FileUtil.SYS_TEM_DIR.concat(StrUtil.SLASH).concat(uuid);
|
|
|
|
list.forEach(encipherDTO -> {
|
|
|
|
// 保存文件下载地址
|
|
|
|
ExchangeGenderDTO.Data data = new ExchangeGenderDTO.Data();
|
|
|
|
ZipUtils.zipFileAndSendGenderMail(list, file, sendMailName, deliveryProperties);
|
|
|
|
data.setData(Base64.encode(encipherDTO));
|
|
|
|
this.saveDeliveryRecord(taskName, sendMailName, list.size(), SecurityUtils.getCurrentUserId(), 1);
|
|
|
|
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.TRUE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Boolean.FALSE;
|
|
|
|
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();
|
|
|
|
DeliveryGender deliveryRecord = new DeliveryGender();
|
|
|
|
deliveryRecord.setNum(num);
|
|
|
|
deliveryRecord.setNum(num);
|
|
|
|
deliveryRecord.setStatus(0);
|
|
|
|
deliveryRecord.setStatus(0);
|
|
|
|
deliveryRecord.setType(type);
|
|
|
|
deliveryRecord.setType(type);
|
|
|
|
deliveryRecord.setUserId(currentUserId);
|
|
|
|
deliveryRecord.setUserId(currentUserId);
|
|
|
|
deliveryRecord.setMailName(sendMailName);
|
|
|
|
|
|
|
|
deliveryRecord.setTaskName(taskImeiName);
|
|
|
|
deliveryRecord.setTaskName(taskImeiName);
|
|
|
|
return deliveryGenderRepository.save(deliveryRecord).getId() != null;
|
|
|
|
return deliveryGenderRepository.save(deliveryRecord).getId();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
@Override
|
|
|
|
public DeliveryGender findByMailName(String taskName) {
|
|
|
|
public DeliveryGender findByMailName(String taskName) {
|
|
|
|
// 防止重复提交数据
|
|
|
|
// 防止重复提交数据
|
|
|
|
List<DeliveryGender> byTaskName =
|
|
|
|
List<DeliveryGender> byTaskName =
|
|
|
|
deliveryGenderRepository.findByMailName(taskName);
|
|
|
|
deliveryGenderRepository.findByBatchNo(taskName);
|
|
|
|
return CollUtil.isNotEmpty(byTaskName) ? byTaskName.get(0) : null;
|
|
|
|
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;
|
|
|
|
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("该批次不存在");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|