| | |
| | | |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.account.api.dto.AppUserWhitelistImportDTO; |
| | | import com.ruoyi.account.api.dto.AppUserWhitelistQueryDTO; |
| | |
| | | import com.ruoyi.account.service.TAppUserService; |
| | | import com.ruoyi.account.service.TAppUserWhitelistService; |
| | | import com.ruoyi.account.service.TAppUserWhitelistSiteService; |
| | | import com.ruoyi.chargingPile.api.domain.SiteMenu; |
| | | import com.ruoyi.chargingPile.api.feignClient.PartnerClient; |
| | | import com.ruoyi.chargingPile.api.feignClient.SiteClient; |
| | | import com.ruoyi.chargingPile.api.model.Partner; |
| | |
| | | import com.ruoyi.common.core.web.domain.BasePojo; |
| | | import com.ruoyi.common.security.service.TokenService; |
| | | import com.ruoyi.common.security.utils.SecurityUtils; |
| | | import com.ruoyi.system.api.domain.SysUser; |
| | | import com.ruoyi.system.api.feignClient.SysUserClient; |
| | | import com.ruoyi.system.api.model.LoginUser; |
| | | import org.apache.poi.ss.usermodel.Row; |
| | | import org.apache.poi.ss.usermodel.Sheet; |
| | |
| | | private PartnerClient partnerClient; |
| | | @Resource |
| | | private TokenService tokenService; |
| | | @Resource |
| | | private SysUserClient sysUserClient; |
| | | |
| | | @Override |
| | | public Page<TAppUserWhitelist> pageList(AppUserWhitelistQueryDTO queryDTO) { |
| | | if (queryDTO == null) { |
| | | queryDTO = new AppUserWhitelistQueryDTO(); |
| | | } |
| | | Page<TAppUserWhitelist> page = this.lambdaQuery() |
| | | Integer currentPartnerId = getCurrentPartnerId(); |
| | | String username = getUsername(); |
| | | LambdaQueryChainWrapper<TAppUserWhitelist> query = this.lambdaQuery() |
| | | .like(StringUtils.isNotBlank(queryDTO.getPhone()), TAppUserWhitelist::getPhone, queryDTO.getPhone()) |
| | | .eq(TAppUserWhitelist::getDelFlag, false) |
| | | .orderByDesc(BasePojo::getCreateTime) |
| | | .eq(TAppUserWhitelist::getDelFlag, false); |
| | | if (currentPartnerId != null) { |
| | | if (StringUtils.isNotBlank(username)) { |
| | | query.and(wrapper -> wrapper.eq(TAppUserWhitelist::getPartnerId, currentPartnerId) |
| | | .or() |
| | | .eq(TAppUserWhitelist::getCreateBy, username)); |
| | | } else { |
| | | query.eq(TAppUserWhitelist::getPartnerId, currentPartnerId); |
| | | } |
| | | } |
| | | Page<TAppUserWhitelist> page = query.orderByDesc(BasePojo::getCreateTime) |
| | | .page(Page.of(queryDTO.getPageCurr(), queryDTO.getPageSize())); |
| | | fillDisplay(page.getRecords()); |
| | | return page; |
| | |
| | | if (whitelist == null) { |
| | | throw new ServiceException("白名单用户不存在"); |
| | | } |
| | | assertPartnerVisible(whitelist); |
| | | fillDisplay(Collections.singletonList(whitelist)); |
| | | return whitelist; |
| | | } |
| | |
| | | continue; |
| | | } |
| | | Long whitelistId = Long.valueOf(id); |
| | | TAppUserWhitelist whitelist = this.getById(whitelistId); |
| | | if (whitelist == null) { |
| | | continue; |
| | | } |
| | | assertPartnerVisible(whitelist); |
| | | this.removeById(whitelistId); |
| | | whitelistSiteService.remove(Wrappers.lambdaQuery(TAppUserWhitelistSite.class) |
| | | .eq(TAppUserWhitelistSite::getWhitelistId, whitelistId)); |
| | |
| | | */ |
| | | private boolean isWhitelistScopeMatched(TAppUserWhitelist whitelist, Integer siteId) { |
| | | if (Objects.equals(whitelist.getScopeType(), SCOPE_ALL_SITE)) { |
| | | return true; |
| | | return whitelist.getPartnerId() == null || isSiteBelongsToPartner(siteId, whitelist.getPartnerId()); |
| | | } |
| | | if (Objects.equals(whitelist.getScopeType(), SCOPE_SELECTED_SITE)) { |
| | | return whitelistSiteService.lambdaQuery() |
| | |
| | | if (Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) && saveDTO.getPartnerId() == null) { |
| | | throw new ServiceException("请选择加盟商"); |
| | | } |
| | | validatePartnerDataScope(saveDTO); |
| | | TAppUserWhitelist exists = getByPhone(saveDTO.getPhone()); |
| | | if (saveDTO.getId() == null && exists != null) { |
| | | throw new ServiceException("该手机号已存在白名单配置"); |
| | |
| | | whitelist.setPhone(saveDTO.getPhone()); |
| | | whitelist.setBenefitType(saveDTO.getBenefitType()); |
| | | whitelist.setScopeType(saveDTO.getScopeType()); |
| | | whitelist.setPartnerId(Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) ? saveDTO.getPartnerId() : null); |
| | | whitelist.setPartnerId(resolveWhitelistPartnerId(saveDTO)); |
| | | whitelist.setStatus(STATUS_ENABLED); |
| | | whitelist.setUpdateBy(getUsername()); |
| | | whitelist.setRemark(saveDTO.getRemark()); |
| | |
| | | if (whitelist == null) { |
| | | throw new ServiceException("白名单用户不存在"); |
| | | } |
| | | assertPartnerVisible(whitelist); |
| | | TAppUser appUser = appUserService.lambdaQuery() |
| | | .eq(TAppUser::getPhone, saveDTO.getPhone()) |
| | | .last("LIMIT 1") |
| | |
| | | whitelist.setPhone(saveDTO.getPhone()); |
| | | whitelist.setBenefitType(saveDTO.getBenefitType()); |
| | | whitelist.setScopeType(saveDTO.getScopeType()); |
| | | whitelist.setPartnerId(Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) ? saveDTO.getPartnerId() : null); |
| | | whitelist.setPartnerId(resolveWhitelistPartnerId(saveDTO)); |
| | | whitelist.setStatus(STATUS_ENABLED); |
| | | whitelist.setUpdateBy(getUsername()); |
| | | whitelist.setRemark(saveDTO.getRemark()); |
| | |
| | | } |
| | | |
| | | private Map<String, Site> getSiteCodeMap() { |
| | | R<List<Site>> siteResult = siteClient.getSiteAll(); |
| | | List<Site> sites = siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData(); |
| | | List<Site> sites = getCurrentSelectableSites(); |
| | | Map<String, Site> siteCodeMap = new HashMap<>(); |
| | | for (Site site : sites) { |
| | | if (site != null && StringUtils.isNotBlank(site.getCode())) { |
| | |
| | | return partnerMap; |
| | | } |
| | | |
| | | private void validatePartnerDataScope(AppUserWhitelistSaveDTO saveDTO) { |
| | | Integer currentPartnerId = getCurrentPartnerId(); |
| | | if (currentPartnerId == null) { |
| | | return; |
| | | } |
| | | if (Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) |
| | | && !Objects.equals(saveDTO.getPartnerId(), currentPartnerId)) { |
| | | throw new ServiceException("合作商账号只能选择本合作商"); |
| | | } |
| | | if (Objects.equals(saveDTO.getScopeType(), SCOPE_SELECTED_SITE)) { |
| | | Set<Integer> authSiteIds = getCurrentPartnerSiteIds(currentPartnerId); |
| | | if (authSiteIds.isEmpty()) { |
| | | throw new ServiceException("当前合作商没有可用电站权限"); |
| | | } |
| | | List<Integer> unauthorizedSiteIds = saveDTO.getSiteIds().stream() |
| | | .filter(Objects::nonNull) |
| | | .filter(siteId -> !authSiteIds.contains(siteId)) |
| | | .collect(Collectors.toList()); |
| | | if (!unauthorizedSiteIds.isEmpty()) { |
| | | throw new ServiceException("只能选择当前合作商负责的电站"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private void assertPartnerVisible(TAppUserWhitelist whitelist) { |
| | | Integer currentPartnerId = getCurrentPartnerId(); |
| | | if (currentPartnerId == null || whitelist == null) { |
| | | return; |
| | | } |
| | | if (Objects.equals(whitelist.getPartnerId(), currentPartnerId)) { |
| | | return; |
| | | } |
| | | if (StringUtils.isNotBlank(whitelist.getCreateBy()) && Objects.equals(whitelist.getCreateBy(), getUsername())) { |
| | | return; |
| | | } |
| | | throw new ServiceException("无权操作该白名单数据"); |
| | | } |
| | | |
| | | private Integer resolveWhitelistPartnerId(AppUserWhitelistSaveDTO saveDTO) { |
| | | Integer currentPartnerId = getCurrentPartnerId(); |
| | | if (currentPartnerId != null) { |
| | | return currentPartnerId; |
| | | } |
| | | return Objects.equals(saveDTO.getScopeType(), SCOPE_PARTNER) ? saveDTO.getPartnerId() : null; |
| | | } |
| | | |
| | | private List<Site> getCurrentSelectableSites() { |
| | | Integer currentPartnerId = getCurrentPartnerId(); |
| | | if (currentPartnerId == null) { |
| | | R<List<Site>> siteResult = siteClient.getSiteAll(); |
| | | return siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData(); |
| | | } |
| | | Set<Integer> siteIds = getCurrentPartnerSiteIds(currentPartnerId); |
| | | if (siteIds.isEmpty()) { |
| | | return Collections.emptyList(); |
| | | } |
| | | R<List<Site>> siteResult = siteClient.getSiteByIds(new ArrayList<>(siteIds)); |
| | | List<Site> sites = siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData(); |
| | | return sites.stream() |
| | | .filter(site -> site != null && Objects.equals(site.getPartnerId(), currentPartnerId)) |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | private Set<Integer> getCurrentPartnerSiteIds(Integer partnerId) { |
| | | R<Set<Integer>> siteResult = partnerClient.authSite(partnerId, SiteMenu.SITE_LIST.getValue()); |
| | | return siteResult == null || siteResult.getData() == null ? Collections.emptySet() : siteResult.getData(); |
| | | } |
| | | |
| | | private boolean isSiteBelongsToPartner(Integer siteId, Integer partnerId) { |
| | | if (siteId == null || partnerId == null) { |
| | | return false; |
| | | } |
| | | R<List<Site>> siteResult = siteClient.getSiteByIds(Collections.singletonList(siteId)); |
| | | List<Site> sites = siteResult == null || siteResult.getData() == null ? Collections.emptyList() : siteResult.getData(); |
| | | return !sites.isEmpty() && Objects.equals(sites.get(0).getPartnerId(), partnerId); |
| | | } |
| | | |
| | | private Integer getCurrentPartnerId() { |
| | | SysUser sysUser = getCurrentSysUser(); |
| | | if (sysUser == null || !Objects.equals(sysUser.getRoleType(), 2)) { |
| | | return null; |
| | | } |
| | | return sysUser.getObjectId(); |
| | | } |
| | | |
| | | private SysUser getCurrentSysUser() { |
| | | LoginUser loginUser = null; |
| | | try { |
| | | loginUser = tokenService.getLoginUser(); |
| | | } catch (Exception e) { |
| | | // ignore and try security context fallback |
| | | } |
| | | if (loginUser == null) { |
| | | try { |
| | | loginUser = SecurityUtils.getLoginUser(); |
| | | } catch (Exception e) { |
| | | // ignore and fall through to null |
| | | } |
| | | } |
| | | if (loginUser == null) { |
| | | return null; |
| | | } |
| | | if (loginUser.getSysUser() != null && loginUser.getSysUser().getRoleType() != null) { |
| | | return loginUser.getSysUser(); |
| | | } |
| | | if (loginUser.getUserid() == null) { |
| | | return loginUser.getSysUser(); |
| | | } |
| | | R<SysUser> userResult = sysUserClient.getSysUser(loginUser.getUserid()); |
| | | if (userResult != null && userResult.getData() != null) { |
| | | return userResult.getData(); |
| | | } |
| | | return loginUser.getSysUser(); |
| | | } |
| | | |
| | | private boolean isValidPhone(String phone) { |
| | | return StringUtils.isNotBlank(phone) && PHONE_PATTERN.matcher(phone).matches(); |
| | | } |