linwe
2024-06-03 b4939711ffa1dba2018b4ee358e3a79107756c58
住户导入切换多线程
1 files modified
288 ■■■■■ changed files
src/main/java/org/springblade/modules/house/service/impl/HouseholdServiceImpl.java 288 ●●●●● patch | view | raw | blame | history
src/main/java/org/springblade/modules/house/service/impl/HouseholdServiceImpl.java
@@ -62,6 +62,7 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.*;
import java.util.stream.Collectors;
/**
@@ -342,146 +343,193 @@
        int importNum = 0;
        int updateNum = 0;
        int errorNum = 0;
        for (ImportHouseholdExcel houseHoldExcel : data) {
            HouseholdEntity householdEntity = Objects.requireNonNull(BeanUtil.copy(houseHoldExcel, HouseholdEntity.class));
            // 判断姓名,手机号
            if (Strings.isBlank(householdEntity.getName())
                || Strings.isBlank(householdEntity.getHouseCode())
            ) {
                errorNum++;
                continue;
            }
            // 查询库中是否已存在
            QueryWrapper<HouseholdEntity> wrapper = new QueryWrapper<>();
            wrapper.eq("house_code", householdEntity.getHouseCode())
                .eq("is_deleted", 0)
                .eq("name", householdEntity.getName());
            List<HouseholdEntity> list = this.list(wrapper);
            // 与角色关系
            if (!Strings.isBlank(houseHoldExcel.getRelationship())) {
                householdEntity.setRelationship(Integer.parseInt(houseHoldExcel.getRelationship()));
                // 如果是业主,则需要往用户表插入用户
                if (householdEntity.getRelationship() == 1) {
                    houseService.saveOrUpdateUser(householdEntity);
                }
            }
            // 判断是否租户导入
            if (StringUtils.isNotBlank(isTenant)) {
                householdEntity.setRelationship(18);
                HouseRentalEntity houseRentalEntity = iHouseRentalService.getOne(Wrappers.<HouseRentalEntity>lambdaQuery()
                    .eq(HouseRentalEntity::getHouseCode, householdEntity.getHouseCode()));
                if (houseRentalEntity != null) {
                    householdEntity.setHousingRentalId(houseRentalEntity.getId());
                } else {
                    // 新建出租屋
                    HouseRentalEntity houseRentalEntity1 = new HouseRentalEntity();
                    houseRentalEntity1.setHouseCode(householdEntity.getHouseCode());
                    houseRentalEntity1.setHouseStatus(1);
                    houseRentalEntity1.setAuditStatus(0);
                    houseRentalEntity1.setRentalUse(4);
                    houseRentalEntity1.setTenantRelationship(1);
                    houseRentalEntity1.setRentalTime(new Date());
                    houseRentalEntity1.setDueTime(new Date());
                    houseRentalEntity1.setTerminationTime(new Date());
                    iHouseRentalService.save(houseRentalEntity1);
                    householdEntity.setHousingRentalId(houseRentalEntity1.getId());
                    // errorNum++;
                    // continue;
                }
            }
            /// 是否主要联系人
            if (!Strings.isBlank(houseHoldExcel.getIsPrimaryContact())) {
                householdEntity.setIsPrimaryContact(Integer.parseInt(houseHoldExcel.getIsPrimaryContact()));
            }
            // 居住状态
            if (!Strings.isBlank(houseHoldExcel.getResidentialStatus())) {
                householdEntity.setResidentialStatus(Integer.parseInt(houseHoldExcel.getResidentialStatus()));
            }
            // 性别
            if (!Strings.isBlank(houseHoldExcel.getGender())) {
                householdEntity.setGender(Short.parseShort(houseHoldExcel.getGender()));
            }
            // 居民身份证
            if (!Strings.isBlank(houseHoldExcel.getIdCard())) {
                if (IdcardUtil.isValidCard(houseHoldExcel.getIdCard())) {
                    // 身份证类型为居民身份证
                    householdEntity.setCardType(111);
                }
            }
            // 党员
            if (!Strings.isBlank(houseHoldExcel.getPartyEmber())) {
                householdEntity.setPartyEmber(Integer.parseInt(houseHoldExcel.getPartyEmber()));
            }
            // 民族
            if (!Strings.isBlank(houseHoldExcel.getEthnicity())) {
                householdEntity.setEthnicity(Integer.parseInt(houseHoldExcel.getEthnicity()));
            }
            // 学历
            if (!Strings.isBlank(houseHoldExcel.getEducation())) {
                householdEntity.setEducation(Integer.parseInt(houseHoldExcel.getEducation()));
            }
            // 健康状况
            if (!Strings.isBlank(houseHoldExcel.getHealthStatus())) {
                householdEntity.setHealthStatus(Integer.parseInt(houseHoldExcel.getHealthStatus()));
            }
            // 工作状态
            if (!Strings.isBlank(houseHoldExcel.getWorkStatus())) {
                householdEntity.setWorkStatus(Integer.parseInt(houseHoldExcel.getWorkStatus()));
            }
            // 外出时间
            if (!Strings.isBlank(houseHoldExcel.getGoOutTime())) {
                try {
                    Date date = new SimpleDateFormat("yyyy-MM-dd").parse(houseHoldExcel.getGoOutTime());
                    householdEntity.setGoOutTime(date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
            // 婚姻状态
            if (!Strings.isBlank(houseHoldExcel.getMaritalStatus())) {
                householdEntity.setMaritalStatus(Integer.parseInt(houseHoldExcel.getMaritalStatus()));
            }
            if (list.size()==0){
                // 新增
                this.save(householdEntity);
                importNum++;
                // 处理标签
                handleLabel(householdEntity,houseHoldExcel);
            }else {
                updateNum++;
                if (isCovered){
                    for (HouseholdEntity one : list) {
                        // 覆盖更新
                        householdEntity.setId(one.getId());
                        // 更新
                        updateById(householdEntity);
                        // 处理标签
                        handleLabel(householdEntity,houseHoldExcel);
                    }
                    importNum++;
        // 创建一个固定大小的线程池
        int numberOfThreads = Runtime.getRuntime().availableProcessors(); // 使用可用处理器数量作为线程数
        ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
        // 创建Future列表来保存每个任务的结果
        List<Future<String>> futures = new ArrayList<>();
        for (ImportHouseholdExcel houseHoldExcel : data) {
            Callable<String> task = () -> importHouseHold(houseHoldExcel,houseService,isCovered,isTenant);
            futures.add(executorService.submit(task));
        }
        // 收集并打印结果
        for (Future<String> future : futures) {
            try {
                String result = future.get();
                switch (result){
                    case "1":
                        importNum++;
                        break;
                    case "2":
                        updateNum++;
                        break;
                    case "3":
                        errorNum++;
                        break;
                }
                // 获取并打印每个任务的结果
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        }
        // 关闭线程池
        executorService.shutdown();
        try {
            if (!executorService.awaitTermination(60, TimeUnit.SECONDS)) {
                executorService.shutdownNow();
            }
        } catch (InterruptedException e) {
            executorService.shutdownNow();
        }
        StringBuilder builder = new StringBuilder("导入完成!");
        builder.append("其中本次表格共有 ").append(totalNum).append(" 条数据,")
            .append("成功导入 ").append(importNum).append(" 条数据。");
        if (updateNum>0) {
        if (updateNum > 0) {
            builder.append("其中有 ").append(updateNum).append(" 条数据已存在。");
        }
        if (errorNum>0){
        if (errorNum > 0) {
            builder.append("共有 ").append(errorNum).append(" 条数据由于无姓名或门牌地址编码信息未导入!");
        }
        return builder.toString();
    }
    public String importHouseHold(ImportHouseholdExcel houseHoldExcel, IHouseService houseService, Boolean isCovered,String isTenant) {
        HouseholdEntity householdEntity = Objects.requireNonNull(BeanUtil.copy(houseHoldExcel, HouseholdEntity.class));
        // 判断姓名,手机号
        if (Strings.isBlank(householdEntity.getName())
            || Strings.isBlank(householdEntity.getHouseCode())
        ) {
            // errorNum++;
            // continue;
            return "3";
        }
        // 查询库中是否已存在
        QueryWrapper<HouseholdEntity> wrapper = new QueryWrapper<>();
        wrapper.eq("house_code", householdEntity.getHouseCode())
            .eq("is_deleted", 0)
            .eq("name", householdEntity.getName());
        List<HouseholdEntity> list = this.list(wrapper);
        // 与角色关系
        if (!Strings.isBlank(houseHoldExcel.getRelationship())) {
            householdEntity.setRelationship(Integer.parseInt(houseHoldExcel.getRelationship()));
            // 如果是业主,则需要往用户表插入用户
            if (householdEntity.getRelationship() == 1) {
                houseService.saveOrUpdateUser(householdEntity);
            }
        }
        // 判断是否租户导入
        if (StringUtils.isNotBlank(isTenant)) {
            householdEntity.setRelationship(18);
            HouseRentalEntity houseRentalEntity = iHouseRentalService.getOne(Wrappers.<HouseRentalEntity>lambdaQuery()
                .eq(HouseRentalEntity::getHouseCode, householdEntity.getHouseCode()));
            if (houseRentalEntity != null) {
                householdEntity.setHousingRentalId(houseRentalEntity.getId());
            } else {
                // 新建出租屋
                HouseRentalEntity rentalEntity = new HouseRentalEntity();
                rentalEntity.setHouseCode(householdEntity.getHouseCode());
                rentalEntity.setHouseStatus(1);
                rentalEntity.setAuditStatus(0);
                rentalEntity.setRentalUse(4);
                rentalEntity.setTenantRelationship(1);
                rentalEntity.setRentalTime(new Date());
                rentalEntity.setDueTime(new Date());
                rentalEntity.setTerminationTime(new Date());
                iHouseRentalService.save(rentalEntity);
                householdEntity.setHousingRentalId(rentalEntity.getId());
            }
        }
        /// 是否主要联系人
        if (!Strings.isBlank(houseHoldExcel.getIsPrimaryContact())) {
            householdEntity.setIsPrimaryContact(Integer.parseInt(houseHoldExcel.getIsPrimaryContact()));
        }
        // 居住状态
        if (!Strings.isBlank(houseHoldExcel.getResidentialStatus())) {
            householdEntity.setResidentialStatus(Integer.parseInt(houseHoldExcel.getResidentialStatus()));
        }
        // 性别
        if (!Strings.isBlank(houseHoldExcel.getGender())) {
            householdEntity.setGender(Short.parseShort(houseHoldExcel.getGender()));
        }
        // 居民身份证
        if (!Strings.isBlank(houseHoldExcel.getIdCard())) {
            if (IdcardUtil.isValidCard(houseHoldExcel.getIdCard())) {
                // 身份证类型为居民身份证
                householdEntity.setCardType(111);
            }
        }
        // 党员
        if (!Strings.isBlank(houseHoldExcel.getPartyEmber())) {
            householdEntity.setPartyEmber(Integer.parseInt(houseHoldExcel.getPartyEmber()));
        }
        // 民族
        if (!Strings.isBlank(houseHoldExcel.getEthnicity())) {
            householdEntity.setEthnicity(Integer.parseInt(houseHoldExcel.getEthnicity()));
        }
        // 学历
        if (!Strings.isBlank(houseHoldExcel.getEducation())) {
            householdEntity.setEducation(Integer.parseInt(houseHoldExcel.getEducation()));
        }
        // 健康状况
        if (!Strings.isBlank(houseHoldExcel.getHealthStatus())) {
            householdEntity.setHealthStatus(Integer.parseInt(houseHoldExcel.getHealthStatus()));
        }
        // 工作状态
        if (!Strings.isBlank(houseHoldExcel.getWorkStatus())) {
            householdEntity.setWorkStatus(Integer.parseInt(houseHoldExcel.getWorkStatus()));
        }
        // 外出时间
        if (!Strings.isBlank(houseHoldExcel.getGoOutTime())) {
            try {
                Date date = new SimpleDateFormat("yyyy-MM-dd").parse(houseHoldExcel.getGoOutTime());
                householdEntity.setGoOutTime(date);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        // 婚姻状态
        if (!Strings.isBlank(houseHoldExcel.getMaritalStatus())) {
            householdEntity.setMaritalStatus(Integer.parseInt(houseHoldExcel.getMaritalStatus()));
        }
        if (list.size() == 0) {
            // 新增
            this.save(householdEntity);
            // importNum++;
            // 处理标签
            handleLabel(householdEntity, houseHoldExcel);
            return "1";
        } else {
            // updateNum++;
            if (isCovered) {
                for (HouseholdEntity one : list) {
                    // 覆盖更新
                    householdEntity.setId(one.getId());
                    // 更新
                    updateById(householdEntity);
                    // 处理标签
                    handleLabel(householdEntity, houseHoldExcel);
                }
                // importNum++;
                return "2";
            }
        }
        return "3";
    }
    /**
     * 标签处理
     *
     * @param householdEntity
     * @param houseHoldExcel
     */
    public void handleLabel(HouseholdEntity householdEntity, ImportHouseholdExcel houseHoldExcel) {
        if (!Strings.isBlank(houseHoldExcel.getLabelName())){
        if (!Strings.isBlank(houseHoldExcel.getLabelName())) {
            // 查询对应的label集合信息
            List<UserHouseLabelEntity> userHouseLabelList = userHouseLabelService.getLabelList(houseHoldExcel.getLabelName());
            if (userHouseLabelList.size()>0){