From f28149d8183a62f87fa9c8df9ae589070d83f612 Mon Sep 17 00:00:00 2001
From: 于紫祥_1901 <email@yuzixiang_1910>
Date: Thu, 24 Dec 2020 13:47:50 +0800
Subject: [PATCH] 波动补偿

---
 src/main/java/com/moral/service/impl/AreaServiceImpl.java |  158 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 132 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/moral/service/impl/AreaServiceImpl.java b/src/main/java/com/moral/service/impl/AreaServiceImpl.java
index 3f5b3db..3099420 100644
--- a/src/main/java/com/moral/service/impl/AreaServiceImpl.java
+++ b/src/main/java/com/moral/service/impl/AreaServiceImpl.java
@@ -1,5 +1,6 @@
 package com.moral.service.impl;
 
+import com.moral.common.exception.BusinessException;
 import com.moral.entity.Area;
 import com.moral.entity.City;
 import com.moral.entity.Province;
@@ -15,6 +16,8 @@
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -58,34 +61,137 @@
      * @return
      */
     @Override
-    public String queryFullNameByCode(Integer code){
-        String codeStr = code.toString();
-        String fullName = "";
-        // ���������������code
-        if(!codeStr.endsWith("00")){
-            String provinceCode = codeStr.substring(0,2)+"0000";
-            Province province = provinceMapper.selectByPrimaryKey(Integer.valueOf(provinceCode));
-            String cityCode = codeStr.substring(0,4)+"00";
-            City city = cityMapper.selectByPrimaryKey(Integer.valueOf(cityCode));
-            Area area = areaMapper.selectByPrimaryKey(code);
-            fullName = province.getProvinceName().replaceAll(" ", "")
-                    +" "+city.getCityName().replaceAll(" ", "")
-                    +" "+area.getAreaName().replaceAll(" ", "");
-        }  else if(!codeStr.endsWith("0000")){
-            // ��������� ���������code
-            String provinceCode = codeStr.substring(0,2)+"0000";
-            Province province = provinceMapper.selectByPrimaryKey(Integer.valueOf(provinceCode));
-            City city = cityMapper.selectByPrimaryKey(code);
-            fullName = province.getProvinceName().replaceAll(" ", "")
-                    +" "+city.getCityName().replaceAll(" ", "");
-        } else {
-            // ��������� ���code
-            Province province = provinceMapper.selectByPrimaryKey(code);
-            fullName = province.getProvinceName().replaceAll(" ", "");
+    public String queryFullNameByCode(Long code){
+        StringBuilder fullName = new StringBuilder();
+        List<Number> codeList = regionCodeToList(code);
+        for (int num = 0;num<codeList.size();num++){
+            int codeLevel = num+1;
+            Number currentCode = codeList.get(num);
+            switch (codeLevel) {
+                case 1:
+                    Province province = provinceMapper.selectByPrimaryKey(currentCode);
+                    if (province !=null) {
+                        String provinceName = province.getProvinceName();
+                        provinceName = provinceName!=null ? provinceName.replace(" ","") : "";
+                        fullName.append(provinceName);
+                    }
+                    break;
+                case 2:
+                    City city = cityMapper.selectByPrimaryKey(currentCode);
+                    if(city!=null) {
+                        String cityName = city.getCityName();
+                        cityName = cityName!=null ? cityName.replace(" ",""):"";
+                        fullName.append(" ");
+                        fullName.append(cityName);
+                    }
+                    break;
+                case 3:
+                    Area area = areaMapper.selectByPrimaryKey(currentCode);
+                    if(area!=null){
+                        String areaName = area.getAreaName();
+                        areaName = areaName!=null ? areaName.replace(" ",""):"";
+                        fullName.append(" ");
+                        fullName.append(areaName);
+                    }
+                    break;
+                case 4:
+                    Town town = townMapper.selectByPrimaryKey(currentCode);
+                    if(town!=null){
+                        String townName = town.getTownName();
+                        townName = townName!=null ? townName.replace(" ",""):"";
+                        fullName.append(" ");
+                        fullName.append(townName);
+                    }
+                    break;
+                default:
+                    Village village = villageMapper.selectByPrimaryKey(currentCode);
+                    if(village!=null) {
+                        String villageName = village.getVillageName();
+                        villageName = villageName!=null ? villageName.replace(" ",""):"";
+                        fullName.append(" ");
+                        fullName.append(villageName);
+                    }
+                    break;
+            }
         }
-        return fullName;
+        return fullName.toString();
     }
-
+    private List<Number> regionCodeToList(Long code) {
+        List<Number> codeList = new ArrayList();
+        if(code != null){
+             String codeStr = code.toString();
+            int codeLevel = 0;
+            codeLevel =getCodeLevel(codeStr);
+            int codeLevelTemp = 1;
+            do {
+                String currentCodeStr = getCodeByLevel(codeStr,codeLevelTemp);
+                Number currentCode = 0;
+                if(codeLevelTemp < 4) {
+                    currentCode = Integer.parseInt(currentCodeStr);
+                }else{
+                    currentCode = Long.parseLong(currentCodeStr);
+                }
+                codeList.add(currentCode);
+                codeLevelTemp++;
+            }while (codeLevelTemp <= codeLevel);
+        }
+        return codeList;
+    }
+    private int getCodeLevel(String code){
+        return isProvinceCode(code) ? 1 :
+                     isCityCode(code) ? 2 :
+                        isAreaCode(code) ? 3 :
+                                isTownCode(code) ? 4 : 5;
+    }
+    static private String[] SpecialTwonCodes = new String[]{"653130103001"};
+    static private boolean isSpecialTwonCode(String code){
+         for (String codeStr:SpecialTwonCodes){
+               if(codeStr.equals(code)){
+                   return  true;
+               }
+         }
+         return  false;
+    }
+    private String getCodeByLevel(@NotNull String sourceCode,int codeLevel){
+         String zeroStr = "0000";
+         int totalCount = 0;
+         int effectiveCount = 0;
+         if(codeLevel <4){
+             totalCount = 6;
+             effectiveCount = codeLevel == 1 ? 2:
+                              codeLevel == 2 ? 4:6;
+         } else{
+             totalCount = 12;
+             effectiveCount = codeLevel == 4 ? 9:12;
+         }
+         //������
+         if(codeLevel==4&&isSpecialTwonCode(sourceCode)){
+             return  sourceCode;
+         }
+         if(totalCount == effectiveCount && sourceCode.length() == totalCount){
+             return  sourceCode;
+         }else {
+             if (sourceCode.length()<totalCount){
+                  throw new BusinessException("totalCount is more than the length of sourceCode");
+             }
+             return sourceCode.substring(0,effectiveCount)+zeroStr.substring(0,totalCount-effectiveCount);
+         }
+    }
+    private boolean isProvinceCode(String code){
+      return  code.length() == 6 && code.endsWith("0000");
+    }
+    private boolean isCityCode(String code){
+      return  code.length() == 6 && code.endsWith("00");
+    }
+    private boolean isAreaCode(String code){
+      return  code.length() == 6 && !code.endsWith("00");
+    }
+    private boolean isTownCode(String code){
+      return  code.length() == 12 && (code.endsWith("000")||isSpecialTwonCode(code));
+    }
+    private boolean isVillageCode(String code){
+      return  code.length() == 12 && !code.endsWith("000");
+    }
 	@Override
 	public List<Town> getTowns(Integer areaCode) {
         Example example = new Example(Town.class);

--
Gitblit v1.8.0