Переглянути джерело

管理员上报 导入功能调整,需要弹出具体问题点并有上传人点击确认。如果出现数据错误 则全部不导入

徐滕 3 тижнів тому
батько
коміт
5f091bbe01

+ 109 - 59
src/main/java/com/jeeplus/modules/projectrecord/service/AdminProjectReportedImportService.java

@@ -146,10 +146,36 @@ public class AdminProjectReportedImportService extends CrudService<AdminProjectR
         return count;
     }
 
-    @Transactional(readOnly = false)
+    /**
+     * 校验导入数据,收集所有错误(不做任何数据库写入操作)
+     * @param list 导入的数据列表
+     * @return map包含 success(是否全部通过) 和 errorMessages(错误信息列表)
+     */
     public Map<String,Object> disposeData(List<AdminProjectReportedImport> list){
         Map<String,Object> map = new HashMap<>();
-        for (AdminProjectReportedImport info : list) {
+        List<String> errorMessages = new ArrayList<>();
+        // 用于校验阶段生成的咨询员数据(不入库,仅暂存)
+        List<ReportedConsultant> allConsultants = new ArrayList<>();
+
+        for (int i = 0; i < list.size(); i++) {
+            AdminProjectReportedImport info = list.get(i);
+            int rowNum = i + 1;
+            String projectDesc = "第" + rowNum + "条【" + info.getProjectName() + "】";
+
+            // 关键字段长度校验(防止数据库字段截断)
+            if(StringUtils.isNotBlank(info.getProjectName()) && info.getProjectName().length() > 200){
+                errorMessages.add(projectDesc + "项目名称过长(超过200字符)");
+                continue;
+            }
+            if(StringUtils.isNotBlank(info.getDangABH()) && info.getDangABH().length() > 100){
+                errorMessages.add(projectDesc + "造价记录编号过长(超过100字符)");
+                continue;
+            }
+            if(StringUtils.isNotBlank(info.getWeiTuoDW()) && info.getWeiTuoDW().length() > 200){
+                errorMessages.add(projectDesc + "委托单位名称过长(超过200字符)");
+                continue;
+            }
+
             //地区处理
             if(StringUtils.isNotBlank(info.getAreaProvince())){
                 if("本省".equals(info.getAreaProvince())){
@@ -163,24 +189,20 @@ public class AdminProjectReportedImportService extends CrudService<AdminProjectR
                                 if(null != district && StringUtils.isNotBlank(district.getId()) && StringUtils.isNotBlank(district.getPid())){
                                     info.setS3(district.getId());
                                 }else{
-                                    map.put("success",false);
-                                    map.put("message",info.getProjectName() + "工程所在地(区)填写错误");
-                                    return  map;
+                                    errorMessages.add(projectDesc + "工程所在地(区)填写错误");
+                                    continue;
                                 }
                             }else{
-                                map.put("success",false);
-                                map.put("message",info.getProjectName() + "工程所在地(区)填写错误");
-                                return  map;
+                                errorMessages.add(projectDesc + "工程所在地(区)填写错误");
+                                continue;
                             }
                         }else{
-                            map.put("success",false);
-                            map.put("message",info.getProjectName() + "工程所在地(市)填写错误");
-                            return  map;
+                            errorMessages.add(projectDesc + "工程所在地(市)填写错误");
+                            continue;
                         }
                     }else{
-                        map.put("success",false);
-                        map.put("message",info.getProjectName() + "工程所在地(市)填写错误");
-                        return  map;
+                        errorMessages.add(projectDesc + "工程所在地(市)填写错误");
+                        continue;
                     }
                 } else if("外省".equals(info.getAreaProvince())){
                     info.setS1("999");
@@ -189,24 +211,20 @@ public class AdminProjectReportedImportService extends CrudService<AdminProjectR
                         if(null != district && StringUtils.isNotBlank(district.getId()) && StringUtils.isNotBlank(district.getPid())){
                             info.setS3(district.getId());
                         }else{
-                            map.put("success",false);
-                            map.put("message",info.getProjectName() + "工程所在地(区)填写错误");
-                            return  map;
+                            errorMessages.add(projectDesc + "工程所在地(区)填写错误");
+                            continue;
                         }
                     }else{
-                        map.put("success",false);
-                        map.put("message",info.getProjectName() + "工程所在地(区)填写错误");
-                        return  map;
+                        errorMessages.add(projectDesc + "工程所在地(区)填写错误");
+                        continue;
                     }
                 }else {
-                    map.put("success",false);
-                    map.put("message",info.getProjectName() + "工程所在省份填写错误");
-                    return  map;
+                    errorMessages.add(projectDesc + "工程所在省份填写错误");
+                    continue;
                 }
             }else{
-                map.put("success",false);
-                map.put("message",info.getProjectName() + "工程所在省份填写错误");
-                return  map;
+                errorMessages.add(projectDesc + "工程所在省份填写错误");
+                continue;
             }
 
             //项目类型处理
@@ -217,60 +235,92 @@ public class AdminProjectReportedImportService extends CrudService<AdminProjectR
             //造价记录编号判重
             Integer count = this.getByDangABH(info.getDangABH());
             if(count > 0){
-                map.put("success",false);
-                map.put("message",info.getProjectName() + "造价记录编号已存在");
-                return  map;
+                errorMessages.add(projectDesc + "造价记录编号已存在");
+                continue;
             }
             //咨询项目负责人处理
             User projectMaster = UserUtils.getByUserName(info.getProjectMaster());
             if(null != projectMaster){
-                ReportedConsultant reportedConsultant = new ReportedConsultant();
-                reportedConsultant.setReportedId(info.getId());
-                reportedConsultant.setZixunyuan(projectMaster.getId());
-                reportedConsultant.setZhucezigezhKey("161");
-                reportedConsultant.setWcyysrbl(80D);
+                ReportedConsultant masterConsultant = new ReportedConsultant();
+                masterConsultant.setReportedId(info.getId());
+                masterConsultant.setZixunyuan(projectMaster.getId());
+                masterConsultant.setZhucezigezhKey("161");
+                masterConsultant.setWcyysrbl(80D);
                 if(StringUtils.isNotBlank(info.getZiXunShouRu())){
-                    reportedConsultant.setWcyysr(Double.valueOf(info.getZiXunShouRu())*0.8);
+                    masterConsultant.setWcyysr(Double.valueOf(info.getZiXunShouRu())*0.8);
                 }else{
-                    reportedConsultant.setWcyysr(0D);
+                    masterConsultant.setWcyysr(0D);
                 }
-                reportedConsultant.setRoleFlag("1");
-                reportedConsultant.preInsert();
-                ruralProjectRecordsReportedDao.insertConsultant(reportedConsultant);
+                masterConsultant.setRoleFlag("1");
+                masterConsultant.preInsert();
+                allConsultants.add(masterConsultant);
             }else{
-                map.put("success",false);
-                map.put("message",info.getProjectName() + "项目负责人:" + info.getProjectMaster() + " 错误");
-                return  map;
+                errorMessages.add(projectDesc + "项目负责人:" + info.getProjectMaster() + " 错误");
+                continue;
             }
             //专业咨询员处理
             User projectConsultant = UserUtils.getByUserName(info.getProjectConsultant());
             if(null != projectConsultant){
-                ReportedConsultant reportedConsultant = new ReportedConsultant();
-                reportedConsultant.setReportedId(info.getId());
-                reportedConsultant.setZixunyuan(projectConsultant.getId());
-                reportedConsultant.setZhucezigezhKey("161");
-                reportedConsultant.setWcyysrbl(20D);
-                reportedConsultant.setWordnr("审核");
+                ReportedConsultant consultantConsultant = new ReportedConsultant();
+                consultantConsultant.setReportedId(info.getId());
+                consultantConsultant.setZixunyuan(projectConsultant.getId());
+                consultantConsultant.setZhucezigezhKey("161");
+                consultantConsultant.setWcyysrbl(20D);
+                consultantConsultant.setWordnr("审核");
                 if(StringUtils.isNotBlank(info.getZiXunShouRu())){
-                    reportedConsultant.setWcyysr(Double.valueOf(info.getZiXunShouRu())*0.2);
+                    consultantConsultant.setWcyysr(Double.valueOf(info.getZiXunShouRu())*0.2);
                 }else{
-                    reportedConsultant.setWcyysr(0D);
+                    consultantConsultant.setWcyysr(0D);
                 }
-                reportedConsultant.setRoleFlag("0");
-                reportedConsultant.preInsert();
-                ruralProjectRecordsReportedDao.insertConsultant(reportedConsultant);
+                consultantConsultant.setRoleFlag("0");
+                consultantConsultant.preInsert();
+                allConsultants.add(consultantConsultant);
             }else{
-                map.put("success",false);
-                map.put("message",info.getProjectName() + "专业咨询员:" + info.getProjectConsultant() + " 错误");
-                return  map;
+                errorMessages.add(projectDesc + "专业咨询员:" + info.getProjectConsultant() + " 错误");
+                continue;
             }
         }
-        map.put("success",true);
-        map.put("message","数据处理成功");
-        map.put("data",list);
+
+        if(errorMessages.isEmpty()){
+            map.put("success", true);
+            map.put("data", list);
+            map.put("consultants", allConsultants);
+        } else {
+            map.put("success", false);
+            map.put("errorMessages", errorMessages);
+        }
         return map;
     }
 
+    /**
+     * 批量导入项目数据(在同一事务中插入所有记录和咨询员数据)
+     * @param list 校验通过的项目数据列表
+     * @param allConsultants 校验阶段生成的咨询员数据
+     */
+    @SuppressWarnings("unchecked")
+    @Transactional(readOnly = false)
+    public void batchImport(List<AdminProjectReportedImport> list, List<ReportedConsultant> allConsultants){
+        // 批量插入项目记录
+        for (AdminProjectReportedImport projectReportedImport : list){
+            projectReportedImport.setProjectRecordId("0");  //项目编号
+            projectReportedImport.setProjectCode("0");      //项目代码
+            projectReportedImport.setProjectClassify("99"); //项目分类
+            projectReportedImport.setTouZiXZ("102");        //投资性质
+            projectReportedImport.setHeTongLeiXing("10");   //合同类型
+            projectReportedImport.setPorjectStruct("099");  //工程结构
+            projectReportedImport.setGCGMValue("50");       //建筑规模
+            projectReportedImport.setGCGMValueParameter("1项");//建筑规模
+            projectReportedImport.setPorjectUse("09");      //工程用途
+            projectReportedImport.setOffice(UserUtils.getSelectOffice());
+            projectReportedImport.setCompany(UserUtils.getSelectCompany());
+            dao.insert(projectReportedImport);
+        }
+        // 批量插入咨询员记录
+        for (ReportedConsultant consultant : allConsultants){
+            ruralProjectRecordsReportedDao.insertConsultant(consultant);
+        }
+    }
+
 
     @Transactional(readOnly = false)
     public void saveImport(AdminProjectReportedImport projectReportedImport){

+ 28 - 32
src/main/java/com/jeeplus/modules/projectrecord/web/AdminProjectReportedImportController.java

@@ -4,8 +4,8 @@ import com.google.common.collect.Lists;
 import com.jeeplus.common.config.Global;
 import com.jeeplus.common.persistence.Page;
 import com.jeeplus.common.utils.MyBeanUtils;
-import com.jeeplus.common.utils.excel.ExportExcel;
 import com.jeeplus.common.utils.excel.ImportExcel;
+import com.jeeplus.common.utils.ThisLocalityDownloadUtil;
 import com.jeeplus.common.web.BaseController;
 import com.jeeplus.modules.act.entity.Act;
 import com.jeeplus.modules.act.service.ActTaskService;
@@ -103,11 +103,10 @@ public class AdminProjectReportedImportController extends BaseController {
      */
     @RequiresPermissions("project:adminProjectReportedImport:import")
     @RequestMapping(value = "import/template")
-    public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
+    public String importFileTemplate(HttpServletResponse response, HttpServletRequest request, RedirectAttributes redirectAttributes) {
         try {
-            String fileName = "管理员上报导入模板.xlsx";
-            List<AdminProjectReportedImport> list = Lists.newArrayList();
-            new ExportExcel("项目上报数据", AdminProjectReportedImport.class, 1).setDataList(list).write(response, fileName).dispose();
+            ThisLocalityDownloadUtil download = new ThisLocalityDownloadUtil();
+            download.download("管理员上报导入模板.xlsx", request, response);
             return null;
         } catch (Exception e) {
             addMessage(redirectAttributes, "导入模板下载失败!失败信息:"+e.getMessage());
@@ -117,47 +116,44 @@ public class AdminProjectReportedImportController extends BaseController {
 
 
     /**
-     * 导入Excel数据
+     * 导入Excel数据(返回JSON,前端弹窗展示校验结果)
      * @param file
-     * @param redirectAttributes
      * @return
      */
+    @ResponseBody
     @RequiresPermissions("project:adminProjectReportedImport:import")
     @RequestMapping(value = "import", method= RequestMethod.POST)
-    public String importFile(MultipartFile file, RedirectAttributes redirectAttributes) {
+    public Map<String, Object> importFile(MultipartFile file) {
+        Map<String, Object> result = new HashMap<>();
         try {
-            int successNum = 0;
-            int failureNum = 0;
-            StringBuilder failureMsg = new StringBuilder();
             ImportExcel ei = new ImportExcel(file, 1, 0);
             List<AdminProjectReportedImport> list = ei.getDataList(AdminProjectReportedImport.class);
-            //数据处理
+            if(list == null || list.isEmpty()){
+                result.put("success", false);
+                result.put("message", "导入文件为空,没有数据");
+                return result;
+            }
+            // 校验所有数据,收集全部错误
             Map<String, Object> map = projectReportedImportService.disposeData(list);
             Boolean success = (Boolean) map.get("success");
             if(!success){
-                String message = (String) map.get("message");
-                addMessage(redirectAttributes, "导入项目失败!失败信息:"+message);
-                return "redirect:"+Global.getAdminPath()+"/project/adminProjectReportedImport/?repage";
+                List<String> errorMessages = (List<String>) map.get("errorMessages");
+                result.put("success", false);
+                result.put("errorMessages", errorMessages);
+                return result;
             }
-            list = (List<AdminProjectReportedImport>) map.get("data");
-            for (AdminProjectReportedImport projectReportedImport : list){
-                try{
-                    projectReportedImportService.saveImport(projectReportedImport);
-                    successNum++;
-                }catch(ConstraintViolationException ex){
-                    failureNum++;
-                }catch (Exception ex) {
-                    failureNum++;
-                }
-            }
-            if (failureNum>0){
-                failureMsg.insert(0, ",失败 "+failureNum+" 条项目记录。");
-            }
-            addMessage(redirectAttributes, "已成功导入 "+successNum+" 条项目记录"+failureMsg);
+            // 校验全部通过,批量入库(同一事务)
+            List<AdminProjectReportedImport> dataList = (List<AdminProjectReportedImport>) map.get("data");
+            List<ReportedConsultant> consultants = (List<ReportedConsultant>) map.get("consultants");
+            projectReportedImportService.batchImport(dataList, consultants);
+            result.put("success", true);
+            result.put("message", "已成功导入 " + dataList.size() + " 条项目记录");
         } catch (Exception e) {
-            addMessage(redirectAttributes, "导入项目失败!失败信息:"+e.getMessage());
+            logger.error("导入项目数据异常", e);
+            result.put("success", false);
+            result.put("message", "导入失败,请检查数据格式是否正确。如问题持续存在,请联系管理员。");
         }
-        return "redirect:"+Global.getAdminPath()+"/project/adminProjectReportedImport/?repage";
+        return result;
     }
 
 

+ 77 - 35
src/main/java/com/jeeplus/modules/ruralprojectrecords/service/RuralProjectRecordsService.java

@@ -1041,9 +1041,15 @@ public class RuralProjectRecordsService extends CrudService<RuralProjectRecordsD
 		//判定项目是否存在id(即是否为修改)查询项目的合同信息
 		WorkContractInfo oldWorkContractInfo = null;
 		WorkContractInfo newWorkContractInfo = null;
+		String oldAttachmentProjectSort = null;
+		String oldReportedState = null;
+		String oldPaperFilingStatus = null;
 		//查询老的合同信息
 		if(StringUtils.isNotBlank(projectRecords.getId())){
 			RuralProjectRecords oldInfo = this.get(projectRecords.getId());
+			oldAttachmentProjectSort = oldInfo.getAttachmentProjectSort();
+			oldReportedState = oldInfo.getReportedState();
+			oldPaperFilingStatus = oldInfo.getPaperFilingStatus();
 			if(null != oldInfo.getWorkContractInfo() && StringUtils.isNotBlank(oldInfo.getWorkContractInfo().getId())){
 				oldWorkContractInfo = workContractInfoService.get(oldInfo.getWorkContractInfo().getId());
 			}
@@ -1115,46 +1121,82 @@ public class RuralProjectRecordsService extends CrudService<RuralProjectRecordsD
 					}
 				}
 			} else{
-
-				if ("1".equals(projectRecords.getProjectType())) {	//工程咨询
-					if ("6".equals(projectRecords.getAttachmentProjectSort())) {
-						//工程造价鉴定 需要纸质归档
-						projectRecords.setPaperFilingStatus(null);
-					} else if ("7".equals(projectRecords.getAttachmentProjectSort())) {
-						projectRecords.setPaperFilingStatus("10");
-					} else if ("10".equals(projectRecords.getAttachmentProjectSort())) {	//工程咨询 配合类
-						projectRecords.setPaperFilingStatus("10");
-					} else if ("12".equals(projectRecords.getAttachmentProjectSort())) {	//工程咨询 配合类
-						projectRecords.setPaperFilingStatus("10");
-					} else {
-						projectRecords.setPaperFilingStatus("10");
-					}
-				} else if ("2".equals(projectRecords.getProjectType())) {	//造价审核
-					//预算审核、结算审核、分包审核 需要纸质归档
-					if ("2".equals(projectRecords.getAttachmentProjectSort()) || "4".equals(projectRecords.getAttachmentProjectSort()) || "7".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort()) || "11".equals(projectRecords.getAttachmentProjectSort()) || "12".equals(projectRecords.getAttachmentProjectSort())) {
-						projectRecords.setPaperFilingStatus(null);
-					}else{
-						projectRecords.setPaperFilingStatus("10");
+				//修改时,从数据库恢复原有的paperFilingStatus,避免前端传值或无关参数修改覆盖归档流程中已变更的状态
+				projectRecords.setPaperFilingStatus(oldPaperFilingStatus);
+				if(!StringUtils.equals(oldAttachmentProjectSort, projectRecords.getAttachmentProjectSort())){
+					//仅项目类别发生变化才重新计算纸质归档状态
+					if ("1".equals(projectRecords.getProjectType())) {	//工程咨询
+						if ("6".equals(projectRecords.getAttachmentProjectSort())) {
+							//工程造价鉴定 需要纸质归档
+							projectRecords.setPaperFilingStatus(null);
+						} else if ("7".equals(projectRecords.getAttachmentProjectSort())) {
+							projectRecords.setPaperFilingStatus("10");
+						} else if ("10".equals(projectRecords.getAttachmentProjectSort())) {	//工程咨询 配合类
+							projectRecords.setPaperFilingStatus("10");
+						} else if ("12".equals(projectRecords.getAttachmentProjectSort())) {	//工程咨询 配合类
+							projectRecords.setPaperFilingStatus("10");
+						} else {
+							projectRecords.setPaperFilingStatus("10");
+						}
+					} else if ("2".equals(projectRecords.getProjectType())) {	//造价审核
+						//预算审核、结算审核、分包审核 需要纸质归档
+						if ("2".equals(projectRecords.getAttachmentProjectSort()) || "4".equals(projectRecords.getAttachmentProjectSort()) || "7".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort()) || "11".equals(projectRecords.getAttachmentProjectSort()) || "12".equals(projectRecords.getAttachmentProjectSort())) {
+							projectRecords.setPaperFilingStatus(null);
+						}else{
+							projectRecords.setPaperFilingStatus("10");
+						}
 					}
 				}
 			}
 		}
-		//判断项目类型并判断项目类别
-		switch (projectRecords.getProjectType()){
-			case "1":
-				if("8".equals(projectRecords.getAttachmentProjectSort())){
-					projectRecords.setReportedState("10");
-				}else{
-					projectRecords.setReportedState(null);
-				}
-				break;
-			case "2":
-				if("5".equals(projectRecords.getAttachmentProjectSort()) || "6".equals(projectRecords.getAttachmentProjectSort()) || "8".equals(projectRecords.getAttachmentProjectSort()) || "20".equals(projectRecords.getAttachmentProjectSort()) || "10".equals(projectRecords.getAttachmentProjectSort())){
-					projectRecords.setReportedState("10");
-				}else{
-					projectRecords.setReportedState(null);
+		//判断项目类型并判断项目类别(新增时设置初始上报状态,修改时仅在项目类别变更时重新计算,避免覆盖上报流程中已变更的状态)
+		if(projectRecords.getIsNewRecord()){
+			switch (projectRecords.getProjectType()){
+				case "1":
+					if("8".equals(projectRecords.getAttachmentProjectSort())){
+						projectRecords.setReportedState("10");
+					}else{
+						projectRecords.setReportedState(null);
+					}
+					break;
+				case "2":
+					if("5".equals(projectRecords.getAttachmentProjectSort()) ||
+							"6".equals(projectRecords.getAttachmentProjectSort()) ||
+							"8".equals(projectRecords.getAttachmentProjectSort()) ||
+							"20".equals(projectRecords.getAttachmentProjectSort()) ||
+							"10".equals(projectRecords.getAttachmentProjectSort())){
+						projectRecords.setReportedState("10");
+					}else{
+						projectRecords.setReportedState(null);
+					}
+					break;
+			}
+		} else {
+			//修改时,从数据库恢复原有的reportedState,避免前端传值覆盖上报流程中已变更的状态
+			projectRecords.setReportedState(oldReportedState);
+			if(!StringUtils.equals(oldAttachmentProjectSort, projectRecords.getAttachmentProjectSort())){
+				//仅项目类别发生变化才重新计算上报状态
+				switch (projectRecords.getProjectType()){
+					case "1":
+						if("8".equals(projectRecords.getAttachmentProjectSort())){
+							projectRecords.setReportedState("10");
+						}else{
+							projectRecords.setReportedState(null);
+						}
+						break;
+					case "2":
+						if("5".equals(projectRecords.getAttachmentProjectSort()) ||
+								"6".equals(projectRecords.getAttachmentProjectSort()) ||
+								"8".equals(projectRecords.getAttachmentProjectSort()) ||
+								"20".equals(projectRecords.getAttachmentProjectSort()) ||
+								"10".equals(projectRecords.getAttachmentProjectSort())){
+							projectRecords.setReportedState("10");
+						}else{
+							projectRecords.setReportedState(null);
+						}
+						break;
 				}
-				break;
+			}
 		}
 		if("其他".equals(projectRecords.getBelongingDepartmentName())){
 			projectRecords.setBelongingDepartment(projectRecords.getBelongingDepartmentName());

+ 92 - 0
src/main/webapp/WEB-INF/tags/table/importExcelAjax.tag

@@ -0,0 +1,92 @@
+<%@ tag language="java" pageEncoding="UTF-8"%>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%@ attribute name="url" type="java.lang.String" required="true"%>
+<%-- AJAX导入标签:提交后返回JSON,校验失败弹窗展示所有错误,全部通过才批量入库 --%>
+<button id="btnImportAjax" class="layui-btn layui-btn-sm layui-bg-blue" data-toggle="tooltip" data-placement="left" title="导入">
+	导入
+</button>
+<div id="importAjaxBox" class="hide">
+	<div style="padding-left:20px;text-align:center;">
+		<input id="ajaxUploadFile" name="file" type="file" style="width:330px"/>
+		<br/><span style="color:#999;font-size:12px;">导入文件不能超过5M,仅允许导入"xls"或"xlsx"格式文件!</span>
+		<br/><span style="color:red;font-size:12px;">数据存在任何问题将全部拒绝导入,请修正后重新导入。</span>
+	</div>
+</div>
+<script type="text/javascript">
+$(document).ready(function() {
+	$("#btnImportAjax").click(function(){
+		top.layer.open({
+		    type: 1,
+		    area: [520, 300],
+		    title:"导入数据",
+            skin: 'three-btns with-demo',
+		    content:$("#importAjaxBox").html(),
+		    btn: ['下载模板','确定', '关闭'],
+			    btn1: function(index){
+				  window.location.href='${url}/template';
+				  return false;
+			  },
+		    btn2: function(index, layero){
+			        var fileInput = layero.find('#ajaxUploadFile')[0];
+			        if(!fileInput.files || fileInput.files.length === 0){
+			        	top.layer.msg('请选择要导入的文件', {icon: 0});
+			        	return false;
+			        }
+			        var formData = new FormData();
+			        formData.append('file', fileInput.files[0]);
+			        top.layer.load(2);
+			        $.ajax({
+			        	url: '${url}',
+			        	type: 'POST',
+			        	data: formData,
+			        	processData: false,
+			        	contentType: false,
+			        	success: function(response){
+			        		top.layer.closeAll('loading');
+			        		if(response.success){
+			        			top.layer.close(index);
+			        			top.layer.msg(response.message, {icon: 1, time: 2000}, function(){
+			        				location.reload();
+			        			});
+			        		} else {
+			        			top.layer.close(index);
+			        			var hasErrors = response.errorMessages && response.errorMessages.length > 0;
+			        			var errorHtml = '<div style="padding:15px;max-height:400px;overflow-y:auto;word-wrap:break-word;word-break:break-all;">';
+			        			if(hasErrors){
+			        				errorHtml += '<p style="color:red;font-weight:bold;margin-bottom:10px;">数据校验失败,共 ' + response.errorMessages.length + ' 条错误,请修正后重新导入:</p>';
+			        				errorHtml += '<ul style="list-style:decimal;padding-left:20px;">';
+			        				for(var i = 0; i < response.errorMessages.length; i++){
+			        					errorHtml += '<li style="color:#333;margin-bottom:5px;line-height:1.6;">' + response.errorMessages[i] + '</li>';
+			        				}
+			        				errorHtml += '</ul>';
+			        			} else {
+			        				errorHtml += '<p style="color:red;line-height:1.8;">' + (response.message || '导入失败') + '</p>';
+			        			}
+			        			errorHtml += '</div>';
+			        			top.layer.open({
+			        				type: 1,
+			        				area: hasErrors ? ['600px', '500px'] : ['450px', '220px'],
+			        				title: hasErrors ? '导入校验失败' : '导入失败',
+			        				content: errorHtml,
+			        				btn: ['知道了'],
+			        				skin: 'three-btns',
+			        				btn1: function(errIndex){
+			        					top.layer.close(errIndex);
+			        				}
+			        			});
+			        		}
+			        	},
+			        	error: function(){
+			        		top.layer.closeAll('loading');
+			        		top.layer.msg('导入请求失败,请稍后重试', {icon: 2});
+			        	}
+			        });
+			        return false;
+			  },
+			  btn3: function(index){
+				  top.layer.close(index);
+    	       }
+		});
+	});
+});
+</script>

BIN
src/main/webapp/dot/管理员上报导入模板.xlsx


+ 1 - 1
src/main/webapp/webpage/modules/ruralprojectrecords/reported/import/adminProjectReportedImportList.jsp

@@ -348,7 +348,7 @@
 						</shiro:hasPermission>
 
 						<shiro:hasPermission name="project:adminProjectReportedImport:import">
-							<table:importExcel url="${ctx}/project/adminProjectReportedImport/import"></table:importExcel><!-- 导入按钮 -->
+							<table:importExcelAjax url="${ctx}/project/adminProjectReportedImport/import"></table:importExcelAjax><!-- 导入按钮 -->
 						</shiro:hasPermission>
 
 						<shiro:hasPermission name="project:adminProjectReportedImport:export">