Commit 9dfc46bf by zhangxingmin

导入导出

parent 01839c68
package com.yd.email.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.common.utils.UUIDUtil;
import com.yd.email.api.service.ApiEmailFileService;
import com.yd.email.api.service.ApiEmailVariableGroupService;
import com.yd.email.feign.dto.ApiEmailVariableDto;
......@@ -9,19 +14,24 @@ import com.yd.email.feign.request.ApiImportVariableExcelRequest;
import com.yd.email.feign.response.ApiEmailVariableGroupDetailResponse;
import com.yd.email.feign.response.ApiExportVariableExcelResponse;
import com.yd.email.feign.response.ApiImportVariableExcelResponse;
import com.yd.email.service.dto.EmailVariableDto;
import com.yd.email.service.model.EmailContactImport;
import com.yd.email.service.model.EmailVariable;
import com.yd.email.service.service.IEmailContactImportService;
import com.yd.email.service.service.IEmailVariableService;
import com.yd.oss.feign.client.ApiExcelFeignClient;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.request.ApiExportRequest;
import com.yd.oss.feign.result.ImportResult;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
......@@ -34,6 +44,15 @@ public class ApiEmailFileServiceImpl implements ApiEmailFileService {
@Autowired
private ApiEmailVariableGroupService apiEmailVariableGroupService;
@Autowired
private IEmailVariableService iEmailVariableService;
@Autowired
private IEmailContactImportService iEmailContactImportService;
// 固定表头字段
private static final Set<String> FIXED_HEADERS = new HashSet<>(Arrays.asList("联系人", "邮箱", "抄送人"));
/**
* 导出-变量excel
* @param request
......@@ -45,7 +64,7 @@ public class ApiEmailFileServiceImpl implements ApiEmailFileService {
ApiEmailVariableGroupDetailResponse response = result.getData();
//分组绑定的变量列表
List<ApiEmailVariableDto> emailVariableDtoList = response.getEmailVariableDtoList();
List<String> FieldNameList = Arrays.asList("联系人", "邮箱", "抄送人");
List<String> FieldNameList = new ArrayList<>(FIXED_HEADERS);
if (!CollectionUtils.isEmpty(emailVariableDtoList)) {
FieldNameList.addAll(emailVariableDtoList.stream().map(ApiEmailVariableDto::getVariableNameCn).collect(Collectors.toList()));
}
......@@ -66,6 +85,8 @@ public class ApiEmailFileServiceImpl implements ApiEmailFileService {
return Result.success(response1);
}
/**
* 导入-变量excel
* @param file
......@@ -75,8 +96,199 @@ public class ApiEmailFileServiceImpl implements ApiEmailFileService {
@Override
public Result<ApiImportVariableExcelResponse> importVariableExcel(MultipartFile file,
ApiImportVariableExcelRequest request) {
ApiImportVariableExcelResponse response = new ApiImportVariableExcelResponse();
String sessionId = request.getSessionId();
if (StringUtils.isBlank(request.getSessionId())) {
sessionId = UUIDUtil.randomUUIDWithoutHyphen();
}
response.setSessionId(sessionId);
try {
// 远程调用Feign,通用Excel导入接口
Result<ImportResult> result = apiExcelFeignClient.importExcel(file, 0, 1, null);
ImportResult importResult = result.getData();
if (Objects.isNull(result.getData()) || (!Objects.isNull(result.getData()) && !importResult.isSuccess())) {
return Result.fail("Excel导入失败: " + (importResult.getMessage() != null ? importResult.getMessage() : "未知错误"));
}
if (!importResult.isSuccess()) {
return Result.fail("Excel解析失败: " + importResult.getMessage());
}
log.info("表头信息: {}", importResult.getHeaders());
log.info("导入数据条数: {}", importResult.getTotalCount());
// 获取变量字段(排除固定字段)
List<String> variableHeaders = getVariableHeaders(importResult.getHeaders());
//根据非固定表头字段(变量字段)中文名查询对应的英文名,返回集合
List<EmailVariable> emailVariableList = getEmailVariableList(variableHeaders);
// 处理每一行数据
List<EmailContactImport> contactImports = processImportData(importResult.getData(),
sessionId,
variableHeaders,
emailVariableList);
// 批量保存到数据库
if (!CollectionUtils.isEmpty(contactImports)) {
boolean saveResult = iEmailContactImportService.saveOrUpdateBatch(contactImports);
if (saveResult) {
response.setImportCount(contactImports.size());
log.info("成功导入 {} 条联系人数据", contactImports.size());
} else {
return Result.fail("数据保存失败");
}
} else {
response.setImportCount(0);
log.warn("Excel中未找到有效数据");
}
return Result.success(response);
} catch (Exception e) {
log.error("导入变量Excel异常", e);
return Result.fail("导入失败: " + e.getMessage());
}
}
/**
* 获取变量字段(排除固定字段)
* @param allHeaders
* @return
*/
private List<String> getVariableHeaders(List<String> allHeaders) {
List<String> variableHeaders = new ArrayList<>();
if (CollectionUtils.isEmpty(allHeaders)) {
return variableHeaders;
}
for (String header : allHeaders) {
if (!FIXED_HEADERS.contains(header)) {
variableHeaders.add(header);
}
}
return variableHeaders;
}
/**
* 根据非固定表头字段(变量字段)中文名查询对应的英文名,返回集合
* @param variableHeaders
* @return
*/
public List<EmailVariable> getEmailVariableList(List<String> variableHeaders) {
List<EmailVariable> emailVariableList = iEmailVariableService.queryList(EmailVariableDto
.builder().variableNameCnList(variableHeaders).build());
return emailVariableList;
}
/**
* 处理导入数据
* @param data
* @param sessionId
* @param variableHeaders
* @param emailVariableList
* @return
*/
private List<EmailContactImport> processImportData(List<Map<String, Object>> data,
String sessionId,
List<String> variableHeaders,
List<EmailVariable> emailVariableList) {
List<EmailContactImport> contactImports = new ArrayList<>();
if (CollectionUtils.isEmpty(data)) {
return contactImports;
}
for (Map<String, Object> row : data) {
EmailContactImport contactImport = new EmailContactImport();
// 设置固定字段
contactImport.setImportBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_EMAIL_CONTACT_IMPORT.getCode()));
contactImport.setSessionId(sessionId);
contactImport.setReceiveName(getStringValue(row, "联系人"));
contactImport.setReceiveEmail(getStringValue(row, "邮箱"));
contactImport.setCcEmail(getStringValue(row, "抄送人"));
// 处理变量数据,转换为JSON格式
String variablesJson = processVariableData(row, variableHeaders,emailVariableList);
contactImport.setVariables(variablesJson);
// 设置其他字段
//1-excel导入联系人
contactImport.setSource(1);
contactImports.add(contactImport);
}
return contactImports;
}
/**
* 处理变量数据,转换为JSON格式
* @param row
* @param variableHeaders
* @return
*/
private String processVariableData(Map<String, Object> row,
List<String> variableHeaders,
List<EmailVariable> emailVariableList) {
List<Map<String, String>> variableList = new ArrayList<>();
if (CollectionUtils.isEmpty(variableHeaders)) {
return null;
}
for (String header : variableHeaders) {
String value = getStringValue(row, header);
if (StringUtils.isNotBlank(value)) {
Map<String, String> variableMap = new HashMap<>();
// 中文变量字段名
variableMap.put("cn_key", header);
// 英文变量字段名(需要转换,根据中文名查变量表转换)
variableMap.put("en_key", convertToEnKey(header,emailVariableList));
// 占位符内容
variableMap.put("content", value);
variableList.add(variableMap);
}
}
return CollectionUtils.isEmpty(variableList) ? null : JSON.toJSONString(variableList);
}
/**
* 将中文字段名转换为英文键名(根据表返回的数据对应转换)
* @param cnKey 中文变量字段名
* @param emailVariableList 变量列表
* @return
*/
public String convertToEnKey(String cnKey, List<EmailVariable> emailVariableList) {
if (StringUtils.isBlank(cnKey) || CollectionUtils.isEmpty(emailVariableList)) {
return null;
}
return emailVariableList.stream()
.filter(dto -> StringUtils.equals(dto.getVariableNameCn(), cnKey))
.findFirst()
.map(EmailVariable::getVariableNameEn) // 假设EmailVariable类中有getVariableNameEn方法
.orElseGet(() -> {
// 如果找不到对应的英文键名,可以返回一个默认值或进行转换
log.warn("未找到中文变量名 '{}' 对应的英文键名", cnKey);
throw new BusinessException("变量表未找到中文变量名:"+cnKey+",请检查!");
});
}
/**
* 安全获取字符串值
* @param row
* @param key
* @return
*/
private String getStringValue(Map<String, Object> row, String key) {
if (row == null || !row.containsKey(key)) {
return null;
}
return null;
Object value = row.get(key);
return value != null ? value.toString().trim() : null;
}
}
......@@ -9,4 +9,9 @@ public class ApiImportVariableExcelResponse {
* 当前会话id(前端缓存有值就传,没有值后端生成返回给前端存入前端缓存)
*/
private String sessionId;
/**
* 成功导入多少条
*/
private Integer importCount;
}
......@@ -29,6 +29,11 @@ public class EmailVariableDto {
private String variableNameCn;
/**
* 变量字段名称中文名列表
*/
private List<String> variableNameCnList;
/**
* 变量字段名称英文名
*/
private String variableNameEn;
......
......@@ -55,6 +55,12 @@ public class EmailContactImport implements Serializable {
private String receiveEmail;
/**
* 收件人名称(姓名或者昵称)
*/
@TableField("receive_name")
private String receiveName;
/**
* 抄送人邮箱(多个用分号分隔)
*/
@TableField("cc_email")
......
......@@ -49,6 +49,12 @@ public class EmailTaskRecipients implements Serializable {
private String receiveEmail;
/**
* 收件人名称(姓名或者昵称)
*/
@TableField("receive_name")
private String receiveName;
/**
* 抄送人邮箱(多个用分号分隔)
*/
@TableField("cc_email")
......
......@@ -46,6 +46,7 @@ public class EmailVariableServiceImpl extends ServiceImpl<EmailVariableMapper, E
.eq(StringUtils.isNotBlank(dto.getVariableNameCn()),EmailVariable::getVariableNameCn,dto.getVariableNameCn())
.eq(StringUtils.isNotBlank(dto.getVariableNameEn()),EmailVariable::getVariableNameEn,dto.getVariableNameEn())
.in(!CollectionUtils.isEmpty(dto.getVariableBizIdList()),EmailVariable::getVariableBizId,dto.getVariableBizIdList())
.in(!CollectionUtils.isEmpty(dto.getVariableNameCnList()),EmailVariable::getVariableNameCn,dto.getVariableNameCnList())
.ne(dto.getIsExcludeMy(),EmailVariable::getVariableBizId,dto.getVariableBizId())
);
return list;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment