feat: (REQ-3300) 变更单详情-专业与区域优化
This commit is contained in:
parent
1414b9cf7f
commit
b40f421abb
@ -5,17 +5,22 @@ import cn.axzo.nanopart.visa.api.enums.VisaButtonTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.VisaChangeTempCreateReq;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Sets;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
@ -114,6 +119,11 @@ public class VisaDetailByIdResponse {
|
||||
*/
|
||||
private List<RelationAreaDetail> relationAreaList;
|
||||
|
||||
/**
|
||||
* 区域集合名称
|
||||
*/
|
||||
private String relationAreaName;
|
||||
|
||||
/**
|
||||
* 提出时间
|
||||
*/
|
||||
@ -130,6 +140,11 @@ public class VisaDetailByIdResponse {
|
||||
*/
|
||||
private List<RelationProfessionalDetail> relationProfessionalList;
|
||||
|
||||
/**
|
||||
* 专业集合名称
|
||||
*/
|
||||
private String relationProfessionalName;
|
||||
|
||||
/**
|
||||
* 相关单位及人员
|
||||
*/
|
||||
@ -291,21 +306,40 @@ public class VisaDetailByIdResponse {
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public static class RelationProfessionalDetail {
|
||||
/**
|
||||
* id
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* code
|
||||
*/
|
||||
private String code;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
* 构建专业集合-对象集合
|
||||
*/
|
||||
private String name;
|
||||
public static List<VisaDetailByIdResponse.RelationProfessionalDetail> buildProfessionWithObject(JSONArray relationProfessional) {
|
||||
|
||||
if (CollectionUtils.isEmpty(relationProfessional)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
List<VisaDetailByIdResponse.RelationProfessionalDetail> professionalList = relationProfessional.toJavaList(VisaDetailByIdResponse.RelationProfessionalDetail.class);
|
||||
|
||||
if (CollectionUtils.isEmpty(professionalList)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return professionalList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建专业集合-code集合
|
||||
*/
|
||||
public static Set<String> buildProfessionWithCode(JSONArray relationProfessional) {
|
||||
List<RelationProfessionalDetail> relationProfessionalDetails = RelationProfessionalDetail.buildProfessionWithObject(relationProfessional);
|
||||
if (CollectionUtils.isEmpty(relationProfessionalDetails)) {
|
||||
return Sets.newHashSet();
|
||||
}
|
||||
|
||||
return relationProfessionalDetails.stream()
|
||||
.filter(item -> Objects.nonNull(item) && StringUtils.isNotBlank(item.getCode()))
|
||||
.map(RelationProfessionalDetail::getCode).collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -331,10 +365,26 @@ public class VisaDetailByIdResponse {
|
||||
*/
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 名称
|
||||
*/
|
||||
private String name;
|
||||
|
||||
public static List<VisaDetailByIdResponse.RelationAreaDetail> buildAreaWithObject(JSONArray relationArea) {
|
||||
if (CollectionUtils.isEmpty(relationArea)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
List<VisaDetailByIdResponse.RelationAreaDetail> relationAreaList = relationArea.toJavaList(VisaDetailByIdResponse.RelationAreaDetail.class);
|
||||
if (CollectionUtils.isEmpty(relationAreaList)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return relationAreaList;
|
||||
}
|
||||
|
||||
public static List<Long> buildAreaWithId(JSONArray relationArea) {
|
||||
List<VisaDetailByIdResponse.RelationAreaDetail> areaDetailList = RelationAreaDetail.buildAreaWithObject(relationArea);
|
||||
|
||||
if (CollectionUtils.isEmpty(areaDetailList)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return areaDetailList.stream().map(VisaDetailByIdResponse.RelationAreaDetail::getId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -13,6 +13,7 @@ import org.apache.commons.collections.CollectionUtils;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@ -79,6 +80,11 @@ public class VisaConfirmDto {
|
||||
*/
|
||||
private Long projectId;
|
||||
|
||||
/**
|
||||
* 确认工程集合
|
||||
*/
|
||||
private Collection<Long> projectIds;
|
||||
|
||||
/**
|
||||
* 确认节点
|
||||
*/
|
||||
@ -115,20 +121,33 @@ public class VisaConfirmDto {
|
||||
dto.setPersonIds(personIds);
|
||||
}
|
||||
|
||||
Collection<Long> ouIds = dataItems.stream().map(item -> item.getOuId()).collect(Collectors.toSet());
|
||||
Collection<Long> ouIds = dataItems.stream()
|
||||
.filter(item -> Objects.nonNull(item.getOuId()))
|
||||
.map(item -> item.getOuId()).collect(Collectors.toSet());
|
||||
if (CollectionUtils.isNotEmpty(ouIds)) {
|
||||
dto.setOuIds(ouIds);
|
||||
}
|
||||
|
||||
Collection<Long> workspaceIds = dataItems.stream().map(item -> item.getWorkspaceId()).collect(Collectors.toSet());
|
||||
Collection<Long> workspaceIds = dataItems.stream()
|
||||
.filter(item -> Objects.nonNull(item.getWorkspaceId()))
|
||||
.map(item -> item.getWorkspaceId()).collect(Collectors.toSet());
|
||||
if (CollectionUtils.isNotEmpty(workspaceIds)) {
|
||||
dto.setWorkspaceIds(workspaceIds);
|
||||
}
|
||||
|
||||
Set<Long> nodeIds = dataItems.stream().map(item -> item.getNodeId()).collect(Collectors.toSet());
|
||||
Set<Long> nodeIds = dataItems.stream()
|
||||
.filter(item -> Objects.nonNull(item.getNodeId()))
|
||||
.map(item -> item.getNodeId()).collect(Collectors.toSet());
|
||||
if (CollectionUtils.isNotEmpty(nodeIds)) {
|
||||
dto.setNodeIds(nodeIds);
|
||||
}
|
||||
|
||||
Collection<Long> projectIds = dataItems.stream()
|
||||
.filter(item -> CollectionUtils.isNotEmpty(item.getProjectIds()))
|
||||
.flatMap(item -> item.getProjectIds().stream()).collect(Collectors.toSet());
|
||||
if (CollectionUtils.isNotEmpty(projectIds)) {
|
||||
dto.setProjectIds(projectIds);
|
||||
}
|
||||
}
|
||||
dto.setVisaTypes(visaTypes);
|
||||
return dto;
|
||||
|
||||
@ -6,6 +6,8 @@ import cn.axzo.apollo.core.web.Result;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.apache.commons.compress.utils.Lists;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
@ -23,6 +25,9 @@ public class ApolloConstructionAreaGateway {
|
||||
|
||||
public List<ConstructionAreaInfo> getAllConstructionAreaByIds(List<Long> areaIds) {
|
||||
try {
|
||||
if (CollectionUtils.isEmpty(areaIds)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
log.info("ApolloConstructionAreaGateway getAllConstructionAreaByIds,params:{}", JSON.toJSONString(areaIds));
|
||||
Result<List<ConstructionAreaInfo>> result = apolloConstructionAreaApi.getAllConstructionAreaByIds(areaIds);
|
||||
log.info("ApolloConstructionAreaGateway getAllConstructionAreaByIds,result:{}", JSON.toJSONString(result));
|
||||
@ -34,4 +39,20 @@ public class ApolloConstructionAreaGateway {
|
||||
|
||||
}
|
||||
|
||||
public String generateAreaFullNameByAreaIds(List<Long> areaIds) {
|
||||
try {
|
||||
if (CollectionUtils.isEmpty(areaIds)) {
|
||||
return "";
|
||||
}
|
||||
log.info("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds,params:{}", JSON.toJSONString(areaIds));
|
||||
Result<String> result = apolloConstructionAreaApi.generateAreaFullNameByAreaIds(areaIds);
|
||||
log.info("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds,result:{}", JSON.toJSONString(result));
|
||||
return result.getData();
|
||||
} catch (Exception e) {
|
||||
log.warn("ApolloConstructionAreaGateway generateAreaFullNameByAreaIds exception", e);
|
||||
throw e;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -2,14 +2,27 @@ package cn.axzo.nanopart.visa.server.service;
|
||||
|
||||
import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum;
|
||||
import cn.axzo.nanopart.visa.api.request.ChangeStatusRequest;
|
||||
import cn.axzo.nanopart.visa.api.response.VisaDetailByIdResponse;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaAddLogContext;
|
||||
import cn.axzo.nanopart.visa.server.dto.VisaLogParam;
|
||||
import cn.axzo.nanopart.visa.server.rpc.ApolloConstructionAreaGateway;
|
||||
import cn.axzo.nanopart.visa.server.rpc.DrawingMajorGateway;
|
||||
import cn.axzo.nanopart.visa.server.utils.Constants;
|
||||
import cn.axzo.thor.client.model.DrawingMajorResp;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* @author xudawei
|
||||
@ -26,6 +39,12 @@ public class VisaHelper {
|
||||
@Resource
|
||||
private ChangeRecordService changeRecordService;
|
||||
|
||||
@Resource
|
||||
private DrawingMajorGateway drawingMajorGateway;
|
||||
|
||||
@Resource
|
||||
private ApolloConstructionAreaGateway apolloConstructionAreaGateway;
|
||||
|
||||
/**
|
||||
* 状态更新与添加日志,此时新增记录时状态没有维护
|
||||
*/
|
||||
@ -58,4 +77,71 @@ public class VisaHelper {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建详情的专业回显
|
||||
*/
|
||||
public String buildProfessionalName(Long projectId, JSONArray professionals) {
|
||||
if (Objects.isNull(projectId) || CollectionUtils.isEmpty(professionals)) {
|
||||
return "";
|
||||
}
|
||||
Set<String> majorCodes = VisaDetailByIdResponse.RelationProfessionalDetail.buildProfessionWithCode(professionals);
|
||||
if (CollectionUtils.isEmpty(majorCodes)) {
|
||||
return "";
|
||||
}
|
||||
List<DrawingMajorResp> majorRespList = drawingMajorGateway.list(projectId, majorCodes, true);
|
||||
|
||||
// 构建专业集合 key:叶子结点code,value:父节点+子节点的名字
|
||||
Map<String, String> codeNameMap = this.buildProfessionalLeafName(majorRespList);
|
||||
|
||||
if (CollectionUtils.isEmpty(majorCodes)) {
|
||||
return "";
|
||||
}
|
||||
|
||||
return codeNameMap.values().stream().filter(item -> StringUtils.hasText(item)).collect(Collectors.joining(","));
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建区域名称
|
||||
*/
|
||||
public String buildAreaName(JSONArray areas) {
|
||||
if (CollectionUtils.isEmpty(areas)) {
|
||||
return "";
|
||||
}
|
||||
return apolloConstructionAreaGateway.generateAreaFullNameByAreaIds(VisaDetailByIdResponse.RelationAreaDetail.buildAreaWithId(areas));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param list 专业集合
|
||||
* @return key:叶子结点code,value:父节点+子节点的名字
|
||||
*/
|
||||
private Map<String, String> buildProfessionalLeafName(List<DrawingMajorResp> list) {
|
||||
if (CollectionUtils.isEmpty(list)) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
|
||||
Map<String, String> codeNameMap = new HashMap<>();
|
||||
for (DrawingMajorResp resp : list) {
|
||||
recursionProfessional(resp, resp.getName(), codeNameMap);
|
||||
}
|
||||
return codeNameMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归专业
|
||||
* codeNameMap,key:叶子结点code,value:父节点+子节点的名字
|
||||
*/
|
||||
private void recursionProfessional(DrawingMajorResp drawingMajorResp, String name, Map<String, String> codeNameMap) {
|
||||
if (Objects.isNull(drawingMajorResp) || CollectionUtils.isEmpty(drawingMajorResp.getChildren())) {
|
||||
return;
|
||||
}
|
||||
for (DrawingMajorResp resp : drawingMajorResp.getChildren()) {
|
||||
|
||||
if (CollectionUtils.isNotEmpty(resp.getChildren())) {
|
||||
recursionProfessional(resp, name + Constants.SPLIT_TREE_NODE_CHAT + resp.getName(), codeNameMap);
|
||||
} else {
|
||||
codeNameMap.put(resp.getCode(), name + Constants.SPLIT_TREE_NODE_CHAT + resp.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -303,6 +303,7 @@ public class ChangeRecordConfirmServiceImpl extends ServiceImpl<ChangeRecordConf
|
||||
.eq(Objects.nonNull(dto.getNodeId()), ChangeRecordConfirm::getNodeId, dto.getNodeId())
|
||||
.in(CollectionUtils.isNotEmpty(dto.getNodeIds()), ChangeRecordConfirm::getNodeId, dto.getNodeIds())
|
||||
.eq(Objects.nonNull(dto.getProjectId()), ChangeRecordConfirm::getProjectId, dto.getProjectId())
|
||||
.in(CollectionUtils.isNotEmpty(dto.getProjectIds()), ChangeRecordConfirm::getProjectId, dto.getProjectIds())
|
||||
.eq(Objects.nonNull(dto.getType()), ChangeRecordConfirm::getType, dto.getType())
|
||||
.eq(Objects.nonNull(dto.getBizType()), ChangeRecordConfirm::getBizType, dto.getBizType())
|
||||
.in(CollectionUtils.isNotEmpty(dto.getVisaTypes()), ChangeRecordConfirm::getVisaType, dto.getVisaTypes())
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
package cn.axzo.nanopart.visa.server.service.impl;
|
||||
|
||||
import cn.axzo.apollo.api.res.ConstructionAreaInfo;
|
||||
import cn.axzo.apollo.workspace.api.workspace.res.GetDetailRes;
|
||||
import cn.axzo.apollo.workspace.api.workspace.res.ProjectBriefResp;
|
||||
import cn.axzo.apollo.workspace.api.workspace.res.ProjectDetailRes;
|
||||
@ -71,7 +70,6 @@ import cn.axzo.nanopart.visa.server.utils.Constants;
|
||||
import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO;
|
||||
import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq;
|
||||
import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq;
|
||||
import cn.axzo.thor.client.model.DrawingMajorResp;
|
||||
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
|
||||
import cn.axzo.workflow.common.model.dto.UploadFieldDTO;
|
||||
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
|
||||
@ -82,7 +80,6 @@ import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.lang.Pair;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONArray;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
@ -207,7 +204,6 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
@Resource
|
||||
private VisaOrganizationalNodeUserGateway visaOrganizationalNodeUserGateway;
|
||||
|
||||
|
||||
/**
|
||||
* 状态变更
|
||||
*/
|
||||
@ -367,8 +363,10 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
.createBy(visa.getCreateBy()) //发起人Id
|
||||
.happenTime(Objects.nonNull(visa.getHappenTime()) ? DateUtil.format(visa.getHappenTime(), "yyyy-MM-dd") : "") // 提出时间
|
||||
.approvalCompleteTime(Objects.nonNull(visa.getApprovalCompleteTime()) ? DateUtil.format(visa.getApprovalCompleteTime(), "yyyy-MM-dd HH:mm:ss") : "") //最终审批时间
|
||||
.relationProfessionalList(this.buildProfession(visa.getRelationProject(), visa.getRelationProfessional()))//专业
|
||||
.relationAreaList(this.buildArea(visa.getRelationArea())) //区域
|
||||
.relationProfessionalList(VisaDetailByIdResponse.RelationProfessionalDetail.buildProfessionWithObject(visa.getRelationProfessional()))//专业
|
||||
.relationProfessionalName(this.visaHelper.buildProfessionalName(visa.getRelationProject(), visa.getRelationProfessional())) //专业名称
|
||||
.relationAreaList(VisaDetailByIdResponse.RelationAreaDetail.buildAreaWithObject(visa.getRelationArea())) //区域
|
||||
.relationAreaName(this.visaHelper.buildAreaName(visa.getRelationArea())) // 区域名称
|
||||
.relationProject(visa.getRelationProject()) // 工程Id
|
||||
.relationProjectName((Objects.nonNull(projectDetailRes) && Objects.nonNull(projectDetailRes.getProjectInfo())) ? projectDetailRes.getProjectInfo().getName() : "") // 工程名称
|
||||
.relationWorkspaceId(visa.getRelationWorkspaceId()) // 项目Id
|
||||
@ -1110,58 +1108,9 @@ public class ChangeRecordServiceImpl extends ServiceImpl<ChangeRecordDao, Change
|
||||
}));
|
||||
}
|
||||
|
||||
private List<VisaDetailByIdResponse.RelationAreaDetail> buildArea(JSONArray relationArea) {
|
||||
if (CollectionUtils.isEmpty(relationArea)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
List<VisaDetailByIdResponse.RelationArea> relationAreaList = relationArea.toJavaList(VisaDetailByIdResponse.RelationArea.class);
|
||||
if (CollectionUtils.isEmpty(relationAreaList)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
List<Long> areaIds = relationAreaList.stream()
|
||||
.filter(item -> Objects.nonNull(item.getId()))
|
||||
.map(VisaDetailByIdResponse.RelationArea::getId).collect(Collectors.toList());
|
||||
if (CollectionUtils.isEmpty(areaIds)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
List<ConstructionAreaInfo> list = apolloConstructionAreaGateway.getAllConstructionAreaByIds(areaIds);
|
||||
if (CollectionUtils.isEmpty(list)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return list.stream().map(item -> VisaDetailByIdResponse.RelationAreaDetail.builder()
|
||||
.id(item.getId())
|
||||
.name(item.getName()).build())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建专业集合
|
||||
*/
|
||||
private List<VisaDetailByIdResponse.RelationProfessionalDetail> buildProfession(Long projectId, JSONArray relationProfessional) {
|
||||
|
||||
if (Objects.isNull(projectId) || CollectionUtils.isEmpty(relationProfessional)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
List<VisaDetailByIdResponse.RelationProfessional> professionalList = relationProfessional.toJavaList(VisaDetailByIdResponse.RelationProfessional.class);
|
||||
|
||||
if (CollectionUtils.isEmpty(professionalList)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
Set<String> majorCodes = professionalList.stream()
|
||||
.filter(item -> StringUtils.hasText(item.getCode()))
|
||||
.map(VisaDetailByIdResponse.RelationProfessional::getCode).collect(Collectors.toSet());
|
||||
if (CollectionUtils.isEmpty(majorCodes)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
|
||||
List<DrawingMajorResp> majorRespList = drawingMajorGateway.list(projectId, majorCodes, true);
|
||||
if (CollectionUtils.isEmpty(majorCodes)) {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
return majorRespList.stream()
|
||||
.map(item -> VisaDetailByIdResponse.RelationProfessionalDetail.builder().id(item.getId()).code(item.getCode()).name(item.getName()).build())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过变更签证Id获取Entity
|
||||
|
||||
@ -45,4 +45,9 @@ public class Constants {
|
||||
* 工程签证数据权限的code
|
||||
*/
|
||||
public static final String PROJECT_VISA_DATA_OBJECT = "project_visa";
|
||||
|
||||
/**
|
||||
* 工程签证数据权限的code
|
||||
*/
|
||||
public static final String SPLIT_TREE_NODE_CHAT = "-";
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user