RegionServiceImpl.java 19 KB
Newer Older
eddie.woo's avatar
eddie.woo committed
1 2 3 4 5 6 7 8 9 10 11 12 13
package pwc.taxtech.atms.service.impl;

import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import pwc.taxtech.atms.common.CommonConstants;
import pwc.taxtech.atms.common.CommonUtils;
import pwc.taxtech.atms.common.SortUtils;
import pwc.taxtech.atms.dao.RegionMapper;
import pwc.taxtech.atms.dto.RegionShortDto;
import pwc.taxtech.atms.dto.VMRegionDevTreeData;
import pwc.taxtech.atms.dto.navtree.DevTreeDto;
import pwc.taxtech.atms.dto.navtree.IvhTreeDto;
14 15 16 17 18 19
import pwc.taxtech.atms.entity.Area;
import pwc.taxtech.atms.entity.AreaExample;
import pwc.taxtech.atms.entity.AreaRegion;
import pwc.taxtech.atms.entity.AreaRegionExample;
import pwc.taxtech.atms.entity.Region;
import pwc.taxtech.atms.entity.RegionExample;
20 21 22 23 24 25 26 27 28 29
import pwc.taxtech.atms.exception.ApplicationException;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import static java.util.Comparator.*;
import static java.util.stream.Collectors.toList;
import static pwc.taxtech.atms.common.CommonUtils.copyProperties;
import static pwc.taxtech.atms.common.CommonUtils.getUUID;
eddie.woo's avatar
eddie.woo committed
30 31

@Service
32
public class RegionServiceImpl extends AbstractService {
eddie.woo's avatar
eddie.woo committed
33 34

    @Autowired
35
    private AreaServiceImpl areaService;
eddie.woo's avatar
eddie.woo committed
36 37

    @Autowired
38
    private AreaRegionServiceImpl areaRegionService;
eddie.woo's avatar
eddie.woo committed
39 40 41 42 43 44

    @Autowired
    private RegionMapper regionMapper;

    /*
     * (non-Javadoc)
45
     *
eddie.woo's avatar
eddie.woo committed
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
     * @see pwc.taxtech.atms.service.RegionService#getRegionAreaTree()
     */
    public List<DevTreeDto<VMRegionDevTreeData>> getRegionAreaTree() {

        List<DevTreeDto<VMRegionDevTreeData>> regionAreaTree = new ArrayList<>();
        List<Area> topAreas = areaService.findTopAreas();
        if (null == topAreas || topAreas.isEmpty()) {
            return regionAreaTree;
        }

        for (Area topArea : topAreas) {

            DevTreeDto<VMRegionDevTreeData> topNode = new DevTreeDto<>();
            topNode.setItems(new ArrayList<>());

            VMRegionDevTreeData data = new VMRegionDevTreeData();
            data.setLevelType(0);
            data.setMergerName(topArea.getName());
            data.setIsArea(true);
            data.setIsActive(topArea.getIsActive());

67
            topNode.setId(topArea.getId());
eddie.woo's avatar
eddie.woo committed
68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
            topNode.setCode("");
            topNode.setExpanded(true);
            topNode.setParentId(null);
            topNode.setRelyOnCodes("");
            topNode.setText(topArea.getName());
            topNode.setData(data);
            topNode.setUniqueId(CommonUtils.getUUID());

            topNode.setItems(getChildrenAreaTree(topNode));
            topNode.getItems().addAll(getRegionTree(topArea));

            regionAreaTree.add(topNode);
        }

        SortUtils.sortDevTreeDtoByText(regionAreaTree);

        return regionAreaTree;
    }

    /**
     * Recursively get area tree
89
     *
eddie.woo's avatar
eddie.woo committed
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
     * @param current
     * @return List<DevTreeDto>
     */
    private List<DevTreeDto<VMRegionDevTreeData>> getChildrenAreaTree(DevTreeDto<VMRegionDevTreeData> current) {

        List<DevTreeDto<VMRegionDevTreeData>> childrenAreaTree = new ArrayList<>();
        List<Area> subAreas = areaService.getSubAreaListIngoreActive(current.getId());
        if (subAreas == null || subAreas.isEmpty()) {
            return childrenAreaTree;

        }

        for (Area subArea : subAreas) {
            DevTreeDto<VMRegionDevTreeData> node = new DevTreeDto<>();
            node.setItems(new ArrayList<>());

            VMRegionDevTreeData data = new VMRegionDevTreeData();
            data.setLevelType(current.getData().getLevelType() + 1);
            data.setMergerName(subArea.getName());
            data.setIsArea(true);
            data.setIsActive(subArea.getIsActive());

112
            node.setId(subArea.getId());
eddie.woo's avatar
eddie.woo committed
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
            node.setCode("");
            node.setExpanded(false);
            node.setParentId(current.getId());
            node.setRelyOnCodes("");
            node.setText(subArea.getName());
            node.setData(data);
            node.setUniqueId(CommonUtils.getUUID());

            node.setItems(getChildrenAreaTree(node));
            node.getItems().addAll(getRegionTree(subArea));
            childrenAreaTree.add(node);
        }

        SortUtils.sortDevTreeDtoByText(childrenAreaTree);

        return childrenAreaTree;
    }

    /**
     * Get the region tree under an area
133
     *
eddie.woo's avatar
eddie.woo committed
134 135 136 137 138 139 140
     * @param area
     * @return List<DevTreeDto>
     */
    private List<DevTreeDto<VMRegionDevTreeData>> getRegionTree(Area area) {

        List<DevTreeDto<VMRegionDevTreeData>> regionTree = new ArrayList<>();

141
        List<AreaRegion> subRegions = areaRegionService.findAreaRegionsByArea(area.getId());
eddie.woo's avatar
eddie.woo committed
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
        if (subRegions == null || subRegions.isEmpty()) {
            return regionTree;
        }

        int currentLevelType = 9;
        for (int i = 0; i < subRegions.size(); i++) {

            DevTreeDto<VMRegionDevTreeData> currentNode = new DevTreeDto<>();
            currentNode.setItems(new ArrayList<>());
            AreaRegion areaRegion = subRegions.get(i);

            VMRegionDevTreeData data = new VMRegionDevTreeData();
            data.setLevelType(areaRegion.getRegion().getLevelType());
            data.setMergerName(areaRegion.getRegion().getMergerName());
            data.setIsArea(false);
157
            data.setAreaId(areaRegion.getArea().getId());
eddie.woo's avatar
eddie.woo committed
158 159
            data.setIsActive(areaRegion.getRegion().getIsActive());

160
            currentNode.setId(areaRegion.getRegion().getId());
eddie.woo's avatar
eddie.woo committed
161 162
            currentNode.setCode("");
            currentNode.setExpanded(false);
163
            currentNode.setParentId(areaRegion.getRegion().getParentId());
eddie.woo's avatar
eddie.woo committed
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
            currentNode.setRelyOnCodes("");
            currentNode.setText(areaRegion.getRegion().getName());
            currentNode.setData(data);
            currentNode.setUniqueId(CommonUtils.getUUID());

            if (currentLevelType > currentNode.getData().getLevelType()) {
                regionTree.add(currentNode);
            } else {
                if (null == regionTree.get(regionTree.size() - 1).getItems()) {
                    regionTree.get(regionTree.size() - 1).setItems(new ArrayList<DevTreeDto<VMRegionDevTreeData>>());
                }
                currentNode.setUniqueId(null);
                regionTree.get(regionTree.size() - 1).getItems().add(currentNode);

            }
            currentLevelType = currentNode.getData().getLevelType();
        }
        return regionTree;
    }

    /*
     * (non-Javadoc)
186
     *
eddie.woo's avatar
eddie.woo committed
187 188 189 190 191 192 193
     * @see pwc.taxtech.atms.service.RegionService#getProvinceAndCityTreeList()
     */
    public List<DevTreeDto<IvhTreeDto<Region>>> getProvinceAndCityTreeList() {

        // Find all regions with leveltype 1
        RegionExample regionExample = new RegionExample();
        regionExample.createCriteria().andLevelTypeEqualTo(CommonConstants.REGION_LEVELTYPE_PROVINCE);
194
        regionExample.setOrderByClause("id ASC");
eddie.woo's avatar
eddie.woo committed
195 196 197 198 199 200 201 202
        List<Region> regionList = regionMapper.selectByExample(regionExample);

        List<DevTreeDto<IvhTreeDto<Region>>> devTree = new ArrayList<>();
        for (Region region : regionList) {

            DevTreeDto<IvhTreeDto<Region>> regionNode = new DevTreeDto<>();
            regionNode.setItems(new ArrayList<>());

203
            regionNode.setId(region.getId());
eddie.woo's avatar
eddie.woo committed
204 205 206 207 208 209 210 211 212
            regionNode.setCode(null);
            regionNode.setExpanded(false);
            regionNode.setParentId(null);
            regionNode.setRelyOnCodes(null);
            regionNode.setText(region.getName());
            regionNode.setUniqueId(null);
            regionNode.setItems(new ArrayList<DevTreeDto<IvhTreeDto<Region>>>());

            IvhTreeDto<Region> regionData = new IvhTreeDto<>();
213
            regionData.setId(region.getId());
eddie.woo's avatar
eddie.woo committed
214 215 216 217 218 219 220
            regionData.setLabel(region.getName());
            regionData.setValue(region);
            regionData.setChildren(new ArrayList<IvhTreeDto<Region>>());

            // Find cities under region
            RegionExample cityExample = new RegionExample();
            cityExample.createCriteria().andLevelTypeEqualTo(CommonConstants.REGION_LEVELTYPE_CITY)
221 222
                    .andParentIdEqualTo(region.getId());
            regionExample.setOrderByClause("id ASC");
eddie.woo's avatar
eddie.woo committed
223 224 225 226 227 228
            List<Region> cityList = regionMapper.selectByExample(cityExample);

            for (Region city : cityList) {

                DevTreeDto<IvhTreeDto<Region>> cityNode = new DevTreeDto<>();
                cityNode.setItems(new ArrayList<>());
229
                cityNode.setId(city.getId());
eddie.woo's avatar
eddie.woo committed
230 231 232 233 234 235 236 237 238 239 240 241 242 243 244
                cityNode.setCode(null);
                cityNode.setExpanded(false);
                cityNode.setParentId(null);
                cityNode.setRelyOnCodes(null);
                cityNode.setText(city.getName());
                cityNode.setUniqueId(null);

                IvhTreeDto<Region> cityData = new IvhTreeDto<>();
                cityData.setChildren(new ArrayList<>());
                Region cloneCity = new Region();
                try {
                    cloneCity = (Region) (city.clone());
                } catch (CloneNotSupportedException e) {

                }
245
                cityData.setId(city.getId());
eddie.woo's avatar
eddie.woo committed
246 247 248 249 250 251
                cityData.setLabel(city.getName());
                cityData.setValue(cloneCity);
                cityNode.setData(cityData);

                IvhTreeDto<Region> childIvhTreeDto = new IvhTreeDto<>();
                childIvhTreeDto.setChildren(new ArrayList<>());
252
                childIvhTreeDto.setId(city.getId());
eddie.woo's avatar
eddie.woo committed
253 254 255 256 257 258 259 260 261 262 263 264
                childIvhTreeDto.setLabel(city.getName());
                childIvhTreeDto.setValue(city);
                regionData.getChildren().add(childIvhTreeDto);

                regionNode.getItems().add(cityNode);
            }
            regionNode.setData(regionData);
            devTree.add(regionNode);
        }
        return devTree;
    }

265
    @SuppressWarnings({"rawtypes", "unchecked"})
266 267
    public List<DevTreeDto> getAreaRegionTreeByNodeId(String areaId) {
        Area toNode = areaMapper.selectByPrimaryKey(areaId);
eddie.woo's avatar
eddie.woo committed
268 269
        Region regionInfo = null;
        if (toNode == null) {
270 271
            // id 为省市 id
            regionInfo = regionMapper.selectByPrimaryKey(areaId);
eddie.woo's avatar
eddie.woo committed
272 273 274 275
            if (regionInfo == null) {
                return new ArrayList<>();
            }
            AreaRegionExample areaRegionExample = new AreaRegionExample();
276
            areaRegionExample.createCriteria().andRegionIdEqualTo(regionInfo.getId());
eddie.woo's avatar
eddie.woo committed
277 278 279 280 281 282
            AreaRegion data = areaRegionMapper.selectByExample(areaRegionExample).stream().findFirst().orElse(null);
            if (data == null) {
                return new ArrayList<>();
            }

            toNode = new Area();
283
            toNode.setId(regionInfo.getId());
eddie.woo's avatar
eddie.woo committed
284
            toNode.setName(regionInfo.getName());
285
            toNode.setParentId(data.getAreaId());
eddie.woo's avatar
eddie.woo committed
286 287
        }
        RegionShortDto topNode = new RegionShortDto();
288
        topNode.setId(toNode.getId());
eddie.woo's avatar
eddie.woo committed
289 290 291 292
        topNode.setIsActive(BooleanUtils.isTrue(toNode.getIsActive()));
        topNode.setLevelType(0);
        topNode.setMergerName(toNode.getName());
        topNode.setName(toNode.getName());
293
        topNode.setParentId(toNode.getParentId());
eddie.woo's avatar
eddie.woo committed
294 295 296 297 298 299 300
        topNode.setSubRegionList(new ArrayList<>());
        topNode.setIsArea(regionInfo == null);

        VMRegionDevTreeData regionDevTreeData = new VMRegionDevTreeData();
        regionDevTreeData.setMergerName(topNode.getMergerName());
        regionDevTreeData.setLevelType(topNode.getLevelType());
        regionDevTreeData.setIsArea(topNode.getIsArea());
301
        regionDevTreeData.setAreaId(topNode.getAreaId());
eddie.woo's avatar
eddie.woo committed
302 303 304 305 306 307 308 309 310
        regionDevTreeData.setIsActive(BooleanUtils.isTrue(toNode.getIsActive()));

        DevTreeDto tree = new DevTreeDto();
        tree.setCode("");
        tree.setExpanded(true);
        tree.setItems(new ArrayList<>());
        tree.setParentId("");
        tree.setRelyOnCodes("");
        tree.setText(toNode.getName());
311
        tree.setId(toNode.getId());
eddie.woo's avatar
eddie.woo committed
312 313 314 315 316 317 318 319 320 321
        tree.setData(regionDevTreeData);

        if (regionInfo == null) {
            List<Area> areaList = areaMapper.selectByExample(new AreaExample());
            List<AreaRegion> areaRegionList = areaRegionMapper.selectByExample(new AreaRegionExample());
            RegionExample regionExample = new RegionExample();
            regionExample.createCriteria().andLevelTypeLessThan(3);
            List<Region> regionList = regionMapper.selectByExample(regionExample);
            List<RegionShortDto> relationRegionQuery = new ArrayList<>();
            for (AreaRegion ar : areaRegionList) {
322
                if (ar == null || ar.getRegionId() == null) {
eddie.woo's avatar
eddie.woo committed
323 324 325
                    continue;
                }
                for (Region r : regionList) {
326
                    if (ar.getRegionId().equals(r.getId())) {
eddie.woo's avatar
eddie.woo committed
327
                        RegionShortDto regionShortDto = new RegionShortDto();
328 329
                        regionShortDto.setAreaId(ar.getAreaId());
                        regionShortDto.setId(r.getId());
eddie.woo's avatar
eddie.woo committed
330 331 332 333 334
                        regionShortDto.setIsActive(BooleanUtils.isTrue(r.getIsActive()));
                        regionShortDto.setIsArea(false);
                        regionShortDto.setLevelType(r.getLevelType());
                        regionShortDto.setMergerName(r.getMergerName());
                        regionShortDto.setName(r.getName());
335
                        regionShortDto.setParentId(r.getParentId());
eddie.woo's avatar
eddie.woo committed
336 337 338 339 340 341 342 343
                        regionShortDto.setSubRegionList(new ArrayList<>());
                        relationRegionQuery.add(regionShortDto);
                    }
                }
            }
            tree.setItems(getAreaRegionChildrenList(topNode, areaList, relationRegionQuery));
        } else {
            RegionExample regionExample = new RegionExample();
344
            regionExample.createCriteria().andParentIdEqualTo(topNode.getId());
eddie.woo's avatar
eddie.woo committed
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
            List<Region> sublist = regionMapper.selectByExample(regionExample);
            List<RegionShortDto> subRegionShortList = sublist.stream().map(sa -> {
                RegionShortDto regionShortDto = copyProperties(sa, new RegionShortDto());
                regionShortDto.setIsActive(BooleanUtils.isTrue(sa.getIsActive()));
                return regionShortDto;
            }).collect(toList());
            tree.setItems(getNavTreeDtoList(topNode, subRegionShortList));
        }
        List<DevTreeDto> list = new ArrayList<>();
        list.add(tree);
        return list;
    }

    /**
     * 获取当前节点的子节点(必须是自定义的区域或者是城市及以上的区域)
     */
361
    @SuppressWarnings({"rawtypes", "unchecked"})
eddie.woo's avatar
eddie.woo committed
362
    private List<DevTreeDto> getAreaRegionChildrenList(RegionShortDto current, List<Area> areaList,
363
                                                       List<RegionShortDto> relationRegionQuery) {
eddie.woo's avatar
eddie.woo committed
364 365
        List<DevTreeDto> subWarpList = new ArrayList<>();
        // 获取区域
366
        List<Area> subList = areaList.stream().filter(sa -> Objects.equals(sa.getParentId(), current.getId()))
eddie.woo's avatar
eddie.woo committed
367 368 369 370
                .collect(toList());
        if (subList != null && !subList.isEmpty()) {
            for (Area area : subList) {
                RegionShortDto model = new RegionShortDto();
371
                model.setId(area.getId());
eddie.woo's avatar
eddie.woo committed
372 373 374 375 376
                model.setIsActive(BooleanUtils.isTrue(area.getIsActive()));
                model.setIsArea(true);
                model.setLevelType(current.getLevelType() + 1);
                model.setMergerName(area.getName());
                model.setName(area.getName());
377
                model.setParentId(area.getParentId());
eddie.woo's avatar
eddie.woo committed
378 379 380 381 382 383 384 385 386
                model.setSubRegionList(new ArrayList<>());

                VMRegionDevTreeData data = copyProperties(model, new VMRegionDevTreeData());
                data.setIsActive(BooleanUtils.isTrue(area.getIsActive()));

                DevTreeDto tree = new DevTreeDto();
                tree.setCode("");
                tree.setExpanded(false);
                tree.setItems(new ArrayList<>());
387
                tree.setParentId(area.getParentId());
eddie.woo's avatar
eddie.woo committed
388 389
                tree.setRelyOnCodes("");
                tree.setText(area.getName());
390
                tree.setId(area.getId());
eddie.woo's avatar
eddie.woo committed
391 392 393 394 395 396 397 398
                tree.setData(data);
                tree.setUniqueId(getUUID());
                tree.setItems(getAreaRegionChildrenList(model, areaList, relationRegionQuery));
                tree.getItems().sort(comparing(DevTreeDto<VMRegionDevTreeData>::getText, nullsLast(naturalOrder())));
                subWarpList.add(tree);
            }
        }
        List<RegionShortDto> regionList = relationRegionQuery.stream()
399
                .filter(sa -> Objects.equals(sa.getAreaId(), current.getId())).collect(toList());
eddie.woo's avatar
eddie.woo committed
400 401 402 403 404 405 406 407 408 409
        if (regionList != null && !regionList.isEmpty()) {
            Integer minLevel = regionList.stream().map(RegionShortDto::getLevelType).filter(Objects::nonNull)
                    .min(naturalOrder()).orElseThrow(ApplicationException::new);
            for (RegionShortDto region : regionList) {
                if (Objects.equals(region.getLevelType(), minLevel)) {
                    VMRegionDevTreeData data = copyProperties(region, new VMRegionDevTreeData());
                    DevTreeDto navTree = new DevTreeDto();
                    navTree.setCode("");
                    navTree.setExpanded(false);
                    navTree.setItems(new ArrayList<>());
410
                    navTree.setParentId(region.getParentId());
eddie.woo's avatar
eddie.woo committed
411 412
                    navTree.setRelyOnCodes("");
                    navTree.setText(region.getName());
413
                    navTree.setId(region.getId());
eddie.woo's avatar
eddie.woo committed
414 415
                    navTree.setData(data);
                    navTree.setUniqueId(getUUID());
416 417 418
                    // 省的parentId为区域Id
                    region.setParentId(
                            BooleanUtils.isTrue(current.getIsArea()) ? current.getId() : current.getParentId());
eddie.woo's avatar
eddie.woo committed
419 420 421 422 423 424 425 426 427 428 429 430
                    navTree.setItems(getNavTreeDtoList(region, regionList));
                    navTree.getItems()
                            .sort(comparing(DevTreeDto<VMRegionDevTreeData>::getText, nullsLast(naturalOrder())));
                    subWarpList.add(navTree);
                }
            }
        }
        // TODO 按照拼音排序(所有通过getText进行排序)
        subWarpList.sort(comparing(DevTreeDto<VMRegionDevTreeData>::getText, nullsLast(naturalOrder())));
        return subWarpList;
    }

431
    @SuppressWarnings({"rawtypes", "unchecked"})
eddie.woo's avatar
eddie.woo committed
432
    private List<DevTreeDto> getNavTreeDtoList(RegionShortDto currentNode, List<RegionShortDto> list) {
433
        List<RegionShortDto> subList = list.stream().filter(sa -> Objects.equals(sa.getParentId(), currentNode.getId()))
eddie.woo's avatar
eddie.woo committed
434 435 436 437 438 439 440 441
                .collect(toList());
        List<DevTreeDto> retlist = new ArrayList<>();
        for (RegionShortDto item : subList) {
            VMRegionDevTreeData data = copyProperties(item, new VMRegionDevTreeData());
            DevTreeDto model = new DevTreeDto();
            model.setCode("");
            model.setExpanded(false);
            model.setItems(new ArrayList<>());
442
            model.setParentId(currentNode.getId());
eddie.woo's avatar
eddie.woo committed
443 444
            model.setRelyOnCodes("");
            model.setText(item.getName());
445
            model.setId(item.getId());
eddie.woo's avatar
eddie.woo committed
446 447 448 449 450 451 452 453
            model.setData(data);

            model.setItems(getNavTreeDtoList(item, list));
            retlist.add(model);
        }
        return retlist;
    }
}