liutao hai 2 semanas
pai
achega
83c3080792

+ 7 - 3
YHYZT/server/src/main/java/com/zjugis/yzt/beans/entity/SsnydNew.java

@@ -3,7 +3,6 @@ package com.zjugis.yzt.beans.entity;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.vividsolutions.jts.geom.Geometry;
 import lombok.Data;
 
 import java.util.Date;
@@ -38,10 +37,15 @@ public class SsnydNew {
     @TableField
     private String yt;
     /**
-     * 项目名称
+     * 项目索引
      */
     @TableField
     private String xmbh;
+    /**
+     * 项目名称
+     */
+    @TableField
+    private String xmmc;
     /**
      * 所在市
      */
@@ -58,5 +62,5 @@ public class SsnydNew {
     @TableField
     private Double bamj;
     @TableField
-    private Geometry shape;
+    private String shape;
 } 

+ 0 - 18
YHYZT/server/src/main/java/com/zjugis/yzt/beans/vo/SsnydVO.java

@@ -1,18 +0,0 @@
-package com.zjugis.yzt.beans.vo;
-
-import com.vividsolutions.jts.geom.Geometry;
-import lombok.Data;
-import java.util.Date;
-
-@Data
-public class SsnydVO {
-    private Integer objectid;   // 主键
-    private String bah;         // 备案号
-    private Date basj;          // 备案时间
-    private String yt;          // 用途
-    private String xmbh;        // 项目编号
-    private String szs;         // 所在市
-    private String xzq;         // 县区
-    private Double bamj;        // 备案面积
-    private Geometry shape;     // 空间数据
-} 

+ 39 - 33
YHYZT/server/src/main/java/com/zjugis/yzt/controller/SsnydController.java

@@ -6,48 +6,58 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.zjugis.yzt.service.SsnydService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-import com.zjugis.yzt.beans.vo.SsnydVO;
 import com.zjugis.yzt.beans.entity.SsnydNew;
 import org.springframework.beans.BeanUtils;
+
 import java.util.List;
 import java.util.Date;
+
 import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
 
 @RestController
 @RequestMapping("/api/ssnyd")
-public class SsnydController {
-    
+public class SsnydController extends BaseRestController {
+
     @Autowired
     private SsnydService ssnydService;
 
     /**
      * 获取设施农用地信息(分页)
-     * @param current 当前页码
-     * @param size 每页大小
-     * @param xmbh 项目编号
-     * @param bah 备案号
-     * @param yt 用途
-     * @param xzq 县区
+     *
+     * @param current   当前页码
+     * @param size      每页大小
+     * @param xmbh      项目编号
+     * @param xmmc      项目名称
+     * @param bah       备案号
+     * @param yt        用途
+     * @param xzq       县区
      * @param basjStart 备案时间开始
-     * @param basjEnd 备案时间结束
+     * @param basjEnd   备案时间结束
      * @return 分页结果
      */
     @GetMapping("/page")
-    public IPage<SsnydVO> getSsnydList(
+    public IPage<SsnydNew> getSsnydList(
             @RequestParam(defaultValue = "1") Integer current,
             @RequestParam(defaultValue = "10") Integer size,
             @RequestParam(required = false) String xmbh,
+            @RequestParam(required = false) String xmmc,
             @RequestParam(required = false) String bah,
             @RequestParam(required = false) String yt,
             @RequestParam(required = false) String xzq,
             @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date basjStart,
             @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") Date basjEnd) {
-        
+
         QueryWrapper<SsnydNew> queryWrapper = new QueryWrapper<>();
-        
+
         if (xmbh != null && !xmbh.isEmpty()) {
             queryWrapper.like("xmbh", xmbh);
         }
+        if (xmmc != null && !xmmc.isEmpty()) {
+            queryWrapper.like("xmmc", xmmc);
+        }
         if (bah != null && !bah.isEmpty()) {
             queryWrapper.like("bah", bah);
         }
@@ -66,27 +76,22 @@ public class SsnydController {
         }
 
         Page<SsnydNew> page = new Page<>(current, size);
-        IPage<SsnydNew> ssnydPage = ssnydService.page(page, queryWrapper);
-        
-        return ssnydPage.convert(this::convertToVO);
+        return ssnydService.page(page, queryWrapper);
     }
 
     /**
      * 根据ID获取设施农用地信息
      */
     @GetMapping("/{id}")
-    public SsnydVO getSsnydById(@PathVariable Integer id) {
-        SsnydNew ssnyd = ssnydService.getById(id);
-        return convertToVO(ssnyd);
+    public SsnydNew getSsnydById(@PathVariable Integer id) {
+        return ssnydService.getById(id);
     }
 
     /**
      * 新增设施农用地
      */
     @PostMapping("/add")
-    public boolean addSsnyd(@RequestBody SsnydVO ssnydVO) {
-        SsnydNew ssnyd = new SsnydNew();
-        BeanUtils.copyProperties(ssnydVO, ssnyd);
+    public boolean addSsnyd(@RequestBody SsnydNew ssnyd) {
         return ssnydService.save(ssnyd);
     }
 
@@ -94,12 +99,10 @@ public class SsnydController {
      * 更新设施农用地
      */
     @PostMapping("/update")
-    public boolean updateSsnyd(@RequestBody SsnydVO ssnydVO) {
-        if (ssnydVO.getObjectid() == null) {
+    public boolean updateSsnyd(@RequestBody SsnydNew ssnyd) {
+        if (ssnyd.getObjectid() == null) {
             return false;
         }
-        SsnydNew ssnyd = new SsnydNew();
-        BeanUtils.copyProperties(ssnydVO, ssnyd);
         return ssnydService.updateById(ssnyd);
     }
 
@@ -120,14 +123,17 @@ public class SsnydController {
     }
 
     /**
-     * 将实体对象转换为VO对象
+     * 上传zip包
+     * @param file
+     * @return
      */
-    private SsnydVO convertToVO(SsnydNew ssnyd) {
-        if (ssnyd == null) {
-            return null;
+    @PostMapping("/upload")
+    public Map upload(@RequestParam("file") MultipartFile file) {
+        List<String> errorList = ssnydService.uploadSsnydData(file);
+        if (errorList == null || errorList.isEmpty()) {
+            return result(true);
+        } else {
+            return error("部分数据导入失败", ErrorCode.DEFAULT, errorList);
         }
-        SsnydVO vo = new SsnydVO();
-        BeanUtils.copyProperties(ssnyd, vo);
-        return vo;
     }
 } 

+ 1 - 1
YHYZT/server/src/main/java/com/zjugis/yzt/dao/SsnydNewMapper.java

@@ -19,7 +19,7 @@ public interface SsnydNewMapper extends BaseMapper<SsnydNew> {
      * @param wkid
      * @return
      */
-    @Update("UPDATE st_nzydk SET shape = st_geometry(#{shape}, #{wkid}) WHERE objectid = #{id}")
+    @Update("UPDATE ssnyd SET shape = st_geometry(#{shape}, #{wkid}) WHERE objectid = #{id}")
     int updateShapeById(Integer id, String shape, int wkid);
     
 }

+ 1 - 1
YHYZT/server/src/main/java/com/zjugis/yzt/dao/StGddkMapper.java

@@ -20,6 +20,6 @@ public interface StGddkMapper extends BaseMapper<StGddk> {
      * @param wkid
      * @return
      */
-    @Update("UPDATE st_nzydk SET shape = st_geometry(#{shape}, #{wkid}) WHERE objectid = #{id}")
+    @Update("UPDATE st_gddk SET shape = st_geometry(#{shape}, #{wkid}) WHERE objectid = #{id}")
     int updateShapeById(Integer id, String shape, int wkid);
 } 

+ 3 - 1
YHYZT/server/src/main/java/com/zjugis/yzt/service/SsnydService.java

@@ -4,9 +4,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zjugis.yzt.beans.entity.SsnydNew;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * 设施农用地Service接口
  */
 public interface SsnydService extends IService<SsnydNew> {
-    boolean uploadSsnydData(MultipartFile file);
+    List<String> uploadSsnydData(MultipartFile file);
 } 

+ 124 - 92
YHYZT/server/src/main/java/com/zjugis/yzt/service/impl/SsnydServiceImpl.java

@@ -1,31 +1,29 @@
 package com.zjugis.yzt.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zjugis.yzt.beans.entity.TempLand;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.zjugis.yzt.dao.SsnydNewMapper;
 import com.zjugis.yzt.beans.entity.SsnydNew;
-import com.zjugis.yzt.dao.TempLandMapper;
 import com.zjugis.yzt.service.SsnydService;
 import com.zjugis.yzt.utils.ExcelUtils;
 import com.zjugis.yzt.utils.geocomm.ParseResult;
 import com.zjugis.yzt.utils.geocomm.TxtReader;
+import com.zjugis.yzt.utils.ZipFileProcessor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
+import java.util.Locale;
+
 
 /**
  * 设施农用地Service实现类
@@ -35,58 +33,27 @@ import java.util.zip.ZipInputStream;
 public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> implements SsnydService {
 
     @Override
-    public boolean uploadSsnydData(MultipartFile zipFile) {
+    public List<String> uploadSsnydData(MultipartFile zipFile) {
+        List<String> errorList = new ArrayList<>();
         if (zipFile.isEmpty()) {
-            log.error("上传文件为空");
-            return false;
+            String msg = "上传文件为空";
+            log.error(msg);
+            errorList.add(msg);
+            return errorList;
         }
 
         File tempDir = null;
         try {
-            // 创建临时目录
-            tempDir = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
-            if (!tempDir.exists()) {
-                tempDir.mkdirs();
-            }
-
-            // 解压ZIP文件
-            Map<String, File> txtFiles = new HashMap<>();
-            File xlsFile = null;
-
-            try (ZipInputStream zis = new ZipInputStream(zipFile.getInputStream())) {
-                ZipEntry entry;
-                while ((entry = zis.getNextEntry()) != null) {
-                    String fileName = entry.getName();
-                    File file = new File(tempDir, fileName);
-
-                    // 创建父目录
-                    File parent = file.getParentFile();
-                    if (!parent.exists()) {
-                        parent.mkdirs();
-                    }
-
-                    // 写入文件
-                    try (FileOutputStream fos = new FileOutputStream(file)) {
-                        byte[] buffer = new byte[1024];
-                        int len;
-                        while ((len = zis.read(buffer)) > 0) {
-                            fos.write(buffer, 0, len);
-                        }
-                    }
-
-                    // 分类存储文件引用
-                    if (fileName.toLowerCase().endsWith(".xls") || fileName.toLowerCase().endsWith(".xlsx")) {
-                        xlsFile = file;
-                    } else if (fileName.toLowerCase().endsWith(".txt")) {
-                        String projectCode = fileName.substring(0, fileName.lastIndexOf("."));
-                        txtFiles.put(projectCode, file);
-                    }
-                }
-            }
+            ZipFileProcessor.ZipProcessResult zipProcessResult = ZipFileProcessor.processZipFile(zipFile);
+            Map<String, File> txtFiles = zipProcessResult.getTxtFiles();
+            File xlsFile = zipProcessResult.getXlsxFile();
+            tempDir = zipProcessResult.getTempDir();
 
             if (xlsFile == null) {
-                log.error("ZIP包中未找到Excel文件");
-                return false;
+                String msg = "ZIP包中未找到Excel文件";
+                log.error(msg);
+                errorList.add(msg);
+                return errorList;
             }
 
             // 读取Excel数据
@@ -98,67 +65,65 @@ public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> impl
             for (Map<String, Object> row : batchDataList) {
                 SsnydNew ssnydNew = new SsnydNew();
                 // 字段映射
-                ssnydNew.setXmbh(getString(row, "项目名称"));
-                ssnydNew.setBah(getString(row, "备案号")); 
+                ssnydNew.setXmmc(getString(row, "项目名称"));
+                ssnydNew.setBah(getString(row, "备案号"));
                 ssnydNew.setSzs(getString(row, "市"));
                 ssnydNew.setXzq(getString(row, "县区"));
                 ssnydNew.setYt(getString(row, "用途"));
                 ssnydNew.setBamj(getDouble(row, "备案面积"));
-
+                ssnydNew.setXmbh(getString(row, "项目索引"));
                 // 处理日期字段
-                String basjStr = getString(row, "备案时间");
-                if (basjStr != null) {
+                if (setBasj(errorList, row, ssnydNew)) continue;
+
+                // 保存前先删除已存在数据
+                String xmbh = ssnydNew.getXmbh();
+                if (xmbh != null) {
+                    QueryWrapper<SsnydNew> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("xmbh", xmbh);
                     try {
-                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
-                        ssnydNew.setBasj(sdf.parse(basjStr));
-                    } catch (ParseException e) {
-                        log.error("解析备案时间失败: {}", basjStr);
-                        return false;
+                        this.remove(queryWrapper);
+                    } catch (Exception e) {
+                        String msg = String.format("删除项目索引为 %s 的旧数据失败: %s", xmbh, e.getMessage());
+                        log.error(msg, e);
+                        errorList.add(msg);
                     }
                 }
 
                 // 先保存SsnydNew
-                if (!this.save(ssnydNew)) {
-                    log.error("保存设施农用地数据失败:{}", ssnydNew.getXmbh());
-                    return false;
+                try {
+                    if (!this.save(ssnydNew)) {
+                        String msg = String.format("保存设施农用地数据失败:%s", ssnydNew.getXmbh());
+                        log.error(msg);
+                        errorList.add(msg);
+                        continue;
+                    }
+                } catch (Exception e) {
+                    String msg = String.format("保存设施农用地数据异常:%s,错误:%s", ssnydNew.getXmbh(), e.getMessage());
+                    log.error(msg, e);
+                    errorList.add(msg);
+                    continue;
                 }
 
                 Integer objectId = ssnydNew.getObjectid();
                 if (objectId == null) {
-                    log.error("获取保存后的objectid失败:{}", ssnydNew.getXmbh());
-                    return false;
+                    String msg = String.format("获取保存后的objectid失败:%s", ssnydNew.getXmbh());
+                    log.error(msg);
+                    errorList.add(msg);
+                    continue;
                 }
 
                 // 解析txt为Geometry并持久化
                 String projectIndex = ssnydNew.getXmbh();
                 File txtFile = txtFiles.get(projectIndex);
-                if (txtFile != null) {
-                    try (FileInputStream txtInputStream = new FileInputStream(txtFile)) {
-                        TxtReader txtReader = new TxtReader(txtInputStream);
-                        ParseResult parseResult = txtReader.read();
-                        if (parseResult != null && parseResult.getGeometry() != null) {
-                            String wkt = parseResult.getGeometry().toText();
-                            // 使用updateShapeById更新shape字段
-                            int updateCount = ((SsnydNewMapper) this.baseMapper).updateShapeById(objectId, wkt, 4528);
-                            if (updateCount <= 0) {
-                                log.warn("项目索引 {} 的shape字段持久化失败。", projectIndex);
-                            }
-                        } else {
-                            log.warn("项目索引 {} 的TXT文件解析失败或未获取到Geometry数据。", projectIndex);
-                        }
-                    } catch (Exception e) {
-                        log.error("解析项目索引 {} 的TXT文件失败: {}", projectIndex, e.getMessage());
-                        return false;
-                    }
-                } else {
-                    log.warn("未找到项目索引 {} 对应的TXT界址点文件。", projectIndex);
-                }
+                updateShape(errorList, objectId, projectIndex, txtFile);
             }
 
-            return true;
+            return errorList;
         } catch (IOException e) {
-            log.error("处理上传文件失败", e);
-            return false;
+            String msg = "处理上传文件失败: " + e.getMessage();
+            log.error(msg, e);
+            errorList.add(msg);
+            return errorList;
         } finally {
             // 清理临时文件
             if (tempDir != null && tempDir.exists()) {
@@ -167,6 +132,73 @@ public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> impl
         }
     }
 
+    /**
+     * 设置备案时间
+     * @param errorList
+     * @param row
+     * @param ssnydNew
+     * @return
+     */
+    private boolean setBasj(List<String> errorList, Map<String, Object> row, SsnydNew ssnydNew) {
+        String basjStr = getString(row, "备案时间");
+        if (basjStr != null) {
+            Date basj = null;
+            try {
+                // 先尝试 yyyy-MM-dd
+                basj = new SimpleDateFormat("yyyy-MM-dd").parse(basjStr);
+            } catch (ParseException e1) {
+                try {
+                    // 再尝试 EEE MMM dd HH:mm:ss z yyyy
+                    basj = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH).parse(basjStr);
+                } catch (ParseException e2) {
+                    String msg = "解析备案时间失败: " + basjStr;
+                    log.error(msg);
+                    errorList.add(msg);
+                    return true;
+                }
+            }
+            ssnydNew.setBasj(basj);
+        }
+        return false;
+    }
+
+    /**
+     * 更新shape字段
+     * @param errorList
+     * @param objectId
+     * @param projectIndex
+     * @param txtFile
+     */
+    private void updateShape(List<String> errorList, Integer objectId, String projectIndex, File txtFile) {
+        if (txtFile != null) {
+            try (FileInputStream txtInputStream = new FileInputStream(txtFile)) {
+                TxtReader txtReader = new TxtReader(txtInputStream);
+                ParseResult parseResult = txtReader.read();
+                if (parseResult != null && parseResult.getGeometry() != null) {
+                    String wkt = parseResult.getGeometry().toText();
+                    int updateCount = ((SsnydNewMapper) this.baseMapper).updateShapeById(objectId, wkt, 4528);
+                    if (updateCount <= 0) {
+                        String msg = String.format("项目索引 %s 的shape字段持久化失败。", projectIndex);
+                        log.warn(msg);
+                        errorList.add(msg);
+                    }
+                } else {
+                    String msg = String.format("项目索引 %s 的TXT文件解析失败或未获取到Geometry数据。", projectIndex);
+                    log.warn(msg);
+                    errorList.add(msg);
+                }
+            } catch (Exception e) {
+                String msg = String.format("解析项目索引 %s 的TXT文件失败: %s", projectIndex, e.getMessage());
+                log.error(msg, e);
+                errorList.add(msg);
+            }
+        } else {
+            String msg = String.format("未找到项目索引 %s 对应的TXT界址点文件。", projectIndex);
+            log.warn(msg);
+            errorList.add(msg);
+        }
+    }
+
     private String getString(Map<String, Object> map, String key) {
         Object value = map.get(key);
         return value != null ? String.valueOf(value) : null;

+ 1 - 1
YHYZT/server/src/main/java/com/zjugis/yzt/utils/ZipFileProcessor.java

@@ -52,7 +52,7 @@ public class ZipFileProcessor {
                         }
                     }
 
-                    if (newFile.getName().toLowerCase().endsWith(".xlsx")) {
+                    if (newFile.getName().toLowerCase().endsWith(".xlsx") || newFile.getName().toLowerCase().endsWith(".xls")) {
                         result.setXlsxFile(newFile);
                     } else if (newFile.getName().toLowerCase().endsWith(".txt")) {
                         String fileNameWithoutExt = newFile.getName().substring(0, newFile.getName().lastIndexOf('.'));