package com.ydtech.modules.esm.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.ydtech.core.page.HttpResult; import com.ydtech.core.page.PageResult; import com.ydtech.exception.SystemException; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.model.dto.SysUserDto; import com.ydtech.modules.admin.model.dto.SysUserTeamDto; import com.ydtech.modules.admin.model.vo.AppCustomerManagementQueryVo; import com.ydtech.modules.admin.model.vo.SysReferrerVo; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.base.model.dto.PageDto; import com.ydtech.modules.base.model.vo.PageVo; import com.ydtech.modules.esm.dao.EsmUserReferrerMapper; import com.ydtech.modules.esm.model.EsmUserReferrer; import com.ydtech.modules.esm.model.QueryChannel; import com.ydtech.modules.esm.model.vo.*; import com.ydtech.modules.esm.service.EsmUserReferrerService; import com.ydtech.modules.order.entity.BasePageResult; import com.ydtech.utils.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowCallbackHandler; import org.springframework.stereotype.Service; import javax.sql.DataSource; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class EsmUserReferrerServiceImpl extends ServiceImpl implements EsmUserReferrerService { @Autowired public DataSource dataSource; @Autowired private SysUserService sysUserService; @Autowired private EsmUserReferrerService esmUserReferrerService; // 递归查找节点的所有父级节点 public List findParents(String userId) { List referrers = new ArrayList<>(); EsmUserReferrer esmUserReferrer = esmUserReferrerService.getById(userId); //找不到用户的推荐关系 if (esmUserReferrer == null) { return null; } List esmUserReferrers = esmUserReferrerService.list(new LambdaQueryWrapper() .eq(EsmUserReferrer::getAffiliation, esmUserReferrer.getAffiliation()) .ne(EsmUserReferrer::getId, esmUserReferrer.getId())); findParentsRecursive(esmUserReferrer.getReferrerId(), esmUserReferrers, referrers); return referrers; } private static void findParentsRecursive(String userId, List esmUserReferrers, List referrers) { if(esmUserReferrers.isEmpty()) return; EsmUserReferrer collect = esmUserReferrers.stream().filter(item -> item.getId().equals(userId)).findFirst() .orElse(null); if (collect != null) { if (collect.getId().equals(collect.getReferrerId())) { referrers.add(collect); } else { referrers.add(collect); findParentsRecursive(collect.getReferrerId(), esmUserReferrers, referrers); } } } @Override public Map buildLevelInfo(SysUser agent) { Map m = new HashMap(); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); lqw.eq(EsmUserReferrer::getReferrerId, agent.getId()); lqw.ne(EsmUserReferrer::getId, agent.getId()); List listAll = esmUserReferrerService.list(lqw); List oneList = new ArrayList<>(); List oneTempList = new ArrayList<>(); listAll.forEach(a -> { SysUser sysUser = sysUserService.getById(a.getId()); if (sysUser.getStatus() == 1) { oneList.add(sysUser); } else { oneTempList.add(sysUser); } }); m.put("list1", oneList); m.put("list2", oneTempList); return m; } @Override public void buildLevelList(SysUser user, List oneList, List oneTempList) { Map> oneMap = buildLevelInfo(user); oneList.addAll(oneMap.get("list1")); oneTempList.addAll(oneMap.get("list2")); } @Override public void addReferrer(String referrerId, String nextPK) { //if(referrerId.equals(nextPK)) throw new SystemException("推荐人不能是自己"); //推荐人信息 EsmUserReferrer referrer = getById(referrerId); EsmUserReferrer eur = new EsmUserReferrer(); if (null == referrer) { //推荐人是团队长的时候,先固定队长是首级 eur.setId(referrerId); eur.setLevel(0); eur.setAffiliation(referrerId); SysUser user = sysUserService.getById(referrerId); eur.setReferrerId(referrerId); eur.setReferrerName(user.getName()); esmUserReferrerService.save(eur); //查询团队长的id,并将团队长作为推荐人 referrer = getById(referrerId); eur.setId(nextPK); eur.setReferrerName(referrer.getReferrerName()); eur.setReferrerId(referrer.getReferrerId()); eur.setLevel(referrer.getLevel() + 1); eur.setAffiliation(referrer.getAffiliation()); esmUserReferrerService.saveOrUpdate(eur); } else { //已经级联过的代理再作为推荐人的时候,推荐人是传入的推荐人信息 SysUser user = sysUserService.getById(referrerId); eur.setId(nextPK); eur.setReferrerId(referrerId); eur.setReferrerName(user.getName()); eur.setLevel(referrer.getLevel() + 1); eur.setAffiliation(referrer.getAffiliation()); esmUserReferrerService.saveOrUpdate(eur); } } @Override public boolean deldeleteByReferrerId(String userId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(EsmUserReferrer::getId, userId); return remove(queryWrapper); } @Override public List getUpUser(String userId, List list) { EsmUserReferrer esmUserReferrer = this.getById(userId); if (esmUserReferrer == null) { return list; } list.add(esmUserReferrer.getId()); if (!esmUserReferrer.getReferrerId().equals(userId)) { getUpUser(esmUserReferrer.getReferrerId(), list); } return list; } @Override public Page getUserPage(Page page, SysUserDto dto) { return baseMapper.getUserPage(page, dto); } @Override public Page getQueryChannelPage(Page page, QueryChannel queryChannel) { return baseMapper.getQueryChannelPage(page, queryChannel); } @Override public HttpResult> gainReferrerPage(PageDto pageDto) { if (StringUtils.isNotEmpty(pageDto.getDto().getAffiliation())) { EsmUserReferrer esmUserReferrer = this.getById(pageDto.getDto().getAffiliation()); if (esmUserReferrer == null) { return HttpResult.error("工号有误,请重新输入"); } List up3list = new ArrayList<>(); getUpUser(pageDto.getDto().getAffiliation(), up3list); List down3list = this.baseMapper.getIdDown3(pageDto.getDto().getAffiliation()); List ids = new ArrayList<>(); ids.addAll(up3list); ids.addAll(down3list); ids.add(pageDto.getDto().getAffiliation()); pageDto.getDto().setIds(ids); pageDto.getDto().setAffiliation(null); } PageVo pageVo = new PageVo(); //获取分页数量 int total = super.baseMapper.countReferrerByAffiliation(pageDto); // pageVo.setTotalSize(total); // PageVo.buildPageInfo(pageDto,pageVo); //计算mysql分页起索引 int firstIndex = pageDto.getPageNum() == 1 ? 0 : (pageDto.getPageNum() - 1) * pageDto.getPageSize(); //计算mysql分页总页数 int totalPages = total % pageDto.getPageSize() == 0 ? total / pageDto.getPageSize() : total / pageDto.getPageSize() + 1; //响应 pageVo.setTotalSize(total); pageVo.setPageNum(pageDto.getPageNum()); pageVo.setPageSize(pageDto.getPageSize()); pageVo.setTotalPages(totalPages); //请求替换分页开始索引 pageDto.setPageNum(firstIndex); pageVo.setContent(super.baseMapper.selectReferrerByAffiliation(pageDto)); return HttpResult.ok(pageVo); } /** * 人员业绩统计 * * @param whereCase * @param paramValues * @return */ public List countUserPolicy(String whereCase, Object[] paramValues) { List recordList = new ArrayList(); String sql = "select b.teamlevel,b.name username,\n" + "sum(case when orderstatus in (1,2,3,4) then 1 else 0 end) ordernum,\n" + "sum(case when orderstatus=3 then 1 else 0 end) policynum,\n" + "sum(case when orderstatus=3 then sumpremium else 0 end) sumpremium\n" + "from v_user_referrer b \n" + "left join v_user_order a on b.id=a.id \n" + "and a.createtime between ? and ? \n" + "where b.affiliation=? \n" + "group by b.teamlevel,b.name order by b.teamlevel;"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.query(sql, paramValues, new RowCallbackHandler() { @Override public void processRow(ResultSet resultSet) throws SQLException { EsmUserPolicyVO model = new EsmUserPolicyVO(); model.setTeamlevel(resultSet.getString("teamlevel")); model.setUsername(resultSet.getString("username")); model.setOrdernum(resultSet.getInt("ordernum")); model.setPolicynum(resultSet.getInt("policynum")); model.setSumpremium(resultSet.getDouble("sumpremium")); recordList.add(model); } }); return recordList; } /** * 团队业绩统计 * * @param whereCase * @param paramValues * @return */ public List countTeamPolicy(String whereCase, Object[] paramValues) { List recordList = new ArrayList<>(); String sql = "select teamlevel,sum(teamnum) teamnum, sum(sumpremium) sumpremium,sum(usernum) usernum from \n" + "(select a.`level` teamlevel,count(distinct id) teamnum, 0 sumpremium,0 usernum\n" + "from v_user_order a\n" + "where a.affiliation=?\n" + "group by a.`level`\n" + "union all \n" + "select 9 teamlevel,count(distinct a.id) teamnum, 0 sumpremium,0 usernum\n" + "from esm_user_referrer a\n" + "left join sys_user b on a.id=b.id\n" + "where a.affiliation=? and b.status=2 " + "union all \n" + "select a.`level` teamlevel,0 teamnum, sum(sumpremium) sumpremium,count(distinct id) usernum\n" + "from v_user_order a\n" + "where a.affiliation=? and a.orderstatus=3\n" + "and a.createtime between ? and ? \n" + "group by a.`level`) t group by teamlevel"; JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); jdbcTemplate.query(sql, paramValues, new RowCallbackHandler() { @Override public void processRow(ResultSet resultSet) throws SQLException { EsmTeamPolicyVO model = new EsmTeamPolicyVO(); model.setTeamlevel(resultSet.getString("teamlevel")); model.setTeamnum(resultSet.getInt("teamnum")); model.setUsernum(resultSet.getInt("usernum")); model.setSumpremium(resultSet.getDouble("sumpremium")); recordList.add(model); } }); return recordList; } /** * 人员团队业绩统计--所有业务员都可查询 * * @return */ @Override public EsmUserCountVO queryUserCount(TeamUserQryVO record) { EsmUserCountVO esmUserCountVO = new EsmUserCountVO(); List hzList = new ArrayList<>(); List userPolicyList = new ArrayList<>(); List userPolicyList0 = new ArrayList<>(); List userPolicyList1 = new ArrayList<>(); List userPolicyList2 = new ArrayList<>(); List userPolicyList3 = new ArrayList<>(); EsmUserReferrer esmUserReferrer = getById(record.getId()); if (esmUserReferrer != null) { List userList1 = new ArrayList<>(); List userList2 = new ArrayList<>(); List userList3 = new ArrayList<>(); //本级信息 //明细数据加工 List userList0 = new ArrayList<>(); userList0.add(esmUserReferrer.getId()); userPolicyList0 = this.baseMapper.queryOrderCount(userList0, record.getStartdate(), record.getEnddate()); //汇总数据加工 EsmTeamPolicyVO esmTeamPolicyVO0 = this.baseMapper.queryOrderCountHz(userList0, record.getStartdate(), record.getEnddate()); EsmTeamPolicyVO esmTeamPolicyVO1 = new EsmTeamPolicyVO(); EsmTeamPolicyVO esmTeamPolicyVO2 = new EsmTeamPolicyVO(); EsmTeamPolicyVO esmTeamPolicyVO3 = new EsmTeamPolicyVO(); esmTeamPolicyVO2.setTeamlevel("二级团队"); esmTeamPolicyVO3.setTeamlevel("三级团队"); if (esmTeamPolicyVO0 == null) { esmTeamPolicyVO0 = new EsmTeamPolicyVO(); esmTeamPolicyVO0.setSumpremium(0); esmTeamPolicyVO0.setUsernum(0); } else { esmTeamPolicyVO0.setUsernum(1); } esmTeamPolicyVO0.setTeamlevel("本人"); esmTeamPolicyVO0.setTeamnum(1); // 一级团队信息 userList1 = this.baseMapper.getIdDown_1(esmUserReferrer.getId()); esmTeamPolicyVO1.setTeamlevel("一级团队"); if (userList1 != null && userList1.size() > 0) { userPolicyList1 = this.baseMapper.queryOrderCount(userList1, record.getStartdate(), record.getEnddate()); EsmTeamPolicyVO esmTeamPolicyVO1_t = this.baseMapper.queryOrderCountHz(userList1, record.getStartdate(), record.getEnddate()); if (esmTeamPolicyVO1_t != null) { esmTeamPolicyVO1.setSumpremium(esmTeamPolicyVO1_t.getSumpremium()); esmTeamPolicyVO1.setUsernum(userPolicyList1.size());//出单人力 } esmTeamPolicyVO1.setTeamnum(userList1.size());//团队人数 // 二级团队信息 userList2 = this.baseMapper.getIdDown_2(esmUserReferrer.getId()); esmTeamPolicyVO2.setTeamlevel("二级团队"); if (userList2 != null && userList2.size() > 0) { userPolicyList2 = this.baseMapper.queryOrderCount(userList2, record.getStartdate(), record.getEnddate()); EsmTeamPolicyVO esmTeamPolicyVO2_t = this.baseMapper.queryOrderCountHz(userList2, record.getStartdate(), record.getEnddate()); if (esmTeamPolicyVO2_t != null) { esmTeamPolicyVO2.setSumpremium(esmTeamPolicyVO2_t.getSumpremium()); esmTeamPolicyVO2.setUsernum(userPolicyList2.size()); } esmTeamPolicyVO2.setTeamnum(userList2.size()); // 三级团队信息 userList3 = this.baseMapper.getIdDown_3(esmUserReferrer.getId()); if(userList3!=null && userList3.size()>0){ userPolicyList3=this.baseMapper.queryOrderCount(userList3,record.getStartdate(), record.getEnddate()); EsmTeamPolicyVO esmTeamPolicyVO3_t=this.baseMapper.queryOrderCountHz(userList3,record.getStartdate(), record.getEnddate()); esmTeamPolicyVO3.setTeamlevel("三级团队"); esmTeamPolicyVO3.setTeamnum(userList3.size()); if (esmTeamPolicyVO2_t != null) { esmTeamPolicyVO3.setSumpremium(esmTeamPolicyVO3_t.getSumpremium()); esmTeamPolicyVO3.setUsernum(userPolicyList3.size()); } } } } //临时团队 List registList = this.baseMapper.getIdDown3_regist(record.getId()); EsmTeamPolicyVO esmTeamPolicyVO9 = new EsmTeamPolicyVO(); esmTeamPolicyVO9.setTeamlevel("临时团队"); esmTeamPolicyVO9.setTeamnum(registList == null ? 0 : registList.size()); //汇总 List userList = new ArrayList<>(); userList.addAll(userList0); userList.addAll(userList1); userList.addAll(userList2); userList.addAll(userList3); userList.addAll(registList); userPolicyList = this.baseMapper.queryOrderCount(userList, record.getStartdate(), record.getEnddate()); EsmTeamPolicyVO esmTeamPolicyVO = new EsmTeamPolicyVO(); EsmTeamPolicyVO esmTeamPolicyVO_t = this.baseMapper.queryOrderCountHz(userList, record.getStartdate(), record.getEnddate()); if (esmTeamPolicyVO_t != null) { esmTeamPolicyVO.setSumpremium(esmTeamPolicyVO_t.getSumpremium()); esmTeamPolicyVO.setUsernum(userPolicyList.size()); } esmTeamPolicyVO.setTeamlevel("汇总"); esmTeamPolicyVO.setTeamnum(userList.size()); hzList.add(esmTeamPolicyVO); hzList.add(esmTeamPolicyVO0); hzList.add(esmTeamPolicyVO1); hzList.add(esmTeamPolicyVO2); hzList.add(esmTeamPolicyVO3); hzList.add(esmTeamPolicyVO9); esmUserCountVO.setHzList(hzList); esmUserCountVO.setUserPolicyList(userPolicyList); esmUserCountVO.setUserPolicyList0(userPolicyList0); esmUserCountVO.setUserPolicyList1(userPolicyList1); esmUserCountVO.setUserPolicyList2(userPolicyList2); esmUserCountVO.setUserPolicyList3(userPolicyList3); } else { throw new SystemException("内部错误"); } return esmUserCountVO; } public List queryList(String affiliation) { return super.baseMapper.queryList(affiliation); } @Override public BasePageResult getTeamUser(AppCustomerManagementQueryVo managementQueryVo, String userId) { List esmUserReferrers = lambdaQuery().eq(EsmUserReferrer::getReferrerId, userId).list(); if (esmUserReferrers.isEmpty()) { return new BasePageResult<>(); } int i = esmUserReferrers.get(0).getLevel() + 3; PageHelper.startPage(managementQueryVo.getPageNum(), managementQueryVo.getPageSize()); List byTeam = baseMapper.getByTeam(managementQueryVo, userId, i); PageResult sysUserPageResult = new PageResult<>(byTeam); return new BasePageResult<>(managementQueryVo.getPageNum(), managementQueryVo.getPageSize(), sysUserPageResult.getTotalPages(), sysUserPageResult.getPageSize(), sysUserPageResult.getContent()); } /** * 人员团队业绩统计--指定业务员查询 * * @return */ @Override public List queryUserCountForUser(TeamUserQryVO record) { return this.baseMapper.queryOrderCountForUser(record.getId(), record.getStartdate(), record.getEnddate()); } }