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.QywxDepartInfoResponse; import com.doumee.core.utils.qiyeweixin.model.response.QywxUserAttrInfoResponse; import com.doumee.core.utils.qiyeweixin.model.response.QywxUserExtAttrResponse; import com.doumee.core.utils.qiyeweixin.model.response.QywxUserListResponse; import com.doumee.dao.business.CompanyMapper; import com.doumee.dao.business.CompanyMemberMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.model.Company; import com.doumee.dao.business.model.CompanyMember; import com.doumee.dao.business.model.Member; import com.doumee.dao.system.model.SystemUser; 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 org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestHeader; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * 人员信息表Service实现 * @author 江蹄蹄 * @since 2025/04/02 17:49 */ @Service public class MemberServiceImpl implements MemberService { @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private MemberMapper memberMapper; @Autowired private CompanyMapper companyMapper; @Autowired private CompanyMemberMapper companyMemberMapper; @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) { memberMapper.updateById(member); } @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 member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectList(wrapper); } @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().getCompanyId() != null, Member::getCompanyId, pageWrap.getModel().getCompanyId()) .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("select (cm.id) from company_member cm where cm.company_id='"+pageWrap.getModel().getCompanyId()+"' and cm.member_id=t.id"); } queryWrapper.orderByAsc(Member::getCreateDate); return PageData.from(memberMapper.selectJoinPage(page,Member.class, queryWrapper)); } @Override public long count(Member member) { QueryWrapper wrapper = new QueryWrapper<>(member); return memberMapper.selectCount(wrapper); } @Override 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<>(); for(Company c : companyList){ List tList = QywxUtil.getUserList(systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode(),c.getQwId()); if(tList!=null){ list.addAll(tList); } } if(list == null || list.size() ==0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!"); } 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 += 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; } }