feat(REQ-2899):前端资源管理

This commit is contained in:
李昆鹏 2024-08-22 16:14:15 +08:00
parent 008cd8c15b
commit 7113284251
19 changed files with 854 additions and 30 deletions

View File

@ -58,6 +58,21 @@ 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新增、编辑页面元素"),
;
@EnumValue

View File

@ -5,6 +5,7 @@ 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.ListPageElementCategoryResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
@ -45,4 +46,28 @@ 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/saveOrUpdatePage")
ApiResult<Void> saveOrUpdatePage(@RequestBody @Valid SaveOrUpdatePageElementPageReq req);
/** 新增、编辑页面组件元素类型 **/
@PostMapping("/api/pageElement/saveOrUpdateComponent")
ApiResult<Void> saveOrUpdateComponent(@RequestBody @Valid SaveOrUpdatePageElementComponentReq req);
}

View File

@ -0,0 +1,31 @@
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 **/
@NotNull(message = "操作人不能为空")
@Min(value = 1, message = "操作人有误")
private Long operatorId;
}

View File

@ -0,0 +1,53 @@
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.util.List;
/**
* @author likunpeng
* @version 1.0
* @date 2024/6/14
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PageQueryElementV2Req {
/**
*
*/
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;
}

View File

@ -0,0 +1,40 @@
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 **/
@NotNull(message = "操作人不能为空")
@Min(value = 1, message = "操作人有误")
private Long operatorId;
}

View File

@ -0,0 +1,42 @@
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 SaveOrUpdatePageElementComponentReq {
private Long id;
/** 分组ID **/
@NotNull(message = "分组ID不能为空")
@Min(value = 1, message = "分组ID有误")
private Long pageId;
/** 项目编码 **/
@NotBlank(message = "项目编码不能为空")
private String code;
/** 元素名称 **/
@NotBlank(message = "元素名称不能为空")
private String name;
/** 操作人personId **/
@NotNull(message = "操作人不能为空")
@Min(value = 1, message = "操作人有误")
private Long operatorId;
}

View File

@ -0,0 +1,59 @@
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 SaveOrUpdatePageElementPageReq {
private Long id;
/** 项目编码 **/
@NotBlank(message = "项目编码不能为空")
private String itemCode;
/** 项目编码 **/
@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 **/
@NotNull(message = "操作人不能为空")
@Min(value = 1, message = "操作人有误")
private Long operatorId;
}

View File

@ -0,0 +1,39 @@
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;
}
}

View File

@ -32,6 +32,11 @@ public class PageElementResp {
*/
private String groupCode;
/**
* 元素的组编码
*/
private String groupName;
/**
* 元素编码
*/

View File

@ -3,14 +3,11 @@ 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.req.*;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.ListPageElementCategoryResp;
import cn.axzo.tyr.client.model.res.PageElementResp;
import cn.axzo.tyr.server.service.SaasPageElementCategoryService;
import cn.axzo.tyr.server.service.SaasPageElementService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -29,6 +26,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) {
@ -61,4 +59,37 @@ 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> saveOrUpdatePage(SaveOrUpdatePageElementPageReq req) {
saasPageElementService.saveOrUpdatePage(req);
return ApiResult.ok();
}
@Override
public ApiResult<Void> saveOrUpdateComponent(SaveOrUpdatePageElementComponentReq req) {
saasPageElementService.saveOrUpdateComponent(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,12 +1,7 @@
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.req.*;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
import cn.axzo.tyr.client.model.res.PageElementResp;
@ -82,4 +77,10 @@ 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 saveOrUpdatePage(SaveOrUpdatePageElementPageReq req);
Long saveOrUpdateComponent(SaveOrUpdatePageElementComponentReq req);
}

View File

@ -0,0 +1,174 @@
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.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.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;
/**
* @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 final SaasPageElementCategoryDao saasPageElementCategoryDao;
private final SaasPageElementDao saasPageElementDao;
private final SaasPageElementFeatureResourceRelationDao saasPageElementFeatureResourceRelationDao;
private final SaasPgroupPermissionRelationOperateLogService saasPgroupPermissionRelationOperateLogService;
@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())
.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);
}
}
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,6 +1,7 @@
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.profiles.api.UserProfileServiceApi;
@ -15,15 +16,7 @@ import cn.axzo.tyr.client.common.enums.FeatureResourceType;
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.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.PageElementReportReq;
import cn.axzo.tyr.client.model.req.PageElementReq;
import cn.axzo.tyr.client.model.req.PageQueryElementReq;
import cn.axzo.tyr.client.model.req.PageSaasFeatureResourceReq;
import cn.axzo.tyr.client.model.req.*;
import cn.axzo.tyr.client.model.res.GetUserHasPermissionPageElementResp;
import cn.axzo.tyr.client.model.res.IdentityAuthRes;
import cn.axzo.tyr.client.model.res.PageElementBasicDTO;
@ -33,12 +26,10 @@ 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.SaasPageElementFeatureResourceRelation;
import cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelationOperateLog;
import cn.axzo.tyr.server.repository.entity.*;
import cn.axzo.tyr.server.repository.mapper.SaasPageElementMapper;
import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.SaasPageElementFeatureResourceRelationService;
@ -53,6 +44,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
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 lombok.RequiredArgsConstructor;
@ -69,11 +61,7 @@ import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.function.Function;
@ -102,6 +90,7 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
private final MqProducer mqProducer;
private final SaasFeatureResourceService saasFeatureResourceService;
private final SaasPageElementFeatureResourceRelationService saasPageElementFeatureResourceRelationService;
private final SaasPageElementCategoryDao saasPageElementCategoryDao;
@Qualifier("asyncExecutor")
@Autowired
@ -112,6 +101,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)
@ -503,6 +493,123 @@ public class SaasPageElementServiceImpl extends ServiceImpl<SaasPageElementMappe
return PageConverter.toResp(page, e -> from(e, featureResources));
}
@Override
public PageResp<PageElementResp> pageV2(PageQueryElementV2Req request) {
IPage<SaasPageElement> page = saasPageElementDao.lambdaQuery()
.eq(StringUtils.isNotBlank(request.getTerminal()), SaasPageElement::getTerminal, request.getTerminal())
.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()))
.eq(StringUtils.isNotBlank(request.getPageElementGroupCodeOrName()), SaasPageElement::getType, PageElementTypeEnum.PAGE.getCode())
.and(StringUtils.isNotBlank(request.getPageElementGroupCodeOrName()),
w -> w.like(SaasPageElement::getGroupCode, request.getPageElementGroupCodeOrName())
.or().like(SaasPageElement::getName, request.getPageElementGroupCodeOrName()))
.orderByDesc(BaseEntity::getId)
.page(new Page<>(request.getPage(), request.getPageSize()));
List<PageElementResp> list = BeanMapper.copyList(page.getRecords(), PageElementResp.class);
fillGroupName(list);
return PageResp.list(page.getCurrent(), page.getSize(), page.getTotal(), list);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Long saveOrUpdatePage(SaveOrUpdatePageElementPageReq req) {
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);
SaasPageElement basePageElement = SaasPageElement.builder()
.version(req.getVersion())
.groupCode(req.getCode())
.code(req.getCode())
.name(req.getName())
.type(PageElementTypeEnum.PAGE.getCode())
.linkUrl(req.getLinkUrl())
.linkExt(getLinkExtStr(req.getIosRouterUrl(), req.getAndroidRouterUrl()))
.terminal(category.getTerminal())
.appType(req.getAppType())
.appId(req.getAppId())
.itemCode(req.getItemCode())
.itemName(category.getItemName())
.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());
// 更新子元素的group_code
saasPageElementDao.updateComponentsGroupCode(dbPageElement.getCode(), basePageElement.getCode(), category.getTerminal());
// 更新关联关系的page_element_code
saasPageElementFeatureResourceRelationDao.updateGroupCode(dbPageElement.getCode(), basePageElement.getCode(), category.getTerminal());
}
saasPageElementDao.updateById(basePageElement);
} else {
validCode(basePageElement.getCode());
saasPageElementDao.save(basePageElement);
}
// 记录操作日志
try {
saveOrUpdatePageOperateLog(req, basePageElement);
} catch (Exception e) {
log.warn("save operate log error", e);
}
return basePageElement.getId();
}
@Override
public Long saveOrUpdateComponent(SaveOrUpdatePageElementComponentReq req) {
List<SaasPageElement> pageElements = saasPageElementDao.lambdaQuery()
.eq(BaseEntity::getIsDelete, DeleteEnum.NORMAL.getValue())
.eq(SaasPageElement::getId, req.getPageId()).list();
AssertUtil.notEmpty(pageElements, "父级元素不存在。");
SaasPageElement pageElement = pageElements.get(0);
SaasPageElement basePageElement = SaasPageElement.builder()
.version(pageElement.getVersion())
.groupCode(pageElement.getCode())
.code(req.getCode())
.name(req.getName())
.type(PageElementTypeEnum.COMPONENT.getCode())
.terminal(pageElement.getTerminal())
.appType(pageElement.getAppType())
.appId(pageElement.getAppId())
.itemCode(pageElement.getItemCode())
.itemName(pageElement.getItemName())
.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());
// 更新关联关系的page_element_code
saasPageElementFeatureResourceRelationDao.updateGroupCode(dbPageElement.getCode(), basePageElement.getCode(), pageElement.getTerminal());
}
saasPageElementDao.updateById(basePageElement);
} else {
validCode(basePageElement.getCode());
saasPageElementDao.save(basePageElement);
}
// 记录操作日志
try {
saveOrUpdateComponentOperateLog(req, basePageElement);
} catch (Exception e) {
log.warn("save operate log error", e);
}
return basePageElement.getId();
}
private PageElementResp from(SaasPageElement saasPageElement,
Map<String, List<SaasFeatureResourceResp>> featureResources) {
PageElementResp pageElementResp = PageElementResp.builder().build();
@ -549,4 +656,55 @@ 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 saveOrUpdatePageOperateLog(SaveOrUpdatePageElementPageReq 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 saveOrUpdateComponentOperateLog(SaveOrUpdatePageElementComponentReq 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());
}
}