diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/feign/OrgCooperateShipApi.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/feign/OrgCooperateShipApi.java new file mode 100644 index 0000000..1a3e237 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/feign/OrgCooperateShipApi.java @@ -0,0 +1,33 @@ +package cn.axzo.orgmanax.api.cooperateship.feign; + +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO; +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; + +import java.util.List; + +/** + * 部门相关基础API + * + * @author tanjie@axzo.cn + * @date 2024/12/2 15:40 + */ +@FeignClient( + value = "orgmanax", + url = "${axzo.service.orgmanax:http://orgmanax:8080}") +public interface OrgCooperateShipApi { + + /** + * 列表接口。 + * + * @param req + * @return + */ + @PostMapping("/api/org/cooperate-ship/list") + ApiResult> list(@RequestBody @Validated ListOrgCooperateShipReq req); + +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java new file mode 100644 index 0000000..d7e378e --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/req/ListOrgCooperateShipReq.java @@ -0,0 +1,81 @@ +package cn.axzo.orgmanax.api.cooperateship.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 java.util.Set; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ListOrgCooperateShipReq implements IPageReq { + @CriteriaField + private Long id; + @CriteriaField(field = "id", operator = Operator.IN) + private Set ids; + @CriteriaField + private Long parentId; + @CriteriaField(field = "parentId", operator = Operator.IN) + private Set parentIds; + + /** + * 用于遍历数据 + */ + @CriteriaField(field = "id", operator = Operator.GT) + private Long idGt; + + /** + * 工作台ID + */ + @CriteriaField + private Long workspaceId; + @CriteriaField(field = "workspaceId", operator = Operator.IN) + private Long workspaceIds; + + @CriteriaField + private Integer workspaceType; + @CriteriaField(field = "workspaceType", operator = Operator.IN) + private Set workspaceTypes; + + @CriteriaField + private Integer status; + @CriteriaField(field = "status", operator = Operator.IN) + private Set statuses; + + @CriteriaField + private Integer cooperateType; + @CriteriaField(field = "cooperateType", operator = Operator.IN) + private Set cooperateTypes; + + + @CriteriaField + private Integer partnerShip; + @CriteriaField(field = "partnerShip", operator = Operator.IN) + private Set partnerShips; + + /** + * 组织节点id + */ + @CriteriaField + private Long organizationalNodeId; + @CriteriaField(field = "organizationalNodeId", operator = Operator.IN) + private Set organizationalNodeIds; + + @CriteriaField + private Long organizationalUnitId; + @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) + private Long organizationalUnitIds; + + @CriteriaField(ignore = true) + private Long personId; + + @CriteriaField(ignore = true) + private Boolean needParent; + +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/CooperateShipStatusEnum.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/CooperateShipStatusEnum.java new file mode 100644 index 0000000..27cc0a3 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/CooperateShipStatusEnum.java @@ -0,0 +1,16 @@ +package cn.axzo.orgmanax.api.cooperateship.resp; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum CooperateShipStatusEnum { + + PRESENT(1, "在场"), + LEFT(2, "离场"); + + private final Integer code; + private final String desc; +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/CooperateShipTypeEnum.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/CooperateShipTypeEnum.java new file mode 100644 index 0000000..1afa1e8 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/CooperateShipTypeEnum.java @@ -0,0 +1,28 @@ +package cn.axzo.orgmanax.api.cooperateship.resp; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum CooperateShipTypeEnum { + + PROJ_PRIMARY_CONTRACTING_UNIT(1, "施工总承包"), + PROJ_CONSTRUCTION_UNIT(2, "建设单位"), + PROJ_SUPERVISION_UNIT(3, "监理单位"), + PROJ_LABOR_SUBCONTRACTING(4, "劳务分包"), + PROJ_PROFESSIONAL_SUBCONTRACTING(5, "专业承包"), + OMS(6, "OMS"), + ENT_COMMON(7, "企业通用"), + ENT_TEAM(8, "企业内班组"), + PROJ_TEAM(9, "项目内班组"), + ENT_GROUP(10, "企业内小组"), + PROJ_GROUP(11, "项目内小组"), + SURVEY_UNIT(12, "地勘单位"), + DESIGN_UNIT(13, "设计单位"), + OTHER(30, "其他"); + + private final Integer code; + private final String desc; +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/OrgCooperateShipDTO.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/OrgCooperateShipDTO.java new file mode 100644 index 0000000..bd36abc --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/cooperateship/resp/OrgCooperateShipDTO.java @@ -0,0 +1,117 @@ +package cn.axzo.orgmanax.api.cooperateship.resp; + +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrgCooperateShipDTO implements Serializable { + + /** + * 主健 + */ + private Long id; + + /** + * 上级协同关系id + */ + private Long parentId; + + /** + * 工作台id + */ + private Long workspaceId; + + /** + * 工作台类型 + */ + private Integer workspaceType; + + /** + * 工作台名称 + */ + private String workspaceName; + + /** + * 1-在场,0-退场 + */ + private Integer status; + + /** + * 入场时间 + */ + private Date joinAt; + + /** + * 退场时间 + */ + private Date resignAt; + + /** + * 单位id(如果是班组则插入队伍id) + */ + private Long organizationalUnitId; + + /** + * 单位名称 + */ + private String organizationalUnitName; + + /** + * 协同关系类型 1.总包 2.建设单位 3监理单位 4劳务分包5专业分包6 OMS 7企业通用8企业内班组9项目内班组10企业内小组11项目内小组 30其它 + */ + private Integer cooperateType; + + /** + * 组织架构的节点id + */ + private Long organizationalNodeId; + + /** + * 节点路径 + */ + private String path; + + /** + * 合作关系 1.合作 2.直属 + */ + private Integer partnerShip; + + /** + * 扩展字段 + */ + private JSONObject ext; + + /** + * 创建时间 + */ + private Date createAt; + + /** + * 修改时间 + */ + private Date updateAt; + + /** + * 创建人 + */ + private Long createBy; + + /** + * 修改人 + */ + private Long updateBy; + + /** + * 是否删除 + */ + private Long isDelete = 0L; +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/feign/OrgNodeApi.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/feign/OrgNodeApi.java index 13ff060..bdc3418 100644 --- a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/feign/OrgNodeApi.java +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/feign/OrgNodeApi.java @@ -3,7 +3,7 @@ package cn.axzo.orgmanax.api.node.feign; import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; import cn.axzo.orgmanax.api.node.req.ListNodeReq; -import cn.axzo.orgmanax.api.node.req.NodeProcessReq; +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; import com.alibaba.fastjson.JSONObject; import org.springframework.cloud.openfeign.FeignClient; @@ -29,7 +29,7 @@ public interface OrgNodeApi { * @return */ @PostMapping("/api/org/node/process") - ApiResult process(@RequestBody @Validated NodeProcessReq req); + ApiResult process(@RequestBody @Validated ProcessNodeReq req); /** * 分页列表接口。 diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/NodeProcessReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ProcessNodeReq.java similarity index 96% rename from orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/NodeProcessReq.java rename to orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ProcessNodeReq.java index bbffc8c..ff1e467 100644 --- a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/NodeProcessReq.java +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/node/req/ProcessNodeReq.java @@ -12,7 +12,7 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @Data @Builder -public class NodeProcessReq { +public class ProcessNodeReq { private Long id; private Long operatorId; private String description; diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/feign/OrgNodeUserApi.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/feign/OrgNodeUserApi.java new file mode 100644 index 0000000..acc36f1 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/feign/OrgNodeUserApi.java @@ -0,0 +1,45 @@ +package cn.axzo.orgmanax.api.nodeuser.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 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; + +/** + * 部门相关基础API + * + * @author tanjie@axzo.cn + * @date 2024/12/2 15:40 + */ +@FeignClient( + value = "orgmanax", + url = "${axzo.service.orgmanax:http://orgmanax:8080}") +public interface OrgNodeUserApi { + + /** + * 处理部门人员相关的逻辑 + * + * @param req + * @return + */ + @PostMapping("/api/org/node-user/process") + ApiResult process(@RequestBody @Validated ProcessNodeUserReq req); + + /** + * 分页列表接口。 + * XXX:本接口默认分页,单页最多返回1000条数据。调用方使用时需注意。 + * + * @param req + * @return + * @see ListNodeUserReq#getPageSize() + */ + @PostMapping("/api/org/node-user/list") + ApiResult> list(@RequestBody @Validated ListNodeUserReq req); + +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/req/ListNodeUserReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/req/ListNodeUserReq.java new file mode 100644 index 0000000..52d55bd --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/req/ListNodeUserReq.java @@ -0,0 +1,164 @@ +package cn.axzo.orgmanax.api.nodeuser.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 java.util.List; +import java.util.Set; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ListNodeUserReq implements IPageReq { + + @CriteriaField + private Long id; + @CriteriaField(field = "id", operator = Operator.IN) + private Set ids; + + /** + * identity_id + */ + @CriteriaField + private Long identityId; + @CriteriaField(field = "identityId", operator = Operator.IN) + private Set identityIds; + + /** + * 身份类型 0-无效类型, 1-工人, 2-班组长, 3-从业人员, 4-政务人员,5-运营人员 + */ + @CriteriaField + private Integer identityType; + @CriteriaField(field = "identityType", operator = Operator.IN) + private Set identityTypes; + + /** + * 自然人id + */ + @CriteriaField + private Long personId; + @CriteriaField(field = "personId", operator = Operator.IN) + private Set personIds; + + /** + * 主电话 + */ + @CriteriaField + private String phone; + + /** + * 名字 + */ + @CriteriaField + private String realName; + @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 organizationalUnitId; + @CriteriaField(field = "organizationalUnitId", operator = Operator.IN) + private Set organizationalUnitIds; + + /** + * 组织节点id + */ + @CriteriaField + private Long organizationalNodeId; + @CriteriaField(field = "organizationalNodeId", operator = Operator.IN) + private Set organizationalNodeIds; + + /** + * 顶级节点id + */ + @CriteriaField + private Long topNodeId; + @CriteriaField(field = "topNodeId", operator = Operator.IN) + private Set topNodeIds; + + /** + * 部门管理员 1是 0否 + */ + @CriteriaField + private Boolean manager; + + /** + * 岗位id + */ + @CriteriaField + private Long organizationalJobId; + @CriteriaField(field = "organizationalJobId", operator = Operator.IN) + private Set organizationalJobIds; + + /** + * 工作台ID + */ + @CriteriaField + private Long workspaceId; + @CriteriaField(field = "workspaceId", operator = Operator.IN) + private Long workspaceIds; + + /** + * 0:普通岗位、1:主岗位 + */ + @CriteriaField + private Integer primaryJob; + + /** + * 是否允许进入工地 1.允许 2.不允许 + */ + @CriteriaField + private Integer isAllowed; + + /** + * 迁移数据临时源id + */ + @CriteriaField + private Long tempSourceId; + + /** + * 数据同步ID + */ + @CriteriaField + private Long syncDataId; + + /** + * 工号 + */ + @CriteriaField + private String jobNumber; + + @CriteriaField + private Integer activeFlag; + + @CriteriaField(ignore = true) + private Boolean needNode; + + @CriteriaField(ignore = true) + @Builder.Default + Integer page = 1; + /** + * 最大支持1000条数据,不支持单页超过1000的查询,接入方按需分页 + */ + @Builder.Default + @CriteriaField(ignore = true) + Integer pageSize = 1000; + @CriteriaField(ignore = true) + List sort; +} diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/req/ProcessNodeUserReq.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/req/ProcessNodeUserReq.java new file mode 100644 index 0000000..5db83c7 --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/req/ProcessNodeUserReq.java @@ -0,0 +1,32 @@ +package cn.axzo.orgmanax.api.nodeuser.req; + +import com.alibaba.fastjson.JSONObject; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class ProcessNodeUserReq { + private Long id; + private Long operatorId; + private String description; + private Action action; + private JSONObject param; + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public enum Action { + CREATE("创建", "createNodeUserProcessor"), + UPDATE("普通更新", "updateNodeUserProcessor"); + + private final String desc; + private final String processor; + } +} + diff --git a/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/resp/OrgNodeUserDTO.java b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/resp/OrgNodeUserDTO.java new file mode 100644 index 0000000..e802f9b --- /dev/null +++ b/orgmanax-api/src/main/java/cn/axzo/orgmanax/api/nodeuser/resp/OrgNodeUserDTO.java @@ -0,0 +1,143 @@ +package cn.axzo.orgmanax.api.nodeuser.resp; + +import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class OrgNodeUserDTO implements Serializable { + + private Long id; + + /** + * identity_id + */ + private Long identityId; + + /** + * 身份类型 0-无效类型, 1-工人, 2-班组长, 3-从业人员, 4-政务人员,5-运营人员 + */ + private Integer identityType; + + /** + * 自然人id + */ + private Long personId; + + /** + * 主电话 + */ + private String phone; + + /** + * 名字 + */ + private String realName; + + /** + * 身份证号 + */ + private String idNumber; + + /** + * 单位id + */ + private Long organizationalUnitId; + + /** + * 组织节点id + */ + private Long organizationalNodeId; + + /** + * 顶级节点id + */ + private Long topNodeId; + + /** + * 部门管理员 1是 0否 + */ + private Object manager; + + /** + * 岗位id + */ + private Long organizationalJobId; + + /** + * 工作台ID + */ + private Long workspaceId; + + /** + * 0:普通岗位、1:主岗位 + */ + private Integer primaryJob; + + /** + * 是否允许进入工地 1.允许 2.不允许 + */ + private Integer isAllowed; + + /** + * 加入时间 + */ + private Date joinAt; + + /** + * 离开时间 + */ + private Date leaveAt; + + /** + * 迁移数据临时源id + */ + private Long tempSourceId; + + /** + * 数据同步ID + */ + private Long syncDataId; + + /** + * 工号 + */ + private String jobNumber; + + /** + * 状态 0正常 其它删除 + */ + private Long isDelete = 0L; + + /** + * 扩展字段 + */ + private JSONObject extra; + + /** + * 创建时间 + */ + private Date createAt; + + /** + * 更新时间 + */ + private Date updateAt; + + /** + * 1-活跃用户,0-非活跃用户 + */ + private Integer activeFlag; + + // ~ 聚合信息 + private OrgNodeDTO node; +} diff --git a/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/config/BizResultCode.java b/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/config/BizResultCode.java index c98714d..2f06358 100644 --- a/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/config/BizResultCode.java +++ b/orgmanax-common/src/main/java/cn/axzo/orgmanax/common/config/BizResultCode.java @@ -10,6 +10,8 @@ public enum BizResultCode implements IResultCode { SUCCESS("200", "成功"), // ~ 100 -> 199 Node相关的错误码 NODE_PROCESS_FAILED("100", "部门操作失败"), + // + NODE_USER_PROCESS_FAILED("200", "部门人员操作失败"), INVALID_PARAM("400", "参数异常"), ENTITY_NOT_FOUND("404", "实体不存在"), diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/PersonProfileGateway.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/PersonProfileGateway.java new file mode 100644 index 0000000..c595023 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/PersonProfileGateway.java @@ -0,0 +1,67 @@ +package cn.axzo.orgmanax.infra.client.pudge; + +import cn.axzo.orgmanax.infra.client.pudge.dto.IdentityPair; +import cn.axzo.orgmanax.infra.client.pudge.dto.IdentityProfile; +import cn.axzo.orgmanax.infra.client.pudge.dto.PersonProfile; +import com.google.common.collect.ImmutableList; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Set; + +/** + * //TODO liuyang + * 封装对person的请求 + */ +@Component +@Slf4j +public class PersonProfileGateway { + + public PersonProfile getPersonProfile(Long personId) { + return listPersonProfiles(ListPersonProfileReq.builder().id(personId).build()) + .stream().findFirst().orElse(null); + } + + public List listPersonProfiles(ListPersonProfileReq req) { + // TODO + return ImmutableList.of(); + } + + public IdentityProfile getIdentityProfile(Long personId, Integer identityType) { + return listIdentityProfiles(ListIdentityProfileReq.builder() + .personId(personId) + .identityType(identityType) + .build()).stream().findFirst().orElse(null); + } + + public List listIdentityProfiles(ListIdentityProfileReq req) { + // TODO + return ImmutableList.of(); + } + + @NoArgsConstructor + @AllArgsConstructor + @Data + @SuperBuilder + public static class ListPersonProfileReq { + private Long id; + private Set ids; + } + + @NoArgsConstructor + @AllArgsConstructor + @Data + @SuperBuilder + public static class ListIdentityProfileReq { + private Long personId; + private Long identityId; + private Integer identityType; + private Set identityPairs; + } + +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/IdentityPair.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/IdentityPair.java new file mode 100644 index 0000000..35ec101 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/IdentityPair.java @@ -0,0 +1,15 @@ +package cn.axzo.orgmanax.infra.client.pudge.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@SuperBuilder +public class IdentityPair { + private Long identityId; + private Integer identityType; +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/IdentityProfile.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/IdentityProfile.java new file mode 100644 index 0000000..989d6f6 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/IdentityProfile.java @@ -0,0 +1,20 @@ +package cn.axzo.orgmanax.infra.client.pudge.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * XXX:尽量复用 client 对这个类的定义。 + */ + +@NoArgsConstructor +@AllArgsConstructor +@Data +@SuperBuilder +public class IdentityProfile { + private Long personId; + private Long identityId; + private Long identityType; +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/PersonProfile.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/PersonProfile.java new file mode 100644 index 0000000..c3460e3 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/dto/PersonProfile.java @@ -0,0 +1,20 @@ +package cn.axzo.orgmanax.infra.client.pudge.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +/** + * XXX:尽量复用 client 对这个类的定义。 + */ +@NoArgsConstructor +@AllArgsConstructor +@Data +@SuperBuilder +public class PersonProfile { + private Long id; + private String phone; + private String realName; + private String idNumber; +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/enums/IdentityType.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/enums/IdentityType.java new file mode 100644 index 0000000..77464d4 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/pudge/enums/IdentityType.java @@ -0,0 +1,32 @@ +package cn.axzo.orgmanax.infra.client.pudge.enums; + + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Getter +public enum IdentityType { + NOT_SUPPORT(0, "NOT_SUPPORT", "无效类型"), + WORKER(1, "WORKER", "工人"), + WORKER_LEADER(2, "WORKER_LEADER", "班组长"), + PRACTITIONER(3, "PRACTITIONER", "从业人员"), + REGULATOR(4, "REGULATOR", "监管人员"), + OPERATOR(5, "OPERATOR", "运营人员"); + + private final Integer code; + private final String message; + private final String desc; + + public static IdentityType getIdentityType(Integer code) { + IdentityType[] values = values(); + for (IdentityType item : values) { + if (item.getCode().equals(code)) { + return item; + } + } + return null; + } +} + diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java new file mode 100644 index 0000000..791960b --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/WorkspaceGateway.java @@ -0,0 +1,38 @@ +package cn.axzo.orgmanax.infra.client.workspace; + +import cn.axzo.orgmanax.infra.client.workspace.dto.Workspace; +import com.google.common.collect.ImmutableList; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * TODO liuyang + */ +@Component +@Slf4j +public class WorkspaceGateway { + + public Workspace getWorkspace(Long id) { + return listWorkspaces(ListWorkspaceReq.builder().id(id).build()).stream().findFirst().orElse(null); + } + + public List listWorkspaces(ListWorkspaceReq req) { + return ImmutableList.of(); + } + + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + public static class ListWorkspaceReq { + private Long id; + private Long organizationalUnitId; + private Integer type; + } +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/dto/Workspace.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/dto/Workspace.java new file mode 100644 index 0000000..8fcba99 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/client/workspace/dto/Workspace.java @@ -0,0 +1,36 @@ +package cn.axzo.orgmanax.infra.client.workspace.dto; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + + +@NoArgsConstructor +@AllArgsConstructor +@Data +@SuperBuilder +public class Workspace { + private Long id; + private Integer type; + private String name; + + + @Getter + @AllArgsConstructor(access = AccessLevel.PRIVATE) + public enum WorkspaceTypeEnum { + // 目前只有1和2 + GENERAL_ENT(1, "总包企业级", "企业"), + GENERAL_PROJECT(2, "总包项目级", "项目"), + GOVERNMENT(3, "政务监管平台", "政务"), + AGENCY_ENT(4, "分包企业级", "班组工作台"), + OMS(6, "OMS工作台", "OMS工作台"); + + public int value; + + public String desc; + public String tenantDesc; + } +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/dao/SaasCooperateShipDao.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/dao/SaasCooperateShipDao.java index c107a52..3bb03b8 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/dao/SaasCooperateShipDao.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/dao/SaasCooperateShipDao.java @@ -12,5 +12,4 @@ import org.springframework.stereotype.Repository; @Repository public class SaasCooperateShipDao extends ServiceImpl { - } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/entity/SaasCooperateShip.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/entity/SaasCooperateShip.java index a8cf089..018535d 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/entity/SaasCooperateShip.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/entity/SaasCooperateShip.java @@ -1,14 +1,17 @@ package cn.axzo.orgmanax.infra.dao.cooperateship.entity; +import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; +import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Accessors; @@ -16,6 +19,7 @@ import lombok.experimental.SuperBuilder; import java.io.Serializable; import java.util.Date; +import java.util.Objects; /** * (SaasCooperateShip)表实体类 @@ -103,6 +107,7 @@ public class SaasCooperateShip implements Serializable { /** * 合作关系 1.合作 2.直属 + * @see ParterShipEnum */ private Integer partnerShip; @@ -138,5 +143,26 @@ public class SaasCooperateShip implements Serializable { private Long isDelete = 0L; + /** + * 计算节点路径 + * + * @param parent + */ + public void calcPath(SaasCooperateShip parent) { + if (Objects.equals(this.getParentId(), 0L)) { + this.path = id + ","; + } + Assert.notNull(parent, "重置路径时,父节点不能为空"); + this.path = parent.path + id + ","; + } + + @AllArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public enum ParterShipEnum { + COOPERATE(1, "合作"), OWNED(2, "直属"); + private final Integer code; + private final String desc; + } + } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java index 9987bcb..99aeed3 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipQueryRepository.java @@ -1,4 +1,53 @@ package cn.axzo.orgmanax.infra.dao.cooperateship.repository; +import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; +import cn.hutool.core.bean.BeanUtil; +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; + public interface CooperateShipQueryRepository { + + List list(ListOrgCooperateShipReq req); + + default CooperateShipResp one(OneReq req) { + return oneOpt(req).orElse(null); + } + + default Optional oneOpt(OneReq req) { + req.check(); + ListOrgCooperateShipReq listReq = BeanUtil.toBean(req, ListOrgCooperateShipReq.class); + return list(listReq).stream().findFirst(); + } + + @NoArgsConstructor + @AllArgsConstructor + @Data + @SuperBuilder + class OneReq { + private Long id; + private Long organizationalNodeId; + + public void check() { + Preconditions.checkArgument(id != null || organizationalNodeId != null, "参数异常"); + } + } + + @EqualsAndHashCode(callSuper = true) + @NoArgsConstructor + @AllArgsConstructor + @Data + @SuperBuilder + class CooperateShipResp extends SaasCooperateShip { + // 按需扩展字段,占个位。避免报错 + private String todo; + } + } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipUpsertRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipUpsertRepository.java index 8a1f5fd..61257fd 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipUpsertRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/CooperateShipUpsertRepository.java @@ -1,4 +1,38 @@ package cn.axzo.orgmanax.infra.dao.cooperateship.repository; +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; +import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; +import cn.axzo.orgmanax.infra.dao.node.repository.NodeUpsertRepository; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.HashSet; +import java.util.Set; + public interface CooperateShipUpsertRepository { + SaasCooperateShip create(SaasCooperateShip cooperateShip); + + SaasCooperateShip update(UpdateReq node); + + @EqualsAndHashCode(callSuper = true) + @NoArgsConstructor + @AllArgsConstructor + @Data + @SuperBuilder + class UpdateReq extends SaasCooperateShip { + /** + * 由于updateById不支持将值设置为null,这里提供这个 + */ + Set> setNullFields = new HashSet<>(); + + public void check() { + Axssert.checkNonNull(getId(), "要更新的协同关系id不能为空"); + } + } + } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java index a4657eb..2c91018 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipQueryRepositoryImpl.java @@ -1,10 +1,60 @@ package cn.axzo.orgmanax.infra.dao.cooperateship.repository.impl; +import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; +import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq; +import cn.axzo.orgmanax.infra.dao.cooperateship.dao.SaasCooperateShipDao; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + @Service @RequiredArgsConstructor +@Slf4j public class CooperateShipQueryRepositoryImpl implements CooperateShipQueryRepository { + + private final SaasCooperateShipDao cooperateShipDao; + private final NodeUserQueryRepository nodeUserQueryRepository; + + @Override + public List list(ListOrgCooperateShipReq req) { + QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, SaasCooperateShip.class); + if (wrapper.isEmptyOfWhere()) { + // + log.warn("CooperateShipResp empty of where query. return empty list. req = {}", req); + return Collections.emptyList(); + } + List results = cooperateShipDao.list(wrapper) + .stream().map(e -> BeanUtil.toBean(e, CooperateShipResp.class)).collect(Collectors.toList()); + + results = filterByPersonIds(results, req); + + return results; + } + + private List filterByPersonIds(List results, ListOrgCooperateShipReq req) { + if (req.getPersonId() == null) { + // filter by personIds + return results; + } + Set organizationalNodeIds = results.stream().map(SaasCooperateShip::getOrganizationalNodeId).collect(Collectors.toSet()); + Set personInNodeIds = nodeUserQueryRepository.list(ListNodeUserReq.builder() + .personId(req.getPersonId()) + .organizationalNodeIds(organizationalNodeIds) + .build()) + .stream().map(NodeUserQueryRepository.NodeUserResp::getTopNodeId).collect(Collectors.toSet()); + return results.stream() + .filter(e -> personInNodeIds.contains(e.getOrganizationalNodeId())) + .collect(Collectors.toList()); + } } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipUpsertRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipUpsertRepositoryImpl.java index 692dbdb..eb9f99e 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipUpsertRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/cooperateship/repository/impl/CooperateShipUpsertRepositoryImpl.java @@ -1,10 +1,36 @@ package cn.axzo.orgmanax.infra.dao.cooperateship.repository.impl; +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.infra.dao.cooperateship.dao.SaasCooperateShipDao; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipUpsertRepository; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor +@Slf4j public class CooperateShipUpsertRepositoryImpl implements CooperateShipUpsertRepository { + + private final SaasCooperateShipDao cooperateShipDao; + + @Override + public SaasCooperateShip create(SaasCooperateShip cooperateShip) { + cooperateShipDao.save(cooperateShip); + return cooperateShipDao.getById(cooperateShip.getId()); + } + + @Override + public SaasCooperateShip update(UpdateReq req) { + Axssert.checkNonNull(req.getId(), "更新协同部门,协同id不能为空"); + LambdaUpdateChainWrapper wrapper = cooperateShipDao.lambdaUpdate().eq(SaasCooperateShip::getId, req.getId()); + if (CollUtil.isNotEmpty(req.getSetNullFields())) { + req.getSetNullFields().forEach(e -> wrapper.set(e, null)); + } + wrapper.update(req); + return cooperateShipDao.getById(req.getId()); + } } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/entity/OrganizationalNode.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/entity/OrganizationalNode.java index f88e7aa..c41b539 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/entity/OrganizationalNode.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/entity/OrganizationalNode.java @@ -18,6 +18,7 @@ import lombok.NoArgsConstructor; import lombok.ToString; import lombok.experimental.Accessors; import lombok.experimental.SuperBuilder; +import org.springframework.data.annotation.Transient; import java.io.Serializable; import java.util.Arrays; @@ -139,7 +140,6 @@ public class OrganizationalNode implements Serializable { @TableField(value = "profile", typeHandler = FastjsonTypeHandler.class) private JSONObject profile; - protected Date createAt; protected Long createBy; protected Date updateAt; @@ -152,16 +152,19 @@ public class OrganizationalNode implements Serializable { * * @param parentNode */ - public String calcPath(OrganizationalNode parentNode) { + public void calcPath(OrganizationalNode parentNode) { if (Objects.equals(this.getParentId(), 0L)) { this.topNodeId = id; this.path = id + ","; - return this.path; } Assert.notNull(parentNode, "重置路径时,父节点不能为空"); this.topNodeId = parentNode.getTopNodeId(); this.path = parentNode.path + id + ","; - return this.path; + } + + @Transient + public boolean isTopNode() { + return Objects.equals(topNodeId, id); } @Getter diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeUpsertRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeUpsertRepository.java index 94cd4cf..0b17efa 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeUpsertRepository.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/NodeUpsertRepository.java @@ -5,7 +5,6 @@ import cn.axzo.foundation.exception.Axssert; import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -23,26 +22,12 @@ public interface NodeUpsertRepository { OrganizationalNode update(UpdateReq node); - @NoArgsConstructor - @AllArgsConstructor - @Data - @Builder - class CreateReq { - private OrganizationalNode node; - /** - * 场景描述,如 添加普通部门,添加班组 等 - */ - private String scene; - private Long operatorId; - } - @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @AllArgsConstructor @Data @SuperBuilder class UpdateReq extends OrganizationalNode { - private String scene; /** * 由于updateById不支持将值设置为null,这里提供这个 */ diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeUpsertRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeUpsertRepositoryImpl.java index a5bc8a5..b05ccfa 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeUpsertRepositoryImpl.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/node/repository/impl/NodeUpsertRepositoryImpl.java @@ -29,7 +29,6 @@ public class NodeUpsertRepositoryImpl implements NodeUpsertRepository { @Override public OrganizationalNode update(UpdateReq req) { Axssert.checkNonNull(req.getId(), "更新部门,部门id不能为空"); - LambdaUpdateChainWrapper wrapper = nodeDao.lambdaUpdate().eq(OrganizationalNode::getId, req.getId()); if (CollUtil.isNotEmpty(req.getSetNullFields())) { req.getSetNullFields().forEach(e -> wrapper.set(e, null)); diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/dao/OrgNodeUserDao.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/dao/NodeUserDao.java similarity index 79% rename from orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/dao/OrgNodeUserDao.java rename to orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/dao/NodeUserDao.java index 2af7c63..882f0bc 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/dao/OrgNodeUserDao.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/dao/NodeUserDao.java @@ -10,6 +10,6 @@ import org.springframework.stereotype.Repository; * @date 2024/12/2 18:10 */ @Repository -public class OrgNodeUserDao extends ServiceImpl { +public class NodeUserDao extends ServiceImpl { } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/entity/OrganizationalNodeUser.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/entity/OrganizationalNodeUser.java index 4fd2f8b..451bbdd 100644 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/entity/OrganizationalNodeUser.java +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/entity/OrganizationalNodeUser.java @@ -89,7 +89,7 @@ public class OrganizationalNodeUser implements Serializable { /** * 部门管理员 1是 0否 */ - private Object manager; + private Boolean manager; /** * 岗位id @@ -162,6 +162,10 @@ public class OrganizationalNodeUser implements Serializable { */ private Integer activeFlag; - + /** + * 部门人员信息,json,不同部门类型的部门用户,格式不一。 + */ + @TableField(value = "profile", typeHandler = FastjsonTypeHandler.class) + private JSONObject profile; } diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java new file mode 100644 index 0000000..d73bf82 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserQueryRepository.java @@ -0,0 +1,67 @@ +package cn.axzo.orgmanax.infra.dao.nodeuser.repository; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq; +import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +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 NodeUserQueryRepository { + + PageResp page(ListNodeUserReq req); + + default List list(ListNodeUserReq req) { + return page(req).getData(); + } + + default NodeUserResp one(OneReq req) { + return oneOpt(req).orElse(null); + } + + default Optional oneOpt(OneReq req) { + req.check(); + ListNodeUserReq page = BeanUtil.toBean(req, ListNodeUserReq.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 NodeUserResp extends OrganizationalNodeUser { + /** + * 查询参数指定 needNode = true,才会返回 + * + * @see ListNodeUserReq#getNeedNode() + */ + private NodeQueryRepository.NodeResp nodeResp; + } + +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserUpsertRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserUpsertRepository.java new file mode 100644 index 0000000..9796e77 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/NodeUserUpsertRepository.java @@ -0,0 +1,37 @@ +package cn.axzo.orgmanax.infra.dao.nodeuser.repository; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.HashSet; +import java.util.Set; + +public interface NodeUserUpsertRepository { + + OrganizationalNodeUser create(OrganizationalNodeUser nodeUser); + + OrganizationalNodeUser update(UpdateReq node); + + @EqualsAndHashCode(callSuper = true) + @NoArgsConstructor + @AllArgsConstructor + @Data + @SuperBuilder + class UpdateReq extends OrganizationalNodeUser { + /** + * 由于updateById不支持将值设置为null,这里提供这个 + */ + Set> setNullFields = new HashSet<>(); + + public void check() { + Axssert.checkNonNull(getId(), "要更新的部门id不能为空"); + } + } + +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/OrgNodeUserQueryRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/OrgNodeUserQueryRepository.java deleted file mode 100644 index 265d251..0000000 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/OrgNodeUserQueryRepository.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.axzo.orgmanax.infra.dao.nodeuser.repository; - -public interface OrgNodeUserQueryRepository { -} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/OrgNodeUserUpsertRepository.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/OrgNodeUserUpsertRepository.java deleted file mode 100644 index 9d2e813..0000000 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/OrgNodeUserUpsertRepository.java +++ /dev/null @@ -1,4 +0,0 @@ -package cn.axzo.orgmanax.infra.dao.nodeuser.repository; - -public interface OrgNodeUserUpsertRepository { -} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java new file mode 100644 index 0000000..dd73926 --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserQueryRepositoryImpl.java @@ -0,0 +1,68 @@ +package cn.axzo.orgmanax.infra.dao.nodeuser.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.node.req.ListNodeReq; +import cn.axzo.orgmanax.api.nodeuser.req.ListNodeUserReq; +import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.dao.NodeUserDao; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +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 +@RequiredArgsConstructor +@Slf4j +public class NodeUserQueryRepositoryImpl implements NodeUserQueryRepository { + + private final NodeUserDao nodeUserDao; + private final NodeQueryRepository nodeQueryRepository; + + @Override + public PageResp page(ListNodeUserReq req) { + IPage page = PageConverter.toMybatis(req, OrganizationalNodeUser.class); + QueryWrapper wrapper = QueryWrapperHelper.fromBean(req, OrganizationalNodeUser.class); + IPage results = nodeUserDao.page(page, wrapper) + .convert(e -> BeanUtil.toBean(e, NodeUserResp.class)); + PageResp resp = PageConverter.toResp(results); + List records = resp.getData(); + if (CollUtil.isEmpty(records)) { + return resp; + } + + // assemble node + assembleNode(req, records); + return resp; + } + + private void assembleNode(ListNodeUserReq req, List records) { + if (CollUtil.isEmpty(records)) { + return; + } + if (!BooleanUtil.isTrue(req.getNeedNode())) { + return; + } + Set nodeIds = records.stream().map(NodeUserResp::getOrganizationalNodeId).collect(Collectors.toSet()); + // assemble parentNode + Map nodesById = nodeQueryRepository.list(ListNodeReq.builder() + .ids(nodeIds) + .build()).stream().collect(Collectors.toMap(NodeQueryRepository.NodeResp::getId, Function.identity())); + + records.forEach(r -> r.setNodeResp(nodesById.get(r.getOrganizationalNodeId()))); + } + +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserUpsertRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserUpsertRepositoryImpl.java new file mode 100644 index 0000000..91ea35c --- /dev/null +++ b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/NodeUserUpsertRepositoryImpl.java @@ -0,0 +1,35 @@ +package cn.axzo.orgmanax.infra.dao.nodeuser.repository.impl; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.infra.dao.nodeuser.dao.NodeUserDao; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserUpsertRepository; +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class NodeUserUpsertRepositoryImpl implements NodeUserUpsertRepository { + private final NodeUserDao nodeUserDao; + + @Override + public OrganizationalNodeUser create(OrganizationalNodeUser nodeUser) { + nodeUserDao.save(nodeUser); + return nodeUserDao.getById(nodeUser.getId()); + } + + @Override + public OrganizationalNodeUser update(UpdateReq req) { + Axssert.checkNonNull(req.getId(), "更新部门人员,部门人员不能为空"); + LambdaUpdateChainWrapper wrapper = nodeUserDao.lambdaUpdate().eq(OrganizationalNodeUser::getId, req.getId()); + if (CollUtil.isNotEmpty(req.getSetNullFields())) { + req.getSetNullFields().forEach(e -> wrapper.set(e, null)); + } + wrapper.update(req); + return nodeUserDao.getById(req.getId()); + } +} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/OrgNodeUserQueryRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/OrgNodeUserQueryRepositoryImpl.java deleted file mode 100644 index 03768c6..0000000 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/OrgNodeUserQueryRepositoryImpl.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.axzo.orgmanax.infra.dao.nodeuser.repository.impl; - -import cn.axzo.orgmanax.infra.dao.nodeuser.repository.OrgNodeUserQueryRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class OrgNodeUserQueryRepositoryImpl implements OrgNodeUserQueryRepository { -} diff --git a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/OrgNodeUserUpsertRepositoryImpl.java b/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/OrgNodeUserUpsertRepositoryImpl.java deleted file mode 100644 index 759375f..0000000 --- a/orgmanax-infra/src/main/java/cn/axzo/orgmanax/infra/dao/nodeuser/repository/impl/OrgNodeUserUpsertRepositoryImpl.java +++ /dev/null @@ -1,10 +0,0 @@ -package cn.axzo.orgmanax.infra.dao.nodeuser.repository.impl; - -import cn.axzo.orgmanax.infra.dao.nodeuser.repository.OrgNodeUserUpsertRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class OrgNodeUserUpsertRepositoryImpl implements OrgNodeUserUpsertRepository { -} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/controller/CooperateShipController.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/controller/CooperateShipController.java new file mode 100644 index 0000000..00ebb41 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/controller/CooperateShipController.java @@ -0,0 +1,30 @@ +package cn.axzo.orgmanax.server.cooperateship.controller; + +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.orgmanax.api.cooperateship.feign.OrgCooperateShipApi; +import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO; +import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author tanjie@axzo.cn + * @date 2024/12/2 16:47 + */ +@RestController +@RequestMapping +@RequiredArgsConstructor +public class CooperateShipController implements OrgCooperateShipApi { + + private final CooperateShipService cooperateShipService; + + + @Override + public ApiResult> list(ListOrgCooperateShipReq req) { + return ApiResult.success(cooperateShipService.list(req)); + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/CooperateShipEventType.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/CooperateShipEventType.java new file mode 100644 index 0000000..011825d --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/CooperateShipEventType.java @@ -0,0 +1,25 @@ +package cn.axzo.orgmanax.server.cooperateship.event.inner; + +import cn.axzo.foundation.event.support.Event; +import cn.axzo.orgmanax.infra.event.config.RocketMQEventConfig; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum CooperateShipEventType { + COOPERATE_SHIP_UPSERTED("cooperate-ship-upserted", "协同部门新增/更新事件"), + ; + + CooperateShipEventType(String name, String desc) { + this.eventCode = Event.EventCode.builder() + .module(RocketMQEventConfig.DEFAULT_MODULE) + .name(name) + .build(); + this.desc = desc; + } + + private String desc; + private Event.EventCode eventCode; +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/payload/CoopeateShipUpsertedPayload.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/payload/CoopeateShipUpsertedPayload.java new file mode 100644 index 0000000..ecf30bb --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/inner/payload/CoopeateShipUpsertedPayload.java @@ -0,0 +1,19 @@ +package cn.axzo.orgmanax.server.cooperateship.event.inner.payload; + +import cn.axzo.foundation.event.support.AbstractDiffablePayload; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class CoopeateShipUpsertedPayload extends AbstractDiffablePayload { + private SaasCooperateShip oldValue; + private SaasCooperateShip newValue; + private JSONObject ext; +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/package-info.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/package-info.java new file mode 100644 index 0000000..c886361 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/event/package-info.java @@ -0,0 +1 @@ +package cn.axzo.orgmanax.server.cooperateship.event; \ No newline at end of file diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/CooperateShipService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/CooperateShipService.java new file mode 100644 index 0000000..0e31668 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/CooperateShipService.java @@ -0,0 +1,40 @@ +package cn.axzo.orgmanax.server.cooperateship.service; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO; +import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +public interface CooperateShipService { + + CooperateShipQueryRepository.CooperateShipResp create(CreateReq req); + + List list(ListOrgCooperateShipReq req); + + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + class CreateReq { + private Long workspaceId; + private Long organizationalNodeId; + private Long parentId; + private Integer cooperateType; + private Integer partnerShip; + private Long operatorId; + + public void check() { + Axssert.checkNonNull(workspaceId, "工作台id不能为空"); + Axssert.checkNonNull(organizationalNodeId, "部门id不能为空"); + Axssert.checkNonNull(parentId, "上级协同部门不能为空"); + Axssert.checkNonNull(cooperateType, "参建类型不能为空"); + Axssert.checkNonNull(operatorId, "操作人不能为空 "); + } + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java new file mode 100644 index 0000000..133b421 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/cooperateship/service/impl/CooperateShipServiceImpl.java @@ -0,0 +1,126 @@ +package cn.axzo.orgmanax.server.cooperateship.service.impl; + +import cn.axzo.foundation.event.support.Event; +import cn.axzo.foundation.event.support.producer.EventProducer; +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.api.cooperateship.req.ListOrgCooperateShipReq; +import cn.axzo.orgmanax.api.cooperateship.resp.CooperateShipStatusEnum; +import cn.axzo.orgmanax.api.cooperateship.resp.CooperateShipTypeEnum; +import cn.axzo.orgmanax.api.cooperateship.resp.OrgCooperateShipDTO; +import cn.axzo.orgmanax.common.config.BizResultCode; +import cn.axzo.orgmanax.infra.client.workspace.WorkspaceGateway; +import cn.axzo.orgmanax.infra.client.workspace.dto.Workspace; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; +import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; +import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipUpsertRepository; +import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.unit.repository.UnitQueryRepository; +import cn.axzo.orgmanax.server.cooperateship.event.inner.CooperateShipEventType; +import cn.axzo.orgmanax.server.cooperateship.event.inner.payload.CoopeateShipUpsertedPayload; +import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; +import cn.hutool.core.bean.BeanUtil; +import com.google.common.collect.ImmutableSet; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class CooperateShipServiceImpl implements CooperateShipService { + + private static final Set ALLOWED_TOP_COOPERATE_TYPES = ImmutableSet.of( + CooperateShipTypeEnum.PROJ_PRIMARY_CONTRACTING_UNIT.getCode(), + CooperateShipTypeEnum.PROJ_CONSTRUCTION_UNIT.getCode(), + CooperateShipTypeEnum.PROJ_SUPERVISION_UNIT.getCode(), + CooperateShipTypeEnum.OMS.getCode(), + CooperateShipTypeEnum.ENT_COMMON.getCode(), + CooperateShipTypeEnum.SURVEY_UNIT.getCode(), + CooperateShipTypeEnum.DESIGN_UNIT.getCode(), + CooperateShipTypeEnum.OTHER.getCode() + ); + + private final CooperateShipQueryRepository cooperateShipQueryRepository; + private final CooperateShipUpsertRepository cooperateShipUpsertRepository; + private final NodeQueryRepository nodeQueryRepository; + private final UnitQueryRepository unitQueryRepository; + private final WorkspaceGateway workspaceGateway; + private final EventProducer eventProducer; + + @Override + public CooperateShipQueryRepository.CooperateShipResp create(CreateReq req) { + // node check + NodeQueryRepository.NodeResp node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(req.getOrganizationalNodeId()).build()) + .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", req.getOrganizationalNodeId())); + Axssert.check(node.isTopNode(), BizResultCode.INVALID_PARAM, "只有顶级节点才能添加协同关系"); + // workspace check + Workspace workspace = workspaceGateway.getWorkspace(req.getWorkspaceId()); + Axssert.checkNonNull(workspace, "工作台不存在{}", req.getWorkspaceId()); + CooperateShipQueryRepository.CooperateShipResp parentShip = null; + if (!ALLOWED_TOP_COOPERATE_TYPES.contains(req.getCooperateType())) { + Axssert.check(req.getParentId() > 0L, BizResultCode.INVALID_PARAM, "父级协同类型不能为空"); + parentShip = cooperateShipQueryRepository + .oneOpt(CooperateShipQueryRepository.OneReq.builder().id(req.getParentId()).build()) + .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("父级协同部门不存在{}", req.getOrganizationalNodeId())); + Axssert.check(Objects.equals(parentShip.getWorkspaceId(), req.getWorkspaceId()), BizResultCode.INVALID_PARAM, "父级协同部门和要加入部门不是同一个工作台"); + } + + UnitQueryRepository.UnitResp unit = unitQueryRepository.oneOpt(UnitQueryRepository.OneReq.builder() + .id(node.getId()) + .build()).orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("单位不存在{}", node.getOrganizationalUnitId())); + + SaasCooperateShip cooperateShip = SaasCooperateShip.builder() + .parentId(req.getParentId()) + .workspaceId(workspace.getId()) + .workspaceType(workspace.getType()) + .workspaceName(workspace.getName()) + .status(CooperateShipStatusEnum.PRESENT.getCode()) + .joinAt(new Date()) + .organizationalUnitId(node.getOrganizationalUnitId()) + .organizationalUnitName(unit.getName()) + .cooperateType(req.getCooperateType()) + .organizationalNodeId(node.getId()) + .partnerShip(req.getPartnerShip()) + .createBy(req.getOperatorId()) + .build(); + SaasCooperateShip savedCooperateShip = cooperateShipUpsertRepository.create(cooperateShip); + + // update path + savedCooperateShip.calcPath(parentShip); + SaasCooperateShip saved = cooperateShipUpsertRepository.update(CooperateShipUpsertRepository.UpdateReq.builder() + .id(savedCooperateShip.getId()) + .path(savedCooperateShip.getPath()) + .build()); + + // 发送数据变更基础MQ + eventProducer.send(Event.builder() + .eventCode(CooperateShipEventType.COOPERATE_SHIP_UPSERTED.getEventCode()) + .operatorId(req.getOperatorId() + "") + .operatorType(getClass().getSimpleName()) + .targetType("cooperate_ship_id") + .targetId(savedCooperateShip.getId() + "") + .shardingKey(saved.getOrganizationalNodeId() + "") + .data(CoopeateShipUpsertedPayload.builder() + .newValue(saved) + .oldValue(null) + .build()) + .build()); + + // 返回结果 + return cooperateShipQueryRepository.one(CooperateShipQueryRepository.OneReq.builder().id(saved.getId()).build()); + } + + @Override + public List list(ListOrgCooperateShipReq req) { + List results = cooperateShipQueryRepository.list(req).stream() + .map(e -> BeanUtil.toBean(e, OrgCooperateShipDTO.class)).collect(Collectors.toList()); + // assemble other data + return results; + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/controller/NodeController.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/controller/NodeController.java index a69d285..d03721e 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/controller/NodeController.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/controller/NodeController.java @@ -5,7 +5,7 @@ import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.result.ApiResult; import cn.axzo.orgmanax.api.node.feign.OrgNodeApi; import cn.axzo.orgmanax.api.node.req.ListNodeReq; -import cn.axzo.orgmanax.api.node.req.NodeProcessReq; +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; import cn.axzo.orgmanax.server.node.service.NodeService; import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor; @@ -36,7 +36,7 @@ public class NodeController implements OrgNodeApi { * @return */ @Override - public ApiResult process(NodeProcessReq req) { + public ApiResult process(ProcessNodeReq req) { NodeProcessor.ProcessResult processResult = nodeService.process(req); Axssert.isTrue(processResult.getSuccess(), NODE_PROCESS_FAILED, processResult.getMsg()); return ApiResult.success(processResult.getContext()); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/event/inner/NodeEventType.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/event/inner/NodeEventType.java index 9f2e569..cc8fc88 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/event/inner/NodeEventType.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/event/inner/NodeEventType.java @@ -9,7 +9,7 @@ import lombok.Getter; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum NodeEventType { - NODE_UPSERTED("node-upserted", "验收单新增/更新事件"), + NODE_UPSERTED("node-upserted", "部门新增/更新事件"), ; NodeEventType(String name, String desc) { diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java index 3f083df..c15cd9f 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/foundation/impl/NodeFoundationServiceImpl.java @@ -53,15 +53,16 @@ public class NodeFoundationServiceImpl implements NodeFoundationService { // 转换为领域对象 // 持久化 -> mapstruct? OrganizationalNode organizationalNode = nodeCreate.toEntity(); - nodeUpsertRepository.create(organizationalNode); + OrganizationalNode savedNode = nodeUpsertRepository.create(organizationalNode); // 重新计算path、topNodeId等数据。 未来也可以添加workspaceId等信息 - String path = organizationalNode.calcPath(parentNode); + savedNode.calcPath(parentNode); // 更新path数据 nodeUpsertRepository.update(NodeUpsertRepository.UpdateReq.builder() - .id(organizationalNode.getId()) - .path(path) + .id(savedNode.getId()) + .topNodeId(savedNode.getTopNodeId()) + .path(savedNode.getPath()) .build()); NodeQueryRepository.NodeResp saved = nodeQueryRepository.one(NodeQueryRepository.OneReq.builder().id(organizationalNode.getId()).build()); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/NodeService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/NodeService.java index cfc033d..de3e2ec 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/NodeService.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/NodeService.java @@ -3,7 +3,7 @@ package cn.axzo.orgmanax.server.node.service; import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.api.node.req.ListNodeReq; -import cn.axzo.orgmanax.api.node.req.NodeProcessReq; +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; import cn.axzo.orgmanax.common.config.BizResultCode; import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor; @@ -17,7 +17,7 @@ import java.util.List; public interface NodeService { - NodeProcessor.ProcessResult process(NodeProcessReq req); + NodeProcessor.ProcessResult process(ProcessNodeReq req); PageResp page(ListNodeReq req); @@ -32,7 +32,7 @@ public interface NodeService { class ProcessReq { private Long id; private Long operatorId; - private NodeProcessReq.Action action; + private ProcessNodeReq.Action action; private JSONObject param; /** diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java index 2f4df28..85ba0c0 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/impl/NodeServiceImpl.java @@ -3,7 +3,7 @@ package cn.axzo.orgmanax.server.node.service.impl; import cn.axzo.foundation.exception.Axssert; import cn.axzo.foundation.page.PageResp; import cn.axzo.orgmanax.api.node.req.ListNodeReq; -import cn.axzo.orgmanax.api.node.req.NodeProcessReq; +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; import cn.axzo.orgmanax.common.config.BizResultCode; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; @@ -27,7 +27,7 @@ public class NodeServiceImpl implements NodeService { private final ApplicationContext applicationContext; @Override - public NodeProcessor.ProcessResult process(NodeProcessReq req) { + public NodeProcessor.ProcessResult process(ProcessNodeReq req) { // 通用check Axssert.notNull(req.getAction(), BizResultCode.INVALID_PARAM, "执行行为不能为空"); Axssert.notNull(req.getOperatorId(), BizResultCode.INVALID_PARAM, "操作人不能为空"); diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java index 20fc03f..de81c72 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/NodeProcessor.java @@ -1,6 +1,6 @@ package cn.axzo.orgmanax.server.node.service.processor; -import cn.axzo.orgmanax.api.node.req.NodeProcessReq; +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; import com.alibaba.fastjson.JSONObject; import lombok.AccessLevel; @@ -24,7 +24,7 @@ public interface NodeProcessor { @AllArgsConstructor class ProcessContext { NodeQueryRepository.NodeResp node; - NodeProcessReq.Action action; + ProcessNodeReq.Action action; JSONObject params; diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/impl/CreateNodeProcessor.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/impl/CreateNodeProcessor.java index a745993..cc91377 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/impl/CreateNodeProcessor.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/node/service/processor/impl/CreateNodeProcessor.java @@ -1,18 +1,22 @@ package cn.axzo.orgmanax.server.node.service.processor.impl; +import cn.axzo.orgmanax.api.cooperateship.resp.CooperateShipTypeEnum; +import cn.axzo.orgmanax.common.config.BizResultCode; +import cn.axzo.orgmanax.infra.client.workspace.WorkspaceGateway; +import cn.axzo.orgmanax.infra.client.workspace.dto.Workspace; +import cn.axzo.orgmanax.infra.dao.cooperateship.entity.SaasCooperateShip; import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; +import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService; import cn.axzo.orgmanax.server.node.foundation.NodeFoundationService; import cn.axzo.orgmanax.server.node.foundation.req.NodeCreate; import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor; import com.alibaba.fastjson.JSONObject; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.Objects; + /** * 创建普通部门 */ @@ -20,7 +24,10 @@ import org.springframework.stereotype.Component; @Slf4j @RequiredArgsConstructor public class CreateNodeProcessor implements NodeProcessor { + private final NodeFoundationService nodeFoundationService; + private final CooperateShipService cooperateShipService; + private final WorkspaceGateway workspaceGateway; @Override public ProcessResult process(ProcessContext context) { @@ -29,50 +36,42 @@ public class CreateNodeProcessor implements NodeProcessor { OrganizationalNode savedNode = nodeFoundationService.create(nodeCreate); // 创建部门的通用MQ,在create方法里面已经处理。此处不用再发MQ + // 初始化协同关系 + initCooperateShipIfNeeded(savedNode, nodeCreate); + // 返回数据 return ProcessResult.success((JSONObject) JSONObject.toJSON(savedNode)); } - @NoArgsConstructor - @AllArgsConstructor - @Data - @Builder - public static class Param { - - /** - * 单位ID - */ - private Long organizationalUnitId; - - /** - * 部门名称 - */ - private String organizationalNodeName; - - /** - * 部门类型 - */ - private Integer nodeType; - - /** - * 上级部门ID - */ - private Long parentId; - - /** - * 简介 - */ - private String remark; - - /** - * 创建人 - */ - private Long operatorId; - - private JSONObject ext; - - public void check() { - // checks + protected void initCooperateShipIfNeeded(OrganizationalNode node, NodeCreate nodeCreate) { + if (node == null) { + return; } + // 平台班组,不需要创建协同关系 + if (Objects.equals(node.getNodeType(), OrganizationalNode.TypeEnum.TEAM.getValue())) { + return; + } + + // 非顶级节点,不创建协同关系 + if (node.getParentId() != null && node.getParentId() > 0L) { + return; + } + + // 查询单位工作台类型 + Workspace workspace = workspaceGateway.listWorkspaces(WorkspaceGateway.ListWorkspaceReq.builder() + .type(Workspace.WorkspaceTypeEnum.GENERAL_ENT.value) + .organizationalUnitId(node.getOrganizationalUnitId()) + .build()).stream().findFirst().orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("没有企业工作台")); + + // 创建协同关系 + cooperateShipService.create(CooperateShipService.CreateReq.builder() + .workspaceId(workspace.getId()) + // TODO TOCHECK + .cooperateType(CooperateShipTypeEnum.ENT_COMMON.getCode()) + .partnerShip(SaasCooperateShip.ParterShipEnum.OWNED.getCode()) + .organizationalNodeId(node.getTopNodeId()) + .parentId(0L) + .operatorId(nodeCreate.getOperatorId()) + .build()); } } diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/NodeUserController.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/NodeUserController.java new file mode 100644 index 0000000..85dc790 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/controller/NodeUserController.java @@ -0,0 +1,49 @@ +package cn.axzo.orgmanax.server.nodeuser.controller; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.foundation.page.PageResp; +import cn.axzo.foundation.result.ApiResult; +import cn.axzo.orgmanax.api.nodeuser.feign.OrgNodeUserApi; +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.server.nodeuser.service.NodeUserService; +import cn.axzo.orgmanax.server.nodeuser.service.processor.NodeUserProcessor; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import static cn.axzo.orgmanax.common.config.BizResultCode.NODE_USER_PROCESS_FAILED; + +/** + * @author tanjie@axzo.cn + * @date 2024/12/2 16:47 + */ +@RestController +@RequestMapping +@RequiredArgsConstructor +public class NodeUserController implements OrgNodeUserApi { + + private final NodeUserService nodeUserService; + + /** + * 创建部门 + *

+ * XXX: why json: 由于不同行为,需要的参数和返回信息均不一致。jsonObject用来统一接收参数和返回数据。具体消费参数的地方「service、processor」来定义具体的类型。 + * + * @param req 创建部门参数 + * @return + */ + @Override + public ApiResult process(ProcessNodeUserReq req) { + NodeUserProcessor.ProcessResult processResult = nodeUserService.process(req); + Axssert.isTrue(processResult.getSuccess(), NODE_USER_PROCESS_FAILED, processResult.getMsg()); + return ApiResult.success(processResult.getContext()); + } + + @Override + public ApiResult> list(ListNodeUserReq req) { + return ApiResult.success(nodeUserService.page(req)); + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/inner/NodeUserEventType.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/inner/NodeUserEventType.java new file mode 100644 index 0000000..08f3899 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/inner/NodeUserEventType.java @@ -0,0 +1,25 @@ +package cn.axzo.orgmanax.server.nodeuser.event.inner; + +import cn.axzo.foundation.event.support.Event; +import cn.axzo.orgmanax.infra.event.config.RocketMQEventConfig; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public enum NodeUserEventType { + NODE_USER_UPSERTED("node-user-upserted", "部门人员新增/更新事件"), + ; + + NodeUserEventType(String name, String desc) { + this.eventCode = Event.EventCode.builder() + .module(RocketMQEventConfig.DEFAULT_MODULE) + .name(name) + .build(); + this.desc = desc; + } + + private String desc; + private Event.EventCode eventCode; +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/inner/payload/NodeUserUpsertedPayload.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/inner/payload/NodeUserUpsertedPayload.java new file mode 100644 index 0000000..432e735 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/inner/payload/NodeUserUpsertedPayload.java @@ -0,0 +1,34 @@ +package cn.axzo.orgmanax.server.nodeuser.event.inner.payload; + +import cn.axzo.foundation.event.support.AbstractDiffablePayload; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.lang3.ObjectUtils; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@Builder +public class NodeUserUpsertedPayload extends AbstractDiffablePayload { + private OrganizationalNodeUser oldValue; + private OrganizationalNodeUser newValue; + private JSONObject ext; + + /** + * 勿删除,json序列化会使用 + * + * @return + */ + public Long getPersonId() { + return ObjectUtils.firstNonNull(oldValue, newValue).getPersonId(); + } + + public Long getIdentityId() { + return ObjectUtils.firstNonNull(oldValue, newValue).getIdentityId(); + } + +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/package-info.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/package-info.java new file mode 100644 index 0000000..187bf2a --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/event/package-info.java @@ -0,0 +1 @@ +package cn.axzo.orgmanax.server.nodeuser.event; \ No newline at end of file diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java new file mode 100644 index 0000000..aad36ce --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/NodeUserFoundationService.java @@ -0,0 +1,27 @@ +package cn.axzo.orgmanax.server.nodeuser.foundation; + +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserCreate; +import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserUpdate; +import org.springframework.transaction.annotation.Transactional; + +public interface NodeUserFoundationService { + /** + * 创建部门 + * + * @param param + * @return + */ + @Transactional(rollbackFor = Throwable.class) + OrganizationalNodeUser create(NodeUserCreate param); + + /** + * 该接口为更新的收口接口,业务使用的时候,需要自行做业务判断 + * + * @param req + * @return + */ + @Transactional(rollbackFor = Throwable.class) + OrganizationalNodeUser update(NodeUserUpdate req); + +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java new file mode 100644 index 0000000..9bbad3a --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/impl/NodeUserFoundationServiceImpl.java @@ -0,0 +1,141 @@ +package cn.axzo.orgmanax.server.nodeuser.foundation.impl; + +import cn.axzo.foundation.event.support.Event; +import cn.axzo.foundation.event.support.producer.EventProducer; +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.common.config.BizResultCode; +import cn.axzo.orgmanax.infra.client.pudge.PersonProfileGateway; +import cn.axzo.orgmanax.infra.client.pudge.dto.IdentityProfile; +import cn.axzo.orgmanax.infra.client.pudge.dto.PersonProfile; +import cn.axzo.orgmanax.infra.dao.cooperateship.repository.CooperateShipQueryRepository; +import cn.axzo.orgmanax.infra.dao.node.entity.OrganizationalNode; +import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserUpsertRepository; +import cn.axzo.orgmanax.server.node.event.inner.NodeEventType; +import cn.axzo.orgmanax.server.nodeuser.event.inner.payload.NodeUserUpsertedPayload; +import cn.axzo.orgmanax.server.nodeuser.foundation.NodeUserFoundationService; +import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserCreate; +import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserUpdate; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.BooleanUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Objects; + +/** + * @author tanjie@axzo.cn + * @date 2024/12/2 16:55 + */ +@Service +@RequiredArgsConstructor +public class NodeUserFoundationServiceImpl implements NodeUserFoundationService { + + private final NodeUserQueryRepository nodeUserQueryRepository; + private final NodeUserUpsertRepository nodeUserUpsertRepository; + private final NodeQueryRepository nodeQueryRepository; + private final CooperateShipQueryRepository cooperateShipQueryRepository; + private final EventProducer eventProducer; + private final PersonProfileGateway profileGateway; + + /** + * 创建部门标准接口 + * + * @param + * @return + */ + @Transactional + @Override + public OrganizationalNodeUser create(NodeUserCreate param) { + param.check(); + + // 部门是否存在 + NodeQueryRepository.NodeResp node = nodeQueryRepository.oneOpt(NodeQueryRepository.OneReq.builder().id(param.getNodeId()).build()) + .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门不存在{}", param.getNodeId())); + + // 人是否存在 + PersonProfile personProfile = profileGateway.getPersonProfile(param.getPersonId()); + Axssert.checkNonNull(personProfile, "用户不存在"); + // 人员身份是否存在 + IdentityProfile identityProfile = profileGateway.getIdentityProfile(param.getPersonId(), param.getIdentityType()); + Axssert.checkNonNull(personProfile, "用户身份不存在"); + + // 转换为领域对象 + // 持久化 -> mapstruct? + OrganizationalNodeUser nodeUser = param.toEntity(); + // assemble person info + nodeUser.setIdentityId(identityProfile.getIdentityId()); + nodeUser.setPhone(personProfile.getPhone()); + nodeUser.setRealName(personProfile.getRealName()); + nodeUser.setIdNumber(personProfile.getIdNumber()); + // assemble unit info + nodeUser.setOrganizationalUnitId(node.getOrganizationalUnitId()); + // assemble node info + nodeUser.setTopNodeId(node.getTopNodeId()); + // assemble workspace + nodeUser.setWorkspaceId(resolveWorkspaceId(node)); + + nodeUserUpsertRepository.create(nodeUser); + + NodeUserQueryRepository.NodeUserResp saved = nodeUserQueryRepository.one( + NodeUserQueryRepository.OneReq.builder().id(nodeUser.getId()).build()); + + // 发送数据变更基础MQ + eventProducer.send(Event.builder() + .eventCode(NodeEventType.NODE_UPSERTED.getEventCode()) + .operatorId(param.getOperatorId() + "") + .operatorType(getClass().getSimpleName()) + .targetType("personId") + .targetId(saved.getId() + "") + .shardingKey(saved.getPersonId() + "") + .data(NodeUserUpsertedPayload.builder() + .newValue(saved) + .oldValue(null) + .ext(param.getExtra()) + .build()) + .build()); + + // 返回结果 + return saved; + } + + @Override + public OrganizationalNodeUser update(NodeUserUpdate req) { + NodeUserQueryRepository.NodeUserResp dbNodeUser = nodeUserQueryRepository.oneOpt(NodeUserQueryRepository.OneReq.builder().id(req.getId()).build()) + .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门人员不存在{}", req.getId())); + + NodeUserUpsertRepository.UpdateReq updateReq = BeanUtil.toBean(req, NodeUserUpsertRepository.UpdateReq.class); + // 刷新用户基本资料 + if (BooleanUtil.isTrue(req.getRefreshPersonProfile())) { + PersonProfile personProfile = profileGateway.getPersonProfile(dbNodeUser.getPersonId()); + Axssert.checkNonNull(personProfile, "用户不存在"); + // 人员身份是否存在 + IdentityProfile identityProfile = profileGateway.getIdentityProfile(dbNodeUser.getPersonId(), dbNodeUser.getIdentityType()); + Axssert.checkNonNull(personProfile, "用户身份不存在"); + + // 转换为领域对象 + // 持久化 -> mapstruct? + // assemble person info + updateReq.setIdentityId(identityProfile.getIdentityId()); + updateReq.setPhone(personProfile.getPhone()); + updateReq.setRealName(personProfile.getRealName()); + updateReq.setIdNumber(personProfile.getIdNumber()); + } + + return nodeUserUpsertRepository.update(updateReq); + } + + private Long resolveWorkspaceId(NodeQueryRepository.NodeResp node) { + if (Objects.equals(node.getNodeType(), OrganizationalNode.TypeEnum.TEAM.getValue())) { + return 0L; + } + return cooperateShipQueryRepository.oneOpt(CooperateShipQueryRepository.OneReq.builder() + .organizationalNodeId(node.getOrganizationalUnitId()) + .build()).map(CooperateShipQueryRepository.CooperateShipResp::getWorkspaceId) + .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("部门人员所属项目未找到,请稍后重试")); + } + +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserCreate.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserCreate.java new file mode 100644 index 0000000..2b3c7e0 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserCreate.java @@ -0,0 +1,76 @@ +package cn.axzo.orgmanax.server.nodeuser.foundation.req; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; +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.Optional; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@SuperBuilder +public class NodeUserCreate { + private Long personId; + private Long nodeId; + private Integer identityType; + private Long workspaceId; + private Boolean manager; + private Long organizationalJobId; + /** + * 0:普通岗位、1:主岗位 + */ + private Integer primaryJob; + /** + * 是否允许进入工地 1.允许 2.不允许 + */ + private Integer isAllowed; + /** + * 数据同步ID + */ + private Long syncDataId; + /** + * 工号 + */ + private String jobNumber; + private String joinScene; + private JSONObject extra; + /** + * 1-活跃用户,0-非活跃用户 + */ + private Integer activeFlag; + private Long operatorId; + /** + * 创建部门的端 + */ + private String terminal; + /** + * 创建部门的页面,需前端或调用方传入 + */ + private String page; + private JSONObject profile; + + public void check() { + Axssert.checkNonNull(operatorId, "操作人不能为空"); + Axssert.checkNonNull(nodeId, "部门不能为空"); + Axssert.checkNonNull(identityType, "人员身份不能为空"); + Axssert.checkNonNull(personId, "用户id不能都为空"); + } + + public OrganizationalNodeUser toEntity() { + OrganizationalNodeUser nodeUser = BeanUtil.toBean(this, OrganizationalNodeUser.class); + nodeUser.setExtra(Optional.ofNullable(extra).orElseGet(JSONObject::new) + .fluentPut("createScene", ImmutableMap.of("terminal", StrUtil.firstNonBlank(terminal, "UNKNOWN"), + "page", StrUtil.firstNonBlank(page, "UNKNOWN")))); + nodeUser.setJoinAt(new Date()); + return nodeUser; + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserUpdate.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserUpdate.java new file mode 100644 index 0000000..ee045a7 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/foundation/req/NodeUserUpdate.java @@ -0,0 +1,48 @@ +package cn.axzo.orgmanax.server.nodeuser.foundation.req; + +import cn.axzo.foundation.exception.Axssert; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +@NoArgsConstructor +@AllArgsConstructor +@Data +@SuperBuilder +public class NodeUserUpdate { + private Long id; + private Boolean manager; + private Long organizationalJobId; + /** + * 0:普通岗位、1:主岗位 + */ + private Integer primaryJob; + /** + * 是否允许进入工地 1.允许 2.不允许 + */ + private Integer isAllowed; + /** + * 数据同步ID + */ + private Long syncDataId; + /** + * 工号 + */ + private String jobNumber; + private String joinScene; + private JSONObject extra; + /** + * 1-活跃用户,0-非活跃用户 + */ + private Integer activeFlag; + /** + * 指定为true的情况,要刷新用户信息 + */ + private Boolean refreshPersonProfile; + + public void check() { + Axssert.checkNonNull(id, "部门人员不能为空"); + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/NodeUserService.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/NodeUserService.java new file mode 100644 index 0000000..023409f --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/NodeUserService.java @@ -0,0 +1,51 @@ +package cn.axzo.orgmanax.server.nodeuser.service; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.foundation.page.PageResp; +import cn.axzo.orgmanax.api.node.req.ListNodeReq; +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; +import cn.axzo.orgmanax.api.node.resp.OrgNodeDTO; +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.common.config.BizResultCode; +import cn.axzo.orgmanax.server.node.service.processor.NodeProcessor; +import cn.axzo.orgmanax.server.nodeuser.service.processor.NodeUserProcessor; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +public interface NodeUserService { + + NodeUserProcessor.ProcessResult process(ProcessNodeUserReq req); + + PageResp page(ListNodeUserReq req); + + default List list(ListNodeUserReq req) { + return page(req).getData(); + } + + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + class ProcessReq { + private Long id; + private Long operatorId; + private ProcessNodeReq.Action action; + private JSONObject param; + + /** + * 基于参数的通用逻辑判断 + */ + public void check() { + Axssert.notNull(action, BizResultCode.INVALID_PARAM, "执行行为不能为空"); + Axssert.notNull(operatorId, BizResultCode.INVALID_PARAM, "操作人不能为空"); + } + } + +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java new file mode 100644 index 0000000..ccd7bcf --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/impl/NodeUserServiceImpl.java @@ -0,0 +1,58 @@ +package cn.axzo.orgmanax.server.nodeuser.service.impl; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.foundation.page.PageResp; +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.common.config.BizResultCode; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService; +import cn.axzo.orgmanax.server.nodeuser.service.processor.NodeUserProcessor; +import cn.hutool.core.bean.BeanUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@Service +@RequiredArgsConstructor +public class NodeUserServiceImpl implements NodeUserService { + + private final NodeUserQueryRepository nodeUserQueryRepository; + private final ApplicationContext applicationContext; + + @Override + public NodeUserProcessor.ProcessResult process(ProcessNodeUserReq req) { + // 通用check + Axssert.notNull(req.getAction(), BizResultCode.INVALID_PARAM, "执行行为不能为空"); + Axssert.notNull(req.getOperatorId(), BizResultCode.INVALID_PARAM, "操作人不能为空"); + // 如果指定了id,校验部门人员是否存在,并加载出node,以便后续使用 + NodeUserQueryRepository.NodeUserResp current = req.getId() == null ? null + : nodeUserQueryRepository.oneOpt(NodeUserQueryRepository.OneReq.builder().id(req.getId()).build()) + .orElseThrow(() -> BizResultCode.ENTITY_NOT_FOUND.toException("要操作的部门人员不存在,{}", req.getId())); + + // 构建processor所需上下文 + NodeUserProcessor.ProcessContext processContext = NodeUserProcessor.ProcessContext.builder() + .nodeUser(current) + .action(req.getAction()) + .operatorId(req.getOperatorId()) + .params(req.getParam()) + .build(); + + NodeUserProcessor processor = applicationContext.getBean(req.getAction().getProcessor(), NodeUserProcessor.class); + return processor.process(processContext); + } + + @Override + public PageResp page(ListNodeUserReq req) { + PageResp page = nodeUserQueryRepository.page(req); + List records = page.getData().stream().map(e -> BeanUtil.toBean(e, OrgNodeUserDTO.class)).collect(Collectors.toList()); + // assemble data if needed + return new PageResp<>(page.getTotal(), page.getSize(), page.getCurrent(), records); + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/NodeUserProcessor.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/NodeUserProcessor.java new file mode 100644 index 0000000..04a82ce --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/NodeUserProcessor.java @@ -0,0 +1,72 @@ +package cn.axzo.orgmanax.server.nodeuser.service.processor; + +import cn.axzo.orgmanax.api.node.req.ProcessNodeReq; +import cn.axzo.orgmanax.api.nodeuser.req.ProcessNodeUserReq; +import cn.axzo.orgmanax.infra.dao.node.repository.NodeQueryRepository; +import cn.axzo.orgmanax.infra.dao.nodeuser.repository.NodeUserQueryRepository; +import com.alibaba.fastjson.JSONObject; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +public interface NodeUserProcessor { + + @Transactional(rollbackFor = Throwable.class) + ProcessResult process(ProcessContext context); + + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class ProcessContext { + NodeUserQueryRepository.NodeUserResp nodeUser; + ProcessNodeUserReq.Action action; + + JSONObject params; + + String description; + Long operatorId; + String operatorName; + } + + @Getter + @Builder(access = AccessLevel.PRIVATE) + @AllArgsConstructor + class ProcessResult { + @Builder.Default + Boolean success = Boolean.TRUE; + + String msg; + + JSONObject context; + + public static ProcessResult success() { + return success(null); + } + + public static ProcessResult success(JSONObject context) { + return ProcessResult.builder() + .success(true) + .context(Optional.ofNullable(context).orElse(new JSONObject(0))) + .build(); + } + + public static ProcessResult fail() { + return fail(null); + } + + public static ProcessResult fail(String msg) { + return ProcessResult.builder() + .success(false) + .msg(msg) + .build(); + } + + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/impl/CreateNodeUserProcessor.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/impl/CreateNodeUserProcessor.java new file mode 100644 index 0000000..f1659e7 --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/impl/CreateNodeUserProcessor.java @@ -0,0 +1,30 @@ +package cn.axzo.orgmanax.server.nodeuser.service.processor.impl; + +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.server.nodeuser.foundation.NodeUserFoundationService; +import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserCreate; +import cn.axzo.orgmanax.server.nodeuser.service.processor.NodeUserProcessor; +import com.alibaba.fastjson.JSONObject; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * 添加普通部门人员 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class CreateNodeUserProcessor implements NodeUserProcessor { + private final NodeUserFoundationService nodeUserFoundationService; + + @Override + public ProcessResult process(ProcessContext context) { + // 转成该处理器关注的参数对象 + NodeUserCreate nodeCreate = context.getParams().toJavaObject(NodeUserCreate.class); + OrganizationalNodeUser nodeUser = nodeUserFoundationService.create(nodeCreate); + + // 返回数据 + return ProcessResult.success((JSONObject) JSONObject.toJSON(nodeUser)); + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/impl/UpdateNodeUserProcessor.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/impl/UpdateNodeUserProcessor.java new file mode 100644 index 0000000..d825c5c --- /dev/null +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/nodeuser/service/processor/impl/UpdateNodeUserProcessor.java @@ -0,0 +1,92 @@ +package cn.axzo.orgmanax.server.nodeuser.service.processor.impl; + +import cn.axzo.foundation.exception.Axssert; +import cn.axzo.orgmanax.infra.dao.nodeuser.entity.OrganizationalNodeUser; +import cn.axzo.orgmanax.server.nodeuser.foundation.NodeUserFoundationService; +import cn.axzo.orgmanax.server.nodeuser.foundation.req.NodeUserUpdate; +import cn.axzo.orgmanax.server.nodeuser.service.processor.NodeUserProcessor; +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.Date; + +/** + * 更新部门人员普通信息 + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class UpdateNodeUserProcessor implements NodeUserProcessor { + private final NodeUserFoundationService nodeUserFoundationService; + + @Override + public ProcessResult process(ProcessContext context) { + Axssert.checkNonNull(context.getParams(), "更新部门人员失败,参数不能为null"); + Axssert.checkNonNull(context.getNodeUser(), "要更新的部门人员不存在"); + Param param = context.getParams().toJavaObject(Param.class); + param.setId(context.getNodeUser().getId()); + + NodeUserUpdate update = param.toNodeUpdate(); + OrganizationalNodeUser updated = nodeUserFoundationService.update(update); + return ProcessResult.success((JSONObject) JSON.toJSON(updated)); + } + + + /** + * 仅接收允许直接被编辑的字段 + */ + @NoArgsConstructor + @AllArgsConstructor + @Data + @Builder + public static class Param { + private Long id; + + /** + * 岗位id + */ + private Long organizationalJobId; + /** + * 是否管理员 + */ + private String manager; + /** + * 离开时间 + */ + private Date leaveAt; + /** + * 工号 + */ + private String jobNumber; + + /** + * 扩展字段 + * XXX:不能简单更新,后续要提供增量 更新 和 删除字段的功能 + */ + private JSONObject extra; + /** + * 1-活跃用户,0-非活跃用户 + */ + private Integer activeFlag; + /** + * 部门人员信息,json,不同部门类型的部门用户,格式不一。 + * XXX:不能简单更新,后续要提供增量 更新 和 删除字段的功能 + */ + private JSONObject profile; + + private Boolean refreshPersonProfile; + + public NodeUserUpdate toNodeUpdate() { + NodeUserUpdate update = BeanUtil.toBean(this, NodeUserUpdate.class); + return update; + } + } +} diff --git a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/unit/event/inner/UnitEventType.java b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/unit/event/inner/UnitEventType.java index 9a0af55..53437c5 100644 --- a/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/unit/event/inner/UnitEventType.java +++ b/orgmanax-server/src/main/java/cn/axzo/orgmanax/server/unit/event/inner/UnitEventType.java @@ -9,7 +9,7 @@ import lombok.Getter; @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum UnitEventType { - NODE_UPSERTED("unit-upserted", "验收单新增/更新事件"), + NODE_UPSERTED("unit-upserted", "单位新增/更新事件"), ; UnitEventType(String name, String desc) {