From 9b4dfab87f5d300ea58d9a1a96303229610ad10d Mon Sep 17 00:00:00 2001 From: luofu Date: Tue, 11 Mar 2025 15:37:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(REQ-3714)=20=E5=B7=A5=E4=BA=BA=E9=80=80?= =?UTF-8?q?=E5=9C=BA=E6=B5=81=E7=A8=8B=E4=BC=98=E5=8C=96=20-=20=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E6=89=93=E6=A0=87=E7=AD=BE=E6=B5=81=E7=A8=8B=E8=BF=81?= =?UTF-8?q?=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../client/datatagger/DataTagClient.java | 8 ++ .../client/datatagger/dto/DataTagNode.java | 43 +++++++ ...ueryProperty.java => DataTagProperty.java} | 2 +- .../datatagger/dto/OperateDataTagReq.java | 56 ++++++++ .../datatagger/dto/RevokeDataTagReq.java | 2 +- .../sdk/datatagger/DataTagClientImpl.java | 62 +++++++-- .../orguser/service/OrgUserService.java | 5 +- .../service/impl/OrgUserServiceImpl.java | 121 +++++++++++++++++- 8 files changed, 284 insertions(+), 15 deletions(-) create mode 100644 orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagNode.java rename orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/{DataTagQueryProperty.java => DataTagProperty.java} (95%) create mode 100644 orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/OperateDataTagReq.java diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/DataTagClient.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/DataTagClient.java index d43c362..a59b646 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/DataTagClient.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/DataTagClient.java @@ -1,5 +1,6 @@ package cn.axzo.orgmanax.infra.client.datatagger; +import cn.axzo.orgmanax.infra.client.datatagger.dto.OperateDataTagReq; import cn.axzo.orgmanax.infra.client.datatagger.dto.RevokeDataTagReq; /** @@ -17,4 +18,11 @@ public interface DataTagClient { * @return 结果,成功返回 {@code true},否则返回 {@code false} */ boolean revokeDataTags(RevokeDataTagReq request); + + /** + * 标签操作 + * + * @param tagsRequest 入参 + */ + void operateDataTags(OperateDataTagReq tagsRequest); } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagNode.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagNode.java new file mode 100644 index 0000000..2831e47 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagNode.java @@ -0,0 +1,43 @@ +package cn.axzo.orgmanax.infra.client.datatagger.dto; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.lang.StringUtils; + +import java.util.List; +import java.util.Map; + +/** + * @author luofu + * @version 1.0 + * @date 2025/3/10 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class DataTagNode { + + /** + * 节点编码 + */ + private String nodeCode; + + /** + * 标签值的编码 + */ + private List valueCodes; + + public boolean invalid() { + return StringUtils.isBlank(nodeCode) || CollUtil.isEmpty(valueCodes); + } + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagQueryProperty.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagProperty.java similarity index 95% rename from orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagQueryProperty.java rename to orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagProperty.java index f2a47dd..d1f07de 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagQueryProperty.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/DataTagProperty.java @@ -16,7 +16,7 @@ import lombok.NoArgsConstructor; @Builder @NoArgsConstructor @AllArgsConstructor -public class DataTagQueryProperty { +public class DataTagProperty { /** * 单位id diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/OperateDataTagReq.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/OperateDataTagReq.java new file mode 100644 index 0000000..7e41544 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/OperateDataTagReq.java @@ -0,0 +1,56 @@ +package cn.axzo.orgmanax.infra.client.datatagger.dto; + +import cn.axzo.orgmanax.infra.client.datatagger.enums.DataTagTypeEnum; +import com.alibaba.fastjson.JSON; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.NonNull; + +import java.util.List; + +/** + * @author luofu + * @version 1.0 + * @description 添加数据标签入参 + * @date 2025/3/10 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class OperateDataTagReq { + + @NonNull + private String app; + + /** + * 对象类型 - 必传 + */ + @NonNull + private DataTagTypeEnum objectType; + + /** + * 标签编码 - 必传 + */ + @NonNull + private List tagNodes; + + /** + * 对象ID + */ + @NonNull + private List objectIds; + + /** + * 查询对象 + */ + @Builder.Default + private DataTagProperty property = new DataTagProperty(); + + @Override + public String toString() { + return JSON.toJSONString(this); + } +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/RevokeDataTagReq.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/RevokeDataTagReq.java index 22c8948..a5fd7ed 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/RevokeDataTagReq.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/datatagger/dto/RevokeDataTagReq.java @@ -48,7 +48,7 @@ public class RevokeDataTagReq { * 查询对象 */ @Builder.Default - private DataTagQueryProperty queryProperties = new DataTagQueryProperty(); + private DataTagProperty properties = new DataTagProperty(); /** * 严格模式 diff --git a/orgmanax-integration/src/main/java/cn/axzo/orgmanax/integration/sdk/datatagger/DataTagClientImpl.java b/orgmanax-integration/src/main/java/cn/axzo/orgmanax/integration/sdk/datatagger/DataTagClientImpl.java index 5073b1e..cc8e180 100644 --- a/orgmanax-integration/src/main/java/cn/axzo/orgmanax/integration/sdk/datatagger/DataTagClientImpl.java +++ b/orgmanax-integration/src/main/java/cn/axzo/orgmanax/integration/sdk/datatagger/DataTagClientImpl.java @@ -1,18 +1,26 @@ package cn.axzo.orgmanax.integration.sdk.datatagger; +import cn.axzo.datatagger.api.JsonQueryFields; import cn.axzo.datatagger.api.objecttag.ObjectTagClient; import cn.axzo.datatagger.api.objecttag.request.ObjectTagQueryProperties; import cn.axzo.datatagger.api.objecttag.request.RevokeObjectTagRequest; +import cn.axzo.datatagger.api.tagope.TagOperateClient; +import cn.axzo.datatagger.api.tagope.request.OperateTagsRequest; import cn.axzo.datatagger.common.enums.TagObjectType; import cn.axzo.orgmanax.infra.client.datatagger.DataTagClient; -import cn.axzo.orgmanax.infra.client.datatagger.dto.DataTagQueryProperty; +import cn.axzo.orgmanax.infra.client.datatagger.dto.DataTagNode; +import cn.axzo.orgmanax.infra.client.datatagger.dto.DataTagProperty; +import cn.axzo.orgmanax.infra.client.datatagger.dto.OperateDataTagReq; import cn.axzo.orgmanax.infra.client.datatagger.dto.RevokeDataTagReq; import cn.axzo.orgmanax.integration.core.RpcWrapper; +import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Component; import java.util.Optional; +import java.util.function.Function; /** * @author luofu @@ -25,32 +33,66 @@ import java.util.Optional; public class DataTagClientImpl implements DataTagClient { private final ObjectTagClient objectTagClient; + private final TagOperateClient tagOperateClient; @Override public boolean revokeDataTags(RevokeDataTagReq request) { return RpcWrapper.commonRes(() -> objectTagClient.revokeObjectTags(toRevokeRequest(request))); } + @Override + public void operateDataTags(OperateDataTagReq tagsRequest) { + RpcWrapper.commonRes(() -> tagOperateClient.operateTags(toOperateTagsRequest(tagsRequest))); + } + private static RevokeObjectTagRequest toRevokeRequest(RevokeDataTagReq request) { RevokeObjectTagRequest req = new RevokeObjectTagRequest(); BeanUtils.copyProperties(request, req); req.setObjectType(TagObjectType.valueOf(request.getObjectType().name())); - req.setQueryProperties(toQueryProperties(request.getQueryProperties())); + req.setQueryProperties(toQueryProperties(request.getProperties())); return req; } - private static ObjectTagQueryProperties toQueryProperties(DataTagQueryProperty queryProperties) { - ObjectTagQueryProperties properties = new ObjectTagQueryProperties(); + private static OperateTagsRequest toOperateTagsRequest(OperateDataTagReq param) { + OperateTagsRequest operateTagsRequest = new OperateTagsRequest(); + operateTagsRequest.setApp(param.getApp()); + operateTagsRequest.setObjectType(TagObjectType.valueOf(param.getObjectType().name())); + operateTagsRequest.setRuntimeFields(toProperties(param.getProperty())); + operateTagsRequest.setObjectIds(param.getObjectIds()); + operateTagsRequest.setTagInfos(CollUtil.map(param.getTagNodes(), DataTagClientImpl::toTagValueInfo, true)); + return operateTagsRequest; + } + + private static ObjectTagQueryProperties toQueryProperties(DataTagProperty properties) { + ObjectTagQueryProperties queryProperties = new ObjectTagQueryProperties(); + queryProperties.setProps(toProperties(properties)); + return queryProperties; + } + + private static OperateTagsRequest.TagValueInfo toTagValueInfo(DataTagNode tagNode) { + OperateTagsRequest.TagValueInfo tagValueInfo = new OperateTagsRequest.TagValueInfo(); + // tag node code + tagValueInfo.setTagNodeCode(tagNode.getNodeCode()); + // tag value mapper + Function tagValueMapper = e -> + OperateTagsRequest.ObjectTagValueInfo.builder().tagValueCode(e).build(); + tagValueInfo.setObjectTagValues(CollUtil.map(tagNode.getValueCodes(), tagValueMapper, true)); + return tagValueInfo; + } + + private static JSONObject toProperties(DataTagProperty properties) { + JSONObject tagProperties = new JSONObject(); + JsonQueryFields fields = JsonQueryFields.create(tagProperties); // ouId - Optional.ofNullable(queryProperties.getOuId()).ifPresent(properties::setOuId); + Optional.ofNullable(properties.getOuId()).ifPresent(fields::setOuId); // workspaceId - Optional.ofNullable(queryProperties.getWorkspaceId()).ifPresent(properties::setWorkspaceId); + Optional.ofNullable(properties.getWorkspaceId()).ifPresent(fields::setWorkspaceId); // projectTeamNodeId - Optional.ofNullable(queryProperties.getPlatTeamNodeId()).ifPresent(properties::setPlatTeamNodeId); + Optional.ofNullable(properties.getPlatTeamNodeId()).ifPresent(fields::setPlatTeamNodeId); // projectTeamNodeId - Optional.ofNullable(queryProperties.getProjectTeamNodeId()).ifPresent(properties::setProjectTeamNodeId); + Optional.ofNullable(properties.getProjectTeamNodeId()).ifPresent(fields::setProjectTeamNodeId); // groupNodeId - Optional.ofNullable(queryProperties.getGroupNodeId()).ifPresent(properties::setGroupNodeId); - return properties; + Optional.ofNullable(properties.getGroupNodeId()).ifPresent(fields::setGroupNodeId); + return tagProperties; } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/OrgUserService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/OrgUserService.java index 7b8e43e..ed36c2a 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/OrgUserService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/OrgUserService.java @@ -1,8 +1,9 @@ package cn.axzo.orgmanax.server.orguser.service; import cn.axzo.foundation.page.PageResp; -import cn.axzo.orgmanax.dto.orguser.req.ListOrgUserReq; +import cn.axzo.orgmanax.dto.nodeuser.req.TagOperateReq; import cn.axzo.orgmanax.dto.orguser.dto.OrgUserDTO; +import cn.axzo.orgmanax.dto.orguser.req.ListOrgUserReq; import java.util.List; @@ -14,5 +15,5 @@ public interface OrgUserService { return page(req).getData(); } - + void operateTag(TagOperateReq param); } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/impl/OrgUserServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/impl/OrgUserServiceImpl.java index 3174b2c..455dc3c 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/impl/OrgUserServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/impl/OrgUserServiceImpl.java @@ -1,16 +1,33 @@ package cn.axzo.orgmanax.server.orguser.service.impl; import cn.axzo.foundation.page.PageResp; -import cn.axzo.orgmanax.dto.orguser.req.ListOrgUserReq; +import cn.axzo.orgmanax.dto.nodeuser.enums.TagOperateEnum; +import cn.axzo.orgmanax.dto.nodeuser.req.TagOperateReq; import cn.axzo.orgmanax.dto.orguser.dto.OrgUserDTO; +import cn.axzo.orgmanax.dto.orguser.req.ListOrgUserReq; +import cn.axzo.orgmanax.infra.client.datatagger.DataTagClient; +import cn.axzo.orgmanax.infra.client.datatagger.dto.DataTagNode; +import cn.axzo.orgmanax.infra.client.datatagger.dto.DataTagProperty; +import cn.axzo.orgmanax.infra.client.datatagger.dto.OperateDataTagReq; +import cn.axzo.orgmanax.infra.client.datatagger.dto.RevokeDataTagReq; +import cn.axzo.orgmanax.infra.client.datatagger.enums.DataTagTypeEnum; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserExtraQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserExtraUpsertRepository; import cn.axzo.orgmanax.infra.dao.orguser.repository.OrgUserQueryRepository; +import cn.axzo.orgmanax.infra.dao.orguser.repository.OrgUserUpsertRepository; import cn.axzo.orgmanax.server.orguser.service.OrgUserService; import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import com.google.common.collect.Sets; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Slf4j @@ -19,6 +36,11 @@ import java.util.stream.Collectors; public class OrgUserServiceImpl implements OrgUserService { private final OrgUserQueryRepository orgUserQueryRepository; + private final OrgUserUpsertRepository orgUserUpsertRepository; + private final NodeUserExtraQueryRepository nodeUserExtraQueryRepository; + private final NodeUserExtraUpsertRepository nodeUserExtraUpsertRepository; + + private final DataTagClient dataTagClient; @Override public PageResp page(ListOrgUserReq req) { @@ -27,4 +49,101 @@ public class OrgUserServiceImpl implements OrgUserService { // assemble data if needed return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records); } + + @Override + public void operateTag(TagOperateReq param) { + String operateTagPair = param.getTagNodeCode() + ":" + param.getTagValueCode(); + boolean isRemove = param.getOperateType() == TagOperateEnum.REMOVE; + boolean update = false; + List nodeUserExtraList = listNodeUserExtra(param); + nodeUserExtraList.forEach(e -> e.setTags(dealTagPair(isRemove, e.getTags(), operateTagPair))); + List orgUserList = listOrgUsers(param); + orgUserList.forEach(e -> e.setTags(dealTagPair(isRemove, e.getTags(), operateTagPair))); + if (CollUtil.isNotEmpty(nodeUserExtraList)) { + Map> idTagsMap = nodeUserExtraList.stream() + .collect(Collectors.toMap(NodeUserExtraQueryRepository.NodeUserExtraResp::getId, + NodeUserExtraQueryRepository.NodeUserExtraResp::getTags)); + nodeUserExtraUpsertRepository.updateTagsMap(idTagsMap); + update = true; + } + if (CollUtil.isNotEmpty(orgUserList)) { + Map> idTagsMap = orgUserList.stream() + .collect(Collectors.toMap(OrgUserQueryRepository.OrgUserResp::getId, OrgUserQueryRepository.OrgUserResp::getTags)); + orgUserUpsertRepository.updateTagsMap(idTagsMap); + update = true; + } + if (update) { + if (isRemove) { + RevokeDataTagReq revokeObjectTagRequest = toRevokeDataTagReq(param); + dataTagClient.revokeDataTags(revokeObjectTagRequest); + } else { + OperateDataTagReq operateTagsRequest = toOperateTagsRequest(param); + dataTagClient.operateDataTags(operateTagsRequest); + } + } + } + + private List listNodeUserExtra(TagOperateReq param) { + NodeUserExtraQueryRepository.ListReq nodeUserExtraReq = NodeUserExtraQueryRepository.ListReq.builder() + .personIds(param.getPersonIds()) + .workspaceId(param.getLoginWorkspaceId()) + .build(); + return nodeUserExtraQueryRepository.list(nodeUserExtraReq); + } + + private List listOrgUsers(TagOperateReq param) { + ListOrgUserReq request = ListOrgUserReq.builder() + .personIds(Optional.ofNullable(param.getPersonIds()).map(Sets::newHashSet).orElseGet(Sets::newHashSet)) + .workspaceId(param.getLoginWorkspaceId()) + .build(); + return orgUserQueryRepository.list(request); + } + + /** + * 处理标签对 + */ + private Set dealTagPair(boolean isRemove, Set tags, String operateTagPair) { + if (CollUtil.isEmpty(tags)) { + if (isRemove) { + return Collections.emptySet(); + } else { + return Collections.singleton(operateTagPair); + } + } + if (isRemove) { + tags.remove(operateTagPair); + } else { + tags.add(operateTagPair); + } + return tags; + } + + private static OperateDataTagReq toOperateTagsRequest(TagOperateReq param) { + OperateDataTagReq operateTag = new OperateDataTagReq(); + operateTag.setApp("maokai"); + operateTag.setObjectType(DataTagTypeEnum.PROJECT_PERSON); + operateTag.setObjectIds(param.getPersonIds()); + // properties + DataTagProperty property = new DataTagProperty(); + property.setWorkspaceId(param.getLoginWorkspaceId()); + operateTag.setProperty(property); + // tag node + DataTagNode tagNode = new DataTagNode(); + tagNode.setNodeCode(param.getTagNodeCode()); + tagNode.setValueCodes(Collections.singletonList(param.getTagValueCode())); + operateTag.setTagNodes(Collections.singletonList(tagNode)); + return operateTag; + } + + private static RevokeDataTagReq toRevokeDataTagReq(TagOperateReq param) { + RevokeDataTagReq revokeDataTag = new RevokeDataTagReq(); + revokeDataTag.setObjectIds(param.getPersonIds()); + revokeDataTag.setTagCodes(Collections.singletonList(param.getTagNodeCode())); + revokeDataTag.setTagValueCodes(Collections.singletonList(param.getTagValueCode())); + revokeDataTag.setObjectType(DataTagTypeEnum.PROJECT_PERSON); + DataTagProperty tagQueryProperties = new DataTagProperty(); + tagQueryProperties.setWorkspaceId(param.getLoginWorkspaceId()); + revokeDataTag.setProperties(tagQueryProperties); + return revokeDataTag; + } }