|
|
@@ -1,5 +1,7 @@
|
|
|
package nckd.jxccl.hr.psms.business;
|
|
|
|
|
|
+import kd.bos.algo.Algo;
|
|
|
+import kd.bos.algo.AlgoContext;
|
|
|
import kd.bos.algo.DataSet;
|
|
|
import kd.bos.algo.Row;
|
|
|
import kd.bos.common.enums.EnableEnum;
|
|
|
@@ -17,6 +19,7 @@ import nckd.jxccl.base.common.enums.AppraisalResultEnum;
|
|
|
import nckd.jxccl.base.common.enums.JobSeqEnum;
|
|
|
import nckd.jxccl.base.common.exception.ValidationException;
|
|
|
import nckd.jxccl.base.common.utils.DateUtil;
|
|
|
+import nckd.jxccl.base.common.utils.QueryFieldBuilder;
|
|
|
import nckd.jxccl.base.common.utils.StrFormatter;
|
|
|
import nckd.jxccl.base.orm.helper.QFilterCommonHelper;
|
|
|
import nckd.jxccl.base.pm.helper.PerformanceManagerHelper;
|
|
|
@@ -27,10 +30,11 @@ import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
+import java.util.Arrays;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
import java.util.Map;
|
|
|
-import java.util.StringJoiner;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
@@ -44,14 +48,6 @@ public class JobLevelCalculatorService {
|
|
|
|
|
|
protected final static Log logger = LogFactory.getLog(JobLevelCalculatorService.class);
|
|
|
|
|
|
- /** 技术序列 */
|
|
|
- public static final String JS_JOB_SEQ = "01";
|
|
|
- /** 职能序列 */
|
|
|
- public static final String ZN_JOB_SEQ = "02";
|
|
|
- /** 技能序列 */
|
|
|
- public static final String JN_JOB_SEQ = "03";
|
|
|
- /** 管理序列 */
|
|
|
- public static final String GL_JOB_SEQ = "04";
|
|
|
/** 职称等级与技能等级映射关系*/
|
|
|
public static final Map<String, String> TechPostLevelNumberTojobstatusNumberMap = new HashMap<>();
|
|
|
|
|
|
@@ -168,13 +164,18 @@ public class JobLevelCalculatorService {
|
|
|
.add(jobScoreInfo.quaLevelScore);
|
|
|
|
|
|
// 11. 获取序列对应的职级
|
|
|
- DynamicObjectCollection jobLevelByJobSeq = getJobLevelByJobSeq(jobSeq);
|
|
|
+ DynamicObject[] jobLevelByJobSeq = getJobLevelByJobSeq(jobSeq);
|
|
|
//对应SHR:jobgradeMap
|
|
|
- Map<Integer, DynamicObject> jobLevelMap = jobLevelByJobSeq.stream()
|
|
|
- .collect(Collectors.toMap(
|
|
|
- dynamicObject -> dynamicObject.getInt(String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ)),
|
|
|
- dynamicObject -> dynamicObject)
|
|
|
- );
|
|
|
+ Map<Integer, DynamicObject> jobLevelMap = new HashMap<>();
|
|
|
+ if (jobLevelByJobSeq != null) {
|
|
|
+ String jobLevelSeqKey = FormConstant.JOBLEVELSEQ;
|
|
|
+ jobLevelMap = Arrays.stream(jobLevelByJobSeq)
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ dynamicObject -> dynamicObject.getInt(jobLevelSeqKey),
|
|
|
+ dynamicObject -> dynamicObject,
|
|
|
+ (existing, replacement) -> existing)
|
|
|
+ );
|
|
|
+ }
|
|
|
|
|
|
// 12. 根据不同情况计算职级ID
|
|
|
//对应SHR:JobGradeInfo;1044~1071行
|
|
|
@@ -302,15 +303,19 @@ public class JobLevelCalculatorService {
|
|
|
* @date: 2025/09/19 14:07
|
|
|
*/
|
|
|
public static DynamicObject handleJobSeq(DynamicObject jobSeq) {
|
|
|
- if(GL_JOB_SEQ.equalsIgnoreCase(jobSeq.getString(FormConstant.NUMBER_KEY))){
|
|
|
+ if(JobSeqEnum.MANAGE.getCode().equalsIgnoreCase(jobSeq.getString(FormConstant.NUMBER_KEY))){
|
|
|
QFilter filter = QFilterCommonHelper.getEnableFilter().and(QFilterCommonHelper.getDataStatusFilter()).and(new QFilter(FormConstant.NUMBER_KEY, QCP.equals, JobSeqEnum.FUNCTIONAL.getCode()));
|
|
|
- StringJoiner selectFields = new StringJoiner(",");
|
|
|
- selectFields.add(FormConstant.ID_KEY);
|
|
|
- selectFields.add(FormConstant.NUMBER_KEY);
|
|
|
- selectFields.add(FormConstant.NAME_KEY);
|
|
|
- DynamicObject[] load = BusinessDataServiceHelper.load(FormConstant.HBJM_JOBSEQHR, selectFields.toString(), new QFilter[]{filter});
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
+ .addIdNumberName(FormConstant.HBJM_JOBSEQHR);
|
|
|
+
|
|
|
+ DynamicObject[] load = BusinessDataServiceHelper.load(
|
|
|
+ FormConstant.HBJM_JOBSEQHR,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{filter}
|
|
|
+ );
|
|
|
+
|
|
|
if(load.length == 0){
|
|
|
- throw new ValidationException(StrFormatter.format("管理序列转职能序列错误,未找到编码为【{}】的职能序列。请维护编码为【{}】的职能序列!", ZN_JOB_SEQ,ZN_JOB_SEQ));
|
|
|
+ throw new ValidationException(StrFormatter.format("管理序列转职能序列错误,未找到编码为【{}】的职能序列。请维护编码为【{}】的职能序列!", JobSeqEnum.FUNCTIONAL.getCode(),JobSeqEnum.FUNCTIONAL.getCode()));
|
|
|
}
|
|
|
return load[0];
|
|
|
}else{
|
|
|
@@ -334,173 +339,14 @@ public class JobLevelCalculatorService {
|
|
|
if (StringUtils.isBlank(proTitleLevelNumber) && (StringUtils.isBlank(ocpQualLevel) || JobSeqEnum.SKILL.getCode().equals(jobSeqNumber))) {
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
// 情况2:技能序列下无技能等级,但有职称等级且职称无对应技能等级
|
|
|
- return JN_JOB_SEQ.equals(jobSeqNumber) &&
|
|
|
+ return JobSeqEnum.SKILL.getCode().equals(jobSeqNumber) &&
|
|
|
StringUtils.isBlank(ocpQualLevel) &&
|
|
|
StringUtils.isNotBlank(proTitleLevelNumber) &&
|
|
|
TechPostLevelNumberTojobstatusNumberMap.get(proTitleLevelNumber) == null;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 获取职位序列最低职级
|
|
|
- * @param jobSeq 职位序列
|
|
|
- * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
- * @author W.Y.C
|
|
|
- * @date: 2025/09/20 16:52
|
|
|
- */
|
|
|
- public static DynamicObject getLowestJobLevel(DynamicObject jobSeq) {
|
|
|
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
- //职位序列
|
|
|
- .add(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.NUMBER_KEY))
|
|
|
- //职级
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_COEFFICIENT))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_SCORE));
|
|
|
-
|
|
|
- QFilter filter = new QFilter(String.join(".",FormConstant.NCKD_JOBSEQ), QCP.equals, jobSeq.getLong(FormConstant.ID_KEY))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.is_notnull, null))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.large_than, 0));
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.JOBSEQTOJOBLEVELQUERY,
|
|
|
- selectFields.toString(),
|
|
|
- new QFilter[]{filter},
|
|
|
- String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
- return !query.isEmpty() ? query.get(0) : null;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取职位序列和积分最高职级
|
|
|
- * @param jobSeq 职位序列
|
|
|
- * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
- * @author W.Y.C
|
|
|
- * @date: 2025/09/20 16:52
|
|
|
- */
|
|
|
- public static DynamicObject getMaxJobLevel(DynamicObject jobSeq,BigDecimal score) {
|
|
|
-
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
- //职位序列
|
|
|
- .add(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.NUMBER_KEY))
|
|
|
- //职级
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_COEFFICIENT))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_SCORE));
|
|
|
-
|
|
|
- QFilter filter = new QFilter(String.join(".",FormConstant.NCKD_JOBSEQ), QCP.equals, jobSeq.getLong(FormConstant.ID_KEY))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.is_notnull, null))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.large_than, 0))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_SCORE), QCP.less_equals, score));
|
|
|
-
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.JOBSEQTOJOBLEVELQUERY,
|
|
|
- selectFields.toString(),
|
|
|
- new QFilter[]{filter},
|
|
|
- String.join(".", FormConstant.HBJM_JOBGRADESCMHR, FormConstant.JOBLEVELSEQ +" desc"));
|
|
|
- return !query.isEmpty() ? query.get(0) : null;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取职位序列和积分最高职级
|
|
|
- * @param jobSeq 职位序列
|
|
|
- * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
- * @author W.Y.C
|
|
|
- * @date: 2025/09/20 16:52
|
|
|
- */
|
|
|
- private static DynamicObject getMaxJobLevel(DynamicObject jobSeq,String proTitleLevelNumber,String ocpQualLevelNumber) {
|
|
|
- jobSeq = handleJobSeq(jobSeq);
|
|
|
- String jobSeqNumber = jobSeq.getString(FormConstant.NUMBER_KEY);
|
|
|
- /**
|
|
|
- * 如果没有职称等级与技能等级,则倒取该序列最低职等 如果没有职称且是非技能序列,则倒取该序列最低职等 如果是技能序列,没有技能等级但有职称等级,但职称等级没有对应的技能等级,则取该序列最低职等
|
|
|
- */
|
|
|
- if (StringUtils.isBlank(proTitleLevelNumber) && (StringUtils.isBlank(ocpQualLevelNumber) || !JobSeqEnum.SKILL.getCode().equals(jobSeqNumber))) {
|
|
|
- return getLowestJobLevel(jobSeq);
|
|
|
- }
|
|
|
- else if (JobSeqEnum.SKILL.getCode().equals(jobSeqNumber) && StringUtils.isBlank(ocpQualLevelNumber) && StringUtils.isNotBlank(proTitleLevelNumber) && TechPostLevelNumberTojobstatusNumberMap.get(proTitleLevelNumber) == null) {
|
|
|
- return getLowestJobLevel(jobSeq);
|
|
|
- }
|
|
|
- String likename = "";
|
|
|
- String likenumber = "";
|
|
|
- if (JobSeqEnum.SKILL.getCode().equals(jobSeqNumber)) {
|
|
|
- if (StringUtils.isBlank(ocpQualLevelNumber)) {
|
|
|
- likenumber = TechPostLevelNumberTojobstatusNumberMap.get(proTitleLevelNumber);
|
|
|
- likename = "职称等级【" + proTitleLevelNumber + "】对应的技能等级";
|
|
|
- System.out.println("技能序列但无技能等级,使用职称等级【" + proTitleLevelNumber + "】对应的技能等级,编码【" + likenumber + "】");
|
|
|
- }
|
|
|
- else {
|
|
|
- likenumber = ocpQualLevelNumber;
|
|
|
- likename = "技能等级";
|
|
|
- System.out.println("技能序列使用技能等级,编码【" + likenumber + "】");
|
|
|
- }
|
|
|
- }
|
|
|
- else {
|
|
|
- likenumber = proTitleLevelNumber;
|
|
|
- likename = "职称等级";
|
|
|
- System.out.println("非技能序列使用职称等级,编码【" + likenumber + "】");
|
|
|
- }
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
- //职位序列
|
|
|
- .add(String.join(".", FormConstant.NCKD_JOBSEQ,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".", FormConstant.NCKD_JOBSEQ,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".", FormConstant.NCKD_JOBSEQ,FormConstant.NUMBER_KEY))
|
|
|
- //职级
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_COEFFICIENT))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_SCORE));
|
|
|
-
|
|
|
- QFilter filter = new QFilter(String.join(".",FormConstant.NCKD_JOBSEQ), QCP.equals, jobSeq.getLong(FormConstant.ID_KEY))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.is_notnull, null))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.large_than, 0))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBGRADEHR, FormConstant.NCKD_JOBLEVELNUMBER), QCP.like, "%"+likenumber+"%"));
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.JOBSEQTOJOBLEVELQUERY,
|
|
|
- selectFields.toString(),
|
|
|
- new QFilter[]{filter},
|
|
|
- String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ +" desc"));
|
|
|
- return !query.isEmpty() ? query.get(0) : null;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取职位序列对应的职级
|
|
|
- * @param jobSeq 职位序列
|
|
|
- * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
- * @author W.Y.C
|
|
|
- * @date: 2025/09/20 16:52
|
|
|
- */
|
|
|
- private static DynamicObjectCollection getJobLevelByJobSeq(DynamicObject jobSeq) {
|
|
|
-
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
- //职位序列
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBGRADESCMHR, FormConstant.NCKD_JOBSEQ,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBGRADESCMHR, FormConstant.NCKD_JOBSEQ,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBGRADESCMHR, FormConstant.NCKD_JOBSEQ,FormConstant.NUMBER_KEY))
|
|
|
- //职级
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_COEFFICIENT))
|
|
|
- .add(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_SCORE));
|
|
|
-
|
|
|
- QFilter filter = new QFilter(String.join(".", FormConstant.NCKD_JOBSEQ), QCP.equals, jobSeq.getLong(FormConstant.ID_KEY))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.is_notnull, null))
|
|
|
- .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.large_than, 0));
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.JOBSEQTOJOBLEVELQUERY,
|
|
|
- selectFields.toString(),
|
|
|
- new QFilter[]{filter},
|
|
|
- String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
- return query;
|
|
|
- }
|
|
|
|
|
|
/**
|
|
|
* 检查某个人在特定年份的考核结果是否被使用
|
|
|
@@ -521,19 +367,29 @@ public class JobLevelCalculatorService {
|
|
|
.and(new QFilter(PositionStructureConstant.NCKD_DISABLE, QCP.equals, EnableEnum.NO.getCode()))
|
|
|
.and(new QFilter(PositionStructureConstant.NCKD_FIRSTRANK,QCP.equals, EnableEnum.YES.getCode()).or(new QFilter(PositionStructureConstant.NCKD_TYPESTATE,QCP.in, new String[]{"3","4"})))
|
|
|
.and(rankScore.or(jobScore));
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
.add(PositionStructureConstant.NCKD_EXECUTEYEAR)
|
|
|
.add(PositionStructureConstant.NCKD_FIRSTRANK)
|
|
|
.add(PositionStructureConstant.NCKD_ADJUSTTYPE)
|
|
|
- .add(String.join(".", PositionStructureConstant.NCKD_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
+ .addIdNumberNameWithExtras(
|
|
|
+ new String[]{PositionStructureConstant.NCKD_JOBLEVELHR},
|
|
|
+ FormConstant.JOBLEVELSEQ
|
|
|
+ )
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_EXECUTEYEAR)
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_BEGINDATE);
|
|
|
|
|
|
int year = DateUtil.getYear(date);
|
|
|
|
|
|
- try(DataSet dataSet = QueryServiceHelper.queryDataSet(JobLevelCalculatorService.class.getName()+"#useAppraisalResult", PositionStructureConstant.PERSONPOSFILE_ENTITYID,
|
|
|
- selectFields.toString(), new QFilter[]{filer}, "nckd_executeyear desc,nckd_begindate desc")){
|
|
|
-
|
|
|
+ try (AlgoContext context = Algo.newContext()) {
|
|
|
+ DataSet dataSet = QueryServiceHelper.queryDataSet(
|
|
|
+ JobLevelCalculatorService.class.getName() + "#useAppraisalResult",
|
|
|
+ PositionStructureConstant.PERSONPOSFILE_ENTITYID,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{filer},
|
|
|
+ queryFieldBuilder.buildOrder()
|
|
|
+ );
|
|
|
// 条件1:如果调整年与初定年相同,则考核结果被使用;返回true
|
|
|
- if(dataSet
|
|
|
+ if(dataSet.copy()
|
|
|
.filter(PositionStructureConstant.NCKD_FIRSTRANK + " = true and " + PositionStructureConstant.NCKD_EXECUTEYEAR + "=" + year)
|
|
|
.count(PositionStructureConstant.NCKD_EXECUTEYEAR, false) == 1){
|
|
|
return Boolean.TRUE;
|
|
|
@@ -614,7 +470,9 @@ public class JobLevelCalculatorService {
|
|
|
return Boolean.TRUE;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
return Boolean.FALSE;
|
|
|
}
|
|
|
|
|
|
@@ -632,13 +490,19 @@ public class JobLevelCalculatorService {
|
|
|
.and(new QFilter(PositionStructureConstant.NCKD_DISABLE, QCP.equals, EnableEnum.NO.getCode()))
|
|
|
.and(rankScore.or(jobScore))
|
|
|
.and(new QFilter(String.join(".", PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NUMBER_KEY), QCP.not_equals, AppraisalResultEnum.NONE.getCode()));
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
.add(PositionStructureConstant.NCKD_FIRSTRANK)
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.ID_KEY))
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NAME_KEY));
|
|
|
+ .addIdNumberName(PositionStructureConstant.NCKD_APPRAISALRESULT)
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_EXECUTEYEAR)
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_BEGINDATE);
|
|
|
+
|
|
|
//对应SHR:PRpersonpositionfileCollection
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.PERSONPOSFILE_ENTITYID, selectFields.toString(), new QFilter[]{filer}, "nckd_executeyear desc,nckd_begindate desc");
|
|
|
+ DynamicObjectCollection query = QueryServiceHelper.query(
|
|
|
+ PositionStructureConstant.PERSONPOSFILE_ENTITYID,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{filer},
|
|
|
+ queryFieldBuilder.buildOrder()
|
|
|
+ );
|
|
|
//如果没有符合条件的记录,或者只有一条记录且为初定且考核结果为空或为考核结果为“无”,为首次聘任
|
|
|
if(query.isEmpty()){
|
|
|
return Boolean.TRUE;
|
|
|
@@ -748,7 +612,7 @@ public class JobLevelCalculatorService {
|
|
|
String currentDiplomaName = positionAppointment.getString(String.join(".", FormConstant.HRPI_PEREDUEXP, FormConstant.EDUCATION_KEY, FormConstant.NAME_KEY));
|
|
|
//对应SHR:DiplomaScore
|
|
|
//人员最新学历的积分
|
|
|
- BigDecimal currentDiplomaScore = positionAppointment.getBigDecimal(String.join(".", FormConstant.HRPI_PEREDUEXP, FormConstant.EDUCATION_KEY, FormConstant.NAME_KEY));
|
|
|
+ BigDecimal currentDiplomaScore = positionAppointment.getBigDecimal(String.join(".", FormConstant.HRPI_PEREDUEXP, FormConstant.EDUCATION_KEY, FormConstant.NCKD_SCORE));
|
|
|
//对应SHR:DiplomaScore
|
|
|
BigDecimal resultScore = currentDiplomaScore;
|
|
|
|
|
|
@@ -818,6 +682,7 @@ public class JobLevelCalculatorService {
|
|
|
BigDecimal newPerProTitleScore = positionAppointment.getBigDecimal(String.join(".", FormConstant.HRPI_PERPROTITLE, FormConstant.PROLEVEL_KEY, FormConstant.NCKD_SCORE));
|
|
|
//对应SHR:selMap.get("zgjbnumber")
|
|
|
String newPerProTitleNumber = positionAppointment.getString(String.join(".", FormConstant.HRPI_PERPROTITLE, FormConstant.PROLEVEL_KEY, FormConstant.NUMBER_KEY));
|
|
|
+ String newPerProTitleName = positionAppointment.getString(String.join(".", FormConstant.HRPI_PERPROTITLE, FormConstant.PROLEVEL_KEY, FormConstant.NAME_KEY));
|
|
|
|
|
|
//当前人员最新技能等级
|
|
|
Long newQuaLevelId = positionAppointment.getLong(String.join(".", FormConstant.HRPI_PEROCPQUAL, FormConstant.QUALEVEL_KEY, FormConstant.ID_KEY));
|
|
|
@@ -825,6 +690,7 @@ public class JobLevelCalculatorService {
|
|
|
BigDecimal newQuaLevelScore = positionAppointment.getBigDecimal(String.join(".", FormConstant.HRPI_PEROCPQUAL, FormConstant.QUALEVEL_KEY, FormConstant.NCKD_SCORE));
|
|
|
//对应SHR:selMap.get("zyjndjnumber")
|
|
|
String newQuaLevelNumber = positionAppointment.getString(String.join(".", FormConstant.HRPI_PEROCPQUAL, FormConstant.QUALEVEL_KEY, FormConstant.NUMBER_KEY));
|
|
|
+ String newQuaLevelName = positionAppointment.getString(String.join(".", FormConstant.HRPI_PEROCPQUAL, FormConstant.QUALEVEL_KEY, FormConstant.NAME_KEY));
|
|
|
|
|
|
|
|
|
JobScoreInfo jobScoreInfo = new JobScoreInfo();
|
|
|
@@ -841,7 +707,8 @@ public class JobLevelCalculatorService {
|
|
|
// 获取当前最新职称等级分
|
|
|
jobScoreInfo.perProTitleScore = newPerProTitleScore;
|
|
|
jobScoreInfo.perProTitleId = newPerProTitleId;
|
|
|
- jobScoreInfo.perProTitleNumber = StringUtils.isNotBlank(newPerProTitleNumber) ? newPerProTitleNumber : "";
|
|
|
+ jobScoreInfo.perProTitleNumber = StringUtils.isNotBlank(newPerProTitleNumber) ? newPerProTitleNumber : StringUtils.EMPTY;
|
|
|
+ jobScoreInfo.perProTitleName = StringUtils.isNotBlank(newPerProTitleName) ? newPerProTitleName : StringUtils.EMPTY;
|
|
|
jobScoreInfo.isEndGainJobGrade = false;
|
|
|
} else if (JobSeqEnum.SKILL.getCode().equals(newJobSeqNumber)) {
|
|
|
if (newQuaLevelScore != null && newQuaLevelScore.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
@@ -849,6 +716,7 @@ public class JobLevelCalculatorService {
|
|
|
jobScoreInfo.quaLevelScore = newQuaLevelScore;
|
|
|
jobScoreInfo.quaLevelId = newQuaLevelId;
|
|
|
jobScoreInfo.quaLevelNumber = StringUtils.isNotBlank(newQuaLevelNumber) ? newQuaLevelNumber: "";
|
|
|
+ jobScoreInfo.quaLevelName = StringUtils.isNotBlank(newQuaLevelName) ? newQuaLevelName: "";
|
|
|
jobScoreInfo.isEndGainJobGrade = false;
|
|
|
}
|
|
|
}
|
|
|
@@ -864,32 +732,32 @@ public class JobLevelCalculatorService {
|
|
|
private static DynamicObject calculateJobGradeId(DynamicObject newJobSeq, JobScoreInfo jobScoreInfo,JobFamilyInfo jobFamilyInfo,
|
|
|
BigDecimal allSumScore, int currentJobLevelIndex, int minusPersonAppraisal, boolean fistPR, JobLevelResult jobLevelResult){
|
|
|
|
|
|
- DynamicObject proTitleLevel = BusinessDataServiceHelper.loadSingle(jobScoreInfo.perProTitleId, FormConstant.HBSS_PROTITLELEVEL);
|
|
|
- DynamicObject ocpQualLevel = BusinessDataServiceHelper.loadSingle(jobScoreInfo.quaLevelId, FormConstant.HBSS_OCPQUALLEVEL);
|
|
|
+ String perProTitleNumber = jobScoreInfo.perProTitleNumber;
|
|
|
+ String quaLevelNumber = jobScoreInfo.quaLevelNumber;
|
|
|
JobSeqEnum jobSeqEnum = JobSeqEnum.getByCode(newJobSeq.getString(FormConstant.NUMBER_KEY));
|
|
|
DynamicObject jobLevel = null;
|
|
|
if (jobScoreInfo.isEndGainJobGrade) {
|
|
|
System.out.println("缺少聘任,技能序列必需聘任技能等级,其它序列必需聘任职称等级!");
|
|
|
//对应SHR:JobGradeid = personpositionfileUtils.endGainJobGrade(ctx, allsumScore, hrjobfamilynumber);
|
|
|
- jobLevel = getLowestJobLevel(newJobSeq);
|
|
|
+ jobLevel = getJobLevel(newJobSeq, null, null, null, null, Boolean.TRUE,Boolean.FALSE);
|
|
|
//对应SHR:selMap.put("adjusttype", "7");
|
|
|
jobLevelResult.adjustType = "7";
|
|
|
} else if (jobFamilyInfo.isSequenceChange) {
|
|
|
//对应SHR:JobGradeid = personpositionfileUtils.GainJobGrade(ctx, allsumScore, hrjobfamilynumber, zgjbnumber, zyjndjnumber, 0);
|
|
|
- jobLevel = PositionStructureHelper.calculateLevel(jobSeqEnum, allSumScore, proTitleLevel, ocpQualLevel, null, 0, Boolean.FALSE,Boolean.FALSE);
|
|
|
+ jobLevel = getJobLevel(newJobSeq, allSumScore, perProTitleNumber, quaLevelNumber, 0, Boolean.FALSE,Boolean.FALSE);
|
|
|
//序列转换
|
|
|
jobLevelResult.adjustType = "4";
|
|
|
} else if (jobFamilyInfo.isCrossUnitTransfer) {
|
|
|
//对应SHR:JobGradeid = personpositionfileUtils.GainJobGrade(ctx, allsumScore, hrjobfamilynumber, zgjbnumber, zyjndjnumber, 0);
|
|
|
- jobLevel = PositionStructureHelper.calculateLevel(jobSeqEnum, allSumScore, proTitleLevel, ocpQualLevel, null, 0, Boolean.FALSE,Boolean.FALSE);
|
|
|
+ jobLevel = getJobLevel(newJobSeq, allSumScore, perProTitleNumber, quaLevelNumber, 0, Boolean.FALSE,Boolean.FALSE);
|
|
|
//保级
|
|
|
jobLevelResult.adjustType = "1";
|
|
|
} else if (fistPR) {
|
|
|
//对应SHR:JobGradeid = personpositionfileUtils.GainJobGrade(ctx, allsumScore, hrjobfamilynumber, zgjbnumber, zyjndjnumber, minuspersonappraisal);
|
|
|
- jobLevel = PositionStructureHelper.calculateLevel(jobSeqEnum, allSumScore, proTitleLevel, ocpQualLevel, null, minusPersonAppraisal, Boolean.FALSE,Boolean.FALSE);
|
|
|
+ jobLevel = getJobLevel(newJobSeq, allSumScore, perProTitleNumber, quaLevelNumber, minusPersonAppraisal, Boolean.FALSE,Boolean.FALSE);
|
|
|
} else {
|
|
|
//对应SHR:JobGradeid = personpositionfileUtils.GainJobGrade(ctx, allsumScore, hrjobfamilynumber, zgjbnumber, zyjndjnumber, minuspersonappraisal < 0 ? minuspersonappraisal : 0);
|
|
|
- jobLevel = PositionStructureHelper.calculateLevel(jobSeqEnum, allSumScore, proTitleLevel, ocpQualLevel, null, minusPersonAppraisal < 0 ? minusPersonAppraisal : 0, Boolean.FALSE,Boolean.FALSE);
|
|
|
+ jobLevel = getJobLevel(newJobSeq, allSumScore, perProTitleNumber, quaLevelNumber, minusPersonAppraisal < 0 ? minusPersonAppraisal : 0, Boolean.FALSE,Boolean.FALSE);
|
|
|
}
|
|
|
int newJobGradeIndex = jobLevel.getInt(FormConstant.JOBLEVELSEQ);
|
|
|
System.out.println("newjobgradeindex:::" + newJobGradeIndex);
|
|
|
@@ -919,38 +787,53 @@ public class JobLevelCalculatorService {
|
|
|
groupFilter.and(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_PERSON),QCP.equals, personId);
|
|
|
groupFilter.and(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ISRANKING),QCP.equals,EnableEnum.YES.getCode());
|
|
|
//获取该员工上年度所在的排名分组
|
|
|
- DynamicObject[] groupArray = BusinessDataServiceHelper.load(PerfRankMgmtConstant.NCKD_PERFRANKMGMT_ENTITYID, FormConstant.ID_KEY+","+FormConstant.NAME_KEY,
|
|
|
+ DynamicObject[] groupArray = BusinessDataServiceHelper.load(PerfRankMgmtConstant.NCKD_PERFRANKMGMT_ENTITYID, FormConstant.ID_KEY+","+PerfRankMgmtConstant.NCKD_GROUPNAME,
|
|
|
new QFilter[]{groupFilter},
|
|
|
- FormConstant.CREATE_TIME_KEY + " desc " + FormConstant.AUDIT_DATE_KEY + " desc " + FormConstant.MODIFY_TIME_KEY + " desc");
|
|
|
+ FormConstant.CREATE_TIME_KEY + " desc," + FormConstant.AUDIT_DATE_KEY + " desc," + FormConstant.MODIFY_TIME_KEY + " desc");
|
|
|
//避免一个员工存在多个排名分组中,只取最新排名分组
|
|
|
Long groupId = null;
|
|
|
String groupName = null;
|
|
|
if(groupArray != null && groupArray.length > 0){
|
|
|
groupId = groupArray[0].getLong(FormConstant.ID_KEY);
|
|
|
- groupName = groupArray[0].getString(FormConstant.NAME_KEY);
|
|
|
+ groupName = groupArray[0].getString(PerfRankMgmtConstant.NCKD_GROUPNAME);
|
|
|
}
|
|
|
if(groupId != null && groupId > 0){
|
|
|
QFilter perfRankMgmtFilter = new QFilter(FormConstant.ID_KEY,QCP.equals,groupId);
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
+
|
|
|
+ QueryFieldBuilder selectBuilder = QueryFieldBuilder.create()
|
|
|
.add(FormConstant.ID_KEY)
|
|
|
- .add(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_PERSON,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_TOPRANK))
|
|
|
- .add(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_POSTALLOWANCE))
|
|
|
- .add(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ALLOWANCERANK))
|
|
|
- .add(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_APPRAISALRESULT))
|
|
|
- .add(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ISRANKING));
|
|
|
+ .addGroup(
|
|
|
+ new String[]{PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_PERSON},
|
|
|
+ FormConstant.ID_KEY
|
|
|
+ ).addGroup(
|
|
|
+ new String[]{PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY},
|
|
|
+ PerfRankMgmtConstant.NCKD_TOPRANK,
|
|
|
+ PerfRankMgmtConstant.NCKD_POSTALLOWANCE,
|
|
|
+ PerfRankMgmtConstant.NCKD_ALLOWANCERANK,
|
|
|
+ PerfRankMgmtConstant.NCKD_APPRAISALRESULT,
|
|
|
+ PerfRankMgmtConstant.NCKD_ISRANKING
|
|
|
+ );
|
|
|
+ String selectFields = selectBuilder.buildSelect();
|
|
|
+
|
|
|
+ QueryFieldBuilder orderByBuilder = QueryFieldBuilder.create()
|
|
|
+ .orderBy(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_TOPRANK)
|
|
|
+ .orderBy(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
+
|
|
|
+ String orderBy = orderByBuilder.buildOrder();
|
|
|
//对应SHR:allowancerankpercentSQL()方法
|
|
|
- try(DataSet dataSet = QueryServiceHelper.queryDataSet(JobLevelCalculatorService.class.getName() + "#processRankingInfo", PerfRankMgmtConstant.NCKD_PERFRANKMGMT_ENTITYID,
|
|
|
- selectFields.toString(), new QFilter[]{perfRankMgmtFilter}, PerfRankMgmtConstant.NCKD_TOPRANK + "," + PerfRankMgmtConstant.NCKD_ALLOWANCERANK)){
|
|
|
+ try(AlgoContext context = Algo.newContext()){
|
|
|
+ DataSet dataSet = QueryServiceHelper.queryDataSet(JobLevelCalculatorService.class.getName() + "#processRankingInfo", PerfRankMgmtConstant.NCKD_PERFRANKMGMT_ENTITYID,
|
|
|
+ selectFields, new QFilter[]{perfRankMgmtFilter},
|
|
|
+ String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_TOPRANK) + "," + String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ALLOWANCERANK));
|
|
|
//获取R排名总人数
|
|
|
//对应SHR:countallowancerank
|
|
|
- int countR = dataSet.filter(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ISRANKING) +" = true and "+String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_POSTALLOWANCE)+" = true")
|
|
|
+ int countR = dataSet.copy().filter(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ISRANKING) +" = true and "+String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_POSTALLOWANCE)+" = true")
|
|
|
.count(FormConstant.ID_KEY, false);
|
|
|
//获取总排名总人数
|
|
|
- int count = dataSet.filter(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ISRANKING) +" = true")
|
|
|
+ int count = dataSet.copy().filter(String.join(".",PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY,PerfRankMgmtConstant.NCKD_ISRANKING) +" = true")
|
|
|
.count(FormConstant.ID_KEY, false);
|
|
|
//获取排名
|
|
|
- DataSet topRankDataSet = dataSet.select(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_TOPRANK))
|
|
|
+ DataSet topRankDataSet = dataSet.copy().select(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_TOPRANK)+","+String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_PERSON, FormConstant.ID_KEY))
|
|
|
.filter(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_PERSON, FormConstant.ID_KEY) + " = " + personId);
|
|
|
//对应SHR:topRank
|
|
|
Integer topRank = null;
|
|
|
@@ -960,7 +843,7 @@ public class JobLevelCalculatorService {
|
|
|
}
|
|
|
|
|
|
//获取R排名
|
|
|
- DataSet allowanceRankDataSet = dataSet.select(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_ALLOWANCERANK))
|
|
|
+ DataSet allowanceRankDataSet = dataSet.copy().select(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_ALLOWANCERANK))
|
|
|
.filter(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_PERSON, FormConstant.ID_KEY) + " = " + personId);
|
|
|
//对应SHR:allowancerank
|
|
|
Integer allowanceRank = null;
|
|
|
@@ -982,7 +865,7 @@ public class JobLevelCalculatorService {
|
|
|
|
|
|
RankingResult rankingResult = new RankingResult();
|
|
|
//获取R排名最后名次
|
|
|
- DataSet maxAllowanceRank = dataSet.filter(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_ISRANKING) + " = true and " + String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_POSTALLOWANCE) + " = true")
|
|
|
+ DataSet maxAllowanceRank = dataSet.copy().filter(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_ISRANKING) + " = true and " + String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_POSTALLOWANCE) + " = true")
|
|
|
.groupBy()
|
|
|
.max(String.join(".", PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY, PerfRankMgmtConstant.NCKD_ALLOWANCERANK), "maxAllowanceRank").finish();
|
|
|
if(maxAllowanceRank.hasNext()){
|
|
|
@@ -1047,6 +930,9 @@ public class JobLevelCalculatorService {
|
|
|
|
|
|
JobSeqEnum jobSeqEnum = JobSeqEnum.getByCode(jobSeq.getString(FormConstant.NUMBER_KEY));
|
|
|
if(rankingResult == null || rankingResult.countR == null || rankingResult.allowanceRank == null){
|
|
|
+ if(rankingResult == null){
|
|
|
+ rankingResult = new RankingResult();
|
|
|
+ }
|
|
|
rankingResult.allowanceRankMark = "无";
|
|
|
rankingResult.allowanceRankSel = "无";
|
|
|
return jobLevelIndex;
|
|
|
@@ -1182,18 +1068,18 @@ public class JobLevelCalculatorService {
|
|
|
.and(new QFilter(PositionStructureConstant.NCKD_DISABLE, QCP.equals, EnableEnum.NO.getCode()))
|
|
|
.and(rankScore.or(jobScore))
|
|
|
.and(new QFilter(String.join(".", PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NUMBER_KEY), QCP.not_equals, AppraisalResultEnum.NONE.getCode()));
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
.add(PositionStructureConstant.NCKD_FIRSTRANK)
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.ID_KEY))
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NAME_KEY))
|
|
|
-
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.JOBLEVELSEQ));
|
|
|
+ .addIdNumberName(PositionStructureConstant.NCKD_APPRAISALRESULT)
|
|
|
+ .addIdNumberNameWithExtras(
|
|
|
+ new String[]{PositionStructureConstant.NCKD_JOBLEVELHR},
|
|
|
+ FormConstant.JOBLEVELSEQ
|
|
|
+ )
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_EXECUTEYEAR)
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_BEGINDATE);
|
|
|
+
|
|
|
//对应SHR:PRpersonpositionfileCollection
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.PERSONPOSFILE_ENTITYID, selectFields.toString(), new QFilter[]{filer}, "nckd_executeyear desc,nckd_begindate desc");
|
|
|
+ DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.PERSONPOSFILE_ENTITYID, queryFieldBuilder.buildSelect(), new QFilter[]{filer}, queryFieldBuilder.buildOrder());
|
|
|
if(!query.isEmpty()){
|
|
|
DynamicObject personPosFile = query.get(0);
|
|
|
int lastAppointmentJobGradeIndex = personPosFile.getInt(String.join(".", PositionStructureConstant.NCKD_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
@@ -1214,7 +1100,7 @@ public class JobLevelCalculatorService {
|
|
|
// 考核结果为保级 所以相 等
|
|
|
jobLevelIndex = lastAppointmentJobGradeIndex;
|
|
|
}
|
|
|
- if (fistPR && ((rankingResult.countR == null || rankingResult.countR == 0) || (rankingResult.allowanceRank == null || rankingResult.allowanceRank == 0))) {
|
|
|
+ if (fistPR && ((rankingResult == null || rankingResult.countR == null || rankingResult.countR == 0) || (rankingResult.allowanceRank == null || rankingResult.allowanceRank == 0))) {
|
|
|
System.out.println("首次聘任而且无R排名,保持分数算出来的职级");
|
|
|
} else {
|
|
|
System.out.println("应用R排名结果");
|
|
|
@@ -1259,17 +1145,24 @@ public class JobLevelCalculatorService {
|
|
|
.and(new QFilter(PositionStructureConstant.NCKD_DISABLE, QCP.equals, EnableEnum.NO.getCode()))
|
|
|
.and(rankScore.or(jobScore))
|
|
|
.and(new QFilter(String.join(".", PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NUMBER_KEY), QCP.not_equals, AppraisalResultEnum.NONE.getCode()));
|
|
|
- StringJoiner selectFields = new StringJoiner(",")
|
|
|
+
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
.add(PositionStructureConstant.NCKD_FIRSTRANK)
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.ID_KEY))
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(PositionStructureConstant.NCKD_APPRAISALRESULT,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.ID_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.NAME_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.NUMBER_KEY))
|
|
|
- .add(String.join(".",PositionStructureConstant.NCKD_JOBLEVELHR,FormConstant.JOBLEVELSEQ));
|
|
|
+ .addIdNumberName(PositionStructureConstant.NCKD_APPRAISALRESULT)
|
|
|
+ .addIdNumberNameWithExtras(
|
|
|
+ new String[]{PositionStructureConstant.NCKD_JOBLEVELHR},
|
|
|
+ FormConstant.JOBLEVELSEQ
|
|
|
+ )
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_EXECUTEYEAR)
|
|
|
+ .orderDesc(PositionStructureConstant.NCKD_BEGINDATE);
|
|
|
+
|
|
|
//对应SHR:PRpersonpositionfileCollection
|
|
|
- DynamicObjectCollection query = QueryServiceHelper.query(PositionStructureConstant.PERSONPOSFILE_ENTITYID, selectFields.toString(), new QFilter[]{filer}, "nckd_executeyear desc,nckd_begindate desc");
|
|
|
+ DynamicObjectCollection query = QueryServiceHelper.query(
|
|
|
+ PositionStructureConstant.PERSONPOSFILE_ENTITYID,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{filer},
|
|
|
+ queryFieldBuilder.buildOrder());
|
|
|
+
|
|
|
if (firstPR) {
|
|
|
System.out.println("前一笔为初定且考核结果为无,按首次聘任处理,所以放开限制");
|
|
|
// 首次聘任
|
|
|
@@ -1369,8 +1262,11 @@ public class JobLevelCalculatorService {
|
|
|
*/
|
|
|
//对应SHR:String personMaxjobgradeindexstr = personpositionfileUtils.MaxGainJobGrade(ctx, allsumScore, jobFamilyInfo.processedJobFamilyNumber);
|
|
|
DynamicObject maxJobLevel = getMaxJobLevel(jobSeq, allsumScore);
|
|
|
+ if(maxJobLevel == null){
|
|
|
+ throw new ValidationException(StrFormatter.format("根据职位序列【{}】和积分【{}】未获取到符合条件的职级,请检查职级配置是否有误!",jobSeq.getString(FormConstant.NAME_KEY),allsumScore));
|
|
|
+ }
|
|
|
//对应SHR:personMaxjobgradeindex
|
|
|
- int maxJobLevelIndex = maxJobLevel.getInt(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
+ int maxJobLevelIndex = maxJobLevel.getInt(FormConstant.JOBLEVELSEQ);
|
|
|
// 超出总分能任命最高职职级则该最高职级就是要任命的职级
|
|
|
if (jobLevelIndex > maxJobLevelIndex) {
|
|
|
// 总分不足
|
|
|
@@ -1387,8 +1283,19 @@ public class JobLevelCalculatorService {
|
|
|
*/
|
|
|
/*String Maxjobgradeindexstr = personpositionfileUtils.getMaxJobLevel(ctx, jobFamilyInfo.processedJobFamilyNumber,
|
|
|
jobScoreInfo.zgjbnumber, jobScoreInfo.zyjndjnumber);*/
|
|
|
- DynamicObject maxJobLevel1 = getMaxJobLevel(jobSeq, jobScoreInfo.perProTitleNumber, jobScoreInfo.quaLevelNumber);
|
|
|
- int maxJobGradeIndex = maxJobLevel1.getInt(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
+ DynamicObject maxJobLevel1 = getMaxJobLevel(jobSeq,null,null,jobScoreInfo.perProTitleNumber, jobScoreInfo.quaLevelNumber);
|
|
|
+ if(maxJobLevel1 == null){
|
|
|
+ String levelName = "";
|
|
|
+ if (JobSeqEnum.SKILL.getCode().equals(jobSeq.getString(FormConstant.NUMBER_KEY))) {
|
|
|
+ levelName = StringUtils.isNotBlank(jobScoreInfo.quaLevelName) ? jobScoreInfo.quaLevelName : "";
|
|
|
+ } else {
|
|
|
+ levelName = StringUtils.isNotBlank(jobScoreInfo.perProTitleName) ? jobScoreInfo.perProTitleName : "";
|
|
|
+ }
|
|
|
+ throw new ValidationException(StrFormatter.format("根据职位序列【{}】和职称等级/技能等级【{}】未获取到符合条件的职级,请检查职级配置是否有误!",
|
|
|
+ jobSeq.getString(FormConstant.NAME_KEY), levelName));
|
|
|
+
|
|
|
+ }
|
|
|
+ int maxJobGradeIndex = maxJobLevel1.getInt(FormConstant.JOBLEVELSEQ);
|
|
|
// 职级超出职称等级或技能等级能任命最高职职级则该最高职级就是要任命的职级
|
|
|
if (jobLevelIndex > maxJobGradeIndex) {
|
|
|
if (StringUtils.isBlank(jobLevelResult.adjustType)) {
|
|
|
@@ -1453,8 +1360,308 @@ public class JobLevelCalculatorService {
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否符合三要素
|
|
|
+ * @param jobSeq 序列
|
|
|
+ * @param score 积分
|
|
|
+ * @param proTitleLevel 职称等级
|
|
|
+ * @param ocpQualLevel 技能等级
|
|
|
+ * @param appraisalResultEnum 考核结果
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/26 11:44
|
|
|
+ */
|
|
|
+ public static boolean checkThreeElementsRequirement(DynamicObject jobSeq, BigDecimal score, DynamicObject proTitleLevel, DynamicObject ocpQualLevel,AppraisalResultEnum appraisalResultEnum){
|
|
|
+ //三要素说明:
|
|
|
+ //1、【技术序列、职能序列】:有聘任的职称等级;【技能序列】:有聘任的技能等级
|
|
|
+ //2、有考核结果
|
|
|
+ //3、积分数能够达到职级
|
|
|
+ String jobSeqNumber = jobSeq.getString(FormConstant.NUMBER_KEY);
|
|
|
+ JobSeqEnum jobSeqEnum = JobSeqEnum.getByCode(jobSeqNumber);
|
|
|
+ boolean isEligibleForJobLevel = Boolean.TRUE;
|
|
|
+ if ((jobSeqEnum == JobSeqEnum.TECHNICALS || jobSeqEnum == JobSeqEnum.FUNCTIONAL) && proTitleLevel == null) {
|
|
|
+ //【技术序列或职能序列】无职称等级
|
|
|
+ isEligibleForJobLevel = Boolean.FALSE;
|
|
|
+ } else if (jobSeqEnum == JobSeqEnum.SKILL && ocpQualLevel == null) {
|
|
|
+ //【技能序列】无技能等级
|
|
|
+ isEligibleForJobLevel = Boolean.FALSE;
|
|
|
+ }
|
|
|
+ if (appraisalResultEnum == null || AppraisalResultEnum.NONE.getCode().equals(appraisalResultEnum.getCode())) {
|
|
|
+ //无考核结果
|
|
|
+ isEligibleForJobLevel = Boolean.FALSE;
|
|
|
+ }
|
|
|
+ if(score.compareTo(new BigDecimal(18)) < 0) {
|
|
|
+ //积分数小于18
|
|
|
+ isEligibleForJobLevel = Boolean.FALSE;
|
|
|
+ }
|
|
|
+ return isEligibleForJobLevel;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算职级
|
|
|
+ * 对应SHR:com.kingdee.shr.customer.web.handler.PersonpositionfileUtils#GainJobGrade 和 com.kingdee.shr.customer.web.handler.PersonpositionfileUtils#endGainJobGrade
|
|
|
+ * @param jobSeq 职位序列(转换过的序列,例如管理序列转职能序列)
|
|
|
+ * @param score 积分数;可为空,为空则不限高;不为空则根据传入的积分限定积分所处的职级
|
|
|
+ * @param proTitleLevelNumber 职称等级编码
|
|
|
+ * @param quaLevelNumber 技能等级编码
|
|
|
+ * @param downgradeNum 降级数(根据绩效计算:基本合格:降1级、不合格:降2级)
|
|
|
+ * @param useMinLevel 是否强制按最低职级定级;如果传入true时则按最低级返回;否则按正常定级
|
|
|
+ * @param useNonLevel 是否强制按无职级定级;如果传入true时则按"无"职级返回;否则按正常定级
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject 返回:匹配的职级(joblevelhr对象)
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/13 14:21
|
|
|
+ */
|
|
|
+ public static DynamicObject getJobLevel(DynamicObject jobSeq, BigDecimal score, String proTitleLevelNumber, String quaLevelNumber,
|
|
|
+ Integer downgradeNum, boolean useMinLevel, boolean useNonLevel) {
|
|
|
+
|
|
|
+ DynamicObject jobLevel = null;
|
|
|
+ if(useNonLevel) {
|
|
|
+ //查询该序列“无职级”的数据并返回
|
|
|
+ return getNonJobLevel(jobSeq);
|
|
|
+ } else if(useMinLevel) {
|
|
|
+ //最低职级
|
|
|
+ return getLowestJobLevel(jobSeq);
|
|
|
+ }else{
|
|
|
+ return getMaxJobLevel(jobSeq, score,downgradeNum, proTitleLevelNumber, quaLevelNumber);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据职位序列获取“无”职级
|
|
|
+ * @param jobSeq 职位序列
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/20 16:52
|
|
|
+ */
|
|
|
+ public static DynamicObject getNonJobLevel(DynamicObject jobSeq){
|
|
|
+ DynamicObjectCollection jobLevels = queryJobLevels(jobSeq.getString(FormConstant.NUMBER_KEY), null, -1,
|
|
|
+ null, String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
+ DynamicObject jobLevel = !jobLevels.isEmpty() ? jobLevels.get(0) : null;
|
|
|
+ if( jobLevel != null) {
|
|
|
+ long jobLevelId = jobLevel.getLong(String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY));
|
|
|
+ //返回职级对象
|
|
|
+ return BusinessDataServiceHelper.loadSingle(jobLevelId, FormConstant.HBJM_JOBLEVELHR);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取职位序列最低职级
|
|
|
+ * @param jobSeq 职位序列
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/20 16:52
|
|
|
+ */
|
|
|
+ public static DynamicObject getLowestJobLevel(DynamicObject jobSeq) {
|
|
|
+
|
|
|
+ DynamicObjectCollection jobLevels = queryJobLevels(jobSeq.getString(FormConstant.NUMBER_KEY), null, null,
|
|
|
+ null, String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
+ DynamicObject jobLevel = !jobLevels.isEmpty() ? jobLevels.get(0) : null;
|
|
|
+ if( jobLevel != null) {
|
|
|
+ long jobLevelId = jobLevel.getLong(String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY));
|
|
|
+ //返回职级对象
|
|
|
+ return BusinessDataServiceHelper.loadSingle(jobLevelId, FormConstant.HBJM_JOBLEVELHR);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取职位序列和积分最高职级
|
|
|
+ * @param jobSeq 职位序列
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/20 16:52
|
|
|
+ */
|
|
|
+ public static DynamicObject getMaxJobLevel(DynamicObject jobSeq,BigDecimal score) {
|
|
|
+ DynamicObjectCollection jobLevels = queryJobLevels(jobSeq.getString(FormConstant.NUMBER_KEY), score, null,
|
|
|
+ null, String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ +" desc"));
|
|
|
+ DynamicObject jobLevel = !jobLevels.isEmpty() ? jobLevels.get(0) : null;
|
|
|
+ if( jobLevel != null) {
|
|
|
+ long jobLevelId = jobLevel.getLong(String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY));
|
|
|
+ //返回职级对象
|
|
|
+ return BusinessDataServiceHelper.loadSingle(jobLevelId, FormConstant.HBJM_JOBLEVELHR);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据[职位序列][积分]和[职称等级/技能等级]获取职位序列最高职级
|
|
|
+ * @param jobSeq 职位序列
|
|
|
+ * @param score 积分(可为空,为空则不限高)
|
|
|
+ * @param downgradeNum 需降级数(可为空,为空则不降级)
|
|
|
+ * @param proTitleLevelNumber 职称等级
|
|
|
+ * @param ocpQualLevelNumber 技能等级
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject 如没有获取到预期职级则返回最低职级
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/20 16:52
|
|
|
+ */
|
|
|
+ public static DynamicObject getMaxJobLevel(DynamicObject jobSeq, BigDecimal score, Integer downgradeNum, String proTitleLevelNumber, String ocpQualLevelNumber) {
|
|
|
+ jobSeq = handleJobSeq(jobSeq);
|
|
|
+ String jobSeqNumber = jobSeq.getString(FormConstant.NUMBER_KEY);
|
|
|
+ /**
|
|
|
+ * 如果没有职称等级与技能等级,则倒取该序列最低职等 如果没有职称且是非技能序列,则倒取该序列最低职等 如果是技能序列,没有技能等级但有职称等级,但职称等级没有对应的技能等级,则取该序列最低职等
|
|
|
+ */
|
|
|
+ if (StringUtils.isBlank(proTitleLevelNumber) && (StringUtils.isBlank(ocpQualLevelNumber) || !JobSeqEnum.SKILL.getCode().equals(jobSeqNumber))) {
|
|
|
+ return getLowestJobLevel(jobSeq);
|
|
|
+ }
|
|
|
+ else if (JobSeqEnum.SKILL.getCode().equals(jobSeqNumber) && StringUtils.isBlank(ocpQualLevelNumber) && StringUtils.isNotBlank(proTitleLevelNumber) && TechPostLevelNumberTojobstatusNumberMap.get(proTitleLevelNumber) == null) {
|
|
|
+ return getLowestJobLevel(jobSeq);
|
|
|
+ }
|
|
|
+ String likename = "";
|
|
|
+ String likenumber = "";
|
|
|
+ if (JobSeqEnum.SKILL.getCode().equals(jobSeqNumber)) {
|
|
|
+ if (StringUtils.isBlank(ocpQualLevelNumber)) {
|
|
|
+ likenumber = TechPostLevelNumberTojobstatusNumberMap.get(proTitleLevelNumber);
|
|
|
+ likename = "职称等级【" + proTitleLevelNumber + "】对应的技能等级";
|
|
|
+ System.out.println("技能序列但无技能等级,使用职称等级【" + proTitleLevelNumber + "】对应的技能等级,编码【" + likenumber + "】");
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ likenumber = ocpQualLevelNumber;
|
|
|
+ likename = "技能等级";
|
|
|
+ System.out.println("技能序列使用技能等级,编码【" + likenumber + "】");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ likenumber = proTitleLevelNumber;
|
|
|
+ likename = "职称等级";
|
|
|
+ System.out.println("非技能序列使用职称等级,编码【" + likenumber + "】");
|
|
|
+ }
|
|
|
+
|
|
|
+ DynamicObjectCollection jobLevels = queryJobLevels(jobSeq.getString(FormConstant.NUMBER_KEY), score, null,
|
|
|
+ likenumber, String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ + " desc"));
|
|
|
+
|
|
|
+ if(!jobLevels.isEmpty()){
|
|
|
+ if(downgradeNum != null && downgradeNum > 0) {
|
|
|
+ //降级
|
|
|
+ DynamicObject[] jobLevelByJobSeq = getJobLevelByJobSeq(jobSeq);
|
|
|
+ Map<Integer, DynamicObject> jobLevelMap = new HashMap<>();
|
|
|
+ if (jobLevelByJobSeq != null) {
|
|
|
+ String jobLevelSeqKey = FormConstant.JOBLEVELSEQ;
|
|
|
+ jobLevelMap = Arrays.stream(jobLevelByJobSeq)
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ dynamicObject -> dynamicObject.getInt(jobLevelSeqKey),
|
|
|
+ dynamicObject -> dynamicObject,
|
|
|
+ (existing, replacement) -> existing)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ //当前分数能达到的最大职级减去需降级数
|
|
|
+ int maxJobLevelSeq = jobLevels.get(0).getInt(FormConstant.JOBLEVELSEQ);
|
|
|
+ DynamicObject jobLevel = jobLevelMap.get(maxJobLevelSeq - downgradeNum);
|
|
|
+ if (jobLevel == null) {
|
|
|
+ //降级数超出则返回最低职级
|
|
|
+ return getLowestJobLevel(jobSeq);
|
|
|
+ }
|
|
|
+ return jobLevel;
|
|
|
+ }
|
|
|
+ long jobLevelId = jobLevels.get(0).getLong(String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY));
|
|
|
+ return BusinessDataServiceHelper.loadSingle(jobLevelId, FormConstant.HBJM_JOBLEVELHR);
|
|
|
+ }else{
|
|
|
+ //没有获取到预期的职级则返回最低职级
|
|
|
+ return getLowestJobLevel(jobSeq);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取职位序列对应的职级
|
|
|
+ * @param jobSeq 职位序列
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObject
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/20 16:52
|
|
|
+ */
|
|
|
+ public static DynamicObject[] getJobLevelByJobSeq(DynamicObject jobSeq) {
|
|
|
+ DynamicObjectCollection jobLevels = queryJobLevels(jobSeq.getString(FormConstant.NUMBER_KEY), null, null,
|
|
|
+ null, String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ));
|
|
|
+ List<Long> jobLevelIds = jobLevels.stream().map(dynamicObject -> dynamicObject.getLong(String.join(".", FormConstant.HBJM_JOBLEVELHR, FormConstant.ID_KEY))).collect(Collectors.toList());
|
|
|
+ QFilter idInFilter = QFilterCommonHelper.getIdInFilter(jobLevelIds);
|
|
|
+
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
+ .addIdNumberNameWithExtras(
|
|
|
+ new String[]{FormConstant.HBJM_JOBLEVELHR},
|
|
|
+ FormConstant.JOBLEVELSEQ,
|
|
|
+ FormConstant.NCKD_COEFFICIENT,
|
|
|
+ FormConstant.NCKD_SCORE
|
|
|
+ );
|
|
|
+
|
|
|
+ return BusinessDataServiceHelper.load(
|
|
|
+ FormConstant.HBJM_JOBLEVELHR,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{idInFilter},
|
|
|
+ FormConstant.JOBLEVELSEQ
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据职位序列、资格条件、积分或序列号筛选职级
|
|
|
+ * @param jobSeqNumber 职位序列编码
|
|
|
+ * @param score 积分
|
|
|
+ * @param jobLevelSeq 职级序号
|
|
|
+ * @param jobLevelNumber 资格编码
|
|
|
+ * @param orderBy 排序
|
|
|
+ * @return: kd.bos.dataentity.entity.DynamicObjectCollection
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/09/27 13:49
|
|
|
+ */
|
|
|
+ private static DynamicObjectCollection queryJobLevels(String jobSeqNumber, BigDecimal score, Integer jobLevelSeq, String jobLevelNumber, String orderBy) {
|
|
|
+
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
+ .addIdNumberNameWithExtras(
|
|
|
+ new String[]{FormConstant.HBJM_JOBLEVELHR},
|
|
|
+ FormConstant.JOBLEVELSEQ,
|
|
|
+ FormConstant.NCKD_COEFFICIENT,
|
|
|
+ FormConstant.NCKD_SCORE
|
|
|
+ );
|
|
|
+
|
|
|
+
|
|
|
+ QFilter filter = new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR,FormConstant.NCKD_SCORE), QCP.is_notnull, null)
|
|
|
+ .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.IS_CURRENT_VERSION), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.HBJM_JOBLEVELHR,FormConstant.ENABLE), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.HBJM_JOBLEVELHR,FormConstant.STATUS), QCP.equals, StatusEnum.C.toString()))
|
|
|
+ .and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.is_notnull, null));
|
|
|
+ if(score != null){
|
|
|
+ filter.and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.NCKD_SCORE), QCP.less_equals, score));
|
|
|
+ }
|
|
|
+ if(jobLevelSeq != null){
|
|
|
+ filter.and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.less_equals, jobLevelSeq));
|
|
|
+ }else{
|
|
|
+ //只查询有效的序号(无职级是-1,避免查出来)
|
|
|
+ filter.and(new QFilter(String.join(".",FormConstant.HBJM_JOBLEVELHR, FormConstant.JOBLEVELSEQ), QCP.large_than, 0));
|
|
|
+ }
|
|
|
+
|
|
|
+ DynamicObjectCollection query = null;
|
|
|
+ if(StringUtils.isBlank(jobLevelNumber)){
|
|
|
+ //根据职位序列查询
|
|
|
+ filter.and(new QFilter(String.join(".",FormConstant.NCKD_JOBSEQ,FormConstant.NUMBER_KEY), QCP.equals, jobSeqNumber))
|
|
|
+ .and(new QFilter(String.join(".",FormConstant.NCKD_JOBSEQ, FormConstant.IS_CURRENT_VERSION), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.NCKD_JOBSEQ,FormConstant.ENABLE), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.NCKD_JOBSEQ,FormConstant.STATUS), QCP.equals, StatusEnum.C.toString()));
|
|
|
+ query = QueryServiceHelper.query(PositionStructureConstant.GETLEVELBYJOBSEQ_QUERY,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{filter},
|
|
|
+ orderBy);
|
|
|
+ }else{
|
|
|
+ //根据职位序列和资格条件查询
|
|
|
+ filter.and(new QFilter(String.join(".",FormConstant.HBJM_JOBGRADESCMHR,FormConstant.NCKD_JOBSEQ,FormConstant.NUMBER_KEY), QCP.equals, jobSeqNumber))
|
|
|
+ .and(new QFilter(String.join(".",FormConstant.HBJM_JOBGRADESCMHR,FormConstant.NCKD_JOBSEQ, FormConstant.IS_CURRENT_VERSION), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.HBJM_JOBGRADESCMHR,FormConstant.NCKD_JOBSEQ,FormConstant.ENABLE), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.HBJM_JOBGRADESCMHR,FormConstant.NCKD_JOBSEQ,FormConstant.STATUS), QCP.equals, StatusEnum.C.toString()))
|
|
|
+ .and(new QFilter(String.join(".",FormConstant.IS_CURRENT_VERSION), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.ENABLE), QCP.equals, EnableEnum.YES.getCode()))
|
|
|
+ .and(new QFilter(String.join( ".",FormConstant.STATUS), QCP.equals, StatusEnum.C.toString()));
|
|
|
+ filter.and(new QFilter(FormConstant.NCKD_JOBLEVELNUMBER, QCP.like, "%"+jobLevelNumber+"%"));
|
|
|
+ query = QueryServiceHelper.query(PositionStructureConstant.GETLEVELBYJOBSEQQUERYANDQUAL_QUERY,
|
|
|
+ queryFieldBuilder.buildSelect(),
|
|
|
+ new QFilter[]{filter},
|
|
|
+ orderBy);
|
|
|
+ }
|
|
|
+ return query;
|
|
|
+ }
|
|
|
+
|
|
|
// 辅助类定义
|
|
|
- private static class JobFamilyInfo {
|
|
|
+ public static class JobFamilyInfo {
|
|
|
/** 是否为序列转换 */
|
|
|
//对应SHR:isadjusttype_4
|
|
|
boolean isSequenceChange;
|
|
|
@@ -1476,6 +1683,10 @@ public class JobLevelCalculatorService {
|
|
|
String perProTitleNumber;
|
|
|
/** 技能等级编码 */
|
|
|
String quaLevelNumber;
|
|
|
+ /** 职称级别名称 */
|
|
|
+ String perProTitleName;
|
|
|
+ /** 技能等级名称 */
|
|
|
+ String quaLevelName;
|
|
|
/** 是否缺少聘任 */
|
|
|
boolean isEndGainJobGrade;
|
|
|
}
|
|
|
@@ -1515,7 +1726,4 @@ public class JobLevelCalculatorService {
|
|
|
public String adjustMsg;
|
|
|
public DynamicObject jobLevel;
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+}
|