/** * @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; }
private Login toLogin(Object principal) { final Login login; if (principal instanceof AgentLevel) { login = ((AgentLevel) principal).getLogin(); } else login = (Login) principal; return login; }
@Override public Salesman newSalesman(Login login, BigDecimal rate, String rank) { Salesman salesman = new Salesman(); salesman.setId(login.getId()); salesman.setCreatedTime(LocalDateTime.now()); salesman.setEnable(true); salesman.setLogin(login); salesman.setSalesRate(rate); salesman.setRank(rank); entityManager.persist(salesman); return salesman; }
@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 void salesmanShareTo(long salesmanId, Login login) { SalesAchievement achievement = new SalesAchievement(); achievement.setTargetLogin(login); achievement.setTargetTime(LocalDateTime.now()); achievement.setWhose(get(salesmanId)); salesAchievementRepository.save(achievement); }
@Override public BigDecimal addressRate(AgentLevel agent) { if (agent.getSystem().getAddressRate() == null) return systemService.defaultAddressRate(); return agent.getSystem().getAddressRate(); }
@Override public void updateDirectRate(AgentSystem system, int level, BigDecimal rate) { if (CollectionUtils.isEmpty(system.getRates())) { system.setRates(systemService.defaultAgentRates()); } system.getRates().get(level).setMarketRate(rate); agentSystemRepository.save(system); }
@Override public void updateIndirectRate(AgentSystem system, int level, BigDecimal rate) { if (CollectionUtils.isEmpty(system.getRates())) { system.setRates(systemService.defaultAgentRates()); } system.getRates().get(level).setRecommendRate(rate); agentSystemRepository.save(system); }
@Override public AgentLevel addAgent(Login who, Login login, String name, String levelTitle, LocalDate beginDate, LocalDate endDate , int firstPayment, int agencyFee, AgentLevel superior) { AgentSystem agentSystem; if (superior == null) { // TODO 顶级代理 可不是所有人可以添的 // 顶级代理啊 agentSystem = new AgentSystem(); agentSystem = agentSystemRepository.save(agentSystem); } else agentSystem = superior.getSystem(); AgentLevel newLevel = addAgent(who, login, name, levelTitle, beginDate, endDate, firstPayment, agencyFee, superior, agentSystem); loginRelationCacheService.rebuildAgentSystem(agentSystem); return newLevel; }
@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 String qrCodeFor(Salesman salesman) { SceneCode sceneCode = Protocol.forAccount(publicAccount) .createQRCode("SFS_" + salesman.getLogin().getId(), 2592000); return sceneCode.getImageURL(); }
@Override public BigDecimal saleRate(AgentSystem system) { if (system.getOrderRate() == null) return systemService.defaultOrderRate(); return system.getOrderRate(); }
@Override public Expression<?> count(CriteriaQuery<Long> countQuery, CriteriaBuilder criteriaBuilder, Root<Commission> root) { // orderCommission 没有传统主键! return OrderCommission.getIdSelection(criteriaBuilder, root.join("orderCommission")); }
@Override public void updateSaleRate(AgentSystem system, BigDecimal rate) { system.setOrderRate(rate); agentSystemRepository.save(system); }
@Override public void updateAddressRate(AgentSystem system, BigDecimal rate) { system.setAddressRate(rate); agentSystemRepository.save(system); }
@Override public BigDecimal directRate(AgentSystem system, AgentLevel agent) { return rate(system, agent.getLevel(), AgentRate::getMarketRate); }
@Override public BigDecimal indirectRate(AgentLevel agent) { return indirectRate(agent.getSystem(), agent); }
@Override public BigDecimal indirectRate(AgentSystem system, AgentLevel agent) { return rate(system, agent.getLevel(), AgentRate::getRecommendRate); }