Merge remote-tracking branch 'origin/feature/REQ-3488' into feature/REQ-3488

This commit is contained in:
liuyang 2025-01-07 17:03:17 +08:00
commit 86303c58c1
21 changed files with 610 additions and 70 deletions

View File

@ -13,7 +13,7 @@ import cn.axzo.orgmanax.dto.project.team.req.SaveProjectTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp; import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp;
import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp; import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp;
import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryResp; import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryGroupResp;
import java.util.List; import java.util.List;
import javax.validation.Valid; import javax.validation.Valid;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
@ -39,7 +39,7 @@ public interface OrgProjectTeamCategoryApi {
* 用到 org_project_team_category 表数据 * 用到 org_project_team_category 表数据
*/ */
@PostMapping("/api/project/team-category/group-list") @PostMapping("/api/project/team-category/group-list")
ApiResult<List<TeamCategoryResp>> groupList(@RequestBody GroupTeamCategoryReq req); ApiResult<List<TeamCategoryGroupResp>> groupList(@RequestBody GroupTeamCategoryReq req);
/** /**
* todo 三期实现 * todo 三期实现

View File

@ -75,7 +75,7 @@ Accept: application/json
"activeFlag": 1, "activeFlag": 1,
"searchCount": true, "searchCount": true,
"needs": { "needs": {
"childNodeUser": true "job": true
}, },
"distinctRule": { "distinctRule": {
"distinctByFields": [ "distinctByFields": [

View File

@ -16,6 +16,8 @@ public enum BizResultCode implements IResultCode {
INVALID_PARAM("400", "参数异常"), INVALID_PARAM("400", "参数异常"),
ENTITY_NOT_FOUND("404", "实体不存在"), ENTITY_NOT_FOUND("404", "实体不存在"),
BIZ_ERROR("500", "业务异常"),
// 900 ~ 998 二方SDK相关错误码 // 900 ~ 998 二方SDK相关错误码
RPC_ERROR("900", "rpc error"), RPC_ERROR("900", "rpc error"),

View File

@ -349,11 +349,6 @@ public class ListNodeUserReq extends PageReqV2 {
*/ */
private Boolean jobGroup; // TODO : 待实现 private Boolean jobGroup; // TODO : 待实现
/**
* 是否返回下级组织人员所在节点的下级节点的
*/
private Boolean childNodeUser; // TODO: 待实现
/** /**
* 是否查询下属同单位directManagerPersonId等于自己的 * 是否查询下属同单位directManagerPersonId等于自己的
*/ */

View File

@ -1,6 +1,6 @@
package cn.axzo.orgmanax.dto.project.team.req; package cn.axzo.orgmanax.dto.project.team.req;
import cn.axzo.orgmanax.dto.workerprofession.model.IBaseTree; import cn.axzo.orgmanax.dto.common.IBaseTree;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -15,7 +15,7 @@ import lombok.experimental.SuperBuilder;
@SuperBuilder @SuperBuilder
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class TeamCategoryResp { public class TeamCategoryGroupResp {
/** /**
* 班组id * 班组id

View File

@ -0,0 +1,76 @@
package cn.axzo.orgmanax.dto.workerprofession.dto;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 项目内工人工种表实体类
*
* @author chenliang@axzo.cn
* @since 2022-07-18 18:18:18
*/
@Data
@Accessors(chain = true)
public class ProjectWorkerProfessionDTO {
private Long id;
/**
* 项目内工人id
*/
private Long projectWorkerId;
// /**
// * 项目内班组id
// */
// private Long projectTeamId;
// /**
// * 邀请id
// */
// private Long inviteId;
/**
* 工作台ID
*/
private Long workspaceId;
/**
* 工种id
*/
private Long professionId;
/**
* 工种名称
*/
private String professionName;
/**
* 1有效 0无效
*/
private Integer valid;
/**
* 是否删除 0:未删除 其他:已删除
*/
private Long isDelete;
/**
* 创建时间
*/
private Date createAt;
private Date updateAt;
private Integer type;
private Integer createFlag;
private Integer updateFlag;
}

View File

@ -1,42 +0,0 @@
package cn.axzo.orgmanax.dto.workerprofession.model;
import java.util.List;
/**
* @author cn
* @version 1.0
* @description
* @date 2022/4/6 13:56
*/
public interface IBaseTree<T extends IBaseTree<T, O>, O> {
/**
* 节点编码
*
* @return 节点编码
*/
O getNodeCode();
/**
* 父节点编码
*
* @return 父节点编码
*/
O getParentNodeCode();
/**
* 子节点
*
* @return 子节点
*/
List<T> getNodeChildren();
/**
* 设置子节点
*
* @param nodeChildren
*/
void setNodeChildren(List<T> nodeChildren);
}

View File

@ -1,6 +1,6 @@
package cn.axzo.orgmanax.dto.workerprofession.model; package cn.axzo.orgmanax.dto.workerprofession.model;
import cn.axzo.trade.datasecurity.core.util.ObjectUtil; import cn.axzo.orgmanax.dto.common.IBaseTree;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;

View File

@ -2,11 +2,17 @@ package cn.axzo.orgmanax.dto.workerprofession.req;
import cn.axzo.foundation.page.PageReqV2; import cn.axzo.foundation.page.PageReqV2;
import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum; import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum;
import cn.hutool.core.util.ObjectUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@ -17,11 +23,21 @@ import java.util.Set;
@AllArgsConstructor @AllArgsConstructor
@Data @Data
@SuperBuilder @SuperBuilder
@Slf4j
public class WorkerProfessionTagQueryPageReq extends PageReqV2 { public class WorkerProfessionTagQueryPageReq extends PageReqV2 {
private Long orgNodeId; /**
* 平台班组|项目内班组|项目内小组组织节点id, 传递该值后对于小组会转换对应父节点的班组部门id
*/
private Long orgNodeId4ResolvedTeamOrgNodeId;
private Set<Long> personIds; private Set<Long> personIds;
private TeamSceneEnum scene; private TeamSceneEnum scene;
private Set<Long> professionIds; private Set<Long> professionIds;
private Boolean needSkillTags; private Boolean needSkillTags;
private Set<Long> orgNodeIds; private Set<Long> orgNodeIds;
public void check() {
if (ObjectUtil.isAllEmpty(orgNodeId4ResolvedTeamOrgNodeId, personIds, orgNodeIds)) {
throw new IllegalArgumentException("通用查询接口orgNodeId和personIds不能都为空");
}
}
} }

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import java.util.Arrays;
@Getter @Getter
@AllArgsConstructor @AllArgsConstructor
public enum DataCollectionSkillTypeEnum { public enum DataCollectionSkillTypeEnum {
@ -18,4 +20,10 @@ public enum DataCollectionSkillTypeEnum {
@EnumValue @EnumValue
private final Integer value; private final Integer value;
private final String desc; private final String desc;
public static DataCollectionSkillTypeEnum getType(Integer value) {
return Arrays.stream(values()).filter(it -> it.getValue().equals(value))
.findFirst()
.orElse(null);
}
} }

View File

@ -62,7 +62,6 @@ public interface WorkerProfessionHistoryRepository {
@Data @Data
class WorkerProfessionHistoryResp extends WorkerProfessionHistory { class WorkerProfessionHistoryResp extends WorkerProfessionHistory {
private String xx;
public static final String DATA_FLAG_PROFESSION = "WORKER_PROFESSION"; public static final String DATA_FLAG_PROFESSION = "WORKER_PROFESSION";
public static final String DATA_FLAG_SKILL = "WORKER_PROFESSION_SKILL"; public static final String DATA_FLAG_SKILL = "WORKER_PROFESSION_SKILL";

View File

@ -5,7 +5,6 @@ import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageReqV2; import cn.axzo.foundation.page.PageReqV2;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag; import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@ -13,6 +12,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author zhanghongbo * @author zhanghongbo
@ -49,6 +49,15 @@ public interface WorkerProfessionSkillTagRepository {
*/ */
@CriteriaField @CriteriaField
private String scene; private String scene;
@CriteriaField(field = "orgNodeId", operator = Operator.IN)
private Set<Long> orgNodeIds;
@CriteriaField(field = "personId", operator = Operator.IN)
private Set<Long> personIds;
@CriteriaField(field = "professionId", operator = Operator.IN)
private Set<Long> professionIds;
} }

View File

@ -9,6 +9,7 @@ import lombok.*;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author zhanghongbo * @author zhanghongbo
@ -55,7 +56,19 @@ public interface WorkerProfessionTagRepository {
* 组织节点ids * 组织节点ids
*/ */
@CriteriaField(field = "orgNodeId", operator = Operator.IN) @CriteriaField(field = "orgNodeId", operator = Operator.IN)
private List<Long> orgNodeIds; private Set<Long> orgNodeIds;
/**
* 工种id
*/
@CriteriaField(field = "professionId", operator = Operator.IN)
private Set<Long> professionIds;
/**
* personId列表
*/
@CriteriaField(field = "personId", operator = Operator.IN)
private Set<Long> personIds;
/** /**
* 0-无效 1-有效 * 0-无效 1-有效

View File

@ -1,11 +1,12 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.repository.impl; package cn.axzo.orgmanax.infra.dao.workerprofession.repository.impl;
import cn.axzo.foundation.dao.support.converter.PageConverter; import cn.axzo.foundation.dao.support.converter.PageConverter;
import cn.axzo.foundation.dao.support.mysql.MybatisPlusOperatorProcessor;
import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper; import cn.axzo.foundation.dao.support.mysql.QueryWrapperHelper;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageResp; import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.infra.dao.workerprofession.dao.WorkerProfessionHistoryDao; import cn.axzo.orgmanax.infra.dao.workerprofession.dao.WorkerProfessionHistoryDao;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionHistory; import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionHistory;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionHistoryRepository; import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionHistoryRepository;
import cn.axzo.orgmanax.infra.util.CommonUtil; import cn.axzo.orgmanax.infra.util.CommonUtil;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
@ -18,6 +19,11 @@ import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
/** /**
* @author zhanghongbo * @author zhanghongbo
* @date 2025/1/6 * @date 2025/1/6
@ -31,6 +37,15 @@ public class WorkerProfessionHistoryRepositoryImpl implements WorkerProfessionHi
@Override @Override
public PageResp<WorkerProfessionHistoryResp> page(PageReq req) { public PageResp<WorkerProfessionHistoryResp> page(PageReq req) {
//将某些查询转换为bizData
if (ObjectUtil.isNotEmpty(req.getProjectWorkerIds())) {
List<MybatisPlusOperatorProcessor.JSONQuery> jsonQueries = Arrays.asList(
MybatisPlusOperatorProcessor.JSONQuery.builder().jsonPath("$.projectWorkerId").data(req.getProjectWorkerIds()).operator(Operator.IN).build());
List<MybatisPlusOperatorProcessor.JSONQuery> bizData = Optional.ofNullable(req.getBizData()).orElse(new ArrayList<>());
bizData.addAll(jsonQueries);
req.setBizData(bizData);
}
IPage<WorkerProfessionHistory> page = PageConverter.toMybatis(req, WorkerProfessionHistory.class); IPage<WorkerProfessionHistory> page = PageConverter.toMybatis(req, WorkerProfessionHistory.class);
QueryWrapper<WorkerProfessionHistory> wrapper = QueryWrapperHelper.fromBean(req, WorkerProfessionHistory.class); QueryWrapper<WorkerProfessionHistory> wrapper = QueryWrapperHelper.fromBean(req, WorkerProfessionHistory.class);
@ -38,10 +53,6 @@ public class WorkerProfessionHistoryRepositoryImpl implements WorkerProfessionHi
if (!BooleanUtil.isTrue(req.getIncludeDeleted())) { if (!BooleanUtil.isTrue(req.getIncludeDeleted())) {
wrapper.eq("is_delete", 0); wrapper.eq("is_delete", 0);
} }
//处理项目工人id
if (ObjectUtil.isNotEmpty(req.getProjectWorkerIds())) {
}
IPage<WorkerProfessionHistoryResp> results = workerProfessionHistoryDao.page(page, wrapper) IPage<WorkerProfessionHistoryResp> results = workerProfessionHistoryDao.page(page, wrapper)
.convert(e -> BeanUtil.toBean(e, WorkerProfessionHistoryResp.class)); .convert(e -> BeanUtil.toBean(e, WorkerProfessionHistoryResp.class));

View File

@ -0,0 +1,15 @@
package cn.axzo.orgmanax.server.cooperateship.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum CooperateShipStatusEnum {
ACTIVE(1,"履约中"),
LEAVE(0, "已退场"),
;
private final Integer status;
private final String desc;
}

View File

@ -14,7 +14,7 @@ import cn.axzo.orgmanax.dto.project.team.req.SaveProjectTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq; import cn.axzo.orgmanax.dto.project.team.req.SingletonOrgTeamCategoryReq;
import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp; import cn.axzo.orgmanax.dto.project.team.resp.RemoveTeamCategoryCheckResp;
import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp; import cn.axzo.orgmanax.dto.project.team.resp.SingletonOrgTeamCategoryResp;
import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryResp; import cn.axzo.orgmanax.dto.project.team.resp.TeamCategoryGroupResp;
import cn.axzo.orgmanax.server.project.team.service.ProjectTeamCategoryService; import cn.axzo.orgmanax.server.project.team.service.ProjectTeamCategoryService;
import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq; import cn.axzo.orgmanax.server.project.team.service.dto.ListTeamCategoryReq;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
@ -35,7 +35,7 @@ public class OrgProjectTeamCategoryController implements OrgProjectTeamCategoryA
private final ProjectTeamCategoryService projectTeamCategoryService; private final ProjectTeamCategoryService projectTeamCategoryService;
@Override @Override
public ApiResult<List<TeamCategoryResp>> groupList(GroupTeamCategoryReq req) { public ApiResult<List<TeamCategoryGroupResp>> groupList(GroupTeamCategoryReq req) {
return null; return null;
} }

View File

@ -0,0 +1,136 @@
package cn.axzo.orgmanax.server.util;
import cn.axzo.foundation.exception.BusinessException;
import cn.axzo.orgmanax.common.config.BizResultCode;
import cn.hutool.core.util.ArrayUtil;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MessageFormatter;
import org.springframework.util.CollectionUtils;
import java.util.Collection;
/**
* 断言工具类
*
* @author jiachao
* @date 2021/8/9
*/
public final class AssertUtil {
private AssertUtil() {
}
public static void fail(String message) {
throw new BusinessException(BizResultCode.BIZ_ERROR.getErrorCode(), message);
}
public static void fail(String message, Object... params) {
FormattingTuple formattingTuple = MessageFormatter.arrayFormat(message, params);
fail(formattingTuple.getMessage());
}
/**
* 断言条件为真如果不是它会抛出一个带有给定消息的异常
*
* @param msg 错误码
* @param condition 被检查的条件
* @
*/
public static void isTrue(boolean condition, String msg) {
if (!condition) {
fail(msg);
}
}
/**
* 断言条件为假如果不是它会抛出一个带有给定消息的异常 \
*
* @param msg 错误信息
* @param condition 被检查的条件
*/
public static void isFalse(boolean condition, String msg) {
if (condition) {
fail(msg);
}
}
/**
* 断言检查这个对象不是 Null 如果是null用给定的错误信息
*
* @param msg 错误信息
* @param object 检查对象
* @
*/
public static void notNull(Object object, String msg) {
if (object == null) {
fail(msg);
}
}
/**
* 断言检查这个对象是 Null 如果不是null用给定的错误信息抛出异常
*
* @param msg 错误信息
* @param object 检查对象
* @
*/
public static void isNull(Object object, String msg) {
if (object != null) {
fail(msg);
}
}
/**
* 断言集合不为空如果为null或者empty用指定错误信息抛出异常
*
* @param msg 错误信息
* @param collection 集合
* @
*/
public static void notEmpty(Collection<?> collection, String msg) {
if (collection == null || collection.isEmpty()) {
fail(msg);
}
}
/**
* 断言集合为空如果否用指定错误信息抛出异常
*
* @param msg 错误信息
* @param collection 集合
* @
*/
public static void isEmpty(Collection<?> collection, String msg) {
if (!CollectionUtils.isEmpty(collection)) {
fail(msg);
}
}
public static <T> void notEmpty(T[] array, String msg) {
if (ArrayUtil.hasNull(array)) {
fail(msg);
}
}
/**
* 断言字符串不为空如果为null或者empty用指定错误信息抛出异常
*
* @param msg 错误信息
* @param value 字符串
* @
*/
public static void notEmpty(String value, String msg) {
if (value == null || value.isEmpty()) {
fail(msg);
}
}
}

View File

@ -39,7 +39,7 @@ public class OrgProjectWorkerProfessionController implements OrgProjectWorkerPro
@Override @Override
public ApiResult<Map<Long, List<String>>> sortOutProfessionCategory(@Valid ProjectWorkerProfessionSortOutProfessionCategoryReq req) { public ApiResult<Map<Long, List<String>>> sortOutProfessionCategory(@Valid ProjectWorkerProfessionSortOutProfessionCategoryReq req) {
return null; return ApiResult.success(orgProjectWorkerProfessionService.sortOutProfessionCategory(req));
} }
@Override @Override
@ -64,7 +64,7 @@ public class OrgProjectWorkerProfessionController implements OrgProjectWorkerPro
@Override @Override
public ApiResult<PageResp<ProjectWorkerProfessionResp>> page(WorkerProfessionTagQueryPageReq req) { public ApiResult<PageResp<ProjectWorkerProfessionResp>> page(WorkerProfessionTagQueryPageReq req) {
return null; return ApiResult.success(orgProjectWorkerProfessionService.page(req));
} }
@Override @Override

View File

@ -1,7 +1,11 @@
package cn.axzo.orgmanax.server.workerprofession.service; package cn.axzo.orgmanax.server.workerprofession.service;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO; import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq; import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionSortOutProfessionCategoryReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagQueryPageReq;
import cn.axzo.orgmanax.dto.workerprofession.resp.ProjectWorkerProfessionResp;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -11,6 +15,11 @@ import java.util.Map;
* @date 2025/1/3 * @date 2025/1/3
*/ */
public interface OrgProjectWorkerProfessionService { public interface OrgProjectWorkerProfessionService {
/**
* 获取有效的工种信息
* @param req
* @return
*/
Map<Long, List<ProfessionDTO>> listValid(ProjectWorkerProfessionListValidReq req); Map<Long, List<ProfessionDTO>> listValid(ProjectWorkerProfessionListValidReq req);
/** /**
@ -19,4 +28,18 @@ public interface OrgProjectWorkerProfessionService {
* @return * @return
*/ */
List<ProfessionDTO> listValidWorkerProfession(List<Long> projectWorkerIds); List<ProfessionDTO> listValidWorkerProfession(List<Long> projectWorkerIds);
/**
* 计算项目内工人工种类型
* @param req
* @return
*/
Map<Long, List<String>> sortOutProfessionCategory(ProjectWorkerProfessionSortOutProfessionCategoryReq req);
/**
* 分页查询工种信息
* @param req
* @return
*/
PageResp<ProjectWorkerProfessionResp> page(WorkerProfessionTagQueryPageReq req);
} }

View File

@ -1,9 +1,19 @@
package cn.axzo.orgmanax.server.workerprofession.service.impl; package cn.axzo.orgmanax.server.workerprofession.service.impl;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProjectWorkerProfessionDTO;
import com.google.common.collect.Maps;
import cn.axzo.foundation.dao.support.mysql.MybatisPlusOperatorProcessor; import cn.axzo.foundation.dao.support.mysql.MybatisPlusOperatorProcessor;
import cn.axzo.foundation.dao.support.wrapper.Operator; import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.api.projectworker.enums.ProjectWorkerStatusEnum; import cn.axzo.orgmanax.api.projectworker.enums.ProjectWorkerStatusEnum;
import cn.axzo.orgmanax.dto.common.IdentityType; import cn.axzo.orgmanax.dto.common.IdentityType;
import cn.axzo.orgmanax.dto.common.util.NumberUtil;
import cn.axzo.orgmanax.dto.common.util.TreeUtil;
import cn.axzo.orgmanax.dto.cooperateship.dto.OrgCooperateShipDTO;
import cn.axzo.orgmanax.dto.cooperateship.req.ListOrgCooperateShipReq;
import cn.axzo.orgmanax.dto.node.dto.OrgNodeDTO;
import cn.axzo.orgmanax.dto.node.enums.NodeTypeEnum;
import cn.axzo.orgmanax.dto.node.req.ListNodeReq;
import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO; import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO;
import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserProfile; import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserProfile;
import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq;
@ -11,26 +21,42 @@ import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum; import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO; import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO;
import cn.axzo.orgmanax.dto.workerprofession.dto.SkillTagDTO; import cn.axzo.orgmanax.dto.workerprofession.dto.SkillTagDTO;
import cn.axzo.orgmanax.dto.workerprofession.model.ProfessionSkillTagTreeNode;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq; import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionSortOutProfessionCategoryReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagQueryPageReq;
import cn.axzo.orgmanax.dto.workerprofession.resp.ProjectWorkerProfessionResp;
import cn.axzo.orgmanax.infra.client.datacollection.DataCollectionDictInfoClient; import cn.axzo.orgmanax.infra.client.datacollection.DataCollectionDictInfoClient;
import cn.axzo.orgmanax.infra.client.datacollection.dto.DataCollectionListProfessionCategoriesResp; import cn.axzo.orgmanax.infra.client.datacollection.dto.DataCollectionListProfessionCategoriesResp;
import cn.axzo.orgmanax.infra.client.datacollection.dto.DataCollectionSkillTypeEnum;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag; import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.enums.SkillTypeEnum;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionHistoryRepository; import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionHistoryRepository;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionSkillTagRepository; import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionSkillTagRepository;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionTagRepository; import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionTagRepository;
import cn.axzo.orgmanax.infra.util.CommonUtil;
import cn.axzo.orgmanax.server.cooperateship.enums.CooperateShipStatusEnum;
import cn.axzo.orgmanax.server.cooperateship.service.CooperateShipService;
import cn.axzo.orgmanax.server.node.service.NodeService; import cn.axzo.orgmanax.server.node.service.NodeService;
import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService; import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService;
import cn.axzo.orgmanax.server.util.AssertUtil;
import cn.axzo.orgmanax.server.util.StreamUtil; import cn.axzo.orgmanax.server.util.StreamUtil;
import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionService; import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionService;
import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionSkillService; import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionSkillService;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
@ -58,6 +84,13 @@ public class OrgProjectWorkerProfessionServiceImpl implements OrgProjectWorkerPr
private DataCollectionDictInfoClient dataCollectionDictInfoClient; private DataCollectionDictInfoClient dataCollectionDictInfoClient;
private OrgProjectWorkerProfessionSkillService orgProjectWorkerProfessionSkillService; private OrgProjectWorkerProfessionSkillService orgProjectWorkerProfessionSkillService;
private WorkerProfessionHistoryRepository workerProfessionHistoryRepository; private WorkerProfessionHistoryRepository workerProfessionHistoryRepository;
private CooperateShipService cooperateShipService;
private static final ImmutableSet<Integer> TEAM_ORG_NODE_TYPES = ImmutableSet.of(
NodeTypeEnum.TEAM.getValue(),
NodeTypeEnum.PROJECT_TEAM.getValue(),
NodeTypeEnum.PROJECT_GROUP.getValue()
);
private static final BinaryOperator<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> SKILL_TAG_MERGE_FUNC = (v1, v2) -> { private static final BinaryOperator<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> SKILL_TAG_MERGE_FUNC = (v1, v2) -> {
if (v1.getIsDelete() < v2.getIsDelete()) { if (v1.getIsDelete() < v2.getIsDelete()) {
@ -66,6 +99,20 @@ public class OrgProjectWorkerProfessionServiceImpl implements OrgProjectWorkerPr
return v2.getCreateAt().getTime() > v1.getCreateAt().getTime() ? v2 : v1; return v2.getCreateAt().getTime() > v1.getCreateAt().getTime() ? v2 : v1;
}; };
public static final BinaryOperator<ProjectWorkerProfessionDTO> LABOUR_PROFESSION_TAG_MERGE_FUNC = (v1, v2) -> {
// 优先返回有效的
if (!Objects.equals(v2.getValid(), v1.getValid())) {
return Objects.equals(v1.getValid(), ValidationEnum.EFFECTIVE.getCode()) ? v1 : v2;
}
// 否则返回最晚创建的
return v2.getCreateAt().getTime() > v1.getCreateAt().getTime() ? v2 : v1;
};
/**
* 获取有效的工种信息
* @param req
* @return
*/
@Override @Override
public Map<Long, List<ProfessionDTO>> listValid(ProjectWorkerProfessionListValidReq req) { public Map<Long, List<ProfessionDTO>> listValid(ProjectWorkerProfessionListValidReq req) {
List<Long> nodeIds = req.getNodeIds(); List<Long> nodeIds = req.getNodeIds();
@ -160,6 +207,240 @@ public class OrgProjectWorkerProfessionServiceImpl implements OrgProjectWorkerPr
return professionDTOS; return professionDTOS;
} }
@Override
public Map<Long, List<String>> sortOutProfessionCategory(ProjectWorkerProfessionSortOutProfessionCategoryReq req) {
List<Long> projectWorkerIdList = req.getProjectWorkerIdList();
//查询工人
List<NodeUserDTO> nodeUserDTOS = nodeUserService.list(ListNodeUserReq.builder()
.projectWorkerIds(projectWorkerIdList)
.identityType(IdentityType.WORKER.getCode())
.build());
if (ObjectUtil.isEmpty(nodeUserDTOS)) {
return Collections.emptyMap();
}
Map<Long, List<NodeUserDTO>> projectWorkerStatusMap = nodeUserDTOS.stream()
.collect(groupingBy(nodeUserDTO -> ((NodeUserProfile.ProjectWorkerProfile) nodeUserDTO.resolveProfile()).getProjectWorkerId()));
Map<Long, List<String>> result = new HashMap<>();
//获取工种信息, 并判断工种类型
if (projectWorkerStatusMap.containsKey(ProjectWorkerStatusEnum.ACTIVE.getValue())) {
List<NodeUserDTO> activeWorker = projectWorkerStatusMap.get(ProjectWorkerStatusEnum.ACTIVE.getValue());
List<Long> projectWorkerIdList4Active = activeWorker.stream()
.map(nodeUserDTO -> ((NodeUserProfile.ProjectWorkerProfile) nodeUserDTO.resolveProfile()).getProjectWorkerId())
.collect(toList());
List<WorkerProfessionTagRepository.WorkerProfessionTagResp> professionTagResps4Action = workerProfessionTagRepository.list(WorkerProfessionTagRepository.PageReq.builder()
.projectWorkerIds(projectWorkerIdList4Active)
.scene(TeamSceneEnum.PROJECT_TEAM.name())
.build());
//封装结果信息
if (ObjectUtil.isNotEmpty(professionTagResps4Action)) {
Map<Long, List<String>> result4Active = professionTagResps4Action.stream().collect(groupingBy(WorkerProfessionTagRepository.WorkerProfessionTagResp::getProjectWorkerId,
mapping(workerProfessionTagResp -> DataCollectionSkillTypeEnum.getType(workerProfessionTagResp.getType()).getDesc(), toList())));
result.putAll(result4Active);
}
}
if (projectWorkerStatusMap.containsKey(ProjectWorkerStatusEnum.LEAVE.getValue())) {
List<NodeUserDTO> leaveWorker = projectWorkerStatusMap.get(ProjectWorkerStatusEnum.LEAVE.getValue());
List<Long> projectWorkerIdList4Leave = leaveWorker.stream()
.map(nodeUserDTO -> ((NodeUserProfile.ProjectWorkerProfile) nodeUserDTO.resolveProfile()).getProjectWorkerId())
.collect(toList());
List<WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp> professionTagResps4Leave = workerProfessionHistoryRepository.list(WorkerProfessionHistoryRepository.PageReq.builder()
.projectWorkerIds(projectWorkerIdList4Leave)
.scene(TeamSceneEnum.PROJECT_TEAM.name())
.build());
List<ProjectWorkerProfessionDTO> projectWorkerProfessionDTOS = doHistoryWorkerProfession(professionTagResps4Leave, ValidationEnum.EFFECTIVE);
//封装结果信息
if (ObjectUtil.isNotEmpty(projectWorkerProfessionDTOS)) {
Map<Long, List<String>> result4Leave = projectWorkerProfessionDTOS.stream().collect(groupingBy(ProjectWorkerProfessionDTO::getProjectWorkerId,
mapping(projectWorkerProfessionDTO -> DataCollectionSkillTypeEnum.getType(projectWorkerProfessionDTO.getType()).getDesc(), toList())));
for (Map.Entry<Long, List<String>> entry : result4Leave.entrySet()) {
List<String> typeList = result.get(entry.getKey());
if (ObjectUtil.isEmpty(typeList)) {
typeList = new ArrayList<>();
result.put(entry.getKey(), typeList);
}
typeList.addAll(entry.getValue());
}
}
}
return result;
}
private List<ProjectWorkerProfessionDTO> doHistoryWorkerProfession(List<WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp> historys, ValidationEnum valid) {
ArrayList<ProjectWorkerProfessionDTO> wps = Lists.newArrayList();
historys.forEach(item -> {
List<WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp.HistoryData> historyData = JSON.parseArray(item.getJsonContent(), WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp.HistoryData.class);
Long projectWorkerId;
if (Objects.nonNull(item.getBizData()) && item.getBizData().containsKey("projectWorkerId")) {
projectWorkerId = item.getBizData().getLong("projectWorkerId");
} else {
projectWorkerId = 0L;
}
for (WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp.HistoryData historyDatum : historyData) {
if (historyDatum.getDataFlag().equals(WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp.DATA_FLAG_PROFESSION)) {
List<WorkerProfessionTag> professionTags = historyDatum.resolveWorkerProfessionTags(valid);
// 需要使用有效工种
Stream<ProjectWorkerProfessionDTO> stream = professionTags.stream().map(p -> {
ProjectWorkerProfessionDTO profession = new ProjectWorkerProfessionDTO();
profession.setId(p.getId());
profession.setProfessionName(p.getProfessionName());
profession.setProfessionId(p.getProfessionId());
profession.setValid(p.getValid());
profession.setWorkspaceId(p.getWorkspaceId());
profession.setType(p.getType());
profession.setProjectWorkerId(projectWorkerId);
profession.setCreateAt(p.getCreateAt());
profession.setUpdateAt(p.getUpdateAt());
profession.setIsDelete(p.getIsDelete());
return profession;
});
List<ProjectWorkerProfessionDTO> collect = StreamUtil.distinct(stream,
p -> String.format("%s_%s", p.getProjectWorkerId(), p.getProfessionId()), LABOUR_PROFESSION_TAG_MERGE_FUNC)
.collect(Collectors.toList());
wps.addAll(collect);
}
}
});
return wps;
}
@Override
public PageResp<ProjectWorkerProfessionResp> page(WorkerProfessionTagQueryPageReq req) {
req.check();
Long teamOrgNodeId = null;
if (req.getOrgNodeId4ResolvedTeamOrgNodeId() != null) {
//全部转换为班组组织节点id
teamOrgNodeId = checkAndTransform(req.getOrgNodeId4ResolvedTeamOrgNodeId());
}
//获取工种信息
WorkerProfessionTagRepository.PageReq pageReq = WorkerProfessionTagRepository.PageReq.builder()
.orgNodeId(teamOrgNodeId)
.orgNodeIds(req.getOrgNodeIds())
.scene(req.getScene().name())
.professionIds(req.getProfessionIds())
.personIds(req.getPersonIds())
.build();
PageResp<WorkerProfessionTagRepository.WorkerProfessionTagResp> page = workerProfessionTagRepository.page(pageReq);
if (page == null || ObjectUtil.isEmpty(page)) {
return CommonUtil.getEmptyPage(req, ProjectWorkerProfessionResp.class);
}
List<ProjectWorkerProfessionResp> data = page.getData().stream().map(this::convertTagToResp).collect(toList());
if (BooleanUtils.isTrue(req.getNeedSkillTags())) {
assembleSkillTags(data);
}
return PageResp.<ProjectWorkerProfessionResp>builder()
.size(page.getSize())
.current(page.getCurrent())
.total(page.getTotal())
.data(data)
.build();
}
private void assembleSkillTags(List<ProjectWorkerProfessionResp> workProcessionTags) {
if (ObjectUtils.isEmpty(workProcessionTags)) {
return;
}
Set<Long> nodeIds = workProcessionTags.stream().map(ProjectWorkerProfessionResp::getOrgNodeId).collect(Collectors.toSet());
Set<Long> personIds = workProcessionTags.stream().map(ProjectWorkerProfessionResp::getPersonId).collect(Collectors.toSet());
Set<Long> professionIds = workProcessionTags.stream().map(ProjectWorkerProfessionResp::getProfessionId).collect(Collectors.toSet());
WorkerProfessionSkillTagRepository.PageReq pageReq = WorkerProfessionSkillTagRepository.PageReq.builder()
.orgNodeIds(nodeIds)
.professionIds(professionIds)
.personIds(personIds)
.build();
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> skillTagResps = orgProjectWorkerProfessionSkillService.list(pageReq);
Map<String, List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp>> personProfessionSkills = skillTagResps.stream()
.collect(groupingBy(t -> buildSkillTagGroupKey(t.getPersonId(), t.getOrgNodeId(), t.getProfessionId())));
workProcessionTags.forEach(profession -> {
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> skillTagList = personProfessionSkills.get(buildSkillTagGroupKey(profession.getPersonId(), profession.getOrgNodeId(), profession.getProfessionId()));
if (CollectionUtils.isEmpty(skillTagList)) {
return;
}
List<ProfessionSkillTagTreeNode> skillTreeNodes = skillTagList.stream()
.map(e -> ProfessionSkillTagTreeNode.builder()
.skillTagCode(e.getSkillTagCode())
.skillTagName(e.getSkillTagName())
.parentSkillTagCode(e.getParentSkillTagCode())
.build())
.collect(Collectors.toList());
skillTreeNodes = TreeUtil.buildTree(skillTreeNodes);
profession.setSkillTags(skillTreeNodes);
});
}
private String buildSkillTagGroupKey(Long personId, Long orgNodeId, Long professionId) {
return String.format("%d_%d_%d", personId, orgNodeId, professionId);
}
private ProjectWorkerProfessionResp convertTagToResp(WorkerProfessionTag workerProfessionTag) {
ProjectWorkerProfessionResp workerProfessionTagResp = BeanUtil.copyProperties(workerProfessionTag, ProjectWorkerProfessionResp.class);
workerProfessionTagResp.setType(Optional.ofNullable(workerProfessionTag.getType()).orElse(SkillTypeEnum.COMMON.getValue()));
return workerProfessionTagResp;
}
/**
* 全部转换为班组组织节点id
* @param orgNodeId
* @return
*/
private Long checkAndTransform(Long orgNodeId) {
// 校验部门id的合法性
AssertUtil.isTrue(NumberUtil.isPositiveNumber(orgNodeId), String.format("非法的orgNodeId:[%d]", orgNodeId));
List<OrgNodeDTO> orgNodeDTOS = nodeService.list(ListNodeReq.builder().ids(Sets.newHashSet(orgNodeId)).build());
// 校验部门id的有效性
AssertUtil.notEmpty(orgNodeDTOS, String.format("无效的orgNodeId:[%d]", orgNodeId));
OrgNodeDTO orgNode = orgNodeDTOS.get(0);
// 校验部门类型的合理性
AssertUtil.isTrue(TEAM_ORG_NODE_TYPES.contains(orgNode.getNodeType()), String.format("无效的orgNodeType:[%d]", orgNode.getNodeType()));
//如果是班组 直接返回
if (!Objects.equals(NodeTypeEnum.PROJECT_GROUP.getValue(), orgNode.getNodeType())) {
return orgNodeId;
}
//否则是小组获取小组对应父节点的班组部门id
Long teamOrgNodeId4Group = getTeamOrgNodeId4Group(orgNode.getTopNodeId());
AssertUtil.notNull(teamOrgNodeId4Group, String.format("未找到项目内小组对应的班组的协同关系信息.orgTopNodeId:[%d]", orgNode.getTopNodeId()));
return teamOrgNodeId4Group;
}
private Long getTeamOrgNodeId4Group(Long grouptTopNodeId) {
if (NumberUtil.isNotPositiveNumber(grouptTopNodeId)) {
log.info("the orgTopNodeId is not positive.");
return null;
}
// 查询指定顶级部门id对应的协同关系
ListOrgCooperateShipReq listOrgCooperateShipReq = ListOrgCooperateShipReq.builder()
.organizationNodeIds(Sets.newHashSet(grouptTopNodeId))
.statuses(Sets.newHashSet(CooperateShipStatusEnum.ACTIVE.getStatus()))
.build();
List<OrgCooperateShipDTO> orgCooperateShipDTOS = cooperateShipService.list(listOrgCooperateShipReq);
if (ObjectUtil.isEmpty(orgCooperateShipDTOS)) {
return null;
}
OrgCooperateShipDTO orgCooperateShipDTO = orgCooperateShipDTOS.get(0);
// 查询协同关系的上级
ListOrgCooperateShipReq listOrgCooperateShipReq4Parent = ListOrgCooperateShipReq.builder()
.organizationNodeIds(Sets.newHashSet(orgCooperateShipDTO.getParentId()))
.statuses(Sets.newHashSet(CooperateShipStatusEnum.ACTIVE.getStatus()))
.build();
List<OrgCooperateShipDTO> orgCooperateShipDTOS4Parent = cooperateShipService.list(listOrgCooperateShipReq4Parent);
if (ObjectUtil.isEmpty(orgCooperateShipDTOS4Parent)) {
return null;
}
return orgCooperateShipDTOS4Parent.get(0).getOrganizationalNodeId();
}
/** /**
* 获取技能标签包括历史技能标签(带子技能标签) * 获取技能标签包括历史技能标签(带子技能标签)
* @param projectWorkerIds * @param projectWorkerIds
@ -175,10 +456,8 @@ public class OrgProjectWorkerProfessionServiceImpl implements OrgProjectWorkerPr
//获取历史技能标签 //获取历史技能标签
WorkerProfessionHistoryRepository.PageReq pageReq4HistoryProfession = WorkerProfessionHistoryRepository.PageReq.builder() WorkerProfessionHistoryRepository.PageReq pageReq4HistoryProfession = WorkerProfessionHistoryRepository.PageReq.builder()
.scene(TeamSceneEnum.PROJECT_TEAM.name()) .scene(TeamSceneEnum.PROJECT_TEAM.name())
.projectWorkerIds(projectWorkerIds)
.build(); .build();
List<MybatisPlusOperatorProcessor.JSONQuery> bizData = Arrays.asList(
MybatisPlusOperatorProcessor.JSONQuery.builder().jsonPath("$.projectWorkerId").data(projectWorkerIds).operator(Operator.IN).build());
pageReq4HistoryProfession.setBizData(bizData);
List<WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp> workerProfessionHistoryResps = workerProfessionHistoryRepository.list(pageReq4HistoryProfession); List<WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp> workerProfessionHistoryResps = workerProfessionHistoryRepository.list(pageReq4HistoryProfession);
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> workerProfessionSkillTagResps4History = doHistoryWorkerSkilltag(workerProfessionHistoryResps); List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> workerProfessionSkillTagResps4History = doHistoryWorkerSkilltag(workerProfessionHistoryResps);