| package com.genersoft.iot.vmp.conf; | 
|   | 
| import com.genersoft.iot.vmp.common.CivilCodePo; | 
| import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; | 
| import org.slf4j.Logger; | 
| import org.slf4j.LoggerFactory; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.boot.CommandLineRunner; | 
| import org.springframework.context.annotation.Configuration; | 
| import org.springframework.context.annotation.Lazy; | 
| import org.springframework.core.annotation.Order; | 
| import org.springframework.core.io.ClassPathResource; | 
| import org.springframework.util.ObjectUtils; | 
|   | 
| import java.io.BufferedReader; | 
| import java.io.File; | 
| import java.io.InputStream; | 
| import java.io.InputStreamReader; | 
| import java.nio.file.Files; | 
| import java.util.Map; | 
|   | 
| /** | 
|  * 启动时读取行政区划表 | 
|  */ | 
| @Configuration | 
| @Order(value=14) | 
| public class CivilCodeFileConf implements CommandLineRunner { | 
|   | 
|     private final static Logger logger = LoggerFactory.getLogger(CivilCodeFileConf.class); | 
|   | 
|     private final Map<String, CivilCodePo> civilCodeMap= new ConcurrentHashMap<>(); | 
|   | 
|     @Autowired | 
|     @Lazy | 
|     private UserSetting userSetting; | 
|   | 
|     @Override | 
|     public void run(String... args) throws Exception { | 
|         if (ObjectUtils.isEmpty(userSetting.getCivilCodeFile())) { | 
|             logger.warn("[行政区划] 文件未设置,可能造成目录刷新结果不完整"); | 
|             return; | 
|         } | 
|         InputStream inputStream; | 
|         if (userSetting.getCivilCodeFile().startsWith("classpath:")){ | 
|             String filePath = userSetting.getCivilCodeFile().substring("classpath:".length()); | 
|             ClassPathResource civilCodeFile = new ClassPathResource(filePath); | 
|             if (!civilCodeFile.exists()) { | 
|                 logger.warn("[行政区划] 文件<{}>不存在,可能造成目录刷新结果不完整", userSetting.getCivilCodeFile()); | 
|                 return; | 
|             } | 
|             inputStream = civilCodeFile.getInputStream(); | 
|   | 
|         }else { | 
|             File civilCodeFile = new File(userSetting.getCivilCodeFile()); | 
|             if (!civilCodeFile.exists()) { | 
|                 logger.warn("[行政区划] 文件<{}>不存在,可能造成目录刷新结果不完整", userSetting.getCivilCodeFile()); | 
|                 return; | 
|             } | 
|             inputStream = Files.newInputStream(civilCodeFile.toPath()); | 
|         } | 
|   | 
|         BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(inputStream)); | 
|         int index = -1; | 
|         String line; | 
|         while ((line = inputStreamReader.readLine()) != null) { | 
|             index ++; | 
|             if (index == 0) { | 
|                 continue; | 
|             } | 
|             String[] infoArray = line.split(","); | 
|             CivilCodePo civilCodePo = CivilCodePo.getInstance(infoArray); | 
|             civilCodeMap.put(civilCodePo.getCode(), civilCodePo); | 
|         } | 
|         inputStreamReader.close(); | 
|         inputStream.close(); | 
|         if (civilCodeMap.size() == 0) { | 
|             logger.warn("[行政区划] 文件内容为空,可能造成目录刷新结果不完整"); | 
|         }else { | 
|             logger.info("[行政区划] 加载成功,共加载数据{}条", civilCodeMap.size()); | 
|         } | 
|     } | 
|   | 
|     public CivilCodePo getParentCode(String code) { | 
|         if (code.length() > 8) { | 
|             return null; | 
|         } | 
|         if (code.length() == 8) { | 
|             String parentCode = code.substring(0, 6); | 
|             return civilCodeMap.get(parentCode); | 
|         }else { | 
|             CivilCodePo civilCodePo = civilCodeMap.get(code); | 
|             if (civilCodePo == null){ | 
|                 return null; | 
|             } | 
|             String parentCode = civilCodePo.getParentCode(); | 
|             if (parentCode == null) { | 
|                 return null; | 
|             } | 
|             return civilCodeMap.get(parentCode); | 
|         } | 
|   | 
|     } | 
|   | 
| } |