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

import org.nutz.lang.Files;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import pwc.taxtech.atms.common.CommonConstants;
import pwc.taxtech.atms.common.CommonUtils;
import pwc.taxtech.atms.dto.datainit.DataCountDto;
import pwc.taxtech.atms.dto.datainit.DataInitDto;
import pwc.taxtech.atms.dto.user.UserTemp;
12 13 14 15 16 17 18 19 20 21 22
import pwc.taxtech.atms.entity.*;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
eddie.woo's avatar
eddie.woo committed
23 24

@Service
25
public class DataInitServiceImpl extends AbstractService {
eddie.woo's avatar
eddie.woo committed
26

27
    private static final String[] sheetArray = new String[]{"机构层级", "事业部", "区域", "企业科目", "客户列表", "机构", "用户", "角色"};
eddie.woo's avatar
eddie.woo committed
28 29 30 31 32 33 34
    private static final String ENABLE = "启用";

    @Autowired
    private FileService fileService;

    /*
     * (non-Javadoc)
35
     *
eddie.woo's avatar
eddie.woo committed
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
     * @see
     * pwc.taxtech.atms.service.DataInitService#validateImportInitData(java.lang.
     * String)
     */
    @SuppressWarnings("rawtypes")
    public DataInitDto validateAndImportInitData(String filePath) {
        logger.debug("enter DataInitServiceImpl validateImportInitData");
        InputStream savedInputStream = Files.findFileAsStream(filePath);
        Map<String, Map<String, Integer>> sheetHeaderMap = fileService.readExcelHeaderAndClose(savedInputStream,
                sheetArray);
        savedInputStream = Files.findFileAsStream(filePath);
        Map<String, Collection<Map>> sheetDataMap = fileService.readExcelAndClose(savedInputStream, sheetArray);

        /*
         * variable definition
         */
        DataInitDto dataInitDto = new DataInitDto();
        Map<String, Integer> headerMap;
        Collection<Map> dataMapCollection;
        /*
         * 机构层级
         */
        headerMap = sheetHeaderMap.get("机构层级");
        dataMapCollection = sheetDataMap.get("机构层级");
        if (headerMap != null) {
            validateOrgStructure(dataInitDto, headerMap, dataMapCollection);
            importOrgStructure(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("机构层级sheet为空");
        }

        /*
         * 事业部
         */
        headerMap = sheetHeaderMap.get("事业部");
        dataMapCollection = sheetDataMap.get("事业部");
        if (headerMap != null) {
            validateBusinessUnit(dataInitDto, headerMap, dataMapCollection);
            importBusinessUnit(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("事业部sheet为空");
        }

        /*
         * 区域
         */
        headerMap = sheetHeaderMap.get("区域");
        dataMapCollection = sheetDataMap.get("区域");
        if (headerMap != null) {
            validateArea(dataInitDto, headerMap, dataMapCollection);
            importArea(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("区域sheet为空");
        }

        /*
         * 企业科目
         */
        headerMap = sheetHeaderMap.get("企业科目");
        dataMapCollection = sheetDataMap.get("企业科目");
        if (headerMap != null) {
            validateEnterpriseAccount(dataInitDto, headerMap, dataMapCollection);
            importEnterpriseAccount(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("企业科目sheet为空");
        }
102

eddie.woo's avatar
eddie.woo committed
103 104 105 106 107 108 109 110 111 112 113
        /*
         * 客户列表
         */
        headerMap = sheetHeaderMap.get("客户列表");
        dataMapCollection = sheetDataMap.get("客户列表");
        if (headerMap != null) {
            validateCustomer(dataInitDto, headerMap, dataMapCollection);
            importCustomer(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("客户列表sheet为空");
        }
114

eddie.woo's avatar
eddie.woo committed
115 116 117 118 119 120 121 122 123 124 125
        /*
         * 机构
         */
        headerMap = sheetHeaderMap.get("机构");
        dataMapCollection = sheetDataMap.get("机构");
        if (headerMap != null) {
            validateOrganization(dataInitDto, headerMap, dataMapCollection);
            importOrganization(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("机构sheet为空");
        }
126

eddie.woo's avatar
eddie.woo committed
127 128 129 130 131 132 133 134 135 136 137
        /*
         * 角色
         */
        headerMap = sheetHeaderMap.get("角色");
        dataMapCollection = sheetDataMap.get("角色");
        if (headerMap != null) {
            validateRole(dataInitDto, headerMap, dataMapCollection);
            importRole(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("角色sheet为空");
        }
138

eddie.woo's avatar
eddie.woo committed
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
        /*
         * 用户
         */
        headerMap = sheetHeaderMap.get("用户");
        dataMapCollection = sheetDataMap.get("用户");
        if (headerMap != null) {
            validateUser(dataInitDto, headerMap, dataMapCollection);
            importUser(dataInitDto);
        } else {
            dataInitDto.addErrorMsg("用户sheet为空");
        }
        logger.debug("DataInitServiceImpl validateImportInitData complete");
        return dataInitDto;
    }


    /**
     * 验证机构层级Excel格式, 准备数据
157
     *
eddie.woo's avatar
eddie.woo committed
158 159 160 161 162 163
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateOrgStructure(DataInitDto dataInitDto, Map<String, Integer> headerMap,
164
                                      Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179

        // validate header
        List<String> standardHeader = Arrays.asList("层级名称", "使用状态");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入机构层级异常: 导入机构层级格式错误");
                return;
            }
        }
        dataInitDto.setIsImportOrgStructureValid(true);

        // prepare data to insert
        List<OrganizationStructure> importOrgStructureList = new ArrayList<>();
        for (Map map : dataMapCollection) {
180 181

            if (map.get("层级名称") == null || map.get("使用状态") == null) {
eddie.woo's avatar
eddie.woo committed
182 183
                continue;
            }
184

eddie.woo's avatar
eddie.woo committed
185
            OrganizationStructure orgStructure = new OrganizationStructure();
186
            orgStructure.setId(CommonUtils.getUUID());
eddie.woo's avatar
eddie.woo committed
187 188 189 190 191 192 193 194 195 196 197
            orgStructure.setName(map.get("层级名称") == null ? null : map.get("层级名称").toString());
            orgStructure.setIsActive(map.get("使用状态") == null ? null : map.get("使用状态").toString().indexOf(ENABLE) > -1);
            orgStructure.setCreateTime(new Date());
            orgStructure.setUpdateTime(new Date());
            importOrgStructureList.add(orgStructure);
        }
        dataInitDto.setImportOrgStructure(importOrgStructureList);
    }

    /**
     * 验证区域Excel格式, 准备数据
198
     *
eddie.woo's avatar
eddie.woo committed
199 200 201 202 203 204
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateArea(DataInitDto dataInitDto, Map<String, Integer> headerMap,
205
                              Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
        // validate header
        List<String> standardHeader = Arrays.asList("区域名称", "行政区域");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入区域异常: 导入区域格式错误");
                return;
            }
        }

        dataInitDto.setIsImportAreaValid(true);
        // prepare data to insert
        List<Area> importAreaList = new ArrayList<>();
        List<AreaRegion> importAreaRegionList = new ArrayList<>();
        for (Map map : dataMapCollection) {
221

eddie.woo's avatar
eddie.woo committed
222 223 224
            if (map.get("区域名称") == null || map.get("行政区域") == null) { // 跳过数据为空的行
                continue;
            }
225

eddie.woo's avatar
eddie.woo committed
226 227 228 229 230 231
            AreaExample example = new AreaExample();
            example.createCriteria().andNameEqualTo(map.get("区域名称").toString());
            List<Area> dbAreaList = areaMapper.selectByExample(example);
            List<Area> mappedAreaList = importAreaList.stream().filter(a -> Objects.equals(a.getName(), map.get("区域名称").toString())).collect(Collectors.toList());
            //if area data not exist, then generate new one
            String uuid = null;
232
            if (!dbAreaList.isEmpty()) {
233
                uuid = dbAreaList.get(0).getId();
eddie.woo's avatar
eddie.woo committed
234
            }
235
            if (!mappedAreaList.isEmpty()) {
236
                uuid = mappedAreaList.get(0).getId();
eddie.woo's avatar
eddie.woo committed
237
            }
238
            if (dbAreaList.isEmpty() && mappedAreaList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
239 240 241
                // Area data
                Area area = new Area();
                uuid = CommonUtils.getUUID();
242
                area.setId(uuid);
eddie.woo's avatar
eddie.woo committed
243 244 245
                area.setIsActive(true);
                area.setName(map.get("区域名称").toString());
                importAreaList.add(area);
246 247
            }

eddie.woo's avatar
eddie.woo committed
248 249 250 251
            // Area and Region data
            List<Area> allAreas = areaMapper.selectByExample(null);
            List<Area> mappedAreas = allAreas.stream().filter(a -> a.getName().contains(map.get("区域名称").toString()))
                    .collect(Collectors.toList());
252

eddie.woo's avatar
eddie.woo committed
253 254 255 256
            RegionExample regionExample = new RegionExample();
            regionExample.setOrderByClause("LevelType DESC");
            List<Region> allRegions = regionMapper.selectByExample(regionExample);
            List<String> mappedRegionIdList = allRegions.stream()
257
                    .filter(a -> a.getName().contains(map.get("行政区域").toString())).map(Region::getId)
eddie.woo's avatar
eddie.woo committed
258
                    .collect(Collectors.toList());
259
            if (mappedRegionIdList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
260 261 262
                //by default, region should exist
                continue;
            }
263 264

            for (String s : mappedRegionIdList) {
eddie.woo's avatar
eddie.woo committed
265
                AreaRegion areaRegion = new AreaRegion();
266
                areaRegion.setId(CommonUtils.getUUID());
267
                if (mappedAreas.isEmpty()) {
268
                    areaRegion.setAreaId(uuid);
eddie.woo's avatar
eddie.woo committed
269
                } else {
270
                    areaRegion.setAreaId(mappedAreas.get(0).getId());
eddie.woo's avatar
eddie.woo committed
271
                }
272
                areaRegion.setRegionId(s);
eddie.woo's avatar
eddie.woo committed
273 274 275 276 277 278 279 280 281
                importAreaRegionList.add(areaRegion);
            }
        }
        dataInitDto.setImportAreaList(importAreaList);
        dataInitDto.setImportAreaRegionList(importAreaRegionList);
    }

    /**
     * 验证企业科目Excel格式, 准备数据
282
     *
eddie.woo's avatar
eddie.woo committed
283 284 285 286 287 288
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateEnterpriseAccount(DataInitDto dataInitDto, Map<String, Integer> headerMap,
289
                                           Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307
        // validate header
        List<String> standardHeader = Arrays.asList("企业科目代码", "企业科目名称", "借贷方向", "科目类型");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入区域异常: 导入区域格式错误");
                return;
            }
        }

        dataInitDto.setIsImportEnterpriseAccountValid(true);
        // prepare data to insert
        List<EnterpriseAccount> importEnterpriseAccount = new ArrayList<>();
        for (Map map : dataMapCollection) {
            if (map.get("企业科目代码") == null || map.get("企业科目名称") == null || map.get("借贷方向") == null
                    || map.get("科目类型") == null) { // 跳过数据为空的行
                continue;
            }
308

eddie.woo's avatar
eddie.woo committed
309
            EnterpriseAccount enterpriseAccount = new EnterpriseAccount();
310
            enterpriseAccount.setId(CommonUtils.getUUID());
eddie.woo's avatar
eddie.woo committed
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
            enterpriseAccount.setCode(map.get("企业科目代码").toString());
            enterpriseAccount.setName(map.get("企业科目名称").toString());
            enterpriseAccount.setFullName(map.get("企业科目名称").toString());
            enterpriseAccount.setDirection(getEnterpriseAccountDirection(map.get("借贷方向").toString()));
            enterpriseAccount.setIsActive(CommonConstants.ACTIVE_STATUS);
            enterpriseAccount.setRuleType(2);
            enterpriseAccount.setAcctProp(getAccountTypeIndex(map.get("科目类型").toString()));
            enterpriseAccount.setIsLeaf(true);
            enterpriseAccount.setCreateTime(new Date());
            enterpriseAccount.setUpdateTime(new Date());
            //TODO enterprise account set can not be null
            importEnterpriseAccount.add(enterpriseAccount);
        }
        dataInitDto.setImportEnterpriseAccount(importEnterpriseAccount);
    }

    private Integer getAccountTypeIndex(String name) {
        if (name.indexOf(CommonConstants.Asset) > -1) {
            return Integer.valueOf(CommonConstants.AssetValue);
        }
        if (name.indexOf(CommonConstants.Debt) > -1) {
            return Integer.valueOf(CommonConstants.DebtValue);
        }
        if (name.indexOf(CommonConstants.Joint) > -1) {
            return Integer.valueOf(CommonConstants.JointValue);
        }
        if (name.indexOf(CommonConstants.Equity) > -1) {
            return Integer.valueOf(CommonConstants.EquityValue);
        }
        if (name.indexOf(CommonConstants.Cost) > -1) {
            return Integer.valueOf(CommonConstants.CostValue);
        }
        if (name.indexOf(CommonConstants.Loss) > -1) {
            return Integer.valueOf(CommonConstants.LossValue);
        }
        return null;
    }
348

eddie.woo's avatar
eddie.woo committed
349
    private Integer getEnterpriseAccountDirection(String name) {
350
        if (name.indexOf(CommonConstants.CreditDirectionName) > -1) {
eddie.woo's avatar
eddie.woo committed
351 352
            return Integer.valueOf(CommonConstants.CreditDirectionValue);
        }
353
        if (name.indexOf(CommonConstants.DebitDirectionName) > -1) {
eddie.woo's avatar
eddie.woo committed
354 355 356 357 358 359 360
            return Integer.valueOf(CommonConstants.DebitDirectionValue);
        }
        return null;
    }

    /**
     * 验证事业部Excel格式, 准备数据
361
     *
eddie.woo's avatar
eddie.woo committed
362 363 364 365 366 367
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateBusinessUnit(DataInitDto dataInitDto, Map<String, Integer> headerMap,
368
                                      Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
369 370 371 372 373 374 375 376 377 378 379 380 381 382 383

        // validate header
        List<String> standardHeader = Arrays.asList("事业部名称", "使用状态");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入事业部异常: 导入事业部格式错误");
                return;
            }
        }
        dataInitDto.setIsImportBusinessUnitValid(true);

        // prepare data to insert
        List<BusinessUnit> importBusinessUnitList = new ArrayList<>();
        for (Map map : dataMapCollection) {
384
            if (map.get("事业部名称") == null || map.get("使用状态") == null) {
eddie.woo's avatar
eddie.woo committed
385 386 387
                continue;
            }
            BusinessUnit businessUnit = new BusinessUnit();
388
            businessUnit.setId(CommonUtils.getUUID());
eddie.woo's avatar
eddie.woo committed
389 390 391 392 393 394 395 396
            businessUnit.setName(map.get("事业部名称") == null ? null : map.get("事业部名称").toString());
            businessUnit.setIsActive(map.get("使用状态") == null ? null : map.get("使用状态").toString().indexOf(ENABLE) > -1);
            businessUnit.setCreateTime(new Date());
            businessUnit.setUpdateTime(new Date());
            importBusinessUnitList.add(businessUnit);
        }
        dataInitDto.setImportBusinessUnit(importBusinessUnitList);
    }
397

eddie.woo's avatar
eddie.woo committed
398 399
    /**
     * 验证客户列表Excel格式, 准备数据
400
     *
eddie.woo's avatar
eddie.woo committed
401 402 403 404 405 406
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateCustomer(DataInitDto dataInitDto, Map<String, Integer> headerMap,
407
                                  Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
408 409 410 411 412 413 414 415 416
        // validate header
        List<String> standardHeader = Arrays.asList("客户代码", "客户名称");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入客户列表异常: 导入客户列表格式错误");
                return;
            }
        }
417

eddie.woo's avatar
eddie.woo committed
418 419 420 421 422 423
        dataInitDto.setIsImportCustomerValid(true);

        // prepare data to insert
        List<Customer> importBusinessUnitList = new ArrayList<>();
        for (Map map : dataMapCollection) {
            Customer customer = new Customer();
424
            customer.setId(CommonUtils.getUUID());
eddie.woo's avatar
eddie.woo committed
425 426
            customer.setCode(map.get("客户代码") == null ? null : map.get("客户代码").toString());
            customer.setName(map.get("客户名称") == null ? null : map.get("客户名称").toString());
427
            customer.setEnterPriseAccountId("");
eddie.woo's avatar
eddie.woo committed
428 429 430 431
            importBusinessUnitList.add(customer);
        }
        dataInitDto.setImportCustomer(importBusinessUnitList);
    }
432

eddie.woo's avatar
eddie.woo committed
433 434
    /**
     * 验证机构Excel格式, 准备数据
435
     *
eddie.woo's avatar
eddie.woo committed
436 437 438 439 440 441
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateOrganization(DataInitDto dataInitDto, Map<String, Integer> headerMap,
442
                                      Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
443 444 445 446 447 448 449 450 451
        // validate header
        List<String> standardHeader = Arrays.asList("机构名称", "机构代码", "行政地区", "纳税人识别号", "上级公司", "层级", "事业部", "地区");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入机构异常: 导入机构格式错误");
                return;
            }
        }
452

eddie.woo's avatar
eddie.woo committed
453 454 455 456 457
        dataInitDto.setIsImportOrganizationValid(true);

        // prepare data to insert
        List<Organization> importOrganizationList = new ArrayList<>();
        for (Map map : dataMapCollection) {
458
            if (StringUtils.isEmpty(map.get("机构名称").toString()) || StringUtils.isEmpty(map.get("机构代码").toString())
eddie.woo's avatar
eddie.woo committed
459
                    || StringUtils.isEmpty(map.get("行政地区").toString())
460 461
                    || StringUtils.isEmpty(map.get("层级").toString()) || StringUtils.isEmpty(map.get("事业部").toString())
                    || StringUtils.isEmpty(map.get("地区").toString())) {
eddie.woo's avatar
eddie.woo committed
462 463
                continue;
            }
464

eddie.woo's avatar
eddie.woo committed
465 466
            Organization organization = new Organization();
            importOrganizationList.add(organization);
467
            organization.setId(CommonUtils.getUUID());
eddie.woo's avatar
eddie.woo committed
468 469 470 471
            organization.setClientCode(CommonConstants.CLIENT_CODE);
            organization.setName(map.get("机构名称").toString());
            organization.setCode(map.get("机构代码").toString());
            organization.setTaxPayerNumber(map.get("纳税人识别号") == null ? null : map.get("纳税人识别号").toString());
472

eddie.woo's avatar
eddie.woo committed
473 474
            //parent id
            String parentName = map.get("上级公司") == null ? null : map.get("上级公司").toString();
475
            if (!StringUtils.isEmpty(parentName)) {
eddie.woo's avatar
eddie.woo committed
476 477 478
                OrganizationExample organizationExample = new OrganizationExample();
                organizationExample.createCriteria().andNameEqualTo(parentName);
                List<Organization> organizationList = organizationMapper.selectByExample(organizationExample);
479
                if (organizationList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
480 481
                    continue;
                }
482
                organization.setParentId(organizationList.get(0).getId());
eddie.woo's avatar
eddie.woo committed
483
            }
484

eddie.woo's avatar
eddie.woo committed
485 486 487 488
            //region id
            RegionExample regionExample = new RegionExample();
            regionExample.createCriteria().andNameEqualTo(map.get("行政地区").toString());
            List<Region> regionList = regionMapper.selectByExample(regionExample);
489
            if (regionList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
490
                continue;
491
            }
492
            organization.setRegionId(regionList.get(0).getId());
493

eddie.woo's avatar
eddie.woo committed
494 495 496 497
            //structure id
            OrganizationStructureExample organizationStructureExample = new OrganizationStructureExample();
            organizationStructureExample.createCriteria().andNameEqualTo(map.get("层级").toString());
            List<OrganizationStructure> organizationStructureList = organizationStructureMapper.selectByExample(organizationStructureExample);
498
            if (organizationStructureList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
499 500
                continue;
            }
501
            organization.setStructureId(organizationStructureList.get(0).getId());
502

503
            organization.setIndustryId(CommonConstants.INDUSTRY_Id);
504

eddie.woo's avatar
eddie.woo committed
505 506 507 508
            //business id
            BusinessUnitExample businessUnitExample = new BusinessUnitExample();
            businessUnitExample.createCriteria().andNameEqualTo(map.get("事业部").toString());
            List<BusinessUnit> businessUnitList = businessUnitMapper.selectByExample(businessUnitExample);
509
            if (businessUnitList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
510 511
                continue;
            }
512
            organization.setBusinessUnitId(businessUnitList.get(0).getId());
513

eddie.woo's avatar
eddie.woo committed
514 515 516 517
            //area id
            AreaExample areaExample = new AreaExample();
            areaExample.createCriteria().andNameEqualTo(map.get("地区").toString());
            List<Area> areaList = areaMapper.selectByExample(areaExample);
518
            if (areaList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
519 520
                continue;
            }
521
            organization.setAreaId(areaList.get(0).getId());
522

eddie.woo's avatar
eddie.woo committed
523 524 525 526 527 528 529
            organization.setIsActive(CommonConstants.ACTIVE_STATUS);
            organization.setpLevel(0);
            organization.setCreateTime(new Date());
            organization.setUpdateTime(new Date());
        }
        dataInitDto.setImportOrganization(importOrganizationList);
    }
530

eddie.woo's avatar
eddie.woo committed
531 532
    /**
     * 验证角色Excel格式, 准备数据
533
     *
eddie.woo's avatar
eddie.woo committed
534 535 536 537 538 539
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateRole(DataInitDto dataInitDto, Map<String, Integer> headerMap,
540
                              Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
541 542 543 544 545 546 547 548 549
        // validate header
        List<String> standardHeader = Arrays.asList("角色名称", "角色类别", "角色描述");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入角色异常: 导入角色格式错误");
                return;
            }
        }
550

eddie.woo's avatar
eddie.woo committed
551 552 553 554 555
        dataInitDto.setIsImportRoleValid(true);

        // prepare data to insert
        List<Role> importRoleList = new ArrayList<>();
        List<RoleCategory> importRoleCatagoryList = new ArrayList<>();
556

eddie.woo's avatar
eddie.woo committed
557
        for (Map map : dataMapCollection) {
558
            if (StringUtils.isEmpty(map.get("角色类别").toString()) || StringUtils.isEmpty(map.get("角色名称").toString())) {
eddie.woo's avatar
eddie.woo committed
559 560
                continue;
            }
561

eddie.woo's avatar
eddie.woo committed
562 563 564 565 566 567 568
            //add RoleCategory
            RoleCategoryExample example = new RoleCategoryExample();
            example.createCriteria().andNameEqualTo(map.get("角色类别").toString());
            List<RoleCategory> dbRoleCatagoryList = roleCategoryMapper.selectByExample(example);
            List<RoleCategory> mappedRoleCatagoryList = importRoleCatagoryList.stream().filter(a -> Objects.equals(a.getName(), map.get("角色类别").toString())).collect(Collectors.toList());
            //not exist in database and not in list
            String uuid = null;
569
            if (!dbRoleCatagoryList.isEmpty()) {
570
                uuid = dbRoleCatagoryList.get(0).getId();
eddie.woo's avatar
eddie.woo committed
571
            }
572
            if (!mappedRoleCatagoryList.isEmpty()) {
573
                uuid = mappedRoleCatagoryList.get(0).getId();
eddie.woo's avatar
eddie.woo committed
574
            }
575
            if (roleCategoryMapper.selectByExample(example).isEmpty() && mappedRoleCatagoryList.isEmpty()) {
eddie.woo's avatar
eddie.woo committed
576 577 578
                RoleCategory roleCatagory = new RoleCategory();
                importRoleCatagoryList.add(roleCatagory);
                uuid = CommonUtils.getUUID();
579
                roleCatagory.setId(uuid);
eddie.woo's avatar
eddie.woo committed
580 581 582 583
                roleCatagory.setName(map.get("角色类别").toString());
                roleCatagory.setIsActive(CommonConstants.ACTIVE_STATUS);
                roleCatagory.setCreateTime(new Date());
                roleCatagory.setUpdateTime(new Date());
584 585
            }

eddie.woo's avatar
eddie.woo committed
586 587 588
            //add role
            Role role = new Role();
            importRoleList.add(role);
589
            role.setId(CommonUtils.getUUID());
eddie.woo's avatar
eddie.woo committed
590
            role.setName(map.get("角色名称").toString());
591
            role.setRoleCategoryId(map.get("角色类别").toString());
eddie.woo's avatar
eddie.woo committed
592
            role.setDescription(map.get("角色描述").toString());
593
            role.setServiceTypeId("2");
eddie.woo's avatar
eddie.woo committed
594 595 596
            role.setCreateTime(new Date());
            role.setUpdateTime(new Date());
        }
597

eddie.woo's avatar
eddie.woo committed
598 599 600
        dataInitDto.setImportRole(importRoleList);
        dataInitDto.setImportRoleCategory(importRoleCatagoryList);
    }
601

eddie.woo's avatar
eddie.woo committed
602 603
    /**
     * 验证用户Excel格式, 准备数据
604
     *
eddie.woo's avatar
eddie.woo committed
605 606 607 608 609 610
     * @param dataInitDto
     * @param headerMap
     * @param dataMapCollection
     */
    @SuppressWarnings("rawtypes")
    private void validateUser(DataInitDto dataInitDto, Map<String, Integer> headerMap,
611
                              Collection<Map> dataMapCollection) {
eddie.woo's avatar
eddie.woo committed
612 613 614 615 616 617 618 619 620
        // validate header
        List<String> standardHeader = Arrays.asList("Admin用户", "用户名", "所属机构", "角色");
        for (String header : standardHeader) {
            Integer index = headerMap.get(header);
            if (index == null) {
                dataInitDto.addErrorMsg("导入用户异常: 导入用户格式错误");
                return;
            }
        }
621

eddie.woo's avatar
eddie.woo committed
622 623 624 625 626
        dataInitDto.setIsImportUserTempValid(true);

        // prepare data to insert
        List<UserTemp> importUserTempList = new ArrayList<>();
        for (Map map : dataMapCollection) {
627
            if (StringUtils.isEmpty(map.get("Admin用户").toString()) || StringUtils.isEmpty(map.get("用户名").toString())
eddie.woo's avatar
eddie.woo committed
628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643
                    || StringUtils.isEmpty(map.get("所属机构").toString()) || StringUtils.isEmpty(map.get("角色").toString())) {
                continue;
            }
            UserTemp userTemp = new UserTemp();
            importUserTempList.add(userTemp);
            String isAdmin = map.get("Admin用户").toString();
            userTemp.setIsAdmin(Objects.equals(isAdmin, "是") ? CommonConstants.ACTIVE_STATUS : CommonConstants.DEACTIVE_STATUS);
            userTemp.setUserName(map.get("用户名").toString());
            userTemp.setOrganizationName(map.get("所属机构").toString());
            userTemp.setRoleName(map.get("角色").toString());
        }
        dataInitDto.setImportUserTemp(importUserTempList);
    }

    /**
     * 导入机构层级数据
644
     *
eddie.woo's avatar
eddie.woo committed
645 646 647 648 649 650 651
     * @param orgStructureList
     * @return
     */
    private void importOrgStructure(DataInitDto dataInitDto) {

        Long errorCount = 0L;
        Long originalCount = organizationStructureMapper.countByExample(null);
652

eddie.woo's avatar
eddie.woo committed
653 654
        List<OrganizationStructure> orgStructureList = new ArrayList<>();
        //if headers are valid
655
        if (dataInitDto.getIsImportOrgStructureValid()) {
eddie.woo's avatar
eddie.woo committed
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671
            /*
             * 目前采用逐条插入的方法, 如今后数据量大可改用批量插入, 但需要加入数据校验
             */
            orgStructureList = dataInitDto.getImportOrgStructure();
            for (OrganizationStructure orgStructure : orgStructureList) {
                try {
                    organizationStructureMapper.insert(orgStructure);
                } catch (Exception e) {
                    logger.debug("Error inserting 机构层级: " + e.getMessage());
                    errorCount++;
                }
            }
        }
        Long newCount = organizationStructureMapper.countByExample(null);
        DataCountDto dataCountDto = new DataCountDto(orgStructureList.size(), originalCount, newCount, errorCount, "机构层级");
        dataInitDto.getValidMsgs().add(dataCountDto);
672
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
673 674 675 676 677 678
            dataInitDto.getErrorMsgs().add("导入机构层级错误");
        }
    }

    /**
     * 导入事业部数据
679
     *
eddie.woo's avatar
eddie.woo committed
680 681 682 683 684 685 686 687 688
     * @param dataInitDto
     * @return
     */
    private void importBusinessUnit(DataInitDto dataInitDto) {

        Long errorCount = 0L;
        Long originalCount = businessUnitMapper.countByExample(null);

        List<BusinessUnit> businessUnitList = new ArrayList<>();
689
        if (dataInitDto.getIsImportBusinessUnitValid()) {
eddie.woo's avatar
eddie.woo committed
690 691 692 693 694 695 696 697 698 699 700 701 702
            /*
             * 目前采用逐条插入的方法, 如今后数据量大可改用批量插入, 但需要加入数据校验
             */
            businessUnitList = dataInitDto.getImportBusinessUnit();
            for (BusinessUnit businessUnit : businessUnitList) {
                try {
                    businessUnitMapper.insert(businessUnit);
                } catch (Exception e) {
                    logger.debug("Error inserting 事业部: " + e.getMessage());
                    errorCount++;
                }
            }
        }
703

eddie.woo's avatar
eddie.woo committed
704 705 706 707
        Long newCount = businessUnitMapper.countByExample(null);

        DataCountDto dataCountDto = new DataCountDto(businessUnitList.size(), originalCount, newCount, errorCount, "事业部");
        dataInitDto.getValidMsgs().add(dataCountDto);
708
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
709 710 711 712 713 714
            dataInitDto.getErrorMsgs().add("导入事业部错误");
        }
    }

    /**
     * 导入区域数据
715
     *
eddie.woo's avatar
eddie.woo committed
716 717 718 719 720 721 722 723 724 725 726 727
     * @param orgStructureList
     * @return
     */
    private void importArea(DataInitDto dataInitDto) {

        Long errorCount = 0L;
        Long originalCount = areaRegionMapper.countByExample(null);

        /*
         * 准备数据时需要通过非空校验
         */
        List<AreaRegion> areaRegionList = new ArrayList<>();
728
        if (dataInitDto.getIsImportAreaValid()) {
eddie.woo's avatar
eddie.woo committed
729 730 731 732 733 734 735 736
            // 插入Area
            List<Area> areaList = dataInitDto.getImportAreaList();
            areaRegionList = dataInitDto.getImportAreaRegionList();
            for (Area item : areaList) {
                try {
                    //in case area exists
                    AreaExample areaExample = new AreaExample();
                    areaExample.createCriteria().andNameEqualTo(item.getName()).andIsActiveEqualTo(CommonConstants.ACTIVE_STATUS);
737
                    if (areaMapper.selectByExample(areaExample).isEmpty()) {
eddie.woo's avatar
eddie.woo committed
738 739 740 741 742 743 744 745 746 747 748 749
                        areaMapper.insert(item);
                    }
                } catch (Exception e) {
                    logger.debug("Error inserting 区域: " + e.getMessage());
                }
            }

            // 插入AreaRegion
            for (AreaRegion item : areaRegionList) {
                try {
                    //in case area region exists
                    AreaRegionExample areaRegionExample = new AreaRegionExample();
750
                    areaRegionExample.createCriteria().andAreaIdEqualTo(item.getAreaId()).andRegionIdEqualTo(item.getRegionId());
751
                    if (areaRegionMapper.selectByExample(areaRegionExample).isEmpty()) {
eddie.woo's avatar
eddie.woo committed
752 753 754
                        areaRegionMapper.insert(item);
                    }
                } catch (Exception e) {
755 756
                    logger.debug("Error inserting 关联行政区域, areaId:{}, regionId:{}, errorMessage: {}", item.getAreaId(),
                            item.getRegionId(), e.getMessage());
eddie.woo's avatar
eddie.woo committed
757 758 759 760 761 762 763 764
                    errorCount++;
                }
            }
        }
        Long newCount = areaRegionMapper.countByExample(null);

        DataCountDto dataCountDto = new DataCountDto(areaRegionList.size(), originalCount, newCount, errorCount, "区域");
        dataInitDto.getValidMsgs().add(dataCountDto);
765
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
766 767 768
            dataInitDto.getErrorMsgs().add("导入区域错误");
        }
    }
769

eddie.woo's avatar
eddie.woo committed
770 771
    /**
     * 导入企业科目数据
772
     *
eddie.woo's avatar
eddie.woo committed
773 774 775 776 777 778
     * @param orgStructureList
     * @return
     */
    private void importEnterpriseAccount(DataInitDto dataInitDto) {
        Long errorCount = 0L;
        Long originalCount = enterpriseAccountMapper.countByExample(null);
779

eddie.woo's avatar
eddie.woo committed
780
        List<EnterpriseAccount> enterpriseAccountList = new ArrayList<>();
781
        if (dataInitDto.getIsImportEnterpriseAccountValid()) {
eddie.woo's avatar
eddie.woo committed
782 783 784 785 786 787 788 789 790 791 792 793 794 795
            /*
             * 准备数据时需要通过非空校验
             */
            enterpriseAccountList = dataInitDto.getImportEnterpriseAccount();
            // 插入EnterpriseAccount
            for (EnterpriseAccount item : enterpriseAccountList) {
                try {
                    enterpriseAccountMapper.insert(item);
                } catch (Exception e) {
                    logger.debug("Error inserting 企业科目: " + e.getMessage());
                    errorCount++;
                }
            }
        }
796

eddie.woo's avatar
eddie.woo committed
797 798 799 800
        Long newCount = enterpriseAccountMapper.countByExample(null);

        DataCountDto dataCountDto = new DataCountDto(enterpriseAccountList.size(), originalCount, newCount, errorCount, "企业科目");
        dataInitDto.getValidMsgs().add(dataCountDto);
801
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
802 803 804
            dataInitDto.getErrorMsgs().add("导入企业科目错误");
        }
    }
805

eddie.woo's avatar
eddie.woo committed
806 807
    /**
     * 导入客户列表数据
808
     *
eddie.woo's avatar
eddie.woo committed
809 810 811 812 813 814 815 816
     * @param dataInitDto
     * @return
     */
    private void importCustomer(DataInitDto dataInitDto) {
        Long errorCount = 0L;
        Long originalCount = customerMapper.countByExample(null);

        List<Customer> customerList = new ArrayList<>();
817
        if (dataInitDto.getIsImportCustomerValid()) {
eddie.woo's avatar
eddie.woo committed
818 819 820 821 822 823 824 825 826 827 828 829 830 831
            /*
             * 准备数据时需要通过非空校验
             */
            // 插入Customer
            customerList = dataInitDto.getImportCustomer();
            for (Customer item : customerList) {
                try {
                    customerMapper.insert(item);
                } catch (Exception e) {
                    logger.debug("Error inserting 客户列表: " + e.getMessage());
                    errorCount++;
                }
            }
        }
832

eddie.woo's avatar
eddie.woo committed
833
        Long newCount = customerMapper.countByExample(null);
834

eddie.woo's avatar
eddie.woo committed
835 836
        DataCountDto dataCountDto = new DataCountDto(customerList.size(), originalCount, newCount, errorCount, "客户列表");
        dataInitDto.getValidMsgs().add(dataCountDto);
837
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
838 839 840
            dataInitDto.getErrorMsgs().add("导入客户列表错误");
        }
    }
841

eddie.woo's avatar
eddie.woo committed
842 843
    /**
     * 导入机构数据
844
     *
eddie.woo's avatar
eddie.woo committed
845 846 847 848 849 850
     * @param organizationList
     * @return
     */
    private void importOrganization(DataInitDto dataInitDto) {
        Long errorCount = 0L;
        Long originalCount = organizationMapper.countByExample(null);
851

eddie.woo's avatar
eddie.woo committed
852
        List<Organization> organizationList = new ArrayList<>();
853
        if (dataInitDto.getIsImportOrganizationValid()) {
eddie.woo's avatar
eddie.woo committed
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869
            RegionExample regionExample = new RegionExample();
            regionExample.setOrderByClause("LevelType DESC");
            /*
             * 准备数据时需要通过非空校验
             */
            // 插入Organization
            organizationList = dataInitDto.getImportOrganization();
            for (Organization item : organizationList) {
                try {
                    organizationMapper.insert(item);
                } catch (Exception e) {
                    logger.debug("Error inserting 机构: " + e.getMessage());
                    errorCount++;
                }
            }
        }
870

eddie.woo's avatar
eddie.woo committed
871
        Long newCount = organizationMapper.countByExample(null);
872

eddie.woo's avatar
eddie.woo committed
873 874
        DataCountDto dataCountDto = new DataCountDto(organizationList.size(), originalCount, newCount, errorCount, "机构");
        dataInitDto.getValidMsgs().add(dataCountDto);
875
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
876 877 878
            dataInitDto.getErrorMsgs().add("导入机构列表错误");
        }
    }
879

eddie.woo's avatar
eddie.woo committed
880 881
    /**
     * 导入角色数据
882
     *
eddie.woo's avatar
eddie.woo committed
883 884 885 886
     * @param dataInitDto
     * @return
     */
    private void importRole(DataInitDto dataInitDto) {
887
        //角色导入,先导入类别,再导入角色,因为要引用类别的Id
eddie.woo's avatar
eddie.woo committed
888 889 890 891
        Long errorCount = 0L;
        Long originalCount = roleMapper.countByExample(null);

        List<Role> roleList = new ArrayList<>();
892
        if (dataInitDto.getIsImportRoleValid()) {
eddie.woo's avatar
eddie.woo committed
893 894 895 896 897 898 899 900 901 902 903 904 905
            /*
             * 准备数据时需要通过非空校验
             */
            //先插入角色类别
            roleList = dataInitDto.getImportRole();
            List<RoleCategory> roleCategoryList = dataInitDto.getImportRoleCategory();
            for (RoleCategory roleCategory : roleCategoryList) {
                try {
                    roleCategoryMapper.insert(roleCategory);
                } catch (Exception e) {
                    logger.debug("Error inserting 角色类别: " + e.getMessage());
                }
            }
906

eddie.woo's avatar
eddie.woo committed
907 908
            List<RoleCategory> queryList = roleCategoryMapper.selectByExample(null);
            //插入角色
909
            for (Role role : roleList) {
910 911 912 913
                //用Id替换掉名字
                String oldId = role.getRoleCategoryId();
                RoleCategory newObject = queryList.stream().filter(a -> Objects.equals(a.getName(), oldId)).findFirst().orElse(null);
                role.setRoleCategoryId(newObject == null ? null : newObject.getId());
eddie.woo's avatar
eddie.woo committed
914 915 916 917 918 919 920 921 922 923 924
                try {
                    roleMapper.insert(role);
                } catch (Exception e) {
                    logger.debug("Error inserting 角色: " + e.getMessage());
                    errorCount++;
                }
            }
        }
        Long newCount = roleMapper.countByExample(null);
        DataCountDto dataCountDto = new DataCountDto(roleList.size(), originalCount, newCount, errorCount, "角色");
        dataInitDto.getValidMsgs().add(dataCountDto);
925
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
926 927 928
            dataInitDto.getErrorMsgs().add("导入角色列表错误");
        }
    }
929

eddie.woo's avatar
eddie.woo committed
930 931
    /**
     * 导入用户数据
932
     *
eddie.woo's avatar
eddie.woo committed
933 934 935 936 937 938 939 940
     * @param dataInitDto
     * @return
     */
    private void importUser(DataInitDto dataInitDto) {
        Long errorCount = 0L;
        Long originalCount = userMapper.countByExample(null);

        List<UserTemp> userTempList = new ArrayList<>();
941
        if (dataInitDto.getIsImportUserTempValid()) {
eddie.woo's avatar
eddie.woo committed
942 943 944 945 946 947 948
            /*
             * 准备数据时需要通过非空校验
             */
            // 插入User
            userTempList = dataInitDto.getImportUserTemp();
            List<Organization> orgList = organizationMapper.selectByExample(null);
            List<Role> roleList = roleMapper.selectByExample(null);
949

eddie.woo's avatar
eddie.woo committed
950 951 952 953
            for (UserTemp item : userTempList) {
                try {
                    User user = new User();
                    Organization orgObject = orgList.stream().filter(a -> Objects.equals(a.getName(), item.getOrganizationName())).findFirst().orElse(null);
954
                    if (orgObject != null) {
eddie.woo's avatar
eddie.woo committed
955
                        String userId = CommonUtils.getUUID();
956
                        user.setId(userId);
eddie.woo's avatar
eddie.woo committed
957 958 959 960 961 962 963 964
                        user.setUserName(item.getUserName());
                        user.setLoginType(3);
                        user.setStatus(1);
                        user.setCreateTime(new Date());
                        user.setUpdateTime(new Date());
                        user.setIsAdmin(item.getIsAdmin());
                        user.setIsSuperAdmin(false);
                        user.setAttemptTimes(0);
965
                        user.setOrganizationId(orgObject.getId());
eddie.woo's avatar
eddie.woo committed
966 967
                        userMapper.insert(user);
                        String[] roleNames = item.getRoleName().split("\\,|\\,");
968
                        for (String roleName : roleNames) {
eddie.woo's avatar
eddie.woo committed
969
                            Role roleObject = roleList.stream().filter(a -> Objects.equals(a.getName(), roleName)).findFirst().orElse(null);
970
                            if (roleObject != null) {
eddie.woo's avatar
eddie.woo committed
971
                                UserRole userRole = new UserRole();
972 973 974 975
                                userRole.setId(CommonUtils.getUUID());
                                userRole.setUserId(userId);
                                userRole.setRoleId(roleObject.getId());
                                userRole.setServiceTypeId("2");
eddie.woo's avatar
eddie.woo committed
976 977 978 979 980 981 982 983 984 985
                                userRoleMapper.insert(userRole);
                            }
                        }
                    }
                } catch (Exception e) {
                    logger.debug("Error inserting 用户: " + e.getMessage());
                    errorCount++;
                }
            }
        }
986

eddie.woo's avatar
eddie.woo committed
987
        Long newCount = userMapper.countByExample(null);
988

eddie.woo's avatar
eddie.woo committed
989 990
        DataCountDto dataCountDto = new DataCountDto(userTempList.size(), originalCount, newCount, errorCount, "用户");
        dataInitDto.getValidMsgs().add(dataCountDto);
991
        if (errorCount > 0) {
eddie.woo's avatar
eddie.woo committed
992 993 994 995
            dataInitDto.getErrorMsgs().add("导入用户列表错误");
        }
    }
}