diff --git a/module-dictionary/src/main/java/ink/wgink/module/dictionary/controller/api/AreaController.java b/module-dictionary/src/main/java/ink/wgink/module/dictionary/controller/api/AreaController.java index 73ced241..7d2b8a63 100644 --- a/module-dictionary/src/main/java/ink/wgink/module/dictionary/controller/api/AreaController.java +++ b/module-dictionary/src/main/java/ink/wgink/module/dictionary/controller/api/AreaController.java @@ -148,5 +148,12 @@ public class AreaController extends DefaultBaseController { return areaService.listByCode(areaCode); } + @ApiOperation(value = "更新短标题和合并名称", notes = "更新短标题和合并名称接口") + @ApiResponses({@ApiResponse(code = 400, message = "请求失败", response = ErrorResult.class)}) + @GetMapping("update-sort-and-merger-name") + public SuccessResult updateShortAndMergerName() { + areaService.updateShortAndMergerName(); + return new SuccessResult(); + } } diff --git a/module-dictionary/src/main/java/ink/wgink/module/dictionary/dao/IAreaDao.java b/module-dictionary/src/main/java/ink/wgink/module/dictionary/dao/IAreaDao.java index a221bfa4..e372a08b 100644 --- a/module-dictionary/src/main/java/ink/wgink/module/dictionary/dao/IAreaDao.java +++ b/module-dictionary/src/main/java/ink/wgink/module/dictionary/dao/IAreaDao.java @@ -9,7 +9,6 @@ import ink.wgink.module.dictionary.pojo.dtos.AreaDTO; import ink.wgink.pojo.dtos.ZTreeDTO; import org.springframework.stereotype.Repository; -import java.rmi.RemoteException; import java.util.List; import java.util.Map; @@ -55,6 +54,15 @@ public interface IAreaDao extends IInitBaseTable { */ void update(Map params) throws UpdateException; + /** + * 修改合并名称和短名称 + * + * @param params + * @throws UpdateException + */ + void updateShortAndMergerName(Map params) throws UpdateException; + + /** * 地区字典列表 * @@ -64,6 +72,15 @@ public interface IAreaDao extends IInitBaseTable { */ List list(Map params) throws SearchException; + /** + * 分页 + * + * @param params + * @return + * @throws SearchException + */ + List listPage(Map params) throws SearchException; + /** * 地区字典详情 * @@ -100,4 +117,13 @@ public interface IAreaDao extends IInitBaseTable { */ Integer countByParentId(String id) throws SearchException; + /** + * 统计总数 + * + * @param params + * @return + * @throws SearchException + */ + Integer count(Map params) throws SearchException; + } diff --git a/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/IAreaService.java b/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/IAreaService.java index 38c58feb..bf380110 100644 --- a/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/IAreaService.java +++ b/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/IAreaService.java @@ -72,6 +72,14 @@ public interface IAreaService { */ AreaDTO getByCode(String areaCode); + /** + * 全等级 + * + * @param areaId + * @return + */ + List listFullLevel(String areaId); + /** * 地区列表 * @@ -135,4 +143,9 @@ public interface IAreaService { */ List listSubByCode(String areaCode); + /** + * 更新短标题和合并名称 + */ + void updateShortAndMergerName(); + } diff --git a/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/impl/AreaServiceImpl.java b/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/impl/AreaServiceImpl.java index 58def18a..b1084d0b 100644 --- a/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/impl/AreaServiceImpl.java +++ b/module-dictionary/src/main/java/ink/wgink/module/dictionary/service/impl/AreaServiceImpl.java @@ -3,6 +3,7 @@ package ink.wgink.module.dictionary.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import ink.wgink.common.base.DefaultBaseService; +import ink.wgink.interfaces.consts.ISystemConstant; import ink.wgink.module.dictionary.dao.IAreaDao; import ink.wgink.module.dictionary.pojo.dtos.AreaDTO; import ink.wgink.module.dictionary.pojo.vos.AreaVO; @@ -12,12 +13,16 @@ import ink.wgink.pojo.dtos.ZTreeDTO; import ink.wgink.pojo.result.SuccessResultList; import ink.wgink.util.map.HashMapUtil; import ink.wgink.util.string.WStringUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadPoolExecutor; /** * When you feel like quitting. Think about why you started @@ -34,6 +39,10 @@ public class AreaServiceImpl extends DefaultBaseService implements IAreaService @Autowired private IAreaDao areaDao; + /** + * 更新合并和短标题线程池 + */ + private static ExecutorService UPDATE_MERGER_SHORT_NAME_EXECUTOR_SERVICE = Executors.newFixedThreadPool(66); @Override public void save(AreaVO areaVO) { @@ -78,6 +87,15 @@ public class AreaServiceImpl extends DefaultBaseService implements IAreaService return areaDao.get(params); } + @Override + public List listFullLevel(String areaId) { + AreaDTO areaDTO = get(areaId); + List fullLevelAreaDTOS = new ArrayList<>(); + fullLevelAreaDTOS.add(0, areaDTO); + setFullLevel(fullLevelAreaDTOS, areaDTO.getAreaParentId()); + return fullLevelAreaDTOS; + } + @Override public List list() { Map params = getHashMap(0); @@ -143,6 +161,117 @@ public class AreaServiceImpl extends DefaultBaseService implements IAreaService return areaDao.list(params); } + @Override + public void updateShortAndMergerName() { + if (isUpdateShortAndMergerName()) { + return; + } + Map params = getHashMap(2); + Integer count = areaDao.count(params); + int row = 1000; + int totalPage = row % 1000 == 0 ? count / row : (count / row + 1); +// int totalPage = 1; + for (int currentPage = 1; currentPage <= totalPage; currentPage++) { + updateShortAndMergerName(currentPage, totalPage, row); + } + } + + /** + * 是否正在更新 + * + * @return + */ + private boolean isUpdateShortAndMergerName() { + ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) UPDATE_MERGER_SHORT_NAME_EXECUTOR_SERVICE; + return threadPoolExecutor.getQueue().size() != 0 || threadPoolExecutor.getActiveCount() != 0; + } + + + private void updateShortAndMergerName(int currentPage, int totalPage, int row) { + if (currentPage > totalPage) { + return; + } + UPDATE_MERGER_SHORT_NAME_EXECUTOR_SERVICE.execute(() -> { + int limitStart = (currentPage - 1) * row; + Map params = getHashMap(2); + params.put("limitStart", limitStart); + params.put("limitRow", row); + List areaDTOS = areaDao.listPage(params); + if (areaDTOS.isEmpty()) { + return; + } + areaDTOS.forEach(areaDTO -> { + List fullLevelAreaDTOS = new ArrayList<>(); + fullLevelAreaDTOS.add(0, areaDTO); + setFullLevel(fullLevelAreaDTOS, areaDTO.getAreaParentId()); + // 完整的地区名称 + String areaMergerName = ""; + for (AreaDTO fullLevelAreaDTO : fullLevelAreaDTOS) { + areaMergerName += fullLevelAreaDTO.getAreaName(); + } + String areaShortName = getAreaShortName(areaDTO.getAreaName()); + params.clear(); + params.put("areaId", areaDTO.getAreaId()); + params.put("areaMergerName", areaMergerName); + params.put("areaShortName", areaShortName); + areaDao.updateShortAndMergerName(params); + }); + }); + } + + /** + * 获取短名称 + * + * @param areaName + * @return + */ + private String getAreaShortName(String areaName) { + String areaShortName = areaName; + if (areaName.endsWith("市")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("省")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("自治区")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 3); + } else if (areaName.endsWith("旗")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("县")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("社区")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 2); + } else if (areaName.endsWith("区")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("乡")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("镇")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } else if (areaName.endsWith("街道")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 2); + } else if (areaName.endsWith("居委会")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 2); + } else if (areaName.endsWith("嘎查村")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 3); + } else if (areaName.endsWith("村")) { + areaShortName = areaShortName.substring(0, areaShortName.length() - 1); + } + return areaShortName; + } + + /** + * 设置完整级别 + * + * @param fullLevelAreaDTOS + * @param areaParentId + */ + private void setFullLevel(List fullLevelAreaDTOS, String areaParentId) { + if (StringUtils.equals(ISystemConstant.TREE_ROOT_ID, areaParentId)) { + return; + } + AreaDTO areaDTO = get(areaParentId); + fullLevelAreaDTOS.add(0, areaDTO); + setFullLevel(fullLevelAreaDTOS, areaDTO.getAreaParentId()); + } + /** * 递归查询子组 * diff --git a/module-dictionary/src/main/resources/mybatis/mapper/area-mapper.xml b/module-dictionary/src/main/resources/mybatis/mapper/area-mapper.xml index 28d16ad3..52f192ba 100644 --- a/module-dictionary/src/main/resources/mybatis/mapper/area-mapper.xml +++ b/module-dictionary/src/main/resources/mybatis/mapper/area-mapper.xml @@ -154,6 +154,17 @@ area_id = #{areaId} + + + UPDATE + data_area + SET + area_merger_name = #{areaMergerName}, + area_short_name = #{areaShortName} + WHERE + area_id = #{areaId} + + + + + + + +