feature(REQ-3282): OrgUser的通用查询接口实现
This commit is contained in:
parent
426f39fbd7
commit
82752b4d21
@ -0,0 +1,39 @@
|
||||
package cn.axzo.orgmanax.api.orguser.feign;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.foundation.result.ApiResult;
|
||||
import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq;
|
||||
import cn.axzo.orgmanax.api.nodeuser.req.ProcessNodeUserReq;
|
||||
import cn.axzo.orgmanax.api.nodeuser.resp.OrgNodeUserDTO;
|
||||
import cn.axzo.orgmanax.api.orguser.req.ListOrgUserReq;
|
||||
import cn.axzo.orgmanax.api.orguser.resp.OrgUserDTO;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import org.springframework.cloud.openfeign.FeignClient;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
|
||||
/**
|
||||
* 组织人员,以topNodeId和personId的纬度
|
||||
*
|
||||
* @author tanjie@axzo.cn
|
||||
* @date 2024/12/2 15:40
|
||||
*/
|
||||
@FeignClient(
|
||||
value = "orgmanax",
|
||||
url = "${axzo.service.orgmanax:http://orgmanax:8080}")
|
||||
public interface OrgUserApi {
|
||||
|
||||
|
||||
/**
|
||||
* 分页列表接口。
|
||||
* XXX:本接口默认分页,单页最多返回1000条数据。调用方使用时需注意。
|
||||
*
|
||||
* @param req
|
||||
* @return
|
||||
* @see ListOrgUserReq#getPageSize()
|
||||
*/
|
||||
@PostMapping("/api/org/org-user/list")
|
||||
ApiResult<PageResp<OrgUserDTO>> list(@RequestBody @Validated ListOrgUserReq req);
|
||||
|
||||
}
|
||||
@ -0,0 +1,108 @@
|
||||
package cn.axzo.orgmanax.api.orguser.req;
|
||||
|
||||
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
|
||||
import cn.axzo.foundation.dao.support.wrapper.Operator;
|
||||
import cn.axzo.foundation.page.IPageReq;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Data
|
||||
@SuperBuilder
|
||||
public class ListOrgUserReq implements IPageReq {
|
||||
@CriteriaField
|
||||
private Long id;
|
||||
@CriteriaField(field = "id", operator = Operator.IN)
|
||||
private Set<Long> ids;
|
||||
@CriteriaField
|
||||
private Long personId;
|
||||
@CriteriaField(field = "personId", operator = Operator.IN)
|
||||
private Set<Long> personIds;
|
||||
|
||||
/**
|
||||
* 手机号,加密
|
||||
*/
|
||||
@CriteriaField
|
||||
private String phone;
|
||||
@CriteriaField(field = "phone", operator = Operator.IN)
|
||||
private Set<String> phones;
|
||||
|
||||
/**
|
||||
* 用户真实姓名
|
||||
*/
|
||||
@CriteriaField
|
||||
private String realName;
|
||||
@CriteriaField(field = "realName", operator = Operator.IN)
|
||||
private Set<String> realNames;
|
||||
|
||||
@CriteriaField(field = "realName", operator = Operator.LIKE)
|
||||
private String realNameLike;
|
||||
|
||||
/**
|
||||
* 身份证号
|
||||
*/
|
||||
@CriteriaField
|
||||
private String idNumber;
|
||||
@CriteriaField(field = "idNumber", operator = Operator.IN)
|
||||
private Set<String> idNumbers;
|
||||
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
@CriteriaField
|
||||
private Long ouId;
|
||||
@CriteriaField(field = "ouId", operator = Operator.IN)
|
||||
private Set<Long> ouIds;
|
||||
|
||||
/**
|
||||
* 租户id
|
||||
*/
|
||||
@CriteriaField
|
||||
private Long workspaceId;
|
||||
@CriteriaField(field = "workspaceId", operator = Operator.IN)
|
||||
private Set<Long> workspaceIds;
|
||||
|
||||
/**
|
||||
* 单位与租户id的键值对. eg:1_2
|
||||
*/
|
||||
@CriteriaField
|
||||
private String ouWorkspacePair;
|
||||
@CriteriaField(field = "ouWorkspacePair", operator = Operator.IN)
|
||||
private Set<String> ouWorkspacePairs;
|
||||
|
||||
/**
|
||||
* 租户类型: 1-单位租户,2-项目租户,3-政务租户,6-OMS租户
|
||||
*/
|
||||
@CriteriaField
|
||||
private Integer workspaceType;
|
||||
|
||||
/**
|
||||
* 状态:1-在场,3-离场,4-已删除,5-在职,6-离职
|
||||
*/
|
||||
@CriteriaField
|
||||
private Integer status;
|
||||
@CriteriaField(field = "status", operator = Operator.IN)
|
||||
private Set<Integer> statuses;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
@Builder.Default
|
||||
private Integer page = 1;
|
||||
/**
|
||||
* 最大支持1000条数据,不支持单页超过1000的查询,接入方按需分页
|
||||
*/
|
||||
@Builder.Default
|
||||
@CriteriaField(ignore = true)
|
||||
private Integer pageSize = 1000;
|
||||
@CriteriaField(ignore = true)
|
||||
private List<String> sort;
|
||||
|
||||
@CriteriaField(ignore = true)
|
||||
private Boolean needPersonProfile;
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
package cn.axzo.orgmanax.api.orguser.resp;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
@NoArgsConstructor
|
||||
@SuperBuilder
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class OrgUserDTO implements Serializable {
|
||||
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* 自然人id
|
||||
*/
|
||||
private Long personId;
|
||||
|
||||
/**
|
||||
* 手机号,加密
|
||||
*/
|
||||
private String phone;
|
||||
|
||||
/**
|
||||
* 用户真实姓名
|
||||
*/
|
||||
private String realName;
|
||||
|
||||
/**
|
||||
* 身份证号
|
||||
*/
|
||||
private String idNumber;
|
||||
|
||||
/**
|
||||
* 单位id
|
||||
*/
|
||||
private Long ouId;
|
||||
|
||||
/**
|
||||
* 租户id
|
||||
*/
|
||||
private Long workspaceId;
|
||||
|
||||
/**
|
||||
* 单位与租户id的键值对. eg:1_2
|
||||
*/
|
||||
private String ouWorkspacePair;
|
||||
|
||||
/**
|
||||
* 租户类型: 1-单位租户,2-项目租户,3-政务租户,6-OMS租户
|
||||
*/
|
||||
private Integer workspaceType;
|
||||
|
||||
/**
|
||||
* 状态:1-在场,3-离场,4-已删除,5-在职,6-离职
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 异动时间
|
||||
*/
|
||||
private Date transferTime;
|
||||
|
||||
/**
|
||||
* 操作人的id
|
||||
*/
|
||||
private Long operatorId;
|
||||
|
||||
/**
|
||||
* 操作人姓名
|
||||
*/
|
||||
private String operatorName;
|
||||
|
||||
/**
|
||||
* 创建时间
|
||||
*/
|
||||
private Date createAt;
|
||||
|
||||
/**
|
||||
* 更新时间
|
||||
*/
|
||||
private Date updateAt;
|
||||
|
||||
/**
|
||||
* 状态 0-正常 其它删除
|
||||
*/
|
||||
private Long isDelete = 0L;
|
||||
|
||||
}
|
||||
@ -1,4 +1,67 @@
|
||||
package cn.axzo.orgmanax.infra.dao.orguser.repository;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orgmanax.api.orguser.req.ListOrgUserReq;
|
||||
import cn.axzo.orgmanax.infra.client.pudge.dto.PersonProfile;
|
||||
import cn.axzo.orgmanax.infra.dao.orguser.entity.OrgUser;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import com.google.common.base.Preconditions;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.SuperBuilder;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
|
||||
public interface OrgUserQueryRepository {
|
||||
|
||||
PageResp<OrgUserResp> page(ListOrgUserReq req);
|
||||
|
||||
default List<OrgUserResp> list(ListOrgUserReq req) {
|
||||
return page(req).getData();
|
||||
}
|
||||
|
||||
default OrgUserResp one(OneReq req) {
|
||||
return oneOpt(req).orElse(null);
|
||||
}
|
||||
|
||||
default Optional<OrgUserResp> oneOpt(OneReq req) {
|
||||
req.check();
|
||||
ListOrgUserReq page = BeanUtil.toBean(req, ListOrgUserReq.class);
|
||||
page.setPage(1);
|
||||
page.setPageSize(1);
|
||||
return page(page).getData().stream().findFirst();
|
||||
}
|
||||
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Data
|
||||
@SuperBuilder
|
||||
class OneReq {
|
||||
private Long id;
|
||||
private Set<Long> ids;
|
||||
|
||||
public void check() {
|
||||
Preconditions.checkArgument(id != null || CollUtil.isNotEmpty(ids), "参数异常");
|
||||
}
|
||||
}
|
||||
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@Data
|
||||
@SuperBuilder
|
||||
class OrgUserResp extends OrgUser {
|
||||
/**
|
||||
* 查询参数指定 needPersonProfile = true,才会返回
|
||||
*
|
||||
* @see ListOrgUserReq#getNeedPersonProfile()
|
||||
*/
|
||||
private PersonProfile personProfile;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -1,10 +1,66 @@
|
||||
package cn.axzo.orgmanax.infra.dao.orguser.repository.impl;
|
||||
|
||||
import cn.axzo.foundation.dao.support.converter.PageConverter;
|
||||
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orgmanax.api.orguser.req.ListOrgUserReq;
|
||||
import cn.axzo.orgmanax.infra.client.pudge.PersonProfileGateway;
|
||||
import cn.axzo.orgmanax.infra.client.pudge.dto.PersonProfile;
|
||||
import cn.axzo.orgmanax.infra.dao.orguser.dao.OrgUserDao;
|
||||
import cn.axzo.orgmanax.infra.dao.orguser.entity.OrgUser;
|
||||
import cn.axzo.orgmanax.infra.dao.orguser.repository.OrgUserQueryRepository;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.BooleanUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
@RequiredArgsConstructor
|
||||
public class OrgUserQueryRepositoryImpl implements OrgUserQueryRepository {
|
||||
|
||||
private final OrgUserDao orgUserDao;
|
||||
private final PersonProfileGateway profileGateway;
|
||||
|
||||
@Override
|
||||
public PageResp<OrgUserResp> page(ListOrgUserReq req) {
|
||||
IPage<OrgUser> page = PageConverter.toMybatis(req, OrgUser.class);
|
||||
QueryWrapper<OrgUser> wrapper = QueryWrapperHelper.fromBean(req, OrgUser.class);
|
||||
IPage<OrgUserResp> results = orgUserDao.page(page, wrapper)
|
||||
.convert(e -> BeanUtil.toBean(e, OrgUserResp.class));
|
||||
PageResp<OrgUserResp> resp = PageConverter.toResp(results);
|
||||
List<OrgUserResp> records = resp.getData();
|
||||
if (CollUtil.isEmpty(records)) {
|
||||
return resp;
|
||||
}
|
||||
|
||||
// assemble personProfile
|
||||
assemblePersonProfile(req, records);
|
||||
return resp;
|
||||
}
|
||||
|
||||
private void assemblePersonProfile(ListOrgUserReq req, List<OrgUserResp> records) {
|
||||
if (CollUtil.isEmpty(records)) {
|
||||
return;
|
||||
}
|
||||
if (!BooleanUtil.isTrue(req.getNeedPersonProfile())) {
|
||||
return;
|
||||
}
|
||||
Set<Long> personIds = records.stream().map(OrgUser::getPersonId).collect(Collectors.toSet());
|
||||
Map<Long, PersonProfile> personsById = profileGateway.listPersonProfiles(PersonProfileGateway.ListPersonProfileReq.builder()
|
||||
.ids(personIds)
|
||||
.build()).stream().collect(Collectors.toMap(PersonProfile::getId, Function.identity()));
|
||||
|
||||
records.forEach(r -> r.setPersonProfile(personsById.get(r.getPersonId())));
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
package cn.axzo.orgmanax.server.orguser.controller;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.foundation.result.ApiResult;
|
||||
import cn.axzo.orgmanax.api.orguser.feign.OrgUserApi;
|
||||
import cn.axzo.orgmanax.api.orguser.req.ListOrgUserReq;
|
||||
import cn.axzo.orgmanax.api.orguser.resp.OrgUserDTO;
|
||||
import cn.axzo.orgmanax.server.orguser.service.OrgUserService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
/**
|
||||
* @author tanjie@axzo.cn
|
||||
* @date 2024/12/2 16:47
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping
|
||||
@RequiredArgsConstructor
|
||||
public class CooperateShipController implements OrgUserApi {
|
||||
|
||||
private final OrgUserService orgUserService;
|
||||
|
||||
@Override
|
||||
public ApiResult<PageResp<OrgUserDTO>> list(ListOrgUserReq req) {
|
||||
return ApiResult.success(orgUserService.page(req));
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,22 @@
|
||||
package cn.axzo.orgmanax.server.orguser.service;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq;
|
||||
import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO;
|
||||
import cn.axzo.orgmanax.api.node.req.ListNodeReq;
|
||||
import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO;
|
||||
import cn.axzo.orgmanax.api.orguser.req.ListOrgUserReq;
|
||||
import cn.axzo.orgmanax.api.orguser.resp.OrgUserDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface OrgUserService {
|
||||
|
||||
PageResp<OrgUserDTO> page(ListOrgUserReq req);
|
||||
|
||||
default List<OrgUserDTO> list(ListOrgUserReq req) {
|
||||
return page(req).getData();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -0,0 +1,30 @@
|
||||
package cn.axzo.orgmanax.server.orguser.service.impl;
|
||||
|
||||
import cn.axzo.foundation.page.PageResp;
|
||||
import cn.axzo.orgmanax.api.orguser.req.ListOrgUserReq;
|
||||
import cn.axzo.orgmanax.api.orguser.resp.OrgUserDTO;
|
||||
import cn.axzo.orgmanax.infra.dao.orguser.repository.OrgUserQueryRepository;
|
||||
import cn.axzo.orgmanax.server.orguser.service.OrgUserService;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
@RequiredArgsConstructor
|
||||
public class OrgUserServiceImpl implements OrgUserService {
|
||||
|
||||
private final OrgUserQueryRepository orgUserQueryRepository;
|
||||
|
||||
@Override
|
||||
public PageResp<OrgUserDTO> page(ListOrgUserReq req) {
|
||||
PageResp<OrgUserQueryRepository.OrgUserResp> page = orgUserQueryRepository.page(req);
|
||||
List<OrgUserDTO> records = page.getData().stream().map(e -> BeanUtil.toBean(e, OrgUserDTO.class)).collect(Collectors.toList());
|
||||
// assemble data if needed
|
||||
return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user