package com.panzhihua.service_community.service.impl; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import javax.annotation.Resource; import com.panzhihua.common.model.dtos.community.ComMngPopulationHouseInsertAdminDTO; import com.panzhihua.common.utlis.StringUtils; import com.panzhihua.service_community.service.ComMngPopulationHouseUserService; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.panzhihua.common.model.dtos.community.CascadeHouseDTO; import com.panzhihua.common.model.dtos.community.ComMngPopulationHouseAdminDTO; import com.panzhihua.common.model.dtos.community.ComMngPopulationHouseEditAdminDTO; import com.panzhihua.common.model.dtos.grid.PageComMngVillageBuildHouseAppDTO; import com.panzhihua.common.model.dtos.grid.admin.ComMngPopulationRelationHouseDTO; import com.panzhihua.common.model.dtos.grid.admin.ComMngPopulationSubordinateDTO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.ComMngCascadeHouseVO; import com.panzhihua.common.model.vos.community.ComMngPopulationHouseDetailAdminVO; import com.panzhihua.common.model.vos.community.ComMngPopulationHouseTotalVO; import com.panzhihua.common.model.vos.community.ComMngPopulationHouseUserAdminVO; import com.panzhihua.common.model.vos.grid.ComMngVillageBuildingHouseDetailVO; import com.panzhihua.common.model.vos.grid.ComMngVillageBuildingHouseVO; import com.panzhihua.common.model.vos.grid.PopulationListVO; import com.panzhihua.common.model.vos.grid.admin.ComMngSubordinateVO; import com.panzhihua.common.utlis.Snowflake; import com.panzhihua.service_community.dao.ComActVillageDAO; import com.panzhihua.service_community.dao.ComMngPopulationDAO; import com.panzhihua.service_community.dao.ComMngPopulationHouseDAO; import com.panzhihua.service_community.dao.ComMngPopulationHouseUserDAO; import com.panzhihua.service_community.model.dos.ComMngPopulationDO; import com.panzhihua.service_community.model.dos.ComMngPopulationHouseDO; import com.panzhihua.service_community.model.dos.ComMngPopulationHouseUserDO; import com.panzhihua.service_community.model.dos.ComMngVillageDO; import com.panzhihua.service_community.service.ComMngPopulationHouseService; import cn.hutool.core.util.IdcardUtil; import lombok.extern.slf4j.Slf4j; /** * @auther lyq * @create 2021-05-18 09:26:31 * @describe 社区管理》小区管理》实有房屋服务实现类 */ @Slf4j @Service public class ComMngPopulationHouseServiceImpl extends ServiceImpl implements ComMngPopulationHouseService { @Resource private ComMngPopulationHouseUserDAO comMngPopulationHouseUserDAO; @Resource private ComMngPopulationDAO comMngPopulationDAO; @Resource private ComActVillageDAO comActVillageDAO; @Resource private ComMngPopulationHouseDAO comMngPopulationHouseDAO; @Resource private ComMngPopulationHouseService comMngPopulationHouseService; @Resource private ComMngPopulationHouseUserService comMngPopulationHouseUserService; private static Predicate distinctByKey(Function keyExtractor) { Map seen = new ConcurrentHashMap<>(); return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; } /** * 查询房屋级联菜单 * * @param cascadeHouseDTO * 请求参数 * @return 菜单列表 */ @Override public R getCascadeHouseAddress(CascadeHouseDTO cascadeHouseDTO) { List cascadeHouseVOList = new ArrayList<>(); ComMngPopulationHouseDO houseDO = null; if (cascadeHouseDTO.getHouseId() != null) { houseDO = this.baseMapper.selectById(cascadeHouseDTO.getHouseId()); } switch (cascadeHouseDTO.getLevel()) { case 1: cascadeHouseVOList = this.baseMapper.getHouseLevelByAlley(cascadeHouseDTO.getCommunityId(), cascadeHouseDTO.getVillageId()); cascadeHouseVOList = cascadeHouseVOList.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>( Comparator.comparing(ComMngCascadeHouseVO::getAlley))),ArrayList::new)); cascadeHouseVOList.forEach(cascade -> { cascade.setName(cascade.getAlley()); }); break; case 2: if (houseDO != null) { ComMngVillageDO villageDO = comActVillageDAO.selectById(houseDO.getVillageId()); cascadeHouseVOList = this.baseMapper.getHouseLevelByHouseNum(villageDO.getAlley(), cascadeHouseDTO.getCommunityId(), cascadeHouseDTO.getVillageId()); cascadeHouseVOList = cascadeHouseVOList.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing(o -> o.getAlley() + ";" + o.getHouseNum()))), ArrayList::new)); cascadeHouseVOList.forEach(cascade -> { cascade.setName(cascade.getHouseNum()+"("+cascade.getName()+")"); }); } break; case 3: if (houseDO != null) { ComMngVillageDO villageDO = comActVillageDAO.selectById(houseDO.getVillageId()); cascadeHouseVOList = this.baseMapper.getHouseLevelByFloor(villageDO.getAlley(), villageDO.getHouseNum(), cascadeHouseDTO.getCommunityId(), cascadeHouseDTO.getVillageId()); cascadeHouseVOList = cascadeHouseVOList.stream() .collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>( Comparator.comparing(o -> o.getAlley() + ";" + o.getHouseNum() + ";" + o.getFloor()))), ArrayList::new)); cascadeHouseVOList.forEach(cascade -> { cascade.setName(cascade.getFloor()); }); } break; case 4: if (houseDO != null) { cascadeHouseVOList = this.baseMapper.getHouseLevelByUnitNo(houseDO.getAlley(), houseDO.getHouseNum(), houseDO.getFloor(), cascadeHouseDTO.getCommunityId(), cascadeHouseDTO.getVillageId()); cascadeHouseVOList = cascadeHouseVOList.stream() .collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing( o -> o.getAlley() + ";" + o.getHouseNum() + ";" + o.getFloor() + ";" + o.getUnitNo()))), ArrayList::new)); cascadeHouseVOList.forEach(cascade -> { cascade.setName(cascade.getUnitNo()); }); } break; case 5: if (houseDO != null) { cascadeHouseVOList = this.baseMapper.getHouseLevelByHouseNo(houseDO.getAlley(), houseDO.getHouseNum(), houseDO.getFloor(), houseDO.getUnitNo(), cascadeHouseDTO.getCommunityId(), cascadeHouseDTO.getVillageId()); cascadeHouseVOList = cascadeHouseVOList.stream() .collect(Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getAlley() + ";" + o.getHouseNum() + ";" + o.getFloor() + ";" + o.getUnitNo() + ";" + o.getHouseNo()))), ArrayList::new)); cascadeHouseVOList.forEach(cascade -> { cascade.setName(cascade.getHouseNo()); }); } break; default: break; } return R.ok(cascadeHouseVOList); } @Override public R getSecondHouseAddress(CascadeHouseDTO cascadeHouseDTO) { return R.ok(this.comMngPopulationDAO.getSecondHouseAddress(cascadeHouseDTO.getCommunityId())); } @Override public R getSecondHouse(CascadeHouseDTO cascadeHouseDTO) { return R.ok(this.comMngPopulationDAO.getSecondHouse(cascadeHouseDTO.getCommunityId())); } /** * 分页查询房屋列表 * * @param populationHouseAdminDTO * 请求参数 * @return 房屋列表 */ @Override public R getPageHouse(ComMngPopulationHouseAdminDTO populationHouseAdminDTO) { if (populationHouseAdminDTO.getHouseId() != null) { ComMngPopulationHouseDO houseDO = this.baseMapper.selectById(populationHouseAdminDTO.getHouseId()); if (houseDO != null) { switch (populationHouseAdminDTO.getLevel()) { case 1: populationHouseAdminDTO.setRoad(houseDO.getAlley()); break; case 2: populationHouseAdminDTO.setRoad(houseDO.getAlley()); // populationHouseAdminDTO.setDoorNo(houseDO.getHouseNum()); break; case 3: populationHouseAdminDTO.setRoad(houseDO.getAlley()); populationHouseAdminDTO.setDoorNo(houseDO.getHouseNum()); // populationHouseAdminDTO.setFloor(houseDO.getFloor()); break; case 4: populationHouseAdminDTO.setRoad(houseDO.getAlley()); populationHouseAdminDTO.setDoorNo(houseDO.getHouseNum()); populationHouseAdminDTO.setFloor(houseDO.getFloor()); // populationHouseAdminDTO.setUnitNo(houseDO.getUnitNo()); break; case 5: populationHouseAdminDTO.setRoad(houseDO.getAlley()); populationHouseAdminDTO.setDoorNo(houseDO.getHouseNum()); populationHouseAdminDTO.setFloor(houseDO.getFloor()); populationHouseAdminDTO.setUnitNo(houseDO.getUnitNo()); if(populationHouseAdminDTO.getLevelIsAll() == null){ populationHouseAdminDTO.setHouseNo(houseDO.getHouseNo()); } break; default: break; } } } return R.ok(this.baseMapper.getPageHouse( new Page(populationHouseAdminDTO.getPageNum(), populationHouseAdminDTO.getPageSize()), populationHouseAdminDTO)); } /** * 根据id查询实有房屋信息 * * @param houseId * 房屋id * @return 房屋信息 */ @Override public R getHouseDetail(Long houseId) { ComMngPopulationHouseDetailAdminVO houseDetailAdminVO = this.baseMapper.getHouseDetail(houseId); if (houseDetailAdminVO != null) { // 查询房屋下住户信息 List houseUserList = comMngPopulationHouseUserDAO.getHouseUserByHouseId(houseDetailAdminVO.getId()); if (!houseUserList.isEmpty()) { houseDetailAdminVO.setHouseUserList(houseUserList); } } return R.ok(houseDetailAdminVO); } /** * 编辑实有房屋信息 * * @param houseEditAdminDTO * 请求参数 * @return 编辑结果 */ @Override public R editHouse(ComMngPopulationHouseEditAdminDTO houseEditAdminDTO) { // 查询实有房屋信息 ComMngPopulationHouseDO houseDO = this.baseMapper.selectById(houseEditAdminDTO.getHouseId()); if (houseDO == null) { return R.fail("参数错误"); } BeanUtils.copyProperties(houseEditAdminDTO, houseDO); houseDO.setUpdateAt(new Date()); if (this.baseMapper.updateById(houseDO) > 0) { return R.ok(); } else { return R.fail(); } } /** * 根据房屋id列表删除房屋信息 * * @param Ids * 请求参数 * @return 删除结果 */ @Override @Transactional(rollbackFor = Exception.class) public R deleteHouses(List Ids) { LambdaQueryWrapper paramWrapper = Wrappers.lambdaQuery(); paramWrapper.in(ComMngPopulationHouseUserDO::getHouseId, Ids); List mngPopulationDOList = comMngPopulationHouseUserDAO.selectList(paramWrapper); if (!mngPopulationDOList.isEmpty()) { return R.fail("无法删除,已绑定实有人口!"); } if (this.baseMapper.deleteBatchIds(Ids) > 0) { return R.ok(); } else { return R.fail(); } } /** * 实有房屋统计 * * @param communityId * 社区id * @return 统计结果 */ @Override public R getHouseTotalByAdmin(Long communityId) { ComMngPopulationHouseTotalVO houseTotalVO = new ComMngPopulationHouseTotalVO(); if (communityId != null) { houseTotalVO = this.baseMapper.getHouseTotalByAdmin(communityId); } return R.ok(houseTotalVO); } /** * 根据社区id查询社区所有省市区 * * @param communityId * 社区id * @return 社区所在省市区 */ @Override public R getRegion(Long communityId) { return R.ok(this.baseMapper.getRegion(communityId)); } /** * 小区楼栋下房屋列表 * * @param buildHouseAppDTO * 请求参数 * @return 房屋列表 */ @Override public R getGridVillageBuildingHouseList(PageComMngVillageBuildHouseAppDTO buildHouseAppDTO) { IPage buildingHouseVOIPage = this.baseMapper.getGridVillageBuildingHouseList( new Page(buildHouseAppDTO.getPageNum(), buildHouseAppDTO.getPageSize()), buildHouseAppDTO); if (!buildingHouseVOIPage.getRecords().isEmpty()) { buildingHouseVOIPage.getRecords().forEach(house -> { boolean result = house.getHouseNo().matches("[0-9]+"); if (result) {// 该字段为纯数字 if (house.getHouseNo().length() == 4) { house.setBuildingNum(house.getHouseNo().substring(0, 2).replaceAll("^(0+)", "")); } else if (house.getHouseNo().length() == 3) { house.setBuildingNum(house.getHouseNo().substring(0, 1).replaceAll("^(0+)", "")); } } else { house.setBuildingNum("-"); } }); } return R.ok(buildingHouseVOIPage); } /** * 小区楼栋下房屋信息 * * @param houseId * 房屋id * @return 房屋信息 */ @Override public R getGridVillageBuildingHouseDetail(Long houseId) { ComMngVillageBuildingHouseDetailVO buildingHouseDetailVO = this.baseMapper.getGridVillageBuildingHouseDetail(houseId); if (buildingHouseDetailVO != null) { // 转换楼层数 String houseNo = buildingHouseDetailVO.getHouseNo(); boolean result = houseNo.matches("[0-9]+"); if (result) {// 该字段为纯数字 if (houseNo.length() == 4) { buildingHouseDetailVO.setBuildingNum(houseNo.substring(0, 2).replaceAll("^(0+)", "")); } else if (houseNo.length() == 3) { buildingHouseDetailVO.setBuildingNum(houseNo.substring(0, 1).replaceAll("^(0+)", "")); } } else { buildingHouseDetailVO.setBuildingNum("-"); } // 查询该房屋的户主信息 List householderList = this.baseMapper.getGridVillageBuildingPopulationList(buildingHouseDetailVO.getId(), 1, null); if (!householderList.isEmpty()) { householderList.forEach(householder -> { try { Integer age = IdcardUtil.getAgeByIdCard(householder.getCardNo()); householder.setAge(age); } catch (Exception e) { log.error("身份证号码转换年龄失败,人员id:" + householder.getId()); } }); buildingHouseDetailVO.setHouseholderList(householderList); } // 查询该房屋的住户信息 List populationList = this.baseMapper.getGridVillageBuildingPopulationList(buildingHouseDetailVO.getId(), null, null); if (!populationList.isEmpty()) { populationList.forEach(population -> { try { Integer age = IdcardUtil.getAgeByIdCard(population.getCardNo()); population.setAge(age); } catch (Exception e) { log.error("身份证号码转换年龄失败,人员id:" + population.getId()); } }); buildingHouseDetailVO.setPopulationList(populationList); } } return R.ok(buildingHouseDetailVO); } @Override public R subordinate(ComMngPopulationSubordinateDTO subordinateDTO) { List subordinateList = new ArrayList<>(); ComMngPopulationHouseDO houseDO = null; if (subordinateDTO.getHouseId() != null) { houseDO = this.baseMapper.selectById(subordinateDTO.getHouseId()); } switch (subordinateDTO.getType()) { case 1: subordinateList = this.baseMapper.getHouseLevelByFloors(subordinateDTO.getVillageId()); // subordinateList = // subordinateList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new // TreeSet<>(Comparator.comparing(o -> o.getFloor()))), ArrayList::new)); // subordinateList = subordinateList.stream().filter(distinctByKey(ComMngSubordinateVO::getFloor)) // .collect(Collectors.toList()); subordinateList.forEach(cascade -> { if (cascade.getFloor().contains("栋")) { cascade.setName(cascade.getFloor()); } else { cascade.setName(cascade.getFloor() + "栋"); } }); break; case 2: if (houseDO != null) { subordinateList = this.baseMapper.getHouseLevelByUnitNos(houseDO.getVillageId(), houseDO.getFloor()); // subordinateList = subordinateList.stream().filter(distinctByKey(ComMngSubordinateVO::getUnitNo)) // .collect(Collectors.toList()); // subordinateList = // subordinateList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new // TreeSet<>(Comparator.comparing(o -> o.getUnitNo()))), ArrayList::new)); subordinateList.forEach(cascade -> { if (cascade.getUnitNo().contains("单元")) { cascade.setName(cascade.getUnitNo()); } else { cascade.setName(cascade.getUnitNo() + "单元"); } }); } break; case 3: if (houseDO != null) { subordinateList = this.baseMapper.getHouseLevelByHouseNos(houseDO.getVillageId(), houseDO.getFloor(), houseDO.getUnitNo()); // subordinateList = subordinateList.stream().filter(distinctByKey(ComMngSubordinateVO::getHouseNo)) // .collect(Collectors.toList()); // subordinateList = // subordinateList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new // TreeSet<>(Comparator.comparing(o -> o.getHouseNo()))), ArrayList::new)); subordinateList.forEach(cascade -> { cascade.setName(cascade.getHouseNo()); }); } break; default: break; } return R.ok(subordinateList); } @Override public R populationRelationHouse(ComMngPopulationRelationHouseDTO relationHouseDTO) { if (relationHouseDTO.getPopulationId().isEmpty()) { return R.fail("请选择居民"); } // 查询房屋信息 ComMngPopulationHouseDO houseDO = comMngPopulationHouseDAO.selectById(relationHouseDTO.getHouseId()); if (houseDO == null) { return R.fail("未查到房屋信息"); } relationHouseDTO.getPopulationId().forEach(population -> { // 修改人口信息 ComMngPopulationDO populationDO = new ComMngPopulationDO(); populationDO.setId(population); populationDO.setHouseId(houseDO.getId()); populationDO.setRoad(houseDO.getAlley()); populationDO.setDoorNo(houseDO.getHouseNum()); populationDO.setFloor(houseDO.getFloor()); populationDO.setUnitNo(houseDO.getUnitNo()); populationDO.setHouseNo(houseDO.getHouseNo()); comMngPopulationDAO.updateById(populationDO); // 添加房屋关系 ComMngPopulationHouseUserDO houseUserDO = comMngPopulationHouseUserDAO.selectOne(new QueryWrapper().lambda() .eq(ComMngPopulationHouseUserDO::getPopulId, population) .eq(ComMngPopulationHouseUserDO::getHouseId, relationHouseDTO.getHouseId())); if (houseUserDO == null) { houseUserDO = new ComMngPopulationHouseUserDO(); houseUserDO.setId(Snowflake.getId()); houseUserDO.setHouseId(relationHouseDTO.getHouseId()); houseUserDO.setPopulId(population); houseUserDO.setRelationId(ComMngPopulationHouseUserDO.relationId.zizhu); comMngPopulationHouseUserDAO.insert(houseUserDO); } else { houseUserDO.setRelationId(ComMngPopulationHouseUserDO.relationId.zizhu); comMngPopulationHouseUserDAO.updateById(houseUserDO); } }); return R.ok(); } @Override @Transactional public R insertHouse(ComMngPopulationHouseInsertAdminDTO houseEditAdminDTO) { ComMngPopulationHouseDO houseDO=new ComMngPopulationHouseDO(); BeanUtils.copyProperties(houseEditAdminDTO, houseDO); houseDO.setCreateAt(new Date()); if (this.baseMapper.insert(houseDO) > 0) { ComMngPopulationHouseUserDO comMngPopulationHouseUserDO=new ComMngPopulationHouseUserDO(); comMngPopulationHouseUserDO.setHouseId(houseDO.getId()); comMngPopulationHouseUserDO.setPopulId(houseEditAdminDTO.getPopulationId()); comMngPopulationHouseUserDAO.insert(comMngPopulationHouseUserDO); return R.ok(); } else { return R.fail(); } } /** * 实有房屋数据修复定时任务 * @return 实有房屋数据修复定时任务 */ @Override @Transactional public R timedTaskHouseJobHandler(){ //需要修改的房屋信息 List updateHouseList = new ArrayList<>(); //需要修改的房屋人员关系信息 List updateHouseUserList = new ArrayList<>(); ComMngPopulationDO population = new ComMngPopulationDO(); //查询所有房屋列表信息 List houseList = comMngPopulationHouseDAO.selectList(null); //遍历房屋信息 for (ComMngPopulationHouseDO house : houseList) { List houseUserList = comMngPopulationHouseUserDAO.selectList(new QueryWrapper() .lambda().eq(ComMngPopulationHouseUserDO::getHouseId,house.getId())); if(houseUserList.isEmpty()){ house.setStatus(ComMngPopulationHouseDO.status.kongzhi); }else{ house.setStatus(ComMngPopulationHouseDO.status.zizhu); //查询该房屋下人员是否是租住状态 List populationIds = houseUserList.stream().map(ComMngPopulationHouseUserDO::getPopulId).collect(Collectors.toList()); Integer count = comMngPopulationHouseUserDAO.getHouseUserIsRent(populationIds); if(count > 0){ house.setStatus(ComMngPopulationHouseDO.status.zuzhu); } //查询该房屋下人员的关联信息的关系 for (ComMngPopulationHouseUserDO houseUser : houseUserList) { population = comMngPopulationDAO.selectById(houseUser.getPopulId()); if(population != null){ if(population.getIsRent() != null && population.getIsRent().equals(ComMngPopulationDO.isOk.yes)){ houseUser.setRelationId(ComMngPopulationHouseUserDO.relationId.zuhu); }else { houseUser.setRelationId(ComMngPopulationHouseUserDO.relationId.zuzhu); } updateHouseUserList.add(houseUser); } } } //查看房子的楼层排序 if(house.getFloorNum() == null && StringUtils.isNotEmpty(house.getHouseNo())){ boolean result = house.getHouseNo().matches("[0-9]+"); if (result) {// 该字段为纯数字 if (house.getHouseNo().length() == 4) { String floorNum = house.getHouseNo().substring(0, 2).replaceAll("^(0+)", ""); if(StringUtils.isNotEmpty(floorNum)){ house.setFloorNum(Integer.parseInt(floorNum)); } } else if (house.getHouseNo().length() == 3) { String floorNum = house.getHouseNo().substring(0, 1).replaceAll("^(0+)", ""); if(StringUtils.isNotEmpty(floorNum)){ house.setFloorNum(Integer.parseInt(floorNum)); } } } } updateHouseList.add(house); } if(!updateHouseList.isEmpty()){ comMngPopulationHouseService.updateBatchById(updateHouseList); } if(!updateHouseUserList.isEmpty()){ comMngPopulationHouseUserService.updateBatchById(updateHouseUserList); } return R.ok(); } }