package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.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.dao.business.CompanyMapper; import com.doumee.dao.business.CompanyMemberMapper; 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.business.vo.CompanyTree; import com.doumee.dao.system.model.SystemUser; import com.doumee.service.business.CompanyService; import com.github.yulichang.wrapper.MPJLambdaWrapper; 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.util.CollectionUtils; 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 public class CompanyServiceImpl implements CompanyService { @Resource(name="sessionRedisTemplate") private RedisTemplate redisTemplate; @Autowired private CompanyMapper companyMapper; @Autowired private CompanyMemberMapper companyMemberMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Override public Integer create(Company company) { companyMapper.insert(company); return company.getId(); } @Override public void deleteById(Integer id) { companyMapper.deleteById(id); } @Override public void delete(Company company) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(company); companyMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } companyMapper.deleteBatchIds(ids); } @Override public void updateById(Company company) { companyMapper.updateById(company); } @Override public void updateByIdInBatch(List companys) { if (CollectionUtils.isEmpty(companys)) { return; } for (Company company: companys) { this.updateById(company); } } @Override public Company findById(Integer id) { return companyMapper.selectById(id); } @Override public Company findOne(Company company) { QueryWrapper wrapper = new QueryWrapper<>(company); return companyMapper.selectOne(wrapper); } @Override public List findList(Company company) { MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.selectAll(Company.class ) .select(" (select count(1) from company t1 where t1.isdeleted=0 and t1.parent_id = t.id )",Company::getChildNum) .isNull(company.getParentId()==null,Company::getParentId) .eq(company.getParentId()!=null,Company::getParentId,company.getParentId()) .eq(Company::getIsdeleted,Constants.ZERO) .orderByAsc(Company::getName); List companyList = companyMapper.selectJoinList(Company.class,wrapper); if(companyList.size()>0){ for (Company c : companyList){ c.setHasChildren(Constants.formatIntegerNum(c.getChildNum())>0); } } return companyList; } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.lambda() .eq(pageWrap.getModel().getId() != null, Company::getId, pageWrap.getModel().getId()) .eq(pageWrap.getModel().getCreator() != null, Company::getCreator, pageWrap.getModel().getCreator()) .ge(pageWrap.getModel().getCreateDate() != null, Company::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())) .le(pageWrap.getModel().getCreateDate() != null, Company::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())) .eq(pageWrap.getModel().getEditor() != null, Company::getEditor, pageWrap.getModel().getEditor()) .ge(pageWrap.getModel().getEditDate() != null, Company::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())) .le(pageWrap.getModel().getEditDate() != null, Company::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())) .eq(pageWrap.getModel().getIsdeleted() != null, Company::getIsdeleted, pageWrap.getModel().getIsdeleted()) .eq(pageWrap.getModel().getName() != null, Company::getName, pageWrap.getModel().getName()) .eq(pageWrap.getModel().getRemark() != null, Company::getRemark, pageWrap.getModel().getRemark()) .eq(pageWrap.getModel().getStatus() != null, Company::getStatus, pageWrap.getModel().getStatus()) .eq(pageWrap.getModel().getSortnum() != null, Company::getSortnum, pageWrap.getModel().getSortnum()) .eq(pageWrap.getModel().getImgurl() != null, Company::getImgurl, pageWrap.getModel().getImgurl()) .eq(pageWrap.getModel().getType() != null, Company::getType, pageWrap.getModel().getType()) .eq(pageWrap.getModel().getParentId() != null, Company::getParentId, pageWrap.getModel().getParentId()) .eq(pageWrap.getModel().getCode() != null, Company::getCode, pageWrap.getModel().getCode()) .eq(pageWrap.getModel().getQwId() != null, Company::getQwId, pageWrap.getModel().getQwId()) .eq(pageWrap.getModel().getNamePath() != null, Company::getNamePath, pageWrap.getModel().getNamePath()) .eq(pageWrap.getModel().getIdPath() != null, Company::getIdPath, pageWrap.getModel().getIdPath()) ; for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(companyMapper.selectPage(page, queryWrapper)); } @Override public long count(Company company) { QueryWrapper wrapper = new QueryWrapper<>(company); return companyMapper.selectCount(wrapper); } @Override public List companyTree( ) { return companyTreeBiz(0); } public List companyTreeBiz(int type ) { MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAll(Company.class); queryWrapper.selectAs(SystemUser::getUsername,Company::getEditorName); queryWrapper.select("t1.name",Company::getParentName); queryWrapper.select("t1.name_path",Company::getParentCompanyPath); queryWrapper.leftJoin(Company.class,Company::getId,Company::getParentId); queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Company::getEditor); queryWrapper.eq(Company::getIsdeleted,Constants.ZERO); queryWrapper.orderByAsc( "t.name"); List companyList = companyMapper.selectJoinList(Company.class,queryWrapper); List memberList = null; if(type == 1){ memberList = companyMemberMapper.selectJoinList(CompanyMember.class,new MPJLambdaWrapper() .selectAll(CompanyMember.class) .selectAs(Member::getName,CompanyMember::getMemberName) .leftJoin(Member.class,Member::getId,CompanyMember::getMemberId) .eq(Member::getIsdeleted,Constants.ZERO ) .eq(CompanyMember::getIsdeleted,Constants.ZERO ) .orderByAsc(Member::getName)); } CompanyTree treeBuild = new CompanyTree(companyList, 0,memberList); companyList = treeBuild.buildTree(); return companyList; } @Override public List companyTreeWithMember() { return companyTreeBiz(1); } @Override public int syncAll(Company company) { if(Constants.DEALING_COMPANY_SYNC){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,同步任务正在进行,请稍后刷新页面重试!"); } Constants.DEALING_COMPANY_SYNC =true; try { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); Date date = new Date(); List list = QywxUtil.getDepartmentAll(systemDictDataBiz.queryByCode(Constants.QYWX,Constants.QYWX_TOKEN).getCode()); if(list == null || list.size() ==0){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何组织信息!"); } Company param = new Company(); param.setIsdeleted(Constants.ZERO); param.setType(Constants.ZERO); List nowAllList = new ArrayList<>(); List companyList = findList(param); List newList = new ArrayList<>(); List updateList = new ArrayList<>(); List deletedIds = new ArrayList<>(); for (QywxDepartInfoResponse model : list){ Company cm = getCompanyDataFromListById(model.getId(),companyList); if(cm !=null){ //更新 cm.setEditor(user.getId()); cm.setEditDate(date); cm.setQwParentId(model.getParentid()); cm.setQwId(model.getId()); cm.setName(model.getName()); cm.setStatus(Constants.ZERO); cm.setType(Constants.ZERO); cm.setCode(model.getOrder()); updateList.add(cm); }else{ //新增 cm = new Company(); cm.setCreator(user.getId()); cm.setCreateDate(date); cm.setEditor(user.getId()); cm.setEditDate(date); cm.setQwParentId(model.getParentid()); cm.setQwId(model.getId()); cm.setName(model.getName()); cm.setStatus(Constants.ZERO); cm.setIsdeleted(Constants.ZERO); cm.setType(Constants.ZERO); cm.setCode(model.getOrder()); newList.add(cm); } } //查询已删除的数据 for(Company c : companyList){ if(getQwDataFromListById(c.getQwId(),list) ==null){ deletedIds.add(c.getId()); } } if(deletedIds.size()>0){//清空已删除的 companyMapper.update(null,new UpdateWrapper().lambda() .in(Company::getId,deletedIds) .set(Company::getIsdeleted,Constants.ONE) .set(Company::getEditDate,date) .set(Company::getQwParentId,null) .set(Company::getQwId,null) .set(Company::getEditor,user.getId()) ); } companyMapper.insert(newList);//插入新数据 for(Company c : updateList){//更新原有数据 companyMapper.updateById(c); } nowAllList.addAll(newList); nowAllList.addAll(updateList); dealTreePathInfo(nowAllList); }catch (BusinessException e){ throw e; }catch (Exception e){ e.printStackTrace(); throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,同步数据失败~"); }finally { Constants.DEALING_COMPANY_SYNC =false; } return 1; } private QywxDepartInfoResponse getQwDataFromListById(String qwId, List list) { for(QywxDepartInfoResponse model : list){ if(StringUtils.equals(model.getId(),qwId)){ return model; } } return null; } private Company getCompanyDataFromListById(String qwid, List list) { for(Company model : list){ if(StringUtils.equals(model.getQwId(),qwid)){ return model; } } return null; } private void dealTreePathInfo(List allHkList) { List tree = new CompanyTree(allHkList,1).buildTree(); if(tree!=null || tree.size()>0){ for(Company t : tree){ t.setIdPath(t.getId()+"/"); t.setNamePath(t.getName()); companyMapper.updateById(t); dealChildParentId(t,t.getChildList()); } } } private void dealChildParentId(Company t, List childList) { if(childList ==null || childList.size()==0){ return; } for(Company c : childList){ c.setParentId(t.getId()); c.setIdPath(t.getIdPath()+c.getId()+"/"); c.setNamePath(t.getNamePath()+"/"+c.getName()); companyMapper.updateById(c); if(t.getChildList()!=null || t.getChildList().size()==0){ //递归处理子集 dealChildParentId(c,c.getChildList()); } } } }