Merge branch 'feature/REQ-2899' into 'master'

Feature/req 2899

See merge request universal/infrastructure/backend/tyr!199
This commit is contained in:
李龙 2024-09-18 11:39:55 +00:00
commit b62eabdef4
27 changed files with 1373 additions and 31 deletions

View File

@ -0,0 +1,16 @@
package cn.axzo.tyr.client.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author likunpeng
* @version 1.0
* @date 2024/9/5
*/
@Getter
@AllArgsConstructor
public enum PageElementAppTypeEnum {
PC,H5,APP;
}

View File

@ -93,6 +93,26 @@ public enum PermissionRelationOperateLogSceneEnum {
*/
OMS_API_SYNC("OMS_API_SYNC", "oms后台同步API"),
/**
* oms新增编辑元素类型
*/
OMS_UPSERT_PAGE_ELEMENT_CATEGORY("OMS_UPSERT_PAGE_ELEMENT_CATEGORY", "oms新增、编辑元素类型"),
/**
* oms删除元素类型
*/
OMS_DELETE_PAGE_ELEMENT_CATEGORY("OMS_DELETE_PAGE_ELEMENT_CATEGORY", "oms删除元素类型"),
/**
* oms新增编辑页面元素
*/
OMS_UPSERT_PAGE_ELEMENT("OMS_UPSERT_PAGE_ELEMENT", "oms新增、编辑页面元素"),
/**
* oms删除页面元素
*/
OMS_DELETE_PAGE_ELEMENT("OMS_DELETE_PAGE_ELEMENT", "oms删除页面元素"),
;
@EnumValue

View File

@ -1,11 +1,9 @@
package cn.axzo.tyr.client.feign;
import cn.axzo.framework.domain.page.Page;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.res.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -37,7 +35,7 @@ public interface PageElementApi {
/** 分页查询页面资源 **/
@PostMapping("/api/pageElement/page")
ApiPageResult<PageElementResp> page(@RequestBody @Valid PageQueryElementReq req);
ApiPageResult<PageElementCategoryAndElementResp> page(@RequestBody @Valid PageQueryElementReq req);
/** 根据用户传入的页面code查询用户有权限的元素code **/
@PostMapping("/api/pageElement/getUserHasPermissionPageElement")
@ -45,4 +43,36 @@ public interface PageElementApi {
@PostMapping("/api/pageElement/list")
ApiResult<List<PageElementResp>> list(PageElementReq param);
/** 查询页面元素类型(按端分组) **/
@PostMapping("/api/pageElementCategory/list")
ApiResult<List<ListPageElementCategoryResp>> listPageElementCategory();
/** 新增、编辑页面元素类型 **/
@PostMapping("/api/pageElementCategory/saveOrUpdate")
ApiResult<Long> saveOrUpdateCategory(@RequestBody @Valid SaveOrUpdatePageElementCategoryReq req);
/** 删除页面元素类型 **/
@PostMapping("/api/pageElementCategory/delete")
ApiResult<Void> deleteCategory(@RequestBody @Valid DeletePageElementCategoryReq req);
/** 分页查询页面资源V2 **/
@PostMapping("/api/pageElement/pageV2")
ApiPageResult<PageElementResp> pageV2(@RequestBody @Valid PageQueryElementV2Req req);
/** 新增、编辑页面元素 **/
@PostMapping("/api/pageElement/saveOrUpdate")
ApiResult<Void> saveOrUpdate(@RequestBody @Valid SaveOrUpdatePageElementReq req);
/** 删除页面元素 **/
@PostMapping("/api/pageElement/delete")
ApiResult<Void> delete(@RequestBody @Valid DeletePageElementReq req);
/** 查询页面元素关联关系 **/
@PostMapping("/api/pageElement/getFeatureResourceRelations")
ApiResult<List<PageElementRelationFeatureResourceResp>> getFeatureResourceRelations(@RequestBody @Valid IdReq req);
/** 查询页面元素关联关系 **/
@PostMapping("/api/pageElement/importData")
ApiResult<Void> importData(@RequestBody @Valid List<PageElementImportDataReq> req);
}

View File

@ -0,0 +1,29 @@
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.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeletePageElementCategoryReq {
@NotNull(message = "ID不能为空")
@Min(value = 1, message = "ID有误")
private Long id;
/** 操作人personId **/
private Long operatorId;
}

View File

@ -0,0 +1,29 @@
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.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DeletePageElementReq {
@NotNull(message = "ID不能为空")
@Min(value = 1, message = "ID有误")
private Long id;
/** 操作人personId **/
private Long operatorId;
}

View File

@ -0,0 +1,25 @@
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/8/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IdReq {
@NotNull(message = "ID不能为空")
@Min(value = 1, message = "ID有误")
private Long id;
}

View File

@ -0,0 +1,86 @@
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 java.io.Serializable;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/29
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageElementImportDataReq implements Serializable {
/**
*
*/
@NotBlank(message = "端信息不能为空")
private String terminal;
/**
* 元素分类
*/
@NotBlank(message = "元素分类不能为空")
private String itemCode;
/**
* 元素组编码
*/
@NotBlank(message = "元素组编码不能为空")
private String groupCode;
/**
* 元素编码
*/
@NotBlank(message = "元素编码不能为空")
private String code;
/**
* 元素名称
*/
@NotBlank(message = "元素名称不能为空")
private String name;
/**
* 元素类型PAGE:页面COMPONENT:页面里的组件
*/
@NotBlank(message = "元素类型不能为空")
private String type;
/**
* 元素资源类型APPH5PC
*/
@NotBlank(message = "元素资源类型不能为空")
private String appType;
/**
* H5的appId
*/
private String appId;
/**
* 元素支持的最低版本号
*/
private Integer version;
/**
* 路由地址
*/
private String linkUrl;
/** ios跳转地址 **/
private String iosRouterUrl;
/** android跳转地址 **/
private String androidRouterUrl;
private Long operatorId;
}

View File

@ -0,0 +1,70 @@
package cn.axzo.tyr.client.model.req;
import cn.axzo.framework.domain.page.PageResp;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Collections;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/14
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageQueryElementV2Req {
private Long id;
/**
* 业务编码
*/
private String itemCode;
/**
*
*/
private String terminal;
/**
* 页面元素组件类型
*/
private List<String> elementTypes;
/**
* 页面元素名称
*/
private String pageElementCodeOrName;
/**
* 页面元素名称
*/
private String pageElementGroupCodeOrName;
/**
* 页码
*/
@Builder.Default
private Long page = 1L;
/**
* 每页大小
*/
@Builder.Default
private Long pageSize = 20L;
public PageResp toEmpty() {
return PageResp.builder()
.page(this.getPage())
.pageSize(this.getPageSize())
.list(Collections.emptyList())
.totalCount(0L)
.build();
}
}

View File

@ -0,0 +1,38 @@
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.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SaveOrUpdatePageElementCategoryReq {
private Long id;
/** 项目编码 **/
private String itemCode;
/** 项目名称 **/
@NotBlank(message = "项目名称不能为空")
private String itemName;
/** 登录端 **/
@NotBlank(message = "所属端不能为空")
private String terminal;
/** 操作人personId **/
private Long operatorId;
}

View File

@ -0,0 +1,63 @@
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.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/21
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SaveOrUpdatePageElementReq {
private Long id;
/** 项目编码 **/
private String itemCode;
/** 分组ID **/
private String groupCode;
/** 页面元素类型PAGE/COMPONENT **/
@NotBlank(message = "页面元素类型不能为空")
private String type;
/** 项目编码 **/
@NotBlank(message = "项目编码不能为空")
private String code;
/** 元素名称 **/
@NotBlank(message = "元素名称不能为空")
private String name;
/** app类型APP:原生H5:h5页面, PC:web页面 **/
private String appType;
/** H5的appId **/
private String appId;
/** pc/h5路由地址 **/
private String linkUrl;
/** ios跳转地址 **/
private String iosRouterUrl;
/** android跳转地址 **/
private String androidRouterUrl;
/** 版本号 **/
private Integer version;
/** 操作人personId **/
private Long operatorId;
}

View File

@ -0,0 +1,41 @@
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/8/20
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ListPageElementCategoryResp {
/** 端 **/
private String terminal;
/** 页面元素类型列表 **/
private List<PageElementCategoryDTO> pageElementCategories;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class PageElementCategoryDTO {
/** 主键 **/
private Long id;
/** 项目编码 **/
private String itemCode;
/** 项目名称 **/
private String itemName;
/** 端 **/
private String terminal;
}
}

View File

@ -0,0 +1,26 @@
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/8/27
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageElementCategoryAndElementResp {
/** 项目编码 **/
private String itemCode;
/** 项目名称 **/
private String itemName;
/** 元素列表 **/
private List<PageElementResp> pageElements;
}

View File

@ -0,0 +1,82 @@
package cn.axzo.tyr.client.model.res;
import cn.axzo.basics.common.model.IBaseTree;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author likunpeng
* @date 2024/8/30
* @version 1.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageElementRelationFeatureResourceResp implements IBaseTree<PageElementRelationFeatureResourceResp, Long> {
private Long id;
/**
* 上级资源ID
*/
private Long parentId;
/**
* 资源编码-权限码
*/
private String uniCode;
/**
* 资源名称
*/
private String featureName;
/**
* 资源类型1-菜单 2-页面 3-应用入口 4-组件 5-root 6-分组
*/
private Integer featureType;
/**
* 子节点
*/
private List<PageElementRelationFeatureResourceResp> children;
/**
* 是否关联
*/
private Boolean hasRelation;
/**
* 1路由页面
*/
private Integer relationType;
@JsonIgnore
@Override
public Long getNodeCode() {
return this.getId();
}
@JsonIgnore
@Override
public Long getParentNodeCode() {
return this.getParentId();
}
@JsonIgnore
@Override
public List<PageElementRelationFeatureResourceResp> getNodeChildren() {
return this.children;
}
@Override
public void setNodeChildren(List<PageElementRelationFeatureResourceResp> nodeChildren) {
this.children = nodeChildren;
}
}

View File

@ -32,6 +32,11 @@ public class PageElementResp {
*/
private String groupCode;
/**
* 元素的组编码
*/
private String groupName;
/**
* 元素编码
*/
@ -67,7 +72,10 @@ public class PageElementResp {
*/
private Boolean selected;
/** 业务编码 **/
private String itemCode;
/** 业务名称 **/
private String itemName;
private String linkExt;
@ -81,6 +89,11 @@ public class PageElementResp {
*/
private List<SaasFeatureResourceResp> featureResources;
/** ios挑战地址 **/
private String iosRouterUrl;
/** android挑战地址 **/
private String androidRouterUrl;
@Data
@Builder

View File

@ -31,6 +31,7 @@ public class TyrServerDevApplication {
System.setProperty("spring.redis.host","172.16.2.23");
System.setProperty("xxl.job.admin.addresses","http://dev-xxl-job.axzo.cn/xxl-job-admin");
System.setProperty("rocketmq.name-server", "172.16.2.82:9876");
System.setProperty("spring.datasource.url", "jdbc:mysql://172.16.2.171:3306/pudge?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&serverTimezone=Asia/Shanghai&useSSL=true&verifyServerCertificate=false&rewriteBatchedStatements=true");
SpringApplication application = new SpringApplication(TyrServerDevApplication.class);
ApplicationContext applicationContext = application.run(args);
Environment env = applicationContext.getEnvironment();

View File

@ -10,6 +10,7 @@ import cn.axzo.tyr.client.model.res.FeatureResourceTreeNode;
import cn.axzo.tyr.server.service.FeatureResourceSyncService;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
@ -52,7 +53,7 @@ public class FeatureResourceController implements FeatureResourceApi {
@Override
public ApiResult<Long> saveMenu(FeatureResourceTreeSaveReq req) {
log.info("save feature resource req : " + req.toString());
log.info("save feature resource req : " + JSON.toJSONString(req));
Long featureId = featureResourceService.saveOrUpdateMenu(req);
log.info("save feature resource resp : " + featureId.toString());
return ApiResult.ok(featureId);

View File

@ -3,14 +3,9 @@ package cn.axzo.tyr.server.controller.permission;
import cn.axzo.framework.domain.web.result.ApiPageResult;
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.GetUserHasPermissionPageElementReq;
import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.req.PageElementReq;
import cn.axzo.tyr.client.model.req.PageQueryElementReq;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.*;
import cn.axzo.tyr.server.service.SaasPageElementCategoryService;
import cn.axzo.tyr.server.service.SaasPageElementService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -29,6 +24,7 @@ import java.util.List;
public class PageElementController implements PageElementApi {
private final SaasPageElementService saasPageElementService;
private final SaasPageElementCategoryService saasPageElementCategoryService;
@Override
public ApiResult<Void> report(PageElementReportReq req) {
@ -48,7 +44,7 @@ public class PageElementController implements PageElementApi {
}
@Override
public ApiPageResult<PageElementResp> page(PageQueryElementReq req) {
public ApiPageResult<PageElementCategoryAndElementResp> page(PageQueryElementReq req) {
return ApiPageResult.ok(saasPageElementService.page(req));
}
@ -61,4 +57,48 @@ public class PageElementController implements PageElementApi {
public ApiResult<List<PageElementResp>> list(PageElementReq param) {
return ApiResult.ok(saasPageElementService.list(param));
}
@Override
public ApiResult<List<ListPageElementCategoryResp>> listPageElementCategory() {
return ApiResult.ok(saasPageElementCategoryService.listGroupByTerminal());
}
@Override
public ApiResult<Long> saveOrUpdateCategory(SaveOrUpdatePageElementCategoryReq req) {
return ApiResult.ok(saasPageElementCategoryService.saveOrUpdate(req));
}
@Override
public ApiResult<Void> deleteCategory(DeletePageElementCategoryReq req) {
saasPageElementCategoryService.delete(req);
return ApiResult.ok();
}
@Override
public ApiPageResult<PageElementResp> pageV2(PageQueryElementV2Req req) {
return ApiPageResult.ok(saasPageElementService.pageV2(req));
}
@Override
public ApiResult<Void> saveOrUpdate(SaveOrUpdatePageElementReq req) {
saasPageElementService.saveOrUpdate(req);
return ApiResult.ok();
}
@Override
public ApiResult<Void> delete(DeletePageElementReq req) {
saasPageElementService.delete(req);
return ApiResult.ok();
}
@Override
public ApiResult<List<PageElementRelationFeatureResourceResp>> getFeatureResourceRelations(IdReq req) {
return ApiResult.ok(saasPageElementService.getFeatureResourceRelations(req.getId()));
}
@Override
public ApiResult<Void> importData(List<PageElementImportDataReq> req) {
saasPageElementService.importData(req);
return ApiResult.ok();
}
}

View File

@ -0,0 +1,15 @@
package cn.axzo.tyr.server.repository.dao;
import cn.axzo.tyr.server.repository.entity.SaasPageElementCategory;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementCategoryMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Repository;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/20
*/
@Repository
public class SaasPageElementCategoryDao extends ServiceImpl<SaasPageElementCategoryMapper, SaasPageElementCategory> {
}

View File

@ -1,6 +1,8 @@
package cn.axzo.tyr.server.repository.dao;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementMapper;
@ -41,4 +43,42 @@ public class SaasPageElementDao extends ServiceImpl<SaasPageElementMapper, SaasP
.notIn(CollectionUtils.isNotEmpty(excludeIds), SaasPageElement::getId, excludeIds)
.list();
}
public void updateItemNameByItemCode(String itemCode, String itemName, String terminal) {
lambdaUpdate()
.eq(SaasPageElement::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElement::getItemCode, itemCode)
.eq(SaasPageElement::getTerminal, terminal)
.set(SaasPageElement::getItemName, itemName)
.update();
}
public List<SaasPageElement> listByItemCodeAndTerminal(String itemCode, String terminal) {
return lambdaQuery()
.eq(SaasPageElement::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElement::getTerminal, terminal)
.eq(SaasPageElement::getItemCode, itemCode)
.list();
}
public void deleteIdsByTerminal(List<Long> ids, String terminal) {
if (CollectionUtils.isEmpty(ids)) {
return;
}
lambdaUpdate()
.eq(SaasPageElement::getTerminal, terminal)
.in(BaseEntity::getId, ids)
.set(SaasPageElement::getIsDelete, DeleteEnum.DELETE.getValue())
.update();
}
public void updateComponentsGroupCode(String oldGroupCode, String newGroupCode, String terminal) {
lambdaUpdate()
.eq(SaasPageElement::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElement::getTerminal, terminal)
.eq(SaasPageElement::getType, PageElementTypeEnum.COMPONENT.getCode())
.eq(SaasPageElement::getGroupCode, oldGroupCode)
.set(SaasPageElement::getGroupCode, newGroupCode)
.update();
}
}

View File

@ -2,6 +2,8 @@ package cn.axzo.tyr.server.repository.dao;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementFeatureResourceRelationMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -46,4 +48,23 @@ public class SaasPageElementFeatureResourceRelationDao extends ServiceImpl<SaasP
.set(Objects.nonNull(operatorId), SaasPageElementFeatureResourceRelation::getUpdateBy, operatorId)
.update();
}
public void deleteByTerminalAndPageElementCodes(String terminal, List<String> pageElementCodes, Long operatorId) {
lambdaUpdate()
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElementFeatureResourceRelation::getTerminal, terminal)
.in(SaasPageElementFeatureResourceRelation::getPageElementCode, pageElementCodes)
.set(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.DELETE.getValue())
.set(Objects.nonNull(operatorId), SaasPageElementFeatureResourceRelation::getUpdateBy, operatorId)
.update();
}
public void updateGroupCode(String oldGroupCode, String newGroupCode, String terminal) {
lambdaUpdate()
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElementFeatureResourceRelation::getTerminal, terminal)
.eq(SaasPageElementFeatureResourceRelation::getPageElementCode, oldGroupCode)
.set(SaasPageElementFeatureResourceRelation::getPageElementCode, newGroupCode)
.update();
}
}

View File

@ -0,0 +1,45 @@
package cn.axzo.tyr.server.repository.entity;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
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(value = "saas_page_element_category", autoResultMap = true)
public class SaasPageElementCategory extends BaseEntity<SaasPageElementCategory> {
/**
* 创建人
*/
private Long createBy;
/**
* 更新人
*/
private Long updateBy;
/**
* 项目codeH5会拉取项目下所有的元素
*/
private String itemCode;
/**
* 项目名称
*/
private String itemName;
/**
* 所属端
*/
private String terminal;
}

View File

@ -0,0 +1,9 @@
package cn.axzo.tyr.server.repository.mapper;
import cn.axzo.tyr.server.repository.entity.SaasPageElementCategory;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface SaasPageElementCategoryMapper extends BaseMapper<SaasPageElementCategory> {
}

View File

@ -0,0 +1,21 @@
package cn.axzo.tyr.server.service;
import cn.axzo.tyr.client.model.req.DeletePageElementCategoryReq;
import cn.axzo.tyr.client.model.req.SaveOrUpdatePageElementCategoryReq;
import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp;
import java.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/20
*/
public interface SaasPageElementCategoryService {
List<ListPageElementCategoryResp> listGroupByTerminal();
Long saveOrUpdate(SaveOrUpdatePageElementCategoryReq req);
void delete(DeletePageElementCategoryReq req);
}

View File

@ -1,15 +1,8 @@
package cn.axzo.tyr.server.service;
import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.GetUserHasPermissionPageElementReq;
import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.req.PageElementReq;
import cn.axzo.tyr.client.model.req.PageQueryElementReq;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.*;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import com.baomidou.mybatisplus.extension.service.IService;
@ -68,7 +61,7 @@ public interface SaasPageElementService extends IService<SaasPageElement> {
* @param request 查询条件
* @return
*/
PageResp<PageElementResp> page(PageQueryElementReq request);
PageResp<PageElementCategoryAndElementResp> page(PageQueryElementReq request);
/**
* 根据用户传入的页面code查询用户有权限的元素code
@ -82,4 +75,14 @@ public interface SaasPageElementService extends IService<SaasPageElement> {
List<PageElementResp> list(PageElementReq param);
cn.axzo.foundation.page.PageResp<PageElementResp> page(PageElementReq param);
PageResp<PageElementResp> pageV2(PageQueryElementV2Req req);
Long saveOrUpdate(SaveOrUpdatePageElementReq req);
void delete(DeletePageElementReq req);
List<PageElementRelationFeatureResourceResp> getFeatureResourceRelations(Long pageElementId);
void importData(List<PageElementImportDataReq> req);
}

View File

@ -283,8 +283,13 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
} else {
//补充path
SaasFeatureResource newValue = featureResourceDao.getById(baseResource.getId());
SaasFeatureResource dbResource = featureResourceDao.getById(req.getId());
baseResource.setPath(dbResource.getPath());
if (Objects.nonNull(req.getParentId())) {
SaasFeatureResource parent = featureResourceDao.lambdaQuery().eq(SaasFeatureResource::getId,req.getParentId()).one();
baseResource.setPath(StringUtils.isBlank(parent.getPath()) ? baseResource.getId().toString() + "," : parent.getPath() + baseResource.getId() + ",");
} else {
SaasFeatureResource dbResource = featureResourceDao.getById(req.getId());
baseResource.setPath(dbResource.getPath());
}
baseResource.setFeatureCode(req.getUniCode());
featureResourceDao.updateById(baseResource);
@ -368,7 +373,8 @@ public class SaasFeatureResourceServiceImpl extends ServiceImpl<SaasFeatureResou
validFeatureName(saasFeatureResource);
if (saasFeatureResource.getId() != null) {
SaasFeatureResource dbResource = featureResourceDao.getById(saasFeatureResource.getId());
saasFeatureResource.setPath(dbResource.getPath());
// saasFeatureResource.setPath(dbResource.getPath());
saasFeatureResource.setPath(StringUtils.isBlank(parentPath) ? dbResource.getPath() : parentPath + dbResource.getId() + ",");
saasFeatureResource.setFeatureCode(featureComponentSaveReq.getUniCode());
featureResourceDao.updateById(saasFeatureResource);
} else {

View File

@ -0,0 +1,191 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.req.DeletePageElementCategoryReq;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.client.model.req.SaveOrUpdatePageElementCategoryReq;
import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp;
import cn.axzo.tyr.server.config.MqProducer;
import cn.axzo.tyr.server.event.payload.PageElementFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.repository.dao.SaasPageElementCategoryDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementFeatureResourceRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasPageElement;
import cn.axzo.tyr.server.repository.entity.SaasPageElementCategory;
import cn.axzo.tyr.server.service.SaasPageElementCategoryService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationOperateLogService;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import static cn.axzo.tyr.server.event.inner.EventTypeEnum.PAGE_ELEMENT_FEATURE_RESOURCE_UPSERT;
/**
* @author likunpeng
* @version 1.0
* @date 2024/8/20
*/
@Slf4j
@Service
@AllArgsConstructor
public class SaasPageElementCategoryServiceImpl implements SaasPageElementCategoryService {
public static final String PAGE_ELEMENT_CATEGORY_TABLE_NAME = "saas_page_element_category";
private static final String TARGET_TYPE = "pageElementFeatureResourceId";
private final SaasPageElementCategoryDao saasPageElementCategoryDao;
private final SaasPageElementDao saasPageElementDao;
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
private final MqProducer mqProducer;
@Override
public List<ListPageElementCategoryResp> listGroupByTerminal() {
List<ListPageElementCategoryResp> categoryResps = Lists.newArrayList();
List<SaasPageElementCategory> categories = saasPageElementCategoryDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.value)
.list();
if (CollectionUtils.isEmpty(categories)) {
return categoryResps;
}
Map<String, List<SaasPageElementCategory>> categoryMap = categories.stream().collect(Collectors.groupingBy(SaasPageElementCategory::getTerminal));
categoryMap.forEach((key, value) -> {
categoryResps.add(ListPageElementCategoryResp.builder().terminal(key)
.pageElementCategories(value.stream().map(c -> ListPageElementCategoryResp.PageElementCategoryDTO
.builder()
.id(c.getId())
.itemCode(c.getItemCode())
.itemName(c.getItemName())
.terminal(c.getTerminal())
.build()).collect(Collectors.toList())).build());
});
return categoryResps;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long saveOrUpdate(SaveOrUpdatePageElementCategoryReq req) {
SaasPageElementCategory baseCategory = SaasPageElementCategory.builder()
.itemName(req.getItemName())
.createBy(req.getOperatorId())
.updateBy(req.getOperatorId())
.build();
validItemName(req.getItemName(), req.getId());
if (Objects.nonNull(req.getId())) {
// 不允许编辑itemCoe不然端上查询权限点出问题
SaasPageElementCategory dbCategory = saasPageElementCategoryDao.getById(req.getId());
AssertUtil.notNull(dbCategory, "页面元素分类不存在");
baseCategory.setId(req.getId());
if (!dbCategory.getItemName().equals(req.getItemName())) {
// 更新saas_page_element的item_name
saasPageElementDao.updateItemNameByItemCode(dbCategory.getItemCode(), req.getItemName(), dbCategory.getTerminal());
}
saasPageElementCategoryDao.updateById(baseCategory);
} else {
AssertUtil.notEmpty(req.getItemCode(), "项目编码不能为空");
validItemCode(req.getItemCode());
baseCategory.setItemCode(req.getItemCode());
baseCategory.setTerminal(req.getTerminal());
saasPageElementCategoryDao.save(baseCategory);
}
try {
saveOrUpdateOperateLog(req, baseCategory);
} catch (Exception e) {
log.warn("save operate log error", e);
}
return baseCategory.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(DeletePageElementCategoryReq req) {
SaasPageElementCategory dbCategory = saasPageElementCategoryDao.getById(req.getId());
AssertUtil.notNull(dbCategory, "页面元素分类不存在");
saasPageElementCategoryDao.lambdaUpdate()
.eq(BaseEntity::getId, req.getId())
.set(SaasPageElementCategory::getIsDelete, DeleteEnum.DELETE.getValue())
.set(SaasPageElementCategory::getUpdateBy, req.getOperatorId())
.update();
// 删除页面元素
List<SaasPageElement> pageElements = saasPageElementDao.listByItemCodeAndTerminal(dbCategory.getItemCode(), dbCategory.getTerminal());
if (CollectionUtils.isEmpty(pageElements)) {
return;
}
List<Long> pageElementIds = pageElements.stream().map(BaseEntity::getId).collect(Collectors.toList());
saasPageElementDao.deleteIdsByTerminal(pageElementIds, dbCategory.getTerminal());
// 删除页面元素绑定关系
List<String> pageElementCodes = pageElements.stream().map(SaasPageElement::getCode).collect(Collectors.toList());
saasPageElementFeatureResourceRelationDao.deleteByTerminalAndPageElementCodes(dbCategory.getTerminal(), pageElementCodes, req.getOperatorId());
try {
saveDeleteOperateLog(req, dbCategory);
} catch (Exception e) {
log.warn("save operate log error", e);
}
Event event = Event.builder()
.targetType(TARGET_TYPE)
.eventCode(PAGE_ELEMENT_FEATURE_RESOURCE_UPSERT.getEventCode())
.data(PageElementFeatureResourceUpsertPayload.builder()
.terminal(dbCategory.getTerminal())
.build())
.build();
mqProducer.send(event);
}
private void validItemCode(String itemCode) {
List<SaasPageElementCategory> categories = saasPageElementCategoryDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.value)
.eq(SaasPageElementCategory::getItemCode, itemCode)
.list();
AssertUtil.isEmpty(categories, "项目编码已存在");
}
private void validItemName(String itemName, Long categoryId) {
List<SaasPageElementCategory> categories = saasPageElementCategoryDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.value)
.eq(SaasPageElementCategory::getItemName, itemName)
.ne(Objects.nonNull(categoryId), BaseEntity::getId, categoryId)
.list();
AssertUtil.isEmpty(categories, "项目名称已存在");
}
private void saveOrUpdateOperateLog(SaveOrUpdatePageElementCategoryReq req, SaasPageElementCategory baseCategory) {
saasPgroupPermissionRelationOperateLogService.save(PermissionOperateLogReq.builder()
.tableName(PAGE_ELEMENT_CATEGORY_TABLE_NAME)
.operatorId(req.getOperatorId())
.scene(PermissionRelationOperateLogSceneEnum.OMS_UPSERT_PAGE_ELEMENT_CATEGORY.getValue())
.sceneId(baseCategory.getId().toString())
.requestData(req)
.operateData(baseCategory)
.build());
}
private void saveDeleteOperateLog(DeletePageElementCategoryReq req, SaasPageElementCategory baseCategory) {
saasPgroupPermissionRelationOperateLogService.save(PermissionOperateLogReq.builder()
.tableName(PAGE_ELEMENT_CATEGORY_TABLE_NAME)
.operatorId(req.getOperatorId())
.scene(PermissionRelationOperateLogSceneEnum.OMS_DELETE_PAGE_ELEMENT_CATEGORY.getValue())
.sceneId(baseCategory.getId().toString())
.requestData(req)
.operateData(baseCategory)
.build());
}
}

View File

@ -1,8 +1,10 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.basics.common.BeanMapper;
import cn.axzo.basics.common.constant.enums.DeleteEnum;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.basics.common.util.StopWatchUtil;
import cn.axzo.basics.common.util.TreeUtil;
import cn.axzo.basics.profiles.api.UserProfileServiceApi;
import cn.axzo.basics.profiles.dto.basic.PersonProfileDto;
import cn.axzo.foundation.dao.support.converter.PageConverter;
@ -12,31 +14,41 @@ import cn.axzo.framework.domain.page.PageResp;
import cn.axzo.framework.rocketmq.Event;
import cn.axzo.pokonyan.config.mybatisplus.BaseEntity;
import cn.axzo.tyr.client.common.enums.FeatureResourceType;
import cn.axzo.tyr.client.common.enums.PageElementAppTypeEnum;
import cn.axzo.tyr.client.common.enums.PageElementFeatureResourceRelationTypeEnum;
import cn.axzo.tyr.client.common.enums.PageElementTypeEnum;
import cn.axzo.tyr.client.common.enums.PermissionRelationOperateLogSceneEnum;
import cn.axzo.tyr.client.model.req.DeletePageElementReq;
import cn.axzo.tyr.client.model.req.GetPageElementReq;
import cn.axzo.tyr.client.model.req.GetUserHasPermissionPageElementReq;
import cn.axzo.tyr.client.model.req.IdentityAuthReq;
import cn.axzo.tyr.client.model.req.ModifyPageElementRelationDTO;
import cn.axzo.tyr.client.model.req.PageElementFeatureResourceRelationReq;
import cn.axzo.tyr.client.model.req.PageElementImportDataReq;
import cn.axzo.tyr.client.model.req.PageElementReportReq;
import cn.axzo.tyr.client.model.req.PageElementReq;
import cn.axzo.tyr.client.model.req.PageQueryElementReq;
import cn.axzo.tyr.client.model.req.PageQueryElementV2Req;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.client.model.req.PermissionOperateLogReq;
import cn.axzo.tyr.client.model.req.SaveOrUpdatePageElementReq;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.IdentityAuthRes;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementCategoryAndElementResp;
import cn.axzo.tyr.client.model.res.PageElementRelationFeatureResourceResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.client.model.res.SaasFeatureResourceResp;
import cn.axzo.tyr.server.config.MqProducer;
import cn.axzo.tyr.server.event.payload.PageElementFeatureResourceUpsertPayload;
import cn.axzo.tyr.server.model.RelationOperateLogResourceBindElementDO;
import cn.axzo.tyr.server.repository.dao.SaasFeatureResourceDao;
import cn.axzo.tyr.server.repository.dao.SaasPageElementCategoryDao;
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.SaasPageElementCategory;
import cn.axzo.tyr.server.repository.entity.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementMapper;
@ -51,10 +63,13 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@ -69,10 +84,12 @@ import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
@ -97,11 +114,12 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasFeatureResourceDao saasFeatureResourceDao;
private final TyrSaasAuthService tyrSaasAuthService;
private final MqProducer mqProducer;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
private final UserProfileServiceApi userProfileServiceApi;
private final MqProducer mqProducer;
private final SaasFeatureResourceService saasFeatureResourceService;
private final SaasPageElementFeatureResourceRelationService saasPageElementFeatureResourceRelationService;
private final SaasPageElementCategoryDao saasPageElementCategoryDao;
@Qualifier("asyncExecutor")
@Autowired
@ -112,6 +130,7 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
private List<String> reportSecretKeys;
private static final String TARGET_TYPE = "pageElementFeatureResourceId";
public static final String PAGE_ELEMENT_TABLE_NAME = "saas_page_element";
@Override
@Transactional(rollbackFor = Exception.class)
@ -243,17 +262,21 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
}
@Override
public PageResp<PageElementResp> page(PageQueryElementReq request) {
public PageResp<PageElementCategoryAndElementResp> page(PageQueryElementReq request) {
IPage<SaasPageElement> page = saasPageElementDao.lambdaQuery()
.eq(SaasPageElement::getTerminal, request.getTerminal())
.in(CollectionUtils.isNotEmpty(request.getElementTypes()), SaasPageElement::getType, request.getElementTypes())
.and(StringUtils.isNotBlank(request.getSearchKey()), w -> w.like(SaasPageElement::getCode, request.getSearchKey())
.or().like(SaasPageElement::getName, request.getSearchKey())
.or().like(SaasPageElement::getLinkUrl, request.getSearchKey()))
.or().like(SaasPageElement::getLinkUrl, request.getSearchKey())
.or().like(SaasPageElement::getItemCode, request.getSearchKey())
.or().like(SaasPageElement::getItemName, request.getSearchKey()))
.page(new Page<>(request.getPage(), request.getPageSize()));
List<PageElementResp> list = BeanMapper.copyList(page.getRecords(), PageElementResp.class);
addComponentElement2Page(request.getTerminal(), list);
return PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), list);
List<PageElementCategoryAndElementResp> categoryAndElementResps = changeElementWithCategories(list);
return PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), categoryAndElementResps);
}
@Override
@ -326,6 +349,9 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
.name(pageElement.getName())
.linkUrl(pageElement.getLinkUrl())
.createName(request.getCreateName())
.appType(PageElementAppTypeEnum.PC.name())
.itemCode("CMS_COMMON")
.itemName("单位组织")
.build());
if (CollectionUtils.isNotEmpty(pageElement.getChildren())) {
@ -336,6 +362,9 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
.type(e.getType())
.name(e.getName())
.createName(request.getCreateName())
.appType(PageElementAppTypeEnum.PC.name())
.itemCode("CMS_COMMON")
.itemName("单位组织")
.build()).collect(Collectors.toList()));
}
}
@ -378,6 +407,8 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
List<PageElementResp> pageTypeElements = pageElements.stream().filter(e -> PageElementTypeEnum.PAGE.getCode().equals(e.getType()))
.map(e -> PageElementResp.builder()
.id(e.getId())
.groupCode(e.getGroupCode())
.groupName(e.getName())
.code(e.getCode())
.name(e.getName())
.type(e.getType())
@ -395,6 +426,8 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
if (Objects.nonNull(pageTypeElement)) {
pageTypeElement.getChildren().add(PageElementResp.builder()
.id(e.getId())
.groupCode(pageTypeElement.getGroupCode())
.groupName(pageTypeElement.getGroupName())
.code(e.getCode())
.name(e.getName())
.type(e.getType())
@ -503,6 +536,252 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
return PageConverter.toResp(page, e -> from(e, featureResources));
}
@Override
public PageResp<PageElementResp> pageV2(PageQueryElementV2Req request) {
LambdaQueryChainWrapper<SaasPageElement> wrapper = saasPageElementDao.lambdaQuery()
.eq(Objects.nonNull(request.getId()), SaasPageElement::getId, request.getId())
.eq(StringUtils.isNotBlank(request.getTerminal()), SaasPageElement::getTerminal, request.getTerminal())
.eq(StringUtils.isNotBlank(request.getItemCode()), SaasPageElement::getItemCode, request.getItemCode())
.in(CollectionUtils.isNotEmpty(request.getElementTypes()), SaasPageElement::getType, request.getElementTypes())
.and(StringUtils.isNotBlank(request.getPageElementCodeOrName()), w -> w.like(SaasPageElement::getCode, request.getPageElementCodeOrName())
.or().like(SaasPageElement::getName, request.getPageElementCodeOrName()));
// 待切换写法收口pagepageV2查询
// 因为页面名字没有每条记录冗余查询条件可能是页面名字或者code所以需要根据入参找到对应的页面code然后作为页面code查询
if (StringUtils.isNotBlank(request.getPageElementGroupCodeOrName())) {
List<SaasPageElement> groupPageElements = saasPageElementDao.lambdaQuery()
.eq(SaasPageElement::getType, PageElementTypeEnum.PAGE.getCode())
.and(w -> w.like(SaasPageElement::getGroupCode, request.getPageElementGroupCodeOrName())
.or()
.like(SaasPageElement::getName, request.getPageElementGroupCodeOrName()))
.list();
if (CollectionUtils.isEmpty(groupPageElements)) {
return request.toEmpty();
}
wrapper.in(SaasPageElement::getGroupCode, groupPageElements.stream().map(SaasPageElement::getGroupCode).collect(Collectors.toSet()));
}
IPage<SaasPageElement> page = wrapper.orderByDesc(BaseEntity::getId)
.page(new Page<>(request.getPage(), request.getPageSize()));
List<PageElementResp> list = BeanMapper.copyList(page.getRecords(), PageElementResp.class);
// 补充元素组名
fillGroupName(list);
// 补充元素iosandroid路由地址
fillIosAndAndroidRouteUrl(list);
return PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), list);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long saveOrUpdate(SaveOrUpdatePageElementReq req) {
SaasPageElement basePageElement = SaasPageElement.builder()
.version(req.getVersion())
.groupCode(req.getCode())
.code(req.getCode())
.name(req.getName())
.type(req.getType())
.linkUrl(req.getLinkUrl())
.linkExt(getLinkExtStr(req.getIosRouterUrl(), req.getAndroidRouterUrl()))
.appType(req.getAppType())
.appId(req.getAppId())
.itemCode(req.getItemCode())
.build();
if (Objects.nonNull(req.getId())) {
SaasPageElement dbPageElement = saasPageElementDao.getById(req.getId());
AssertUtil.notNull(dbPageElement, "页面元素资源不存在");
basePageElement.setId(dbPageElement.getId());
if (!dbPageElement.getCode().equals(basePageElement.getCode())) {
// 校验code唯一
validCode(basePageElement.getCode());
if (PageElementTypeEnum.PAGE.getCode().equals(req.getType())) {
// 更新子元素的group_code
saasPageElementDao.updateComponentsGroupCode(dbPageElement.getCode(), basePageElement.getCode(), dbPageElement.getTerminal());
}
// 更新关联关系的page_element_code
saasPageElementFeatureResourceRelationDao.updateGroupCode(dbPageElement.getCode(), basePageElement.getCode(), dbPageElement.getTerminal());
}
saasPageElementDao.updateById(basePageElement);
} else {
if (PageElementTypeEnum.PAGE.getCode().equals(req.getType())) {
AssertUtil.isTrue(StringUtils.isNotBlank(req.getItemCode()), "页面元素不存在");
List<SaasPageElementCategory> categories = saasPageElementCategoryDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElementCategory::getItemCode, req.getItemCode()).list();
AssertUtil.notEmpty(categories, "元素分类不存在。");
SaasPageElementCategory category = categories.get(0);
basePageElement.setTerminal(category.getTerminal());
basePageElement.setItemName(category.getItemName());
} else if (PageElementTypeEnum.COMPONENT.getCode().equals(req.getType())) {
AssertUtil.isTrue(StringUtils.isNotBlank(req.getGroupCode()), "页面元素不存在");
List<SaasPageElement> pageElements = saasPageElementDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElement::getCode, req.getGroupCode()).list();
AssertUtil.notEmpty(pageElements, "父级元素不存在。");
SaasPageElement pageElement = pageElements.get(0);
basePageElement.setVersion(pageElement.getVersion());
basePageElement.setGroupCode(pageElement.getCode());
basePageElement.setTerminal(pageElement.getTerminal());
basePageElement.setAppType(pageElement.getAppType());
basePageElement.setAppId(pageElement.getAppId());
basePageElement.setItemCode(pageElement.getItemCode());
basePageElement.setItemName(pageElement.getItemName());
}
// 校验code唯一
validCode(basePageElement.getCode());
saasPageElementDao.save(basePageElement);
}
// 记录操作日志
try {
saveOrUpdateOperateLog(req, basePageElement);
} catch (Exception e) {
log.warn("save operate log error", e);
}
return basePageElement.getId();
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(DeletePageElementReq req) {
SaasPageElement dbPageElement = saasPageElementDao.getById(req.getId());
AssertUtil.notNull(dbPageElement, "页面元素资源不存在");
Set<String> codes = Sets.newHashSet(dbPageElement.getCode());
if (PageElementTypeEnum.PAGE.getCode().equals(dbPageElement.getType())) {
// 删除页面的子元素
List<SaasPageElement> pageElements = saasPageElementDao.listByGroupCodesAndExcludeIds(Lists.newArrayList(dbPageElement.getGroupCode()), null, dbPageElement.getTerminal(), null);
saasPageElementDao.deleteIdsByTerminal(pageElements.stream().map(BaseEntity::getId).collect(Collectors.toList()), dbPageElement.getTerminal());
codes.addAll(pageElements.stream().map(SaasPageElement::getCode).collect(Collectors.toSet()));
} else {
saasPageElementDao.deleteIdsByTerminal(Lists.newArrayList(req.getId()), dbPageElement.getTerminal());
}
// 删除绑定关系
if (CollectionUtils.isNotEmpty(codes)) {
saasPageElementFeatureResourceRelationDao.deleteByTerminalAndPageElementCodes(dbPageElement.getTerminal(), Lists.newArrayList(codes), req.getOperatorId());
}
// 记录操作日志
try {
saveDeleteOperateLog(req, dbPageElement);
} catch (Exception e) {
log.warn("save operate log error", e);
}
Event event = Event.builder()
.targetType(TARGET_TYPE)
.eventCode(PAGE_ELEMENT_FEATURE_RESOURCE_UPSERT.getEventCode())
.data(PageElementFeatureResourceUpsertPayload.builder()
.terminal(dbPageElement.getTerminal())
.build())
.build();
mqProducer.send(event);
}
@Override
public List<PageElementRelationFeatureResourceResp> getFeatureResourceRelations(Long pageElementId) {
SaasPageElement dbPageElement = saasPageElementDao.getById(pageElementId);
AssertUtil.notNull(dbPageElement, "页面元素资源不存在");
List<SaasPageElementFeatureResourceRelation> relations = saasPageElementFeatureResourceRelationDao.lambdaQuery()
.eq(SaasPageElementFeatureResourceRelation::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElementFeatureResourceRelation::getPageElementCode, dbPageElement.getCode())
.eq(SaasPageElementFeatureResourceRelation::getTerminal, dbPageElement.getTerminal())
.list();
if (CollectionUtils.isEmpty(relations)) {
return Collections.emptyList();
}
List<SaasFeatureResource> pageFeatureResources = getPageFeatureResources(dbPageElement.getTerminal(), relations.stream().map(SaasPageElementFeatureResourceRelation::getFeatureResourceUniCode).collect(Collectors.toList()));
if (CollectionUtils.isEmpty(pageFeatureResources)) {
return Collections.emptyList();
}
List<SaasFeatureResource> pageParentFeatureResources = saasFeatureResourceDao.lambdaQuery()
.eq(SaasFeatureResource::getTerminal, dbPageElement.getTerminal())
.in(SaasFeatureResource::getId, pageFeatureResources.stream().map(SaasFeatureResource::getParentId).collect(Collectors.toSet()))
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.list();
List<SaasFeatureResource> pageChildrenFeatureResources = saasFeatureResourceDao.lambdaQuery()
.eq(BaseEntity::getIsDelete,0)
.and(i -> pageFeatureResources.forEach(f -> i.or().likeRight(SaasFeatureResource::getPath, f.getPath())))
.list();
List<SaasFeatureResource> allFeatureResources = Lists.newArrayList(pageFeatureResources);
if (CollectionUtils.isNotEmpty(pageParentFeatureResources)) {
allFeatureResources.addAll(pageParentFeatureResources);
}
if (CollectionUtils.isNotEmpty(pageChildrenFeatureResources)) {
allFeatureResources.addAll(pageChildrenFeatureResources);
}
Map<String, SaasPageElementFeatureResourceRelation> uniCodeRelationMap = Maps.newHashMap();
List<String> pageRouteUniCodes = Lists.newArrayList();
for(SaasPageElementFeatureResourceRelation relation : relations) {
if (pageRouteUniCodes.contains(relation.getFeatureResourceUniCode())) {
continue;
}
uniCodeRelationMap.put(relation.getFeatureResourceUniCode(), relation);
if (PageElementFeatureResourceRelationTypeEnum.PAGE_ROUTE.getValue().equals(relation.getType())) {
pageRouteUniCodes.add(relation.getFeatureResourceUniCode());
}
}
List<PageElementRelationFeatureResourceResp> reps = allFeatureResources.stream().map(e -> PageElementRelationFeatureResourceResp.builder()
.id(e.getId())
.parentId(e.getParentId())
.uniCode(e.getUniCode())
.featureName(e.getFeatureName())
.featureType(e.getFeatureType())
.hasRelation(uniCodeRelationMap.containsKey(e.getUniCode()))
.relationType(Optional.ofNullable(uniCodeRelationMap.get(e.getUniCode())).map(SaasPageElementFeatureResourceRelation::getType).orElse(null))
.build()).distinct().collect(Collectors.toList());
return TreeUtil.buildTree(reps);
}
@Override
public void importData(List<PageElementImportDataReq> req) {
log.info("导入资源的数量:{}", req.size());
Integer codeCount = saasPageElementDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.in(SaasPageElement::getCode, req.stream().map(PageElementImportDataReq::getCode).collect(Collectors.toList()))
.count();
AssertUtil.isTrue(codeCount <= 0, "导入的资源编码已存在。");
Set<String> itemCodes = req.stream().map(PageElementImportDataReq::getItemCode).collect(Collectors.toSet());
List<SaasPageElementCategory> categories = saasPageElementCategoryDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.in(SaasPageElementCategory::getItemCode, itemCodes)
.list();
// AssertUtil.isTrue(itemCodes.size() == categories.size(), "元素分类编码系统中有未存在的。");
Map<String, SaasPageElementCategory> categoryMap = categories.stream().collect(Collectors.toMap(SaasPageElementCategory::getItemCode, Function.identity(), (v1, v2) -> v1));
List<SaasPageElement> elements = req.stream().map(e -> {
SaasPageElementCategory category = categoryMap.get(e.getItemCode());
AssertUtil.notNull(category, e.getItemCode() + "不存在。");
return SaasPageElement.builder()
.version(e.getVersion())
.groupCode(e.getGroupCode())
.code(e.getCode())
.name(e.getName())
.type(e.getType())
.linkUrl(e.getLinkUrl())
.terminal(e.getTerminal())
.appType(e.getAppType())
.itemCode(e.getItemCode())
.itemName(category.getItemName())
.createName(Optional.ofNullable(e.getOperatorId()).map(Objects::toString).orElse(StringUtils.EMPTY))
.appId(e.getAppId())
.build();
}).collect(Collectors.toList());
Lists.partition(elements,500).forEach(saasPageElementDao::saveBatch);
}
private PageElementResp from(SaasPageElement saasPageElement,
Map<String, List<SaasFeatureResourceResp>> featureResources) {
PageElementResp pageElementResp = PageElementResp.builder().build();
@ -549,4 +828,106 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
.collect(Collectors.groupingBy(SaasPageElementFeatureResourceRelation::getPageElementCode,
Collectors.mapping(e -> featureResources.get(e.getFeatureResourceUniCode()), Collectors.toList())));
}
private void fillGroupName(List<PageElementResp> list) {
if (CollectionUtils.isEmpty(list)) {
return;
}
Map<String, SaasPageElement> elementMap = saasPageElementDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.in(SaasPageElement::getCode, list.stream().map(PageElementResp::getGroupCode).distinct().collect(Collectors.toList()))
.list().stream().collect(Collectors.toMap(SaasPageElement::getCode, Function.identity(), (v1, v2) -> v1));
list.forEach(e -> e.setGroupName(Optional.ofNullable(elementMap.get(e.getGroupCode())).map(SaasPageElement::getName).orElse(StringUtils.EMPTY)));
}
private void validCode(String code) {
List<SaasPageElement> pageElements = saasPageElementDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.value)
.eq(SaasPageElement::getCode, code)
.list();
AssertUtil.isEmpty(pageElements, "featureCode已存在");
}
private String getLinkExtStr(String iosRouterUrl, String androidRouterUrl) {
if (StringUtils.isBlank(iosRouterUrl) && StringUtils.isBlank(androidRouterUrl)) {
return StringUtils.EMPTY;
}
List<PageElementResp.LinkExt> exts = Lists.newArrayList(PageElementResp.LinkExt.builder().system("ios").routerUrl(Strings.nullToEmpty(iosRouterUrl)).build(),
PageElementResp.LinkExt.builder().system("android").routerUrl(Strings.nullToEmpty(androidRouterUrl)).build());
return JSONObject.toJSONString(exts);
}
private void fillIosAndAndroidRouteUrl(List<PageElementResp> list) {
if (CollectionUtils.isEmpty(list)) {
return;
}
for (PageElementResp resp : list) {
if (StringUtils.isBlank(resp.getLinkExt())) {
continue;
}
resp.setIosRouterUrl(resp.resolveIosRouterUrl());
resp.setAndroidRouterUrl(resp.resolveAndroidRouterUrl());
}
}
private void saveOrUpdateOperateLog(SaveOrUpdatePageElementReq req, SaasPageElement basePageElement) {
saasPgroupPermissionRelationOperateLogService.save(PermissionOperateLogReq.builder()
.tableName(PAGE_ELEMENT_TABLE_NAME)
.operatorId(req.getOperatorId())
.scene(PermissionRelationOperateLogSceneEnum.OMS_UPSERT_PAGE_ELEMENT.getValue())
.sceneId(basePageElement.getId().toString())
.requestData(req)
.operateData(basePageElement)
.build());
}
private void saveDeleteOperateLog(DeletePageElementReq req, SaasPageElement basePageElement) {
saasPgroupPermissionRelationOperateLogService.save(PermissionOperateLogReq.builder()
.tableName(PAGE_ELEMENT_TABLE_NAME)
.operatorId(req.getOperatorId())
.scene(PermissionRelationOperateLogSceneEnum.OMS_DELETE_PAGE_ELEMENT.getValue())
.sceneId(basePageElement.getId().toString())
.requestData(req)
.operateData(basePageElement)
.build());
}
private List<PageElementCategoryAndElementResp> changeElementWithCategories(List<PageElementResp> list) {
List<PageElementCategoryAndElementResp> resps = Lists.newArrayList();
if (CollectionUtils.isEmpty(list)) {
return resps;
}
Map<String, PageElementResp> itemCodeAndElementMap = list.stream().collect(Collectors.toMap(PageElementResp::getItemCode, Function.identity(), (v1, v2) -> v1));
Map<String, List<PageElementResp>> groupingByItemCodes = list.stream().collect(Collectors.groupingBy(PageElementResp::getItemCode));
groupingByItemCodes.forEach((k, v) -> {
PageElementResp resp = itemCodeAndElementMap.get(k);
resps.add(PageElementCategoryAndElementResp.builder()
.itemCode(k)
.itemName(resp.getItemName())
.pageElements(v)
.build());
});
return resps;
}
private List<SaasFeatureResource> getPageFeatureResources(String terminal, List<String> uniCodes) {
List<SaasFeatureResource> pageFeatureResources = saasFeatureResourceDao.lambdaQuery()
.eq(SaasFeatureResource::getTerminal, terminal)
.in(SaasFeatureResource::getUniCode, uniCodes)
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.list();
List<Long> allIds = pageFeatureResources.stream().map(e -> Arrays.stream(e.getPath().split(",")).filter(StringUtils::isNotBlank).map(Long::valueOf)
.collect(Collectors.toList())).flatMap(List::stream).distinct().collect(Collectors.toList());
return saasFeatureResourceDao.lambdaQuery()
.eq(SaasFeatureResource::getTerminal, terminal)
.in(SaasFeatureResource::getId, allIds)
.in(SaasFeatureResource::getFeatureType, Lists.newArrayList(FeatureResourceType.PAGE.getCode(), FeatureResourceType.APP_ENTRY.getCode()))
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.list();
}
}