101captain
2022-03-14 85cf42314fc04a637f1a44e78c1e476a445bf0f3
springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComFmsTeamMemberServiceImpl.java
New file
@@ -0,0 +1,378 @@
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<ComFmsTeamMemberDAO, ComFmsTeamMember>
    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<Long> teamIds = addTeamMemberDTO.getTeamIds();
        List<ComFmsTeam> 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<ComFmsTeamMemberRelation> teamMemberRelations = new ArrayList<>();
            List<List<Long>> 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<Long> teamIds = editTeamMemberDTO.getTeamIds();
        List<ComFmsTeam> 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<ComFmsTeamMember>()
                    .eq(ComFmsTeamMember::getCommunityId, editTeamMemberDTO.getCommunityId())
                    .eq(ComFmsTeamMember::getPhone, editTeamMemberDTO.getPhone()));
        }
        if (isNotBlank(idCard) && !idCard.equals(comFmsTeamMember.getIdCard())) {
            countMember = this.baseMapper.selectCount(new LambdaQueryWrapper<ComFmsTeamMember>()
                    .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<ComFmsTeamMemberRelation>()
                .eq(ComFmsTeamMemberRelation::getMemberId, editTeamMemberDTO.getId()));
        List<ComFmsTeamMemberRelation> teamMemberRelations = new ArrayList<>();
        List<List<Long>> 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<ComFmsTeamMemberRelation>()
                .eq(ComFmsTeamMemberRelation::getMemberId, deleteTeamMemberDTO.getId()));
        int num = comFmsTeamMemberRelationDAO.delete(new LambdaQueryWrapper<ComFmsTeamMemberRelation>()
                .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<List> lists = JSONArray.parseArray(cascadeIds, List.class);
                List<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<ComFmsTeamMemberVO> memberVOIPage = this.baseMapper.pageFmsTeamMember(page, pageTeamMemberDTO);
        List<ComFmsTeamMemberVO> 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<ComFmsTeamMemberImportExcelVO> voList, Long communityId, Long userId) {
        List<ComFmsTeamType> comFmsTeamTypes = comFmsTeamTypeDAO.selectList(new LambdaQueryWrapper<ComFmsTeamType>().eq(ComFmsTeamType::getCommunityId, communityId));
        List<ComFmsTeam> comFmsTeams = comFmsTeamDAO.selectList(new LambdaQueryWrapper<ComFmsTeam>().eq(ComFmsTeam::getCommunityId, communityId));
        List<ComFmsTeamMemberRelation> teamMemberRelations = new ArrayList<>();
        List<ComFmsTeamMemberImportMistakeExcelVO> 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<ComFmsTeamMemberExportExcelVO> 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<ComFmsTeamMemberVO> memberList = this.baseMapper.selectListByCommunityId(communityId);
        List<CascadeCommVO> cascade = null;
        if (!memberList.isEmpty()) {
            Map<Long, List<CascadeCommVO>> 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<ComFmsTeam> teamList = comFmsTeamDAO.selectBatchIds(allMemberGroup.keySet());
            if (!teamList.isEmpty()) {
                Map<Long, List<CascadeCommVO>> 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<ComFmsTeamType> 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);
    }
}