Browse Source

lsyd上传zip

liutao 2 weeks ago
parent
commit
471738dc32

+ 1 - 2
YHYZT/server/src/main/java/com/zjugis/yzt/beans/entity/StGddk.java

@@ -3,7 +3,6 @@ package com.zjugis.yzt.beans.entity;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
-import com.vividsolutions.jts.geom.Geometry;
 
 @Data
 @TableName("sde.st_gddk")
@@ -147,5 +146,5 @@ public class StGddk {
     private String crjsfyjq;
     /** 合同是否已备案 */
     private String htsfyba;
-    private Geometry shape;
+    private String shape;
 } 

+ 0 - 77
YHYZT/server/src/main/java/com/zjugis/yzt/beans/vo/StGddkVO.java

@@ -1,77 +0,0 @@
-package com.zjugis.yzt.beans.vo;
-
-import lombok.Data;
-import com.vividsolutions.jts.geom.Geometry;
-
-@Data
-public class StGddkVO {
-    private Integer objectid;
-    private String dkBh;
-    private String dkMc;
-    private String dkYt;
-    private String dkMj;
-    private String bz;
-    private String tdZl;
-    private String dwMc;
-    private String gdsy;
-    private String zdzt;
-    private String xxz;
-    private String jhqk;
-    private String xmgs;
-    private String tdmj;
-    private String rjl;
-    private String jztl;
-    private String crfs;
-    private String ggsj;
-    private String gpbjsj;
-    private String pgj;
-    private String qgj;
-    private String qgmj;
-    private String qglmj;
-    private String bzj;
-    private String sjjndj;
-    private String jdj;
-    private String jdmj;
-    private String jdlmj;
-    private String zcbl;
-    private String zcmj;
-    private String ylyf;
-    private String wcfh;
-    private String yjl;
-    private String yjcrj;
-    private String yjeqj;
-    private String dyqcrj;
-    private String dyqydzfrq;
-    private String dyqsjzfrq;
-    private String dyqdqtx;
-    private String deqcrj;
-    private String deqydzfrq;
-    private String deqsjzfrq;
-    private String deqdqtx;
-    private String ydjdsj;
-    private String yddgsj;
-    private String ydjgsj;
-    private String hth;
-    private String htqysj;
-    private String pch;
-    private String gycl;
-    private String stsjlr;
-    private String xzxtjqk;
-    private String gdpfh;
-    private String gzglkh;
-    private String gzfpj;
-    private String zfzdmj;
-    private String zdjztl;
-    private String zzydmj;
-    private String zzjztl;
-    private String sjyjznj;
-    private String znjjnsj;
-    private String yffs;
-    private String lxr;
-    private String gddwnd;
-    private String fwxsxj;
-    private String zdcb;
-    private String crjsfyjq;
-    private String htsfyba;
-    private Geometry shape;
-} 

+ 15 - 31
YHYZT/server/src/main/java/com/zjugis/yzt/controller/StGddkController.java

@@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 
-import com.zjugis.yzt.beans.vo.StGddkVO;
 import com.zjugis.yzt.beans.entity.StGddk;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.multipart.MultipartFile;
@@ -17,7 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 @RestController
 @RequestMapping("/api/stgddk")
-public class StGddkController {
+public class StGddkController extends BaseRestController {
     @Autowired
     private StGddkService stGddkService;
 
@@ -38,7 +37,7 @@ public class StGddkController {
      * @return 分页结果
      */
     @GetMapping("/page")
-    public IPage<StGddkVO> getStGddkList(
+    public IPage<StGddk> getStGddkList(
             @RequestParam(defaultValue = "1") Integer current,
             @RequestParam(defaultValue = "10") Integer size,
             @RequestParam(required = false) String gdsy,
@@ -84,25 +83,22 @@ public class StGddkController {
         Page<StGddk> page = new Page<>(current, size);
         IPage<StGddk> stGddkPage = stGddkService.page(page, queryWrapper);
 
-        return stGddkPage.convert(this::convertToVO);
+        return stGddkPage;
     }
 
     /**
      * 根据ID获取供地地块信息
      */
     @GetMapping("/{id}")
-    public StGddkVO getStGddkById(@PathVariable Integer id) {
-        StGddk stGddk = stGddkService.getById(id);
-        return convertToVO(stGddk);
+    public StGddk getStGddkById(@PathVariable Integer id) {
+        return stGddkService.getById(id);
     }
 
     /**
      * 新增供地地块
      */
     @PostMapping("/add")
-    public boolean addStGddk(@RequestBody StGddkVO stGddkVO) {
-        StGddk stGddk = new StGddk();
-        BeanUtils.copyProperties(stGddkVO, stGddk);
+    public boolean addStGddk(@RequestBody StGddk stGddk) {
         return stGddkService.save(stGddk);
     }
 
@@ -110,12 +106,10 @@ public class StGddkController {
      * 更新供地地块
      */
     @PostMapping("/update")
-    public boolean updateStGddk(@RequestBody StGddkVO stGddkVO) {
-        if (stGddkVO.getObjectid() == null) {
+    public boolean updateStGddk(@RequestBody StGddk stGddk) {
+        if (stGddk.getObjectid() == null) {
             return false;
         }
-        StGddk stGddk = new StGddk();
-        BeanUtils.copyProperties(stGddkVO, stGddk);
         return stGddkService.updateById(stGddk);
     }
 
@@ -143,24 +137,14 @@ public class StGddkController {
      * @return
      */
     @PostMapping("/upload")
-    public boolean uploadStNzydkData(@RequestParam("file") MultipartFile file) {
-        return stGddkService.uploadGdData(file);
-    }
-
-    /**
-     * 将实体对象转换为VO对象
-     */
-    private StGddkVO convertToVO(StGddk stGddk) {
-        if (stGddk == null) {
-            return null;
+    public Object uploadStGddkData(@RequestParam("file") MultipartFile file) {
+        List<String> errorList = stGddkService.uploadGdData(file);
+        if (errorList == null || errorList.isEmpty()) {
+            return result(true);
+        } else {
+            return error("部分数据导入失败", ErrorCode.DEFAULT, errorList);
         }
-        StGddkVO vo = new StGddkVO();
-        BeanUtils.copyProperties(stGddk, vo);
-        if (stGddk.getDkMj() != null) {
-            vo.setDkMj(stGddk.getDkMj().toString());
-        }
-        return vo;
-    }
 
+    }
 
 }

+ 18 - 1
YHYZT/server/src/main/java/com/zjugis/yzt/controller/TempLandController.java

@@ -14,10 +14,11 @@ import java.util.List;
 import java.util.Date;
 
 import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.web.multipart.MultipartFile;
 
 @RestController
 @RequestMapping("/api/templand")
-public class TempLandController {
+public class TempLandController extends BaseRestController {
 
     @Autowired
     private TempLandService tempLandService;
@@ -132,6 +133,22 @@ public class TempLandController {
         return tempLandService.removeByIds(ids);
     }
 
+    /**
+     * 上传临时用地数据文件 (ZIP包)
+     *
+     * @param file
+     * @return
+     */
+    @PostMapping("/upload")
+    public Object uploadTempLandData(@RequestParam("file") MultipartFile file) {
+        java.util.List<String> errorList = tempLandService.uploadTemplandData(file);
+        if (errorList == null || errorList.isEmpty()) {
+            return result(true);
+        } else {
+            return error("部分数据导入失败", ErrorCode.DEFAULT, errorList);
+        }
+    }
+
     /**
      * 将实体对象转换为VO对象
      */

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

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zjugis.yzt.beans.entity.StGddk;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * @program: yh_yzt
  * @description: 供地地块Service
@@ -11,5 +13,5 @@ import org.springframework.web.multipart.MultipartFile;
  * @create: 2024-03-21
  **/
 public interface StGddkService extends IService<StGddk> {
-    boolean uploadGdData(MultipartFile file);
+    List<String> uploadGdData(MultipartFile file);
 } 

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

@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zjugis.yzt.beans.entity.TempLand;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.util.List;
+
 /**
  * 临时用地Service接口
  */
 public interface TempLandService extends IService<TempLand> {
 
-    boolean uploadTemplandData(MultipartFile zipFile);
+    List<String> uploadTemplandData(MultipartFile zipFile);
 }

+ 26 - 44
YHYZT/server/src/main/java/com/zjugis/yzt/service/impl/SsnydServiceImpl.java

@@ -9,6 +9,7 @@ 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 com.zjugis.yzt.utils.FileUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -63,17 +64,8 @@ public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> impl
 
             // 处理每一行数据
             for (Map<String, Object> row : batchDataList) {
-                SsnydNew ssnydNew = new SsnydNew();
-                // 字段映射
-                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, "项目索引"));
-                // 处理日期字段
-                if (setBasj(errorList, row, ssnydNew)) continue;
+                SsnydNew ssnydNew = getSsnydNew(errorList, row);
+                if (ssnydNew == null) continue;
 
                 // 保存前先删除已存在数据
                 String xmbh = ssnydNew.getXmbh();
@@ -127,11 +119,32 @@ public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> impl
         } finally {
             // 清理临时文件
             if (tempDir != null && tempDir.exists()) {
-                deleteDirectory(tempDir);
+                FileUtils.deleteDirectory(tempDir);
             }
         }
     }
 
+    /**
+     * row转换成SsnydNew
+     * @param errorList
+     * @param row
+     * @return
+     */
+    private SsnydNew getSsnydNew(List<String> errorList, Map<String, Object> row) {
+        SsnydNew ssnydNew = new SsnydNew();
+        // 字段映射
+        ssnydNew.setXmmc(FileUtils.getString(row, "项目名称"));
+        ssnydNew.setBah(FileUtils.getString(row, "备案号"));
+        ssnydNew.setSzs(FileUtils.getString(row, "市"));
+        ssnydNew.setXzq(FileUtils.getString(row, "县区"));
+        ssnydNew.setYt(FileUtils.getString(row, "用途"));
+        ssnydNew.setBamj(FileUtils.getDouble(row, "备案面积"));
+        ssnydNew.setXmbh(FileUtils.getString(row, "项目索引"));
+        // 处理日期字段
+        if (setBasj(errorList, row, ssnydNew)) return null;
+        return ssnydNew;
+    }
+
     /**
      * 设置备案时间
      * @param errorList
@@ -140,7 +153,7 @@ public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> impl
      * @return
      */
     private boolean setBasj(List<String> errorList, Map<String, Object> row, SsnydNew ssnydNew) {
-        String basjStr = getString(row, "备案时间");
+        String basjStr = FileUtils.getString(row, "备案时间");
         if (basjStr != null) {
             Date basj = null;
             try {
@@ -198,35 +211,4 @@ public class SsnydServiceImpl extends ServiceImpl<SsnydNewMapper, SsnydNew> impl
             errorList.add(msg);
         }
     }
-
-    private String getString(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        return value != null ? String.valueOf(value) : null;
-    }
-
-    private Double getDouble(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
-        try {
-            return Double.valueOf(String.valueOf(value));
-        } catch (NumberFormatException e) {
-            return null;
-        }
-    }
-
-    private void deleteDirectory(File directory) {
-        File[] files = directory.listFiles();
-        if (files != null) {
-            for (File file : files) {
-                if (file.isDirectory()) {
-                    deleteDirectory(file);
-                } else {
-                    file.delete();
-                }
-            }
-        }
-        directory.delete();
-    }
 }

+ 185 - 178
YHYZT/server/src/main/java/com/zjugis/yzt/service/impl/StGddkServiceImpl.java

@@ -1,24 +1,24 @@
 package com.zjugis.yzt.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zjugis.yzt.beans.entity.StNzydk;
 import com.zjugis.yzt.dao.StGddkMapper;
 import com.zjugis.yzt.beans.entity.StGddk;
 import com.zjugis.yzt.service.StGddkService;
 import com.zjugis.yzt.utils.ExcelUtils;
+import com.zjugis.yzt.utils.ZipFileProcessor;
 import com.zjugis.yzt.utils.geocomm.ParseResult;
 import com.zjugis.yzt.utils.geocomm.TxtReader;
+import com.zjugis.yzt.utils.FileUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.*;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
+
 
 /**
  * @program: yh_yzt
@@ -30,208 +30,215 @@ import java.util.zip.ZipInputStream;
 @Slf4j
 public class StGddkServiceImpl extends ServiceImpl<StGddkMapper, StGddk> implements StGddkService {
     @Override
-    public boolean uploadGdData(MultipartFile zipFile) {
+    public List<String> uploadGdData(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 xlsxFile = null;
-
-            try (ZipInputStream zis = new ZipInputStream(zipFile.getInputStream())) {
-                ZipEntry entry;
-                while ((entry = zis.getNextEntry()) != null) {
-                    File newFile = new File(tempDir, entry.getName());
-                    if (entry.isDirectory()) {
-                        newFile.mkdirs();
-                    } else {
-                        // 确保父目录存在
-                        new File(newFile.getParent()).mkdirs();
-                        try (FileOutputStream fos = new FileOutputStream(newFile)) {
-                            byte[] buffer = new byte[1024];
-                            int len;
-                            while ((len = zis.read(buffer)) > 0) {
-                                fos.write(buffer, 0, len);
-                            }
-                        }
-
-                        if (newFile.getName().toLowerCase().endsWith(".xlsx")) {
-                            xlsxFile = newFile;
-                        } else if (newFile.getName().toLowerCase().endsWith(".txt")) {
-                            String fileNameWithoutExt = newFile.getName().substring(0, newFile.getName().lastIndexOf('.'));
-                            txtFiles.put(fileNameWithoutExt, newFile);
-                        }
-                    }
-                }
-            }
-
+            // 1. 使用ZipFileProcessor处理压缩包
+            ZipFileProcessor.ZipProcessResult zipProcessResult = ZipFileProcessor.processZipFile(zipFile);
+            Map<String, File> txtFiles = zipProcessResult.getTxtFiles();
+            File xlsxFile = zipProcessResult.getXlsxFile();
+            tempDir = zipProcessResult.getTempDir();
             if (xlsxFile == null) {
-                log.error("ZIP包中未找到XLSX文件");
-                return false;
+                String msg = "ZIP包中未找到XLSX文件";
+                log.error(msg);
+                errorList.add(msg);
+                return errorList;
+            }
+            // 2. 解析Excel
+            List<Map<String, Object>> batchDataList;
+            try {
+                batchDataList = ExcelUtils.importExcel(
+                        new FileInputStream(xlsxFile), xlsxFile.getName(), 0, 1, 0
+                );
+            } catch (Exception e) {
+                String msg = "解析供地信息sheet失败: " + e.getMessage();
+                log.error(msg, e);
+                errorList.add(msg);
+                return errorList;
             }
-
-            // --- Start: 使用 ExcelUtils.importExcel 解析 XLSX 文件 ---
-            List<Map<String, Object>> batchDataList = ExcelUtils.importExcel(
-                    new FileInputStream(xlsxFile), xlsxFile.getName(), 0, 1, 0
-            );
             if (batchDataList.isEmpty()) {
-                log.warn("未能从 '供地信息' sheet 读取到数据。");
-                return false;
+                String msg = "未能从 '供地信息' sheet 读取到数据。";
+                log.warn(msg);
+                errorList.add(msg);
+                return errorList;
             }
-
-            List<StGddk> gddkList = new ArrayList<>();
             for (Map<String, Object> row : batchDataList) {
-                StGddk gddk = new StGddk();
-                // 字段映射,参照StGddk.java
-                gddk.setSdzj(getString(row, "属地镇街"));
-                gddk.setDkBh(getString(row, "供地索引"));
-                gddk.setDkMc(getString(row, "地块名称"));
-                gddk.setDkYt(getString(row, "用地性质"));
-                gddk.setDkMj(getDouble(row, "土地面积(亩)"));
-                gddk.setBz(getString(row, "备注"));
-                gddk.setTdZl(getString(row, "土地坐落"));
-                gddk.setDwMc(getString(row, "竞得单位"));
-                gddk.setGdsy(getString(row, "做地主体"));
-                gddk.setZdzt(getString(row, "属地镇街"));
-                gddk.setXxz(getString(row, "用地性质"));
-                gddk.setJhqk(getString(row, "计划情况"));
-                gddk.setXmgs(getString(row, "项目公司"));
-                gddk.setTdmj(getString(row, "土地面积(平方米)"));
-                gddk.setRjl(getString(row, "容积率"));
-                gddk.setJztl(getString(row, "建筑体量"));
-                gddk.setCrfs(getString(row, "出让方式"));
-                gddk.setGgsj(getString(row, "公告时间"));
-                gddk.setGpbjsj(getString(row, "挂牌报价时间"));
-                gddk.setPgj(getString(row, "评估价(万元)"));
-                gddk.setQgj(getString(row, "起挂价(万元)"));
-                gddk.setQgmj(getString(row, "起挂亩价(万元/亩)"));
-                gddk.setQglmj(getString(row, "起挂楼面价(元/平方米)"));
-                gddk.setBzj(getString(row, "保证金(万元)"));
-                gddk.setSjjndj(getString(row, "实际缴纳定金(万元)"));
-                gddk.setJdj(getString(row, "竞得价(万元)"));
-                gddk.setJdmj(getString(row, "竞得亩价(万元/亩)"));
-                gddk.setJdlmj(getString(row, "竞得楼面价(元/平方米)"));
-                gddk.setZcbl(getString(row, "自持比例"));
-                gddk.setZcmj(getString(row, "自持面积"));
-                gddk.setYlyf(getString(row, "养老用房(平方米)"));
-                gddk.setWcfh(getString(row, "无偿返还村集体建筑面积(平方米)"));
-                gddk.setYjl(getString(row, "溢价率"));
-                gddk.setYjcrj(getString(row, "已交出让金(万元)"));
-                gddk.setYjeqj(getString(row, "应交而欠交"));
-                gddk.setDyqcrj(getString(row, "第一期出让金额(含保证金)"));
-                gddk.setDyqydzfrq(getString(row, "第一期出让金约定支付日期"));
-                gddk.setDyqsjzfrq(getString(row, "第一期出让金实际支付日期"));
-                gddk.setDyqdqtx(getString(row, "第一期到期提醒"));
-                gddk.setDeqcrj(getString(row, "第二期出让金额"));
-                gddk.setDeqydzfrq(getString(row, "第二期出让金约定支付日期"));
-                gddk.setDeqsjzfrq(getString(row, "第二期出让金实际支付日期"));
-                gddk.setDeqdqtx(getString(row, "第二期到期提醒"));
-                gddk.setYdjdsj(getString(row, "交地协议书约定交地时间"));
-                gddk.setYddgsj(getString(row, "合同约定动工时间"));
-                gddk.setYdjgsj(getString(row, "合同约定竣工时间"));
-                gddk.setHth(getString(row, "合同号"));
-                gddk.setHtqysj(getString(row, "合同签约时间"));
-                gddk.setPch(getString(row, "批次号"));
-                gddk.setGycl(getString(row, "国有存量用地面积(平方米)"));
-                gddk.setStsjlr(getString(row, "省厅系统实际录入情况"));
-                gddk.setXzxtjqk(getString(row, "限制性条件情况"));
-                gddk.setGdpfh(getString(row, "供地批复号"));
-                gddk.setGzglkh(getString(row, "跟踪管理卡号"));
-                gddk.setGzfpj(getString(row, "公租房配建"));
-                gddk.setZfzdmj(getString(row, "90平方米住房占地面积"));
-                gddk.setZdjztl(getString(row, "最大建筑体量(平方米)"));
-                gddk.setZzydmj(getString(row, "住宅用地面积(平方米)"));
-                gddk.setZzjztl(getString(row, "住宅建筑体量(平方米)"));
-                gddk.setSjyjznj(getString(row, "实际已缴滞纳金(万元)"));
-                gddk.setZnjjnsj(getString(row, "滞纳金缴纳时间"));
-                gddk.setYffs(getString(row, "印刷份数"));
-                gddk.setLxr(getString(row, "联系人"));
-                gddk.setGddwnd(getString(row, "是否勾地单位拿地"));
-                gddk.setFwxsxj(getString(row, "房屋销售限价"));
-                gddk.setZdcb(getString(row, "做地成本"));
-                gddk.setCrjsfyjq(getString(row, "出让金是否已缴清"));
-                gddk.setHtsfyba(getString(row, "合同是否已备案"));
-                // 先保存StGddk
-                if (!this.save(gddk)) {
-                    log.error("保存农转用数据失败:{}", gddk.getDkBh());
-                    return false;
+                StGddk gddk = getStGddk(row);
+                // 3. 保存前先删除已存在数据
+                if (gddk.getDkBh() != null) {
+                    QueryWrapper<StGddk> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("dk_bh", gddk.getDkBh());
+                    try {
+                        this.remove(queryWrapper);
+                    } catch (Exception e) {
+                        String msg = String.format("删除地块编号为 %s 的旧数据失败: %s", gddk.getDkBh(), e.getMessage());
+                        log.error(msg, e);
+                        errorList.add(msg);
+                    }
                 }
+                // 保存StGddk
+                try {
+                    if (!this.save(gddk)) {
+                        String msg = String.format("保存供地数据失败:%s", gddk.getDkBh());
+                        log.error(msg);
+                        errorList.add(msg);
+                        continue;
+                    }
+                } catch (Exception e) {
+                    String msg = String.format("保存供地数据异常:%s,错误:%s", gddk.getDkBh(), e.getMessage());
+                    log.error(msg, e);
+                    errorList.add(msg);
+                    continue;
+                }
+                // 获取保存后的objectid
                 Integer objectId = gddk.getObjectid();
                 if (objectId == null) {
-                    log.error("获取保存后的objectid失败:{}", gddk.getDkBh());
-                    return false;
+                    String msg = String.format("获取保存后的objectid失败:%s", gddk.getDkBh());
+                    log.error(msg);
+                    errorList.add(msg);
+                    continue;
                 }
                 // 解析txt为Geometry并持久化
                 String gdsx = gddk.getDkBh();
                 File txtFile = txtFiles.get(gdsx);
-                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参数为(id, wkt)
-                            int updateCount = ((StGddkMapper) this.baseMapper).updateShapeById(objectId, wkt, 4528);
-                            if (updateCount <= 0) {
-                                log.warn("供地索引 {} 的shape字段持久化失败。", gdsx);
-                            }
-                        } else {
-                            log.warn("供地索引 {} 的TXT文件解析失败或未获取到Geometry数据。", gdsx);
-                        }
-                    } catch (Exception e) {
-                        log.error("解析供地索引 {} 的TXT文件失败: {}", gdsx, e.getMessage());
-                    }
-                } else {
-                    log.warn("未找到供地索引 {} 对应的TXT界址点文件。", gdsx);
-                }
+                updateShape(errorList, objectId, gdsx, 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()) {
-                deleteDirectory(tempDir);
+                FileUtils.deleteDirectory(tempDir);
             }
         }
     }
 
-    // 工具方法
-    private String getString(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        return value == null ? null : value.toString().trim();
+    /**
+     * 将row转换成StGddk
+     *
+     * @param row
+     * @return
+     */
+    private StGddk getStGddk(Map<String, Object> row) {
+        StGddk gddk = new StGddk();
+        // 字段映射,参照StGddk.java
+        gddk.setSdzj(FileUtils.getString(row, "属地镇街"));
+        gddk.setDkBh(FileUtils.getString(row, "供地索引"));
+        gddk.setDkMc(FileUtils.getString(row, "地块名称"));
+        gddk.setDkYt(FileUtils.getString(row, "用地性质"));
+        gddk.setDkMj(FileUtils.getDouble(row, "土地面积(亩)"));
+        gddk.setBz(FileUtils.getString(row, "备注"));
+        gddk.setTdZl(FileUtils.getString(row, "土地坐落"));
+        gddk.setDwMc(FileUtils.getString(row, "竞得单位"));
+        gddk.setGdsy(FileUtils.getString(row, "做地主体"));
+        gddk.setZdzt(FileUtils.getString(row, "属地镇街"));
+        gddk.setXxz(FileUtils.getString(row, "用地性质"));
+        gddk.setJhqk(FileUtils.getString(row, "计划情况"));
+        gddk.setXmgs(FileUtils.getString(row, "项目公司"));
+        gddk.setTdmj(FileUtils.getString(row, "土地面积(平方米)"));
+        gddk.setRjl(FileUtils.getString(row, "容积率"));
+        gddk.setJztl(FileUtils.getString(row, "建筑体量"));
+        gddk.setCrfs(FileUtils.getString(row, "出让方式"));
+        gddk.setGgsj(FileUtils.getString(row, "公告时间"));
+        gddk.setGpbjsj(FileUtils.getString(row, "挂牌报价时间"));
+        gddk.setPgj(FileUtils.getString(row, "评估价(万元)"));
+        gddk.setQgj(FileUtils.getString(row, "起挂价(万元)"));
+        gddk.setQgmj(FileUtils.getString(row, "起挂亩价(万元/亩)"));
+        gddk.setQglmj(FileUtils.getString(row, "起挂楼面价(元/平方米)"));
+        gddk.setBzj(FileUtils.getString(row, "保证金(万元)"));
+        gddk.setSjjndj(FileUtils.getString(row, "实际缴纳定金(万元)"));
+        gddk.setJdj(FileUtils.getString(row, "竞得价(万元)"));
+        gddk.setJdmj(FileUtils.getString(row, "竞得亩价(万元/亩)"));
+        gddk.setJdlmj(FileUtils.getString(row, "竞得楼面价(元/平方米)"));
+        gddk.setZcbl(FileUtils.getString(row, "自持比例"));
+        gddk.setZcmj(FileUtils.getString(row, "自持面积"));
+        gddk.setYlyf(FileUtils.getString(row, "养老用房(平方米)"));
+        gddk.setWcfh(FileUtils.getString(row, "无偿返还村集体建筑面积(平方米)"));
+        gddk.setYjl(FileUtils.getString(row, "溢价率"));
+        gddk.setYjcrj(FileUtils.getString(row, "已交出让金(万元)"));
+        gddk.setYjeqj(FileUtils.getString(row, "应交而欠交"));
+        gddk.setDyqcrj(FileUtils.getString(row, "第一期出让金额(含保证金)"));
+        gddk.setDyqydzfrq(FileUtils.getString(row, "第一期出让金约定支付日期"));
+        gddk.setDyqsjzfrq(FileUtils.getString(row, "第一期出让金实际支付日期"));
+        gddk.setDyqdqtx(FileUtils.getString(row, "第一期到期提醒"));
+        gddk.setDeqcrj(FileUtils.getString(row, "第二期出让金额"));
+        gddk.setDeqydzfrq(FileUtils.getString(row, "第二期出让金约定支付日期"));
+        gddk.setDeqsjzfrq(FileUtils.getString(row, "第二期出让金实际支付日期"));
+        gddk.setDeqdqtx(FileUtils.getString(row, "第二期到期提醒"));
+        gddk.setYdjdsj(FileUtils.getString(row, "交地协议书约定交地时间"));
+        gddk.setYddgsj(FileUtils.getString(row, "合同约定动工时间"));
+        gddk.setYdjgsj(FileUtils.getString(row, "合同约定竣工时间"));
+        gddk.setHth(FileUtils.getString(row, "合同号"));
+        gddk.setHtqysj(FileUtils.getString(row, "合同签约时间"));
+        gddk.setPch(FileUtils.getString(row, "批次号"));
+        gddk.setGycl(FileUtils.getString(row, "国有存量用地面积(平方米)"));
+        gddk.setStsjlr(FileUtils.getString(row, "省厅系统实际录入情况"));
+        gddk.setXzxtjqk(FileUtils.getString(row, "限制性条件情况"));
+        gddk.setGdpfh(FileUtils.getString(row, "供地批复号"));
+        gddk.setGzglkh(FileUtils.getString(row, "跟踪管理卡号"));
+        gddk.setGzfpj(FileUtils.getString(row, "公租房配建"));
+        gddk.setZfzdmj(FileUtils.getString(row, "90平方米住房占地面积"));
+        gddk.setZdjztl(FileUtils.getString(row, "最大建筑体量(平方米)"));
+        gddk.setZzydmj(FileUtils.getString(row, "住宅用地面积(平方米)"));
+        gddk.setZzjztl(FileUtils.getString(row, "住宅建筑体量(平方米)"));
+        gddk.setSjyjznj(FileUtils.getString(row, "实际已缴滞纳金(万元)"));
+        gddk.setZnjjnsj(FileUtils.getString(row, "滞纳金缴纳时间"));
+        gddk.setYffs(FileUtils.getString(row, "印刷份数"));
+        gddk.setLxr(FileUtils.getString(row, "联系人"));
+        gddk.setGddwnd(FileUtils.getString(row, "是否勾地单位拿地"));
+        gddk.setFwxsxj(FileUtils.getString(row, "房屋销售限价"));
+        gddk.setZdcb(FileUtils.getString(row, "做地成本"));
+        gddk.setCrjsfyjq(FileUtils.getString(row, "出让金是否已缴清"));
+        gddk.setHtsfyba(FileUtils.getString(row, "合同是否已备案"));
+        return gddk;
     }
 
-    private Double getDouble(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null || value.toString().trim().isEmpty()) return null;
-        try {
-            return Double.parseDouble(value.toString().trim());
-        } catch (NumberFormatException e) {
-            return null;
-        }
-    }
-
-    private void deleteDirectory(File directory) {
-        File[] allContents = directory.listFiles();
-        if (allContents != null) {
-            for (File file : allContents) {
-                deleteDirectory(file);
+    /**
+     * 更新shape
+     *
+     * @param errorList
+     * @param objectId
+     * @param gdsx
+     * @param txtFile
+     */
+    private void updateShape(List<String> errorList, Integer objectId, String gdsx, 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 = ((StGddkMapper) this.baseMapper).updateShapeById(objectId, wkt, 4528);
+                    if (updateCount <= 0) {
+                        String msg = String.format("供地索引 %s 的shape字段持久化失败。", gdsx);
+                        log.warn(msg);
+                        errorList.add(msg);
+                    }
+                } else {
+                    String msg = String.format("供地索引 %s 的TXT文件解析失败或未获取到Geometry数据。", gdsx);
+                    log.warn(msg);
+                    errorList.add(msg);
+                }
+            } catch (Exception e) {
+                String msg = String.format("解析供地索引 %s 的TXT文件失败: %s", gdsx, e.getMessage());
+                log.error(msg);
+                errorList.add(msg);
             }
+        } else {
+            String msg = String.format("未找到供地索引 %s 对应的TXT界址点文件。", gdsx);
+            log.warn(msg);
+            errorList.add(msg);
         }
-        directory.delete();
     }
-
-
 }

+ 42 - 39
YHYZT/server/src/main/java/com/zjugis/yzt/service/impl/StNzydkServiceImpl.java

@@ -9,6 +9,7 @@ import com.zjugis.yzt.utils.ExcelUtils;
 import com.zjugis.yzt.utils.ZipFileProcessor;
 import com.zjugis.yzt.utils.geocomm.ParseResult;
 import com.zjugis.yzt.utils.geocomm.TxtReader;
+import com.zjugis.yzt.utils.FileUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -95,34 +96,7 @@ public class StNzydkServiceImpl extends ServiceImpl<StNzydkMapper, StNzydk> impl
             // --- End: 使用 ExcelUtils.importExcel 解析 XLSX 文件 ---
 
             for (Map<String, Object> projectInfo : projectInfoList) {
-                StNzydk stNzydk = new StNzydk();
-
-                // 批次信息 (通过批次索引关联)
-                String pcbh = projectInfo.containsKey("批次索引") ? String.valueOf(projectInfo.get("批次索引")) : null;
-                Map<String, Object> batchInfo = batchInfoMap.get(pcbh);
-                if (batchInfo != null) {
-                    stNzydk.setPcbh(batchInfo.containsKey("批次索引") ? String.valueOf(batchInfo.get("批次索引")) : null);
-                    stNzydk.setPch(batchInfo.containsKey("批次名称") ? String.valueOf(batchInfo.get("批次名称")) : null);
-                    stNzydk.setLx(batchInfo.containsKey("类型") ? String.valueOf(batchInfo.get("类型")) : null);
-                    stNzydk.setPwh(batchInfo.containsKey("批准文号") ? String.valueOf(batchInfo.get("批准文号")) : null);
-                    stNzydk.setPzrq(batchInfo.containsKey("批准日期") ? String.valueOf(batchInfo.get("批准日期")) : null);
-                    stNzydk.setPzMj(parseBigDecimal(batchInfo.containsKey("批次总面积(公顷)") ? String.valueOf(batchInfo.get("批次总面积(公顷)")) : null));
-                    stNzydk.setNmjf(batchInfo.containsKey("是否农民建房") ? String.valueOf(batchInfo.get("是否农民建房")) : null);
-                } else {
-                    String msg = String.format("未找到批次索引为 %s 的批次信息,项目 %s 将跳过批次信息填充。", pcbh, projectInfo.containsKey("项目编号") ? String.valueOf(projectInfo.get("项目编号")) : "未知项目");
-                    log.warn(msg);
-                    errorList.add(msg);
-                }
-
-                // 项目信息
-                stNzydk.setDkBh(projectInfo.containsKey("项目编号") ? String.valueOf(projectInfo.get("项目编号")) : null);
-                stNzydk.setDkMc(projectInfo.containsKey("项目名称") ? String.valueOf(projectInfo.get("项目名称")) : null);
-                stNzydk.setXzz(projectInfo.containsKey("乡镇街道") ? String.valueOf(projectInfo.get("乡镇街道")) : null);
-                stNzydk.setDkYt(projectInfo.containsKey("土地用途") ? String.valueOf(projectInfo.get("土地用途")) : null);
-                stNzydk.setTdZl(projectInfo.containsKey("土地坐落") ? String.valueOf(projectInfo.get("土地坐落")) : null);
-                stNzydk.setDkMj(parseBigDecimal(projectInfo.containsKey("项目面积(公顷)") ? String.valueOf(projectInfo.get("项目面积(公顷)")) : null));
-                stNzydk.setDkQs(projectInfo.containsKey("用地主体") ? String.valueOf(projectInfo.get("用地主体")) : null);
-                stNzydk.setBz(projectInfo.containsKey("备注") ? String.valueOf(projectInfo.get("备注")) : null);
+                StNzydk stNzydk = getStNzydk(errorList, batchInfoMap, projectInfo);
                 // 保存到数据库前,先通过 dkBh 删除已存在的记录
                 if (stNzydk.getDkBh() != null) {
                     // 构造查询条件
@@ -181,11 +155,50 @@ public class StNzydkServiceImpl extends ServiceImpl<StNzydkMapper, StNzydk> impl
         } finally {
             // 清理临时文件
             if (tempDir != null && tempDir.exists()) {
-                deleteDirectory(tempDir);
+                FileUtils.deleteDirectory(tempDir);
             }
         }
     }
 
+    /**
+     * batchInfoMap和projectInfo转换成StNzydk
+     * @param errorList
+     * @param batchInfoMap
+     * @param projectInfo
+     * @return
+     */
+    private StNzydk getStNzydk(List<String> errorList, Map<String, Map<String, Object>> batchInfoMap, Map<String, Object> projectInfo) {
+        StNzydk stNzydk = new StNzydk();
+
+        // 批次信息 (通过批次索引关联)
+        String pcbh = projectInfo.containsKey("批次索引") ? String.valueOf(projectInfo.get("批次索引")) : null;
+        Map<String, Object> batchInfo = batchInfoMap.get(pcbh);
+        if (batchInfo != null) {
+            stNzydk.setPcbh(batchInfo.containsKey("批次索引") ? String.valueOf(batchInfo.get("批次索引")) : null);
+            stNzydk.setPch(batchInfo.containsKey("批次名称") ? String.valueOf(batchInfo.get("批次名称")) : null);
+            stNzydk.setLx(batchInfo.containsKey("类型") ? String.valueOf(batchInfo.get("类型")) : null);
+            stNzydk.setPwh(batchInfo.containsKey("批准文号") ? String.valueOf(batchInfo.get("批准文号")) : null);
+            stNzydk.setPzrq(batchInfo.containsKey("批准日期") ? String.valueOf(batchInfo.get("批准日期")) : null);
+            stNzydk.setPzMj(parseBigDecimal(batchInfo.containsKey("批次总面积(公顷)") ? String.valueOf(batchInfo.get("批次总面积(公顷)")) : null));
+            stNzydk.setNmjf(batchInfo.containsKey("是否农民建房") ? String.valueOf(batchInfo.get("是否农民建房")) : null);
+        } else {
+            String msg = String.format("未找到批次索引为 %s 的批次信息,项目 %s 将跳过批次信息填充。", pcbh, projectInfo.containsKey("项目编号") ? String.valueOf(projectInfo.get("项目编号")) : "未知项目");
+            log.warn(msg);
+            errorList.add(msg);
+        }
+
+        // 项目信息
+        stNzydk.setDkBh(projectInfo.containsKey("项目编号") ? String.valueOf(projectInfo.get("项目编号")) : null);
+        stNzydk.setDkMc(projectInfo.containsKey("项目名称") ? String.valueOf(projectInfo.get("项目名称")) : null);
+        stNzydk.setXzz(projectInfo.containsKey("乡镇街道") ? String.valueOf(projectInfo.get("乡镇街道")) : null);
+        stNzydk.setDkYt(projectInfo.containsKey("土地用途") ? String.valueOf(projectInfo.get("土地用途")) : null);
+        stNzydk.setTdZl(projectInfo.containsKey("土地坐落") ? String.valueOf(projectInfo.get("土地坐落")) : null);
+        stNzydk.setDkMj(parseBigDecimal(projectInfo.containsKey("项目面积(公顷)") ? String.valueOf(projectInfo.get("项目面积(公顷)")) : null));
+        stNzydk.setDkQs(projectInfo.containsKey("用地主体") ? String.valueOf(projectInfo.get("用地主体")) : null);
+        stNzydk.setBz(projectInfo.containsKey("备注") ? String.valueOf(projectInfo.get("备注")) : null);
+        return stNzydk;
+    }
+
     private void updateShapeWithErrorList(Integer objectId, String projectCode, File txtFile, List<String> errorList) {
         if (txtFile != null) {
             try (FileInputStream txtInputStream = new FileInputStream(txtFile)) {
@@ -222,14 +235,4 @@ public class StNzydkServiceImpl extends ServiceImpl<StNzydkMapper, StNzydk> impl
             return null;
         }
     }
-
-    private void deleteDirectory(File directory) {
-        File[] allContents = directory.listFiles();
-        if (allContents != null) {
-            for (File file : allContents) {
-                deleteDirectory(file);
-            }
-        }
-        directory.delete();
-    }
 } 

+ 141 - 145
YHYZT/server/src/main/java/com/zjugis/yzt/service/impl/TempLandServiceImpl.java

@@ -1,10 +1,13 @@
 package com.zjugis.yzt.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zjugis.yzt.beans.entity.TempLand;
 import com.zjugis.yzt.dao.TempLandMapper;
 import com.zjugis.yzt.service.TempLandService;
 import com.zjugis.yzt.utils.ExcelUtils;
+import com.zjugis.yzt.utils.FileUtils;
+import com.zjugis.yzt.utils.ZipFileProcessor;
 import com.zjugis.yzt.utils.geocomm.ParseResult;
 import com.zjugis.yzt.utils.geocomm.TxtReader;
 import lombok.extern.slf4j.Slf4j;
@@ -13,13 +16,10 @@ 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.*;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
+
 
 /**
  * @description: 临时用地Service实现类
@@ -29,182 +29,178 @@ import java.util.zip.ZipInputStream;
 public class TempLandServiceImpl extends ServiceImpl<TempLandMapper, TempLand> implements TempLandService {
 
     @Override
-    public boolean uploadTemplandData(MultipartFile zipFile) {
+    public List<String> uploadTemplandData(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数据
             FileInputStream excelStream = new FileInputStream(xlsFile);
             List<Map<String, Object>> batchDataList = ExcelUtils.importExcel(excelStream, xlsFile.getName(), 0, 1, 0);
             excelStream.close();
-
-            // 处理每一行数据
-            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+            java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy/MM/dd");
             for (Map<String, Object> row : batchDataList) {
-                TempLand tempLand = new TempLand();
-                
-                // 字段映射
-                tempLand.setXmbh(getString(row, "项目索引"));
-                tempLand.setXmmc(getString(row, "项目名称"));
-                tempLand.setPzwh(getString(row, "批复文号"));
-                tempLand.setYddw(getString(row, "用地单位"));
-                tempLand.setPzmj(getDouble(row, "批准面积"));
-                tempLand.setPzdw(getString(row, "批准单位"));
-                tempLand.setZlwz(getString(row, "坐落位置"));
-                tempLand.setRknf(getString(row, "入库年份"));
-                
-                try {
-                    String approvalDate = getString(row, "审批时间");
-                    if (approvalDate != null && !approvalDate.isEmpty()) {
-                        tempLand.setPzsj(sdf.parse(approvalDate));
-                    }
-                    
-                    String expiryDate = getString(row, "到期时间");
-                    if (expiryDate != null && !expiryDate.isEmpty()) {
-                        tempLand.setDqsj(sdf.parse(expiryDate));
-                    }
-                    
-                    String storageDate = getString(row, "入库时间");
-                    if (storageDate != null && !storageDate.isEmpty()) {
-                        tempLand.setRksj(sdf.parse(storageDate));
+                TempLand tempLand = getTempLand(errorList, sdf, row);
+                if (tempLand == null) continue;
+                // 保存前先删除已存在的xmbh数据
+                if (tempLand.getXmbh() != null) {
+                    QueryWrapper<TempLand> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("xmbh", tempLand.getXmbh());
+                    try {
+                        this.remove(queryWrapper);
+                    } catch (Exception e) {
+                        String msg = String.format("删除项目编号为 %s 的旧数据失败: %s", tempLand.getXmbh(), e.getMessage());
+                        log.error(msg, e);
+                        errorList.add(msg);
                     }
-                } catch (ParseException e) {
-                    log.error("日期解析错误", e);
-                    return false;
                 }
-                
-                tempLand.setRkry(getString(row, "入库人员"));
-                tempLand.setBz(getString(row, "备注"));
-
                 // 保存临时用地数据
-                if (!this.save(tempLand)) {
-                    log.error("保存临时用地数据失败:{}", tempLand.getXmbh());
-                    return false;
+                try {
+                    if (!this.save(tempLand)) {
+                        String msg = String.format("保存临时用地数据失败:%s", tempLand.getXmbh());
+                        log.error(msg);
+                        errorList.add(msg);
+                        continue;
+                    }
+                } catch (Exception e) {
+                    String msg = String.format("保存临时用地数据异常:%s,错误:%s", tempLand.getXmbh(), e.getMessage());
+                    log.error(msg, e);
+                    errorList.add(msg);
+                    continue;
                 }
-
-                // 获取保存后的ID
                 Integer objectId = tempLand.getObjectid();
                 if (objectId == null) {
-                    log.error("获取保存后的objectId失败:{}", tempLand.getXmbh());
-                    return false;
+                    String msg = String.format("获取保存后的objectId失败:%s", tempLand.getXmbh());
+                    log.error(msg);
+                    errorList.add(msg);
+                    continue;
                 }
-
-                // 解析txt为Geometry并持久化
                 String projectIndex = tempLand.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 = ((TempLandMapper) 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()) {
-                deleteDirectory(tempDir);
+                FileUtils.deleteDirectory(tempDir);
             }
         }
     }
 
-    private String getString(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        return value != null ? String.valueOf(value) : null;
-    }
-
-    private Double getDouble(Map<String, Object> map, String key) {
-        Object value = map.get(key);
-        if (value == null) {
-            return null;
-        }
+    /**
+     * Excel row->TempLand
+     * @param errorList
+     * @param sdf
+     * @param row
+     * @return
+     */
+    private TempLand getTempLand(List<String> errorList, SimpleDateFormat sdf, Map<String, Object> row) {
+        TempLand tempLand = new TempLand();
+        tempLand.setXmbh(FileUtils.getString(row, "项目索引"));
+        tempLand.setXmmc(FileUtils.getString(row, "项目名称"));
+        tempLand.setPzwh(FileUtils.getString(row, "批复文号"));
+        tempLand.setYddw(FileUtils.getString(row, "用地单位"));
+        tempLand.setPzmj(FileUtils.getDouble(row, "批准面积"));
+        tempLand.setPzdw(FileUtils.getString(row, "批准单位"));
+        tempLand.setZlwz(FileUtils.getString(row, "坐落位置"));
+        tempLand.setRknf(FileUtils.getString(row, "入库年份"));
         try {
-            return Double.valueOf(String.valueOf(value));
-        } catch (NumberFormatException e) {
+            String approvalDate = FileUtils.getString(row, "审批时间");
+            if (approvalDate != null && !approvalDate.isEmpty()) {
+                tempLand.setPzsj(parseDate(approvalDate));
+            }
+            String expiryDate = FileUtils.getString(row, "到期时间");
+            if (expiryDate != null && !expiryDate.isEmpty()) {
+                tempLand.setDqsj(parseDate(expiryDate));
+            }
+            String storageDate = FileUtils.getString(row, "入库时间");
+            if (storageDate != null && !storageDate.isEmpty()) {
+                tempLand.setRksj(parseDate(storageDate));
+            }
+        } catch (Exception e) {
+            String msg = "日期解析错误: " + e.getMessage();
+            log.error(msg, e);
+            errorList.add(msg);
             return null;
         }
+        tempLand.setRkry(FileUtils.getString(row, "入库人员"));
+        tempLand.setBz(FileUtils.getString(row, "备注"));
+        return tempLand;
     }
 
-    private void deleteDirectory(File directory) {
-        File[] files = directory.listFiles();
-        if (files != null) {
-            for (File file : files) {
-                if (file.isDirectory()) {
-                    deleteDirectory(file);
+    /**
+     * 更新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 = ((TempLandMapper) this.baseMapper).updateShapeById(objectId, wkt, 4528);
+                    if (updateCount <= 0) {
+                        String msg = String.format("项目索引 %s 的shape字段持久化失败。", projectIndex);
+                        log.warn(msg);
+                        errorList.add(msg);
+                    }
                 } else {
-                    file.delete();
+                    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);
+        }
+    }
+
+    /**
+     * 解析时间字段
+     * @param dateStr
+     * @return
+     * @throws java.text.ParseException
+     */
+    private static Date parseDate(String dateStr) throws java.text.ParseException {
+        List<SimpleDateFormat> formats = Arrays.asList(
+            new SimpleDateFormat("yyyy/MM/dd"),
+            new SimpleDateFormat("yyyy-MM-dd"),
+            new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH)
+        );
+        for (SimpleDateFormat sdf : formats) {
+            try {
+                return sdf.parse(dateStr);
+            } catch (java.text.ParseException ignored) {}
         }
-        directory.delete();
+        throw new java.text.ParseException("Unparseable date: \"" + dateStr + "\"", 0);
     }
 }

+ 38 - 0
YHYZT/server/src/main/java/com/zjugis/yzt/utils/FileUtils.java

@@ -8,6 +8,7 @@ import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.util.Map;
 
 public class FileUtils {
 
@@ -123,7 +124,44 @@ public class FileUtils {
         }
     }
 
+    /**
+     * Map取String(null安全)
+     */
+    public static String getString(Map<String, Object> map, String key) {
+        Object value = map.get(key);
+        return value != null ? String.valueOf(value) : null;
+    }
 
+    /**
+     * Map取Double(null安全)
+     */
+    public static Double getDouble(Map<String, Object> map, String key) {
+        Object value = map.get(key);
+        if (value == null) {
+            return null;
+        }
+        try {
+            return Double.valueOf(String.valueOf(value));
+        } catch (NumberFormatException e) {
+            return null;
+        }
+    }
 
+    /**
+     * 递归删除文件夹或文件(File参数)
+     */
+    public static void deleteDirectory(File directory) {
+        File[] files = directory.listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (file.isDirectory()) {
+                    deleteDirectory(file);
+                } else {
+                    file.delete();
+                }
+            }
+        }
+        directory.delete();
+    }
 
 }