package com.panzhihua.service_community.service.impl; import static java.util.Objects.isNull; import static java.util.Objects.nonNull; import static org.apache.commons.lang3.StringUtils.isNotBlank; import static org.apache.commons.lang3.StringUtils.isNotEmpty; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import javax.annotation.Resource; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.panzhihua.common.model.dtos.community.fms.AddTeamMemberDTO; import com.panzhihua.common.model.dtos.community.fms.DeleteTeamMemberDTO; import com.panzhihua.common.model.dtos.community.fms.EditTeamMemberDTO; import com.panzhihua.common.model.dtos.community.fms.PageTeamMemberDTO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.community.fms.CascadeCommVO; import com.panzhihua.common.model.vos.community.fms.ComFmsTeamMemberExportExcelVO; import com.panzhihua.common.model.vos.community.fms.ComFmsTeamMemberImportExcelVO; import com.panzhihua.common.model.vos.community.fms.ComFmsTeamMemberImportMistakeExcelVO; import com.panzhihua.common.model.vos.community.fms.ComFmsTeamMemberVO; import com.panzhihua.common.service.user.UserService; import com.panzhihua.service_community.dao.ComFmsTeamDAO; import com.panzhihua.service_community.dao.ComFmsTeamMemberDAO; import com.panzhihua.service_community.dao.ComFmsTeamMemberRelationDAO; import com.panzhihua.service_community.dao.ComFmsTeamTypeDAO; import com.panzhihua.service_community.entity.ComFmsTeam; import com.panzhihua.service_community.entity.ComFmsTeamMember; import com.panzhihua.service_community.entity.ComFmsTeamMemberRelation; import com.panzhihua.service_community.entity.ComFmsTeamType; import com.panzhihua.service_community.service.ComFmsTeamMemberService; import cn.hutool.core.util.IdcardUtil; /** * 五微服务-团队成员(ComFmsTeamMember)表服务实现类 * * @author makejava * @since 2022-02-11 13:35:56 */ @Service("comFmsTeamMemberService") public class ComFmsTeamMemberServiceImpl extends ServiceImpl implements ComFmsTeamMemberService { @Resource private ComFmsTeamDAO comFmsTeamDAO; @Resource private ComFmsTeamMemberRelationDAO comFmsTeamMemberRelationDAO; @Resource private ComFmsTeamTypeDAO comFmsTeamTypeDAO; @Resource private UserService userService; /** * 新增团队成员 * @param addTeamMemberDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R addFmsTeamMember(AddTeamMemberDTO addTeamMemberDTO) { String idCard = addTeamMemberDTO.getIdCard(); if (isNotBlank(idCard) && !IdcardUtil.isValidCard(idCard)) { return R.fail("身份证号码有误"); } List teamIds = addTeamMemberDTO.getTeamIds(); List comFmsTeam = comFmsTeamDAO.selectBatchIds(teamIds); if (comFmsTeam.size() != teamIds.size() || comFmsTeam.stream().anyMatch(e -> !e.getCommunityId().equals(addTeamMemberDTO.getCommunityId()))) { return R.fail("团队id有误"); } Integer countMember = this.baseMapper.countMember(addTeamMemberDTO.getCommunityId(), addTeamMemberDTO.getIdCard(), addTeamMemberDTO.getPhone()); if (countMember > 0) { return R.fail("团队成员已存在,如需添加团队关系,请编辑该成员"); } ComFmsTeamMember comFmsTeamMember = new ComFmsTeamMember(); BeanUtils.copyProperties(addTeamMemberDTO, comFmsTeamMember); if (isNotBlank(idCard)) { comFmsTeamMember.setGender(IdcardUtil.getGenderByIdCard(idCard) == 1 ? 1 : 2); } this.baseMapper.insert(comFmsTeamMember); Long memberId = comFmsTeamMember.getId(); if (nonNull(memberId)) { List teamMemberRelations = new ArrayList<>(); List> cascadeIds = new ArrayList<>(); teamIds.forEach(e -> { Long teamType = comFmsTeam.stream().filter(team -> team.getId().equals(e)).collect(Collectors.toList()).get(0).getTeamType(); ComFmsTeamMemberRelation teamMemberRelation = new ComFmsTeamMemberRelation(); teamMemberRelation.setTeamId(e); teamMemberRelation.setMemberId(memberId); teamMemberRelations.add(teamMemberRelation); cascadeIds.add(Arrays.asList(teamType, e)); }); int num = comFmsTeamMemberRelationDAO.insertBatch(teamMemberRelations); if (num > 0) { comFmsTeamMember.setCascadeIds(cascadeIds.toString()); this.baseMapper.updateById(comFmsTeamMember); return R.ok(); } } return R.fail("新增失败,请重新尝试"); } /** * 编辑团队成员 * @param editTeamMemberDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R editFmsTeamMember(EditTeamMemberDTO editTeamMemberDTO) { String idCard = editTeamMemberDTO.getIdCard(); if (isNotBlank(idCard) && !IdcardUtil.isValidCard(idCard)) { return R.fail("身份证号码有误"); } List teamIds = editTeamMemberDTO.getTeamIds(); List comFmsTeam = comFmsTeamDAO.selectBatchIds(teamIds); if (comFmsTeam.size() != teamIds.size() || comFmsTeam.stream().anyMatch(e -> !e.getCommunityId().equals(editTeamMemberDTO.getCommunityId()))) { return R.fail("团队id有误"); } ComFmsTeamMember comFmsTeamMember = this.baseMapper.selectById(editTeamMemberDTO.getId()); if (isNull(comFmsTeamMember)) { return R.fail("团队成员不存在"); } Integer countMember = 0; if (!comFmsTeamMember.getPhone().equals(editTeamMemberDTO.getPhone())) { countMember = this.baseMapper.selectCount(new LambdaQueryWrapper() .eq(ComFmsTeamMember::getCommunityId, editTeamMemberDTO.getCommunityId()) .eq(ComFmsTeamMember::getPhone, editTeamMemberDTO.getPhone())); } if (isNotBlank(idCard) && !idCard.equals(comFmsTeamMember.getIdCard())) { countMember = this.baseMapper.selectCount(new LambdaQueryWrapper() .eq(ComFmsTeamMember::getCommunityId, editTeamMemberDTO.getCommunityId()) .eq(ComFmsTeamMember::getIdCard, editTeamMemberDTO.getIdCard())); } if (countMember > 0) { return R.fail("该手机号或身份证号已存在团队成员"); } BeanUtils.copyProperties(editTeamMemberDTO, comFmsTeamMember); if (isNotBlank(idCard)) { comFmsTeamMember.setGender(IdcardUtil.getGenderByIdCard(idCard) == 1 ? 1 : 2); } comFmsTeamMemberRelationDAO.delete(new LambdaQueryWrapper() .eq(ComFmsTeamMemberRelation::getMemberId, editTeamMemberDTO.getId())); List teamMemberRelations = new ArrayList<>(); List> cascadeIds = new ArrayList<>(); teamIds.forEach(e -> { Long teamType = comFmsTeam.stream().filter(team -> team.getId().equals(e)).collect(Collectors.toList()).get(0).getTeamType(); ComFmsTeamMemberRelation teamMemberRelation = new ComFmsTeamMemberRelation(); teamMemberRelation.setTeamId(e); teamMemberRelation.setMemberId(editTeamMemberDTO.getId()); teamMemberRelations.add(teamMemberRelation); cascadeIds.add(Arrays.asList(teamType, e)); }); comFmsTeamMemberRelationDAO.insertBatch(teamMemberRelations); comFmsTeamMember.setCascadeIds(cascadeIds.toString()); int num = this.baseMapper.updateById(comFmsTeamMember); if (num > 0) { return R.ok(); } return R.fail("编辑失败,请重新尝试"); } /** * 删除团队成员 * @param deleteTeamMemberDTO * @return */ @Override @Transactional(rollbackFor = Exception.class) public R deleteFmsTeamMember(DeleteTeamMemberDTO deleteTeamMemberDTO) { ComFmsTeamMember comFmsTeamMember = this.baseMapper.selectById(deleteTeamMemberDTO.getId()); if (isNull(comFmsTeamMember)) { return R.fail("资源不存在"); } if (!comFmsTeamMember.getCommunityId().equals(deleteTeamMemberDTO.getCommunityId())) { return R.fail("非本社区工作人员"); } Integer count = comFmsTeamMemberRelationDAO.selectCount(new LambdaQueryWrapper() .eq(ComFmsTeamMemberRelation::getMemberId, deleteTeamMemberDTO.getId())); int num = comFmsTeamMemberRelationDAO.delete(new LambdaQueryWrapper() .eq(ComFmsTeamMemberRelation::getMemberId, deleteTeamMemberDTO.getId()).eq(ComFmsTeamMemberRelation::getTeamId, deleteTeamMemberDTO.getTeamId())); if (num > 0) { if (count == 1) { //只存在一个团队中直接删除 this.baseMapper.deleteById(deleteTeamMemberDTO.getId()); // 删除用户信息缓存 userService.deleteUserCashByPhone(comFmsTeamMember.getPhone()); } else { //存在多个团队中,删除与该团队关联 ComFmsTeam fmsTeam = comFmsTeamDAO.selectById(deleteTeamMemberDTO.getTeamId()); String cascadeIds = comFmsTeamMember.getCascadeIds(); List lists = JSONArray.parseArray(cascadeIds, List.class); List collect = lists.stream().filter(e -> !e.toString().equals(Arrays.asList(fmsTeam.getTeamType(), fmsTeam.getId()).toString())).collect(Collectors.toList()); comFmsTeamMember.setCascadeIds(collect.toString()); this.baseMapper.updateById(comFmsTeamMember); } return R.ok(); } return R.fail("删除失败,请重新尝试"); } /** * 分页查询团队成员 * @param pageTeamMemberDTO * @return */ @Override public R pageFmsTeamMember(PageTeamMemberDTO pageTeamMemberDTO) { Page page = new Page<>(); page.setSize(pageTeamMemberDTO.getPageSize()); page.setCurrent(pageTeamMemberDTO.getPageNum()); IPage memberVOIPage = this.baseMapper.pageFmsTeamMember(page, pageTeamMemberDTO); List records = memberVOIPage.getRecords(); if (!records.isEmpty()) { records.forEach(e -> { String idCard = e.getIdCard(); if (isNotEmpty(idCard)) { e.setAge(IdcardUtil.getAgeByIdCard(idCard)); } }); } return R.ok(memberVOIPage); } /** * 微团队顶部统计 * @param communityId * @return */ @Override public R statisticsFmsTeamMember(Long communityId) { return R.ok(this.baseMapper.statisticsFmsTeamMember(communityId)); } /** * 批量导入团队成员 * @param voList * @param communityId * @param userId * @return */ @Override @Transactional(rollbackFor = Exception.class) public R listSaveFmsTeamMemberExcelVO(List voList, Long communityId, Long userId) { List comFmsTeamTypes = comFmsTeamTypeDAO.selectList(new LambdaQueryWrapper().eq(ComFmsTeamType::getCommunityId, communityId)); List comFmsTeams = comFmsTeamDAO.selectList(new LambdaQueryWrapper().eq(ComFmsTeam::getCommunityId, communityId)); List teamMemberRelations = new ArrayList<>(); List mistakes = Lists.newArrayList(); for (ComFmsTeamMemberImportExcelVO e : voList) { String teamType = e.getTeamType(); String teamName = e.getTeamName(); ComFmsTeamType fmsTeamType = comFmsTeamTypes.stream().filter(type -> type.getName().equals(teamType)).findFirst().orElse(null); if (isNull(fmsTeamType)) { ComFmsTeamMemberImportMistakeExcelVO mistake = new ComFmsTeamMemberImportMistakeExcelVO(); BeanUtils.copyProperties(e, mistake); mistake.setMistake("团队类型有误,请填写正确的团队类型"); mistakes.add(mistake); continue; } ComFmsTeam fmsTeam = comFmsTeams.stream().filter(team -> team.getName().equals(teamName)).findFirst().orElse(null); if (isNull(fmsTeam)) { ComFmsTeamMemberImportMistakeExcelVO mistake = new ComFmsTeamMemberImportMistakeExcelVO(); BeanUtils.copyProperties(e, mistake); mistake.setMistake("团队名称有误,请填写正确的团队名称"); mistakes.add(mistake); continue; } String idCard = e.getIdCard(); Integer countMember = this.baseMapper.countMember(communityId, idCard, e.getPhone()); if (countMember > 0) { ComFmsTeamMemberImportMistakeExcelVO mistake = new ComFmsTeamMemberImportMistakeExcelVO(); BeanUtils.copyProperties(e, mistake); mistake.setMistake("团队成员已存在,如需添加团队关系,请编辑该成员"); mistakes.add(mistake); continue; } ComFmsTeamMember comFmsTeamMember = new ComFmsTeamMember(); comFmsTeamMember.setName(e.getTeamMember()); comFmsTeamMember.setPhone(e.getPhone()); comFmsTeamMember.setIdCard(idCard); if (isNotBlank(idCard)) { comFmsTeamMember.setGender(IdcardUtil.getGenderByIdCard(idCard) == 1 ? 1 : 2); } comFmsTeamMember.setCascadeIds(Arrays.asList(fmsTeamType.getId(), fmsTeam.getId()).toString()); comFmsTeamMember.setCommunityId(communityId); comFmsTeamMember.setCreatedBy(userId); comFmsTeamMember.setUpdatedBy(userId); int num = this.baseMapper.insert(comFmsTeamMember); if (num > 0) { ComFmsTeamMemberRelation teamMemberRelation = new ComFmsTeamMemberRelation(); teamMemberRelation.setMemberId(comFmsTeamMember.getId()); teamMemberRelation.setTeamId(fmsTeam.getId()); teamMemberRelations.add(teamMemberRelation); } } if (!teamMemberRelations.isEmpty()) { comFmsTeamMemberRelationDAO.insertBatch(teamMemberRelations); } return R.ok(mistakes); } /** * 团队人员导出 * @param pageTeamMemberDTO * @return */ @Override public R exportTeamMember(PageTeamMemberDTO pageTeamMemberDTO) { List memberExportExcelVOList = this.baseMapper.exportTeamMember(pageTeamMemberDTO); if (!memberExportExcelVOList.isEmpty()) { memberExportExcelVOList.forEach(e -> { if (isNotBlank(e.getIdCard())) { e.setAge(IdcardUtil.getAgeByIdCard(e.getIdCard()) + ""); } else { e.setAge("未知"); } }); } return R.ok(memberExportExcelVOList); } /** * 级联查询团队服务人员 * @param communityId * @return */ @Override public R retrieveFmsTeamMemberCascade(Long communityId) { List memberList = this.baseMapper.selectListByCommunityId(communityId); List cascade = null; if (!memberList.isEmpty()) { Map> allMemberGroup = memberList.stream().map(e -> { CascadeCommVO cascadeCommVO = new CascadeCommVO(); cascadeCommVO.setValue(e.getId()); cascadeCommVO.setParentId(e.getTeamId()); cascadeCommVO.setLabel(e.getName()); return cascadeCommVO; }).collect(Collectors.groupingBy(CascadeCommVO::getParentId)); List teamList = comFmsTeamDAO.selectBatchIds(allMemberGroup.keySet()); if (!teamList.isEmpty()) { Map> allTeamGroup = teamList.stream().map(e -> { CascadeCommVO cascadeCommVO = new CascadeCommVO(); cascadeCommVO.setValue(e.getId()); cascadeCommVO.setParentId(e.getTeamType()); cascadeCommVO.setLabel(e.getName()); return cascadeCommVO; }).collect(Collectors.groupingBy(CascadeCommVO::getParentId)); List teamTypeList = comFmsTeamTypeDAO.selectBatchIds(allTeamGroup.keySet()); if (!teamTypeList.isEmpty()) { cascade = teamTypeList.stream().map(e -> { CascadeCommVO cascadeCommVO = new CascadeCommVO(); cascadeCommVO.setValue(e.getId()); cascadeCommVO.setLabel(e.getName()); return cascadeCommVO; }).collect(Collectors.toList()); cascade.forEach(e1 -> e1.setChildren(allTeamGroup.get(e1.getValue()))); cascade.forEach(e1 -> e1.getChildren().forEach(e2 -> e2.setChildren(allMemberGroup.get(e2.getValue())))); } } } return R.ok(cascade); } }