package com.ruoyi.chargingPile.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.chargingPile.api.dto.GetPermissionConfigurationDTO; import com.ruoyi.chargingPile.api.dto.PartnerListDTO; import com.ruoyi.chargingPile.api.model.*; import com.ruoyi.chargingPile.api.query.GetPartnerList; import com.ruoyi.chargingPile.api.query.SetPermissionConfiguration; import com.ruoyi.chargingPile.api.domain.SiteMenu; import com.ruoyi.chargingPile.dto.ResetPassword; import com.ruoyi.chargingPile.mapper.PartnerMapper; import com.ruoyi.chargingPile.service.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.feignClient.RoleSiteClient; import com.ruoyi.other.api.feignClient.UserSiteClient; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.feignClient.SysUserRoleClient; import com.ruoyi.system.api.model.SysUserRoleVo; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; /** * @author zhibing.pu * @Date 2024/8/7 13:49 */ @Service public class PartnerServiceImpl extends ServiceImpl implements IPartnerService { /** * TODO 确认合作商默认角色ID,当前先使用通用角色占位。 */ private static final Long PARTNER_DEFAULT_ROLE_ID = 2L; @Resource private SysUserClient sysUserClient; @Resource private ISiteService siteService; @Resource private TPartnerSiteService partnerSiteService; @Resource private TSiteMenuService siteMenuService; @Resource private TChargingPileService chargingPileService; @Resource private UserSiteClient userSiteClient; @Resource private RoleSiteClient roleSiteClient; @Resource private SysUserRoleClient userRoleClient; /** * 获取合作商列表数据 * @param partnerList * @return */ @Override public PageInfo getPartnerList(GetPartnerList partnerList) { PageInfo pageInfo = new PageInfo(partnerList.getPageCurr(), partnerList.getPageSize()); List list = this.baseMapper.getPartnerList(pageInfo, partnerList); pageInfo.setRecords(list); return pageInfo; } /** * 添加合作商 * @param partner * @return */ @Override public AjaxResult addPartner(Partner partner) { //校验参数和重复数据 AjaxResult ajaxResult = addPartnerParameterCheck(partner); if(ajaxResult.isError()){ return ajaxResult; } partner.setRoleId(PARTNER_DEFAULT_ROLE_ID.intValue()); Partner one = this.getOne(new LambdaQueryWrapper() .eq(Partner::getCode, partner.getCode()) .eq(Partner::getDelFlag, 0) ); if(null != one){ return AjaxResult.error("合作商ID已存在"); } one = this.getOne(new LambdaQueryWrapper() .eq(Partner::getAccount, partner.getAccount()) .eq(Partner::getDelFlag, 0) ); if(null != one){ return AjaxResult.error("登录账号不能重复"); } //添加登录账户 SysUser user = new SysUser(); user.setPhonenumber(partner.getPhoneOne()); user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); user.setStatus("0"); user.setDelFlag("0"); user.setRoleId(PARTNER_DEFAULT_ROLE_ID); user.setRoleType(2); user.setPassWordUpdate(new Date()); R r = sysUserClient.addSysUser(user); if(200 != r.getCode()){ throw new RuntimeException(r.getMsg()); } //添加新数据 this.save(partner); user = sysUserClient.getSysUser(r.getData()).getData(); user.setObjectId(partner.getId()); sysUserClient.updateUser(user); return AjaxResult.success(); } /** * 校验参数是否为空 * @param partner * @return */ AjaxResult addPartnerParameterCheck(Partner partner){ if(StringUtils.isEmpty(partner.getCode())){ return AjaxResult.error("合作商ID不能为空"); } if(StringUtils.isEmpty(partner.getName())){ return AjaxResult.error("合作商名称不能为空"); } if(StringUtils.isEmpty(partner.getPhoneOne())){ return AjaxResult.error("合作商电话1不能为空"); } if(null == partner.getId() && StringUtils.isEmpty(partner.getAccount())){ return AjaxResult.error("登录账号不能为空"); } if(null == partner.getId() && StringUtils.isEmpty(partner.getPassword())){ return AjaxResult.error("登录密码不能为空"); } return AjaxResult.success(); } /** * 获取合作商详情 * @param id 合作商id * @return */ @Override public Partner getPartner(Integer id) { return this.getById(id); } /** * 编辑合作商 * @param partner * @return */ @Override public AjaxResult editPartner(Partner partner) { //校验参数和重复数据 AjaxResult ajaxResult = addPartnerParameterCheck(partner); if(ajaxResult.isError()){ return ajaxResult; } partner.setRoleId(PARTNER_DEFAULT_ROLE_ID.intValue()); Partner one = this.getOne(new LambdaQueryWrapper() .eq(Partner::getCode, partner.getCode()) .eq(Partner::getDelFlag, 0) ); if(null != one && !one.getId().equals(partner.getId())){ return AjaxResult.error("合作商ID已存在"); } one = this.getOne(new LambdaQueryWrapper() .eq(Partner::getAccount, partner.getAccount()) .eq(Partner::getDelFlag, 0) ); if(null != one && !one.getId().equals(partner.getId())){ return AjaxResult.error("登录账号不能重复"); } Partner oldPartner = this.getById(partner.getId()); SysUser user = sysUserClient.queryUserByUserName(oldPartner.getAccount()).getData(); if(StringUtils.isEmpty(partner.getPassword())){ partner.setPassword(oldPartner.getPassword()); } //修改登录账户 if(null == user){ user = new SysUser(); user.setStatus("0"); user.setDelFlag("0"); user.setPhonenumber(partner.getPhoneOne()); user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); user.setPassword(partner.getPassword()); user.setRoleId(PARTNER_DEFAULT_ROLE_ID); user.setRoleType(2); user.setObjectId(partner.getId()); user.setPassWordUpdate(new Date()); R r = sysUserClient.addSysUser(user); if(200 != r.getCode()){ throw new RuntimeException(r.getMsg()); } }else{ user.setPhonenumber(partner.getPhoneOne()); user.setUserName(partner.getAccount()); user.setNickName(partner.getName()); user.setAvatar(partner.getLogoUrl()); if(StringUtils.isNotEmpty(partner.getPassword())){ user.setPassword(partner.getPassword()); user.setPassWordUpdate(new Date()); } user.setRoleId(PARTNER_DEFAULT_ROLE_ID); R r = sysUserClient.updateSysUser(user); if(200 != r.getCode()){ throw new RuntimeException(r.getMsg()); } } //修改数据 this.updateById(partner); return AjaxResult.success(); } /** * 删除合作商 * @param ids 合作商id */ @Override public AjaxResult delPartner(List ids) { //查询有无关联数据 //站点 long count = siteService.count(new LambdaQueryWrapper().in(Site::getPartnerId, ids).eq(Site::getDelFlag, 0)); if(count > 0){ return AjaxResult.error("该合作商已关联站点不可删除"); } //充电桩 long count1 = chargingPileService.count(new LambdaQueryWrapper().in(TChargingPile::getPartnerId, ids).eq(TChargingPile::getDelFlag, 0)); if(count1 > 0){ return AjaxResult.error("该合作商已关联充电桩不可删除!"); } for (Integer id : ids) { Partner partner = this.getById(id); if(null == partner){ return AjaxResult.error("删除失败"); } this.removeById(id); SysUser user = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); user.setDelFlag("2"); sysUserClient.updateUser(user); } return AjaxResult.success(); } /** * 重置密码 * @param resetPassword */ @Override public AjaxResult resetPassword(ResetPassword resetPassword) { if(null == resetPassword.getId()){ return AjaxResult.error("合作商id不能为空"); } if(StringUtils.isEmpty(resetPassword.getPassword())){ return AjaxResult.error("密码不能为空"); } Partner partner = this.getById(resetPassword.getId()); partner.setPassword(resetPassword.getPassword()); this.updateById(partner); //修改登录账号的密码 SysUser user = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); user.setPassword(partner.getPassword()); user.setPassWordUpdate(new Date()); sysUserClient.resetPassword(user); return AjaxResult.success(); } /** * 获取合作商权限 * @return */ @Override public GetPermissionConfigurationDTO getPermissionConfiguration(Integer siteId, Integer partnerId) { Partner partner = this.getById(partnerId); if(null == partner){ throw new RuntimeException("该站点合作商无效"); } GetPermissionConfigurationDTO dto = new GetPermissionConfigurationDTO(); dto.setPermissionRemarks(partner.getPermissionRemarks()); List list = partnerSiteService.list(new LambdaQueryWrapper() .eq(TPartnerSite::getPartnerId, partnerId) .eq(TPartnerSite::getSiteId, siteId)); List collect = list.stream().map(TPartnerSite::getSiteMenuId).collect(Collectors.toList()); List tSiteMenus = siteMenuService.list(new LambdaQueryWrapper() .eq(TSiteMenu::getParentId, 0) .eq(TSiteMenu::getVisible, 0) .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum)); List> list1 = new ArrayList<>(); for (TSiteMenu tSiteMenu : tSiteMenus) { Map menu = new HashMap<>(); menu.put("id", tSiteMenu.getMenuId()); menu.put("name", tSiteMenu.getMenuName()); menu.put("path", tSiteMenu.getPath()); menu.put("type", tSiteMenu.getMenuType()); List tSiteMenus1 = siteMenuService.list(new LambdaQueryWrapper() .eq(TSiteMenu::getParentId, tSiteMenu.getMenuId()) .eq(TSiteMenu::getVisible, 0) .eq(TSiteMenu::getStatus, 0).orderByAsc(TSiteMenu::getOrderNum)); List> list2 = new ArrayList<>(); for (TSiteMenu siteMenu : tSiteMenus1) { Map child = new HashMap<>(); child.put("id", siteMenu.getMenuId()); child.put("name", siteMenu.getMenuName()); child.put("path", siteMenu.getPath()); child.put("type", siteMenu.getMenuType()); child.put("selected", collect.contains(siteMenu.getMenuId())); list2.add(child); } menu.put("selected", collect.contains(tSiteMenu.getMenuId())); menu.put("child", list2); list1.add(menu); } dto.setMenu(list1); return dto; } /** * 合作商权限配置 * @param req */ @Override @Transactional(rollbackFor = Exception.class) public void setPermissionConfiguration(SetPermissionConfiguration req) { //删除原始配置 partnerSiteService.remove(new LambdaQueryWrapper().eq(TPartnerSite::getPartnerId, req.getPartnerId()).eq(TPartnerSite::getSiteId, req.getSiteId())); //添加新的配置 List sites = new ArrayList<>(); List list = req.getMenuId(); for (Integer integer : list) { TPartnerSite partnerSite = new TPartnerSite(); partnerSite.setPartnerId(req.getPartnerId()); partnerSite.setSiteId(req.getSiteId()); partnerSite.setSiteMenuId(integer); sites.add(partnerSite); } partnerSiteService.saveBatch(sites); //修改权限配置 Partner partner = this.getById(req.getPartnerId()); partner.setPermissionRemarks(req.getPermissionRemarks()); this.updateById(partner); } /** * 获取合作商授权的站点数据 * @param siteMenu 授权菜单路径枚举类 * @return */ @Override public Set authSite(Integer partnerId, SiteMenu siteMenu) { TSiteMenu one = siteMenuService.getOne(new LambdaQueryWrapper().eq(TSiteMenu::getPath, siteMenu.getValue()).eq(TSiteMenu::getStatus, 0)); List list = partnerSiteService.list(new LambdaQueryWrapper() .eq(TPartnerSite::getPartnerId, partnerId) .eq(TPartnerSite::getSiteMenuId, one.getMenuId())); List collect = list.stream().map(TPartnerSite::getSiteId).collect(Collectors.toList()); //获取合作商用户关联的站点数据 Partner partner = this.getById(partnerId); SysUser sysUser = sysUserClient.queryUserByUserName(partner.getAccount()).getData(); List data = userSiteClient.getSiteIds(sysUser.getUserId()).getData(); List data2 = userRoleClient.getRoleByUserId(sysUser.getUserId()).getData(); List data1 = roleSiteClient.getSiteIds(data2.get(0).getRoleId()).getData(); collect.addAll(data); collect.addAll(data1); Set siteIds = new HashSet<>(collect); if(siteIds.size() == 0){ siteIds.add(-1); } return siteIds; } /** * 判断当前账户是否有权限 * @param siteId 站点id * @param siteMenu 菜单路径枚举类 * @return */ @Override public boolean authMenu(Integer partnerId, Integer siteId, SiteMenu siteMenu) { TSiteMenu one = siteMenuService.getOne(new LambdaQueryWrapper().eq(TSiteMenu::getPath, siteMenu.getValue()).eq(TSiteMenu::getStatus, 0)); TPartnerSite partnerSite = partnerSiteService.getOne(new LambdaQueryWrapper() .eq(TPartnerSite::getPartnerId, partnerId) .eq(TPartnerSite::getSiteMenuId, one.getMenuId()) .eq(TPartnerSite::getSiteId, siteId)); return null == partnerSite ? false : true; } }