feat:(REQ-3282) 重构项目权限查询接口,支持每个项目查询不同的权限条件

This commit is contained in:
李龙 2024-12-20 13:56:27 +08:00
parent 19f16a5d7f
commit 50350b8cd7
14 changed files with 472 additions and 379 deletions

View File

@ -18,8 +18,6 @@ import cn.axzo.tyr.client.model.req.ListRoleReq;
import cn.axzo.tyr.client.model.req.ListSaasRoleGroupParam;
import cn.axzo.tyr.client.model.req.PagePgroupPermissionRelationReq;
import cn.axzo.tyr.client.model.req.PageProductFeatureRelationReq;
import cn.axzo.tyr.client.model.req.PageRoleReq;
import cn.axzo.tyr.client.model.req.PermissionCheckReq;
import cn.axzo.tyr.client.model.req.QuerySaasRoleGroupReq;
import cn.axzo.tyr.client.model.res.CommonDictResp;
import cn.axzo.tyr.client.model.res.FeatureResourceDTO;
@ -69,7 +67,6 @@ import cn.axzo.tyr.server.service.SaasFeatureResourceService;
import cn.axzo.tyr.server.service.SaasPgroupPermissionRelationService;
import cn.axzo.tyr.server.service.SaasRoleGroupService;
import cn.axzo.tyr.server.service.SaasRoleUserRelationService;
import cn.axzo.tyr.server.service.TyrSaasAuthService;
import cn.axzo.tyr.server.service.WorkspaceProductService;
import cn.axzo.tyr.server.service.impl.SaasFeatureResourceCacheService;
import cn.axzo.tyr.server.util.FeatureCodeUtil;
@ -86,7 +83,6 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@ -615,11 +611,6 @@ public class PrivateController {
return "ok";
}
@PostMapping("/api/private/workspaceProduct/list")
public Object listWorkspaceProduct(@RequestBody WorkspaceProductService.WorkspaceProductParam request) {
return workspaceProductService.listWorkspaceProductCached(request);
}
@PostMapping("/api/private/cacheWorkspaceProductHandler/process")
public Object processCacheWorkspaceProductHandler(@RequestBody ServicePkgProductCreatedPayload request) {
Event event = Event.builder()
@ -678,8 +669,8 @@ public class PrivateController {
}
@PostMapping("/api/private/workspaceProductCached/list")
public Object workspaceProductCached(@RequestBody WorkspaceProductService.ListWorkspaceProductPermissionCacheParam request) {
return workspaceProductService.listWorkspaceProductPermissionCached(request);
public Object workspaceProductCached(@RequestBody WorkspaceProductService.ListWorkspacePermissionCacheParam request) {
return workspaceProductService.listWorkspacePermissionCached(request);
}
/**
@ -1297,11 +1288,13 @@ public class PrivateController {
}
private List<WorkspaceProductService.ProductPermission> listWorkspaceProductPermission(CheckPermissionParam request) {
WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam
WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam
.builder()
.workspaceIds(Sets.newHashSet(request.getWorkspaceId()))
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(request.getWorkspaceId())
.build()))
.build();
return workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam).stream()
return workspaceProductService.listWorkspacePermissionCached(listWorkspaceProductPermissionCacheParam).stream()
.map(WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)
.flatMap(Collection::stream)
.collect(Collectors.toList());

View File

@ -2,6 +2,8 @@ package cn.axzo.tyr.server.service;
import cn.axzo.tyr.feign.enums.RolePermissionTagEnum;
import cn.axzo.tyr.feign.enums.RoleTypeEnum;
import cn.axzo.tyr.feign.req.ListPermissionUserReq;
import cn.axzo.tyr.feign.resp.PermissionUserResp;
import cn.axzo.tyr.feign.resp.UserPermissionResp;
import lombok.AllArgsConstructor;
import lombok.Builder;
@ -14,8 +16,20 @@ import java.util.Set;
public interface PermissionService {
/**
* 查询用户的权限
* @param param
* @return
*/
List<UserPermissionResp> listUserPermission(ListUserPermissionParam param);
/**
* 查询有权限的用户
* @param param
* @return
*/
List<PermissionUserResp> listPermissionUser(ListPermissionUserReq param);
@Data
@Builder
@NoArgsConstructor

View File

@ -109,10 +109,5 @@ public interface ProductPermissionCacheService {
* 项目codeH5会拉取项目下所有的元素
*/
private String itemCode;
/**
* 客户端版本号
*/
private Integer version;
}
}

View File

@ -14,13 +14,6 @@ import java.util.Set;
public interface WorkspaceProductService {
/**
* 从缓存中查询项目的产品
* @param param
* @return
*/
List<WorkspaceProduct> listWorkspaceProductCached(WorkspaceProductParam param);
/**
* 缓存项目的产品
* @param param
@ -28,11 +21,11 @@ public interface WorkspaceProductService {
void storeWorkspaceProduct(StoreWorkspaceProductParam param);
/**
* 从缓存中查询项目的产品及产品的权限
* 从缓存中查询项目的权限
* @param param
* @return
*/
List<WorkspaceProductPermission> listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param);
List<WorkspaceProductPermission> listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param);
/**
* 从缓存中查询项目的产品及产品的菜单信息
@ -60,12 +53,24 @@ public interface WorkspaceProductService {
@Builder
@NoArgsConstructor
@AllArgsConstructor
class ListWorkspaceProductPermissionCacheParam {
class ListWorkspacePermissionCacheParam {
private List<WorkspacePermission> workspacePermissions;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
class WorkspacePermission {
/**
* 项目id
*/
private Set<Long> workspaceIds;
private Long workspaceId;
/**
* 权限code
*/
private Set<String> featureCodes;
/**

View File

@ -3,7 +3,9 @@ package cn.axzo.tyr.server.service.impl;
import cn.axzo.tyr.feign.enums.IdentityTypeEnum;
import cn.axzo.tyr.feign.enums.RolePermissionTagEnum;
import cn.axzo.tyr.feign.enums.RoleTypeEnum;
import cn.axzo.tyr.feign.req.ListPermissionUserReq;
import cn.axzo.tyr.feign.resp.PermissionResp;
import cn.axzo.tyr.feign.resp.PermissionUserResp;
import cn.axzo.tyr.feign.resp.UserPermissionResp;
import cn.axzo.tyr.server.service.PermissionService;
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
@ -134,6 +136,25 @@ public class PermissionServiceImpl implements PermissionService {
.collect(Collectors.toList());
}
/**
* 1根据权限code及相关条件查询项目的权限
* 2查询单位项目的所有role
* 3根据所有role查询角色信息
* 4根据项目的权限和role查询角色的权限信息
* 5解析有权限的admin role
* 6解析有权限的非admin role
* 7解析有离场权限的admin role
* 8聚合678的角色根据角色查询用户
* 9根据用户查询用户的tags
* 10
* @param param
* @return
*/
@Override
public List<PermissionUserResp> listPermissionUser(ListPermissionUserReq param) {
return null;
}
/**
* 只有查询在职权限时才能直接根据管理员角色和产品去匹配
* 因为离场权限管理员角色会配置管理员角色对应的离场权限
@ -300,14 +321,19 @@ public class PermissionServiceImpl implements PermissionService {
return Collections.emptyMap();
}
WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder()
.workspaceIds(workspaceIds)
.featureCodes(param.getFeatureCodes())
.appType(param.getAppType())
.itemCode(param.getItemCode())
.terminal(param.getTerminal())
WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam
.builder()
.workspacePermissions(workspaceIds.stream()
.map(workspaceId -> WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(workspaceId)
.featureCodes(param.getFeatureCodes())
.appType(param.getAppType())
.itemCode(param.getItemCode())
.terminal(param.getTerminal())
.build())
.collect(Collectors.toList()))
.build();
return workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission)
return workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam)
.stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId,
e -> Optional.ofNullable(e.getProductPermissions())

View File

@ -469,11 +469,14 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
// 查询的featureCodes有可能已经被删除但是saas_feature_code效率比较低两个表的id不会重复所以解析成id去过滤权限
Set<Long> featureIds = checkFeatureCodes(param);
WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder()
.workspaceIds(Sets.newHashSet(param.getWorkspaceId()))
.featureCodes(param.getFeatureCodes())
WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam
.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(param.getWorkspaceId())
.featureCodes(param.getFeatureCodes())
.build()))
.build();
List<ProductPermissionCacheService.PermissionDTO> productPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam)
List<ProductPermissionCacheService.PermissionDTO> productPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam)
.stream()
.map(WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)
.filter(e -> !CollectionUtils.isEmpty(e))
@ -994,10 +997,14 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
// find product by workspace
Set<Long> workspaceId = filterRoleAuths.stream().map(FilterRoleAuth::getWorkspaceId).collect(Collectors.toSet());
WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder()
.workspaceIds(workspaceId)
WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(workspaceId.stream()
.map(e -> WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(e)
.build())
.collect(Collectors.toList()))
.build();
Map<Long, List<WorkspaceProductService.ProductPermission>> workspaceProductPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission)
Map<Long, List<WorkspaceProductService.ProductPermission>> workspaceProductPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam)
.stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId,
WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
@ -1499,11 +1506,15 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService {
.map(IdentityAuthReq.WorkspaceOuPair::getWorkspaceId)
.collect(Collectors.toSet());
// 查询项目的产品权限
WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder()
.workspaceIds(workspaceIds)
.featureCodes(identityAuthReq.getFeatureCode())
WorkspaceProductService.ListWorkspacePermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(workspaceIds.stream()
.map(workspaceId -> WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(workspaceId)
.featureCodes(identityAuthReq.getFeatureCode())
.build())
.collect(Collectors.toList()))
.build();
return workspaceProductService.listWorkspaceProductPermissionCached(listProductPermisssion).stream()
return workspaceProductService.listWorkspacePermissionCached(listProductPermisssion).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId,
WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
}

View File

@ -7,9 +7,6 @@ import cn.axzo.thrones.client.saas.ServicePkgClient;
import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct;
import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes;
import cn.axzo.tyr.server.repository.dao.ProductModuleDao;
import cn.axzo.tyr.server.repository.entity.ProductFeatureQuery;
import cn.axzo.tyr.server.repository.entity.SaasProductModuleFeatureRelation;
import cn.axzo.tyr.server.service.ProductFeatureRelationService;
import cn.axzo.tyr.server.service.ProductPermissionCacheService;
import cn.axzo.tyr.server.service.ProductSaasFeatureResourceCacheService;
import cn.axzo.tyr.server.service.WorkspaceProductService;
@ -22,6 +19,7 @@ import com.google.common.collect.Sets;
import com.google.common.collect.Streams;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
@ -36,6 +34,7 @@ import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.stream.Collectors;
import static cn.axzo.tyr.server.config.exception.BizResultCode.REDIS_PRODUCT_NOT_NULL;
@ -51,8 +50,6 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
@Autowired
private ProductModuleDao productModuleDao;
@Autowired
private ProductFeatureRelationService productFeatureRelationService;
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private ProductPermissionCacheService productPermissionCacheService;
@ -66,47 +63,6 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
private static final String WORKSPACE_PRODUCT_KEY = "workspace:product";
@Override
public List<WorkspaceProduct> listWorkspaceProductCached(WorkspaceProductParam param) {
if (CollectionUtils.isEmpty(param.getWorkspaceIds())) {
return Collections.emptyList();
}
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds());
Set<Long> productIds = workspaceProducts.values().stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
if (CollectionUtils.isEmpty(productIds)) {
return Collections.emptyList();
}
ProductFeatureQuery productFeatureQuery = ProductFeatureQuery.builder()
.productIds(productIds)
.featureResourceTypes(param.getFeatureResourceTypes())
.terminal(param.getTerminal())
.type(param.getType())
.featureIdPairs(param.getFeatureIdPairs())
.build();
Map<Long, List<SaasProductModuleFeatureRelation>> saasProductModuleFeatureRelations = productFeatureRelationService.queryOnCondition(productFeatureQuery).stream()
.collect(Collectors.groupingBy(SaasProductModuleFeatureRelation::getProductModuleId));
return workspaceProducts.entrySet().stream()
.filter(e -> CollectionUtils.isNotEmpty(e.getValue()))
.map(e -> {
List<SaasProductModuleFeatureRelation> features = e.getValue().stream()
.map(saasProductModuleFeatureRelations::get)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.toList());
return WorkspaceProduct.builder()
.workspaceId(e.getKey())
.saasProductModuleFeatureRelations(features)
.build();
})
.collect(Collectors.toList());
}
@Override
public void storeWorkspaceProduct(StoreWorkspaceProductParam param) {
@ -204,8 +160,14 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
}
@Override
public List<WorkspaceProductPermission> listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param) {
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds());
public List<WorkspaceProductPermission> listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param) {
if (CollectionUtils.isEmpty(param.getWorkspacePermissions())) {
return Collections.emptyList();
}
Map<Long, Set<Long>> workspaceProducts = listWorkspaceProduct(param.getWorkspacePermissions().stream()
.map(WorkspacePermission::getWorkspaceId)
.collect(Collectors.toSet()));
Set<Long> productIds = workspaceProducts.values().stream()
.flatMap(Collection::stream)
@ -217,19 +179,32 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService {
ProductPermissionCacheService.ListProductPermissionParam listProductPermissionParam = ProductPermissionCacheService.ListProductPermissionParam.builder()
.productIds(productIds)
.featureCodes(param.getFeatureCodes())
.appType(param.getAppType())
.itemCode(param.getItemCode())
.terminal(param.getTerminal())
.build();
Map<Long, List<ProductPermissionCacheService.PermissionDTO>> productPermissionMap = productPermissionCacheService.list(listProductPermissionParam);
Map<Long, WorkspacePermission> workspacePermissionMap = param.getWorkspacePermissions().stream()
.collect(Collectors.toMap(WorkspacePermission::getWorkspaceId, Function.identity(), (f, s) -> f));
return workspaceProducts.entrySet().stream()
.filter(e -> CollectionUtils.isNotEmpty(e.getValue()))
.map(e -> {
WorkspacePermission workspacePermissionParam = workspacePermissionMap.get(e.getKey());
List<ProductPermission> productPermissions = e.getValue().stream()
.map(productId -> {
List<ProductPermissionCacheService.PermissionDTO> permissions = productPermissionMap.get(productId);
List<ProductPermissionCacheService.PermissionDTO> permissions = Optional.ofNullable(productPermissionMap.get(productId))
.orElseGet(Lists::newArrayList)
.stream()
.filter(permission -> CollectionUtils.isEmpty(workspacePermissionParam.getFeatureCodes())
|| workspacePermissionParam.getFeatureCodes().contains(permission.getFeatureCode()))
.filter(permission -> StringUtils.isBlank(workspacePermissionParam.getTerminal())
|| Objects.equals(workspacePermissionParam.getTerminal(), permission.getTerminal()))
.filter(permission -> StringUtils.isBlank(workspacePermissionParam.getAppType())
|| Objects.equals(workspacePermissionParam.getAppType(), permission.getAppType()))
.filter(permission -> StringUtils.isBlank(workspacePermissionParam.getItemCode())
|| Objects.equals(workspacePermissionParam.getItemCode(), permission.getItemCode()))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(permissions)) {
return null;
}

View File

@ -39,8 +39,6 @@ import java.util.Map;
import java.util.Set;
import static cn.axzo.tyr.server.config.exception.BizResultCode.PARAM_ERROR;
import static cn.axzo.tyr.server.repository.entity.SaasPgroupPermissionRelation.NEW_FEATURE;
import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertThrows;
class UserPermissionControllerTest extends BaseTest {
@ -107,6 +105,14 @@ class UserPermissionControllerTest extends BaseTest {
@Test
void listUserPermissionReplaceHasPermission() {
Map<String, Set<String>> featureCodeMap = Maps.newHashMap();
featureCodeMap.put("h5:cmp_user_manage_worker_page", Sets.newHashSet("h5:cmp_user_manage_worker_page"));
featureCodeMap.put("h5:cmp_user_manage_worker_page_2", Sets.newHashSet("h5:cmp_user_manage_worker_page_2"));
featureCodeMap.put("h5:cmp_user_manage_worker_on_site_audit_btn", Sets.newHashSet("h5:cmp_user_manage_worker_on_site_audit_btn"));
featureCodeMap.put("h5:cmp_user_manage_worker_jump_to_team_btn", Sets.newHashSet("h5:cmp_user_manage_worker_jump_to_team_btn"));
Mockito.when(featureCodeCachedApi.list(Mockito.any()))
.thenReturn(ApiResult.ok(featureCodeMap));
// old cn.axzo.tyr.client.feign.PermissionQueryApi#hasPermission
PermissionCheckReq permissionCheckReq = PermissionCheckReq.builder()
.personId(1827L)

View File

@ -1,28 +0,0 @@
package cn.axzo.tyr.server.permission;
import cn.axzo.tyr.server.job.ProductFeatureRefreshJobHandler;
import cn.axzo.tyr.server.model.ProductFeatureRefreshParam;
import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @version V1.0
* @author: ZhanSiHu
* @date: 2023/10/23 11:30
*/
@SpringBootTest
public class JobTest {
@Autowired
private ProductFeatureRefreshJobHandler productFeatureRefreshJobHandler;
@Test
public void testProductFeatureRefresh() throws Exception {
ProductFeatureRefreshParam param = new ProductFeatureRefreshParam();
param.setWorkspaceType(2);
param.setProductId(1007L);
productFeatureRefreshJobHandler.execute(JSON.toJSONString(param));
}
}

View File

@ -1,145 +0,0 @@
package cn.axzo.tyr.server.permission;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.model.enums.FeatureType;
import cn.axzo.tyr.client.model.permission.PermissionPointDTO;
import cn.axzo.tyr.client.model.permission.PermissionPointListQueryRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointMoveRequest;
import cn.axzo.tyr.client.model.permission.PermissionPointTreeNode;
import cn.axzo.tyr.client.model.permission.PermissionPointTreeQueryReq;
import cn.axzo.tyr.client.model.permission.PermissionPointVO;
import cn.axzo.tyr.server.controller.permission.PermissionPointController;
import cn.axzo.tyr.server.repository.entity.SaasFeature;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.service.PermissionPointService;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.List;
/**
* 权限点测试
*
* @version V1.0
* @author: ZhanSiHu
* @date: 2023/9/6 14:59
*/
@SpringBootTest
public class PermissionPointTest {
@Autowired
private PermissionPointController controller;
@Autowired
private SaasFeatureDao saasFeatureDao;
@Autowired
private PermissionPointService permissionPointService;
@Test
public void testList() {
List<SaasFeature> saasFeatures = saasFeatureDao.listByIds(Arrays.asList(206L, 207L, 208L));
System.out.println(JSON.toJSONString(saasFeatures));
}
@Test
public void testListTreeNode() {
PermissionPointTreeQueryReq request = new PermissionPointTreeQueryReq();
//request.setParentId(354L);
//request.setKeyword("预警");
//request.setWorkspaceType(Arrays.asList("ent"));
//request.setTerminalList(Arrays.asList("NT_CMS_WEB_ENT_ZB"));
request.setDelegateType(0);
request.setMaxLevel(3);
request.setMaxFeatureType(2);
ApiResult<List<PermissionPointTreeNode>> result = controller.listTreeNodes(request);
System.out.println("---------------");
System.out.println(JSON.toJSONString(result, SerializerFeature.DisableCircularReferenceDetect));
}
@Test
public void testGetDetail() {
Long permissionId = 360L;
ApiResult<PermissionPointVO> result = controller.getDetail(permissionId);
System.out.println(JSON.toJSONString(result));
}
@Test
public void testListByIds() {
List<Long> ids = Arrays.asList(354L, 360L);
ApiResult<List<PermissionPointTreeNode>> result = controller.listTreeNodesByIds(ids);
System.out.println(JSON.toJSONString(result));
}
@Test
public void testInsert() {
PermissionPointDTO permissionPoint = new PermissionPointDTO();
permissionPoint.setFeatureName("测试合同权限点");
permissionPoint.setFeatureCode("CMS_WEB_PROJ_0158");
//permissionPoint.setParentId(360L);
//permissionPoint.setPath("/0/354/360/");
//permissionPoint.setSort(3);
//permissionPoint.setTerminal("NT_CMS_WEB_PROJ");
permissionPoint.setTerminal("NT_CMS_WEB_ENT_ZB");
permissionPoint.setFeatureType(1);
//permissionPoint.setAppName("tyr");
//permissionPoint.setFeatureUrl("/tyr/test/permission");
//permissionPoint.setNeedAuth(true);
//permissionPoint.setNeedAuth(true);
System.out.println(JSON.toJSONString(permissionPoint));
controller.savePermissionPoint(permissionPoint);
}
@Test
public void testUpdate() {
PermissionPointDTO permissionPoint = new PermissionPointDTO();
permissionPoint.setId(3479L);
permissionPoint.setFeatureName("测试合同权限点");
permissionPoint.setFeatureCode("CMS_WEB_PROJ_0159"); //不生效
permissionPoint.setParentId(361L);//不生效
permissionPoint.setPath("/0/354/361/");//不生效
permissionPoint.setSort(9);//不生效
permissionPoint.setTerminal("NT_CMS_WEB_PROJ-xx");//不生效
permissionPoint.setFeatureType(3);
permissionPoint.setAppName("tyr");
permissionPoint.setFeatureUrl("/tyr/test/permission");
permissionPoint.setNeedAuth(true);
permissionPoint.setNeedAuth(true);
controller.savePermissionPoint(permissionPoint);
}
@Test
public void testMove() {
PermissionPointMoveRequest request = new PermissionPointMoveRequest();
request.setPermissionId(3483L);
request.setParentId(360L);
request.setSort(1);
ApiResult<Void> result = controller.move(request);
System.out.println(JSON.toJSONString(result));
}
@Test
public void testDelete() {
Long permissionId = 360L;
controller.deletePermissionPoint(permissionId);
}
@Test
public void testQueryList() {
PermissionPointListQueryRequest request = new PermissionPointListQueryRequest();
request.setFeatureType(FeatureType.BUTTON.getCode());
request.setIds(Arrays.asList(255L, 266L));
ApiResult<List<PermissionPointTreeNode>> result = controller.queryList(request);
System.out.println(JSON.toJSONString(result));
}
@Test
public void test() {
List<SaasFeature> saasFeatures = permissionPointService.listNodeWithChildrenByCode("CMS_WEB_PROJ_0546", "NT_CMS_WEB_PROJ");
System.out.println(JSON.toJSONString(saasFeatures));
}
}

View File

@ -1,78 +0,0 @@
package cn.axzo.tyr.server.permission;
import cn.axzo.framework.domain.web.result.ApiPageResult;
import cn.axzo.framework.domain.web.result.ApiResult;
import cn.axzo.tyr.client.feign.TyrSaasRoleApi;
import cn.axzo.tyr.client.model.BaseWorkspaceModel;
import cn.axzo.tyr.client.model.enums.FeatureType;
import cn.axzo.tyr.client.model.enums.IdentityType;
import cn.axzo.tyr.client.model.req.RoleWithUserQueryReq;
import cn.axzo.tyr.client.model.res.RoleWithUserRes;
import cn.axzo.tyr.server.controller.role.SaasRoleController;
import cn.axzo.tyr.server.repository.dao.SaasFeatureDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleDao;
import cn.axzo.tyr.server.repository.dao.SaasRoleUserRelationDao;
import cn.axzo.tyr.server.repository.entity.SaasRole;
import cn.axzo.tyr.server.service.RoleService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Arrays;
import java.util.List;
/**
* 权限点测试
*
* @version V1.0
* @author: ZhanSiHu
* @date: 2023/9/6 14:59
*/
@SpringBootTest
public class RoleUserTest {
@Autowired
private SaasRoleUserRelationDao saasRoleUserRelationDao;
@Autowired
private SaasFeatureDao saasFeatureDao;
@Autowired
private SaasRoleController controller;
@Autowired
private SaasRoleDao saasRoleDao;
@Autowired
private RoleService roleService;
@Test
public void testList() {
saasRoleUserRelationDao.deleteByUser(BaseWorkspaceModel.builder()
.workspaceId(
999L
)
.ouId(123L)
.identityId(32L)
.identityType(IdentityType.PRACTITIONER)
.build(), Arrays.asList(4L));
}
@Test
public void testQuery() {
RoleWithUserQueryReq request = new RoleWithUserQueryReq();
request.setOuId(5195L);
request.setWorkspaceId(232L);
request.setPage(1L);
request.setPageSize(5L);
ApiPageResult<RoleWithUserRes> result = controller.queryRoleWithUser(request);
System.out.println(JSON.toJSONString(result));
}
@Test
public void testListAdmin() {
roleService.listAdmins(111L, 22L);
}
}

View File

@ -1,25 +0,0 @@
package cn.axzo.tyr.server.permission;
import cn.axzo.tyr.client.model.permission.PermissionPointVO;
import cn.hutool.core.date.StopWatch;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
/**
* @version V1.0
* @author: ZhanSiHu
* @date: 2023/9/13 18:43
*/
public class SimpleTest {
@Test
public void testSplitBit() {
PermissionPointVO vo = new PermissionPointVO();
vo.applyFitOuTypeBit(65535L);
System.out.println(vo.getFitOuTypeList());
vo.applyFitOuTypeBit(65535L);
System.out.println(vo.getFitOuTypeList());
}
}

View File

@ -0,0 +1,214 @@
package cn.axzo.tyr.server.service.impl;
import cn.axzo.thrones.client.saas.ServicePkgClient;
import cn.axzo.thrones.client.saas.entity.serivicepgkproduct.ServicePkgProduct;
import cn.axzo.thrones.client.saas.entity.servicepkg.ServicePkgDetailRes;
import cn.axzo.tyr.base.BaseTest;
import cn.axzo.tyr.base.MysqlDataLoader;
import cn.axzo.tyr.server.service.WorkspaceProductService;
import cn.azxo.framework.common.model.CommonResponse;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
class WorkspaceProductServiceImplTest extends BaseTest {
@Autowired
private MysqlDataLoader mysqlDataLoader;
@Autowired
private WorkspaceProductService workspaceProductService;
@Autowired
private ServicePkgClient servicePkgClient;
@BeforeEach
@Override
public void setup() {
super.setup();
mysqlDataLoader.loadFromClassName(getClass().getSimpleName());
ServicePkgDetailRes servicePkgDetail = new ServicePkgDetailRes();
servicePkgDetail.setSpaceId(3L);
ServicePkgProduct servicePkgProduct = new ServicePkgProduct();
servicePkgProduct.setProductId(2L);
servicePkgDetail.setProducts(Lists.newArrayList(servicePkgProduct));
Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.eq(Sets.newHashSet(3L))))
.thenReturn(CommonResponse.success(Lists.newArrayList(servicePkgDetail)));
ServicePkgDetailRes servicePkgDetail2 = new ServicePkgDetailRes();
servicePkgDetail2.setSpaceId(4L);
ServicePkgProduct servicePkgProduct2 = new ServicePkgProduct();
servicePkgProduct2.setProductId(3L);
servicePkgDetail2.setProducts(Lists.newArrayList(servicePkgProduct2));
Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.eq(Sets.newHashSet(3L, 4L))))
.thenReturn(CommonResponse.success(Lists.newArrayList(servicePkgDetail2, servicePkgDetail)));
Mockito.when(servicePkgClient.getServicePkgDetailBySpaceId(Mockito.eq(Sets.newHashSet(11L))))
.thenReturn(CommonResponse.success(Lists.newArrayList()));
}
@Test
void listWorkspacePermissionCached() {
// workspace 没有product
WorkspaceProductService.ListWorkspacePermissionCacheParam param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(11L)
.build()))
.build();
List<WorkspaceProductService.WorkspaceProductPermission> workspaceProductPermissions = workspaceProductService.listWorkspacePermissionCached(param);
Assertions.assertTrue(CollectionUtils.isEmpty(workspaceProductPermissions));
// workspace 没有product
// workspace 有productfeatureCode
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn", "h5:cmp_allotted_time_page"))
.build(),
WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(4L)
.featureCodes(Sets.newHashSet("h5:cmp_allotted_time_page"))
.build()))
.build();
Map<Long, List<WorkspaceProductService.ProductPermission>> workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 1);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getCooperateType(), "1");
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureId(), 101745L);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_labor_audit_btn");
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureType(), 4);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL");
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getAppType(), "H5");
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getItemCode(), "h5:user_manage_D9B0186");
Assertions.assertEquals(workspacePermissions.get(4L).size(), 1);
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getProductId(), 3L);
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().size(), 1);
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getCooperateType(), "9");
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getFeatureId(), 101936L);
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_allotted_time_page");
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getFeatureType(), 4);
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL");
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getAppType(), "H5");
Assertions.assertEquals(workspacePermissions.get(4L).get(0).getPermissions().get(0).getItemCode(), "h5:allotted-time_26081705");
// workspace 有productfeatureCode
// workspace 有productterminal
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.terminal("NT_CMP_APP_GENERAL")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 1);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7);
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.terminal("NT_CMP_APP_GENERAL_sdf")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 0);
// workspace 有productterminal
// workspace 有productappType
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.appType("H5")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 1);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7);
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.appType("APP")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 0);
// workspace 有productappType
// workspace 有productitemCode
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.itemCode("h5:user_manage_D9B0186")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 1);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7);
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.itemCode("h5:user_manage_D9B0186_sdf")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 0);
// workspace 有productitemCode
// workspace 有productfeatureCodeterminalappTypeitemCode
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn"))
.terminal("NT_CMP_APP_GENERAL")
.appType("H5")
.itemCode("h5:user_manage_D9B0186")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 1);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L);
Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1);
param = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder()
.workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder()
.workspaceId(3L)
.featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn"))
.terminal("NT_CMP_APP_GENERAL")
.appType("APP")
.itemCode("h5:user_manage_D9B0186_sdf")
.build()))
.build();
workspacePermissions = workspaceProductService.listWorkspacePermissionCached(param).stream()
.collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions));
Assertions.assertEquals(workspacePermissions.get(3L).size(), 0);
// workspace 有productfeatureCodeterminalappTypeitemCode
}
}

View File

@ -0,0 +1,130 @@
#-->DEFAULT
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (100835, 'cms:project_9103', '项目', 1, 'NT_CMS_WEB_GENERAL', 0, 100000, '100000,100835,', 0, '', 0, 'cms:project_9103', 1, 1, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/d4137963b9f54c7787afa7ef52d95540.svg', 1, '/', 0, '', 0, 0, '{"moreIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/cc474a2dc1884b6081f33d470a2e03e6.svg", "activeIcon": "https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/oms/3e69eb003de64682a2e88c4d9da5ed1d.svg"}', 0, 0, '2024-06-01 14:50:52', '2024-10-29 11:29:10', 59926, 9000404098, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101048, 'cms:pro_contract_management_7701', '合约管理', 2, 'NT_CMS_WEB_GENERAL', 0, 100883, '100000,100835,100883,101048,', 2, '2', 0, 'cms:pro_contract_management_7701', 0, 1, '', 1, '/netConstruction/construction/contract-manage', 0, '', 0, 0, null, 1, 0, '2024-06-18 16:35:35', '2024-10-21 11:24:41', 59926, 9000404204, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101053, 'cms:pro_contract_price_authority_7706', '查看合约价格信息', 4, 'NT_CMS_WEB_GENERAL', 5, 101054, '100000,100835,100883,101048,101054,101053,', 0, '', 0, 'cms:pro_contract_price_authority_7706', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-07-12 14:02:46', '2024-10-21 11:24:43', 59926, 9000404204, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101054, 'cms:pro_contract_detail_7707', '合约详情', 4, 'NT_CMS_WEB_GENERAL', 1, 101048, '100000,100835,100883,101048,101054,', 0, '', 0, 'cms:pro_contract_detail_7707', 3, 1, '', 1, '/', 0, '', 0, 0, null, 1, 1, '2024-07-04 16:27:16', '2024-10-21 11:24:42', 185732, 9000404204, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101744, 'cmp:pro_team_list_0443', '查看班组列表', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101744,', 0, '', 0, 'cmp:pro_team_list_0443', 2, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:39:22', '2024-08-28 10:53:36', 86256, 25923, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101745, 'cmp:pro_worker_invite_recorder_0445', '查看工人入场申请', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101745,', 0, '', 0, 'cmp:pro_worker_invite_recorder_0445', 3, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:29', '2024-08-28 10:53:36', 86256, 25923, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101746, 'cmp:pro_team_leader_invite_recorder_0446', '班组长入场申请记录', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101746,', 0, '', 0, 'cmp:pro_team_leader_invite_recorder_0446', 4, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:40:50', '2024-08-28 10:53:36', 86256, 25923, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101749, 'cmp:pro_team_index_0449', '查看班组详情', 4, 'NT_CMP_APP_GENERAL', 5, 101741, '636,101437,101445,101573,101741,101749,', 0, '', 0, 'cmp:pro_team_index_0449', 7, 1, '', 1, '', 0, '', 0, 0, null, 1, 1, '2024-08-13 10:41:28', '2024-08-28 10:53:37', 86256, 25923, 0);
INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material)
VALUES (2, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695286111017-Snipaste_09-13 16-24.png', 2, '项目基础', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-12-12 15:37:27', 89601, 'GENERAL_SERVICE', 0, 0, 0, 0, NULL, NULL);
INSERT INTO product_module (id, icon, product_type, product_name, dict_workspace_type_id, dict_workspace_type_code, status, common_product, remark, auth_type, ou_type, is_delete, create_by, create_at, update_at, update_by, category, version, max_person_count, max_workspace_count, price, skus, material)
VALUES (3, 'https://axzo-public.oss-cn-chengdu.aliyuncs.com/oms/test/1695279180099-人脸照.jpg', 2, '实名考勤', 2, '2', 1, 1, '', 1, null, 0, 0, '2022-08-17 19:46:11', '2024-10-28 11:14:06', 9000404668, 'GENERAL_SERVICE', 0, 0, 0, 0, null, null);
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257742, 2, 7, '1', 101744, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257743, 2, 7, '1', 101745, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257744, 2, 7, '1', 101746, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257745, 2, 7, '1', 4443, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257746, 2, 7, '1', 4416, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257747, 2, 7, '1', 4417, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257748, 2, 7, '1', 4418, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257749, 2, 7, '1', 4419, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257750, 2, 7, '1', 4420, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1257751, 2, 7, '1', 912, 0, '2024-08-20 17:54:00', '2024-08-20 17:54:00', 0, 0, 1, 0, '');
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (14744, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 1, 'NT_CMS_WEB_GENERAL', '2024-07-10 20:39:15', '2024-07-10 20:39:15', null, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (18070, 'cms:pro_construction_contract_management', 'cms:pro_contract_management_7701', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (18079, 'cms:pro_construction_contract_detail', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (18080, 'cms:pro_construction_contract_detail_inventory_submit_audit', 'cms:pro_contract_detail_7707', 0, 'NT_CMS_WEB_GENERAL', '2024-07-16 09:56:12', '2024-07-16 09:56:11', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24219, 'h5:cmp_user_manage_worker_jump_to_team_btn', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24220, 'h5:cmp_user_manage_worker_page', 'cmp:pro_team_list_0443', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24221, 'h5:cmp_user_manage_worker_labor_audit_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24222, 'h5:cmp_user_manage_worker_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24223, 'h5:cmp_user_manage_labor_audit_page', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24224, 'h5:cmp_user_manage_labor_audit_detail_btn', 'cmp:pro_worker_invite_recorder_0445', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (24225, 'h5:cmp_user_manage_worker_on_site_audit_btn', 'cmp:pro_team_leader_invite_recorder_0446', 0, 'NT_CMP_APP_GENERAL', '2024-08-28 10:53:36', '2024-08-28 10:53:36', 25923, null, 0);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (718447, 'cms:pro_construction_contract_management', 'cms:pro_construction_contract_management', '合约管理', 'PAGE', '/netConstruction/construction/contract-manage', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (718451, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail', '合约详情', 'PAGE', '/netConstruction/construction/contract-manage/contract-detail', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:23', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (718455, 'cms:pro_construction_contract_detail', 'cms:pro_construction_contract_detail_inventory_submit_audit', '合约详情-提交审批', 'COMPONENT', '', 'NT_CMS_WEB_GENERAL', '2024-10-29 15:07:38', '2024-12-03 14:55:25', 0, '杜才伟-18682489918', 'PC', 0, 'CMS_COMMON', '', '', '单位组织', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, 9000404098);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369205, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_jump_to_team_btn', '人员管理-施工人员-跳转班组', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369197, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_page', '人员管理-施工人员', 'PAGE', '__UNI__D9B0186#/pages/worker/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:40', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369202, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_labor_audit_btn', '人员管理-施工人员-劳务审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369218, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_page', '人员管理-劳务审核', 'PAGE', '__UNI__D9B0186#/pages/labour/verify/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369219, 'h5:cmp_user_manage_labor_audit_page', 'h5:cmp_user_manage_labor_audit_detail_btn', '人员管理-劳务审核-详情', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369203, 'h5:cmp_user_manage_worker_page', 'h5:cmp_user_manage_worker_on_site_audit_btn', '人员管理-施工人员-进场审核', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:41', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369216, 'h5:cmp_user_manage_on_site_audit_page', 'h5:cmp_user_manage_on_site_audit_page', '人员管理-进场审核', 'PAGE', '__UNI__D9B0186#/pages/labour/enterAudit/index', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:42', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:user_manage_D9B0186', '', '__UNI__D9B0186', '人员管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1749220, 3, 27, '9', 101437, 0, '2024-10-28 11:14:06', '2024-10-28 11:14:06', 0, 0, 1, 6, 'NT_CMP_APP_GENERAL');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1749218, 3, 27, '9', 101934, 0, '2024-10-28 11:14:06', '2024-10-28 11:14:06', 0, 0, 1, 4, 'NT_CMP_APP_GENERAL');
INSERT INTO saas_product_module_feature_relation (id, product_module_id, dict_code_id, dict_code, feature_id, is_delete, create_at, update_at, create_by, update_by, type, feature_type, terminal)
VALUES (1749219, 3, 27, '9', 101936, 0, '2024-10-28 11:14:06', '2024-10-28 11:14:06', 0, 0, 1, 4, 'NT_CMP_APP_GENERAL');
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101437, 'cmp:application_center_019', '应用', 6, 'NT_CMP_APP_GENERAL', 0, 636, '636,101437,', 0, '', 0, 'cmp:application_center_019', 2, 1, '', 0, '', 0, '', 0, 0, '{"moreIcon": "", "activeIcon": "", "terminalType": "", "terminalBizType": ""}', 1, 0, '2024-05-31 11:26:29', '2024-12-13 09:31:22', 86256, 9000400021, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101934, 'cmp:pro_team_schedule_rule_edit_0912', '编辑', 4, 'NT_CMP_APP_GENERAL', 5, 101932, '636,101437,101444,101508,101932,101934,', 0, '', 0, 'cmp:pro_team_schedule_rule_edit_0912', 1, 1, '', 0, '', 0, '', 0, 0, null, 1, 1, '2024-09-12 15:30:56', '2024-09-12 18:55:42', 9000399280, 9000399280, 0);
INSERT INTO saas_feature_resource (id, feature_code, feature_name, feature_type, terminal, component_type, parent_id, path, workspace_type, workspace_types, version, uni_code, display_order, status, icon, redirect_type, link_url, link_type, link_ext, app_item_id, sync_version, extra, auth_type, sub_auth_type, create_at, update_at, create_by, update_by, is_delete)
VALUES (101936, 'cmp:pro_task_time_allocate_task_0912', '工时分配到任务', 4, 'NT_CMP_APP_GENERAL', 5, 101935, '636,101437,101444,101508,101935,101936,', 0, '', 0, 'cmp:pro_task_time_allocate_task_0912', 0, 1, '', 0, '', 0, '', 0, 0, null, 1, 1, '2024-09-12 18:55:43', '2024-09-12 18:55:43', 9000399280, 9000399280, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (25830, 'h5:cmp_attence_shift_list_page', 'cmp:pro_team_schedule_rule_edit_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:55:42', '2024-09-12 18:55:42', 9000399280, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (25831, 'h5:cmp_attence_shift_switch_btn', 'cmp:pro_team_schedule_rule_edit_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:55:42', '2024-09-12 18:55:42', 9000399280, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (25834, 'h5:cmp_allotted_time_page', 'cmp:pro_task_time_allocate_task_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:57:04', '2024-09-12 18:57:04', 9000399280, null, 0);
INSERT INTO saas_page_element_feature_resource_relation (id, page_element_code, feature_resource_uni_code, type, terminal, create_at, update_at, create_by, update_by, is_delete)
VALUES (25835, 'h5:cmp_allotted_time_detail_btn', 'cmp:pro_task_time_allocate_task_0912', 0, 'NT_CMP_APP_GENERAL', '2024-09-12 18:57:04', '2024-09-12 18:57:04', 9000399280, null, 0);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369373, 'h5:cmp_attence_shift_list_page', 'h5:cmp_attence_shift_list_page', '排班管理-排班列表', 'PAGE', '__UNI__D5F1867#/', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:53', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:attence_shift_D5F1867', '', '__UNI__D5F1867', '考勤班次H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369374, 'h5:cmp_attence_shift_list_page', 'h5:cmp_attence_shift_switch_btn', '排班管理-启用/禁用班次', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:53', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:attence_shift_D5F1867', '', '__UNI__D5F1867', '考勤班次H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369351, 'h5:cmp_allotted_time_page', 'h5:cmp_allotted_time_page', '工时管理-分配工时', 'PAGE', '__UNI__26081705#/allotedTime', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:51', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:allotted-time_26081705', '', '__UNI__26081705', '工时管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
INSERT INTO saas_page_element (id, group_code, code, name, type, link_url, terminal, create_at, update_at, is_delete, create_name, app_type, version, item_code, link_ext, app_id, item_name, ext, create_by, update_by)
VALUES (369352, 'h5:cmp_allotted_time_page', 'h5:cmp_allotted_time_detail_btn', '工时管理-分配工时-工时详情', 'COMPONENT', '', 'NT_CMP_APP_GENERAL', '2024-08-29 09:18:51', '2024-11-28 16:09:41', 0, '', 'H5', 0, 'h5:allotted-time_26081705', '', '__UNI__26081705', '工时管理H5', '{"applications": [{"type": "IOS", "minVersion": 0}, {"type": "ANDROID", "minVersion": 0}]}', null, null);
#-->WorkspaceProductServiceImplTest.sql