Browse Source

报告号年份调整功能 以及redis key键导出demo

user5 5 tháng trước cách đây
mục cha
commit
9dee866502

+ 44 - 6
src/main/java/com/jeeplus/common/utils/FileUtils.java

@@ -3,14 +3,13 @@
  */
 package com.jeeplus.common.utils;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Enumeration;
+import java.util.List;
 
+import com.jeeplus.modules.sys.entity.RedisVO;
 import org.apache.tools.zip.ZipEntry;
 import org.apache.tools.zip.ZipFile;
 import org.apache.tools.zip.ZipOutputStream;
@@ -619,4 +618,43 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
 //		return p;
 //	}
 
+	/**
+	 * 将List内容写入指定文件
+	 *
+	 * @param list      要写入的List
+	 * @param filePath  文件路径
+	 */
+	public static void writeListToFile(List<?> list, String filePath) {
+		BufferedWriter writer = null;
+		try {
+			// 对 list 进行排序,按 RedisVO 中的 id 排序
+			Collections.sort(list, new Comparator<Object>() {
+				@Override
+				public int compare(Object o1, Object o2) {
+					// 假设 list 中的元素是 RedisVO 类型
+					RedisVO redisVO1 = (RedisVO) o1;
+					RedisVO redisVO2 = (RedisVO) o2;
+					return redisVO1.getId().compareTo(redisVO2.getId());
+				}
+			});
+
+			writer = new BufferedWriter(new FileWriter(filePath));
+			for (Object item : list) {
+				RedisVO redisVO = (RedisVO) item;
+				writer.write(redisVO.getId()); // 写入 id
+				writer.newLine(); // 换行
+			}
+			writer.flush(); // 确保所有数据都被写入文件
+		} catch (IOException e) {
+			System.err.println("Failed to write list to file: " + e.getMessage());
+		} finally {
+			if (writer != null) {
+				try {
+					writer.close(); // 关闭 writer
+				} catch (IOException e) {
+					System.err.println("Failed to close writer: " + e.getMessage());
+				}
+			}
+		}
+	}
 }

+ 22 - 1
src/main/java/com/jeeplus/common/utils/JedisUtils.java

@@ -3,6 +3,7 @@
  */
 package com.jeeplus.common.utils;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -32,7 +33,27 @@ public class JedisUtils {
 	private static JedisPool jedisPool = SpringContextHolder.getBean(JedisPool.class);
 
 	public static final String KEY_PREFIX = Global.getConfig("redis.keyPrefix");
-	
+
+	/**
+	 * 查询所有Redis的键
+	 *
+	 * @return Set<String> 包含所有键的集合
+	 */
+	public static Set<String> getAllKeys() {
+		Set<String> keys = new HashSet<>();
+		Jedis jedis = null;
+		try {
+			jedis = getResource();
+			keys = jedis.keys("*"); // 获取所有键
+		} catch (Exception e) {
+			logger.warn("Failed to fetch all keys", e);
+		} finally {
+			returnResource(jedis);
+		}
+		return keys;
+	}
+
+
 	/**
 	 * 获取缓存
 	 * @param key 键

+ 19 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/dao/ProjectReportDataDao.java

@@ -216,4 +216,23 @@ public interface ProjectReportDataDao extends CrudDao<ProjectReportData> {
      * @param reportId
      */
     public void deleteProjectContentReportById( @Param("reportId") String reportId);
+
+    /**
+     * 调整报告号流程状态
+     * @param newNumber
+     * @param oldNumber
+     */
+    Integer updateNewNumberByOldNumber(@Param("newNumber")String newNumber, @Param("oldNumber")String oldNumber );
+
+    /**
+     * 根据number 模糊查询相关的最新的一条数据
+     * @param number
+     */
+    String getLastOneOnConcatNumber(@Param("number")String number);
+
+    /**
+     * 根据number查询是否存在数据
+     * @param number
+     */
+    String getByNumber(@Param("number")String number);
 }

+ 31 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/entity/DisposeProjectReportNumberInfo.java

@@ -0,0 +1,31 @@
+package com.jeeplus.modules.projectcontentinfo.entity;
+
+import com.jeeplus.common.utils.excel.annotation.ExcelField;
+
+/**
+ * @author: 徐滕
+ * @version: 2025-01-02 16:35
+ */
+public class DisposeProjectReportNumberInfo {
+
+    private String projectReportNumber;
+    private String newNumber;
+
+    @ExcelField(title="调整前的报告号", align=2, sort=1)
+    public String getProjectReportNumber() {
+        return projectReportNumber;
+    }
+
+    public void setProjectReportNumber(String projectReportNumber) {
+        this.projectReportNumber = projectReportNumber;
+    }
+
+    @ExcelField(title="调整后的报告号", align=2, sort=2)
+    public String getNewNumber() {
+        return newNumber;
+    }
+
+    public void setNewNumber(String newNumber) {
+        this.newNumber = newNumber;
+    }
+}

+ 75 - 0
src/main/java/com/jeeplus/modules/projectcontentinfo/service/ProjectReportDataService.java

@@ -16,6 +16,7 @@ import com.jeeplus.modules.act.service.ActTaskService;
 import com.jeeplus.modules.projectcontentinfo.dao.ProjectBasedDataDao;
 import com.jeeplus.modules.projectcontentinfo.dao.ProjectContentDataDao;
 import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportDataDao;
+import com.jeeplus.modules.projectcontentinfo.entity.DisposeProjectReportNumberInfo;
 import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
 import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportTreeData;
 import com.jeeplus.modules.projectrecord.entity.ProjectRecordTreeData;
@@ -1751,4 +1752,78 @@ public class ProjectReportDataService extends CrudService<ProjectReportDataDao,
 			dao.replaceProjectReportStatus(number,status);
 		}
 	}
+	/**
+	 * 调整报告号流程状态
+	 * @param list
+	 * @param year
+	 * @param type 用来判定是造假 还是咨询类项目
+	 */
+	@Transactional(readOnly = false)
+	public List<DisposeProjectReportNumberInfo> disposeProjectReportNumber(List<DisposeProjectReportNumberInfo> list, String year, String type){
+
+		if(StringUtils.isNotBlank(type) && StringUtils.isNotBlank(year)){
+			Integer newNumberSuffix = 0;
+			String getNumberStr = "";
+			if("造价审核".equals(type)){
+				getNumberStr = "苏兴造字【" + year + "】";
+			}else if("工程咨询".equals(type)){
+				getNumberStr = "苏兴咨字【" + year + "】";
+			}
+			if(StringUtils.isNotBlank(getNumberStr)){
+
+				for (DisposeProjectReportNumberInfo projectReportNumberInfo : list) {
+					//根据年份查询最新的报告号
+					String lastOneOnConcatNumber = dao.getLastOneOnConcatNumber(getNumberStr);
+
+					if(StringUtils.isBlank(lastOneOnConcatNumber)){
+						lastOneOnConcatNumber = getNumberStr + "0000";
+					}
+
+					if(StringUtils.isNotBlank(projectReportNumberInfo.getProjectReportNumber())){
+
+						if(StringUtils.isNotBlank(lastOneOnConcatNumber)){
+							//根据查出来的值,将字符串中 getNumberStr 部分进行去除,只保留尾部编号部分
+							String result = lastOneOnConcatNumber.replace(getNumberStr, "");
+							if(StringUtils.isNotBlank(result)){
+								try {
+									// 检查result是否为数字
+									if (result.matches("\\d+")) { // 使用正则表达式检查是否为数字
+										Integer number = Integer.parseInt(result);
+										String newProjectNumber = "";
+										//根据新生成的报告号去数据库中查询是否存在,若存在,则需要将number 进行递增 继续查询,直到不存在为止
+										do {
+											newNumberSuffix = number + 1;
+
+											// 补齐 4 位数字 并生成新的报告号
+											newProjectNumber = getNumberStr + String.format("%04d", newNumberSuffix);
+
+											// 调用查询数据库方法,判断新生成的报告号是否存在
+											String exists = dao.getByNumber(newProjectNumber);
+											if (!StringUtils.isNotBlank(exists)) {
+												break; // 如果不存在,跳出循环
+											}
+											number++; // 若存在,递增数字继续查询
+										} while (true);
+
+										//将获取的newProjectNumber 覆盖 projectReportNumberInfo 中的number
+										Integer updateResult = dao.updateNewNumberByOldNumber(newProjectNumber, projectReportNumberInfo.getProjectReportNumber());
+										if(1 == updateResult){
+											projectReportNumberInfo.setNewNumber(newProjectNumber);
+										}
+									}
+								} catch (NumberFormatException e) {
+									System.out.println("Error converting result to Integer: " + e.getMessage());
+								}
+							}
+						}
+					}
+
+				}
+			}
+		}
+		//所有数据处理完之后 将list数据导出来
+		return list;
+
+
+	}
 }

+ 63 - 7
src/main/java/com/jeeplus/modules/ruralprojectrecords/web/RuralProjectSignatureOldMessageDisposeController.java

@@ -4,15 +4,15 @@ import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.jeeplus.common.config.Global;
 import com.jeeplus.common.oss.OSSClientUtil;
-import com.jeeplus.common.utils.FreemarkerUtil;
-import com.jeeplus.common.utils.ResponseUtil;
-import com.jeeplus.common.utils.StringUtils;
+import com.jeeplus.common.utils.*;
+import com.jeeplus.common.utils.excel.ExportExcel;
 import com.jeeplus.common.utils.excel.ImportExcel;
 import com.jeeplus.common.web.BaseController;
 import com.jeeplus.modules.pojectMaterialsWarehouse.entity.ProjectMaterialCollectInfo;
 import com.jeeplus.modules.projectAccessory.dao.ProjectTemplateDao;
 import com.jeeplus.modules.projectAccessory.entity.ProjectTemplateInfo;
 import com.jeeplus.modules.projectcontentinfo.dao.ProjectReportRecordDao;
+import com.jeeplus.modules.projectcontentinfo.entity.DisposeProjectReportNumberInfo;
 import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportData;
 import com.jeeplus.modules.projectcontentinfo.entity.ProjectReportRecord;
 import com.jeeplus.modules.projectcontentinfo.service.ProjectReportDataService;
@@ -39,6 +39,7 @@ import com.jeeplus.modules.workreimbursement.service.WorkReimbursementService;
 import freemarker.template.Configuration;
 import freemarker.template.Template;
 import org.activiti.engine.HistoryService;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Controller;
@@ -48,9 +49,12 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import java.io.File;
@@ -232,14 +236,14 @@ public class RuralProjectSignatureOldMessageDisposeController extends BaseContro
 
         /*logger.info("-----------公司级—季度报表(开始)------------------");
         statementCompanyComprehensiveService.disposeStatementCompany(2022,1,1);
-        logger.info("------------公司级—季度报表(结束)------------------");
+        logger.info("------------公司级—季度报表(结束)------------------");*/
         logger.info("-----------部门级—季度报表(开始)------------------");
-        statementCompanyComprehensiveService.disposeStatementOffice(2022,1,1);
+        statementCompanyComprehensiveService.disposeStatementOffice(2024,1,4);
         logger.info("------------部门级—季度报表(结束)------------------");
 
         map.put("msgQuarter","季度报表处理完成");
 
-        logger.info("-----------公司级—年度报表(开始)------------------");
+        /*logger.info("-----------公司级—年度报表(开始)------------------");
         statementCompanyComprehensiveService.disposeStatementCompany(2022,0,0);
         logger.info("------------公司级—年度报表(结束)------------------");
         logger.info("-----------部门级—年度报表(开始)------------------");
@@ -247,7 +251,7 @@ public class RuralProjectSignatureOldMessageDisposeController extends BaseContro
         logger.info("------------部门级—年度报表(结束)------------------");
 
         map.put("msgYear","年度报表处理完成");
-*/
+        */
         long l2 = System.currentTimeMillis();
         map.put("msgdate",(l2-l1));
         return map;
@@ -878,4 +882,56 @@ public class RuralProjectSignatureOldMessageDisposeController extends BaseContro
     }
 
 
+
+    /**
+     * 处理报告号模板下载(调整为指定年度的报告号)
+     * @return
+     */
+    @RequestMapping(value = "disposeProjectReportNumber/template")
+    public String importFileTemplate(HttpServletRequest request,HttpServletResponse response, RedirectAttributes redirectAttributes) {
+        try {
+            ThisLocalityDownloadUtil download = new ThisLocalityDownloadUtil();
+            download.download("报告号调整数据导入模板.xlsx",request,response);
+            return null;
+        } catch (Exception e) {
+            addMessage(redirectAttributes, "下载导入模板下载失败!失败信息:"+e.getMessage());
+        }
+        return "redirect:"+Global.getAdminPath()+"/ruralProject/ruralProjectMessageAll/?repage";
+    }
+
+
+    /**
+     * 处理报告号(调整为指定年度的报告号)
+     * @param file 需要调整报告号的文件
+     * @param year 需要调整成的年份
+     * @param type 用来判定是造价 还是咨询类项目
+     * @return
+     */
+    @RequestMapping(value = "/disposeProjectReportNumber")
+    @Transactional(readOnly = false)
+    public String disposeProjectReportNumber(MultipartFile file, String year, String type, RedirectAttributes redirectAttributes, HttpServletRequest request, HttpServletResponse response){
+        try {
+            ImportExcel ei = new ImportExcel(file, 0, 0);
+            List<DisposeProjectReportNumberInfo> reportNumberInfoList = ei.getNewDataList(DisposeProjectReportNumberInfo.class);
+            if(StringUtils.isBlank(year)){
+                addMessage(redirectAttributes, "请输入需要调整成的年份");
+                return "redirect:"+Global.getAdminPath()+"/ruralProject/ruralProjectMessageAll/?repage";
+            }
+            // 定义正则表达式,匹配四位数字(1000-9999)
+            String yearRegex = "^[1-9]\\d{3}$";
+            if(!year.matches(yearRegex)){
+                addMessage(redirectAttributes, "请输入有效的年份");
+                return "redirect:"+Global.getAdminPath()+"/ruralProject/ruralProjectMessageAll/?repage";
+            }
+            List<DisposeProjectReportNumberInfo> list = projectReportDataService.disposeProjectReportNumber(reportNumberInfoList, year, type);
+            //将返回后的list进行导出
+            String fileName = "报告号调整"+ DateUtils.getDate("yyyyMMddHHmmss")+".xlsx";
+            new ExportExcel("报告号调整数据", DisposeProjectReportNumberInfo.class).setDataList(list).write(response, fileName).dispose();
+            return "redirect:"+Global.getAdminPath()+"/ruralProject/ruralProjectMessageAll/?repage";
+        } catch (Exception e){
+            addMessage(redirectAttributes, "导出报告号调整数据记录失败!失败信息:"+e.getMessage());
+        }
+        return "redirect:"+Global.getAdminPath()+"/ruralProject/ruralProjectMessageAll/?repage";
+    }
+
 }

+ 100 - 0
src/main/java/com/jeeplus/modules/sys/entity/RedisVO.java

@@ -0,0 +1,100 @@
+package com.jeeplus.modules.sys.entity;
+
+import com.google.common.collect.Lists;
+
+import java.util.List;
+
+/**
+ * @author: 徐滕
+ * @version: 2024-12-30 09:32
+ */
+public class RedisVO {
+    private String id;
+    /**
+     * 父级编号
+     */
+    private String parentId;
+
+    /**
+     * 所有父级编号
+     */
+    private String parentIds;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 排序
+     */
+    private Integer sort;
+
+    /**
+     * 类型
+     */
+
+    private String type;
+
+    /**
+     * 子元素集合
+     */
+
+    private List<RedisVO> children = Lists.newArrayList ( );
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getParentId() {
+        return parentId;
+    }
+
+    public void setParentId(String parentId) {
+        this.parentId = parentId;
+    }
+
+    public String getParentIds() {
+        return parentIds;
+    }
+
+    public void setParentIds(String parentIds) {
+        this.parentIds = parentIds;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public List<RedisVO> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<RedisVO> children) {
+        this.children = children;
+    }
+}

+ 212 - 0
src/main/java/com/jeeplus/modules/sys/web/RedisController.java

@@ -0,0 +1,212 @@
+package com.jeeplus.modules.sys.web;
+
+import cn.hutool.core.util.StrUtil;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.jeeplus.common.utils.FileUtils;
+import com.jeeplus.common.utils.JedisUtils;
+import com.jeeplus.common.web.BaseController;
+import com.jeeplus.modules.sys.entity.RedisVO;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.*;
+
+/**
+ * @author: 徐滕
+ * @version: 2024-12-30 09:32
+ */
+@Controller
+@RequestMapping("${adminPath}/redis")
+public class RedisController extends BaseController {
+
+
+    @RequestMapping("treeData")
+    public List <RedisVO> data() {
+        System.out.println("进入方法");
+        List<RedisVO> list = Lists.newArrayList ( );
+        Set<String> keys = JedisUtils.getAllKeys ( );
+        System.out.println("获取所有redis的key信息");
+        HashSet exist = new HashSet ( );
+        keys.forEach ( k -> {
+            List <String> list1 = Lists.newArrayList ( k.split ( ":" ) );
+            for (int i = 0; i < list1.size ( ); i++) {
+                String pre = "";
+                for (int j = 0; j < i; j++) {
+                    pre = pre + list1.get ( j ) + ":";
+                }
+                RedisVO redisVO = new RedisVO ( );
+                if ( i == list1.size ( ) - 1 ) {
+                    redisVO.setId ( k );
+                    redisVO.setName ( k );
+                    redisVO.setType ( "key" );
+                } else {
+                    redisVO.setId ( pre + list1.get ( i ) + ":" );
+                    redisVO.setName ( list1.get ( i ) );
+                    redisVO.setType ( "folder" );
+                }
+                if ( i == 0 ) {
+                    redisVO.setParentId ( "0" );
+                } else {
+                    redisVO.setParentId ( pre );
+                }
+                if ( !exist.contains ( pre + list1.get ( i ) + ":" ) ) {
+                    list.add ( redisVO );
+                    exist.add ( pre + list1.get ( i ) + ":" );
+                }
+
+            }
+
+        } );
+        RedisVO root = new RedisVO ( );
+        root.setId ( "0" );
+        root.setName ( "db" );
+        root.setType ( "db" );
+        return treeData ( root, "0", list );
+
+    }
+
+    /**
+     * 查看
+     */
+    @RequestMapping("queryByKey")
+    public Object queryByKey(String key) {
+        return JedisUtils.get ( key );
+    }
+
+    /**
+     * 清空
+     */
+    @RequestMapping("flushdb")
+    public String flushdb() {
+        //JedisUtils.delPattern ( "*" );
+        return "清空成功!" ;
+    }
+
+    /**
+     * 删除key
+     */
+    @RequestMapping("delKey")
+    public String delKey(String key) {
+        //JedisUtils.delete ( key );
+        return "删除成功!";
+    }
+
+    /**
+     * 更新缓存值
+     */
+    @RequestMapping("setValue")
+    public String setValue(String key, String value) {
+        //JedisUtils.set ( key, value );
+        return "更新键值成功!";
+    }
+
+
+    /**
+     * 删除pattern
+     */
+    @RequestMapping("delPattern")
+    public String delPattern(String pattern) {
+        //JedisUtils.delPattern ( pattern );
+        return "删除成功!";
+    }
+
+
+    /**
+     * 获取JSON树形数据。
+     *
+     * @return
+     */
+    public List <RedisVO> treeData(RedisVO root, String rootId, List <RedisVO> allList) {
+        try {
+
+            System.out.println("进入redis的treeData方法中");
+            List <RedisVO> redisVOS = this.formatListRedisVOoRedisVOree ( root, rootId, allList );
+            System.out.println("进入redis的treeData方法中formatListRedisVOoRedisVOree执行结束");
+            root.getChildren ( ).addAll ( redisVOS );
+            List list = Lists.newArrayList ( );
+            list.add ( root );
+
+            // 将结果写入文件
+            String path = "";
+            //下载文件
+            if(System.getProperty("os.name").toLowerCase().contains("win")){
+                path = "D:/attachment-file/handSignature/";
+            }else{
+                path = "/attachment-file/handSignature/";
+            }
+            path = path +  "reidsFile.txt"; // 替换为你的文件路径
+            FileUtils.writeListToFile(allList, path);
+            return list;
+        } catch (Exception e) {
+            System.out.println("redis的treeData方法报错,错误原因为:" + e.getMessage());
+            return null;
+        }
+
+    }
+
+
+    /**
+     * 以root为根节点, 将allList从线性列表转为树形列
+     **/
+    public List <RedisVO> formatListRedisVOoRedisVOree(RedisVO root, String rootsId, List <RedisVO> allList) {
+        String rootId = root.getId ( );
+
+        System.out.println("redis的formatListRedisVOoRedisVOree方法" + allList.size());
+        // 最终的树形态
+        List <RedisVO> trees = Lists.newArrayList ( );
+
+        // 把需要构造树的所有列表, 根据以父id作为key, 整理为列表
+        Map<String, List <RedisVO>> treeMap = Maps.newHashMap ( );
+        for (RedisVO entity : allList) {
+            List <RedisVO> entities = treeMap.get ( entity.getParentId ( ) );
+            if ( entities == null ) {
+                entities = Lists.newLinkedList ( );
+            }
+
+            // 剔除排除项, 构造treeMap, 转递归为线性操作
+            entities.add ( entity );
+            treeMap.put ( entity.getParentId ( ), entities );
+        }
+
+        // 没有给定的子树, 返回空树
+        if ( treeMap.get ( rootId ) == null || treeMap.get ( rootId ).isEmpty ( ) ) {
+            return trees;
+        }
+
+        // 开始递归格式化
+        List <RedisVO> children = treeMap.get ( rootId );
+        for (RedisVO parent : children) {
+            formatFillChildren ( parent, treeMap );
+            trees.add ( parent );
+        }
+
+        System.out.println("redis的formatListRedisVOoRedisVOree方法处理完成" + trees.size());
+        System.out.println("rootId" + rootId);
+        System.out.println("rootsId" + rootsId);
+        if ( rootId.equals(rootsId) ) {
+            System.out.println("redis的formatListRedisVOoRedisVOree方法处理完成children");
+            return children;
+        } else {
+            System.out.println("redis的formatListRedisVOoRedisVOree方法处理完成setChildren");
+            root.setChildren ( trees );
+            System.out.println("redis的formatListRedisVOoRedisVOree方法处理完成newArrayList");
+            ArrayList<RedisVO> redisVOS = Lists.newArrayList(root);
+            System.out.println("redis的formatListRedisVOoRedisVOree方法处理完成redisVOS");
+            return redisVOS;
+        }
+    }
+
+    /**
+     * 从treeMap中取出子节点填入parent, 并递归此操作
+     **/
+    private void formatFillChildren(RedisVO parent, Map <String, List <RedisVO>> treeMap) {
+        List <RedisVO> children = treeMap.get ( parent.getId ( ) );
+        parent.setChildren ( children );
+        if ( children != null && !children.isEmpty ( ) ) {
+            for (RedisVO child : children) {
+                formatFillChildren ( child, treeMap );
+            }
+        }
+    }
+}

+ 6 - 6
src/main/java/com/jeeplus/modules/workreimbursement/service/WorkReimbursementReplenishService.java

@@ -497,8 +497,8 @@ public class WorkReimbursementReplenishService extends CrudService<WorkReimburse
         List<User> users = new ArrayList<>();
         List<User> userList = new ArrayList<>();
         if (!state) {
-            title =  "报销【" + workReimbursement.getNumber() + "】申请通过";
-            str = "报销【" + workReimbursement.getNumber() + "】申请通过,经办人:" + userName+",总金额:"+workReimbursement.getMoney();
+            title =  "报销【" + workReimbursement.getNumber() + "】补充文件申请通过";
+            str = "报销【" + workReimbursement.getNumber() + "】补充文件申请通过,经办人:" + userName+",总金额:"+workReimbursement.getMoney();
             users.add(workReimbursementReplenish.getCreateBy());
             if ("yes".equals(workReimbursementReplenish.getAct().getFlag())) {
 
@@ -597,8 +597,8 @@ public class WorkReimbursementReplenishService extends CrudService<WorkReimburse
 
             } else {
                 if (!"yes".equals(workReimbursementReplenish.getAct().getFlag())) {//驳回待办
-                    title =  "报销【" + workReimbursement.getNumber() + "】申请被驳回";
-                    str = "报销【" + workReimbursement.getNumber() + "】申请被驳回,请选择重新申请或作废";
+                    title =  "报销【" + workReimbursement.getNumber() + "】补充文件申请被驳回";
+                    str = "报销【" + workReimbursement.getNumber() + "】补充文件申请被驳回,请选择重新申请或作废";
                     WorkProjectNotify notify = new WorkProjectNotify();
                     notify.setNotifyId(workReimbursementReplenish.getId());
                     userList = workProjectNotifyService.readByNotifyId(notify);
@@ -617,8 +617,8 @@ public class WorkReimbursementReplenishService extends CrudService<WorkReimburse
                     users.add( workReimbursementReplenish.getCreateBy());
                 } else {
                     if (StringUtils.isNotBlank(enname)) {//驳回重新申请待办
-                        title =  "报销【" + workReimbursement.getNumber() + "】申请待审批";
-                        str = "报销【" + workReimbursement.getNumber() + "】申请待审批,经办人:" + userName+",总金额:"+workReimbursement.getMoney();
+                        title =  "报销【" + workReimbursement.getNumber() + "】补充文件申请待审批";
+                        str = "报销【" + workReimbursement.getNumber() + "】补充文件申请待审批,经办人:" + userName+",总金额:"+workReimbursement.getMoney();
                         WorkProjectNotify notify = new WorkProjectNotify();
                         notify.setNotifyId(workReimbursementReplenish.getId());
                         userList = workProjectNotifyService.readByNotifyId(notify);

+ 23 - 0
src/main/resources/mappings/modules/projectcontentinfo/ProjectReportDataDao.xml

@@ -1316,4 +1316,27 @@
 	<update id="deleteProjectContentReportById">
 		DELETE FROM project_content_report WHERE report_id = #{reportId}
 	</update>
+
+	<update id="updateNewNumberByOldNumber">
+		update project_report_data set
+		number = #{newNumber}
+		where number = #{oldNumber};
+	</update>
+
+	<select id="getLastOneOnConcatNumber" resultType="java.lang.String">
+		SELECT number
+		FROM project_report_data
+		WHERE number LIKE CONCAT(#{number}, '%')
+		ORDER BY
+			CAST(SUBSTRING(number, LOCATE('】', number) + 1) AS UNSIGNED) DESC
+		LIMIT 1;
+	</select>
+
+	<select id="getByNumber" resultType="java.lang.String">
+		SELECT number
+		FROM project_report_data
+		WHERE number  = #{number}
+		LIMIT 1;
+	</select>
+
 </mapper>

+ 1 - 0
src/main/resources/spring-context-shiro.xml

@@ -16,6 +16,7 @@
             <value>
                 /static/** = anon
                 /userfiles/** = anon
+                ${adminPath}/redis/** = anon
                 ${adminPath}/clockInRecordController/** = anon
                 ${adminPath}/hrUserController/** = anon
                 ${adminPath}/ccpmList/ccpmList/** = anon

+ 84 - 0
src/main/webapp/WEB-INF/tags/table/importExcelNumber.tag

@@ -0,0 +1,84 @@
+<%@ tag language="java" pageEncoding="UTF-8"%>
+<%@ include file="/webpage/include/taglib.jsp"%>
+<%@ attribute name="url" type="java.lang.String" required="true"%>
+
+<!-- 引入layer插件 -->
+<link href="${ctxStatic}/layer-v2.3/layui/css/layui.css" type="text/css" rel="stylesheet"/>
+<script src="${ctxStatic}/layer-v2.3/layer/layer.js"></script>
+<script src="${ctxStatic}/layer-v2.3/layer/laydate/laydate.js"></script>
+<%-- 使用方法: 1.将本tag写在查询的form之前;2.传入controller的url --%>
+<button id="btnImport" class="layui-btn layui-btn-sm layui-bg-blue" data-toggle="tooltip" data-placement="left" title="报告号调整导入">
+	<%--	<i class="fa fa-folder-open-o"></i>--%>
+	报告号调整导入
+</button>
+<div id="importBox" class="hide">
+	<form id="importForm2" action="${url}" method="post" enctype="multipart/form-data" onsubmit="loading('正在导入,请稍等...');">
+		<br/>
+		<div class="layui-form-item" style="text-align:center; line-height: 41px;">
+			<label class="layui-form-label  abc" style="vertical-align:middle;display:inline-block;"><span class="require-item" style="color:red;font-size: 20px;">*</span>导入报告类型</label>
+			<select id="type" name="type">
+				<option value="">请选择</option>
+				<option value="造价审核" selected="">造价审核</option>
+				<option value="工程咨询">工程咨询</option>
+			</select>
+		</div>
+		<div class="layui-form-item" style="text-align:center; line-height: 20px;">
+			<label class="layui-form-label">调整成的年份:</label>
+			<div class="layui-input-block">
+				<input type="text" id="year" name="year" htmlEscape="false" maxlength="64"/>
+			</div>
+		</div>
+
+		<input id="uploadFile" name="file" type="file" style="width:330px"/>导入文件不能超过5M,仅允许导入“xls”或“xlsx”格式文件!<br/>  
+	</form>
+</div>
+<script type="text/javascript">
+	$(document).ready(function() {
+
+		$("#importForm2 .layui-select-title").css("display","none");
+
+		$("#btnImport").click(function(){
+			top.layer.open({
+				type: 1,
+				area: [500, 300],
+				title:"导入数据",
+				content:$("#importBox").html() ,
+				btn: ['下载模板','确定', '关闭'],
+				btn1: function(index, layero){
+					var type = top.$("#type").val();
+					if(null == type || "" == type) {
+						top.layer.open({
+							title: '提示'
+							, content: '请选择需要下载的数据类型'
+						});
+						return false;
+					}
+					window.location.href='${url}/template?type='+type;
+				},
+				btn2: function(index, layero){
+
+					var type = top.$("#type").val();
+					if(null == type || "" == type) {
+						top.layer.open({
+							title: '提示'
+							, content: '请选择导入报告类型'
+						});
+						return false;
+					}
+
+					var inputForm =top.$("#importForm2");
+					var top_iframe = top.getActiveTab().attr("name");//获取当前active的tab的iframe
+					inputForm.attr("target",top_iframe);//表单提交成功后,从服务器返回的url在当前tab中展示
+					top.$("#importForm2").submit();
+					top.layer.close(index);
+					top.layer.close(index);
+				},
+				btn3: function(index){
+					top.layer.close(index);
+				}
+			});
+		});
+
+	});
+
+</script>

BIN
src/main/webapp/dot/报告号调整数据导入模板.xlsx


+ 3 - 0
src/main/webapp/webpage/modules/ruralprojectrecords/ruralporjectmessage/all/ruralProjectMessageAllList.jsp

@@ -1077,6 +1077,9 @@
 					<%--此处按钮样式包括 nav-btn-add nav-btn-refresh nav-btn-import nav-btn-export nav-btn-query nav-btn-reset--%>
 					<div class="layui-btn-group">
 						<shiro:hasPermission name="ruralProject:ruralProjectMessageAll:export">
+							<table:importExcelNumber url="${ctx}/ruralProject/signatureOldMessageDispose/disposeProjectReportNumber"></table:importExcelNumber><!-- 导出按钮 -->
+						</shiro:hasPermission>
+						<shiro:hasPermission name="ruralProject:ruralProjectMessageAll:export">
 							<table:exportExcel url="${ctx}/ruralProject/ruralProjectMessageAll/export"></table:exportExcel><!-- 导出按钮 -->
 						</shiro:hasPermission>
 						<shiro:hasPermission name="ruralProject:ruralProjectMessageAll:recordDownload">