Эх сурвалжийг харах

feat(helper): 添加员工任职经历查询功能

- 新增 queryEmpPosOrgRelHisByEmployeesMap 方法,根据多个员工ID查询最新的任职经历信息
- 新增 queryEmpPosOrgRelHisByEmployees 方法,支持带额外条件的任职经历查询
- 添加了完整的查询条件构建,包括最新记录、未删除、主任职等筛选条件
- 新增 PosSalaryGrade1 类,实现岗位工资一档工资的自定义数据获取服务
- 实现了员工到薪酬人员的映射和岗位工资标准定薪记录查询
- 添加了薪酬标准表匹配和金额计算功能
wyc 1 долоо хоног өмнө
parent
commit
fcf112c7a0

+ 73 - 0
code/base/nckd-jxccl-base-helper/src/main/java/nckd/jxccl/base/hrpi/helper/EmpPosOrgRelHelper.java

@@ -134,6 +134,40 @@ public class EmpPosOrgRelHelper {
 
         return result;
 
+    }
+    /**
+     * 根据多个员工ID查询最新的任职经历信息(含历史)
+     *
+     * @param employeeIds 员工ID集合
+     * @return 员工的任职经历信息数组
+     * @author W.Y.C
+     * @date: 2025/11/04 16:02
+     */
+    public static Map<Long, DynamicObject> queryEmpPosOrgRelHisByEmployeesMap(Collection<Long> employeeIds) {
+        DynamicObject[] dynamicObjects = queryEmpPosOrgRelHisByEmployees(employeeIds, null);
+        // 按员工ID分组,并取每个员工的最新记录(按开始日期)
+        Map<Long, List<DynamicObject>> grouped = new HashMap<>();
+        for (DynamicObject obj : dynamicObjects) {
+            Long empId = obj.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
+            grouped.computeIfAbsent(empId, k -> new ArrayList<>()).add(obj);
+        }
+
+        // 从每组中选取开始日期最新的记录
+        Map<Long, DynamicObject> result = new HashMap<>();
+        for (Map.Entry<Long, List<DynamicObject>> entry : grouped.entrySet()) {
+            List<DynamicObject> records = entry.getValue();
+            DynamicObject latestRecord = records.stream()
+                    .max((o1, o2) -> {
+                        Date date1 = o1.getDate(FormConstant.STARTDATE);
+                        Date date2 = o2.getDate(FormConstant.STARTDATE);
+                        return date1.compareTo(date2);
+                    })
+                    .orElse(null);
+            result.put(entry.getKey(), latestRecord);
+        }
+
+        return result;
+
     }
 
     /**
@@ -188,6 +222,45 @@ public class EmpPosOrgRelHelper {
         return BusinessDataServiceHelper.load(FormConstant.HRPI_EMPPOSORGREL, selectProperties, new QFilter[]{queryFilter}, order);
     }
 
+    /**
+     * 获取员工有效任职经历(含历史)
+     * 查询条件包括:
+     * 1. 员工ID在指定范围内
+     * 2. 是最新记录(IS_SEQLATESTRECORD=YES)
+     * 3. 未删除(IS_DELETED=NO)
+     * 4. 是主任职(IS_PRIMARY=YES)
+     *
+     * @param employeeIds 员工ID集合
+     * @param otherFilter 其他查询条件(可选)
+     * @return 员工的任职经历信息数组
+     * @author W.Y.C
+     * @date: 2025/11/04 16:02
+     */
+    public static DynamicObject[] queryEmpPosOrgRelHisByEmployees(Collection<Long> employeeIds, QFilter otherFilter) {
+        // 构建基础查询条件
+
+        QFilter queryFilter = new QFilter(FormConstant.EMPLOYEE_KEY, QCP.in, employeeIds)
+                .and(FormConstant.IS_SEQLATESTRECORD, QCP.equals, EnableEnum.YES.getCode())
+                .and(FormConstant.IS_DELETED, QCP.equals, EnableEnum.NO.getCode())
+                .and(FormConstant.IS_PRIMARY, QCP.equals, EnableEnum.YES.getCode())
+                .and(FormConstant.STARTDATE, QCP.less_equals, new Date())
+                .and(FormConstant.ENDDATE, QCP.large_equals, new Date())
+                //在岗
+                .and(String.join( ".", FormConstant.POS_STATUS, FormConstant.POST_STATE_CLS, FormConstant.NUMBER_KEY),QCP.equals,"1010_S");
+
+        // 添加额外查询条件(如果有)
+        if (otherFilter != null) {
+            queryFilter.and(otherFilter);
+        }
+
+        // 构建查询字段和排序规则
+        String selectProperties = selectProperties().buildSelect();
+        String order = selectProperties().buildOrder();
+
+        // 执行查询并返回结果
+        return BusinessDataServiceHelper.load(FormConstant.HRPI_EMPPOSORGREL, selectProperties, new QFilter[]{queryFilter}, order);
+    }
+
     /**
      * 构建查询字段和排序规则
      * 包含员工基本信息、岗位类型、组织架构等相关字段

+ 143 - 0
code/hr/nckd-jxccl-hr/src/main/java/nckd/jxccl/hr/psms/common/PosSalaryGrade1.java

@@ -0,0 +1,143 @@
+package nckd.jxccl.hr.psms.common;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.sdk.swc.hcdm.business.helper.HCDMSalaryStdServiceHelper;
+import kd.sdk.swc.hcdm.common.dto.stdtab.match.StdTableDataMatchParam;
+import kd.sdk.swc.hcdm.common.dto.stdtab.match.StdTableDataMatchResult;
+import kd.sdk.swc.hscs.common.api.ICustomFetchDataService;
+import nckd.jxccl.base.common.constant.FormConstant;
+import nckd.jxccl.base.common.utils.ConvertUtil;
+import nckd.jxccl.base.common.utils.DateUtil;
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
+import nckd.jxccl.base.swc.helper.AdjFileServiceHelper;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+* 岗位工资一档工资
+* @author W.Y.C
+* @date 2026/1/4 10:14
+* @version 1.0
+*/
+public class PosSalaryGrade1 implements ICustomFetchDataService {
+
+    protected final static Log logger = LogFactory.getLog(PosSalaryGrade1.class);
+
+    @Override
+    public Map<Long, Map<String, Object>> fetchDataCalPerson(List<Long> calPersonIdList, Map<Long, Map<String, Object>> paramsMap, Map<String, Object> extParamMap) {
+        Map<Long, Map<String, Object>> resultMap = new HashMap<Long, Map<String, Object>>();
+
+        QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
+                .add(FormConstant.ID_KEY)
+                .add(FormConstant.EMP_NUMBER_KEY)
+                .add(FormConstant.NAME_KEY)
+                .add(FormConstant.ORG_KEY)
+                .addGroup(new String[]{"caltask"}, "calcount", "payrolldate")
+                .addGroup(new String[]{"caltask", "calrule"}, FormConstant.ID_KEY)
+                .addGroup(new String[]{FormConstant.EMPLOYEE_KEY}, FormConstant.ID_KEY);
+        QFilter qFilter = new QFilter(FormConstant.ID_KEY, "in", calPersonIdList);
+        DynamicObject[] load = new HRBaseServiceHelper("hsas_calperson").load(queryFieldBuilder.buildSelect(), new QFilter[]{qFilter});
+        if(load != null && load.length > 0) {
+            Map<Long, Long> employeeToCalPersonMap = Arrays.stream(load)
+                    .collect(Collectors.toMap(
+                            obj -> obj.getLong(FormConstant.ID_KEY),
+                            obj -> obj.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY))
+                    ));
+            long orgId = load[0].getLong(String.join(".", FormConstant.ORG_KEY, FormConstant.ID_KEY));
+            //核算任务
+            DynamicObject calTask = load[0].getDynamicObject("caltask");
+            //薪资所属年月
+            Date date = calTask.getDate("payrolldate");
+            int year = DateUtil.getYear(date);
+            int month = DateUtil.getMonthValue(date);
+            //核算规则
+            long calRuleId = calTask.getLong(String.join(".", "calrule", FormConstant.ID_KEY));
+            //核算次数
+            int calCount = calTask.getInt("calcount");
+
+
+            Map<Long, BigDecimal> amountMap = new HashMap<>(employeeToCalPersonMap.size());
+            if(!employeeToCalPersonMap.isEmpty()) {
+                //获取人员最新岗位工资标准定薪记录
+                List<Long> allPersonIds = ConvertUtil.toList(employeeToCalPersonMap.values());
+                List<AdjFileServiceHelper.SalaryAdjustmentResult> salaryAdjustmentResultList = AdjFileServiceHelper.getLastDecAdjRecords(allPersonIds, FormConstant.STANDARDITEM_ID_KEY);
+                if (!salaryAdjustmentResultList.isEmpty()) {
+                    //薪酬标准ID
+                    List<Long> salaryStIds = salaryAdjustmentResultList.stream().map(result -> result.salaryStDv.getLong(FormConstant.ID_KEY)).collect(Collectors.toList());
+                    QFilter filter = new QFilter(FormConstant.ID_KEY, QCP.in, salaryStIds)
+                            .and(String.join(".", "rankentry", "rank", FormConstant.NUMBER_KEY), QCP.equals, "01");
+                    //获取标准表中01档的薪档
+                    QueryFieldBuilder salaryStandFieldBuilder = QueryFieldBuilder.create()
+                            .add(FormConstant.ID_KEY)
+                            .addIdNumberNameWithExtras(new String[]{"rankentry", "rank"}, FormConstant.INDEX_KEY);
+                    DynamicObjectCollection salaryStandardColl = QueryServiceHelper.query("hcdm_salarystandard", salaryStandFieldBuilder.buildSelect(), new QFilter[]{filter});
+                    Map<Long, DynamicObject> salaryStandardMap = salaryStandardColl.stream()
+                            .collect(Collectors.toMap(
+                                    obj -> obj.getLong(FormConstant.ID_KEY),
+                                    obj -> obj
+                            ));
+
+                    if (!salaryStandardMap.isEmpty()) {
+                        List<StdTableDataMatchParam> matchParams = new ArrayList<>();
+                        for (AdjFileServiceHelper.SalaryAdjustmentResult result : salaryAdjustmentResultList) {
+                            StdTableDataMatchParam stdTableDataMatchParam = new StdTableDataMatchParam();
+                            stdTableDataMatchParam.setStdTableId(result.salaryStDv.getLong(FormConstant.ID_KEY));
+                            stdTableDataMatchParam.setStdItemId(FormConstant.STANDARDITEM_ID_KEY);
+                            stdTableDataMatchParam.setGradeId(result.salaryGrade.getLong(FormConstant.ID_KEY));
+                            DynamicObject dynamicObject = salaryStandardMap.get(result.salaryStDv.getLong(FormConstant.ID_KEY));
+                            if (dynamicObject != null) {
+                                long rankId = dynamicObject.getLong(String.join(".", "rankentry", "rank", FormConstant.ID_KEY));
+                                stdTableDataMatchParam.setRankId(rankId);
+                                matchParams.add(stdTableDataMatchParam);
+                            }
+                        }
+                        if (!matchParams.isEmpty()) {
+                            //获取薪酬项目、薪等、薪档对应金额(入参params的数组下标和出参的数组下标一一对应)
+                            List<StdTableDataMatchResult> stdTableDataMatchResults = HCDMSalaryStdServiceHelper.matchStdTableData(matchParams);
+                            for (int i = 0; i < salaryAdjustmentResultList.size(); i++) {
+                                AdjFileServiceHelper.SalaryAdjustmentResult result = salaryAdjustmentResultList.get(i);
+                                if (i < stdTableDataMatchResults.size() && stdTableDataMatchResults.get(i) != null) {
+                                    //当前薪等01档的金额
+                                    amountMap.put(result.employee.getLong(FormConstant.ID_KEY), stdTableDataMatchResults.get(i).getAmount());
+                                }
+                            }
+                        }
+                    } else {
+                        logger.warn("未获取薪酬标准表中01档的薪档数据,薪酬标准ID:{}", salaryStIds);
+                    }
+                } else {
+                    logger.warn("未获取到人员岗位工资标准定薪记录,人员ID:{}", allPersonIds);
+                }
+            }
+
+            for (Long calPersonId : calPersonIdList) {
+                Long personId = employeeToCalPersonMap.get(calPersonId);
+                BigDecimal amount = amountMap.get(personId);
+                Map<String, Object> result = new HashMap<String, Object>();
+                result.put("postSalGrade",amount != null ? amount : BigDecimal.ZERO);
+                resultMap.put(calPersonId, result);
+            }
+
+        }
+        return resultMap;
+    }
+
+    @Override
+    public Map<String, Object> fetchDataCalTask(Long calTaskId, Map<String, Object> paramsMap, Map<String, Object> extParamMap) {
+        return ICustomFetchDataService.super.fetchDataCalTask(calTaskId, paramsMap, extParamMap);
+    }
+}