if (levelInput.getSuperior().getSuperior() == null || !levelInput.getSuperior().getLogin().equals(levelInput.getSuperior().getSuperior().getLogin())) loginRelationCacheService.breakConnection(levelInput); AgentLevel top = new AgentLevel(); top.setSystem(levelInput.getSystem()); top.setCreatedBy(null); top.setCreatedTime(LocalDateTime.now()); top.setLogin(login); top.setRank(levelInput.getRank()); top.setSuperior(levelInput.getSuperior().getSuperior()); top.setLevel(levelInput.getLevel() - 1); top.setSubAgents(Collections.singletonList(levelInput)); top = agentLevelRepository.save(top); levelInput.setSuperior(top); agentLevelRepository.save(levelInput); log.info(login + "升级到" + top.getLevel() + "代理商"); return top; } else { AgentLevel top = new AgentLevel(); top.setSystem(level.getSystem()); top.setCreatedBy(null); top.setCreatedTime(LocalDateTime.now()); top.setLogin(login); top.setRank(readService.nameForPrincipal(login));
@Override public String nameForAgent(AgentLevel agentLevel) { String level; if (!StringUtils.isEmpty(agentLevel.getLevelTitle())) level = agentLevel.getLevelTitle(); else level = getLoginTitle(agentLevel.getLevel()); String rank; if (!StringUtils.isEmpty(agentLevel.getRank())) rank = agentLevel.getRank(); else rank = nameForPrincipal(agentLevel.getLogin()); return rank + "(" + level + ")"; }
@Override public AgentLevel highestAgent(Login login) { AgentLevel agentLevel = agentLevelRepository.findByLogin(login).stream() .findAny().orElse(null); if (agentLevel != null) { // 最高级别的 AgentLevel current = agentLevel; while (current.getSuperior() != null && current.getSuperior().getLogin().equals(login)) { current = current.getSuperior(); } return current; } return null; }
@Override public void addLowestAgentLevelCache(AgentLevel level) { if (level.getSuperior() == null) { final AgentSystem system = level.getSystem(); final Login login = level.getLogin(); , level.getSuperior().getLogin()); , Stream.of(createRelationFromLevel(system, level.getSuperior().getLogin(), login, level.getLevel()))); saveValidRelations(relations);
AgentLevel top = new AgentLevel(); top.setSystem(system); top.setCreatedBy(who); top.setCreatedTime(now); top.setLogin(login); top.setRank(name); top.setSuperior(current); if (current == null) { top.setLevel(0); } else { top.setLevel(current.getLevel() + 1); top.setBeginDate(beginDate); top.setEndDate(endDate); final AgentLevel newAgentLevel = agentLevelRepository.save(top); if (current != null) { if (current.getSubAgents() == null) current.setSubAgents(new ArrayList<>()); current.getSubAgents().add(newAgentLevel); agentLevelRepository.save(current); topLevel.setLevelTitle(firstLevelTitle);
AgentLevel newTop = agentLevelRepository.findTopByLoginAndLevel(agentLevel.getLogin(), agentLevel.getLevel() - 1); agentLevel.getSuperior().getSubAgents().remove(agentLevel); agentLevel.setSuperior(newTop); newTop.getSubAgents().add(agentLevel); agentLevelRepository.save(agentLevel); });
agentLevel.setBeginDate(LocalDate.now()); agentLevel.setEndDate(LocalDate.now().plusYears(1)); agentLevel.setCreatedBy(manager); if (request.getPrice() != null) agentFinancingService.recordAgentFee(login, agentLevel, request.getPrice(), null, null); if (agentLevel.getLevel() > 3) { agentLevel = promotionService.agentLevelUpgrade(login, agentLevel); agentLevel.setBeginDate(LocalDate.now()); agentLevel.setEndDate(LocalDate.now().plusYears(1)); agentLevel.setCreatedBy(manager); if (request.getPrice() != null) agentFinancingService.recordAgentFee(login, agentLevel, request.getPrice(), null, null); if (agentLevel.getLevel() > 2) { agentLevel = promotionService.agentLevelUpgrade(login, agentLevel); agentLevel.setBeginDate(LocalDate.now()); agentLevel.setEndDate(LocalDate.now().plusYears(1)); agentLevel.setCreatedBy(manager); agentLevel.setLevelTitle(StringUtils.isEmpty(title) ? null : title); if (request.getPrice() != null) agentFinancingService.recordAgentFee(login, agentLevel, request.getPrice(), null, null);
final Stream<LoginRelation> loginRelationStream = levels.stream() .filter(agentLevel -> agentLevel.getLevel() == level) .map(agentLevel -> createRelationFromLevel(system, agentLevel.getSuperior().getLogin() , agentLevel.getLogin(), agentLevel.getLevel()));
@GetMapping("/memberList") @Transactional(readOnly = true) public String memberList(String userId, Model model) { // 可能是展示下级 Login targetLogin; if (userId.startsWith("Agent")) { AgentLevel agentLevel = agentService.getAgent(NumberUtils.parseNumber(userId.substring("Agent".length()) , Long.class)); targetLogin = agentLevel.getLogin(); // 如果它的下级被隐藏 则直接去同个人所属的下级 if (!readService.isAllowAgentLevel(agentLevel.getLevel() + 1)) { agentLevel = agentLevel.getSubAgents().stream() .filter(agentLevel1 -> agentLevel1.getLogin().equals(targetLogin)) .findFirst() .orElseThrow(() -> new IllegalArgumentException("没有直属?")); } model.addAttribute("dataUrl", "/api/subordinate/" + agentLevel.getId()); } else { targetLogin = loginService.get(NumberUtils.parseNumber(userId, Long.class)); model.addAttribute("dataUrl", "/api/directly/" + targetLogin.getId()); } model.addAttribute("showName", readService.nameForPrincipal(targetLogin)); return "wechat@memberList.html"; }
@PutMapping("/agent/superior/{id}") @PreAuthorize("hasAnyRole('ROOT')") @ResponseBody @Transactional public ApiResult changeSuperior(@RequestBody String newGuide, @PathVariable("id") long id) { final AgentLevel target = agentService.getAgent(id); if (!StringUtils.isEmpty(newGuide)) { long guideId = NumberUtils.parseNumber(newGuide, Long.class); AgentLevel targetLevel = agentService.getAgent(loginService.get(guideId), target.getLevel() - 1); loginRelationCacheService.breakConnection(target); target.setSuperior(targetLevel); loginRelationCacheService.addLowestAgentLevelCache(target.getSuperior()); return ApiResult.withOk(Collections.singletonMap("name", readService.nameForAgent(targetLevel))); } return ApiResult.withCodeAndMessage(400, "没有有效的上级代理商", null); }
private Login toLogin(Object principal) { final Login login; if (principal instanceof AgentLevel) { login = ((AgentLevel) principal).getLogin(); } else login = (Login) principal; return login; }
/** * @param level 特定代理商 * @return 代理等级;0 表示最高 应当存在{@link SystemService#systemLevel()}个等级 */ default int agentLevel(AgentLevel level) { return level.getLevel(); }
/** * @param level 指定代理体系 * @return 该体系最高等级的代理商 */ default AgentLevel topLevel(AgentLevel level) { AgentLevel current = level; while (current.getSuperior() != null) current = current.getSuperior(); return current; }
@Override public BigDecimal directRate(AgentLevel agent) { return directRate(agent.getSystem(), agent); }
/** * @param level 该身份最高可识别的代理 * @return 该身份头衔 */ default String loginTitle(AgentLevel level) { if (level == null) return getLoginTitle(Customer.LEVEL); if (!StringUtils.isEmpty(level.getLevelTitle())) return level.getLevelTitle(); final int i = agentLevel(level); return getLoginTitle(i); }
@Override public void breakConnection(AgentLevel level) { if (level.getSuperior() == null) { log.debug("准备移除从" + level.getSuperior().getLogin().getId() + "到" + level.getLogin().getId() + "的关系"); "(select fromLevelRelation.to from LoginRelation as fromLevelRelation where fromLevelRelation.from = :self) " , LoginRelation.class) .setParameter("s", level.getSuperior().getLogin()) .setParameter("self", level.getLogin()) .getResultList(); resultList.forEach(this::deleteThisId); .setParameter("s", level.getSuperior().getLogin()) .setParameter("self", level.getLogin()) .getResultList(); resultList.forEach(this::deleteThisId);
@GetMapping("/manageAgentDetail") @Transactional(readOnly = true) public String detail(Model model, long id) { final AgentLevel agent = agentService.getAgent(id); model.addAttribute("currentData", agent); return _detailView(model, agent.getLogin()); }
@Override public BigDecimal directRate(AgentSystem system, AgentLevel agent) { return rate(system, agent.getLevel(), AgentRate::getMarketRate); }
-> level.getSuperior() == agentLevel) .findAny() .ifPresent(level
@Override public BigDecimal indirectRate(AgentLevel agent) { return indirectRate(agent.getSystem(), agent); }