feat(REQ-3488): 添加NodeUserProfile定义及解析。重构NodeUserService.list方法的代码,将listReq的resolve抽成一个方法,提升page主方法的可读性。

This commit is contained in:
周敏 2025-01-02 15:26:17 +08:00
parent 69dae02844
commit 0ea671f661
6 changed files with 220 additions and 61 deletions

View File

@ -33,7 +33,9 @@ public class NodeProfile {
* 平台班组所属团队/单位 id
*/
private Long ouId;
//
// org_project_team 字段
private Long projectTeamId;
/**
* 总包ID
*/
@ -110,11 +112,11 @@ public class NodeProfile {
// 新冗余字段
private Long belongProjectTeamNodeId;
// org_project_group 字段
/**
* 主键id
*/
private Long id;
private Long projectGroupId;
/**
* 小组类型 0-直属小组 1-合作小组

View File

@ -16,6 +16,7 @@ import lombok.experimental.SuperBuilder;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Optional;
@NoArgsConstructor
@AllArgsConstructor
@ -186,4 +187,33 @@ public class NodeUserDTO implements Serializable {
*/
private List<NodeUserBriefDTO> subordinateUsers;
/**
* 解析profile
* 调用方需要根据nodeType来解析profile自行使用正确的对象来接收<br>
* 解析对象需要 {@link #getNode()}.nodType信息请确认{@link ListNodeUserReq.Needs#getNode()} = true否则仅会返回json的profile<br>
* <pre>
* NodeUserProfile.ProjectWorkerProfile projectTeamProfile = projectTeamNodeUser.resolveProfile(); // nodeType = 4
* NodeUserProfile.PlatTeamProfile platTeamProfile = platTeamNodeUser.resolveProfile(); // nodeType = 2
* JSONObject normalProfile = normalNodeUser.resolveProfile(); // nodeType = 1
*
* </pre>
*
* @return
* @see NodeUserProfile#resolveProfileClass(Integer)
*/
public <T> T resolveProfile() {
if (profile == null || profile.isEmpty()) {
return (T) profile;
}
if (node == null || node.getNodeType() == null) {
// 没有聚合node信息的情况直接返回JSONObject的profile
return (T) profile;
}
Class<?> clazz = NodeUserProfile.resolveProfileClass(node.getNodeType());
if (clazz == null) {
return (T) profile;
}
return (T) Optional.ofNullable(profile).map(p -> JSONObject.parseObject(p.toString(), clazz)).orElse(null);
}
}

View File

@ -0,0 +1,108 @@
package cn.axzo.orgmanax.dto.nodeuser.dto;
import cn.axzo.orgmanax.dto.node.enums.NodeTypeEnum;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.ImmutableMap;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.Date;
import java.util.Map;
/**
* 部门人员Profile定义
*/
public class NodeUserProfile {
/**
* 项目工人Profile为了方便直观看到对应关系字段和 org_project_team 保持一致
*/
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@Data
public static class ProjectWorkerProfile {
// org_project_worker 字段
/**
* 项目班组节点id
*/
private Long projectWorkerId;
/**
* 状态0未激活 1已激活 3已退场
*/
private Integer status;
/**
* 工种类别
*/
private String professionCategoryName;
/**
* 是否删除 0:未删除 其他:已删除
*/
private Long isDelete;
/**
* 最后一次进工地的时间进场打卡更新
* 进场打卡更新
*/
private Date lastCheckInTime;
/**
* 最后一次出工地的时间出场打卡更新
*/
private Date lastCheckOutTime;
/**
* 工人施工开始时间工人所有任务单中最早开始时间
*/
private Date constructionStartTime;
/**
* 工人施工结束时间
*/
private Date constructionEndTime;
/**
* 在岗待岗
*/
private Integer occupyStatus;
/**
* 提醒推送未备案消息次数xxljob在给未备案的工人发送消息为了避免多次提醒这里记录了一个提醒的次数
* 参考 maokai代码cn.axzo.apollo.labour.service.job.PushSupervisionMsgJob#execute
*/
private Integer pushSupervisionMsgCount;
}
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@Data
/**
* 项目小组人员Profile
*/
public static class ProjectGroupWorkerProfile {
// 新冗余字段
/**
* 项目小组人员id
*/
private Long projectGroupWorkerId;
/**
* 状态 状态 0-有效 1-无效
*/
private Integer status;
}
private static final Map<Integer, Class<?>> typeClassMapping = ImmutableMap.of(
NodeTypeEnum.PROJECT_TEAM.getValue(), ProjectWorkerProfile.class,
NodeTypeEnum.PROJECT_GROUP.getValue(), ProjectGroupWorkerProfile.class
);
public static Class<?> resolveProfileClass(Integer nodeType) {
if (nodeType == null) {
return JSONObject.class;
}
return typeClassMapping.getOrDefault(nodeType, JSONObject.class);
}
}

View File

@ -262,7 +262,13 @@ public interface NodeUserQueryRepository {
private Collection<String> orgUserStatus; // TODO: 待实现
@CriteriaField(ignore = true)
List<SFunction<OrganizationalNodeUser, ?>> selects;
private List<SFunction<OrganizationalNodeUser, ?>> selects;
/**
* 直接返回空
*/
@CriteriaField(ignore = true)
private Boolean returnEmpty;
}
@NoArgsConstructor

View File

@ -33,6 +33,9 @@ public class NodeUserQueryRepositoryImpl implements NodeUserQueryRepository {
public PageResp<NodeUserResp> page(ListReq req) {
IPage<OrganizationalNodeUser> page = PageConverter.toMybatis(req, OrganizationalNodeUser.class);
PageResp<NodeUserResp> emptyPage = PageResp.<NodeUserResp>builder().size(req.getPageSize()).current(req.getPage()).total(0L).data(ImmutableList.of()).build();
if (BooleanUtil.isTrue(req.getReturnEmpty())) {
return emptyPage;
}
LambdaQueryWrapper<OrganizationalNodeUser> wrapper = QueryWrapperHelper.fromBean(req, OrganizationalNodeUser.class).lambda();
// 查询参数处理 ~
// keyword

View File

@ -97,63 +97,8 @@ public class NodeUserServiceImpl implements NodeUserService {
public PageResp<NodeUserDTO> page(ListNodeUserReq req) {
PageResp<NodeUserDTO> emptyPage = PageResp.<NodeUserDTO>builder().size(req.getPageSize())
.current(req.getPage()).total(0L).data(ImmutableList.of()).build();
NodeUserQueryRepository.ListReq listReq = BeanUtil.toBean(req, NodeUserQueryRepository.ListReq.class);
// jobCodes -> jobIds
if (CollUtil.isNotEmpty(req.getOrganizationalJobCodes())
|| StrUtil.isNotBlank(req.getOrganizationalJobCode())
|| StrUtil.isNotBlank(req.getOrganizationalJobNameLike())
|| StrUtil.isNotBlank(req.getOrganizationalJobName())) {
Set<Long> jobIds = jobQueryRepository.list(OrgJobQueryRepository.ListReq.builder()
.codes(req.getOrganizationalJobCodes())
.code(req.getOrganizationalJobCode())
.nameLike(req.getOrganizationalJobNameLike())
.name(req.getOrganizationalJobName())
.searchCount(false)
.build()).stream().map(OrgJobQueryRepository.JobResp::getId).collect(Collectors.toSet());
if (jobIds.isEmpty()) {
return emptyPage;
}
listReq.setOrganizationalJobIds(QueryConditionAssembler.assemble(listReq.getOrganizationalJobIds(), jobIds));
}
// 根据managerPersonId进行查询 -> 找到 manage的nodeId作为查询条件往下查
if (req.getManagerPersonId() != null) {
Set<Long> managedOrgNodeId = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.manager(true)
.personId(req.getManagerPersonId())
.selects(ImmutableList.of(OrganizationalNodeUser::getOrganizationalNodeId))
.searchCount(false)
.pageSize(100000)
.build()).stream()
.map(NodeUserQueryRepository.NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet());
if (managedOrgNodeId.isEmpty()) {
return emptyPage;
}
listReq.setOrganizationalNodeIds(QueryConditionAssembler.assemble(listReq.getOrganizationalNodeIds(), managedOrgNodeId));
}
// subordinatePersonId
if (req.getSubordinatePersonId() != null) {
Set<Long> nodeIds = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.personId(req.getSubordinatePersonId())
.manager(false)
.selects(ImmutableList.of(OrganizationalNodeUser::getOrganizationalNodeId))
.searchCount(false)
.build())
.stream().map(NodeUserQueryRepository.NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet());
if (nodeIds.isEmpty()) {
return emptyPage;
}
// 查询 subordinatePersonId 所在节点的管理员
listReq.setOrganizationalNodeIds(QueryConditionAssembler.assemble(listReq.getOrganizationalNodeIds(), nodeIds));
listReq.setManager(true);
}
if (req.getDirectManagerPersonId() != null) {
listReq.setExtraQueries(QueryConditionAssembler.assemble(listReq.getExtraQueries(), ImmutableList.of(MybatisPlusOperatorProcessor.JSONQuery.builder()
.jsonPath("$.directManagerPersonId")
.data(req.getDirectManagerPersonId())
.build())));
}
// 构建 repository层查询参数
NodeUserQueryRepository.ListReq listReq = resolveListReq(req);
PageResp<NodeUserQueryRepository.NodeUserResp> page = nodeUserQueryRepository.page(listReq);
if (CollUtil.isEmpty(page.getData())) {
@ -184,6 +129,71 @@ public class NodeUserServiceImpl implements NodeUserService {
return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records);
}
private NodeUserQueryRepository.ListReq resolveListReq(ListNodeUserReq req) {
NodeUserQueryRepository.ListReq listReq = BeanUtil.toBean(req, NodeUserQueryRepository.ListReq.class);
// jobCodes -> jobIds
if (CollUtil.isNotEmpty(req.getOrganizationalJobCodes())
|| StrUtil.isNotBlank(req.getOrganizationalJobCode())
|| StrUtil.isNotBlank(req.getOrganizationalJobNameLike())
|| StrUtil.isNotBlank(req.getOrganizationalJobName())) {
Set<Long> jobIds = jobQueryRepository.list(OrgJobQueryRepository.ListReq.builder()
.codes(req.getOrganizationalJobCodes())
.code(req.getOrganizationalJobCode())
.nameLike(req.getOrganizationalJobNameLike())
.name(req.getOrganizationalJobName())
.searchCount(false)
.build()).stream().map(OrgJobQueryRepository.JobResp::getId).collect(Collectors.toSet());
if (jobIds.isEmpty()) {
listReq.setReturnEmpty(true);
return listReq;
}
listReq.setOrganizationalJobIds(QueryConditionAssembler.assemble(listReq.getOrganizationalJobIds(), jobIds));
}
// 根据managerPersonId进行查询 -> 找到 manage的nodeId作为查询条件往下查
if (req.getManagerPersonId() != null) {
Set<Long> managedOrgNodeId = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.manager(true)
.personId(req.getManagerPersonId())
.selects(ImmutableList.of(OrganizationalNodeUser::getOrganizationalNodeId))
.searchCount(false)
.pageSize(100000)
.build()).stream()
.map(NodeUserQueryRepository.NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet());
if (managedOrgNodeId.isEmpty()) {
listReq.setReturnEmpty(true);
return listReq;
}
listReq.setOrganizationalNodeIds(QueryConditionAssembler.assemble(listReq.getOrganizationalNodeIds(), managedOrgNodeId));
}
// subordinatePersonId
if (req.getSubordinatePersonId() != null) {
Set<Long> nodeIds = nodeUserQueryRepository.list(NodeUserQueryRepository.ListReq.builder()
.personId(req.getSubordinatePersonId())
.manager(false)
.selects(ImmutableList.of(OrganizationalNodeUser::getOrganizationalNodeId))
.searchCount(false)
.build())
.stream().map(NodeUserQueryRepository.NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet());
if (nodeIds.isEmpty()) {
listReq.setReturnEmpty(true);
return listReq;
}
// 查询 subordinatePersonId 所在节点的管理员
listReq.setOrganizationalNodeIds(QueryConditionAssembler.assemble(listReq.getOrganizationalNodeIds(), nodeIds));
listReq.setManager(true);
}
// directManagerPersonId
if (req.getDirectManagerPersonId() != null) {
listReq.setExtraQueries(QueryConditionAssembler.assemble(listReq.getExtraQueries(), ImmutableList.of(MybatisPlusOperatorProcessor.JSONQuery.builder()
.jsonPath("$.directManagerPersonId")
.data(req.getDirectManagerPersonId())
.build())));
}
return listReq;
}
@Override
public List<SearchEntNodeUserResp> searchEntUser(SearchEntNodeUserReq req) {
return nodeUserFoundationService.searchEntUser(req);