package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.Constants; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.core.utils.qiyeweixin.QywxUtil; import com.doumee.core.utils.qiyeweixin.model.response.*; import com.doumee.dao.business.CompanyMapper; import com.doumee.dao.business.CompanyMemberMapper; import com.doumee.dao.business.ManagersMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.model.*; import com.doumee.dao.system.model.SystemUser; import com.doumee.dao.web.dto.LoginH5DTO; import com.doumee.dao.web.dto.UpdEmailDTO; import com.doumee.service.business.MemberService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestHeader; import javax.annotation.Resource; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Objects; /** * 人员信息表Service实现 * @author 江蹄蹄 * @since 2025/04/02 17:49 */ @Service @Slf4j public class MemberServiceImpl implements MemberService { @Resource(name="sessionRedisTemplate") private RedisTemplate redisTemplate; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private MemberMapper memberMapper; @Autowired private CompanyMapper companyMapper; @Autowired private CompanyMemberMapper companyMemberMapper; @Autowired private ManagersMapper managersMapper; @Override public Integer create(Member member) { memberMapper.insert(member); return member.getId(); } @Override public void deleteById(Integer id) { memberMapper.deleteById(id); } @Override public void delete(Member member) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(member); memberMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } memberMapper.deleteBatchIds(ids); } @Override public void updateById(Member member) { if( member.getId() == null){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); memberMapper.update(null,new UpdateWrapper().lambda() .eq(Member::getId,member.getId() ) .set(Member::getSex,member.getSex() ) .set(Member::getPhone,member.getPhone() ) .set(Member::getRemark,member.getRemark() ) .set(Member::getEmail,member.getEmail() ) .set(Member::getEditDate,new Date()) .set(Member::getEditor,user.getId()) ); } @Override public void updateByIdInBatch(List members) { if (CollectionUtils.isEmpty(members)) { return; } for (Member member: members) { this.updateById(member); } } @Override public Member findById(Integer id) { return memberMapper.selectById(id); } @Override public Member findOne(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectOne(wrapper); } @Override public List findList(Member pageWrap) { pageWrap.setIsdeleted(Constants.ZERO); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper. selectAll(Member.class) .selectAs(SystemUser::getUsername,Member::getEditorName) .leftJoin(SystemUser.class,SystemUser::getId,Member::getEditor) .eq(pageWrap.getId() != null, Member::getId, pageWrap.getId()) .eq(pageWrap.getCreator() != null, Member::getCreator, pageWrap.getCreator()) .ge(pageWrap.getCreateDate() != null, Member::getCreateDate, Utils.Date.getStart(pageWrap.getCreateDate())) .le(pageWrap.getCreateDate() != null, Member::getCreateDate, Utils.Date.getEnd(pageWrap.getCreateDate())) .eq(pageWrap.getEditor() != null, Member::getEditor, pageWrap.getEditor()) .ge(pageWrap.getEditDate() != null, Member::getEditDate, Utils.Date.getStart(pageWrap.getEditDate())) .le(pageWrap.getEditDate() != null, Member::getEditDate, Utils.Date.getEnd(pageWrap.getEditDate())) .eq(pageWrap.getIsdeleted() != null, Member::getIsdeleted, pageWrap.getIsdeleted()) .like(pageWrap.getName() != null, Member::getName, pageWrap.getName()) .eq(pageWrap.getRemark() != null, Member::getRemark, pageWrap.getRemark()) .eq(pageWrap.getStatus() != null, Member::getStatus, pageWrap.getStatus()) .eq(pageWrap.getSortnum() != null, Member::getSortnum, pageWrap.getSortnum()) .eq(pageWrap.getImgurl() != null, Member::getImgurl, pageWrap.getImgurl()) .eq(pageWrap.getType() != null, Member::getType, pageWrap.getType()) .eq(pageWrap.getCompanyName() != null, Member::getCompanyName, pageWrap.getCompanyName()) .eq(pageWrap.getPhone() != null, Member::getPhone, pageWrap.getPhone()) .eq(pageWrap.getEmail() != null, Member::getEmail, pageWrap.getEmail()) .eq(pageWrap.getSex() != null, Member::getSex, pageWrap.getSex()) .eq(pageWrap.getCode() != null, Member::getCode, pageWrap.getCode()) .eq(pageWrap.getQwId() != null, Member::getQwId, pageWrap.getQwId()) .eq(pageWrap.getIdcard() != null, Member::getIdcard, pageWrap.getIdcard()) .ge(pageWrap.getLastLoginDate() != null, Member::getLastLoginDate, Utils.Date.getStart(pageWrap.getLastLoginDate())) .le(pageWrap.getLastLoginDate() != null, Member::getLastLoginDate, Utils.Date.getEnd(pageWrap.getLastLoginDate())) .eq(pageWrap.getLoginCount() != null, Member::getLoginCount, pageWrap.getLoginCount()); if (pageWrap.getKeyword() != null) { queryWrapper.and( ms->ms.like(Member::getName,pageWrap.getKeyword()) .or().like(Member::getPhone,pageWrap.getKeyword()) .or().like(Member::getCompanyName,pageWrap.getKeyword())); } if(pageWrap.getIncludeChild()!=null &&pageWrap.getIncludeChild() ){ if(pageWrap.getCompanyId() !=null){ //如果包含下级组织 Company company = companyMapper.selectById(pageWrap.getCompanyId());//查询组织信息 queryWrapper.exists("select (cm.id) from company_member cm where cm.company_id_path like '"+company.getIdPath()+"%' and cm.member_id=t.id"); // queryWrapper.likeRight(Company::getIdPath,company.getIdPath()); } }else{ //不包含下级组织 queryWrapper.exists(pageWrap.getCompanyId()!=null,"select (cm.id) from company_member cm where cm.company_id='"+pageWrap.getCompanyId()+"' and cm.member_id=t.id"); } return memberMapper.selectJoinList(Member.class,queryWrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); pageWrap.getModel().setIsdeleted(Constants.ZERO); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper. selectAll(Member.class) .selectAs(SystemUser::getUsername,Member::getEditorName) .leftJoin(SystemUser.class,SystemUser::getId,Member::getEditor) .eq(pageWrap.getModel().getId() != null, Member::getId, pageWrap.getModel().getId()) .eq(pageWrap.getModel().getCreator() != null, Member::getCreator, pageWrap.getModel().getCreator()) .ge(pageWrap.getModel().getCreateDate() != null, Member::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())) .le(pageWrap.getModel().getCreateDate() != null, Member::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())) .eq(pageWrap.getModel().getEditor() != null, Member::getEditor, pageWrap.getModel().getEditor()) .ge(pageWrap.getModel().getEditDate() != null, Member::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())) .le(pageWrap.getModel().getEditDate() != null, Member::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())) .eq(pageWrap.getModel().getIsdeleted() != null, Member::getIsdeleted, pageWrap.getModel().getIsdeleted()) .eq(pageWrap.getModel().getName() != null, Member::getName, pageWrap.getModel().getName()) .eq(pageWrap.getModel().getRemark() != null, Member::getRemark, pageWrap.getModel().getRemark()) .eq(pageWrap.getModel().getStatus() != null, Member::getStatus, pageWrap.getModel().getStatus()) .eq(pageWrap.getModel().getSortnum() != null, Member::getSortnum, pageWrap.getModel().getSortnum()) .eq(pageWrap.getModel().getImgurl() != null, Member::getImgurl, pageWrap.getModel().getImgurl()) .eq(pageWrap.getModel().getType() != null, Member::getType, pageWrap.getModel().getType()) .eq(pageWrap.getModel().getCompanyName() != null, Member::getCompanyName, pageWrap.getModel().getCompanyName()) .eq(pageWrap.getModel().getPhone() != null, Member::getPhone, pageWrap.getModel().getPhone()) .eq(pageWrap.getModel().getEmail() != null, Member::getEmail, pageWrap.getModel().getEmail()) .eq(pageWrap.getModel().getSex() != null, Member::getSex, pageWrap.getModel().getSex()) .eq(pageWrap.getModel().getCode() != null, Member::getCode, pageWrap.getModel().getCode()) .eq(pageWrap.getModel().getQwId() != null, Member::getQwId, pageWrap.getModel().getQwId()) .eq(pageWrap.getModel().getIdcard() != null, Member::getIdcard, pageWrap.getModel().getIdcard()) .ge(pageWrap.getModel().getLastLoginDate() != null, Member::getLastLoginDate, Utils.Date.getStart(pageWrap.getModel().getLastLoginDate())) .le(pageWrap.getModel().getLastLoginDate() != null, Member::getLastLoginDate, Utils.Date.getEnd(pageWrap.getModel().getLastLoginDate())) .eq(pageWrap.getModel().getLoginCount() != null, Member::getLoginCount, pageWrap.getModel().getLoginCount()) ; if (pageWrap.getModel().getKeyword() != null) { queryWrapper.and( ms->ms.like(Member::getName,pageWrap.getModel().getKeyword()) .or().like(Member::getPhone,pageWrap.getModel().getKeyword())); } if(pageWrap.getModel().getIncludeChild()!=null &&pageWrap.getModel().getIncludeChild() ){ if(pageWrap.getModel().getCompanyId() !=null){ //如果包含下级组织 Company company = companyMapper.selectById(pageWrap.getModel().getCompanyId());//查询组织信息 queryWrapper.exists("select (cm.id) from company_member cm where cm.company_id_path like '"+company.getIdPath()+"%' and cm.member_id=t.id"); // queryWrapper.likeRight(Company::getIdPath,company.getIdPath()); } }else{ //不包含下级组织 queryWrapper.exists(pageWrap.getModel().getCompanyId()!=null,"select (cm.id) from company_member cm where cm.company_id='"+pageWrap.getModel().getCompanyId()+"' and cm.member_id=t.id"); } if(Objects.nonNull(pageWrap.getModel().getIsSendCopy())&&Constants.equalsInteger(Constants.ONE,pageWrap.getModel().getIsSendCopy())){ queryWrapper.apply(" t.id in ( select MEMBER_ID from managers where ISDELETED= 0 and STATUS = 0 and TYPE = 1 ) "); } queryWrapper.orderByAsc(Member::getCreateDate); PageData record = PageData.from(memberMapper.selectJoinPage(page,Member.class, queryWrapper)); if(record!=null && record.getRecords()!=null){ for(Member m : record.getRecords()){ if(StringUtils.isNotBlank(m.getCompanyName())){ m.setCompanyNameList(m.getCompanyName().split(",")); } } } return record; } @Override public long count(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectCount(wrapper); } @Override @Transactional public void syncQwAll(){ if(Constants.DEALING_MEMBER_SYNC){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,同步任务正在进行,请稍后刷新页面重试!"); } Constants.DEALING_MEMBER_SYNC =true; try { Company param = new Company(); param.setIsdeleted(Constants.ZERO); param.setType(Constants.ZERO); //查询全部组织信息 List companyList = companyMapper.selectList(new QueryWrapper<>(param)); if(companyList==null || companyList.size() ==0){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,组织信息为空,无法同步人员信息,请前往组织管理先同步组织信息!"); } LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); Date date = new Date(); List list = new ArrayList<>(); int index =0; for(Company c : companyList){ List tList = QywxUtil.getUserList(systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode(),c.getQwId()); if(tList!=null){ log.error((index++)+"==============="+c.getName()+"============人员数量:"+tList.size()); list.addAll(tList); }else{ log.error((index++)+"==============="+c.getName()+"============人员数量:0"); } } if(list == null || list.size() ==0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!"); } log.error( "###################=================人员总数量:"+list.size()); List memberList = memberMapper.selectList(new LambdaQueryWrapper().eq(Member::getIsdeleted,Constants.ZERO)); List newList = new ArrayList<>(); List updateList = new ArrayList<>(); List nowAllList = new ArrayList<>(); List companyMembers = new ArrayList<>(); List deletedIds = new ArrayList<>(); for (QywxUserListResponse model : list){ if(getMemberDataFromListById(model.getUserid(),nowAllList) !=null){ //如果已经处理过,不添加重复数据 continue; } Member cm = getMemberDataFromListById(model.getUserid(),memberList); List qycom = getCompanyIdFromList(model,companyList); String comIds = "",comNames = ""; String phone = getQyPhoneByExtralAttr(model.getExtattr()); if(cm !=null){ //更新 updateList.add(cm); }else{ //新增 cm = new Member(); cm.setCreator(user.getId()); cm.setCreateDate(date); newList.add(cm); } if(qycom.size()>0){ for(Company c : qycom){ if(StringUtils.isNotBlank(comIds)){ comIds += ","; } comIds += c.getId(); if(StringUtils.isNotBlank(comNames)){ comNames += ","; } comNames += StringUtils.defaultString(c.getNamePath(),c.getName()); } } cm.setCompanyList(qycom); cm.setEditor(user.getId()); cm.setEditDate(date); cm.setPhone(phone); cm.setCode(phone); cm.setName(model.getName()); cm.setStatus(Constants.ZERO); cm.setIsdeleted(Constants.ZERO); cm.setType(Constants.ZERO); cm.setCompanyId(comIds); cm.setCompanyName(comNames); cm.setSex(model.getGender()); cm.setEmail(model.getEmail()); cm.setQwId(model.getUserid()); nowAllList.add(cm); } //查询已删除的数据 for(Member c : memberList){ if(getQwDataFromListById(c.getQwId(),list) ==null){ deletedIds.add(c.getId()); } } if(deletedIds.size()>0){//清空已删除的 memberMapper.update(null,new UpdateWrapper().lambda() .in(Member::getId,deletedIds) .set(Member::getIsdeleted,Constants.ONE) .set(Member::getEditDate,date) .set(Member::getQwId,null) .set(Member::getEditor,user.getId()) ); } if(newList.size()>0){ memberMapper.insert(newList);//插入新数据 } for(Member c : updateList){//更新原有数据 memberMapper.updateById(c); } for(Member member : nowAllList){ if(member.getCompanyList()!=null &&member.getCompanyList().size()>0){ for(Company c : member.getCompanyList()){ CompanyMember companyMember = new CompanyMember(); companyMember.setCreator(user.getId()); companyMember.setCreateDate(date); companyMember.setEditor(user.getId()); companyMember.setEditDate(date); companyMember.setIsdeleted(Constants.ZERO); companyMember.setMemberId(member.getId()); companyMember.setCompanyId(c.getId()); companyMember.setIsLeader(c.getIsLeader()); companyMember.setCompanyIdPath(c.getIdPath()); companyMembers.add(companyMember);//员工组织关联关系 } } } companyMemberMapper.delete(new UpdateWrapper<>());//清空所有的 if(companyMembers.size()>0){ companyMemberMapper.insert(companyMembers);//重新插入新纪录 } }catch (BusinessException e){ throw e; }catch (Exception e){ e.printStackTrace(); throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,同步数据失败~"); }finally { Constants.DEALING_MEMBER_SYNC =false; } } private String getQyPhoneByExtralAttr(QywxUserExtAttrResponse extattr) { if(extattr!=null && extattr.getAttrs()!=null && extattr.getAttrs().size()>0){ for(QywxUserAttrInfoResponse attr : extattr.getAttrs()){ if(attr== null){ continue; } if(StringUtils.equals(attr.getName(),"员工号")){ return attr.getValue(); // return attr.getText()!=null?attr.getText().getValue():null; } } } return null; } private List getCompanyIdFromList(QywxUserListResponse model, List companyList) { List department = model.getDepartment(); List list = new ArrayList<>(); if(department == null || department.size()==0){ return null; } for (int i = 0; i < department.size(); i++) { String id = department.get(i); for(Company c : companyList){ if(StringUtils.equals(c.getQwId(),id)){ if(model.getIs_leader_in_dept()!=null && model.getIs_leader_in_dept().size()>i){ c.setIsLeader(model.getIs_leader_in_dept().get(i)); } list.add(c); } } } return list; } private QywxUserListResponse getQwDataFromListById(String qwId, List list) { for(QywxUserListResponse model : list){ if(StringUtils.equals(model.getUserid(),qwId)){ return model; } } return null; } private Member getMemberDataFromListById(String qwid, List list) { for(Member model : list){ if(StringUtils.equals(model.getQwId(),qwid)){ return model; } } return null; } @Override public Member getUserInfo(LoginH5DTO dto){ if(Objects.isNull(dto)|| StringUtils.isBlank(dto.getCode())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } String token = systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode(); //根据code换区企业微信ID QywxBaseResponse qwIdBaseResponse = QywxUtil.getUserInfoByCode(token,dto.getCode()); if(Objects.isNull(qwIdBaseResponse)||Objects.isNull(qwIdBaseResponse.getErrcode())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"企业微信登录码解析失败,请联系管理员"); } if(!Constants.equalsInteger(qwIdBaseResponse.getErrcode(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"企业微信登录失败:"+qwIdBaseResponse.getErrmsg()); } if(Objects.isNull(qwIdBaseResponse.getData())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"企业微信用户信息解析失败,请联系管理员"); } String qwId = qwIdBaseResponse.getData(); // String qwId = dto.getCode(); Member member = memberMapper.selectOne(new QueryWrapper().lambda().eq(Member::getQwId,qwId).eq(Member::getIsdeleted,Constants.ZERO).last(" limit 1 ")); if(Objects.isNull(member)){ //根据企业微信ID 查询用户信息 QywxUserInfoResponse qywxUserInfoResponse = QywxUtil.getUserInfo(token,qwId); if(Objects.isNull(qywxUserInfoResponse)||Objects.isNull(qywxUserInfoResponse.getErrcode())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"企业微信获取用户信息解析失败,请联系管理员"); } if(!Constants.equalsInteger(qywxUserInfoResponse.getErrcode(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"企业微信获取用户信息失败:"+qwIdBaseResponse.getErrmsg()); } member = new Member(); member.setCreateDate(new Date()); member.setStatus(Constants.ZERO); member.setIsdeleted(Constants.ZERO); member.setName(StringUtils.isNotBlank(qywxUserInfoResponse.getName())?qywxUserInfoResponse.getName():null); member.setImgurl(StringUtils.isNotBlank(qywxUserInfoResponse.getAvatar())?qywxUserInfoResponse.getAvatar():null); member.setPhone(StringUtils.isNotBlank(qywxUserInfoResponse.getMobile())?qywxUserInfoResponse.getMobile():null); member.setQwId(qwId); memberMapper.insert(member); } //查询是否有权限 member.setDcaButton(managersMapper.selectCount(new QueryWrapper().lambda() .eq(Managers::getIsdeleted,Constants.ZERO).eq(Managers::getMemberId,member.getId()) .eq(Managers::getType,Constants.TWO))>Constants.ZERO?Constants.ONE:Constants.ZERO); return member; } @Override public void updEmail(UpdEmailDTO updEmailDTO){ if(Objects.isNull(updEmailDTO) || StringUtils.isBlank(updEmailDTO.getEmail()) || Objects.isNull(updEmailDTO.getUserId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST); } Member member = memberMapper.selectById(updEmailDTO.getUserId()); if(Objects.isNull(member)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"用户信息异常"); } memberMapper.update(null,new UpdateWrapper().lambda().set(Member::getEmail,updEmailDTO.getEmail()).eq(Member::getId,member.getId())); } @Override public Member checkUserValid(Member member){ if(Objects.isNull(member)||Objects.isNull(member.getId())){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到有效用户信息"); } Member dbMember = memberMapper.selectById(member.getId()); if(Objects.isNull(dbMember)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前登录用户已注销"); } if(!Constants.equalsInteger(dbMember.getIsdeleted(),Constants.ZERO)||!Constants.equalsInteger(dbMember.getStatus(),Constants.ZERO)){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前登录用户已禁用"); } return dbMember; } }