feat(REQ-3488): 增加获取有效工人工种接口

This commit is contained in:
zhanghongbo 2025-01-06 15:14:23 +08:00
parent 6c5a407930
commit d49656e26d
31 changed files with 1381 additions and 22 deletions

View File

@ -0,0 +1,58 @@
package cn.axzo.orgmanax.api.projectworker.enums;
import lombok.Getter;
/**
* 项目工人状态1已进场2已离场
*
* @author jerry
* @date 2020/6/28
*/
@Getter
public enum ProjectWorkerStatusEnum {
/**
* 未激活
*/
INACTIVE(0, "未激活"),
/**
* 已激活
*/
ACTIVE(1, "已激活"),
/**
* 施工中
* 目前项目内工人表的在岗状态 occupy_status 来表示
*/
@Deprecated
WORKING(2, "施工中"),
/**
* 离场
*/
LEAVE(3, "离场"),
WITHDRAW(4, "退场"),
;
public final int value;
public final String desc;
ProjectWorkerStatusEnum(int value, String desc) {
this.value = value;
this.desc = desc;
}
public static String getDescByValue(Integer value) {
ProjectWorkerStatusEnum[] values = ProjectWorkerStatusEnum.values();
for (ProjectWorkerStatusEnum statusEnum : values) {
if (statusEnum.value == value) {
return statusEnum.desc;
}
}
return "";
}
public boolean is(int value) {
return this.value == value;
}
}

View File

@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(
value = "orgmanax",
url = "${axzo.service.orgmanax:http://orgmanax:8080}")
public interface TeamLogApi {
public interface OrgTeamLogApi {
/**
* 分页列表接口
* XXX本接口默认分页单页最多返回1000条数据调用方使用时需注意

View File

@ -3,25 +3,18 @@ package cn.axzo.orgmanax.api.workerprofession.feign;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.foundation.result.ApiResult;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO;
import cn.axzo.orgmanax.dto.workerprofession.req.PageTeamProfessionsReq;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionSortOutProfessionCategoryReq;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionUpdateReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagOperationConfigureReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagOperationRemoveReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagOperationUpsertReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagOperationValidUpdateReq;
import cn.axzo.orgmanax.dto.workerprofession.req.WorkerProfessionTagQueryPageReq;
import cn.axzo.orgmanax.dto.workerprofession.req.*;
import cn.axzo.orgmanax.dto.workerprofession.resp.OrgWorkerProfessionResp;
import cn.axzo.orgmanax.dto.workerprofession.resp.WorkerProfessionTagResp;
import java.util.List;
import java.util.Map;
import javax.validation.Valid;
import cn.axzo.orgmanax.dto.workerprofession.resp.ProjectWorkerProfessionResp;
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 javax.validation.Valid;
import java.util.List;
import java.util.Map;
/**
* @author zhanghongbo
* @date 2025/1/3
@ -97,7 +90,7 @@ public interface OrgProjectWorkerProfessionApi {
* @return
*/
@PostMapping(value = "/api/worker/profession/page")
ApiResult<PageResp<WorkerProfessionTagResp>> page(@RequestBody @Validated WorkerProfessionTagQueryPageReq req);
ApiResult<PageResp<ProjectWorkerProfessionResp>> page(@RequestBody @Validated WorkerProfessionTagQueryPageReq req);
/**
* 查询班组下工种

View File

@ -203,6 +203,7 @@ public class ListNodeUserReq extends PageReqV2 {
private String keyword;
/**
* 状态1未激活 2已激活 3施工中 4已退场
* @see cn.axzo.orgmanax.api.projectworker.enums.ProjectWorkerStatusEnum
*/
private Collection<Integer> projectWorkerStatuses;

View File

@ -20,6 +20,10 @@ import java.util.List;
@Builder
public class ProfessionDTO {
/**
* 项目工人id
*/
private Long projectWorkerId;
/**
* 工种名称
*/

View File

@ -12,10 +12,10 @@ import java.util.List;
**/
@Data
public class SkillTagDTO {
/**
* id
*/
private Long id;
// /**
// * id
// */
// private Long id;
/**
* 父级code
*/

View File

@ -14,7 +14,7 @@ import java.util.List;
@AllArgsConstructor
@Data
@Builder
public class WorkerProfessionTagResp implements Serializable {
public class ProjectWorkerProfessionResp implements Serializable {
protected Long id;
/**
* 自然人id

View File

@ -1,4 +1,21 @@
package cn.axzo.orgmanax.infra.client.datacollection.dto;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum DataCollectionSkillTypeEnum {
/**
* 技术类型:1普工2技工
*/
NONE(0, ""),
COMMON(1, "普工"),
ENGINE_MAN(2, "技工"),
;
@EnumValue
private final Integer value;
private final String desc;
}

View File

@ -0,0 +1,16 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.dao;
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.mapper.WorkerProfessionHistoryMapper;
import cn.axzo.orgmanax.infra.dao.workerprofession.mapper.WorkerProfessionSkillTagMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Service
public class WorkerProfessionHistoryDao extends ServiceImpl<WorkerProfessionHistoryMapper, WorkerProfessionHistory> {
}

View File

@ -0,0 +1,16 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.dao;
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.mapper.WorkerProfessionSkillTagMapper;
import cn.axzo.orgmanax.infra.dao.workerprofession.mapper.WorkerProfessionTagMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Service
public class WorkerProfessionSkillTagDao extends ServiceImpl<WorkerProfessionSkillTagMapper, WorkerProfessionSkillTag> {
}

View File

@ -0,0 +1,19 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.dao;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.mapper.WorkerProfessionTagMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 平台班组变更日志表 服务实现类
* </p>
*
* @author autoGenerator
* @since 2023-04-14
*/
@Service
public class WorkerProfessionTagDao extends ServiceImpl<WorkerProfessionTagMapper, WorkerProfessionTag> {
}

View File

@ -0,0 +1,83 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.entity;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.google.common.collect.ImmutableList;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @description
* 工人工种及技能标签历史记录数据存储模型
* @author luofu
* @version 1.0
* @date 2024/5/29
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "worker_profession_history", autoResultMap = true)
public class WorkerProfessionHistory {
/**
* id
*/
@TableId(type = IdType.AUTO)
protected Long id;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
protected Date createAt;
/**
* 修改时间
*/
@TableField(fill = FieldFill.UPDATE)
protected Date updateAt;
/**
* 是否删除 0正常1删除
*/
@TableField("is_delete")
protected Long isDelete = 0L;
/**
* 自然人id
*/
private Long personId;
/**
* 租户id
*/
private Long workspaceId;
/**
* 组织节点id
*/
private Long orgNodeId;
/**
* JSON格式的数据内容
*/
private String jsonContent;
/**
* 业务数据
*/
@TableField(value = "biz_data", typeHandler = FastjsonTypeHandler.class)
private JSONObject bizData;
@Override
public String toString() {
return JSON.toJSONString(this);
}
}

View File

@ -0,0 +1,104 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.entity;
import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Date;
/**
* @description
* 工人技能标签数据存储模型
* @author luofu
* @version 1.0
* @date 2024/5/29
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "worker_profession_skill_tag", autoResultMap = true)
public class WorkerProfessionSkillTag {
/**
* id
*/
@TableId(type = IdType.AUTO)
protected Long id;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
protected Date createAt;
/**
* 修改时间
*/
@TableField(fill = FieldFill.UPDATE)
protected Date updateAt;
/**
* 是否删除 0正常1删除
*/
@TableField("is_delete")
protected Long isDelete = 0L;
/**
* 工种id
*/
private Long professionId;
/**
* 自然人id
*/
private Long personId;
/**
* 租户id
*/
private Long workspaceId;
/**
* 组织节点id
*/
private Long orgNodeId;
/**
* 班组场景
*/
private TeamSceneEnum scene;
/**
* 技能标签code
*/
private String skillTagCode;
/**
* 技能标签名称
*/
private String skillTagName;
/**
* 父级技能标签code
*/
private String parentSkillTagCode;
/**
* 数据有效性标记
*/
private Integer valid;
/**
* 创建人的自然人id
*/
private Long createBy;
/**
* 业务数据
*/
@TableField(value = "biz_data", typeHandler = FastjsonTypeHandler.class)
private JSONObject bizData;
/**
* 项目工人id
*/
private Long projectWorkerId;
}

View File

@ -0,0 +1,97 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.entity;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @description
* 工人工种数据存储模型
* @author luofu
* @version 1.0
* @date 2024/5/29
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName(value = "worker_profession_tag", autoResultMap = true)
public class WorkerProfessionTag {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 自然人id
*/
private Long personId;
/**
* 租户id
*/
private Long workspaceId;
/**
* 组织节点id
*/
private Long orgNodeId;
/**
* 班组场景
*/
private String scene;
/**
* 工种类型: 1-普工 2-技工
*/
private Integer type;
/**
* 工种id
*/
private Long professionId;
/**
* 工种名称
*/
private String professionName;
/**
* 数据有效性标记
*/
private Integer valid;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createAt;
/**
* 修改时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateAt;
/**
* 是否删除 0正常1删除
*/
@TableField("is_delete")
private Long isDelete;
/**
* 创建人的自然人id
*/
private Long createBy;
/**
* 业务数据
*/
@TableField(value = "biz_data", typeHandler = FastjsonTypeHandler.class)
private JSONObject bizData;
/**
* 项目工人id
*/
private Long projectWorkerId;
}

View File

@ -0,0 +1,29 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 技术类型
* ->0
* 普工->1
* 技工->2
*
* @author yangzhi
* @Date 2022/5/6 15:06
**/
@Getter
@AllArgsConstructor
public enum SkillTypeEnum {
/**
* 技术类型:1普工2技工
*/
NONE(0, ""),
COMMON(1, "普工"),
ENGINE_MAN(2, "技工"),
;
@EnumValue
private final Integer value;
private final String desc;
}

View File

@ -0,0 +1,14 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.mapper;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionHistory;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Mapper
public interface WorkerProfessionHistoryMapper extends BaseMapper<WorkerProfessionHistory> {
}

View File

@ -0,0 +1,14 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.mapper;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Mapper
public interface WorkerProfessionSkillTagMapper extends BaseMapper<WorkerProfessionSkillTag> {
}

View File

@ -0,0 +1,17 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.mapper;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 项目内工人工种 Mapper 接口
* </p>
*
* @author zhangtianyu
* @since 2022-07-12
*/
@Mapper
public interface WorkerProfessionTagMapper extends BaseMapper<WorkerProfessionTag> {
}

View File

@ -0,0 +1,124 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.repository;
import cn.axzo.foundation.dao.support.mysql.MybatisPlusOperatorProcessor;
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageReqV2;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
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.entity.WorkerProfessionTag;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.ImmutableList;
import lombok.*;
import lombok.experimental.SuperBuilder;
import org.apache.commons.collections4.CollectionUtils;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
public interface WorkerProfessionHistoryRepository {
PageResp<WorkerProfessionHistoryResp> page(PageReq req);
default List<WorkerProfessionHistoryResp> list(PageReq req) {
return page(req).getData();
}
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
class PageReq extends PageReqV2 {
/**
* 是都包含删除(默认走查询未删除)
*/
@CriteriaField(ignore = true)
private Boolean includeDeleted;
@CriteriaField(ignore = true)
private List<Long> projectWorkerIds;
@CriteriaField
private Long workspaceId;
/**
* PLAT_TEAM:平台班组PROJECT_TEAM:项目内班组
*/
@CriteriaField
private String scene;
@CriteriaField(field="bizData", operator = Operator.JSON_QUERY)
private List<MybatisPlusOperatorProcessor.JSONQuery> bizData;
}
@Data
class WorkerProfessionHistoryResp extends WorkerProfessionHistory {
private String xx;
public static final String DATA_FLAG_PROFESSION = "WORKER_PROFESSION";
public static final String DATA_FLAG_SKILL = "WORKER_PROFESSION_SKILL";
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class HistoryData<T> {
private String dataFlag;
private List<T> jsonStrData;
@Override
public String toString() {
return JSON.toJSONString(this);
}
public List<WorkerProfessionTag> resolveWorkerProfessionTags(ValidationEnum valid) {
List<WorkerProfessionTag> workerProfessionTags = resolveJsonData(WorkerProfessionTag.class);
return workerProfessionTags.stream()
.filter(t -> valid == null || valid == ValidationEnum.ALL || valid.getCode().equals(t.getValid()))
.collect(Collectors.toList());
}
public List<WorkerProfessionSkillTag> resolveWorkerProfessionSkillTags(ValidationEnum valid) {
List<WorkerProfessionSkillTag> skillTags = resolveJsonData(WorkerProfessionSkillTag.class);
return skillTags.stream()
.filter(t -> valid == null || valid == ValidationEnum.ALL || valid.getCode().equals(t.getValid()))
.collect(Collectors.toList());
}
/**
* 1目前数据有两套格式先暂时兼容下
* 2会返回已删除的数据外部处理的时候自己判断是否需要
*
* @param rClass
* @param <R>
* @return
*/
private <R> List<R> resolveJsonData(Class<R> rClass) {
if (CollectionUtils.isEmpty(jsonStrData)) {
return ImmutableList.of();
}
// 先暂时兼容一下老数据部分数据是string的
if (String.class.isAssignableFrom(jsonStrData.get(0).getClass())) {
return JSON.parseArray((String) jsonStrData.get(0), rClass);
}
if (rClass.isAssignableFrom(jsonStrData.get(0).getClass())) {
return (List<R>) jsonStrData;
}
if (JSONObject.class.isAssignableFrom(jsonStrData.get(0).getClass())) {
return jsonStrData.stream().map(j -> ((JSONObject) j).toJavaObject(rClass)).collect(Collectors.toList());
}
return ImmutableList.of();
}
}
}
}

View File

@ -0,0 +1,61 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.repository;
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageReqV2;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionSkillTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.util.List;
/**
* @author zhanghongbo
* @date 2025/1/3
*/
public interface WorkerProfessionSkillTagRepository {
PageResp<WorkerProfessionSkillTagResp> page(PageReq req);
default List<WorkerProfessionSkillTagResp> list(PageReq req) {
return page(req).getData();
}
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
class PageReq extends PageReqV2 {
/**
* 是都包含删除(默认走查询未删除)
*/
@CriteriaField(ignore = true)
private Boolean includeDeleted;
@CriteriaField(field = "projectWorkerId", operator = Operator.IN)
private List<Long> projectWorkerIds;
@CriteriaField
private Long workspaceId;
/**
* PLAT_TEAM:平台班组PROJECT_TEAM:项目内班组
*/
@CriteriaField
private String scene;
}
@Data
class WorkerProfessionSkillTagResp extends WorkerProfessionSkillTag {
private String xx;
}
}

View File

@ -0,0 +1,81 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.repository;
import cn.axzo.foundation.dao.support.wrapper.CriteriaField;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.foundation.page.PageReqV2;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import lombok.*;
import lombok.experimental.SuperBuilder;
import java.util.List;
/**
* @author zhanghongbo
* @date 2025/1/3
*/
public interface WorkerProfessionTagRepository {
PageResp<WorkerProfessionTagResp> page(PageReq req);
default List<WorkerProfessionTagResp> list(PageReq req) {
return page(req).getData();
}
@EqualsAndHashCode(callSuper = true)
@NoArgsConstructor
@AllArgsConstructor
@Data
@SuperBuilder
class PageReq extends PageReqV2 {
/**
* 项目id
*/
@CriteriaField
private Long workspaceId;
/**
* 项目内工人ids
*/
@CriteriaField(field = "projectWorkerId", operator = Operator.IN)
private List<Long> projectWorkerIds;
/**
* PLAT_TEAM:平台班组PROJECT_TEAM:项目内班组
*/
@CriteriaField
private String scene;
/**
* 组织节点id
*/
@CriteriaField
private Long orgNodeId;
/**
* 组织节点ids
*/
@CriteriaField(field = "orgNodeId", operator = Operator.IN)
private List<Long> orgNodeIds;
/**
* 0-无效 1-有效
*/
@CriteriaField
@Builder.Default
private Integer valid = 1;
/**
* 是都包含删除(默认走查询未删除)
*/
@CriteriaField(ignore = true)
private Boolean includeDeleted;
}
@Data
class WorkerProfessionTagResp extends WorkerProfessionTag {
private String xx;
}
}

View File

@ -0,0 +1,53 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.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.infra.dao.workerprofession.dao.WorkerProfessionHistoryDao;
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.util.CommonUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Repository
@Slf4j
@AllArgsConstructor
public class WorkerProfessionHistoryRepositoryImpl implements WorkerProfessionHistoryRepository {
private WorkerProfessionHistoryDao workerProfessionHistoryDao;
@Override
public PageResp<WorkerProfessionHistoryResp> page(PageReq req) {
IPage<WorkerProfessionHistory> page = PageConverter.toMybatis(req, WorkerProfessionHistory.class);
QueryWrapper<WorkerProfessionHistory> wrapper = QueryWrapperHelper.fromBean(req, WorkerProfessionHistory.class);
// 处理删除标记
if (!BooleanUtil.isTrue(req.getIncludeDeleted())) {
wrapper.eq("is_delete", 0);
}
//处理项目工人id
if (ObjectUtil.isNotEmpty(req.getProjectWorkerIds())) {
}
IPage<WorkerProfessionHistoryResp> results = workerProfessionHistoryDao.page(page, wrapper)
.convert(e -> BeanUtil.toBean(e, WorkerProfessionHistoryResp.class));
if (CollUtil.isEmpty(results.getRecords())) {
return CommonUtil.getEmptyPage(req, WorkerProfessionHistoryResp.class);
}
return PageConverter.toResp(results);
}
}

View File

@ -0,0 +1,48 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.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.infra.dao.workerprofession.dao.WorkerProfessionSkillTagDao;
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.repository.WorkerProfessionSkillTagRepository;
import cn.axzo.orgmanax.infra.util.CommonUtil;
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.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Repository
@Slf4j
@AllArgsConstructor
public class WorkerProfessionSkillTagRepositoryImpl implements WorkerProfessionSkillTagRepository {
private WorkerProfessionSkillTagDao workerProfessionSkillTagDao;
@Override
public PageResp<WorkerProfessionSkillTagResp> page(PageReq req) {
IPage<WorkerProfessionSkillTag> page = PageConverter.toMybatis(req, WorkerProfessionSkillTag.class);
QueryWrapper<WorkerProfessionSkillTag> wrapper = QueryWrapperHelper.fromBean(req, WorkerProfessionSkillTag.class);
// 处理删除标记
if (!BooleanUtil.isTrue(req.getIncludeDeleted())) {
wrapper.eq("is_delete", 0);
}
IPage<WorkerProfessionSkillTagResp> results = workerProfessionSkillTagDao.page(page, wrapper)
.convert(e -> BeanUtil.toBean(e, WorkerProfessionSkillTagResp.class));
if (CollUtil.isEmpty(results.getRecords())) {
return CommonUtil.getEmptyPage(req, WorkerProfessionSkillTagResp.class);
}
return PageConverter.toResp(results);
}
}

View File

@ -0,0 +1,47 @@
package cn.axzo.orgmanax.infra.dao.workerprofession.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.infra.dao.workerprofession.dao.WorkerProfessionTagDao;
import cn.axzo.orgmanax.infra.dao.workerprofession.entity.WorkerProfessionTag;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionTagRepository;
import cn.axzo.orgmanax.infra.util.CommonUtil;
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.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
/**
* @author zhanghongbo
* @date 2025/1/3
*/
@Repository
@Slf4j
@AllArgsConstructor
public class WorkerProfessionTagRepositoryImpl implements WorkerProfessionTagRepository {
private WorkerProfessionTagDao workerProfessionTagDao;
@Override
public PageResp<WorkerProfessionTagResp> page(PageReq req) {
IPage<WorkerProfessionTag> page = PageConverter.toMybatis(req, WorkerProfessionTag.class);
QueryWrapper<WorkerProfessionTag> wrapper = QueryWrapperHelper.fromBean(req, WorkerProfessionTag.class);
// 处理删除标记
if (!BooleanUtil.isTrue(req.getIncludeDeleted())) {
wrapper.eq("is_delete", 0);
}
IPage<WorkerProfessionTagResp> results = workerProfessionTagDao.page(page, wrapper)
.convert(e -> BeanUtil.toBean(e, WorkerProfessionTagResp.class));
if (CollUtil.isEmpty(results.getRecords())) {
return CommonUtil.getEmptyPage(req, WorkerProfessionTagResp.class);
}
return PageConverter.toResp(results);
}
}

View File

@ -2,7 +2,7 @@ package cn.axzo.orgmanax.server.teamlog.controller;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.foundation.result.ApiResult;
import cn.axzo.orgmanax.api.teamlog.feign.TeamLogApi;
import cn.axzo.orgmanax.api.teamlog.feign.OrgTeamLogApi;
import cn.axzo.orgmanax.dto.teamlog.dto.TeamLogDTO;
import cn.axzo.orgmanax.dto.teamlog.req.TeamLogPageReq;
import cn.axzo.orgmanax.dto.teamlog.req.TeamLogRecordChangeTeamOwnerReq;
@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
@AllArgsConstructor
public class TeamLogController implements TeamLogApi {
public class OrgTeamLogController implements OrgTeamLogApi {
private TeamLogService teamLogService;

View File

@ -0,0 +1,56 @@
package cn.axzo.orgmanax.server.util;
import com.google.common.collect.Maps;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import java.util.Map;
import java.util.Objects;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author luofu
* @version 1.0
* @date 2024/1/13
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class StreamUtil {
/**
* 根据stream中对象的属性进行去重
*
* @param stream 待去重的stream
* @param propertyExtractor 属性提取器
* @return 去重后的stream
*/
public static <T> Stream<T> distinctByProperty(Stream<T> stream, Function<? super T, ?> propertyExtractor) {
return stream.filter(distinctPredicate(propertyExtractor));
}
private static <T> Predicate<T> distinctPredicate(Function<? super T, ?> propertyExtractor) {
Map<Object, Boolean> map = Maps.newConcurrentMap();
return t -> Objects.isNull(map.putIfAbsent(propertyExtractor.apply(t), Boolean.TRUE));
}
/**
* 使用toMap对元素进行去重并支持指定保留的元素默认保留最后一个
*
* @param stream
* @param distinctFunction
* @param mergeFunction
* @param <T>
* @return
*/
public static <T> Stream<T> distinct(Stream<T> stream, Function<T, ?> distinctFunction, BinaryOperator<T> mergeFunction) {
if (mergeFunction == null) {
// 默认保留最后一个
mergeFunction = (v1, v2) -> v2;
}
return stream.collect(Collectors.toMap(distinctFunction, Function.identity(), mergeFunction))
.values().stream();
}
}

View File

@ -0,0 +1,74 @@
package cn.axzo.orgmanax.server.workerprofession.controller;
import cn.axzo.foundation.page.PageResp;
import cn.axzo.foundation.result.ApiResult;
import cn.axzo.orgmanax.api.workerprofession.feign.OrgProjectWorkerProfessionApi;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO;
import cn.axzo.orgmanax.dto.workerprofession.req.*;
import cn.axzo.orgmanax.dto.workerprofession.resp.OrgWorkerProfessionResp;
import cn.axzo.orgmanax.dto.workerprofession.resp.ProjectWorkerProfessionResp;
import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import java.util.List;
import java.util.Map;
/**
* @author zhanghongbo
* @date 2025/1/3
*/
@RestController
@Slf4j
@AllArgsConstructor
public class OrgProjectWorkerProfessionController implements OrgProjectWorkerProfessionApi {
private OrgProjectWorkerProfessionService orgProjectWorkerProfessionService;
@Override
public ApiResult<Void> update(@Valid ProjectWorkerProfessionUpdateReq req) {
return null;
}
@Override
public ApiResult<Map<Long, List<ProfessionDTO>>> listValid(@Valid ProjectWorkerProfessionListValidReq req) {
return ApiResult.success(orgProjectWorkerProfessionService.listValid(req));
}
@Override
public ApiResult<Map<Long, List<String>>> sortOutProfessionCategory(@Valid ProjectWorkerProfessionSortOutProfessionCategoryReq req) {
return null;
}
@Override
public ApiResult<Void> configure(WorkerProfessionTagOperationConfigureReq request) {
return null;
}
@Override
public ApiResult<Void> remove(WorkerProfessionTagOperationRemoveReq request) {
return null;
}
@Override
public ApiResult<Void> upsert(WorkerProfessionTagOperationUpsertReq request) {
return null;
}
@Override
public ApiResult<Void> validUpdate(WorkerProfessionTagOperationValidUpdateReq request) {
return null;
}
@Override
public ApiResult<PageResp<ProjectWorkerProfessionResp>> page(WorkerProfessionTagQueryPageReq req) {
return null;
}
@Override
public ApiResult<PageResp<OrgWorkerProfessionResp>> pageProfessions(@Valid PageTeamProfessionsReq req) {
return null;
}
}

View File

@ -0,0 +1,22 @@
package cn.axzo.orgmanax.server.workerprofession.service;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq;
import java.util.List;
import java.util.Map;
/**
* @author zhanghongbo
* @date 2025/1/3
*/
public interface OrgProjectWorkerProfessionService {
Map<Long, List<ProfessionDTO>> listValid(ProjectWorkerProfessionListValidReq req);
/**
* 根据项目工人id获取工种信息(包括技能标签信息)
* @param projectWorkerIds
* @return
*/
List<ProfessionDTO> listValidWorkerProfession(List<Long> projectWorkerIds);
}

View File

@ -0,0 +1,15 @@
package cn.axzo.orgmanax.server.workerprofession.service;
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.WorkerProfessionSkillTagRepository;
import java.util.List;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
public interface OrgProjectWorkerProfessionSkillService {
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> list(WorkerProfessionSkillTagRepository.PageReq req);
}

View File

@ -0,0 +1,269 @@
package cn.axzo.orgmanax.server.workerprofession.service.impl;
import cn.axzo.foundation.dao.support.mysql.MybatisPlusOperatorProcessor;
import cn.axzo.foundation.dao.support.wrapper.Operator;
import cn.axzo.orgmanax.api.projectworker.enums.ProjectWorkerStatusEnum;
import cn.axzo.orgmanax.dto.common.IdentityType;
import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserDTO;
import cn.axzo.orgmanax.dto.nodeuser.dto.NodeUserProfile;
import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq;
import cn.axzo.orgmanax.dto.project.team.enums.TeamSceneEnum;
import cn.axzo.orgmanax.dto.project.team.enums.ValidationEnum;
import cn.axzo.orgmanax.dto.workerprofession.dto.ProfessionDTO;
import cn.axzo.orgmanax.dto.workerprofession.dto.SkillTagDTO;
import cn.axzo.orgmanax.dto.workerprofession.req.ProjectWorkerProfessionListValidReq;
import cn.axzo.orgmanax.infra.client.datacollection.DataCollectionDictInfoClient;
import cn.axzo.orgmanax.infra.client.datacollection.dto.DataCollectionListProfessionCategoriesResp;
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.WorkerProfessionSkillTagRepository;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionTagRepository;
import cn.axzo.orgmanax.server.node.service.NodeService;
import cn.axzo.orgmanax.server.nodeuser.service.NodeUserService;
import cn.axzo.orgmanax.server.util.StreamUtil;
import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionService;
import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionSkillService;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static java.util.function.Function.identity;
import static java.util.stream.Collectors.*;
/**
* @author zhanghongbo
* @date 2025/1/3
*/
@Service
@Slf4j
@AllArgsConstructor
public class OrgProjectWorkerProfessionServiceImpl implements OrgProjectWorkerProfessionService {
private NodeService nodeService;
private NodeUserService nodeUserService;
private WorkerProfessionTagRepository workerProfessionTagRepository;
private DataCollectionDictInfoClient dataCollectionDictInfoClient;
private OrgProjectWorkerProfessionSkillService orgProjectWorkerProfessionSkillService;
private WorkerProfessionHistoryRepository workerProfessionHistoryRepository;
private static final BinaryOperator<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> SKILL_TAG_MERGE_FUNC = (v1, v2) -> {
if (v1.getIsDelete() < v2.getIsDelete()) {
return v1;
}
return v2.getCreateAt().getTime() > v1.getCreateAt().getTime() ? v2 : v1;
};
@Override
public Map<Long, List<ProfessionDTO>> listValid(ProjectWorkerProfessionListValidReq req) {
List<Long> nodeIds = req.getNodeIds();
List<Long> workerIdentityIds = req.getWorkerIdentityIds();
Long workspaceId = req.getWorkspaceId();
//查询工人
List<NodeUserDTO> nodeUserDTOS = nodeUserService.list(ListNodeUserReq.builder()
.workspaceId(workspaceId)
.organizationalNodeIds(nodeIds)
.identityIds(workerIdentityIds)
.identityType(IdentityType.WORKER.getCode())
.projectWorkerStatuses(Arrays.asList(ProjectWorkerStatusEnum.ACTIVE.getValue())) //TODO 待枚举定义
.build());
if (ObjectUtil.isEmpty(nodeUserDTOS)) {
return Collections.emptyMap();
}
List<Long> projectWorkerIds = nodeUserDTOS.stream().map(nodeUserDTO -> {
NodeUserProfile.ProjectWorkerProfile projectWorkerProfile = nodeUserDTO.resolveProfile();
return projectWorkerProfile.getProjectWorkerId();
}).collect(toList());
Map<Long, NodeUserDTO> nodeUserDTOMap = nodeUserDTOS.stream().collect(toMap(NodeUserDTO::getIdentityId, identity()));
//获取工人工种
List<ProfessionDTO> professionDTOS = listValidWorkerProfession(projectWorkerIds);
Map<Long, List<ProfessionDTO>> professionMap = professionDTOS.stream().collect(groupingBy(ProfessionDTO::getProjectWorkerId));
//封装响应数据
HashMap<Long, List<ProfessionDTO>> result = new HashMap<>();
for (Long identityId : workerIdentityIds) {
NodeUserDTO nodeUserDTO = nodeUserDTOMap.get(identityId);
if (nodeUserDTO == null) {
result.put(identityId, Collections.emptyList());
} else {
NodeUserProfile.ProjectWorkerProfile projectWorkerProfile = nodeUserDTO.resolveProfile();
Long projectWorkerId = projectWorkerProfile.getProjectWorkerId();
List<ProfessionDTO> professions = professionMap.get(projectWorkerId);
if (professions == null) {
professions = Collections.emptyList();
}
result.put(identityId, professions);
}
}
return result;
}
/**
* 根据项目工人id获取工种信息(包括技能标签信息)
* @param projectWorkerIds
* @return
*/
@Override
public List<ProfessionDTO> listValidWorkerProfession(List<Long> projectWorkerIds) {
WorkerProfessionTagRepository.PageReq pageReq4Profession = WorkerProfessionTagRepository.PageReq.builder()
.projectWorkerIds(projectWorkerIds)
.scene(TeamSceneEnum.PROJECT_TEAM.name())
.build();
List<WorkerProfessionTagRepository.WorkerProfessionTagResp> workerProfessionTagResps = workerProfessionTagRepository.list(pageReq4Profession);
if (ObjectUtil.isEmpty(workerProfessionTagResps)) {
return Collections.emptyList();
}
List<Long> professionIds = workerProfessionTagResps.stream().map(WorkerProfessionTagRepository.WorkerProfessionTagResp::getProfessionId).collect(toList());
List<DataCollectionListProfessionCategoriesResp> professionCategoriesResps = dataCollectionDictInfoClient.listProfessionCategories(professionIds);
Map<Long, DataCollectionListProfessionCategoriesResp> professionCategoryRespMap = professionCategoriesResps.stream().collect(Collectors.toMap(DataCollectionListProfessionCategoriesResp::getId, Function.identity(), (o, n) -> o));
List<ProfessionDTO> professionDTOS = new ArrayList<>(workerProfessionTagResps.size());
for (WorkerProfessionTagRepository.WorkerProfessionTagResp workerProfessionTagResp : workerProfessionTagResps) {
ProfessionDTO dto = new ProfessionDTO();
dto.setProjectWorkerId(workerProfessionTagResp.getProjectWorkerId());
dto.setProfessionId(workerProfessionTagResp.getProfessionId());
dto.setValid(workerProfessionTagResp.getValid());
dto.setProfessionName(workerProfessionTagResp.getProfessionName());
dto.setCreateAt(workerProfessionTagResp.getCreateAt());
DataCollectionListProfessionCategoriesResp categoryResp = professionCategoryRespMap.getOrDefault(dto.getProfessionId(), new DataCollectionListProfessionCategoriesResp());
dto.setSkillType(Objects.isNull(categoryResp.getSkillType()) ? 1 : categoryResp.getSkillType().getValue());
professionDTOS.add(dto);
}
//获取技能标签包括历史技能标签(带子技能标签)
List<SkillTagDTO> skillTagDTOS = listSkillTagWithChild(projectWorkerIds);
Map<Long, List<SkillTagDTO>> skillTagMap = skillTagDTOS.stream().collect(groupingBy(SkillTagDTO::getProfessionId));
//封装工人工种和技能标签
for (ProfessionDTO profession : professionDTOS) {
List<SkillTagDTO> skills = skillTagMap.get(profession.getProfessionId());
profession.setSkillTags(skills);
profession.computeLevel(1);
}
return professionDTOS;
}
/**
* 获取技能标签包括历史技能标签(带子技能标签)
* @param projectWorkerIds
*/
private List<SkillTagDTO> listSkillTagWithChild(List<Long> projectWorkerIds) {
//获取技能标签
WorkerProfessionSkillTagRepository.PageReq pageReq4Skill = WorkerProfessionSkillTagRepository.PageReq.builder()
.projectWorkerIds(projectWorkerIds)
.scene(TeamSceneEnum.PROJECT_TEAM.name())
.build();
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> workerProfessionSkillTagResps = orgProjectWorkerProfessionSkillService.list(pageReq4Skill);
//获取历史技能标签
WorkerProfessionHistoryRepository.PageReq pageReq4HistoryProfession = WorkerProfessionHistoryRepository.PageReq.builder()
.scene(TeamSceneEnum.PROJECT_TEAM.name())
.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<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> workerProfessionSkillTagResps4History = doHistoryWorkerSkilltag(workerProfessionHistoryResps);
//技能标签和历史技能标签合在一起
Stream<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> allStream = Stream.concat(workerProfessionSkillTagResps.stream(), workerProfessionSkillTagResps4History.stream());
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> allSkillTagResps = StreamUtil.distinct(allStream,
p -> String.format("%s_%s", p.getProjectWorkerId(), p.getSkillTagCode()), SKILL_TAG_MERGE_FUNC)
.collect(toList());
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> parentSkillTagLists = allSkillTagResps.stream()
.filter(item -> !StringUtils.hasLength(item.getParentSkillTagCode()) || item.getParentSkillTagCode().equals("0"))
.collect(toList());
Map<String, List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp>> chileMap = allSkillTagResps.stream()
.filter(item -> StringUtils.hasLength(item.getParentSkillTagCode()) || !item.getParentSkillTagCode().equals("0"))
.collect(Collectors.groupingBy(WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp::getParentSkillTagCode));
parentSkillTagLists.stream().map(i -> chileSkillTagConvert(i, chileMap)).collect(toList());
return parentSkillTagLists.stream().map(i -> chileSkillTagConvert(i, chileMap)).collect(toList());
}
private SkillTagDTO chileSkillTagConvert(WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp parentSkillTag, Map<String, List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp>> chileMap) {
SkillTagDTO tagDTO = new SkillTagDTO();
tagDTO.setCode(parentSkillTag.getSkillTagCode());
// tagDTO.setId(0L); //历史代码都为0L, 已经没用了
tagDTO.setName(parentSkillTag.getSkillTagName());
tagDTO.setProfessionId(parentSkillTag.getProfessionId());
tagDTO.setParentCode(parentSkillTag.getParentSkillTagCode());
tagDTO.setChildSkillTags(Lists.newArrayList());
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> childSkillTagResps = chileMap.get(parentSkillTag.getSkillTagCode());
if (CollUtil.isEmpty(childSkillTagResps)) {
return tagDTO;
}
for (WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp skillTagResp : childSkillTagResps) {
SkillTagDTO chileSkillTag = chileSkillTagConvert(skillTagResp, chileMap);
tagDTO.getChildSkillTags().add(chileSkillTag);
}
return tagDTO;
}
/**
* 转换历史技能标签
* @param workerProfessionHistoryResps
* @return
*/
private List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> doHistoryWorkerSkilltag(List<WorkerProfessionHistoryRepository.WorkerProfessionHistoryResp> workerProfessionHistoryResps) {
ArrayList<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> wss = Lists.newArrayList();
workerProfessionHistoryResps.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_SKILL)) {
List<WorkerProfessionSkillTag> skillTags = historyDatum.resolveWorkerProfessionSkillTags(ValidationEnum.EFFECTIVE);
// 需要使用有效工种
Stream<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> stream = skillTags.stream()
.filter(s -> !Strings.isNullOrEmpty(s.getSkillTagCode())).map(p -> {
WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp skillTag = new WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp();
skillTag.setId(p.getId());
skillTag.setSkillTagName(p.getSkillTagName());
skillTag.setSkillTagCode(p.getSkillTagCode());
skillTag.setParentSkillTagCode(p.getParentSkillTagCode());
skillTag.setProfessionId(p.getProfessionId());
skillTag.setWorkspaceId(p.getWorkspaceId());
skillTag.setProjectWorkerId(projectWorkerId);
skillTag.setCreateAt(p.getCreateAt());
skillTag.setUpdateAt(p.getUpdateAt());
skillTag.setIsDelete(p.getIsDelete());
return skillTag;
});
List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> collect = StreamUtil.distinct(stream,
// 按照人+技能标签去重
p -> String.format("%s_%s", p.getProjectWorkerId(), p.getSkillTagCode()),
SKILL_TAG_MERGE_FUNC)
.collect(toList());
wss.addAll(collect);
}
}
});
return wss;
}
}

View File

@ -0,0 +1,27 @@
package cn.axzo.orgmanax.server.workerprofession.service.impl;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionHistoryRepository;
import cn.axzo.orgmanax.infra.dao.workerprofession.repository.WorkerProfessionSkillTagRepository;
import cn.axzo.orgmanax.server.workerprofession.service.OrgProjectWorkerProfessionSkillService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author zhanghongbo
* @date 2025/1/6
*/
@Service
@Slf4j
@AllArgsConstructor
public class OrgProjectWorkerProfessionSkillServiceImpl implements OrgProjectWorkerProfessionSkillService {
private WorkerProfessionSkillTagRepository workerProfessionSkillTagRepository;
@Override
public List<WorkerProfessionSkillTagRepository.WorkerProfessionSkillTagResp> list(WorkerProfessionSkillTagRepository.PageReq req) {
return workerProfessionSkillTagRepository.list(req);
}
}