| @@ -14,6 +14,8 @@ import com.ruoyi.common.enums.BusinessType; | |||||
| import com.ruoyi.common.utils.pdf.PdfUtils; | import com.ruoyi.common.utils.pdf.PdfUtils; | ||||
| import com.ruoyi.common.utils.poi.ExcelUtil; | import com.ruoyi.common.utils.poi.ExcelUtil; | ||||
| import com.ruoyi.common.utils.translation.TranslateUtils; | import com.ruoyi.common.utils.translation.TranslateUtils; | ||||
| import com.ruoyi.geo.service.GeoExportHandlerService; | |||||
| import com.ruoyi.geo.service.GeoImportHandlerService; | |||||
| import com.ruoyi.system.service.ISysDeptService; | import com.ruoyi.system.service.ISysDeptService; | ||||
| import org.apache.commons.compress.utils.Lists; | import org.apache.commons.compress.utils.Lists; | ||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||
| @@ -38,7 +40,9 @@ public class TTaskExportController extends BaseController | |||||
| private ITTaskExportService tTaskExportService; | private ITTaskExportService tTaskExportService; | ||||
| @Autowired | @Autowired | ||||
| private ISysDeptService deptService; | |||||
| private ISysDeptService deptService; | |||||
| @Autowired | |||||
| private GeoExportHandlerService exportHandlerService; | |||||
| /** | /** | ||||
| * 查询导出任务列表 | * 查询导出任务列表 | ||||
| @@ -198,4 +202,47 @@ public class TTaskExportController extends BaseController | |||||
| PdfUtils.initPdf(response, pdf); | PdfUtils.initPdf(response, pdf); | ||||
| } | } | ||||
| /** | |||||
| * 开始导出任务 | |||||
| */ | |||||
| @PreAuthorize("@ss.hasPermi('business:export:do')") | |||||
| @Log(title = "开始导入任务", businessType = BusinessType.UPDATE) | |||||
| @PostMapping("/start/{taskId}") | |||||
| public AjaxResult start(@PathVariable Long taskId) | |||||
| { | |||||
| return AjaxResult.success(exportHandlerService.startTask(taskId)); | |||||
| } | |||||
| /** | |||||
| * 获取导出任务日志 | |||||
| */ | |||||
| @PreAuthorize("@ss.hasPermi('business:export:do')") | |||||
| @GetMapping("/log/{taskId}") | |||||
| public AjaxResult log(@PathVariable Long taskId, Integer offset) | |||||
| { | |||||
| if(null == offset) | |||||
| offset = 0; | |||||
| return AjaxResult.success(exportHandlerService.loadExportLog(taskId, offset)); | |||||
| } | |||||
| /** | |||||
| * 下载导出任务日志 | |||||
| */ | |||||
| @PreAuthorize("@ss.hasPermi('business:export:do')") | |||||
| @GetMapping("/downloadLog/{taskId}") | |||||
| public void downloadLog(@PathVariable Long taskId, HttpServletResponse response) | |||||
| { | |||||
| exportHandlerService.downloadLog(taskId, response); | |||||
| } | |||||
| /** | |||||
| * 下载导出任务文件 | |||||
| */ | |||||
| @PreAuthorize("@ss.hasPermi('business:export:down')") | |||||
| @GetMapping("/downloadFile/{taskId}") | |||||
| public void downloadFile(@PathVariable Long taskId, HttpServletResponse response) | |||||
| { | |||||
| exportHandlerService.downloadFile(taskId, response); | |||||
| } | |||||
| } | } | ||||
| @@ -214,7 +214,7 @@ public class TTaskImportController extends BaseController | |||||
| @PostMapping("/start/{taskId}") | @PostMapping("/start/{taskId}") | ||||
| public AjaxResult start(@PathVariable Long taskId) | public AjaxResult start(@PathVariable Long taskId) | ||||
| { | { | ||||
| return AjaxResult.success(importHandlerService.StartTask(taskId)); | |||||
| return AjaxResult.success(importHandlerService.startTask(taskId)); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -226,7 +226,7 @@ public class TTaskImportController extends BaseController | |||||
| { | { | ||||
| if(null == offset) | if(null == offset) | ||||
| offset = 0; | offset = 0; | ||||
| return AjaxResult.success(importHandlerService.GetImportLog(taskId, offset)); | |||||
| return AjaxResult.success(importHandlerService.loadImportLog(taskId, offset)); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -236,6 +236,6 @@ public class TTaskImportController extends BaseController | |||||
| @GetMapping("/downloadLog/{taskId}") | @GetMapping("/downloadLog/{taskId}") | ||||
| public void downloadLog(@PathVariable Long taskId, HttpServletResponse response) | public void downloadLog(@PathVariable Long taskId, HttpServletResponse response) | ||||
| { | { | ||||
| importHandlerService.DownloadLog(taskId, response); | |||||
| importHandlerService.downloadLog(taskId, response); | |||||
| } | } | ||||
| } | } | ||||
| @@ -135,6 +135,12 @@ xss: | |||||
| urlPatterns: /system/*,/monitor/*,/tool/* | urlPatterns: /system/*,/monitor/*,/tool/* | ||||
| importTask: | importTask: | ||||
| # 是否启动时执行等待中的任务 | |||||
| startOnBoot: false | |||||
| # 下次建议读取日志的间隔(毫秒) | |||||
| logNextPoll: 2000 | |||||
| exportTask: | |||||
| # 是否启动时执行等待中的任务 | # 是否启动时执行等待中的任务 | ||||
| startOnBoot: false | startOnBoot: false | ||||
| # 下次建议读取日志的间隔(毫秒) | # 下次建议读取日志的间隔(毫秒) | ||||
| @@ -1,15 +1,21 @@ | |||||
| import cn.hutool.core.io.FileUtil; | |||||
| import cn.hutool.core.thread.ThreadUtil; | import cn.hutool.core.thread.ThreadUtil; | ||||
| import com.alibaba.fastjson2.JSON; | import com.alibaba.fastjson2.JSON; | ||||
| import com.ruoyi.RuoYiApplication; | import com.ruoyi.RuoYiApplication; | ||||
| import com.ruoyi.common.geo.GeoParser; | import com.ruoyi.common.geo.GeoParser; | ||||
| import com.ruoyi.common.geo.GeoWriter; | |||||
| import com.ruoyi.geo.service.GeoExportHandlerService; | |||||
| import com.ruoyi.geo.service.GeoImportHandlerService; | import com.ruoyi.geo.service.GeoImportHandlerService; | ||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||
| import org.junit.jupiter.api.extension.ExtendWith; | import org.junit.jupiter.api.extension.ExtendWith; | ||||
| import org.locationtech.jts.geom.MultiPolygon; | |||||
| import org.springframework.boot.test.context.SpringBootTest; | import org.springframework.boot.test.context.SpringBootTest; | ||||
| import org.springframework.test.context.junit.jupiter.SpringExtension; | import org.springframework.test.context.junit.jupiter.SpringExtension; | ||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||
| import java.math.BigDecimal; | |||||
| import java.util.LinkedHashMap; | |||||
| import java.util.List; | import java.util.List; | ||||
| import java.util.Map; | import java.util.Map; | ||||
| @@ -19,13 +25,16 @@ import java.util.Map; | |||||
| public final class GeoTest | public final class GeoTest | ||||
| { | { | ||||
| @Resource | @Resource | ||||
| private GeoImportHandlerService service; | |||||
| private GeoImportHandlerService importer; | |||||
| @Resource | |||||
| private GeoExportHandlerService exporter; | |||||
| @Test | @Test | ||||
| public void test() | public void test() | ||||
| { | { | ||||
| service.StartTask(4L); | |||||
| //service.startTask(4L); | |||||
| //new Scanner(System.in).next(); | //new Scanner(System.in).next(); | ||||
| exporter.startTask(3L); | |||||
| ThreadUtil.sleep(5000); | ThreadUtil.sleep(5000); | ||||
| } | } | ||||
| @@ -36,18 +45,39 @@ public final class GeoTest | |||||
| PATH = "D:/m/胜利村_shp_3857/dk.shp"; // dk | PATH = "D:/m/胜利村_shp_3857/dk.shp"; // dk | ||||
| PATH = "D:/m/胜利村_shp_3857/zyhycg.shp"; // zyhycg | PATH = "D:/m/胜利村_shp_3857/zyhycg.shp"; // zyhycg | ||||
| PATH = "D:/m/胜利村_shp_3857/jtzy.shp"; // jtzy | PATH = "D:/m/胜利村_shp_3857/jtzy.shp"; // jtzy | ||||
| try(GeoParser geo = new GeoParser()) | |||||
| String OUT; | |||||
| OUT = "D:/m/output_胜利村_shp_3857/jtzyxx.shp"; | |||||
| FileUtil.mkParentDirs(OUT); | |||||
| try(GeoParser parser = new GeoParser()) | |||||
| { | { | ||||
| geo.Open(PATH, "UTF-8"); | |||||
| System.err.println(geo.GetTypeNames()); | |||||
| geo.SetSource(0); | |||||
| List<Map<String, Object>> cjqies = geo.GetMapList(); | |||||
| //List<GeoCJQY> cjqies = geo.GetList(GeoCJQY.class); | |||||
| //List<GeoJTZY> cjqies = geo.GetList(GeoJTZY.class); | |||||
| //List<GeoZYHYCG> cjqies = geo.GetList(GeoZYHYCG.class); | |||||
| //List<GeoDK> cjqies = geo.GetList(GeoDK.class); | |||||
| System.err.println(JSON.toJSONString(cjqies)); | |||||
| parser.Open(PATH, "UTF-8"); | |||||
| System.out.println(parser.GetTypeNames()); | |||||
| parser.SetSource(0); | |||||
| List<Map<String, Object>> cjqies = parser.GetMapList(); | |||||
| //List<GeoCJQY> cjqies = parser.GetList(GeoCJQY.class); | |||||
| //List<GeoJTZY> cjqies = parser.GetList(GeoJTZY.class); | |||||
| //List<GeoZYHYCG> cjqies = parser.GetList(GeoZYHYCG.class); | |||||
| //List<GeoDK> cjqies = parser.GetList(GeoDK.class); | |||||
| System.out.println(JSON.toJSONString(cjqies)); | |||||
| System.out.println("-------------------------"); | |||||
| try(GeoWriter writer = new GeoWriter()) | |||||
| { | |||||
| writer.Open(OUT, "UTF-8"); | |||||
| Map<String, Class<?>> classes = new LinkedHashMap<>(); | |||||
| classes.put("QSDWDM", String.class); | |||||
| classes.put("QSDWMC", String.class); | |||||
| classes.put("Shape_Area", BigDecimal.class); | |||||
| classes.put("the_geom", MultiPolygon.class); | |||||
| writer.AddSchema("test123", classes); | |||||
| System.out.println(writer.GetTypeNames()); | |||||
| writer.SetSource(0, false); | |||||
| writer.WriteMapList(cjqies); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -2,6 +2,7 @@ package com.ruoyi.business.mapper; | |||||
| import java.util.List; | import java.util.List; | ||||
| import com.ruoyi.business.domain.TTaskExport; | import com.ruoyi.business.domain.TTaskExport; | ||||
| import com.ruoyi.business.domain.TTaskImport; | |||||
| /** | /** | ||||
| * 导出任务Mapper接口 | * 导出任务Mapper接口 | ||||
| @@ -74,4 +75,7 @@ public interface TTaskExportMapper | |||||
| * @return 结果 | * @return 结果 | ||||
| */ | */ | ||||
| public int deleteTTaskExportByIds(Long[] ids); | public int deleteTTaskExportByIds(Long[] ids); | ||||
| public int terminateRunningTask(); | |||||
| public TTaskExport getForUpdate(Long id); | |||||
| } | } | ||||
| @@ -0,0 +1,22 @@ | |||||
| package com.ruoyi.geo.config; | |||||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||||
| import org.springframework.stereotype.Component; | |||||
| @Component | |||||
| @ConfigurationProperties(prefix = "export-task") | |||||
| public class GeoExportTaskConfig | |||||
| { | |||||
| public static boolean startOnBoot = false; // 是否启动时执行等待中的任务 | |||||
| public static long logNextPoll = 2000; // 下次建议读取日志的间隔(毫秒) | |||||
| public void setStartOnBoot(boolean startOnBoot) | |||||
| { | |||||
| GeoExportTaskConfig.startOnBoot = startOnBoot; | |||||
| } | |||||
| public void setLogNextPoll(long logNextPoll) | |||||
| { | |||||
| GeoExportTaskConfig.logNextPoll = logNextPoll; | |||||
| } | |||||
| } | |||||
| @@ -6,9 +6,25 @@ import com.ruoyi.common.utils.StringUtils; | |||||
| public final class GeoSysDir | public final class GeoSysDir | ||||
| { | { | ||||
| // 导入日志路径 | // 导入日志路径 | ||||
| public static final String LOG = "/log"; | |||||
| public static final String LOG = "/log"; | |||||
| // 导入zip临时解压路径 | // 导入zip临时解压路径 | ||||
| public static final String ZIP_EXTRACT_TEMP = "/unzip"; | |||||
| public static final String UNZIP_DECOMPRESS_TEMP = "/unzip"; | |||||
| // 导出zip临时生成路径 | |||||
| public static final String ZIP_COMPRESS_TEMP = "/zip"; | |||||
| // 导出zip临时生成路径 | |||||
| public static final String ZIP_FILE_TEMP = "/zip_temp"; | |||||
| // 导出zip临时生成路径 | |||||
| public static final String ZIP_DOWNLOAD = "/zip"; | |||||
| public static String TrimProfile(String path) | |||||
| { | |||||
| if(StringUtils.isEmpty(path)) | |||||
| return ""; | |||||
| else if(path.startsWith("/profile")) | |||||
| return path.substring("/profile".length()); | |||||
| else | |||||
| return path; | |||||
| } | |||||
| public static String GetDir(String path) | public static String GetDir(String path) | ||||
| { | { | ||||
| @@ -68,5 +84,17 @@ public final class GeoSysDir | |||||
| return "<profile directory>" + fpath.substring(fprofile.length()); | return "<profile directory>" + fpath.substring(fprofile.length()); | ||||
| } | } | ||||
| public static String TrimNormalized(String path) | |||||
| { | |||||
| if(StringUtils.isEmpty(path)) | |||||
| return path; | |||||
| String fpath = path.replaceAll("\\\\", "/"); | |||||
| String fprofile = RuoYiConfig.getProfile().replaceAll("\\\\", "/"); | |||||
| if(!fpath.startsWith(fprofile)) | |||||
| return path; | |||||
| return fpath.substring(fprofile.length()); | |||||
| } | |||||
| private GeoSysDir() {} | private GeoSysDir() {} | ||||
| } | } | ||||
| @@ -0,0 +1,62 @@ | |||||
| package com.ruoyi.geo.framework; | |||||
| import com.ruoyi.business.domain.TGisCjqy; | |||||
| import com.ruoyi.common.geo.GeoCreator; | |||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.geo.structs.GeoCJQY; | |||||
| import org.locationtech.jts.geom.MultiPolygon; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.stream.Collectors; | |||||
| public class GeoCjqyExportTask implements GeoDBExportTaskInterface | |||||
| { | |||||
| private final static String TYPE_NAME = "村级区域"; | |||||
| private final GeoExportTask exportTask; | |||||
| private List<TGisCjqy> list; | |||||
| public GeoCjqyExportTask(GeoExportTask exportTask) | |||||
| { | |||||
| this.exportTask = exportTask; | |||||
| } | |||||
| public int LoadDataList() | |||||
| { | |||||
| TGisCjqy cond = new TGisCjqy(); | |||||
| cond.setImportCode(exportTask.dept.getImportCode()); | |||||
| list = GeoMapperService.GisCjqyMapper().selectTGisCjqyList(cond); | |||||
| exportTask.logFile.WriteLine(TYPE_NAME + "读取系统数据条数: 区划代码={}, 条数={}", exportTask.dept.getImportCode(), list.size()); | |||||
| return list.size(); | |||||
| } | |||||
| private GeoCJQY ConvertData(TGisCjqy src, GeoCJQY dst) | |||||
| { | |||||
| if(null == dst) | |||||
| dst = new GeoCJQY(); | |||||
| dst.the_geom = src.getTheGeom(); | |||||
| dst.BSM = src.getBsm().intValue(); | |||||
| dst.YSDM = src.getYsdm(); | |||||
| dst.CJQYDM = src.getCjqydm(); | |||||
| dst.CJQYMC = src.getCjqymc(); | |||||
| return dst; | |||||
| } | |||||
| public void SaveData() | |||||
| { | |||||
| exportTask.logFile.WriteLine(TYPE_NAME + "开始导出数据: 区划代码={}, 条数={}", exportTask.dept.getDeptName(), list.size()); | |||||
| List<GeoCJQY> dataList = list.stream().map((x) -> ConvertData(x, null)).collect(Collectors.toList()); | |||||
| exportTask.writer.WriteList(dataList); | |||||
| } | |||||
| public Map<String, Class<?>> GetTypes() | |||||
| { | |||||
| Map<String, Class<?>> types = GeoCreator.GetClassTypes(GeoCJQY.class); | |||||
| types.put("the_geom", MultiPolygon.class); | |||||
| return types; | |||||
| } | |||||
| } | |||||
| @@ -6,7 +6,9 @@ import com.ruoyi.business.mapper.TGisCjqyMapper; | |||||
| import com.ruoyi.common.core.domain.entity.SysDept; | import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.utils.StringUtils; | import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.geo.service.GeoImportHandlerService; | import com.ruoyi.geo.service.GeoImportHandlerService; | ||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.geo.structs.GeoCJQY; | import com.ruoyi.geo.structs.GeoCJQY; | ||||
| import static com.ruoyi.business.constants.TaskEnums.ImportType; | import static com.ruoyi.business.constants.TaskEnums.ImportType; | ||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||
| @@ -14,14 +16,14 @@ import java.util.List; | |||||
| import java.util.Map; | import java.util.Map; | ||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||
| public class GeoCjqyTask implements GeoDBTaskInterface | |||||
| public class GeoCjqyImportTask implements GeoDBImportTaskInterface | |||||
| { | { | ||||
| private final static String TYPE_NAME = "村级区域"; | private final static String TYPE_NAME = "村级区域"; | ||||
| private final GeoImportTask importTask; | private final GeoImportTask importTask; | ||||
| private List<GeoCJQY> list; | private List<GeoCJQY> list; | ||||
| public GeoCjqyTask(GeoImportTask importTask) | |||||
| public GeoCjqyImportTask(GeoImportTask importTask) | |||||
| { | { | ||||
| this.importTask = importTask; | this.importTask = importTask; | ||||
| } | } | ||||
| @@ -64,7 +66,7 @@ public class GeoCjqyTask implements GeoDBTaskInterface | |||||
| { | { | ||||
| TGisCjqy cond = new TGisCjqy(); | TGisCjqy cond = new TGisCjqy(); | ||||
| cond.setCjqydm(qydm); | cond.setCjqydm(qydm); | ||||
| List<TGisCjqy> cjqies = GeoImportHandlerService.GisCjqyMapper().selectTGisCjqyList(cond); | |||||
| List<TGisCjqy> cjqies = GeoMapperService.GisCjqyMapper().selectTGisCjqyList(cond); | |||||
| importTask.logFile.WriteLine(TYPE_NAME + "读取系统已存在的条数: 区划代码={}, 条数={}", qydm, cjqies.size()); | importTask.logFile.WriteLine(TYPE_NAME + "读取系统已存在的条数: 区划代码={}, 条数={}", qydm, cjqies.size()); | ||||
| return cjqies; | return cjqies; | ||||
| } | } | ||||
| @@ -87,7 +89,7 @@ public class GeoCjqyTask implements GeoDBTaskInterface | |||||
| if(ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType())) | if(ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType())) | ||||
| { | { | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "覆盖导入, 需清空现有数据, 然后再插入, 区划代码={}", importCode); | importTask.logFile.WriteLine(TYPE_NAME + "覆盖导入, 需清空现有数据, 然后再插入, 区划代码={}", importCode); | ||||
| int ret = GeoImportHandlerService.GisCjqyMapper().deleteByCode(importCode); | |||||
| int ret = GeoMapperService.GisCjqyMapper().deleteByCode(importCode); | |||||
| importTask.logFile.WriteLine(TYPE_NAME + "清空现有数据: {}, 区划代码={}", ret, importCode); | importTask.logFile.WriteLine(TYPE_NAME + "清空现有数据: {}, 区划代码={}", ret, importCode); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -100,7 +102,7 @@ public class GeoCjqyTask implements GeoDBTaskInterface | |||||
| private int WriteData(List<TGisCjqy> insertList, List<TGisCjqy> updateList, SysDept dept) | private int WriteData(List<TGisCjqy> insertList, List<TGisCjqy> updateList, SysDept dept) | ||||
| { | { | ||||
| TGisCjqyMapper gisCjqyMapper = GeoImportHandlerService.GisCjqyMapper(); | |||||
| TGisCjqyMapper gisCjqyMapper = GeoMapperService.GisCjqyMapper(); | |||||
| int i = ListUtil.split(insertList, 50).stream().map(gisCjqyMapper::insertTGisCjqyBatch).reduce(0, Integer::sum); | int i = ListUtil.split(insertList, 50).stream().map(gisCjqyMapper::insertTGisCjqyBatch).reduce(0, Integer::sum); | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "新增数据: 区划代码={}, 条数={}", dept.getDeptName(), i); | importTask.logFile.WriteLine(TYPE_NAME + "新增数据: 区划代码={}, 条数={}", dept.getDeptName(), i); | ||||
| int u = ListUtil.split(updateList, 50).stream().map(gisCjqyMapper::updateTGisCjqyBatch).reduce(0, Integer::sum); | int u = ListUtil.split(updateList, 50).stream().map(gisCjqyMapper::updateTGisCjqyBatch).reduce(0, Integer::sum); | ||||
| @@ -111,21 +113,29 @@ public class GeoCjqyTask implements GeoDBTaskInterface | |||||
| private int SaveDeptData(SysDept dept, List<GeoCJQY> datas) | private int SaveDeptData(SysDept dept, List<GeoCJQY> datas) | ||||
| { | { | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "开始处理数据: 区划代码={}, 条数={}", dept.getDeptName(), datas.size()); | importTask.logFile.WriteLine(TYPE_NAME + "开始处理数据: 区划代码={}, 条数={}", dept.getDeptName(), datas.size()); | ||||
| List<TGisCjqy> databases = LoadDatabase(dept.getImportCode()); | |||||
| Map<String, TGisCjqy> exists = databases.stream().collect(Collectors.toMap(TGisCjqy::getCjqydm, x->x)); | |||||
| boolean needCheck = !ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType()); | |||||
| Map<String, TGisCjqy> exists = null; | |||||
| if(needCheck) | |||||
| { | |||||
| List<TGisCjqy> databases = LoadDatabase(dept.getImportCode()); | |||||
| exists = databases.stream().collect(Collectors.toMap(TGisCjqy::getCjqydm, x->x)); | |||||
| } | |||||
| List<TGisCjqy> insertList = new ArrayList<>(); | List<TGisCjqy> insertList = new ArrayList<>(); | ||||
| List<TGisCjqy> updateList = new ArrayList<>(); | List<TGisCjqy> updateList = new ArrayList<>(); | ||||
| for(GeoCJQY data : datas) | for(GeoCJQY data : datas) | ||||
| { | { | ||||
| TGisCjqy db = exists.get(data.CJQYDM); | |||||
| boolean has = null == db; | |||||
| db = ConvertData(data, db, dept); | |||||
| if(has) | |||||
| insertList.add(db); | |||||
| TGisCjqy db = null; | |||||
| if(needCheck) | |||||
| { | |||||
| db = exists.get(data.CJQYDM); | |||||
| } | |||||
| TGisCjqy item = ConvertData(data, db, dept); | |||||
| if(null == db) | |||||
| insertList.add(item); | |||||
| else | else | ||||
| updateList.add(db); | |||||
| updateList.add(item); | |||||
| } | } | ||||
| CleanDatabase(dept.getImportCode()); | CleanDatabase(dept.getImportCode()); | ||||
| @@ -0,0 +1,11 @@ | |||||
| package com.ruoyi.geo.framework; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| public interface GeoDBExportTaskInterface | |||||
| { | |||||
| public Map<String, Class<?>> GetTypes(); | |||||
| public int LoadDataList(); | |||||
| public void SaveData(); | |||||
| } | |||||
| @@ -1,6 +1,6 @@ | |||||
| package com.ruoyi.geo.framework; | package com.ruoyi.geo.framework; | ||||
| public interface GeoDBTaskInterface | |||||
| public interface GeoDBImportTaskInterface | |||||
| { | { | ||||
| public int LoadDataList(); | public int LoadDataList(); | ||||
| public void CheckData(); | public void CheckData(); | ||||
| @@ -0,0 +1,315 @@ | |||||
| package com.ruoyi.geo.framework; | |||||
| import cn.hutool.core.collection.CollectionUtil; | |||||
| import cn.hutool.core.date.DateUtil; | |||||
| import cn.hutool.core.io.FileUtil; | |||||
| import cn.hutool.core.util.ZipUtil; | |||||
| import com.ruoyi.business.domain.TTaskExport; | |||||
| import com.ruoyi.common.config.RuoYiConfig; | |||||
| import com.ruoyi.common.core.domain.entity.SysDept; | |||||
| import com.ruoyi.common.geo.GeoWriter; | |||||
| import com.ruoyi.common.utils.ExceptionUtil; | |||||
| import com.ruoyi.common.utils.StringUtils; | |||||
| import com.ruoyi.common.utils.spring.SpringUtils; | |||||
| import com.ruoyi.common.utils.sql.DB; | |||||
| import com.ruoyi.geo.constants.GeoShpType; | |||||
| import com.ruoyi.geo.constants.GeoSysDir; | |||||
| import com.ruoyi.geo.service.GeoExportHandlerService; | |||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.system.mapper.SysDeptMapper; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import java.io.File; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.Date; | |||||
| import java.util.HashMap; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.stream.Collectors; | |||||
| import static com.ruoyi.business.constants.TaskEnums.TaskStatus; | |||||
| @Slf4j | |||||
| public class GeoExportTask implements Runnable | |||||
| { | |||||
| private final Long taskId; | |||||
| TTaskExport taskExport; | |||||
| GeoTaskLog logFile; | |||||
| GeoWriter writer; | |||||
| private final List<String> typeNames = Arrays.asList( | |||||
| GeoShpType.CJQY, | |||||
| GeoShpType.JTZY, | |||||
| GeoShpType.ZYHYCG | |||||
| ); | |||||
| private Map<String, Class<?>> typeClasses; | |||||
| private String shpFile; | |||||
| private String type; | |||||
| String username; | |||||
| Date now; | |||||
| SysDept dept; | |||||
| private GeoDBExportTaskInterface task; | |||||
| public GeoExportTask(Long taskId) | |||||
| { | |||||
| this.taskId = taskId; | |||||
| } | |||||
| public void Init() | |||||
| { | |||||
| now = new Date(); | |||||
| username = "admin"; //SecurityUtils.getUsername(); | |||||
| String path = LogPath(); | |||||
| log.info("任务{}日志文件: {}", taskId, path); | |||||
| logFile = new GeoTaskLog(path); | |||||
| logFile.Open(); | |||||
| logFile.WriteLine("任务初始化: {} - {}", taskId, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss.SSS")); | |||||
| } | |||||
| public void Shutdown() | |||||
| { | |||||
| //CleanTempFiles(); | |||||
| logFile.WriteLine("任务结束: {} - {}", taskId, DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss.SSS")); | |||||
| if(null != logFile) | |||||
| { | |||||
| logFile.close(); | |||||
| } | |||||
| log.info("任务{}日志文件: {}", taskId, GeoSysDir.DesensitizedNormalized(LogPath())); | |||||
| } | |||||
| private String ZipCachePath() | |||||
| { | |||||
| return GeoSysDir.CacheDir(GeoSysDir.ZIP_COMPRESS_TEMP + "/" + taskId); | |||||
| } | |||||
| private String ZipTempFilePath() | |||||
| { | |||||
| return GeoSysDir.CacheDir(GeoSysDir.ZIP_FILE_TEMP + "/" + taskId + ".zip.temp"); | |||||
| } | |||||
| private String ZipFilePath() | |||||
| { | |||||
| return GeoSysDir.ExportDir(GeoSysDir.ZIP_DOWNLOAD + "/" + taskId + ".zip"); | |||||
| } | |||||
| public String LogPath() | |||||
| { | |||||
| return GeoSysDir.ExportDir(GeoSysDir.LOG) + "/" + taskId + ".log"; | |||||
| } | |||||
| private void Ready() | |||||
| { | |||||
| // 先清空源临时解压文件 | |||||
| CleanTempFiles(); | |||||
| String toDir = ZipCachePath(); | |||||
| FileUtil.mkdir(toDir); | |||||
| FileUtil.mkParentDirs(ZipFilePath()); | |||||
| } | |||||
| private void CleanTempFiles() | |||||
| { | |||||
| String toDir = ZipCachePath(); | |||||
| logFile.WriteLine("清理临时文件: " + GeoSysDir.DesensitizedNormalized(toDir)); | |||||
| FileUtil.del(toDir); | |||||
| } | |||||
| private void Compress() | |||||
| { | |||||
| String cacheDir = ZipCachePath(); | |||||
| logFile.WriteLine("开始压缩临时shp文件: " + GeoSysDir.DesensitizedNormalized(cacheDir)); | |||||
| String zipTempFile = ZipTempFilePath(); | |||||
| FileUtil.mkParentDirs(zipTempFile); | |||||
| logFile.WriteLine("生成临时zip文件: " + GeoSysDir.DesensitizedNormalized(zipTempFile)); | |||||
| ZipUtil.zip(cacheDir, ZipTempFilePath()); | |||||
| String zipFile = ZipFilePath(); | |||||
| FileUtil.mkParentDirs(zipFile); | |||||
| if(StringUtils.isNotEmpty(taskExport.getFileUrl())) | |||||
| { | |||||
| File file = new File(RuoYiConfig.getProfile() + "/" + GeoSysDir.TrimProfile(taskExport.getFileUrl())); | |||||
| if(file.isFile()) | |||||
| { | |||||
| logFile.WriteLine("删除之前的zip文件: " + GeoSysDir.DesensitizedNormalized(file.getAbsolutePath())); | |||||
| file.delete(); | |||||
| } | |||||
| } | |||||
| logFile.WriteLine("复制zip到下载目录: " + GeoSysDir.DesensitizedNormalized(zipFile)); | |||||
| FileUtil.move(new File(zipTempFile), new File(zipFile), true); | |||||
| taskExport.setFileUrl("/profile" + GeoSysDir.TrimNormalized(zipFile)); | |||||
| } | |||||
| private void CreateShp() | |||||
| { | |||||
| writer = new GeoWriter(); | |||||
| if(!writer.Open(shpFile, "UTF-8")) | |||||
| { | |||||
| logFile.ErrorLine("打开shp文件错误: " + shpFile); | |||||
| } | |||||
| try | |||||
| { | |||||
| writer.AddSchema(type, typeClasses); | |||||
| System.out.println(writer.GetTypeNames()); | |||||
| if(!writer.SetSource(type, false)) | |||||
| { | |||||
| logFile.ErrorLine("shp文件未找到支持源: " + type); | |||||
| return; | |||||
| } | |||||
| task.SaveData(); | |||||
| } | |||||
| catch(Exception e) | |||||
| { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| finally | |||||
| { | |||||
| writer.close(); | |||||
| writer = null; | |||||
| } | |||||
| } | |||||
| private void LoadDept() | |||||
| { | |||||
| dept = GeoMapperService.DeptMapper().selectDeptByOrgCode(taskExport.getOrgCode()); | |||||
| } | |||||
| private void LoadTask() | |||||
| { | |||||
| TTaskExport task = GeoMapperService.TaskExportMapper().getForUpdate(taskId); | |||||
| if(null == task) | |||||
| { | |||||
| logFile.ErrorLine("任务配置不存在: " + taskId); | |||||
| return; | |||||
| } | |||||
| if(!TaskStatus.ST_WAIT.equals(task.getTaskStatus())) | |||||
| { | |||||
| logFile.ErrorLine("任务非等待状态: " + taskId); | |||||
| return; | |||||
| } | |||||
| taskExport = task; | |||||
| } | |||||
| private void SaveTask(String st) | |||||
| { | |||||
| if(null != taskExport) | |||||
| { | |||||
| taskExport.setTaskStatus(st); | |||||
| GeoMapperService.TaskExportMapper().updateTTaskExport(taskExport); | |||||
| } | |||||
| } | |||||
| private void HandleShpTypes() | |||||
| { | |||||
| for(String shpType : typeNames) | |||||
| { | |||||
| type = shpType; | |||||
| // 2. 分发任务 | |||||
| DispatchTask(); | |||||
| } | |||||
| } | |||||
| private void DispatchTask() | |||||
| { | |||||
| // 1. 选择任务类型 | |||||
| switch(type.toLowerCase()) | |||||
| { | |||||
| case GeoShpType.CJQY: | |||||
| task = new GeoCjqyExportTask(this); | |||||
| break; | |||||
| case GeoShpType.JTZY: | |||||
| task = new GeoJtzyExportTask(this); | |||||
| break; | |||||
| case GeoShpType.ZYHYCG: | |||||
| task = new GeoZyhycgExportTask(this); | |||||
| break; | |||||
| default: | |||||
| logFile.WriteLine("数据类型不支持: " + type); | |||||
| return; | |||||
| } | |||||
| // 2. 处理导入任务 | |||||
| DoTask(); | |||||
| } | |||||
| private void CreateShpFile() | |||||
| { | |||||
| shpFile = ZipCachePath() + "/"/* + group + "/"*/ + type.toLowerCase() + ".shp"; | |||||
| FileUtil.mkParentDirs(shpFile); | |||||
| } | |||||
| private void DoTask() | |||||
| { | |||||
| typeClasses = task.GetTypes(); | |||||
| int num = task.LoadDataList(); | |||||
| if(num == 0) | |||||
| { | |||||
| logFile.WriteLine("数据库支持源未读取到数据: " + type); | |||||
| return; | |||||
| } | |||||
| CreateShpFile(); | |||||
| CreateShp(); | |||||
| } | |||||
| private void Handle() | |||||
| { | |||||
| // 0. 初始化任务: 打开日志系统 | |||||
| Init(); | |||||
| // 1. 加载任务配置, 并检查 | |||||
| LoadTask(); | |||||
| // 2. 读取文件, 解压文件到工作目录 | |||||
| Ready(); | |||||
| // 3. 加载部门数据 | |||||
| LoadDept(); | |||||
| // 4. 依次处理所有shp文件 | |||||
| HandleShpTypes(); | |||||
| // 5. 压缩 | |||||
| Compress(); | |||||
| } | |||||
| @Override | |||||
| public void run() | |||||
| { | |||||
| Object handle = null; | |||||
| try | |||||
| { | |||||
| handle = DB.BeginTransaction(); | |||||
| Handle(); | |||||
| // 更改任务状态为已完成 | |||||
| SaveTask(TaskStatus.ST_FINISH); | |||||
| } | |||||
| catch(Exception e) | |||||
| { | |||||
| e.printStackTrace(); | |||||
| logFile.WriteLine(ExceptionUtil.getExceptionMessage(e)); | |||||
| SaveTask(TaskStatus.ST_FAIL); | |||||
| } | |||||
| finally | |||||
| { | |||||
| DB.EndTransaction(handle); | |||||
| // -1: 终止任务, 关闭日志系统 | |||||
| Shutdown(); | |||||
| } | |||||
| } | |||||
| public Long GetTaskId() | |||||
| { | |||||
| return taskId; | |||||
| } | |||||
| } | |||||
| @@ -14,6 +14,7 @@ import com.ruoyi.common.utils.sql.DB; | |||||
| import com.ruoyi.geo.constants.GeoShpType; | import com.ruoyi.geo.constants.GeoShpType; | ||||
| import com.ruoyi.geo.constants.GeoSysDir; | import com.ruoyi.geo.constants.GeoSysDir; | ||||
| import com.ruoyi.geo.service.GeoImportHandlerService; | import com.ruoyi.geo.service.GeoImportHandlerService; | ||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.system.mapper.SysDeptMapper; | import com.ruoyi.system.mapper.SysDeptMapper; | ||||
| import lombok.extern.slf4j.Slf4j; | import lombok.extern.slf4j.Slf4j; | ||||
| import static com.ruoyi.business.constants.TaskEnums.TaskStatus; | import static com.ruoyi.business.constants.TaskEnums.TaskStatus; | ||||
| @@ -40,7 +41,7 @@ public class GeoImportTask implements Runnable | |||||
| String username; | String username; | ||||
| Date now; | Date now; | ||||
| private GeoDBTaskInterface task; | |||||
| private GeoDBImportTaskInterface task; | |||||
| public GeoImportTask(Long taskId) | public GeoImportTask(Long taskId) | ||||
| { | { | ||||
| @@ -72,7 +73,7 @@ public class GeoImportTask implements Runnable | |||||
| private String UnzipCachePath() | private String UnzipCachePath() | ||||
| { | { | ||||
| return GeoSysDir.CacheDir(GeoSysDir.ZIP_EXTRACT_TEMP + "/" + taskId); | |||||
| return GeoSysDir.CacheDir(GeoSysDir.UNZIP_DECOMPRESS_TEMP + "/" + taskId); | |||||
| } | } | ||||
| public String LogPath() | public String LogPath() | ||||
| @@ -157,15 +158,14 @@ public class GeoImportTask implements Runnable | |||||
| private void LoadDept() | private void LoadDept() | ||||
| { | { | ||||
| SysDept cond = new SysDept(); | SysDept cond = new SysDept(); | ||||
| SysDeptMapper deptMapper = SpringUtils.getBean(SysDeptMapper.class); | |||||
| List<SysDept> sysDepts = deptMapper.selectDeptList(cond); | |||||
| List<SysDept> sysDepts = GeoMapperService.DeptMapper().selectDeptList(cond); | |||||
| importDeptMap = sysDepts.stream().collect(Collectors.toMap(SysDept::getImportCode, x -> x)); | importDeptMap = sysDepts.stream().collect(Collectors.toMap(SysDept::getImportCode, x -> x)); | ||||
| sysDeptMap = sysDepts.stream().collect(Collectors.toMap(SysDept::getOrgCode, x -> x)); | sysDeptMap = sysDepts.stream().collect(Collectors.toMap(SysDept::getOrgCode, x -> x)); | ||||
| } | } | ||||
| private void LoadTask() | private void LoadTask() | ||||
| { | { | ||||
| TTaskImport task = GeoImportHandlerService.TaskImportMapper().getForUpdate(taskId); | |||||
| TTaskImport task = GeoMapperService.TaskImportMapper().getForUpdate(taskId); | |||||
| if(null == task) | if(null == task) | ||||
| { | { | ||||
| logFile.ErrorLine("任务配置不存在: " + taskId); | logFile.ErrorLine("任务配置不存在: " + taskId); | ||||
| @@ -184,7 +184,7 @@ public class GeoImportTask implements Runnable | |||||
| if(null != taskImport) | if(null != taskImport) | ||||
| { | { | ||||
| taskImport.setTaskStatus(st); | taskImport.setTaskStatus(st); | ||||
| GeoImportHandlerService.TaskImportMapper().updateTTaskImport(taskImport); | |||||
| GeoMapperService.TaskImportMapper().updateTTaskImport(taskImport); | |||||
| } | } | ||||
| } | } | ||||
| @@ -215,13 +215,13 @@ public class GeoImportTask implements Runnable | |||||
| switch(type.toLowerCase()) | switch(type.toLowerCase()) | ||||
| { | { | ||||
| case GeoShpType.CJQY: | case GeoShpType.CJQY: | ||||
| task = new GeoCjqyTask(this); | |||||
| task = new GeoCjqyImportTask(this); | |||||
| break; | break; | ||||
| case GeoShpType.JTZY: | case GeoShpType.JTZY: | ||||
| task = new GeoJtzyTask(this); | |||||
| task = new GeoJtzyImportTask(this); | |||||
| break; | break; | ||||
| case GeoShpType.ZYHYCG: | case GeoShpType.ZYHYCG: | ||||
| task = new GeoZyhycgTask(this); | |||||
| task = new GeoZyhycgImportTask(this); | |||||
| break; | break; | ||||
| default: | default: | ||||
| logFile.WriteLine("数据类型不支持: " + type); | logFile.WriteLine("数据类型不支持: " + type); | ||||
| @@ -0,0 +1,79 @@ | |||||
| package com.ruoyi.geo.framework; | |||||
| import com.ruoyi.common.geo.GeoCreator; | |||||
| import com.ruoyi.geo.service.GeoExportHandlerService; | |||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.geo.structs.GeoJTZY; | |||||
| import com.ruoyi.resource.domain.TResourceLand; | |||||
| import org.locationtech.jts.geom.MultiPolygon; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.stream.Collectors; | |||||
| public class GeoJtzyExportTask implements GeoDBExportTaskInterface | |||||
| { | |||||
| private final static String TYPE_NAME = "地块属性"; | |||||
| private final GeoExportTask exportTask; | |||||
| private List<TResourceLand> list; | |||||
| public GeoJtzyExportTask(GeoExportTask exportTask) | |||||
| { | |||||
| this.exportTask = exportTask; | |||||
| } | |||||
| public int LoadDataList() | |||||
| { | |||||
| TResourceLand cond = new TResourceLand(); | |||||
| cond.setImportCode(exportTask.dept.getImportCode()); | |||||
| list = GeoMapperService.ResourceLandMapper().selectTResourceLandList(cond); | |||||
| exportTask.logFile.WriteLine(TYPE_NAME + "读取系统数据条数: 区划代码={}, 条数={}", exportTask.dept.getImportCode(), list.size()); | |||||
| return list.size(); | |||||
| } | |||||
| private GeoJTZY ConvertData(TResourceLand src, GeoJTZY dst) | |||||
| { | |||||
| if(null == dst) | |||||
| dst = new GeoJTZY(); | |||||
| dst.the_geom = src.getTheGeom(); | |||||
| dst.BSM = src.getBsm(); | |||||
| dst.YSDM = src.getYsdm(); | |||||
| dst.DKBM = src.getDkbm(); | |||||
| dst.DKMC = src.getDkmc(); | |||||
| dst.SYQXZ = src.getSyqxz(); | |||||
| dst.DKLB = src.getDklb(); | |||||
| dst.DLDJ = src.getDldj(); | |||||
| dst.TDYT = src.getTdyt(); | |||||
| dst.SFJBNT = src.getSfjbnt(); | |||||
| dst.DKDZ = src.getDkdz(); | |||||
| dst.DKXZ = src.getDkxz(); | |||||
| dst.DKNZ = src.getDknz(); | |||||
| dst.DKBZ = src.getDkbz(); | |||||
| dst.ZJRXM = src.getZjrxm(); | |||||
| dst.DKBZXX = src.getDkbzxx(); | |||||
| dst.TXMJ = src.getTxmj(); | |||||
| dst.QSDWDM = src.getQsdwdm(); | |||||
| dst.QSDWMC = src.getQsdwmc(); | |||||
| dst.SFZWD = src.getSfzwd(); | |||||
| dst.SCMJM = src.getScmjm(); | |||||
| return dst; | |||||
| } | |||||
| public void SaveData() | |||||
| { | |||||
| exportTask.logFile.WriteLine(TYPE_NAME + "开始导出数据: 区划代码={}, 条数={}", exportTask.dept.getDeptName(), list.size()); | |||||
| List<GeoJTZY> dataList = list.stream().map((x) -> ConvertData(x, null)).collect(Collectors.toList()); | |||||
| exportTask.writer.WriteList(dataList); | |||||
| } | |||||
| public Map<String, Class<?>> GetTypes() | |||||
| { | |||||
| Map<String, Class<?>> types = GeoCreator.GetClassTypes(GeoJTZY.class); | |||||
| types.put("the_geom", MultiPolygon.class); | |||||
| return types; | |||||
| } | |||||
| } | |||||
| @@ -4,6 +4,7 @@ import cn.hutool.core.collection.ListUtil; | |||||
| import com.ruoyi.common.core.domain.entity.SysDept; | import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.utils.StringUtils; | import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.geo.service.GeoImportHandlerService; | import com.ruoyi.geo.service.GeoImportHandlerService; | ||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.geo.structs.GeoJTZY; | import com.ruoyi.geo.structs.GeoJTZY; | ||||
| import com.ruoyi.resource.domain.TResourceLand; | import com.ruoyi.resource.domain.TResourceLand; | ||||
| import com.ruoyi.resource.mapper.TResourceLandMapper; | import com.ruoyi.resource.mapper.TResourceLandMapper; | ||||
| @@ -15,14 +16,14 @@ import java.util.stream.Collectors; | |||||
| import static com.ruoyi.business.constants.TaskEnums.ImportType; | import static com.ruoyi.business.constants.TaskEnums.ImportType; | ||||
| public class GeoJtzyTask implements GeoDBTaskInterface | |||||
| public class GeoJtzyImportTask implements GeoDBImportTaskInterface | |||||
| { | { | ||||
| private final static String TYPE_NAME = "地块属性"; | private final static String TYPE_NAME = "地块属性"; | ||||
| private final GeoImportTask importTask; | private final GeoImportTask importTask; | ||||
| private List<GeoJTZY> list; | private List<GeoJTZY> list; | ||||
| public GeoJtzyTask(GeoImportTask importTask) | |||||
| public GeoJtzyImportTask(GeoImportTask importTask) | |||||
| { | { | ||||
| this.importTask = importTask; | this.importTask = importTask; | ||||
| } | } | ||||
| @@ -65,7 +66,7 @@ public class GeoJtzyTask implements GeoDBTaskInterface | |||||
| { | { | ||||
| TResourceLand cond = new TResourceLand(); | TResourceLand cond = new TResourceLand(); | ||||
| cond.setImportCode(qydm); | cond.setImportCode(qydm); | ||||
| List<TResourceLand> cjqies = GeoImportHandlerService.ResourceLandMapper().selectTResourceLandList(cond); | |||||
| List<TResourceLand> cjqies = GeoMapperService.ResourceLandMapper().selectTResourceLandList(cond); | |||||
| importTask.logFile.WriteLine(TYPE_NAME + "读取系统已存在的条数: 区划代码={}, 条数={}", qydm, cjqies.size()); | importTask.logFile.WriteLine(TYPE_NAME + "读取系统已存在的条数: 区划代码={}, 条数={}", qydm, cjqies.size()); | ||||
| return cjqies; | return cjqies; | ||||
| } | } | ||||
| @@ -117,7 +118,7 @@ public class GeoJtzyTask implements GeoDBTaskInterface | |||||
| if(ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType())) | if(ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType())) | ||||
| { | { | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "覆盖导入, 需清空现有数据, 然后再插入, 区划代码={}", importCode); | importTask.logFile.WriteLine(TYPE_NAME + "覆盖导入, 需清空现有数据, 然后再插入, 区划代码={}", importCode); | ||||
| int ret = GeoImportHandlerService.ResourceLandMapper().deleteByCode(importCode); | |||||
| int ret = GeoMapperService.ResourceLandMapper().deleteByCode(importCode); | |||||
| importTask.logFile.WriteLine(TYPE_NAME + "清空现有数据: {}, 区划代码={}", ret, importCode); | importTask.logFile.WriteLine(TYPE_NAME + "清空现有数据: {}, 区划代码={}", ret, importCode); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -130,7 +131,7 @@ public class GeoJtzyTask implements GeoDBTaskInterface | |||||
| private int WriteData(List<TResourceLand> insertList, List<TResourceLand> updateList, SysDept dept) | private int WriteData(List<TResourceLand> insertList, List<TResourceLand> updateList, SysDept dept) | ||||
| { | { | ||||
| TResourceLandMapper gisCjqyMapper = GeoImportHandlerService.ResourceLandMapper(); | |||||
| TResourceLandMapper gisCjqyMapper = GeoMapperService.ResourceLandMapper(); | |||||
| int i = ListUtil.split(insertList, 30).stream().map(gisCjqyMapper::insertTResourceLandBatch).reduce(0, Integer::sum); | int i = ListUtil.split(insertList, 30).stream().map(gisCjqyMapper::insertTResourceLandBatch).reduce(0, Integer::sum); | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "新增数据: 区划代码={}, 条数={}", dept.getDeptName(), i); | importTask.logFile.WriteLine(TYPE_NAME + "新增数据: 区划代码={}, 条数={}", dept.getDeptName(), i); | ||||
| int u = ListUtil.split(updateList, 1).stream().map(gisCjqyMapper::updateTResourceLandBatch).reduce(0, Integer::sum); | int u = ListUtil.split(updateList, 1).stream().map(gisCjqyMapper::updateTResourceLandBatch).reduce(0, Integer::sum); | ||||
| @@ -141,21 +142,29 @@ public class GeoJtzyTask implements GeoDBTaskInterface | |||||
| private int SaveDeptData(SysDept dept, List<GeoJTZY> datas) | private int SaveDeptData(SysDept dept, List<GeoJTZY> datas) | ||||
| { | { | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "开始处理数据: 区划代码={}, 条数={}", dept.getDeptName(), datas.size()); | importTask.logFile.WriteLine(TYPE_NAME + "开始处理数据: 区划代码={}, 条数={}", dept.getDeptName(), datas.size()); | ||||
| List<TResourceLand> databases = LoadDatabase(dept.getImportCode()); | |||||
| Map<String, TResourceLand> exists = databases.stream().collect(Collectors.toMap(TResourceLand::getDkbm, x->x)); | |||||
| boolean needCheck = !ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType()); | |||||
| Map<String, TResourceLand> exists = null; | |||||
| if(needCheck) | |||||
| { | |||||
| List<TResourceLand> databases = LoadDatabase(dept.getImportCode()); | |||||
| exists = databases.stream().collect(Collectors.toMap(TResourceLand::getDkbm, x->x)); | |||||
| } | |||||
| List<TResourceLand> insertList = new ArrayList<>(); | List<TResourceLand> insertList = new ArrayList<>(); | ||||
| List<TResourceLand> updateList = new ArrayList<>(); | List<TResourceLand> updateList = new ArrayList<>(); | ||||
| for(GeoJTZY data : datas) | for(GeoJTZY data : datas) | ||||
| { | { | ||||
| TResourceLand db = exists.get(data.DKBM); | |||||
| boolean notExists = null == db; | |||||
| db = ConvertData(data, db, dept); | |||||
| if(notExists) | |||||
| insertList.add(db); | |||||
| TResourceLand db = null; | |||||
| if(needCheck) | |||||
| { | |||||
| db = exists.get(data.DKBM); | |||||
| } | |||||
| TResourceLand item = ConvertData(data, db, dept); | |||||
| if(null == db) | |||||
| insertList.add(item); | |||||
| else | else | ||||
| updateList.add(db); | |||||
| updateList.add(item); | |||||
| } | } | ||||
| CleanDatabase(dept.getImportCode()); | CleanDatabase(dept.getImportCode()); | ||||
| @@ -0,0 +1,74 @@ | |||||
| package com.ruoyi.geo.framework; | |||||
| import cn.hutool.core.util.StrUtil; | |||||
| import com.ruoyi.common.geo.GeoCreator; | |||||
| import com.ruoyi.common.utils.DecimalUtils; | |||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.geo.structs.GeoZYHYCG; | |||||
| import com.ruoyi.resource.domain.TResourceOperation; | |||||
| import org.locationtech.jts.geom.MultiPolygon; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.stream.Collectors; | |||||
| public class GeoZyhycgExportTask implements GeoDBExportTaskInterface | |||||
| { | |||||
| private final static String TYPE_NAME = "地块经营"; | |||||
| private final GeoExportTask exportTask; | |||||
| private List<TResourceOperation> list; | |||||
| public GeoZyhycgExportTask(GeoExportTask exportTask) | |||||
| { | |||||
| this.exportTask = exportTask; | |||||
| } | |||||
| public int LoadDataList() | |||||
| { | |||||
| TResourceOperation cond = new TResourceOperation(); | |||||
| cond.setImportCode(exportTask.dept.getImportCode()); | |||||
| list = GeoMapperService.ResourceOperationMapper().selectTResourceOperationList(cond); | |||||
| exportTask.logFile.WriteLine(TYPE_NAME + "读取系统数据条数: 区划代码={}, 条数={}", exportTask.dept.getImportCode(), list.size()); | |||||
| return list.size(); | |||||
| } | |||||
| private GeoZYHYCG ConvertData(TResourceOperation src, GeoZYHYCG dst) | |||||
| { | |||||
| if(null == dst) | |||||
| dst = new GeoZYHYCG(); | |||||
| dst.DKBM = src.getDkbm(); | |||||
| dst.DKMC = src.getDkmc(); | |||||
| dst.SYQXZ = src.getDkdz(); | |||||
| dst.JYMJ = src.getJymj(); | |||||
| dst.JYDXLX = src.getJydxlx(); | |||||
| dst.JYDXMC = src.getJydxmc(); | |||||
| dst.JYDXZJLX = src.getJydxzjlx(); | |||||
| dst.JYDXZJHM = src.getJydxzjhm(); | |||||
| dst.SFQDHT = src.getSfqdht(); | |||||
| dst.JYKSSJ = src.getJykssj(); | |||||
| dst.JYJSSJ = src.getJyjssj(); | |||||
| dst.CBJE = src.getCbje(); | |||||
| dst.DXJE = src.getDxje(); | |||||
| dst.SQJE = src.getSqje(); | |||||
| dst.NSY = src.getNsy(); | |||||
| dst.BZXX = src.getBzxx(); | |||||
| dst.JYFS = src.getJyfs(); | |||||
| return dst; | |||||
| } | |||||
| public void SaveData() | |||||
| { | |||||
| exportTask.logFile.WriteLine(TYPE_NAME + "开始导出数据: 区划代码={}, 条数={}", exportTask.dept.getDeptName(), list.size()); | |||||
| List<GeoZYHYCG> dataList = list.stream().map((x) -> ConvertData(x, null)).collect(Collectors.toList()); | |||||
| exportTask.writer.WriteList(dataList); | |||||
| } | |||||
| public Map<String, Class<?>> GetTypes() | |||||
| { | |||||
| return GeoCreator.GetClassTypes(GeoZYHYCG.class); | |||||
| } | |||||
| } | |||||
| @@ -5,7 +5,7 @@ import cn.hutool.core.util.StrUtil; | |||||
| import com.ruoyi.common.core.domain.entity.SysDept; | import com.ruoyi.common.core.domain.entity.SysDept; | ||||
| import com.ruoyi.common.utils.DecimalUtils; | import com.ruoyi.common.utils.DecimalUtils; | ||||
| import com.ruoyi.common.utils.StringUtils; | import com.ruoyi.common.utils.StringUtils; | ||||
| import com.ruoyi.geo.service.GeoImportHandlerService; | |||||
| import com.ruoyi.geo.service.GeoMapperService; | |||||
| import com.ruoyi.geo.structs.GeoZYHYCG; | import com.ruoyi.geo.structs.GeoZYHYCG; | ||||
| import com.ruoyi.resource.domain.TResourceOperation; | import com.ruoyi.resource.domain.TResourceOperation; | ||||
| import com.ruoyi.resource.mapper.TResourceOperationMapper; | import com.ruoyi.resource.mapper.TResourceOperationMapper; | ||||
| @@ -17,14 +17,14 @@ import java.util.stream.Collectors; | |||||
| import static com.ruoyi.business.constants.TaskEnums.ImportType; | import static com.ruoyi.business.constants.TaskEnums.ImportType; | ||||
| public class GeoZyhycgTask implements GeoDBTaskInterface | |||||
| public class GeoZyhycgImportTask implements GeoDBImportTaskInterface | |||||
| { | { | ||||
| private final static String TYPE_NAME = "地块经营"; | private final static String TYPE_NAME = "地块经营"; | ||||
| private final GeoImportTask importTask; | private final GeoImportTask importTask; | ||||
| private List<GeoZYHYCG> list; | private List<GeoZYHYCG> list; | ||||
| public GeoZyhycgTask(GeoImportTask importTask) | |||||
| public GeoZyhycgImportTask(GeoImportTask importTask) | |||||
| { | { | ||||
| this.importTask = importTask; | this.importTask = importTask; | ||||
| } | } | ||||
| @@ -67,7 +67,7 @@ public class GeoZyhycgTask implements GeoDBTaskInterface | |||||
| { | { | ||||
| TResourceOperation cond = new TResourceOperation(); | TResourceOperation cond = new TResourceOperation(); | ||||
| cond.setImportCode(qydm); | cond.setImportCode(qydm); | ||||
| List<TResourceOperation> cjqies = GeoImportHandlerService.ResourceOperationMapper().selectTResourceOperationList(cond); | |||||
| List<TResourceOperation> cjqies = GeoMapperService.ResourceOperationMapper().selectTResourceOperationList(cond); | |||||
| importTask.logFile.WriteLine(TYPE_NAME + "读取系统已存在的条数: 区划代码={}, 条数={}", qydm, cjqies.size()); | importTask.logFile.WriteLine(TYPE_NAME + "读取系统已存在的条数: 区划代码={}, 条数={}", qydm, cjqies.size()); | ||||
| return cjqies; | return cjqies; | ||||
| } | } | ||||
| @@ -115,7 +115,7 @@ public class GeoZyhycgTask implements GeoDBTaskInterface | |||||
| if(ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType())) | if(ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType())) | ||||
| { | { | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "覆盖导入, 需清空现有数据, 然后再插入, 区划代码={}", importCode); | importTask.logFile.WriteLine(TYPE_NAME + "覆盖导入, 需清空现有数据, 然后再插入, 区划代码={}", importCode); | ||||
| int ret = GeoImportHandlerService.ResourceOperationMapper().deleteByCode(importCode); | |||||
| int ret = GeoMapperService.ResourceOperationMapper().deleteByCode(importCode); | |||||
| importTask.logFile.WriteLine(TYPE_NAME + "清空现有数据: {}, 区划代码={}", ret, importCode); | importTask.logFile.WriteLine(TYPE_NAME + "清空现有数据: {}, 区划代码={}", ret, importCode); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| @@ -128,7 +128,7 @@ public class GeoZyhycgTask implements GeoDBTaskInterface | |||||
| private int WriteData(List<TResourceOperation> insertList, List<TResourceOperation> updateList, SysDept dept) | private int WriteData(List<TResourceOperation> insertList, List<TResourceOperation> updateList, SysDept dept) | ||||
| { | { | ||||
| TResourceOperationMapper gisCjqyMapper = GeoImportHandlerService.ResourceOperationMapper(); | |||||
| TResourceOperationMapper gisCjqyMapper = GeoMapperService.ResourceOperationMapper(); | |||||
| int i = ListUtil.split(insertList, 30).stream().map(gisCjqyMapper::insertTResourceOperationBatch).reduce(0, Integer::sum); | int i = ListUtil.split(insertList, 30).stream().map(gisCjqyMapper::insertTResourceOperationBatch).reduce(0, Integer::sum); | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "新增数据: 区划代码={}, 条数={}", dept.getDeptName(), i); | importTask.logFile.WriteLine(TYPE_NAME + "新增数据: 区划代码={}, 条数={}", dept.getDeptName(), i); | ||||
| int u = ListUtil.split(updateList, 1).stream().map(gisCjqyMapper::updateTResourceOperationBatch).reduce(0, Integer::sum); | int u = ListUtil.split(updateList, 1).stream().map(gisCjqyMapper::updateTResourceOperationBatch).reduce(0, Integer::sum); | ||||
| @@ -139,21 +139,29 @@ public class GeoZyhycgTask implements GeoDBTaskInterface | |||||
| private int SaveDeptData(SysDept dept, List<GeoZYHYCG> datas) | private int SaveDeptData(SysDept dept, List<GeoZYHYCG> datas) | ||||
| { | { | ||||
| importTask.logFile.WriteLine(TYPE_NAME + "开始处理数据: 区划代码={}, 条数={}", dept.getDeptName(), datas.size()); | importTask.logFile.WriteLine(TYPE_NAME + "开始处理数据: 区划代码={}, 条数={}", dept.getDeptName(), datas.size()); | ||||
| List<TResourceOperation> databases = LoadDatabase(dept.getImportCode()); | |||||
| Map<String, TResourceOperation> exists = databases.stream().collect(Collectors.toMap(TResourceOperation::getDkbm, x->x)); | |||||
| boolean needCheck = !ImportType.IT_OVERRIDE.equals(importTask.taskImport.getImportType()); | |||||
| Map<String, TResourceOperation> exists = null; | |||||
| if(needCheck) | |||||
| { | |||||
| List<TResourceOperation> databases = LoadDatabase(dept.getImportCode()); | |||||
| exists = databases.stream().collect(Collectors.toMap(TResourceOperation::getDkbm, x->x)); | |||||
| } | |||||
| List<TResourceOperation> insertList = new ArrayList<>(); | List<TResourceOperation> insertList = new ArrayList<>(); | ||||
| List<TResourceOperation> updateList = new ArrayList<>(); | List<TResourceOperation> updateList = new ArrayList<>(); | ||||
| for(GeoZYHYCG data : datas) | for(GeoZYHYCG data : datas) | ||||
| { | { | ||||
| TResourceOperation db = exists.get(data.DKBM); | |||||
| boolean notExists = null == db; | |||||
| db = ConvertData(data, db, dept); | |||||
| if(notExists) | |||||
| insertList.add(db); | |||||
| TResourceOperation db = null; | |||||
| if(needCheck) | |||||
| { | |||||
| db = exists.get(data.DKBM); | |||||
| } | |||||
| TResourceOperation item = ConvertData(data, db, dept); | |||||
| if(null == db) | |||||
| insertList.add(item); | |||||
| else | else | ||||
| updateList.add(db); | |||||
| updateList.add(item); | |||||
| } | } | ||||
| CleanDatabase(dept.getImportCode()); | CleanDatabase(dept.getImportCode()); | ||||
| @@ -0,0 +1,268 @@ | |||||
| package com.ruoyi.geo.service; | |||||
| import cn.hutool.core.io.FileUtil; | |||||
| import cn.hutool.core.io.file.FileNameUtil; | |||||
| import cn.hutool.core.lang.Assert; | |||||
| import cn.hutool.extra.servlet.ServletUtil; | |||||
| import com.ruoyi.business.domain.TTaskExport; | |||||
| import com.ruoyi.business.mapper.TTaskExportMapper; | |||||
| import com.ruoyi.common.constant.HttpStatus; | |||||
| import com.ruoyi.common.utils.StringUtils; | |||||
| import com.ruoyi.common.utils.sql.DB; | |||||
| import com.ruoyi.geo.config.GeoExportTaskConfig; | |||||
| import com.ruoyi.geo.constants.GeoSysDir; | |||||
| import com.ruoyi.geo.framework.GeoExportTask; | |||||
| import com.ruoyi.geo.framework.GeoTaskQueue; | |||||
| import com.ruoyi.geo.object.GeoLogInfo; | |||||
| import com.ruoyi.system.mapper.SysDeptMapper; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.springframework.stereotype.Service; | |||||
| import javax.annotation.PostConstruct; | |||||
| import javax.annotation.PreDestroy; | |||||
| import javax.annotation.Resource; | |||||
| import javax.servlet.http.HttpServletResponse; | |||||
| import java.io.File; | |||||
| import java.io.UnsupportedEncodingException; | |||||
| import java.net.URLEncoder; | |||||
| import java.nio.charset.StandardCharsets; | |||||
| import java.util.List; | |||||
| import java.util.stream.Collectors; | |||||
| import static com.ruoyi.business.constants.TaskEnums.TaskStatus; | |||||
| @Service | |||||
| @Slf4j | |||||
| public class GeoExportHandlerService | |||||
| { | |||||
| @Resource | |||||
| private SysDeptMapper deptMapper; | |||||
| @Resource | |||||
| private TTaskExportMapper taskExportMapper; | |||||
| private GeoTaskQueue taskQueue; | |||||
| private synchronized GeoTaskQueue TaskQueue() | |||||
| { | |||||
| if(null == taskQueue) | |||||
| taskQueue = new GeoTaskQueue(true); | |||||
| return taskQueue; | |||||
| } | |||||
| @PostConstruct | |||||
| public synchronized void Init() | |||||
| { | |||||
| SyncTask(); | |||||
| LoadTask(); | |||||
| } | |||||
| @PreDestroy | |||||
| public synchronized void Shutdown() | |||||
| { | |||||
| if(null != taskQueue) | |||||
| taskQueue.Quit(); | |||||
| } | |||||
| private void SyncTask() | |||||
| { | |||||
| log.info("更改运行中的任务状态为中止......"); | |||||
| // 更改运行中的任务状态为中止 | |||||
| int i = taskExportMapper.terminateRunningTask(); | |||||
| log.info("已设置运行中的任务状态为中止: " + i); | |||||
| } | |||||
| private void LoadTask() | |||||
| { | |||||
| if(!GeoExportTaskConfig.startOnBoot) | |||||
| return; | |||||
| log.info("拉取排队中的任务......"); | |||||
| TTaskExport cond = new TTaskExport(); | |||||
| cond.setTaskStatus(TaskStatus.ST_WAIT); | |||||
| List<TTaskExport> taskExports = taskExportMapper.selectTTaskExportList(cond); | |||||
| log.info("拉取到排队中的任务: " + taskExports.size()); | |||||
| List<Runnable> tasks = taskExports.stream().map((x) -> new GeoExportTask(x.getId())).collect(Collectors.toList()); | |||||
| if(!tasks.isEmpty()) | |||||
| TaskQueue().StartTask(tasks); | |||||
| } | |||||
| public GeoLogInfo loadExportLog(Long taskId, int offset) | |||||
| { | |||||
| GeoLogInfo info = new GeoLogInfo(); | |||||
| info.setNextPollDelay(GeoExportTaskConfig.logNextPoll); | |||||
| TTaskExport taskExport = taskExportMapper.selectTTaskExportById(taskId); | |||||
| Assert.notNull(taskExport, "导出任务不存在"); | |||||
| info.setTaskStatus(taskExport.getTaskStatus()); | |||||
| if(TaskStatus.ST_READY.equals(taskExport.getTaskStatus())/* || TaskStatus.ST_WAIT.equals(taskExport.getTaskStatus())*/) | |||||
| { | |||||
| info.setEof(true); | |||||
| info.setLength(-1); | |||||
| return info; | |||||
| } | |||||
| String path = GeoSysDir.ExportDir(GeoSysDir.LOG) + "/" + taskId + ".log"; | |||||
| if(!FileUtil.isFile(path)) | |||||
| { | |||||
| info.setEof(true); | |||||
| info.setLength(-1); | |||||
| return info; | |||||
| } | |||||
| info.setEof(!TaskStatus.ST_RUNNING.equals(info.getTaskStatus()) && !TaskStatus.ST_WAIT.equals(info.getTaskStatus())); | |||||
| String str = FileUtil.readUtf8String(path); | |||||
| info.setLength(str.length()); | |||||
| String text; | |||||
| if(offset >= str.length() - 1) | |||||
| text = ""; | |||||
| else if(offset > 0) | |||||
| text = str.substring(offset); | |||||
| else | |||||
| text = str; | |||||
| info.setText(text); | |||||
| return info; | |||||
| } | |||||
| public synchronized int startTask(Long id) | |||||
| { | |||||
| if(null != taskQueue) | |||||
| { | |||||
| GeoExportTask task = (GeoExportTask)taskQueue.GetCurrentTask(); | |||||
| Assert.isFalse(null != task && task.GetTaskId().equals(id), "任务正在执行"); | |||||
| boolean exists = null != taskQueue.FindTask((x) -> { | |||||
| GeoExportTask t = (GeoExportTask) x; | |||||
| return(t.GetTaskId().equals(id)); | |||||
| }); | |||||
| Assert.isFalse(exists, "任务已在队列中"); | |||||
| } | |||||
| Object handler = DB.BeginTransaction(); | |||||
| try | |||||
| { | |||||
| TTaskExport taskExport = taskExportMapper.getForUpdate(id); | |||||
| Assert.notNull(taskExport, "任务不存在"); | |||||
| Assert.isTrue(TaskStatus.ST_READY.equals(taskExport.getTaskStatus()), "任务非准备状态"); | |||||
| taskExport.setTaskStatus(TaskStatus.ST_WAIT); | |||||
| taskExportMapper.updateTTaskExport(taskExport); | |||||
| DB.CommitTransaction(handler); | |||||
| } | |||||
| catch(Exception e) | |||||
| { | |||||
| e.printStackTrace(); | |||||
| DB.RollbackTransaction(handler); | |||||
| return 0; | |||||
| } | |||||
| int ret = null != taskQueue && taskQueue.HasTask() ? 1 : 2; | |||||
| TaskQueue().StartTask(new GeoExportTask(id)); | |||||
| return ret; | |||||
| } | |||||
| public void downloadLog(Long taskId, HttpServletResponse response) | |||||
| { | |||||
| String path = GeoSysDir.ExportDir(GeoSysDir.LOG) + "/" + taskId + ".log"; | |||||
| String dlFileName; | |||||
| try | |||||
| { | |||||
| dlFileName = URLEncoder.encode(FileNameUtil.getName(path), "UTF-8"); | |||||
| } | |||||
| catch(UnsupportedEncodingException e) | |||||
| { | |||||
| e.printStackTrace(); | |||||
| dlFileName = ""; | |||||
| } | |||||
| int bytes = 0; | |||||
| response.reset(); | |||||
| response.addHeader("Access-Control-Allow-Origin", "*"); | |||||
| response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); | |||||
| response.setHeader("Content-Disposition", "attachment; filename=\"" + dlFileName + "\""); | |||||
| response.setContentType("application/octet-stream; charset=UTF-8"); | |||||
| TTaskExport taskExport = taskExportMapper.selectTTaskExportById(taskId); | |||||
| if(null == taskExport) | |||||
| { | |||||
| response.setStatus(HttpStatus.NOT_FOUND); | |||||
| ServletUtil.write(response, "导出任务不存在", "application/octet-stream; charset=UTF-8"); | |||||
| bytes = "导出任务不存在".getBytes(StandardCharsets.UTF_8).length; | |||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | |||||
| File file = new File(path); | |||||
| if(!file.isFile()) | |||||
| { | |||||
| response.setStatus(HttpStatus.NOT_FOUND); | |||||
| ServletUtil.write(response, "日志文件不存在", "application/octet-stream; charset=UTF-8"); | |||||
| bytes = "日志文件不存在".getBytes(StandardCharsets.UTF_8).length; | |||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | |||||
| ServletUtil.write(response, file); | |||||
| response.addHeader("Content-Length", "" + file.length()); | |||||
| } | |||||
| public void downloadFile(Long taskId, HttpServletResponse response) | |||||
| { | |||||
| int bytes = 0; | |||||
| response.reset(); | |||||
| response.addHeader("Access-Control-Allow-Origin", "*"); | |||||
| response.addHeader("Access-Control-Expose-Headers", "Content-Disposition"); | |||||
| response.setHeader("Content-Disposition", "attachment; filename=\"" + taskId + ".zip\""); | |||||
| response.setContentType("application/octet-stream; charset=UTF-8"); | |||||
| TTaskExport taskExport = taskExportMapper.selectTTaskExportById(taskId); | |||||
| if(null == taskExport) | |||||
| { | |||||
| response.setStatus(HttpStatus.NOT_FOUND); | |||||
| ServletUtil.write(response, "导出任务不存在", "application/octet-stream; charset=UTF-8"); | |||||
| bytes = "导出任务不存在".getBytes(StandardCharsets.UTF_8).length; | |||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | |||||
| if(!TaskStatus.ST_FINISH.equals(taskExport.getTaskStatus())) | |||||
| { | |||||
| response.setStatus(HttpStatus.FORBIDDEN); | |||||
| ServletUtil.write(response, "导出任务未完成", "application/octet-stream; charset=UTF-8"); | |||||
| bytes = "导出任务未完成".getBytes(StandardCharsets.UTF_8).length; | |||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | |||||
| if(StringUtils.isEmpty(taskExport.getFileUrl())) | |||||
| { | |||||
| response.setStatus(HttpStatus.NOT_FOUND); | |||||
| ServletUtil.write(response, "导出文件未生成", "application/octet-stream; charset=UTF-8"); | |||||
| bytes = "导出文件未生成".getBytes(StandardCharsets.UTF_8).length; | |||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | |||||
| String path = GeoSysDir.GetDir(GeoSysDir.TrimProfile(taskExport.getFileUrl())); | |||||
| String dlFileName; | |||||
| try | |||||
| { | |||||
| dlFileName = URLEncoder.encode(FileNameUtil.getName(path), "UTF-8"); | |||||
| } | |||||
| catch(UnsupportedEncodingException e) | |||||
| { | |||||
| e.printStackTrace(); | |||||
| dlFileName = ""; | |||||
| } | |||||
| response.setHeader("Content-Disposition", "attachment; filename=\"" + dlFileName + "\""); | |||||
| File file = new File(path); | |||||
| if(!file.isFile()) | |||||
| { | |||||
| ServletUtil.write(response, "导出文件不存在", "application/octet-stream; charset=UTF-8"); | |||||
| bytes = "导出文件不存在".getBytes(StandardCharsets.UTF_8).length; | |||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | |||||
| ServletUtil.write(response, file); | |||||
| response.addHeader("Content-Length", "" + file.length()); | |||||
| } | |||||
| } | |||||
| @@ -6,7 +6,9 @@ import cn.hutool.core.lang.Assert; | |||||
| import cn.hutool.extra.servlet.ServletUtil; | import cn.hutool.extra.servlet.ServletUtil; | ||||
| import com.ruoyi.business.domain.TTaskImport; | import com.ruoyi.business.domain.TTaskImport; | ||||
| import com.ruoyi.business.mapper.TGisCjqyMapper; | import com.ruoyi.business.mapper.TGisCjqyMapper; | ||||
| import com.ruoyi.business.mapper.TTaskExportMapper; | |||||
| import com.ruoyi.business.mapper.TTaskImportMapper; | import com.ruoyi.business.mapper.TTaskImportMapper; | ||||
| import com.ruoyi.common.constant.HttpStatus; | |||||
| import com.ruoyi.common.utils.sql.DB; | import com.ruoyi.common.utils.sql.DB; | ||||
| import com.ruoyi.geo.config.GeoImportTaskConfig; | import com.ruoyi.geo.config.GeoImportTaskConfig; | ||||
| import com.ruoyi.geo.constants.GeoSysDir; | import com.ruoyi.geo.constants.GeoSysDir; | ||||
| @@ -38,57 +40,11 @@ public class GeoImportHandlerService | |||||
| { | { | ||||
| @Resource | @Resource | ||||
| private SysDeptMapper deptMapper; | private SysDeptMapper deptMapper; | ||||
| private static TTaskImportMapper taskImportMapper; | |||||
| private static TGisCjqyMapper gisCjqyMapper; | |||||
| private static TResourceLandMapper resourceLandMapper; | |||||
| private static TResourceOperationMapper resourceOperationMapper; | |||||
| @Resource | |||||
| private TTaskImportMapper taskImportMapper; | |||||
| private GeoTaskQueue taskQueue; | private GeoTaskQueue taskQueue; | ||||
| @Autowired | |||||
| public void setTaskImportMapper(TTaskImportMapper taskImportMapper) | |||||
| { | |||||
| GeoImportHandlerService.taskImportMapper = taskImportMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setGisCjqyMapper(TGisCjqyMapper gisCjqyMapper) | |||||
| { | |||||
| GeoImportHandlerService.gisCjqyMapper = gisCjqyMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setResourceLandMapper(TResourceLandMapper resourceLandMapper) | |||||
| { | |||||
| GeoImportHandlerService.resourceLandMapper = resourceLandMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setResourceOperationMapper(TResourceOperationMapper resourceOperationMapper) | |||||
| { | |||||
| GeoImportHandlerService.resourceOperationMapper = resourceOperationMapper; | |||||
| } | |||||
| public static TTaskImportMapper TaskImportMapper() | |||||
| { | |||||
| return taskImportMapper; | |||||
| } | |||||
| public static TGisCjqyMapper GisCjqyMapper() | |||||
| { | |||||
| return gisCjqyMapper; | |||||
| } | |||||
| public static TResourceLandMapper ResourceLandMapper() | |||||
| { | |||||
| return resourceLandMapper; | |||||
| } | |||||
| public static TResourceOperationMapper ResourceOperationMapper() | |||||
| { | |||||
| return resourceOperationMapper; | |||||
| } | |||||
| private synchronized GeoTaskQueue TaskQueue() | private synchronized GeoTaskQueue TaskQueue() | ||||
| { | { | ||||
| if(null == taskQueue) | if(null == taskQueue) | ||||
| @@ -133,7 +89,7 @@ public class GeoImportHandlerService | |||||
| TaskQueue().StartTask(tasks); | TaskQueue().StartTask(tasks); | ||||
| } | } | ||||
| public GeoLogInfo GetImportLog(Long taskId, int offset) | |||||
| public GeoLogInfo loadImportLog(Long taskId, int offset) | |||||
| { | { | ||||
| GeoLogInfo info = new GeoLogInfo(); | GeoLogInfo info = new GeoLogInfo(); | ||||
| info.setNextPollDelay(GeoImportTaskConfig.logNextPoll); | info.setNextPollDelay(GeoImportTaskConfig.logNextPoll); | ||||
| @@ -170,7 +126,7 @@ public class GeoImportHandlerService | |||||
| return info; | return info; | ||||
| } | } | ||||
| public synchronized int StartTask(Long id) | |||||
| public synchronized int startTask(Long id) | |||||
| { | { | ||||
| if(null != taskQueue) | if(null != taskQueue) | ||||
| { | { | ||||
| @@ -205,7 +161,7 @@ public class GeoImportHandlerService | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| public void DownloadLog(Long taskId, HttpServletResponse response) | |||||
| public void downloadLog(Long taskId, HttpServletResponse response) | |||||
| { | { | ||||
| String path = GeoSysDir.ImportDir(GeoSysDir.LOG) + "/" + taskId + ".log"; | String path = GeoSysDir.ImportDir(GeoSysDir.LOG) + "/" + taskId + ".log"; | ||||
| String dlFileName; | String dlFileName; | ||||
| @@ -230,18 +186,24 @@ public class GeoImportHandlerService | |||||
| TTaskImport taskImport = taskImportMapper.selectTTaskImportById(taskId); | TTaskImport taskImport = taskImportMapper.selectTTaskImportById(taskId); | ||||
| if(null == taskImport) | if(null == taskImport) | ||||
| { | { | ||||
| response.setStatus(HttpStatus.NOT_FOUND); | |||||
| ServletUtil.write(response, "导入任务不存在", "application/octet-stream; charset=UTF-8"); | ServletUtil.write(response, "导入任务不存在", "application/octet-stream; charset=UTF-8"); | ||||
| bytes = "导入任务不存在".getBytes(StandardCharsets.UTF_8).length; | bytes = "导入任务不存在".getBytes(StandardCharsets.UTF_8).length; | ||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | } | ||||
| File file = new File(path); | File file = new File(path); | ||||
| if(!file.isFile()) | if(!file.isFile()) | ||||
| { | { | ||||
| response.setStatus(HttpStatus.NOT_FOUND); | |||||
| ServletUtil.write(response, "日志文件不存在", "application/octet-stream; charset=UTF-8"); | ServletUtil.write(response, "日志文件不存在", "application/octet-stream; charset=UTF-8"); | ||||
| bytes = "日志文件不存在".getBytes(StandardCharsets.UTF_8).length; | bytes = "日志文件不存在".getBytes(StandardCharsets.UTF_8).length; | ||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| return; | |||||
| } | } | ||||
| ServletUtil.write(response, file); | ServletUtil.write(response, file); | ||||
| response.addHeader("Content-Length", "" + bytes); | |||||
| response.addHeader("Content-Length", "" + file.length()); | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,92 @@ | |||||
| package com.ruoyi.geo.service; | |||||
| import com.ruoyi.business.mapper.TGisCjqyMapper; | |||||
| import com.ruoyi.business.mapper.TTaskExportMapper; | |||||
| import com.ruoyi.business.mapper.TTaskImportMapper; | |||||
| import com.ruoyi.resource.mapper.TResourceLandMapper; | |||||
| import com.ruoyi.resource.mapper.TResourceOperationMapper; | |||||
| import com.ruoyi.system.mapper.SysDeptMapper; | |||||
| import lombok.extern.slf4j.Slf4j; | |||||
| import org.springframework.beans.factory.annotation.Autowired; | |||||
| import org.springframework.stereotype.Service; | |||||
| import javax.annotation.Resource; | |||||
| @Service | |||||
| @Slf4j | |||||
| public class GeoMapperService | |||||
| { | |||||
| private static SysDeptMapper deptMapper; | |||||
| private static TTaskImportMapper taskImportMapper; | |||||
| private static TTaskExportMapper taskExportMapper; | |||||
| private static TGisCjqyMapper gisCjqyMapper; | |||||
| private static TResourceLandMapper resourceLandMapper; | |||||
| private static TResourceOperationMapper resourceOperationMapper; | |||||
| @Autowired | |||||
| public void setTaskImportMapper(TTaskImportMapper taskImportMapper) | |||||
| { | |||||
| GeoMapperService.taskImportMapper = taskImportMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setTaskExportMapper(TTaskExportMapper taskExportMapper) | |||||
| { | |||||
| GeoMapperService.taskExportMapper = taskExportMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setGisCjqyMapper(TGisCjqyMapper gisCjqyMapper) | |||||
| { | |||||
| GeoMapperService.gisCjqyMapper = gisCjqyMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setResourceLandMapper(TResourceLandMapper resourceLandMapper) | |||||
| { | |||||
| GeoMapperService.resourceLandMapper = resourceLandMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setResourceOperationMapper(TResourceOperationMapper resourceOperationMapper) | |||||
| { | |||||
| GeoMapperService.resourceOperationMapper = resourceOperationMapper; | |||||
| } | |||||
| @Autowired | |||||
| public void setSysDeptMapper(SysDeptMapper deptMapper) | |||||
| { | |||||
| GeoMapperService.deptMapper = deptMapper; | |||||
| } | |||||
| public static TTaskImportMapper TaskImportMapper() | |||||
| { | |||||
| return taskImportMapper; | |||||
| } | |||||
| public static TTaskExportMapper TaskExportMapper() | |||||
| { | |||||
| return taskExportMapper; | |||||
| } | |||||
| public static TGisCjqyMapper GisCjqyMapper() | |||||
| { | |||||
| return gisCjqyMapper; | |||||
| } | |||||
| public static TResourceLandMapper ResourceLandMapper() | |||||
| { | |||||
| return resourceLandMapper; | |||||
| } | |||||
| public static TResourceOperationMapper ResourceOperationMapper() | |||||
| { | |||||
| return resourceOperationMapper; | |||||
| } | |||||
| public static SysDeptMapper DeptMapper() | |||||
| { | |||||
| return deptMapper; | |||||
| } | |||||
| } | |||||
| @@ -153,4 +153,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | |||||
| #{id} | #{id} | ||||
| </foreach> | </foreach> | ||||
| </delete> | </delete> | ||||
| <update id="terminateRunningTask"> | |||||
| update t_task_export | |||||
| set task_status = '5' | |||||
| where task_status = '2' | |||||
| </update> | |||||
| <select id="getForUpdate" parameterType="Long" resultMap="TTaskExportResult"> | |||||
| <include refid="selectTTaskExportVo"/> | |||||
| where id = #{id} FOR UPDATE | |||||
| </select> | |||||
| </mapper> | </mapper> | ||||
| @@ -2,6 +2,7 @@ package com.ruoyi.common.core.domain.entity; | |||||
| import com.ruoyi.common.annotation.Excel; | import com.ruoyi.common.annotation.Excel; | ||||
| import com.ruoyi.common.core.domain.BaseEntity; | import com.ruoyi.common.core.domain.BaseEntity; | ||||
| import lombok.Data; | |||||
| import org.apache.commons.lang3.builder.ToStringBuilder; | import org.apache.commons.lang3.builder.ToStringBuilder; | ||||
| import org.apache.commons.lang3.builder.ToStringStyle; | import org.apache.commons.lang3.builder.ToStringStyle; | ||||
| @@ -17,6 +18,7 @@ import java.util.List; | |||||
| * | * | ||||
| * @author ruoyi | * @author ruoyi | ||||
| */ | */ | ||||
| @Data | |||||
| public class SysDept extends BaseEntity | public class SysDept extends BaseEntity | ||||
| { | { | ||||
| private static final long serialVersionUID = 1L; | private static final long serialVersionUID = 1L; | ||||
| @@ -74,6 +76,10 @@ public class SysDept extends BaseEntity | |||||
| private List<SysDept> children = new ArrayList<SysDept>(); | private List<SysDept> children = new ArrayList<SysDept>(); | ||||
| /** 祖先ID */ | |||||
| private Long rootId; | |||||
| public Long getDeptId() | public Long getDeptId() | ||||
| { | { | ||||
| @@ -0,0 +1,160 @@ | |||||
| package com.ruoyi.common.geo; | |||||
| import cn.hutool.core.util.ClassUtil; | |||||
| import org.locationtech.jts.geom.GeometryFactory; | |||||
| import org.locationtech.jts.geom.LineString; | |||||
| import org.locationtech.jts.geom.LinearRing; | |||||
| import org.locationtech.jts.geom.MultiLineString; | |||||
| import org.locationtech.jts.geom.MultiPoint; | |||||
| import org.locationtech.jts.geom.MultiPolygon; | |||||
| import org.locationtech.jts.geom.Point; | |||||
| import org.locationtech.jts.geom.Polygon; | |||||
| import org.locationtech.jts.io.ParseException; | |||||
| import org.locationtech.jts.io.WKTReader; | |||||
| import java.lang.reflect.Field; | |||||
| import java.lang.reflect.Modifier; | |||||
| import java.util.HashMap; | |||||
| import java.util.Map; | |||||
| public final class GeoCreator | |||||
| { | |||||
| private static GeoCreator geometryCreator = null; | |||||
| private static GeometryFactory geometryFactory = new GeometryFactory(); | |||||
| private GeoCreator() { | |||||
| } | |||||
| /** | |||||
| * 1.2根据几何对象的WKT描述【String】创建几何对象: 点 【Point】 | |||||
| * @return | |||||
| * @throws ParseException | |||||
| */ | |||||
| public static Point PointByWKT(String PointWKT) { | |||||
| WKTReader reader = new WKTReader(geometryFactory); | |||||
| try | |||||
| { | |||||
| return (Point) reader.read(PointWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 1.3根据几何对象的WKT描述【String】创建几何对象:多点 【MultiPoint】 | |||||
| * @return | |||||
| * @throws ParseException | |||||
| */ | |||||
| public static MultiPoint MultiPointByWKT(String MPointWKT) { | |||||
| WKTReader reader = new WKTReader( geometryFactory ); | |||||
| try | |||||
| { | |||||
| return (MultiPoint) reader.read(MPointWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| public static LineString LineStringByWKT(String LineStringWKT) { | |||||
| WKTReader reader = new WKTReader( geometryFactory ); | |||||
| try | |||||
| { | |||||
| return (LineString) reader.read(LineStringWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 2.4根据几何对象的WKT描述【String】创建几何对象 : 多线【MultiLineString】 | |||||
| * @param MLineStringWKT | |||||
| * @return | |||||
| * @throws ParseException | |||||
| */ | |||||
| public static MultiLineString MultiLineByWKT(String MLineStringWKT) { | |||||
| WKTReader reader = new WKTReader( geometryFactory ); | |||||
| try | |||||
| { | |||||
| return (MultiLineString) reader.read(MLineStringWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 3.1 根据几何对象的WKT描述【String】创建几何对象:多边形 【Polygon】 | |||||
| * @param PolygonWKT | |||||
| * @return | |||||
| * @throws ParseException | |||||
| */ | |||||
| public static Polygon PolygonByWKT(String PolygonWKT) { | |||||
| WKTReader reader = new WKTReader( geometryFactory ); | |||||
| try | |||||
| { | |||||
| return (Polygon) reader.read(PolygonWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 3.2 根据几何对象的WKT描述【String】创建几何对象: 多多边形 【MultiPolygon】 | |||||
| * @param MPolygonWKT | |||||
| * @return | |||||
| * @throws ParseException | |||||
| */ | |||||
| public static MultiPolygon MultiPolygonByWKT(String MPolygonWKT) { | |||||
| WKTReader reader = new WKTReader( geometryFactory ); | |||||
| try | |||||
| { | |||||
| return (MultiPolygon) reader.read(MPolygonWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| /** | |||||
| * 6.1 根据WKT创建环 | |||||
| * @param ringWKT | |||||
| * @return | |||||
| * @throws ParseException | |||||
| */ | |||||
| public static LinearRing LinearRingByWKT(String ringWKT) { | |||||
| WKTReader reader = new WKTReader( geometryFactory ); | |||||
| try | |||||
| { | |||||
| return (LinearRing) reader.read(ringWKT); | |||||
| } | |||||
| catch(ParseException e) | |||||
| { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| public static Map<String, Class<?>> GetClassTypes(Class<?> clazz) | |||||
| { | |||||
| Field[] fields = clazz.getDeclaredFields(); | |||||
| Map<String, Class<?>> ret = new HashMap<>(); | |||||
| for(Field field : fields) | |||||
| { | |||||
| int modifiers = field.getModifiers(); | |||||
| if(Modifier.isStatic(modifiers) || Modifier.isFinal(modifiers) || !Modifier.isPublic(modifiers)) | |||||
| continue; | |||||
| ret.put(field.getName(), field.getType()); | |||||
| } | |||||
| return ret; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,278 @@ | |||||
| package com.ruoyi.common.geo; | |||||
| import cn.hutool.core.bean.BeanUtil; | |||||
| import cn.hutool.core.bean.copier.CopyOptions; | |||||
| import cn.hutool.core.io.IoUtil; | |||||
| import cn.hutool.core.lang.Assert; | |||||
| import org.geotools.data.FeatureWriter; | |||||
| import org.geotools.data.Transaction; | |||||
| import org.geotools.data.shapefile.ShapefileDataStore; | |||||
| import org.geotools.data.shapefile.ShapefileDataStoreFactory; | |||||
| import org.geotools.data.simple.SimpleFeatureIterator; | |||||
| import org.geotools.data.simple.SimpleFeatureSource; | |||||
| import org.geotools.feature.simple.SimpleFeatureTypeBuilder; | |||||
| import org.geotools.referencing.crs.DefaultGeographicCRS; | |||||
| import org.locationtech.jts.geom.Geometry; | |||||
| import org.locationtech.jts.geom.LineString; | |||||
| import org.locationtech.jts.geom.LinearRing; | |||||
| import org.locationtech.jts.geom.MultiLineString; | |||||
| import org.locationtech.jts.geom.MultiPoint; | |||||
| import org.locationtech.jts.geom.MultiPolygon; | |||||
| import org.locationtech.jts.geom.Point; | |||||
| import org.locationtech.jts.geom.Polygon; | |||||
| import org.opengis.feature.simple.SimpleFeature; | |||||
| import org.opengis.feature.simple.SimpleFeatureType; | |||||
| import org.opengis.feature.type.AttributeDescriptor; | |||||
| import java.io.Closeable; | |||||
| import java.io.File; | |||||
| import java.io.Serializable; | |||||
| import java.nio.charset.Charset; | |||||
| import java.util.ArrayList; | |||||
| import java.util.Arrays; | |||||
| import java.util.HashMap; | |||||
| import java.util.LinkedHashMap; | |||||
| import java.util.List; | |||||
| import java.util.Map; | |||||
| import java.util.Set; | |||||
| import java.util.stream.Collectors; | |||||
| public final class GeoWriter implements Closeable | |||||
| { | |||||
| private ShapefileDataStore dataStore; | |||||
| private FeatureWriter<SimpleFeatureType, SimpleFeature> writer; | |||||
| private SimpleFeatureSource source; | |||||
| private Map<String, Class<?>> columnMap; | |||||
| public GeoWriter() | |||||
| { | |||||
| } | |||||
| public void Init() | |||||
| { | |||||
| } | |||||
| @Override | |||||
| public void close() | |||||
| { | |||||
| CloseSource(); | |||||
| if(null != dataStore) | |||||
| { | |||||
| dataStore.dispose(); | |||||
| dataStore = null; | |||||
| } | |||||
| } | |||||
| public boolean Open(String path, String charsetName) | |||||
| { | |||||
| return Open(new File(path), charsetName); | |||||
| } | |||||
| public boolean Open(File file, String charsetName) | |||||
| { | |||||
| close(); | |||||
| try { | |||||
| Map<String, Serializable> params = new HashMap<>(); | |||||
| // 2、用于捕获参数需求的数据类 URLP:url to the .shp file. | |||||
| params.put(ShapefileDataStoreFactory.URLP.key, file.toURI().toURL()); | |||||
| dataStore = (ShapefileDataStore) new ShapefileDataStoreFactory().createNewDataStore(params); | |||||
| Charset charset = Charset.forName(charsetName); | |||||
| dataStore.setCharset(charset); | |||||
| return true; | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| return false; | |||||
| } | |||||
| } | |||||
| private void CheckDataStore() | |||||
| { | |||||
| Assert.notNull(dataStore, "请先打开"); | |||||
| } | |||||
| private void CheckWriter() | |||||
| { | |||||
| Assert.notNull(writer, "请先打开写入"); | |||||
| } | |||||
| public void AddSchema(String name, Map<String, Class<?>> parms) | |||||
| { | |||||
| CheckDataStore(); | |||||
| try { | |||||
| SimpleFeatureTypeBuilder tBuilder = new SimpleFeatureTypeBuilder(); | |||||
| // 5、设置 -- WGS84:一个二维地理坐标参考系统,使用WGS84数据 | |||||
| tBuilder.setCRS(DefaultGeographicCRS.WGS84); | |||||
| tBuilder.setName(name); | |||||
| parms.forEach(tBuilder::add); | |||||
| dataStore.createSchema(tBuilder.buildFeatureType()); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| } | |||||
| } | |||||
| public boolean SetSource(String typeName, boolean append) | |||||
| { | |||||
| CloseSource(); | |||||
| CheckDataStore(); | |||||
| try { | |||||
| if(append) | |||||
| writer = dataStore.getFeatureWriterAppend(typeName, Transaction.AUTO_COMMIT); | |||||
| else | |||||
| writer = dataStore.getFeatureWriter(typeName, Transaction.AUTO_COMMIT); | |||||
| source = dataStore.getFeatureSource(typeName); | |||||
| return InitSource(); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| return false; | |||||
| } | |||||
| } | |||||
| public List<String> GetTypeNames() | |||||
| { | |||||
| CheckDataStore(); | |||||
| try { | |||||
| return Arrays.stream(dataStore.getTypeNames()).collect(Collectors.toList()); | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| return null; | |||||
| } | |||||
| } | |||||
| public boolean SetSource(int index, boolean append) | |||||
| { | |||||
| CloseSource(); | |||||
| if(index < 0) | |||||
| return true; | |||||
| CheckDataStore(); | |||||
| return SetSource(GetTypeNames().get(index), append); | |||||
| } | |||||
| private void CloseSource() | |||||
| { | |||||
| columnMap = null; | |||||
| if(null != writer) | |||||
| { | |||||
| IoUtil.close(writer); | |||||
| writer = null; | |||||
| } | |||||
| } | |||||
| private boolean InitSource() | |||||
| { | |||||
| if(null == writer) | |||||
| return false; | |||||
| try { | |||||
| if(null == columnMap) | |||||
| columnMap = new LinkedHashMap<>(); | |||||
| else | |||||
| columnMap.clear(); | |||||
| SimpleFeatureType schema = source.getSchema(); | |||||
| for(int i = 0; i < schema.getAttributeCount(); i++) | |||||
| { | |||||
| AttributeDescriptor descriptor = schema.getDescriptor(i); | |||||
| columnMap.put(descriptor.getLocalName(), descriptor.getType().getBinding()); | |||||
| } | |||||
| return true; | |||||
| } catch (Exception e) { | |||||
| e.printStackTrace(); | |||||
| return false; | |||||
| } | |||||
| } | |||||
| public Object ConvertValue(Class<?> clazz, Object value) | |||||
| { | |||||
| if(Point.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof Point) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.PointByWKT(value.toString()); | |||||
| } | |||||
| else if(MultiPoint.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof MultiPoint) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.MultiPointByWKT(value.toString()); | |||||
| } | |||||
| else if(LineString.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof LineString) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.LineStringByWKT(value.toString()); | |||||
| } | |||||
| else if(MultiLineString.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof MultiLineString) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.MultiLineByWKT(value.toString()); | |||||
| } | |||||
| else if(Polygon.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof Polygon) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.PolygonByWKT(value.toString()); | |||||
| } | |||||
| else if(MultiPolygon.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof MultiPolygon) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.MultiPolygonByWKT(value.toString()); | |||||
| } | |||||
| else if(LinearRing.class.isAssignableFrom(clazz)) | |||||
| { | |||||
| if(value instanceof LinearRing) | |||||
| return value; | |||||
| else | |||||
| return GeoCreator.LinearRingByWKT(value.toString()); | |||||
| } | |||||
| else | |||||
| return value; | |||||
| } | |||||
| public void WriteMapList(List<Map<String, Object>> list) | |||||
| { | |||||
| CheckWriter(); | |||||
| try { | |||||
| Set<String> headers = columnMap.keySet(); | |||||
| for(Map<String, Object> map : list) | |||||
| { | |||||
| SimpleFeature feature = writer.next(); | |||||
| for(String header : headers) | |||||
| { | |||||
| Object value = map.get(header); | |||||
| if(null == value) | |||||
| continue; | |||||
| Class<?> clazz = columnMap.get(header); | |||||
| feature.setAttribute(header, ConvertValue(clazz, value)); | |||||
| } | |||||
| } | |||||
| writer.write(); | |||||
| } catch (Exception e) { | |||||
| throw new RuntimeException(e); | |||||
| } | |||||
| } | |||||
| public void WriteList(List<?> list) | |||||
| { | |||||
| List<Map<String, Object>> mapList = list.stream().map((x) -> BeanUtil.beanToMap(x, false, true)).collect(Collectors.toList()); | |||||
| WriteMapList(mapList); | |||||
| } | |||||
| } | |||||
| @@ -54,6 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" | |||||
| <if test="status != null and status != ''"> | <if test="status != null and status != ''"> | ||||
| AND status = #{status} | AND status = #{status} | ||||
| </if> | </if> | ||||
| <if test="rootId != null ">and (dept_id = #{rootId} OR dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{rootId}, ancestors) ))</if> | |||||
| <!-- 数据范围过滤 --> | <!-- 数据范围过滤 --> | ||||
| ${params.dataScope} | ${params.dataScope} | ||||
| </select> | </select> | ||||