feat(REQ-2545): 洗权限资源关系接口、元素上报接口
This commit is contained in:
parent
5ee96d4003
commit
b118e80ed1
@ -0,0 +1,23 @@
|
||||
package cn.axzo.tyr.client.common.enums;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum PageElementTypeEnum {
|
||||
|
||||
PAGE("PAGE", "页面"),
|
||||
COMPONENT("COMPONENT", "组件"),
|
||||
|
||||
;
|
||||
|
||||
private final String code;
|
||||
|
||||
private final String desc;
|
||||
}
|
||||
@ -0,0 +1,31 @@
|
||||
package cn.axzo.tyr.client.feign;
|
||||
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.tyr.client.model.req.GetPageElementReq;
|
||||
import cn.axzo.tyr.client.model.req.PageElementReportReq;
|
||||
import cn.axzo.tyr.client.model.res.PageElementResp;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 页面及元素相关接口
|
||||
*
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@FeignClient(name = "tyr", url = "${axzo.service.tyr:http://tyr:8080}")
|
||||
public interface PageElementApi {
|
||||
|
||||
/** 页面及元素上报 **/
|
||||
@PostMapping("/api/pageElement/report")
|
||||
ApiResult<Void> report(@RequestBody @Valid PageElementReportReq req);
|
||||
|
||||
/** 查询页面资源 **/
|
||||
@PostMapping("/api/pageElement/getPageElement")
|
||||
ApiResult<List<PageElementResp>> getPageElement(@RequestBody @Valid GetPageElementReq req);
|
||||
}
|
||||
@ -0,0 +1,34 @@
|
||||
package cn.axzo.tyr.client.model.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.Min;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/14
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class GetPageElementReq {
|
||||
|
||||
/**
|
||||
* 页面的featureResourceId
|
||||
*/
|
||||
@NotNull(message = "页面的featureResourceId不能为空")
|
||||
@Min(value = 1, message = "页面的featureResourceId有误")
|
||||
private Long featureResourceId;
|
||||
|
||||
/**
|
||||
* 是否只查询组件已选择的元素
|
||||
*/
|
||||
@Builder.Default
|
||||
private Boolean querySelectedOnly = Boolean.FALSE;
|
||||
}
|
||||
@ -0,0 +1,66 @@
|
||||
package cn.axzo.tyr.client.model.req;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import javax.validation.constraints.NotBlank;
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/14
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PageElementReportReq {
|
||||
|
||||
/**
|
||||
* 端
|
||||
*/
|
||||
@NotBlank(message = "端信息不能为空")
|
||||
private String terminal;
|
||||
|
||||
/**
|
||||
* 页面元素列表
|
||||
*/
|
||||
@NotEmpty(message = "页面元素不能为空")
|
||||
private List<PageElement> pageElements;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class PageElement {
|
||||
|
||||
/**
|
||||
* 元素编码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 元素名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 元素类型(PAGE:页面,COMPONENT:页面里的组件)
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 路由地址
|
||||
*/
|
||||
private String linkUrl;
|
||||
|
||||
/**
|
||||
* 子元素(只包含一级)
|
||||
*/
|
||||
private List<PageElement> children;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,50 @@
|
||||
package cn.axzo.tyr.client.model.res;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/14
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class PageElementResp {
|
||||
|
||||
/**
|
||||
* 元素ID
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 元素编码
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 元素名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 元素类型
|
||||
*/
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 是否已勾选
|
||||
*/
|
||||
private Boolean selected;
|
||||
|
||||
/**
|
||||
* 子元素(只包含一级)
|
||||
*/
|
||||
private List<PageElementResp> children;
|
||||
}
|
||||
@ -1,6 +1,10 @@
|
||||
package cn.axzo.tyr.server.controller;
|
||||
|
||||
import cn.axzo.basics.common.constant.enums.DeleteEnum;
|
||||
import cn.axzo.basics.common.constant.enums.TableIsDeleteEnum;
|
||||
import cn.axzo.basics.common.util.TreeUtil;
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.tyr.client.model.req.CommonDictQueryReq;
|
||||
import cn.axzo.tyr.client.model.req.GetFeatureResourceTreeReq;
|
||||
@ -21,6 +25,8 @@ import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasRole;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasRoleGroup;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasRoleGroupRelation;
|
||||
import cn.axzo.tyr.server.repository.dao.*;
|
||||
import cn.axzo.tyr.server.repository.entity.*;
|
||||
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
|
||||
import cn.axzo.tyr.server.service.RolePermissionCacheService;
|
||||
import cn.axzo.tyr.server.service.RoleService;
|
||||
@ -30,6 +36,7 @@ import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
|
||||
import cn.axzo.tyr.server.service.SaasRoleGroupService;
|
||||
import cn.axzo.tyr.server.service.TyrSaasAuthService;
|
||||
import cn.axzo.tyr.server.service.impl.SaasFeatureResourceCacheService;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
@ -88,6 +95,12 @@ public class PrivateController {
|
||||
private SaasFeatureDao saasFeatureDao;
|
||||
@Autowired
|
||||
private SaasPgroupPermissionRelationService saasPgroupPermissionRelationService;
|
||||
@Autowired
|
||||
private SaasRoleDao saasRoleDao;
|
||||
@Autowired
|
||||
private SaasPgroupRoleRelationDao saasPgroupRoleRelationDao;
|
||||
@Autowired
|
||||
private SaasPgroupPermissionRelationDao saasPgroupPermissionRelationDao;
|
||||
|
||||
|
||||
|
||||
@ -294,6 +307,48 @@ public class PrivateController {
|
||||
return tyrSaasAuthService.authPermission(request);
|
||||
}
|
||||
|
||||
@PostMapping("/api/private/pgroupPermissionRelation/refresh")
|
||||
public ApiResult<Void> refreshPgroupPermissionRelation(@Validated @RequestBody RefreshPgroupPermissionRelationParam request) {
|
||||
List<Integer> workspaceTypes = Lists.newArrayList(3,6);
|
||||
if (!workspaceTypes.contains(request.getWorkspaceType())) {
|
||||
return ApiResult.err("非oms、政务的角色,不能清洗。");
|
||||
}
|
||||
|
||||
Long startRoleId = 0L;
|
||||
while (true) {
|
||||
List<SaasRole> saasRoles = saasRoleDao.lambdaQuery()
|
||||
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
|
||||
.eq(SaasRole::getWorkspaceType, request.getWorkspaceType())
|
||||
.gt(BaseEntity::getId, startRoleId)
|
||||
.orderByAsc(BaseEntity::getId)
|
||||
.last("LIMIT " + request.getPageSize())
|
||||
.list();
|
||||
if (CollectionUtils.isEmpty(saasRoles)) {
|
||||
return ApiResult.ok();
|
||||
}
|
||||
processRole(saasRoles.stream().map(BaseEntity::getId).collect(Collectors.toList()));
|
||||
|
||||
startRoleId = saasRoles.get(saasRoles.size() - 1).getId();
|
||||
}
|
||||
}
|
||||
|
||||
private void processRole(List<Long> roleIds) {
|
||||
List<SaasPgroupRoleRelation> saasPgroupRoleRelations = saasPgroupRoleRelationDao.findByRoleIds(roleIds);
|
||||
if (CollectionUtils.isEmpty(saasPgroupRoleRelations)) {
|
||||
log.info("refreshPgroupPermissionRelation roleIds:{} has no pgroup role relation", JSON.toJSONString(roleIds));
|
||||
return;
|
||||
}
|
||||
List<Long> groupIds = saasPgroupRoleRelations.stream().map(SaasPgroupRoleRelation::getGroupId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(groupIds)) {
|
||||
return;
|
||||
}
|
||||
saasPgroupPermissionRelationDao.lambdaUpdate()
|
||||
.eq(BaseEntity::getIsDelete, TableIsDeleteEnum.NORMAL.value)
|
||||
.in(SaasPgroupPermissionRelation::getGroupId, groupIds)
|
||||
.set(SaasPgroupPermissionRelation::getType, 1)
|
||||
.update();
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新saas_pgroup_permission_relation表的featureType
|
||||
* 1、type = 0的数据从saas_feature中查询
|
||||
@ -407,6 +462,18 @@ public class PrivateController {
|
||||
private Long rootId;
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class RefreshPgroupPermissionRelationParam {
|
||||
|
||||
@NotNull(message = "workspaceType不能为空,(oms:6,政务:3)")
|
||||
private Integer workspaceType;
|
||||
@Builder.Default
|
||||
private Integer pageSize = 10;
|
||||
}
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
|
||||
@ -0,0 +1,37 @@
|
||||
package cn.axzo.tyr.server.controller.permission;
|
||||
|
||||
import cn.axzo.framework.domain.web.result.ApiResult;
|
||||
import cn.axzo.tyr.client.feign.PageElementApi;
|
||||
import cn.axzo.tyr.client.model.req.GetPageElementReq;
|
||||
import cn.axzo.tyr.client.model.req.PageElementReportReq;
|
||||
import cn.axzo.tyr.client.model.res.PageElementResp;
|
||||
import cn.axzo.tyr.server.service.SaasPageElementService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Slf4j
|
||||
@RestController
|
||||
@RequiredArgsConstructor
|
||||
public class PageElementController implements PageElementApi {
|
||||
|
||||
private final SaasPageElementService saasPageElementService;
|
||||
|
||||
@Override
|
||||
public ApiResult<Void> report(PageElementReportReq req) {
|
||||
saasPageElementService.report(req);
|
||||
return ApiResult.ok();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ApiResult<List<PageElementResp>> getPageElement(GetPageElementReq req) {
|
||||
return ApiResult.ok(saasPageElementService.getPageElement(req));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,43 @@
|
||||
package cn.axzo.tyr.server.repository.dao;
|
||||
|
||||
import cn.axzo.basics.common.constant.enums.DeleteEnum;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
|
||||
import cn.axzo.tyr.server.repository.mapper.SaasPageElementMapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Repository
|
||||
public class SaasPageElementDao extends ServiceImpl<SaasPageElementMapper, SaasPageElement> {
|
||||
|
||||
public void deleteAllByTerminal(String terminal) {
|
||||
lambdaUpdate()
|
||||
.eq(SaasPageElement::getTerminal, terminal)
|
||||
.set(SaasPageElement::getIsDelete, DeleteEnum.DELETE.getValue())
|
||||
.update();
|
||||
}
|
||||
|
||||
public List<SaasPageElement> listByCodes(List<String> codes, String terminal) {
|
||||
return lambdaQuery()
|
||||
.eq(SaasPageElement::getTerminal, terminal)
|
||||
.in(SaasPageElement::getCode, codes)
|
||||
.list();
|
||||
}
|
||||
|
||||
public List<SaasPageElement> listByGroupCodesAndExcludeIds(List<String> groupCodes, List<Long> excludeIds, String terminal) {
|
||||
return lambdaQuery()
|
||||
.eq(SaasPageElement::getTerminal, terminal)
|
||||
.in(SaasPageElement::getGroupCode, groupCodes)
|
||||
.notIn(CollectionUtils.isNotEmpty(excludeIds), SaasPageElement::getId, excludeIds)
|
||||
.list();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,32 @@
|
||||
package cn.axzo.tyr.server.repository.dao;
|
||||
|
||||
import cn.axzo.basics.common.constant.enums.DeleteEnum;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
|
||||
import cn.axzo.tyr.server.repository.mapper.SaasPageElementFeatureResourceRelationMapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Repository
|
||||
public class SaasPageElementFeatureResourceRelationDao extends ServiceImpl<SaasPageElementFeatureResourceRelationMapper, SaasPageElementFeatureResourceRelation> {
|
||||
|
||||
public List<SaasPageElementFeatureResourceRelation> listByPageElementCode(String pageElementCode) {
|
||||
return lambdaQuery()
|
||||
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
|
||||
.eq(SaasPageElementFeatureResourceRelation::getPageElementCode, pageElementCode)
|
||||
.list();
|
||||
}
|
||||
public List<SaasPageElementFeatureResourceRelation> listByFeatureUniCodeAndTerminal(String featureResourceUniCode, String terminal) {
|
||||
return lambdaQuery()
|
||||
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
|
||||
.eq(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode, featureResourceUniCode)
|
||||
.eq(SaasPageElementFeatureResourceRelation::getTerminal, terminal)
|
||||
.list();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,58 @@
|
||||
package cn.axzo.tyr.server.repository.entity;
|
||||
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.*;
|
||||
|
||||
/**
|
||||
* 页面元素表
|
||||
*
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
@Builder
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("saas_page_element")
|
||||
public class SaasPageElement extends BaseEntity<SaasPageElement> {
|
||||
|
||||
/**
|
||||
* 元素的组编码
|
||||
*/
|
||||
@TableField("group_code")
|
||||
private String groupCode;
|
||||
|
||||
/**
|
||||
* 页面、元素编码
|
||||
*/
|
||||
@TableField("code")
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 页面、元素名称
|
||||
*/
|
||||
@TableField("name")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* 页面、元素类型(PAGE:页面,COMPONENT:组件)
|
||||
*/
|
||||
@TableField("type")
|
||||
private String type;
|
||||
|
||||
/**
|
||||
* 页面路由地址
|
||||
*/
|
||||
@TableField("link_url")
|
||||
private String linkUr;
|
||||
|
||||
/**
|
||||
* 所属端
|
||||
*/
|
||||
@TableField("terminal")
|
||||
private String terminal;
|
||||
}
|
||||
@ -0,0 +1,54 @@
|
||||
package cn.axzo.tyr.server.repository.entity;
|
||||
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.Getter;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
/**
|
||||
* 页面元素与菜单组件关系表
|
||||
*
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@TableName("saas_page_element_feature_resource_relation")
|
||||
public class SaasPageElementFeatureResourceRelation extends BaseEntity<SaasPageElementFeatureResourceRelation> {
|
||||
|
||||
/**
|
||||
* 页面元素code
|
||||
*/
|
||||
@TableField("page_element_code")
|
||||
private String pageElementCode;
|
||||
|
||||
/**
|
||||
* 菜单组件code
|
||||
*/
|
||||
@TableField("feature_resource_uni_code")
|
||||
private String featureResourceUniCode;
|
||||
|
||||
/**
|
||||
* 所属端
|
||||
*/
|
||||
@TableField("terminal")
|
||||
private String terminal;
|
||||
|
||||
/**
|
||||
* 创建人
|
||||
*/
|
||||
@TableField("create_by")
|
||||
private Long createBy;
|
||||
|
||||
/**
|
||||
* 更新人
|
||||
*/
|
||||
@TableField("update_by")
|
||||
private Long updateBy;
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
package cn.axzo.tyr.server.repository.mapper;
|
||||
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
public interface SaasPageElementFeatureResourceRelationMapper extends BaseMapper<SaasPageElementFeatureResourceRelation> {
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,9 @@
|
||||
package cn.axzo.tyr.server.repository.mapper;
|
||||
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
|
||||
public interface SaasPageElementMapper extends BaseMapper<SaasPageElement> {
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
package cn.axzo.tyr.server.service;
|
||||
|
||||
import cn.axzo.tyr.client.model.req.GetPageElementReq;
|
||||
import cn.axzo.tyr.client.model.req.PageElementReportReq;
|
||||
import cn.axzo.tyr.client.model.res.PageElementResp;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
public interface SaasPageElementService {
|
||||
|
||||
/**
|
||||
* 页面元素上报
|
||||
*
|
||||
* @param request 上报元素列表
|
||||
*/
|
||||
void report(PageElementReportReq request);
|
||||
|
||||
/**
|
||||
* 查询页面已配置的元素
|
||||
*
|
||||
* @param request
|
||||
* @return
|
||||
*/
|
||||
List<PageElementResp> getPageElement(GetPageElementReq request);
|
||||
}
|
||||
@ -0,0 +1,185 @@
|
||||
package cn.axzo.tyr.server.service.impl;
|
||||
|
||||
import cn.axzo.basics.common.util.AssertUtil;
|
||||
import cn.axzo.basics.common.util.StopWatchUtil;
|
||||
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
|
||||
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
|
||||
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
|
||||
import cn.axzo.tyr.client.model.req.GetPageElementReq;
|
||||
import cn.axzo.tyr.client.model.req.PageElementReportReq;
|
||||
import cn.axzo.tyr.client.model.res.PageElementResp;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasPageElementDao;
|
||||
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasFeatureResource;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
|
||||
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
|
||||
import cn.axzo.tyr.server.service.SaasPageElementService;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author likunpeng
|
||||
* @version 1.0
|
||||
* @date 2024/6/18
|
||||
*/
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class SaasPageElementServiceImpl implements SaasPageElementService {
|
||||
|
||||
private final SaasPageElementDao saasPageElementDao;
|
||||
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
|
||||
private final SaasFeatureResourceDao saasFeatureResourceDao;
|
||||
|
||||
@Qualifier("asyncExecutor")
|
||||
@Autowired
|
||||
private ExecutorService asyncExecutor;
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void report(PageElementReportReq request) {
|
||||
StopWatchUtil watch = StopWatchUtil.createStarted("saasPageElement-report");
|
||||
watch.start("report");
|
||||
// 根据端删除所有的元素
|
||||
saasPageElementDao.deleteAllByTerminal(request.getTerminal());
|
||||
|
||||
List<SaasPageElement> pageElements = processParam2Entities(request);
|
||||
// 减少数据库的IO,分批写入
|
||||
Lists.partition(pageElements,500).forEach(saasPageElementDao::saveBatch);
|
||||
|
||||
// 页面路由处理,如果绑定了saas_feature_resource,页面的路由更新到对应的字段,为性能考虑,异步处理
|
||||
CompletableFuture.runAsync(() -> processPageLinkUrl(request), asyncExecutor).whenComplete((t, ex) -> log.info("更新表saas_feature_resource的页面路由完成。"));
|
||||
|
||||
watch.stop();
|
||||
log.info("saasPageElement-report cost:{} , ms:{}", watch.prettyPrint(), watch.getTotalTimeMillis());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PageElementResp> getPageElement(GetPageElementReq request) {
|
||||
SaasFeatureResource saasFeatureResource = saasFeatureResourceDao.lambdaQuery()
|
||||
.eq(BaseEntity::getIsDelete,0)
|
||||
.eq(SaasFeatureResource::getId, request.getFeatureResourceId())
|
||||
.one();
|
||||
AssertUtil.notNull(saasFeatureResource, "页面或组件信息不存在");
|
||||
|
||||
List<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationDao.listByFeatureUniCodeAndTerminal(saasFeatureResource.getUniCode(), saasFeatureResource.getTerminal());
|
||||
if (CollectionUtils.isEmpty(relations)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<SaasPageElement> selectedPageElements = saasPageElementDao.listByCodes(relations.stream().map(SaasPageElementFeatureResourceRelation::getPageElementCode).collect(Collectors.toList()), saasFeatureResource.getTerminal());
|
||||
if (CollectionUtils.isEmpty(selectedPageElements)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
List<Long> selectedIds = selectedPageElements.stream().map(BaseEntity::getId).collect(Collectors.toList());
|
||||
|
||||
// 如果查询不仅仅是已勾选的,需要把已勾选的页面下未选择的组件也返回
|
||||
if (!Boolean.TRUE.equals(request.getQuerySelectedOnly())) {
|
||||
List<String> pageTypeCodes = selectedPageElements.stream().filter(e -> PageElementTypeEnum.PAGE.getCode().equals(e.getType())).map(SaasPageElement::getGroupCode).collect(Collectors.toList());
|
||||
List<SaasPageElement> notSelectedComponents = saasPageElementDao.listByGroupCodesAndExcludeIds(pageTypeCodes, selectedIds, saasFeatureResource.getTerminal());
|
||||
if (CollectionUtils.isNotEmpty(notSelectedComponents)) {
|
||||
selectedPageElements.addAll(notSelectedComponents);
|
||||
}
|
||||
}
|
||||
return change2PageElementResp(selectedPageElements, selectedIds);
|
||||
}
|
||||
|
||||
private List<SaasPageElement> processParam2Entities(PageElementReportReq request) {
|
||||
List<SaasPageElement> saasPageElements = Lists.newArrayList();
|
||||
|
||||
for (PageElementReportReq.PageElement pageElement : request.getPageElements()) {
|
||||
saasPageElements.add(SaasPageElement.builder()
|
||||
.terminal(request.getTerminal())
|
||||
.groupCode(pageElement.getCode())
|
||||
.code(pageElement.getCode())
|
||||
.type(pageElement.getType())
|
||||
.name(pageElement.getName())
|
||||
.linkUr(pageElement.getLinkUrl())
|
||||
.build());
|
||||
|
||||
if (CollectionUtils.isNotEmpty(pageElement.getChildren())) {
|
||||
saasPageElements.addAll(pageElement.getChildren().stream().map(e -> SaasPageElement.builder()
|
||||
.terminal(request.getTerminal())
|
||||
.groupCode(pageElement.getCode())
|
||||
.code(e.getCode())
|
||||
.type(e.getType())
|
||||
.name(e.getName())
|
||||
.build()).collect(Collectors.toList()));
|
||||
}
|
||||
}
|
||||
return saasPageElements;
|
||||
}
|
||||
|
||||
private void processPageLinkUrl(PageElementReportReq request) {
|
||||
for (PageElementReportReq.PageElement pageElement : request.getPageElements()) {
|
||||
if (StringUtils.isBlank(pageElement.getLinkUrl())) {
|
||||
continue;
|
||||
}
|
||||
List<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationDao.listByPageElementCode(pageElement.getCode());
|
||||
if (CollectionUtils.isEmpty(relations)) {
|
||||
continue;
|
||||
}
|
||||
SaasFeatureResource saasFeatureResource = saasFeatureResourceDao.lambdaQuery()
|
||||
.eq(SaasFeatureResource::getUniCode, relations.get(0).getFeatureResourceUniCode())
|
||||
.eq(SaasFeatureResource::getTerminal, request.getTerminal())
|
||||
.one();
|
||||
if (Objects.isNull(saasFeatureResource)
|
||||
|| !FeatureResourceType.PAGE.getCode().equals(saasFeatureResource.getFeatureType())
|
||||
|| pageElement.getLinkUrl().equals(saasFeatureResource.getLinkUrl())) {
|
||||
continue;
|
||||
}
|
||||
saasFeatureResourceDao.lambdaUpdate()
|
||||
.eq(BaseEntity::getId, saasFeatureResource.getId())
|
||||
.set(SaasFeatureResource::getLinkUrl, pageElement.getLinkUrl())
|
||||
.update();
|
||||
}
|
||||
}
|
||||
|
||||
private List<PageElementResp> change2PageElementResp(List<SaasPageElement> pageElements, List<Long> selectedIds) {
|
||||
if (CollectionUtils.isEmpty(pageElements)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<PageElementResp> pageTypeElements = pageElements.stream().filter(e -> PageElementTypeEnum.PAGE.getCode().equals(e.getType()))
|
||||
.map(e -> PageElementResp.builder()
|
||||
.id(e.getId())
|
||||
.code(e.getCode())
|
||||
.name(e.getName())
|
||||
.type(e.getType())
|
||||
.selected(selectedIds.contains(e.getId()))
|
||||
.children(Lists.newArrayList())
|
||||
.build()).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(pageTypeElements)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
Map<String, PageElementResp> pageTypeCodeMap = pageTypeElements.stream().collect(Collectors.toMap(PageElementResp::getCode, Function.identity(), (v1, v2) -> v1));
|
||||
pageElements.stream().filter(e -> PageElementTypeEnum.COMPONENT.getCode().equals(e.getType())).forEach(e -> {
|
||||
PageElementResp pageTypeElement = pageTypeCodeMap.get(e.getGroupCode());
|
||||
if (Objects.nonNull(pageTypeElement)) {
|
||||
pageTypeElement.getChildren().add(PageElementResp.builder()
|
||||
.id(e.getId())
|
||||
.code(e.getCode())
|
||||
.name(e.getName())
|
||||
.type(e.getType())
|
||||
.selected(selectedIds.contains(e.getId()))
|
||||
.build());
|
||||
}
|
||||
});
|
||||
|
||||
return pageTypeElements;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user