data-dump/src/main/java/com/celnet/datadump/service/impl/FileManagerServiceImpl.java
2025-06-25 11:22:45 +08:00

394 lines
19 KiB
Java

package com.celnet.datadump.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.celnet.datadump.config.SalesforceExecutor;
import com.celnet.datadump.global.Const;
import com.celnet.datadump.mapper.CustomMapper;
import com.celnet.datadump.param.DataDumpParam;
import com.celnet.datadump.service.FileManagerService;
import com.celnet.datadump.util.EmailUtil;
import com.celnet.datadump.util.HttpUtil;
import com.celnet.datadump.vo.FileManageVo;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Response;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPatch;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.ibatis.util.MapUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
@Service
@Slf4j
public class FileManagerServiceImpl implements FileManagerService {
@Autowired
private CustomMapper customMapper;
@Autowired
private SalesforceExecutor salesforceExecutor;
@Override
public Page<FileManageVo> getDocFileList(Integer isDump, Integer isUpload, String Name, Integer page, Integer pageSize) {
String sql = "";
if (isDump != null) {
sql += " and is_dump = " + isDump;
}
if (isUpload != null) {
sql += " and is_upload = " + isUpload;
}
if (Name != null) {
sql += " and Title like '%" + Name + "%'";
}
sql += " order by CreatedDate desc";
if (page != null && pageSize != null) {
sql += " limit " + (page - 1) * pageSize + "," + pageSize;
}
List<Map<String, Object>> list = customMapper.list("Id,CreatedDate,LastModifiedDate,Title,is_upload,is_dump,new_id,url","ContentVersion","IsLatest = 1" + sql);
List<FileManageVo> fileManageVos = new ArrayList<>();
for (Map<String, Object> map : list) {
FileManageVo fileManageVo = new FileManageVo();
fileManageVo.setId(map.get("Id").toString());
fileManageVo.setNewId(map.get("new_id").toString());
fileManageVo.setFileName(map.get("Title").toString());
fileManageVo.setUrl(map.get("url").toString());
fileManageVo.setIsUpload(Boolean.valueOf(map.get("is_upload").toString()) == true ? 1 : 0);
fileManageVo.setIsDump(Boolean.valueOf(map.get("is_dump").toString()) == true ? 1 : 0);
fileManageVos.add(fileManageVo);
}
Page<FileManageVo> fileManageVoPage = new Page<>();
fileManageVoPage.setRecords(fileManageVos);
fileManageVoPage.setTotal(fileManageVos.size());
fileManageVoPage.setCurrent(page);
fileManageVoPage.setSize(pageSize);
return fileManageVoPage;
}
@Override
public Page<FileManageVo> getAttachmentFileList(Integer isDump, Integer isUpload, String Name, Integer page, Integer pageSize) {
String sql = "";
if (isDump != null) {
sql += " and is_dump = " + isDump;
}
if (isUpload != null) {
sql += " and is_upload = " + isUpload;
}
if (Name != null) {
sql += " and Name like '%" + Name + "%'";
}
sql += " order by CreatedDate desc";
if (page != null && pageSize != null) {
sql += " limit " + (page - 1) * pageSize + "," + pageSize;
}
List<Map<String, Object>> list = customMapper.list("Id,CreatedDate,LastModifiedDate,`Name`,is_upload,is_dump,new_id,url","Attachment",sql);
List<FileManageVo> fileManageVos = new ArrayList<>();
for (Map<String, Object> map : list) {
FileManageVo fileManageVo = new FileManageVo();
fileManageVo.setId(map.get("Id").toString());
fileManageVo.setNewId(map.get("new_id").toString());
fileManageVo.setFileName(map.get("Name").toString());
fileManageVo.setUrl(map.get("url").toString());
fileManageVo.setIsUpload(Boolean.valueOf(map.get("is_upload").toString()) == true ? 1 : 0);
fileManageVo.setIsDump(Boolean.valueOf(map.get("is_dump").toString()) == true ? 1 : 0);
fileManageVos.add(fileManageVo);
}
Page<FileManageVo> fileManageVoPage = new Page<>();
fileManageVoPage.setRecords(fileManageVos);
fileManageVoPage.setTotal(fileManageVos.size());
fileManageVoPage.setCurrent(page);
fileManageVoPage.setSize(pageSize);
return fileManageVoPage;
}
@Override
public Object dumpImg(String token) {
List<Map<String, Object>> list = customMapper.list("Id,record_id,object_api,file_name,field_id,field_api","object_rich_text","is_dump = 0");
if (list.size() <= 0) {
return "没有需要转储的图片";
}
List<Future<?>> futures = Lists.newArrayList();
try {
for (Map<String, Object> map : list) {
Future<?> future = salesforceExecutor.execute(() -> {
List<Map<String, Object>> maps = Lists.newArrayList();
String id = map.get("Id").toString();
String recordId = map.get("record_id").toString();
String objectApi = map.get("object_api").toString();
String fileName = map.get("file_name").toString();
String fieldId = map.get("field_id").toString();
String fieldApi = map.get("field_api").toString();
Map<String, Object> objectMap = customMapper.getById("Id", objectApi, recordId);
if (objectMap.isEmpty()) {
throw new RuntimeException("找不到对应主数据");
}
// 检测路径是否存在 不存在则创建
File excel = new File(Const.SERVER_FILE_PATH + "/" + "richText");
if (!excel.exists()) {
boolean mkdir = excel.mkdir();
}
String filePath = "richText" + "/" + System.currentTimeMillis() + "_" + fileName;
Map<String, String> headers = Maps.newHashMap();
headers.put("Authorization", "Bearer " + token);
headers.put("connection", "keep-alive");
String downloadUrl = null;
List<Map<String, Object>> poll = customMapper.list("code,value","org_config",null);
for (Map<String, Object> map1 : poll) {
if ("FILE_DOWNLOAD_URL".equals(map1.get("code"))) {
downloadUrl = (String) map1.get("value");
}
}
if (StringUtils.isBlank(downloadUrl)) {
EmailUtil.send("DumpFile ERROR", "文件下载失败!下载地址未配置");
return;
}
String url = downloadUrl + String.format(Const.SF_RICH_TEXT_FILE_URL, objectApi, recordId, fieldApi, fieldId);
try {
Response response = HttpUtil.doGet(url, null, headers);
if (response.body() != null && response.code() == 200) {
InputStream inputStream = response.body().byteStream();
String path = Const.SERVER_FILE_PATH + "/" + filePath;
long offset = 0L;
RandomAccessFile accessFile = new RandomAccessFile(path, "rw");
while (true) {
try {
// 保存到本地
byte[] buf = new byte[8192];
int len = 0;
if (offset > 0) {
inputStream.skip(offset);
accessFile.seek(offset);
}
while ((len = inputStream.read(buf)) != -1) {
accessFile.write(buf, 0, len);
offset += len;
}
break;
} catch (Exception e) {
if (offset <= 0) {
throw e;
}
log.warn("file dump to server EOF ERROR try to reconnect");
response.close();
response = HttpUtil.doGet(url, null, headers);
assert response.body() != null;
inputStream = response.body().byteStream();
log.warn("reconnect success, id:{} skip {}", recordId, offset);
}
}
accessFile.close();
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("key", "file_url");
paramMap.put("value", filePath);
maps.add(paramMap);
}
} catch (Exception e) {
log.error("exception message", e);
}
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("key", "is_dump");
paramMap.put("value", 1);
maps.add(paramMap);
customMapper.updateById("object_rich_text", maps, id);
}, 0, 0);
futures.add(future);
// 单线程
salesforceExecutor.waitForFutures(futures.toArray(new Future<?>[]{}));
}
} catch (Throwable throwable) {
log.error("dump file error", throwable);
salesforceExecutor.remove(futures.toArray(new Future<?>[]{}));
}
return null;
}
@Override
public Object uploadImg(String token) {
List<Map<String, Object>> fieldList = customMapper.list("record_id,field_api","object_rich_text","is_upload = 0 and is_dump = 1 GROUP BY record_id,field_api");
if (fieldList.size() <= 0) {
return "没有需要上传的图片";
}
List<Future<?>> futures = Lists.newArrayList();
try {
// 检测路径是否存在
File excel = new File(Const.SERVER_FILE_PATH + "/" + "richText");
if (!excel.exists()) {
throw new RuntimeException("找不到文件路径");
}
for (Map<String, Object> fieldMap : fieldList) {
Future<?> future = salesforceExecutor.execute(() -> {
List<Map<String, Object>> list = customMapper.list("Id,record_id,object_api,file_name,field_id,field_api,file_url", "object_rich_text",
"is_upload = 0 and is_dump = 1 and record_id = '" + fieldMap.get("record_id") + "'and field_api = '" + fieldMap.get("field_api") + "'");
StringBuffer imageBase64 = new StringBuffer();
List<String> ids = new ArrayList<>();
CloseableHttpResponse response = null;
String recordId = "";
String objectApi = "";
String fieldApi = "";
for (Map<String, Object> map : list) {
String id = map.get("Id").toString();
recordId = map.get("record_id").toString();
objectApi = map.get("object_api").toString();
fieldApi = map.get("field_api").toString();
String fileName = map.get("file_name").toString();
String fileUrl = map.get("file_url").toString();
Map<String, Object> objectMap = customMapper.getById("new_id", objectApi, recordId);
recordId = objectMap.get("new_id").toString();
if (StringUtils.isNotBlank(fileUrl)) {
String filePath = Const.SERVER_FILE_PATH + "/" + fileUrl;
File file = new File(filePath);
boolean exists = file.exists();
if (!exists) {
log.info("文件不存在");
break;
}
log.info("开始组装参数");
String heard = "<p><img src=\"data:image/png;base64,";
String end = "\" alt=\"" + fileName + "\"></img></p>";
try {
byte[] bytes = FileUtils.readFileToByteArray(file);
// 得到文件 之后转成beye 然后使用base64转码
String encode = Base64.encodeBase64String(bytes);// 转码
StringBuffer richText = new StringBuffer();
richText.append(heard);
richText.append(encode);
richText.append(end);
imageBase64 = imageBase64.append(richText);
} catch (Exception e) {
log.error("文件转换base64失败", e);
EmailUtil.send("富文本上传异常", id, "文件转换base64失败");
throw new RuntimeException("文件转换base64失败");
}
}
ids.add(id);
}
String uploadUrl = null;
List<Map<String, Object>> poll = customMapper.list("code,value","org_config",null);
for (Map<String, Object> map1 : poll) {
if ("FILE_UPLOAD_URL".equals(map1.get("code"))) {
uploadUrl = (String) map1.get("value");
}
}
if (StringUtils.isBlank(uploadUrl)) {
EmailUtil.send("UploadFile ERROR", "文件上传失败!上传地址未配置");
return;
}
// 拼接url
String url = uploadUrl + String.format(Const.SF_UPLOAD_RICH_TEXT_FILE_URL, objectApi, recordId);
HttpPatch httpPatch = new HttpPatch(url);
httpPatch.setHeader("Authorization", "Bearer " + token);
httpPatch.setHeader("connection", "keep-alive");
httpPatch.setHeader("Content-Type", "application/json;charset=UTF-8");
JSONObject credentialsJsonParam = new JSONObject();
credentialsJsonParam.put(fieldApi, imageBase64);
StringEntity entity = new StringEntity(credentialsJsonParam.toString(), "UTF-8");
httpPatch.setEntity(entity);
CloseableHttpClient httpClient = HttpClients.createDefault();
try {
response = httpClient.execute(httpPatch);
log.info("上传图片返回状态码:{}", response.getStatusLine().getStatusCode());
if (response.getStatusLine().getStatusCode() != 204){
return;
}
} catch (Exception e) {
log.error("获取文件失败", e);
} finally {
if (response != null) {
try {
response.close();
} catch (IOException e) {
log.error("exception message", e);
throw new RuntimeException("文件转换base64失败");
}
}
}
for (String id : ids) {
List<Map<String, Object>> maps = Lists.newArrayList();
Map<String, Object> paramMap = Maps.newHashMap();
paramMap.put("key", "is_upload");
paramMap.put("value", 1);
maps.add(paramMap);
customMapper.updateById("object_rich_text", maps, id);
}
}, 0, 0);
futures.add(future);
}
} catch (Exception e) {
log.error("上传图片失败", e);
EmailUtil.send("上传图片失败", e.getMessage());
salesforceExecutor.remove(futures.toArray(new Future<?>[]{}));
return "上传图片失败";
}
return null;
}
// Object upload(String id, String img, String token) throws IOException {
// String uploadUrl = "";
// String api = "";
// String url = uploadUrl + String.format(Const.SF_UPLOAD_FILE_URL, api);
// String frontIDCard = ""+img;
// JSONObject credentialsJsonParam = new JSONObject();
// credentialsJsonParam.put("FrontIDCard__c", frontIDCard);
//
// HttpPatch httpPatch = new HttpPatch(url);
// httpPatch.setHeader("Authorization", "Bearer " + token);
// httpPatch.setHeader("Content-type", "application/json");
// httpPatch.setHeader("connection", "keep-alive");
//
// StringEntity entity = new StringEntity(credentialsJsonParam.toString(), "UTF-8");
// httpPatch.setEntity(entity);
// CloseableHttpClient httpClient = HttpClients.createDefault();
// CloseableHttpResponse response = httpClient.execute(httpPatch);
// Integer statusCode = response.getStatusLine().getStatusCode();
// httpClient.close();
// return statusCode;
// }
}