|
|
@@ -32,10 +32,12 @@ import nckd.jxccl.opmc.pm.common.PerfManagerFormConstant;
|
|
|
import nckd.jxccl.opmc.pm.helper.PerfManagerHelper;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
|
|
+import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Arrays;
|
|
|
import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
import java.util.Date;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
@@ -161,29 +163,36 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
|
|
|
}
|
|
|
|
|
|
//获取已归档人员,已归档人员不能修改考核结果
|
|
|
- QueryFieldBuilder perfArchiveRecordQueryFieldBuilder = QueryFieldBuilder.create().addIdNumberName(FormConstant.NCKD_PERSON);
|
|
|
+ QueryFieldBuilder perfArchiveRecordQueryFieldBuilder = QueryFieldBuilder.create()
|
|
|
+ .addIdNumberName(FormConstant.NCKD_PERSON)
|
|
|
+ .add(PerfManagerFormConstant.NCKD_YEAR);
|
|
|
QFilter perfArchiveRecordFilter = new QFilter(FormConstant.NCKD_PERSON, QCP.in, personBeginYearMap.keySet());
|
|
|
//查找已归档的记录(状态为1)
|
|
|
perfArchiveRecordFilter = perfArchiveRecordFilter.and(new QFilter(PerfManagerFormConstant.NCKD_ARCHIVESTATUS, QCP.equals, "1"));
|
|
|
DynamicObjectCollection perfArchiveRecordQuery = QueryServiceHelper.query(PerfManagerFormConstant.PERFARCHIVERECORD_ENTITYID, perfArchiveRecordQueryFieldBuilder.buildSelect(), new QFilter[]{perfArchiveRecordFilter});
|
|
|
- // 创建已归档人员ID集合
|
|
|
- Set<Long> archivedPersonIds = perfArchiveRecordQuery.stream()
|
|
|
- .map(obj -> obj.getLong(String.join( ".",FormConstant.NCKD_PERSON,FormConstant.ID_KEY)))
|
|
|
- .collect(Collectors.toSet());
|
|
|
+ // 创建已归档人员ID和年度的映射集合
|
|
|
+ Map<Long, List<Date>> archivedPersonYearPairs = perfArchiveRecordQuery.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY)),
|
|
|
+ Collectors.mapping(obj -> obj.getDate(PerfManagerFormConstant.NCKD_YEAR), Collectors.toList())
|
|
|
+ ));
|
|
|
//加载数据库中考核结果(用于后续判断是否变更)
|
|
|
- Map<Long,String> entryResultMap = new HashMap<>();
|
|
|
- if(!archivedPersonIds.isEmpty() && !entryIds.isEmpty()){
|
|
|
+ Map<Long,List<DynamicObject>> entryResultMap = new HashMap<>();
|
|
|
+ if(!archivedPersonYearPairs.isEmpty()){
|
|
|
QueryFieldBuilder perfManagerEntryQueryFieldBuilder = QueryFieldBuilder.create()
|
|
|
+ .add(FormConstant.ID_KEY)
|
|
|
+ .add(PerfManagerFormConstant.NCKD_BEGINYEAR)
|
|
|
+ .add(PerfManagerFormConstant.NCKD_ENDYEAR)
|
|
|
.add(PerfManagerFormConstant.NCKD_SALARYADJUSTGENFLAG)
|
|
|
.add(PerfManagerFormConstant.NCKD_PERFMANAGERENTRY,FormConstant.ID_KEY)
|
|
|
+ .add(PerfManagerFormConstant.NCKD_PERFMANAGERENTRY,PerfManagerFormConstant.NCKD_APPRAISALYEAR)
|
|
|
.addIdNumberName(PerfManagerFormConstant.NCKD_PERFMANAGERENTRY,PerfManagerFormConstant.NCKD_APPRAISALRESULT);
|
|
|
- QFilter perfManagerEntryFilter = new QFilter(String.join( ".",PerfManagerFormConstant.NCKD_PERFMANAGERENTRY,FormConstant.ID_KEY), QCP.in, entryIds);
|
|
|
+ QFilter perfManagerEntryFilter = new QFilter(FormConstant.ID_KEY, QCP.in, ids);
|
|
|
DynamicObjectCollection query = QueryServiceHelper.query(PerfManagerFormConstant.PERFMANAGER_ENTITYID, perfManagerEntryQueryFieldBuilder.buildSelect(), new QFilter[]{perfManagerEntryFilter});
|
|
|
entryResultMap = query.stream()
|
|
|
- .collect(Collectors.toMap(
|
|
|
- obj -> obj.getLong(String.join(".", PerfManagerFormConstant.NCKD_PERFMANAGERENTRY, FormConstant.ID_KEY)),
|
|
|
- obj -> obj.getString(String.join(".", PerfManagerFormConstant.NCKD_PERFMANAGERENTRY, PerfManagerFormConstant.NCKD_APPRAISALRESULT, FormConstant.NUMBER_KEY))
|
|
|
- ));
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ obj -> obj.getLong(FormConstant.ID_KEY))
|
|
|
+ );
|
|
|
|
|
|
}
|
|
|
Map<Long, DynamicObject> dbMap = new HashMap<>();
|
|
|
@@ -308,7 +317,9 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
|
|
|
|
|
|
//如果是更新则需要校验是否更改已归档的考核结果
|
|
|
if(isUpdate) {
|
|
|
- if(!entryIds.isEmpty() && !entryResultMap.isEmpty()) {
|
|
|
+
|
|
|
+
|
|
|
+ /* if(!entryIds.isEmpty() && !entryResultMap.isEmpty()) {
|
|
|
for (DynamicObject entry : entrys) {
|
|
|
long entryId = entry.getLong(FormConstant.ID_KEY);
|
|
|
if (entryId > 0) {
|
|
|
@@ -326,7 +337,7 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }*/
|
|
|
if(!dbMap.isEmpty()){
|
|
|
DynamicObject dbPerManager = dbMap.get(id);
|
|
|
boolean salaryAdjustGenFlag = dbPerManager.getBoolean(PerfManagerFormConstant.NCKD_SALARYADJUSTGENFLAG);
|
|
|
@@ -339,6 +350,69 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
|
|
|
|
|
|
}
|
|
|
|
|
|
+ if(isUpdate){
|
|
|
+ //如果已归档则不能修改考核周期和考核结果
|
|
|
+ List<DynamicObject> dbPefList = entryResultMap.get(id);
|
|
|
+ if(dbPefList != null) {
|
|
|
+ boolean isArchived = false;
|
|
|
+ for (DynamicObject dbPef : dbPefList) {
|
|
|
+ LocalDateTime dbBeginYear = DateUtil.toLocalDateTime(dbPef.getDate(PerfManagerFormConstant.NCKD_BEGINYEAR));
|
|
|
+ LocalDateTime dbEndDate = DateUtil.toLocalDateTime(dbPef.getDate(PerfManagerFormConstant.NCKD_ENDYEAR));
|
|
|
+ List<Date> dates = archivedPersonYearPairs.get(personId);
|
|
|
+ // 获取dates中年份最大的日期
|
|
|
+ Date maxDate = dates.stream()
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .max(Comparator.comparing(date -> DateUtil.toLocalDateTime(date).getYear()))
|
|
|
+ .orElse(null);
|
|
|
+ if (maxDate != null) {
|
|
|
+ LocalDateTime maxLocalDate = DateUtil.toLocalDateTime(maxDate);
|
|
|
+ if (maxLocalDate.getYear() >= dbBeginYear.getYear() || maxLocalDate.getYear() >= dbEndDate.getYear()) {
|
|
|
+ //判断本次是否有变更,如果有变更返回错误
|
|
|
+ if(!isArchived) {
|
|
|
+ if (dbBeginYear.getYear() != beginYear.getYear() || dbEndDate.getYear() != endYear.getYear()) {
|
|
|
+ addFatalErrorMessage(rowDataEntity,
|
|
|
+ StrFormatter.format("人员【{}】考核周期已归档,不能修改【{}】年及之前的考核周期范围。",
|
|
|
+ personName,
|
|
|
+ maxLocalDate.getYear()));
|
|
|
+ }
|
|
|
+ isArchived = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Date appraisalYear = dbPef.getDate(String.join(".", PerfManagerFormConstant.NCKD_PERFMANAGERENTRY, PerfManagerFormConstant.NCKD_APPRAISALYEAR));
|
|
|
+ if (appraisalYear != null) {
|
|
|
+ LocalDateTime appraisalYearLocalDate = DateUtil.toLocalDateTime(appraisalYear);
|
|
|
+ String dbAppraisalResultNumber = dbPef.getString(String.join(".", PerfManagerFormConstant.NCKD_PERFMANAGERENTRY, PerfManagerFormConstant.NCKD_APPRAISALRESULT, FormConstant.NUMBER_KEY));
|
|
|
+ String dbAppraisalResultName = dbPef.getString(String.join(".", PerfManagerFormConstant.NCKD_PERFMANAGERENTRY, PerfManagerFormConstant.NCKD_APPRAISALRESULT, FormConstant.NAME_KEY));
|
|
|
+ if(entrys != null && !entrys.isEmpty()) {
|
|
|
+ for (DynamicObject entry : entrys) {
|
|
|
+ DynamicObject appraisalResult = entry.getDynamicObject(PerfManagerFormConstant.NCKD_APPRAISALRESULT);
|
|
|
+ String appraisalResultNumber = appraisalResult != null ? appraisalResult.getString(FormConstant.NUMBER_KEY) : null;
|
|
|
+ if (maxLocalDate.getYear() >= appraisalYearLocalDate.getYear()) {
|
|
|
+ if (!Objects.equals(appraisalResultNumber, dbAppraisalResultNumber)) {
|
|
|
+ addFatalErrorMessage(rowDataEntity,
|
|
|
+ StrFormatter.format("人员【{}】考核周期已归档,不能修改【{}】年的考核结果,修改前考核结果【{}】。",
|
|
|
+ personName,
|
|
|
+ appraisalYearLocalDate.getYear(),
|
|
|
+ dbAppraisalResultName));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ if(entrys != null && !entrys.isEmpty()) {
|
|
|
+ //原来没有考核结果
|
|
|
+ addFatalErrorMessage(rowDataEntity,
|
|
|
+ StrFormatter.format("人员【{}】考核周期已归档,不能修改【{}】年及之前的考核结果。",
|
|
|
+ personName,
|
|
|
+ maxLocalDate.getYear()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
//规则: 如果年度排名管理中已存在某年度的考核结果,则不允许在人员考评管理中修改该年度的考核结果。
|
|
|
//规则: 对于已处理的调薪情况,不允许修改或删除相关的年度考核结果。
|
|
|
}
|
|
|
@@ -859,4 +933,21 @@ public class PerfManagerSaveOpPlugin extends AbstractOperationServicePlugIn impl
|
|
|
this.actEndYear = actEndYear;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从日期对象中提取年份
|
|
|
+ *
|
|
|
+ * @param date 日期对象
|
|
|
+ * @return 年份
|
|
|
+ */
|
|
|
+ private int getYearFromDate(Object date) {
|
|
|
+ if (date == null) {
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ if (date instanceof LocalDate) {
|
|
|
+ return ((LocalDate) date).getYear();
|
|
|
+ }
|
|
|
+ // 如果是其他日期类型,可以添加相应的处理逻辑
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
}
|