package org.jeecg.common.constant; import com.alibaba.fastjson.JSONObject; import org.jeecg.common.util.oConvertUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.stereotype.Component; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; import java.util.Set; import java.util.List; /** * @Description: 省市区 * @author: jeecg-boot */ @Component("pca") public class ProvinceCityArea { List areaList; public String getText(String code){ this.initAreaList(); if(this.areaList!=null || this.areaList.size()>0){ List ls = new ArrayList(); getAreaByCode(code,ls); return String.join("/",ls); } return ""; } public String getCode(String text){ this.initAreaList(); if(areaList!=null && areaList.size()>0){ for(int i=areaList.size()-1;i>=0;i--){ //update-begin-author:taoyan date:2022-5-24 for:VUEN-1088 online 导入 省市区导入后 导入数据错乱 北京市/市辖区/西城区-->山西省/晋城市/城区 String areaText = areaList.get(i).getText(); String cityText = areaList.get(i).getAheadText(); if(text.indexOf(areaText)>=0 && (cityText!=null && text.indexOf(cityText)>=0)){ return areaList.get(i).getId(); } //update-end-author:taoyan date:2022-5-24 for:VUEN-1088 online 导入 省市区导入后 导入数据错乱 北京市/市辖区/西城区-->山西省/晋城市/城区 } } return null; } // update-begin-author:sunjianlei date:20220121 for:【JTC-704】数据导入错误 省市区组件,文件中为北京市,导入后,导为了山西省 /** * 获取省市区code,精准匹配 * @param texts 文本数组,省,市,区 * @return 返回 省市区的code */ public String[] getCode(String[] texts) { if (texts == null || texts.length == 0) { return null; } this.initAreaList(); if (areaList == null || areaList.size() == 0) { return null; } String[] codes = new String[texts.length]; String code = null; for (int i = 0; i < texts.length; i++) { String text = texts[i]; Area area; if (code == null) { area = getAreaByText(text); } else { area = getAreaByPidAndText(code, text); } if (area != null) { code = area.id; codes[i] = code; } else { return null; } } return codes; } /** * 根据text获取area * @param text * @return */ public Area getAreaByText(String text) { for (Area area : areaList) { if (text.equals(area.getText())) { return area; } } return null; } /** * 通过pid获取 area 对象 * @param pCode 父级编码 * @param text * @return */ public Area getAreaByPidAndText(String pCode, String text) { this.initAreaList(); if (this.areaList != null && this.areaList.size() > 0) { for (Area area : this.areaList) { if (area.getPid().equals(pCode) && area.getText().equals(text)) { return area; } } } return null; } // update-end-author:sunjianlei date:20220121 for:【JTC-704】数据导入错误 省市区组件,文件中为北京市,导入后,导为了山西省 public void getAreaByCode(String code,List ls){ for(Area area: areaList){ if(area.getId().equals(code)){ String pid = area.getPid(); ls.add(0,area.getText()); getAreaByCode(pid,ls); } } } private void initAreaList(){ //System.out.println("====================="); if(this.areaList==null || this.areaList.size()==0){ this.areaList = new ArrayList(); try { String jsonData = oConvertUtils.readStatic("classpath:static/pca.json"); JSONObject baseJson = JSONObject.parseObject(jsonData); //第一层 省 JSONObject provinceJson = baseJson.getJSONObject("86"); for(String provinceKey: provinceJson.keySet()){ //System.out.println("===="+provinceKey); Area province = new Area(provinceKey,provinceJson.getString(provinceKey),"86"); this.areaList.add(province); //第二层 市 JSONObject cityJson = baseJson.getJSONObject(provinceKey); for(String cityKey:cityJson.keySet()){ //System.out.println("-----"+cityKey); Area city = new Area(cityKey,cityJson.getString(cityKey),provinceKey); this.areaList.add(city); //第三层 区 JSONObject areaJson = baseJson.getJSONObject(cityKey); if(areaJson!=null){ for(String areaKey:areaJson.keySet()){ //System.out.println("········"+areaKey); Area area = new Area(areaKey,areaJson.getString(areaKey),cityKey); //update-begin-author:taoyan date:2022-5-24 for:VUEN-1088 online 导入 省市区导入后 导入数据错乱 北京市/市辖区/西城区-->山西省/晋城市/城区 area.setAheadText(cityJson.getString(cityKey)); //update-end-author:taoyan date:2022-5-24 for:VUEN-1088 online 导入 省市区导入后 导入数据错乱 北京市/市辖区/西城区-->山西省/晋城市/城区 this.areaList.add(area); } } } } } catch (Exception e) { e.printStackTrace(); } } } private String jsonRead(File file){ Scanner scanner = null; StringBuilder buffer = new StringBuilder(); try { scanner = new Scanner(file, "utf-8"); while (scanner.hasNextLine()) { buffer.append(scanner.nextLine()); } } catch (Exception e) { } finally { if (scanner != null) { scanner.close(); } } return buffer.toString(); } class Area{ String id; String text; String pid; // 用于存储上级文本数据,区的上级文本 是市的数据 String aheadText; public Area(String id,String text,String pid){ this.id = id; this.text = text; this.pid = pid; } public String getId() { return id; } public String getText() { return text; } public String getPid() { return pid; } public String getAheadText() { return aheadText; } public void setAheadText(String aheadText) { this.aheadText = aheadText; } } }