package com.lf.server.service.show;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.lf.server.entity.all.BaseEntity;
|
import com.lf.server.entity.ctrl.DownloadReqEntity;
|
import com.lf.server.entity.data.DownloadEntity;
|
import com.lf.server.entity.sys.AttachEntity;
|
import com.lf.server.entity.sys.UserEntity;
|
import com.lf.server.helper.*;
|
import com.lf.server.mapper.all.BasicMapper;
|
import com.lf.server.mapper.all.GeomBaseMapper;
|
import com.lf.server.mapper.data.DownloadMapper;
|
import com.lf.server.service.all.BaseQueryService;
|
import com.lf.server.service.data.DownloadService;
|
import net.lingala.zip4j.ZipFile;
|
import net.lingala.zip4j.model.ZipParameters;
|
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.LogFactory;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.io.File;
|
import java.util.*;
|
|
/**
|
* 资料馆
|
* @author WWW
|
*/
|
@Service
|
public class DataLibService {
|
@Autowired
|
PathHelper pathHelper;
|
|
@Autowired
|
DownloadMapper downloadMapper;
|
|
@Autowired
|
DownloadService downloadService;
|
|
@Autowired
|
BaseQueryService baseQueryService;
|
|
private final static Log log = LogFactory.getLog(DataLibService.class);
|
|
/**
|
* 查询DB中溢出的单位编码
|
*/
|
public List<String> selectDbOverflowDep(UserEntity ue, DownloadReqEntity dr) {
|
if (!StringHelper.isEmpty(dr.getWkt())) {
|
return selectDbOverflowDep4Wkt(ue, dr);
|
}
|
|
return selectDbOverflowDep4Prop(ue, dr);
|
}
|
|
/**
|
* 查询DB中溢出的单位编码-空间查询
|
*/
|
public List<String> selectDbOverflowDep4Wkt(UserEntity ue, DownloadReqEntity dr) {
|
List<String> rs = new ArrayList<>();
|
for (String entity : dr.getEntities()) {
|
try {
|
GeomBaseMapper<?> baseMapper = ClassHelper.getGeoBaseMapper(entity);
|
if (null == baseMapper) {
|
continue;
|
}
|
|
QueryWrapper wrapper = getWrapper4DbOverflow(ue, dr);
|
Integer srid = baseQueryService.getSrid(baseMapper);
|
if (null != srid) {
|
wrapper.apply(String.format("ST_Intersects(ST_PolygonFromText('%s', %d), geom)", dr.getWkt(), srid));
|
}
|
|
List<String> ids = baseMapper.selectObjs(wrapper);
|
addDepCodes(rs, ids);
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
}
|
|
return rs;
|
}
|
|
/**
|
* 查询DB中溢出的单位编码-属性查询
|
*/
|
public List<String> selectDbOverflowDep4Prop(UserEntity ue, DownloadReqEntity dr) {
|
List<String> rs = new ArrayList<>();
|
try {
|
BasicMapper<?> baseMapper = ClassHelper.getBasicMapper(dr.getEntities().get(0));
|
if (null == baseMapper) {
|
return rs;
|
}
|
|
QueryWrapper wrapper = getWrapper4DbOverflow(ue, dr);
|
|
List<String> ids = baseMapper.selectObjs(wrapper);
|
addDepCodes(rs, ids);
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
|
return rs;
|
}
|
|
/**
|
* 查询DB中溢出单位编码的查询包装器
|
*/
|
private <T> QueryWrapper<T> getWrapper4DbOverflow(UserEntity ue, DownloadReqEntity dr) {
|
QueryWrapper<T> wrapper = new QueryWrapper<T>();
|
wrapper.select("depid");
|
wrapper.groupBy("depid");
|
wrapper.apply("depid is not null and depid not like '" + ue.getDepcode() + "%'");
|
|
if (null != dr.getIds() && dr.getIds().size() > 0) {
|
wrapper.apply(String.format("gid in (%s)", StringHelper.join(dr.getIds(), ",")));
|
} else {
|
baseQueryService.addFilterWrapper(wrapper, dr.getFilter());
|
}
|
|
String dirs = copeCodes(dr.getDirs(), "dirid");
|
if (!StringHelper.isEmpty(dirs)) {
|
wrapper.apply(dirs);
|
}
|
if (!StringHelper.isEmpty(dr.getDepcode())) {
|
wrapper.likeRight("depid", dr.getDepcode());
|
}
|
|
return wrapper;
|
}
|
|
/**
|
* 添加单位编码
|
*/
|
private void addDepCodes(List<String> rs, List<String> ids) {
|
if (null == ids || ids.isEmpty()) {
|
return;
|
}
|
|
for (String id : ids) {
|
if (StringHelper.isEmpty(id)) {
|
continue;
|
}
|
if (!rs.contains(id)) {
|
rs.add(id);
|
}
|
}
|
}
|
|
/**
|
* 请求DB数据下载
|
*/
|
public String downloadDbReq(UserEntity ue, DownloadReqEntity dr) {
|
Map<String, List<?>> dataMap = new HashMap<>(2);
|
Map<String, List<AttachEntity>> annexMap = new HashMap<>(2);
|
|
queryData(dr, dataMap, annexMap);
|
if (dataMap.size() == 0) {
|
return null;
|
}
|
|
return null;
|
}
|
|
/**
|
* 查询数据+附件
|
*/
|
private void queryData(DownloadReqEntity dr, Map<String, List<?>> dataMap, Map<String, List<AttachEntity>> annexMap) {
|
for (String enity : dr.getEntities()) {
|
try {
|
BasicMapper baseMapper = ClassHelper.getBasicMapper(enity);
|
if (null == baseMapper) {
|
continue;
|
}
|
|
QueryWrapper wrapper = createQueryWrapper(baseMapper, dr);
|
List list = baseMapper.selectList(wrapper);
|
if (null == list || list.size() == 0) {
|
continue;
|
}
|
|
String tab = BaseQueryService.getTabName(baseMapper);
|
if (!dataMap.containsKey(enity)) {
|
dataMap.put(enity, list);
|
} else {
|
dataMap.get(enity).addAll(list);
|
}
|
if ("bborehole".equals(enity)){
|
continue;
|
}
|
if (wrapper.isEmptyOfWhere()) {
|
wrapper.apply("1 = 1");
|
}
|
|
List<AttachEntity> annex = baseMapper.selectAnnex(tab, wrapper);
|
if (null == annex || annex.isEmpty()) {
|
continue;
|
}
|
|
if (!annexMap.containsKey(enity)) {
|
annexMap.put(enity, annex);
|
} else {
|
annexMap.get(enity).addAll(annex);
|
}
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
}
|
}
|
|
/**
|
* 创建查询包装器
|
*/
|
private <T> QueryWrapper<T> createQueryWrapper(BasicMapper baseMapper, DownloadReqEntity dr) {
|
QueryWrapper<T> wrapper = new QueryWrapper<T>();
|
|
String dirs = copeCodes(dr.getDirs(), "dirid");
|
if (!StringHelper.isEmpty(dirs)) {
|
wrapper.apply(dirs);
|
}
|
if (!StringHelper.isEmpty(dr.getDepcode())) {
|
// wrapper.apply(String.format("depid like '%s'", StringHelper.getRightLike(dr.getDepcode())))
|
wrapper.likeRight("depid", dr.getDepcode());
|
}
|
if (baseMapper instanceof GeomBaseMapper && !StringHelper.isEmpty(dr.getWkt())) {
|
wrapper.select("ST_AsText(geom) as geom, *");
|
Integer srid = baseQueryService.getSrid((GeomBaseMapper) baseMapper);
|
if (null != srid) {
|
wrapper.apply(String.format("ST_Intersects(ST_PolygonFromText('%s', %d), geom)", dr.getWkt(), srid));
|
}
|
}
|
if (null != dr.getIds() && dr.getIds().size() > 0) {
|
wrapper.apply(String.format("gid in (%s)", StringHelper.join(dr.getIds(), ",")));
|
} else {
|
baseQueryService.addFilterWrapper(wrapper, dr.getFilter());
|
}
|
|
return wrapper;
|
}
|
|
/**
|
* 请求DB数据下载-空间查询
|
*/
|
public String downloadDbReq4Wkt(UserEntity ue, DownloadReqEntity dr) throws Exception {
|
String depcode = null == dr.getDepcodes() || dr.getDepcodes().isEmpty() ? null : dr.getDepcodes().get(0);
|
Map<String, List<?>> map = queryData(dr.getEntities(), depcode, dr.getDirs(), dr.getWkt());
|
if (map.size() == 0) {
|
return null;
|
}
|
|
String tempName = StringHelper.YMDHMS2_FORMAT.format(new Date());
|
String tempPath = pathHelper.getTempPath(tempName);
|
// String filePath = "D:\\LF\\temp\\20221219202706\\2022.gdb"
|
String filePath = tempPath + File.separator + tempName + ".gdb";
|
|
File file = new File(filePath);
|
if (file.exists() && file.isDirectory()) {
|
FileHelper.deleteDir(filePath);
|
}
|
GdbHelper.createGdb(filePath, map);
|
|
String zipName = tempName + ".gdb.zip";
|
String zipFile = pathHelper.getDownloadFullPath() + File.separator + zipName;
|
|
ZipFile zip = Zip4jHelper.createZipFile(zipFile, dr.getPwd());
|
ZipParameters params = Zip4jHelper.getZipParams(true);
|
addZipFiles(zip, params, file.listFiles());
|
|
String dbPwd = Md5Helper.reverse(Md5Helper.generate(dr.getPwd()));
|
DownloadEntity downloadEntity = getDownloadEntity(ue, zipFile, dbPwd);
|
int rows = downloadMapper.insert(downloadEntity);
|
|
return rows > 0 ? downloadEntity.getGuid() : null;
|
}
|
|
/**
|
* 查询数据
|
*/
|
private Map<String, List<?>> queryData(List<String> entities, String depcode, String dirs, String wkt) {
|
Map<String, List<?>> map = new HashMap<>(5);
|
for (String enity : entities) {
|
try {
|
GeomBaseMapper<?> baseMapper = ClassHelper.getGeoBaseMapper(enity);
|
if (null == baseMapper) {
|
continue;
|
}
|
|
QueryWrapper wrapper = createWrapper(baseMapper, depcode, dirs, wkt);
|
List<?> list = baseMapper.selectList(wrapper);
|
if (null == list || list.size() == 0) {
|
continue;
|
}
|
|
if (!map.containsKey(enity)) {
|
map.put(enity, list);
|
}
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
}
|
|
return map;
|
}
|
|
/**
|
* 创建QueryWrapper
|
*/
|
private QueryWrapper createWrapper(BasicMapper baseMapper, String depcode, String dirs, String wkt) {
|
QueryWrapper wrapper = new QueryWrapper();
|
if (baseMapper instanceof GeomBaseMapper) {
|
wrapper.select("ST_AsText(geom) as geom, *");
|
|
Integer srid = baseQueryService.getSrid((GeomBaseMapper) baseMapper);
|
if (null != srid) {
|
wrapper.apply(String.format("ST_Intersects(ST_PolygonFromText('%s', %d), geom)", wkt, srid));
|
}
|
}
|
if (!StringHelper.isEmpty(depcode)) {
|
wrapper.likeRight("depid", depcode);
|
}
|
|
dirs = DataLibService.copeCodes(dirs, "dirid");
|
if (!StringHelper.isEmpty(dirs)) {
|
wrapper.apply(dirs);
|
}
|
|
return wrapper;
|
}
|
|
/**
|
* 获取下载实体类
|
*/
|
private DownloadEntity getDownloadEntity(UserEntity ue, String file, String pwd) {
|
DownloadEntity de = new DownloadEntity();
|
de.setName(FileHelper.getFileName(file));
|
// 1-Shp文件,2-专题图,3-元数据,4-业务数据,5-管道分析,6-统计报告
|
de.setType(4);
|
de.setSizes(FileHelper.sizeToMb(new File(file).length()));
|
de.setDepid(ue.getDepid());
|
de.setDcount(0);
|
de.setPwd(pwd);
|
de.setUrl(FileHelper.getRelativePath(file));
|
de.setDescr("业务数据文件");
|
de.setGuid(FileHelper.getFileMd5(file));
|
de.setCreateUser(ue.getId());
|
// de.setGeom(null)
|
|
return de;
|
}
|
|
/**
|
* 请求DB数据下载-属性查询
|
*/
|
public String downloadDbReq4Prop(UserEntity ue, DownloadReqEntity dr) throws Exception {
|
String dirs = dr.getDirs();
|
String entity = dr.getEntities().get(0);
|
String depcode = null == dr.getDepcodes() || dr.getDepcodes().isEmpty() ? null : dr.getDepcodes().get(0);
|
|
BasicMapper baseMapper = ClassHelper.getBasicMapper(entity);
|
if (baseMapper == null) {
|
return null;
|
}
|
|
QueryWrapper wrapper = new QueryWrapper();
|
baseQueryService.addFilterWrapper(wrapper, dr.getFilter());
|
if (baseMapper instanceof GeomBaseMapper) {
|
wrapper.select("ST_AsText(geom) as geom, *");
|
}
|
if (!StringHelper.isEmpty(depcode)) {
|
wrapper.likeRight("depid", depcode);
|
}
|
|
dirs = DataLibService.copeCodes(dirs, "dirid");
|
if (!StringHelper.isEmpty(dirs)) {
|
wrapper.apply(dirs);
|
}
|
|
List<?> list = baseMapper.selectList(wrapper);
|
if (null == list || 0 == list.size()) {
|
return null;
|
}
|
|
String tab = BaseQueryService.getTabName(baseMapper);
|
String ids = getAnnexFilter(StringHelper.isEmpty(depcode) && StringHelper.isEmpty(dirs) && StringHelper.isEmpty(dr.getFilter()), list);
|
List<AttachEntity> annex = baseQueryService.selectAnnexByTab(tab, ids);
|
|
Map<String, List<?>> map = new HashMap<>(1);
|
map.put(entity, list);
|
|
return zipData(ue, map, annex, dr.getPwd());
|
}
|
|
/**
|
* 打包数据
|
*/
|
private String zipData(UserEntity ue, Map<String, List<?>> map, List<AttachEntity> annex, String pwd) throws Exception {
|
String tempName = StringHelper.YMDHMS2_FORMAT.format(new Date());
|
String tempPath = pathHelper.getTempPath(tempName);
|
String gdbPath = tempPath + File.separator + tempName + ".gdb";
|
String annexPath = tempPath + File.separator + "annex";
|
|
File file = new File(gdbPath);
|
if (file.exists() && file.isDirectory()) {
|
FileHelper.deleteDir(gdbPath);
|
}
|
file = new File(annexPath);
|
if (!file.exists() || !file.isDirectory()) {
|
file.mkdirs();
|
}
|
|
GdbHelper.createGdb(gdbPath, map);
|
createAnnex(annexPath, annex);
|
|
String zipName = tempName + ".gdb.zip";
|
String zipFile = pathHelper.getDownloadFullPath() + File.separator + zipName;
|
|
ZipFile zip = Zip4jHelper.createZipFile(zipFile, pwd);
|
ZipParameters params = Zip4jHelper.getZipParams(true);
|
// addZipFiles(zip, params, file.listFiles())
|
zip.addFolder(new File(gdbPath), params);
|
zip.addFolder(new File(annexPath), params);
|
|
String dbPwd = Md5Helper.reverse(Md5Helper.generate(pwd));
|
DownloadEntity downloadEntity = getDownloadEntity(ue, zipFile, dbPwd);
|
int rows = downloadMapper.insert(downloadEntity);
|
|
return rows > 0 ? downloadEntity.getGuid() : null;
|
}
|
|
/**
|
* 处理编码
|
*/
|
public static String copeCodes(String codes, String field) {
|
if (StringHelper.isEmpty(codes) || StringHelper.isSqlInjection(codes)) {
|
return null;
|
}
|
|
List<String> list = codesAsList(codes);
|
removeDuplicate(list);
|
setRightLike(list, field);
|
|
return "(" + StringHelper.join(list, " or ") + ")";
|
}
|
|
/**
|
* 单位编码转集合
|
*/
|
private static List<String> codesAsList(String codes) {
|
List<String> list = Arrays.asList(codes.split(","));
|
Set set = new HashSet(list);
|
|
List<String> newList = new ArrayList<>(set);
|
Collections.sort(newList);
|
|
return newList;
|
}
|
|
/**
|
* 去除重复
|
*/
|
private static void removeDuplicate(List<String> list) {
|
int i = 0;
|
while (i < list.size()) {
|
int j = findStr(list, i);
|
if (j > -1) {
|
list.remove(j);
|
continue;
|
}
|
|
i++;
|
}
|
}
|
|
/**
|
* 查找字符串
|
*/
|
private static int findStr(List<String> list, int i) {
|
String source = list.get(i);
|
for (int j = i + 1, c = list.size(); j < c; j++) {
|
if (list.get(j).startsWith(source)) {
|
return j;
|
}
|
}
|
|
return -1;
|
}
|
|
/**
|
* 设置 右like
|
*/
|
private static void setRightLike(List<String> list, String field) {
|
for (int i = 0, c = list.size(); i < c; i++) {
|
String str = String.format("%s like '%s%%'", field, list.get(i));
|
list.set(i, str);
|
}
|
}
|
|
/**
|
* 添加Zip文件
|
*/
|
private void addZipFiles(ZipFile zip, ZipParameters params, File[] files) {
|
if (null == files || files.length == 0) {
|
return;
|
}
|
|
for (File f : files) {
|
try {
|
zip.addFile(f, params);
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
}
|
}
|
|
/**
|
* 获取查询附件条件
|
*/
|
private String getAnnexFilter(boolean flag, List<?> list) {
|
if (flag) {
|
return null;
|
}
|
|
List<Integer> gids = new ArrayList<>();
|
for (Object obj : list) {
|
BaseEntity be = (BaseEntity) obj;
|
gids.add(be.getGid());
|
}
|
|
return StringHelper.join(gids, ",");
|
}
|
|
/**
|
* 添加附件文件
|
*/
|
private void createAnnex(String targetPath, List<AttachEntity> list) {
|
if (null == list || list.isEmpty()) {
|
return;
|
}
|
|
int i = 1;
|
String uploadPath = pathHelper.getConfig().getUploadPath();
|
for (AttachEntity attach : list) {
|
try {
|
File srcFile = new File(uploadPath + File.separator + attach.getPath());
|
if (!srcFile.exists() || srcFile.isDirectory()) {
|
continue;
|
}
|
|
File destFile = new File(targetPath + File.separator + i++ + "_" + attach.getName());
|
FileHelper.copyFile(srcFile, destFile);
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
}
|
}
|
}
|
}
|