From 82752b4d2151335b69a5e3c0717e2d95c9803c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E6=95=8F?= Date: Mon, 16 Dec 2024 11:24:25 +0800 Subject: [PATCH] =?UTF-8?q?feature(REQ-3282):=20OrgUser=E7=9A=84=E9=80=9A?= =?UTF-8?q?=E7=94=A8=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/orguser/feign/OrgUserApi.java | 39 +++++++ .../api/orguser/req/ListOrgUserReq.java | 108 ++++++++++++++++++ .../orgmanax/api/orguser/resp/OrgUserDTO.java | 94 +++++++++++++++ .../repository/OrgUserQueryRepository.java | 63 ++++++++++ .../impl/OrgUserQueryRepositoryImpl.java | 56 +++++++++ .../controller/CooperateShipController.java | 28 +++++ .../orguser/service/OrgUserService.java | 22 ++++ .../service/impl/OrgUserServiceImpl.java | 30 +++++ 8 files changed, 440 insertions(+) create mode 100644 orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/feign/OrgUserApi.java create mode 100644 orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/req/ListOrgUserReq.java create mode 100644 orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/resp/OrgUserDTO.java create mode 100644 orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/controller/CooperateShipController.java create mode 100644 orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/OrgUserService.java create mode 100644 orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/impl/OrgUserServiceImpl.java diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/feign/OrgUserApi.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/feign/OrgUserApi.java new file mode 100644 index 0000000..836ed46 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/feign/OrgUserApi.java @@ -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> list(@RequestBody @Validated ListOrgUserReq req); + +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/req/ListOrgUserReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/req/ListOrgUserReq.java new file mode 100644 index 0000000..5565bf9 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/req/ListOrgUserReq.java @@ -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 ids; + @CriteriaField + private Long personId; + @CriteriaField(field = "personId", operator = Operator.IN) + private Set personIds; + + /** + * 手机号,加密 + */ + @CriteriaField + private String phone; + @CriteriaField(field = "phone", operator = Operator.IN) + private Set phones; + + /** + * 用户真实姓名 + */ + @CriteriaField + private String realName; + @CriteriaField(field = "realName", operator = Operator.IN) + private Set realNames; + + @CriteriaField(field = "realName", operator = Operator.LIKE) + private String realNameLike; + + /** + * 身份证号 + */ + @CriteriaField + private String idNumber; + @CriteriaField(field = "idNumber", operator = Operator.IN) + private Set idNumbers; + + /** + * 单位id + */ + @CriteriaField + private Long ouId; + @CriteriaField(field = "ouId", operator = Operator.IN) + private Set ouIds; + + /** + * 租户id + */ + @CriteriaField + private Long workspaceId; + @CriteriaField(field = "workspaceId", operator = Operator.IN) + private Set workspaceIds; + + /** + * 单位与租户id的键值对. eg:1_2 + */ + @CriteriaField + private String ouWorkspacePair; + @CriteriaField(field = "ouWorkspacePair", operator = Operator.IN) + private Set 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 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 sort; + + @CriteriaField(ignore = true) + private Boolean needPersonProfile; +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/resp/OrgUserDTO.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/resp/OrgUserDTO.java new file mode 100644 index 0000000..f078eb0 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/orguser/resp/OrgUserDTO.java @@ -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; + +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/OrgUserQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/OrgUserQueryRepository.java index 68e72f4..10df6c5 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/OrgUserQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/OrgUserQueryRepository.java @@ -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 page(ListOrgUserReq req); + + default List list(ListOrgUserReq req) { + return page(req).getData(); + } + + default OrgUserResp one(OneReq req) { + return oneOpt(req).orElse(null); + } + + default Optional 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 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; + } + } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/impl/OrgUserQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/impl/OrgUserQueryRepositoryImpl.java index 2cf190a..7980958 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/impl/OrgUserQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/orguser/repository/impl/OrgUserQueryRepositoryImpl.java @@ -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 page(ListOrgUserReq req) { + IPage page = PageConverter.toMybatis(req, OrgUser.class); + QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrgUser.class); + IPage results = orgUserDao.page(page, wrapper) + .convert(e -> BeanUtil.toBean(e, OrgUserResp.class)); + PageResp resp = PageConverter.toResp(results); + List records = resp.getData(); + if (CollUtil.isEmpty(records)) { + return resp; + } + + // assemble personProfile + assemblePersonProfile(req, records); + return resp; + } + + private void assemblePersonProfile(ListOrgUserReq req, List records) { + if (CollUtil.isEmpty(records)) { + return; + } + if (!BooleanUtil.isTrue(req.getNeedPersonProfile())) { + return; + } + Set personIds = records.stream().map(OrgUser::getPersonId).collect(Collectors.toSet()); + Map 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()))); + } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/controller/CooperateShipController.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/controller/CooperateShipController.java new file mode 100644 index 0000000..fdbaf34 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/controller/CooperateShipController.java @@ -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> list(ListOrgUserReq req) { + return ApiResult.success(orgUserService.page(req)); + } +} 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 new file mode 100644 index 0000000..d177e89 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/OrgUserService.java @@ -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 page(ListOrgUserReq req); + + default List list(ListOrgUserReq req) { + return page(req).getData(); + } + + +} 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 new file mode 100644 index 0000000..36e930c --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/orguser/service/impl/OrgUserServiceImpl.java @@ -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 page(ListOrgUserReq req) { + PageResp page = orgUserQueryRepository.page(req); + List 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); + } +}