feat(REQ-3714) 工人退场流程优化 - 人员打标签流程迁移

This commit is contained in:
luofu 2025-03-11 15:37:44 +08:00
parent db6eaf84cc
commit 9b4dfab87f
8 changed files with 284 additions and 15 deletions

View File

@ -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);
}

View File

@ -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<String> valueCodes;
public boolean invalid() {
return StringUtils.isBlank(nodeCode) || CollUtil.isEmpty(valueCodes);
}
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -16,7 +16,7 @@ import lombok.NoArgsConstructor;
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DataTagQueryProperty {
public class DataTagProperty {
/**
* 单位id

View File

@ -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<DataTagNode> tagNodes;
/**
* 对象ID
*/
@NonNull
private List<Long> objectIds;
/**
* 查询对象
*/
@Builder.Default
private DataTagProperty property = new DataTagProperty();
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -48,7 +48,7 @@ public class RevokeDataTagReq {
* 查询对象
*/
@Builder.Default
private DataTagQueryProperty queryProperties = new DataTagQueryProperty();
private DataTagProperty properties = new DataTagProperty();
/**
* 严格模式

View File

@ -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<String, OperateTagsRequest.ObjectTagValueInfo> 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;
}
}

View File

@ -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);
}

View File

@ -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<OrgUserDTO> 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<NodeUserExtraQueryRepository.NodeUserExtraResp> nodeUserExtraList = listNodeUserExtra(param);
nodeUserExtraList.forEach(e -> e.setTags(dealTagPair(isRemove, e.getTags(), operateTagPair)));
List<OrgUserQueryRepository.OrgUserResp> orgUserList = listOrgUsers(param);
orgUserList.forEach(e -> e.setTags(dealTagPair(isRemove, e.getTags(), operateTagPair)));
if (CollUtil.isNotEmpty(nodeUserExtraList)) {
Map<Long, Set<String>> idTagsMap = nodeUserExtraList.stream()
.collect(Collectors.toMap(NodeUserExtraQueryRepository.NodeUserExtraResp::getId,
NodeUserExtraQueryRepository.NodeUserExtraResp::getTags));
nodeUserExtraUpsertRepository.updateTagsMap(idTagsMap);
update = true;
}
if (CollUtil.isNotEmpty(orgUserList)) {
Map<Long, Set<String>> 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<NodeUserExtraQueryRepository.NodeUserExtraResp> listNodeUserExtra(TagOperateReq param) {
NodeUserExtraQueryRepository.ListReq nodeUserExtraReq = NodeUserExtraQueryRepository.ListReq.builder()
.personIds(param.getPersonIds())
.workspaceId(param.getLoginWorkspaceId())
.build();
return nodeUserExtraQueryRepository.list(nodeUserExtraReq);
}
private List<OrgUserQueryRepository.OrgUserResp> 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<String> dealTagPair(boolean isRemove, Set<String> 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;
}
}