|
|
@@ -1,17 +1,23 @@
|
|
|
package nckd.jxccl.hr.psms.plugin.form.performance;
|
|
|
|
|
|
+import com.google.common.collect.Lists;
|
|
|
import kd.bos.bill.IBillView;
|
|
|
+import kd.bos.bill.OperationStatus;
|
|
|
import kd.bos.common.enums.EnableEnum;
|
|
|
import kd.bos.dataentity.OperateOption;
|
|
|
import kd.bos.dataentity.RefObject;
|
|
|
import kd.bos.dataentity.entity.DynamicObject;
|
|
|
import kd.bos.dataentity.entity.DynamicObjectCollection;
|
|
|
+import kd.bos.dataentity.metadata.IDataEntityProperty;
|
|
|
import kd.bos.dataentity.metadata.dynamicobject.DynamicObjectType;
|
|
|
import kd.bos.entity.EntityMetadataCache;
|
|
|
import kd.bos.entity.QueryEntityType;
|
|
|
+import kd.bos.entity.constant.StatusEnum;
|
|
|
import kd.bos.entity.datamodel.IDataModel;
|
|
|
import kd.bos.entity.datamodel.RowDataEntity;
|
|
|
import kd.bos.entity.datamodel.events.AfterAddRowEventArgs;
|
|
|
+import kd.bos.entity.datamodel.events.BeforeImportEntryEventArgs;
|
|
|
+import kd.bos.entity.datamodel.events.ChangeData;
|
|
|
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
|
|
|
import kd.bos.ext.hr.service.query.QueryEntityHelper;
|
|
|
import kd.bos.form.ConfirmCallBackListener;
|
|
|
@@ -24,28 +30,36 @@ import kd.bos.form.events.BeforeDoOperationEventArgs;
|
|
|
import kd.bos.form.events.MessageBoxClosedEvent;
|
|
|
import kd.bos.form.operate.FormOperate;
|
|
|
import kd.bos.form.plugin.AbstractFormPlugin;
|
|
|
+import kd.bos.form.plugin.IFormPlugin;
|
|
|
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.plugin.sample.dynamicform.pcform.form.template.ConfirmCallBack;
|
|
|
import kd.bos.servicehelper.QueryServiceHelper;
|
|
|
import kd.sdk.plugin.Plugin;
|
|
|
import nckd.jxccl.base.common.constant.FormConstant;
|
|
|
import nckd.jxccl.base.common.constant.SystemQueryConstant;
|
|
|
import nckd.jxccl.base.common.enums.AppraisalResultEnum;
|
|
|
+import nckd.jxccl.base.common.enums.psms.JobSeqEnum;
|
|
|
import nckd.jxccl.base.common.utils.ConvertUtil;
|
|
|
import nckd.jxccl.base.common.utils.DateUtil;
|
|
|
import nckd.jxccl.base.common.utils.QueryFieldBuilder;
|
|
|
import nckd.jxccl.hr.psms.common.PerfRankMgmtConstant;
|
|
|
import nckd.jxccl.hr.psms.common.PositionStructureConstant;
|
|
|
import nckd.jxccl.hr.psms.helper.PositionFileHelper;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.apache.commons.lang3.Strings;
|
|
|
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.util.Arrays;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.Date;
|
|
|
import java.util.EventObject;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.stream.Collectors;
|
|
|
import java.util.stream.Stream;
|
|
|
|
|
|
@@ -56,7 +70,7 @@ import java.util.stream.Stream;
|
|
|
* @date 2025/10/20 15:11
|
|
|
* @version 1.0
|
|
|
*/
|
|
|
-public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin {
|
|
|
+public class PerfrankMgmtFormPlugin extends ConfirmCallBack implements Plugin {
|
|
|
|
|
|
private static final Log logger = LogFactory.getLog(PerfrankMgmtFormPlugin.class);
|
|
|
|
|
|
@@ -65,6 +79,8 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
@Override
|
|
|
public void afterBindData(EventObject e) {
|
|
|
sortEntry();
|
|
|
+ // 该单据不需要审批,默认为暂存状态
|
|
|
+ this.getModel().setValue(FormConstant.STATUS, StatusEnum.A.toString());
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -84,6 +100,37 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void beforePropertyChanged(PropertyChangedArgs e) {
|
|
|
+ String name = e.getProperty().getName();
|
|
|
+ if (PerfRankMgmtConstant.NCKD_ADMINORG.equalsIgnoreCase(name)) {
|
|
|
+ ChangeData[] changeSet = e.getChangeSet();
|
|
|
+ Long newValueId = ConvertUtil.toLong(changeSet[0].getNewValue(),null);
|
|
|
+ Object oldValue = ConvertUtil.toDynamicObjectOrNull(changeSet[0].getOldValue());
|
|
|
+ Long oldValueId = oldValue == null ? null : ConvertUtil.toLong(oldValue, null);
|
|
|
+ if(!Objects.equals(newValueId, oldValueId)) {
|
|
|
+ DynamicObjectCollection entryEntities = getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
+ boolean hasNonEmptyPerson = entryEntities.stream()
|
|
|
+ .anyMatch(entry -> entry.getDynamicObject(PerfRankMgmtConstant.NCKD_PERSON) != null);
|
|
|
+ if(hasNonEmptyPerson) {
|
|
|
+ // 直接弹出确认框,无需回滚
|
|
|
+ // 表单字段修改前交互
|
|
|
+ this.getView().showConfirm(
|
|
|
+ "确认修改【所属组织】吗?",
|
|
|
+ "请注意:修改【所属组织】会导致排名单元范围变化会清空现有排名名单。您需要在之后重新生成。确认要修改吗?",
|
|
|
+ MessageBoxOptions.OKCancel,
|
|
|
+ ConfirmTypes.Delete,
|
|
|
+ new ConfirmCallBackListener(PerfRankMgmtConstant.NCKD_ADMINORG, this)
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
@Override
|
|
|
public void propertyChanged(PropertyChangedArgs e) {
|
|
|
String name = e.getProperty().getName();
|
|
|
@@ -91,17 +138,43 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
PerfRankMgmtConstant.NCKD_ALLOWANCERANK, PerfRankMgmtConstant.NCKD_POSTALLOWANCE,
|
|
|
PerfRankMgmtConstant.NCKD_TOPRANK)
|
|
|
.anyMatch(prop -> prop.equalsIgnoreCase(name))){
|
|
|
+ //排名信息变化计算排名数
|
|
|
calcRankCount();
|
|
|
+ }else if(FormConstant.NCKD_PERSON.equalsIgnoreCase(name)){
|
|
|
+ //变更或选择人员重新获取是否享受职位津贴
|
|
|
+ ChangeData[] changeSet = e.getChangeSet();
|
|
|
+ Object newValue = changeSet[0].getNewValue();
|
|
|
+ Object oldValue = changeSet[0].getOldValue();
|
|
|
+ if(newValue != null && !Objects.equals(newValue, oldValue)) {
|
|
|
+ DynamicObject newPerson = ConvertUtil.toDynamicObject(newValue);
|
|
|
+ long newValueId = newPerson.getLong(FormConstant.ID_KEY);
|
|
|
+ Date now = new Date();
|
|
|
+ Map<Long, Boolean> entitledToAllowance = isEntitledToAllowance(Collections.singletonList(newValueId), now);
|
|
|
+ boolean hasAllowance = entitledToAllowance.get(newValueId);
|
|
|
+ this.getModel().setValue(PerfRankMgmtConstant.NCKD_POSTALLOWANCE, hasAllowance,changeSet[0].getRowIndex());
|
|
|
+ this.getView().updateView(PerfRankMgmtConstant.NCKD_POSTALLOWANCE,changeSet[0].getRowIndex());
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void beforeImportEntry(BeforeImportEntryEventArgs e) {
|
|
|
+ super.beforeImportEntry(e);
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public void beforeDoOperation(BeforeDoOperationEventArgs args) {
|
|
|
FormOperate operate = (FormOperate) args.getSource();
|
|
|
String itemKey = operate.getOperateKey();
|
|
|
if(PerfRankMgmtConstant.GETRANKLIST_OP.equalsIgnoreCase(itemKey)) {
|
|
|
+ DynamicObject adminOrg = ConvertUtil.toDynamicObjectOrNull(this.getModel().getValue(FormConstant.NCKD_ADMINORG));
|
|
|
+ if(adminOrg == null) {
|
|
|
+ this.getView().showTipNotification("请先选择“所属组织”");
|
|
|
+ args.setCancel(true);
|
|
|
+ return;
|
|
|
+ }
|
|
|
RefObject<String> afterConfirm = new RefObject<>();
|
|
|
if (!operate.getOption().tryGetVariableValue("afterConfirm", afterConfirm)) {
|
|
|
//判断是否已获取过名单,如获取过再获取提示用户数据会丢失
|
|
|
@@ -119,7 +192,7 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
if (isGetRank) {
|
|
|
// 取消当前操作,等待用户确认
|
|
|
args.setCancel(true);
|
|
|
- //询问对话
|
|
|
+ //询问对话,交互
|
|
|
this.getView().showConfirm(
|
|
|
"已获取过排名名单了,重新获取将会覆盖(系统生成部分)现有人员名单是否继续操作?",
|
|
|
MessageBoxOptions.OKCancel,
|
|
|
@@ -147,6 +220,14 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
// 用户选择“否”,中断操作
|
|
|
this.getView().showTipNotification("操作已取消");
|
|
|
}
|
|
|
+ }else if(PerfRankMgmtConstant.NCKD_ADMINORG.equalsIgnoreCase(evt.getCallBackId())){
|
|
|
+ // 用户确认:允许修改继续,并清空分录
|
|
|
+ if (evt.getResult() == MessageBoxResult.Yes) {
|
|
|
+ DynamicObjectCollection entryEntities = getModel().getEntryEntity(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
+ entryEntities.clear();
|
|
|
+ getModel().updateEntryCache(entryEntities);
|
|
|
+ getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -154,116 +235,161 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
|
|
|
String itemKey = afterDoOperationEventArgs.getOperateKey();
|
|
|
if(PerfRankMgmtConstant.GETRANKLIST_OP.equalsIgnoreCase(itemKey)){
|
|
|
- IBillView billView = (IBillView)this.getView();
|
|
|
+ /*IBillView billView = (IBillView)this.getView();
|
|
|
+ //判断单据是否已保存
|
|
|
boolean isFormDb = billView.getModel().getDataEntity().getDataEntityState().getFromDatabase();
|
|
|
+ // 获取修改但还没保存的字段
|
|
|
+ DynamicObject dataEntity = this.getModel().getDataEntity(true);
|
|
|
+ List<IDataEntityProperty> iDataEntityProperties = dataEntity.getDataEntityState().GetDirtyProperties();
|
|
|
+ boolean hasAdminOrgId = iDataEntityProperties.stream()
|
|
|
+ .anyMatch(property -> property.getName().equalsIgnoreCase(FormConstant.NCKD_ADMINORG + "_" + FormConstant.ID_KEY));
|
|
|
if (!isFormDb) {
|
|
|
billView.showTipNotification("请保存后再获取排名名单");
|
|
|
- }else{
|
|
|
+ } else if(hasAdminOrgId){
|
|
|
+ billView.showTipNotification("由于您修改了【所属组织】但还没有保存,请保存之后在获取排名名单");
|
|
|
+ }else{*/
|
|
|
IDataModel model = this.getModel();
|
|
|
- DynamicObject adminOrg = ConvertUtil.toDynamicObject(model.getValue(FormConstant.NCKD_ADMINORG));
|
|
|
- String structLongNumber = adminOrg.getString(FormConstant.STRUCTLONGNUMBER);
|
|
|
- //查询所选组织下的人员
|
|
|
- QFilter qFilter = new QFilter(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.ADMINORG, FormConstant.STRUCTLONGNUMBER), QCP.like, structLongNumber + "%");
|
|
|
- //在职人员
|
|
|
- qFilter.and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS,FormConstant.IS_HIRED), QCP.equals, EnableEnum.YES.getCode());
|
|
|
- QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
- //用工关系状态.编码(1005_S 在职-试用中、1010_S 在职、1020_S 离职、1030_S 已退休),istrial:是否试用,ishired:是否在职
|
|
|
- .addGroup(new String[]{FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS}, FormConstant.NUMBER_KEY, FormConstant.NAME_KEY, FormConstant.IS_TRIAL, FormConstant.IS_HIRED)
|
|
|
- //任职状态分类(1010_S:在岗,1030_S:不在岗)
|
|
|
- .addGroup(new String[]{FormConstant.HRPI_EMPPOSORGREL, FormConstant.POS_STATUS, FormConstant.POST_STATE_CLS}, FormConstant.NUMBER_KEY)
|
|
|
- //入职日期
|
|
|
- .addGroup(new String[]{FormConstant.HRPI_EMPENTREL}, FormConstant.ENTRYDATE)
|
|
|
- //职务级别
|
|
|
- .addGroup(new String[]{FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE}, FormConstant.NAME_KEY, FormConstant.NUMBER_KEY, FormConstant.NCKD_SORTNUM)
|
|
|
- .addGroup(new String[]{FormConstant.EMPLOYEE_KEY}, FormConstant.ID_KEY, FormConstant.NAME_KEY, FormConstant.EMP_NUMBER_KEY);
|
|
|
-
|
|
|
- // -------------------------------- 1、查询组织下的在职人员 --------------------------------
|
|
|
- QueryEntityType queryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityType(SystemQueryConstant.HSPM_ASSIGNMENTQUERY);
|
|
|
- DynamicObjectCollection personList = QueryEntityHelper.getInstance().getQueryDyoColl(queryEntityType, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter},queryFieldBuilder.buildOrder());
|
|
|
- //添加分录
|
|
|
- DynamicObjectCollection entryEntityCols = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
- //根据条件删除分录
|
|
|
-
|
|
|
- // -------------------------------- 2、删除系统生成部分人员 --------------------------------
|
|
|
- //删除系统生成部分人员
|
|
|
- entryEntityCols.removeIf(obj -> EnableEnum.NO.getCode().equals(obj.getString(PerfRankMgmtConstant.NCKD_RANKSOURCE)));
|
|
|
-
|
|
|
- List<Long> personIds = personList.stream()
|
|
|
- .map(person -> person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)))
|
|
|
- .collect(Collectors.toList());
|
|
|
- if(!personIds.isEmpty()) {
|
|
|
-
|
|
|
- // -------------------------------- 3、获取人员对应的职级 --------------------------------
|
|
|
- //获取职位积分档案,用于判断是否有职级;职级大于0默认勾选“职位津贴”
|
|
|
- DynamicObject[] newestPersonPosFileByPerson = PositionFileHelper.getNewestPersonPosFileByPerson(personIds.toArray(new Long[0]));
|
|
|
- Map<Long, Long> personJobLevelMap = Arrays.stream(newestPersonPosFileByPerson)
|
|
|
- .collect(Collectors.toMap(
|
|
|
- obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY)),
|
|
|
- obj -> obj.getLong(String.join(".", PositionStructureConstant.NCKD_JOBLEVELHR, FormConstant.JOBLEVELSEQ))
|
|
|
- ));
|
|
|
-
|
|
|
- // -------------------------------- 4、获取管理人员职位津贴配置 --------------------------------
|
|
|
- //获取《管理人员职位津贴》,存在则默认勾选“职位津贴”
|
|
|
- //查询在当前时间范围内的数据。NCKD_STARTDATE,NCKD_ENDDATE
|
|
|
- Date now = new Date();
|
|
|
- QFilter managerAllowanceFilter = new QFilter(FormConstant.NCKD_STARTDATE, QCP.less_equals, now)
|
|
|
- .and(FormConstant.NCKD_ENDDATE, QCP.large_equals,now)
|
|
|
- .and(FormConstant.NCKD_PERSON, QCP.in, personIds);
|
|
|
- DynamicObjectCollection managerAllowancQuery = QueryServiceHelper.query(PositionStructureConstant.MANAGERALLOWANCE_ENTITYID, String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY), new QFilter[]{managerAllowanceFilter});
|
|
|
- Map<Long, Boolean> managerAllowanceMap = managerAllowancQuery.stream()
|
|
|
- .collect(Collectors.toMap(
|
|
|
- obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY)),
|
|
|
- obj -> Boolean.TRUE
|
|
|
- ));
|
|
|
-
|
|
|
- // -------------------------------- 4、加载数据到分录 --------------------------------
|
|
|
- for (DynamicObject person : personList) {
|
|
|
- DynamicObject entryCol = entryEntityCols.addNew();
|
|
|
- long personId = person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
|
|
|
- String personName = person.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.NAME_KEY));
|
|
|
- String personNumber = person.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.EMP_NUMBER_KEY));
|
|
|
-
|
|
|
- DynamicObjectType type = EntityMetadataCache.getDataEntityType(FormConstant.HRPI_EMPLOYEE);
|
|
|
- DynamicObject personObj = (DynamicObject)type.createInstance();
|
|
|
- personObj.set(FormConstant.ID_KEY, personId);
|
|
|
- personObj.set(FormConstant.NAME_KEY, personName);
|
|
|
- personObj.set(FormConstant.EMP_NUMBER_KEY, personNumber);
|
|
|
- entryCol.set(FormConstant.NCKD_PERSON, personObj);
|
|
|
- //是否试用
|
|
|
- boolean isTrial = person.getBoolean(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_TRIAL));
|
|
|
- //入职日期
|
|
|
- Date entryDate = person.getDate(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.ENTRYDATE));
|
|
|
- //职务级别编码
|
|
|
- Integer posGradeSort = null;
|
|
|
- if (person.containsProperty(FormConstant.NCKD_HRPI_PARTYPOSH)
|
|
|
- && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE))
|
|
|
- && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM))) {
|
|
|
- posGradeSort = person.getInt(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM));
|
|
|
- }
|
|
|
- StringBuilder reason = new StringBuilder();
|
|
|
- boolean participateRank = isParticipateRank(isTrial, entryDate, posGradeSort, reason);
|
|
|
- entryCol.set(PerfRankMgmtConstant.NCKD_ISRANKING, participateRank);
|
|
|
- entryCol.set(PerfRankMgmtConstant.NCKD_EXCLUDERANKREASON, reason.toString());
|
|
|
- entryCol.set(PerfRankMgmtConstant.NCKD_RANKSOURCE, EnableEnum.NO.getCode());
|
|
|
- //判断是否有职位津贴
|
|
|
- boolean hasAllowance = personJobLevelMap.containsKey(personId) && personJobLevelMap.get(personId) > 0 || managerAllowanceMap.containsKey(personId);
|
|
|
- entryCol.set(PerfRankMgmtConstant.NCKD_POSTALLOWANCE, hasAllowance);
|
|
|
+ DynamicObject adminOrg = ConvertUtil.toDynamicObjectOrNull(model.getValue(FormConstant.NCKD_ADMINORG));
|
|
|
+ if(adminOrg != null) {
|
|
|
+ String structLongNumber = adminOrg.getString(FormConstant.STRUCTLONGNUMBER);
|
|
|
+ //查询所选组织下的人员
|
|
|
+ QFilter qFilter = new QFilter(String.join(".", FormConstant.HRPI_EMPPOSORGREL, FormConstant.ADMINORG, FormConstant.STRUCTLONGNUMBER), QCP.like, structLongNumber + "%");
|
|
|
+ //在职人员
|
|
|
+ qFilter.and(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_HIRED), QCP.equals, EnableEnum.YES.getCode());
|
|
|
+ QueryFieldBuilder queryFieldBuilder = QueryFieldBuilder.create()
|
|
|
+ //用工关系状态.编码(1005_S 在职-试用中、1010_S 在职、1020_S 离职、1030_S 已退休),istrial:是否试用,ishired:是否在职
|
|
|
+ .addGroup(new String[]{FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS}, FormConstant.NUMBER_KEY, FormConstant.NAME_KEY, FormConstant.IS_TRIAL, FormConstant.IS_HIRED)
|
|
|
+ //任职状态分类(1010_S:在岗,1030_S:不在岗)
|
|
|
+ .addGroup(new String[]{FormConstant.HRPI_EMPPOSORGREL, FormConstant.POS_STATUS, FormConstant.POST_STATE_CLS}, FormConstant.NUMBER_KEY)
|
|
|
+ //入职日期
|
|
|
+ .addGroup(new String[]{FormConstant.HRPI_EMPENTREL}, FormConstant.ENTRYDATE)
|
|
|
+ //职务级别
|
|
|
+ .addGroup(new String[]{FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE}, FormConstant.NAME_KEY, FormConstant.NUMBER_KEY, FormConstant.NCKD_SORTNUM)
|
|
|
+ .addGroup(new String[]{FormConstant.EMPLOYEE_KEY}, FormConstant.ID_KEY, FormConstant.NAME_KEY, FormConstant.EMP_NUMBER_KEY);
|
|
|
+
|
|
|
+ // -------------------------------- 1、查询组织下的在职人员 --------------------------------
|
|
|
+ QueryEntityType queryEntityType = (QueryEntityType) EntityMetadataCache.getDataEntityType(SystemQueryConstant.HSPM_ASSIGNMENTQUERY);
|
|
|
+ DynamicObjectCollection personList = QueryEntityHelper.getInstance().getQueryDyoColl(queryEntityType, queryFieldBuilder.buildSelect(), new QFilter[]{qFilter}, queryFieldBuilder.buildOrder());
|
|
|
+ //添加分录
|
|
|
+ DynamicObjectCollection entryEntityCols = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
+ //根据条件删除分录
|
|
|
+
|
|
|
+ // -------------------------------- 2、删除系统生成部分人员 --------------------------------
|
|
|
+ //删除系统生成部分人员
|
|
|
+ entryEntityCols.removeIf(obj -> EnableEnum.NO.getCode().equals(obj.getString(PerfRankMgmtConstant.NCKD_RANKSOURCE)));
|
|
|
+
|
|
|
+ List<Long> personIds = personList.stream()
|
|
|
+ .map(person -> person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY)))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (!personIds.isEmpty()) {
|
|
|
+ Date now = new Date();
|
|
|
+ // -------------------------------- 3、获取人员是否享受职位津贴 --------------------------------
|
|
|
+ Map<Long, Boolean> entitledToAllowance = isEntitledToAllowance(personIds, now);
|
|
|
+
|
|
|
+ // -------------------------------- 4、加载数据到分录 --------------------------------
|
|
|
+ for (DynamicObject person : personList) {
|
|
|
+ DynamicObject entryCol = entryEntityCols.addNew();
|
|
|
+ long personId = person.getLong(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.ID_KEY));
|
|
|
+ String personName = person.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.NAME_KEY));
|
|
|
+ String personNumber = person.getString(String.join(".", FormConstant.EMPLOYEE_KEY, FormConstant.EMP_NUMBER_KEY));
|
|
|
+
|
|
|
+ DynamicObjectType type = EntityMetadataCache.getDataEntityType(FormConstant.HRPI_EMPLOYEE);
|
|
|
+ DynamicObject personObj = (DynamicObject) type.createInstance();
|
|
|
+ personObj.set(FormConstant.ID_KEY, personId);
|
|
|
+ personObj.set(FormConstant.NAME_KEY, personName);
|
|
|
+ personObj.set(FormConstant.EMP_NUMBER_KEY, personNumber);
|
|
|
+ entryCol.set(FormConstant.NCKD_PERSON, personObj);
|
|
|
+ //是否试用
|
|
|
+ boolean isTrial = person.getBoolean(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.LABOR_REL_STATUS, FormConstant.IS_TRIAL));
|
|
|
+ //入职日期
|
|
|
+ Date entryDate = person.getDate(String.join(".", FormConstant.HRPI_EMPENTREL, FormConstant.ENTRYDATE));
|
|
|
+ //职务级别编码
|
|
|
+ Integer posGradeSort = null;
|
|
|
+ if (person.containsProperty(FormConstant.NCKD_HRPI_PARTYPOSH)
|
|
|
+ && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE))
|
|
|
+ && person.containsProperty(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM))) {
|
|
|
+ posGradeSort = person.getInt(String.join(".", FormConstant.NCKD_HRPI_PARTYPOSH, FormConstant.NCKD_POSGRADE, FormConstant.NCKD_SORTNUM));
|
|
|
+ }
|
|
|
+ StringBuilder reason = new StringBuilder();
|
|
|
+ boolean participateRank = isParticipateRank(isTrial, entryDate, posGradeSort, reason);
|
|
|
+ entryCol.set(PerfRankMgmtConstant.NCKD_ISRANKING, participateRank);
|
|
|
+ entryCol.set(PerfRankMgmtConstant.NCKD_EXCLUDERANKREASON, reason.toString());
|
|
|
+ entryCol.set(PerfRankMgmtConstant.NCKD_RANKSOURCE, EnableEnum.NO.getCode());
|
|
|
+ //判断是否有职位津贴
|
|
|
+ boolean hasAllowance = entitledToAllowance.get(personId);
|
|
|
+ entryCol.set(PerfRankMgmtConstant.NCKD_POSTALLOWANCE, hasAllowance);
|
|
|
|
|
|
+ }
|
|
|
+ this.getView().showSuccessNotification("名单获取完成");
|
|
|
+ } else {
|
|
|
+ this.getView().showTipNotification("未获取到人员");
|
|
|
}
|
|
|
- this.getView().showSuccessNotification("名单获取完成");
|
|
|
- }else{
|
|
|
- this.getView().showTipNotification("未获取到人员");
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ /* }*/
|
|
|
if(Arrays.asList(FormConstant.DELETEENTRY_OP, PerfRankMgmtConstant.GETRANKLIST_OP).contains(itemKey)){
|
|
|
sortEntry();
|
|
|
calcRankCount();
|
|
|
}
|
|
|
+ // this.getView().setStatus(OperationStatus.EDIT);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断人员是否享受职位津贴
|
|
|
+ * @param personIds 人员ID列表
|
|
|
+ * @param date 查询时间
|
|
|
+ * @return Map<Long, Boolean> 人员ID到是否享受津贴的映射
|
|
|
+ * @author W.Y.C
|
|
|
+ * @date: 2025/10/21
|
|
|
+ */
|
|
|
+ private Map<Long, Boolean> isEntitledToAllowance(List<Long> personIds, Date date) {
|
|
|
+ Map<Long, Boolean> result = new HashMap<>();
|
|
|
+
|
|
|
+ if (personIds == null || personIds.isEmpty()) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取职位积分档案,用于判断是否有职级;职级大于0默认勾选“职位津贴”
|
|
|
+ //属于技能序列、技术序列或职能序列,并且职级不为0。
|
|
|
+ DynamicObject[] personPosFiles = PositionFileHelper.getNewestPersonPosFileByPerson(personIds.toArray(new Long[0]));
|
|
|
+ Map<Long, Long> personJobLevelMap = Arrays.stream(personPosFiles)
|
|
|
+ .filter(obj -> Stream.of(JobSeqEnum.TECHNICALS.getCode(), JobSeqEnum.FUNCTIONAL.getCode(), JobSeqEnum.SKILL.getCode())
|
|
|
+ .anyMatch(s -> s.equalsIgnoreCase(obj.getDynamicObject(PositionStructureConstant.NCKD_JOBSEQHR).getString(FormConstant.NUMBER_KEY))))
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY)),
|
|
|
+ obj -> obj.getLong(String.join(".", PositionStructureConstant.NCKD_JOBLEVELHR, FormConstant.JOBLEVELSEQ))
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 查询管理人员职位津贴配置
|
|
|
+ // 获取《管理人员职位津贴》,存在则默认勾选“职位津贴”
|
|
|
+ QFilter managerAllowanceFilter = new QFilter(FormConstant.NCKD_STARTDATE, QCP.less_equals, date)
|
|
|
+ .and(FormConstant.NCKD_ENDDATE, QCP.large_equals, date)
|
|
|
+ .and(FormConstant.NCKD_PERSON, QCP.in, personIds);
|
|
|
+
|
|
|
+ DynamicObjectCollection managerAllowanceQuery = QueryServiceHelper.query(
|
|
|
+ PositionStructureConstant.MANAGERALLOWANCE_ENTITYID,
|
|
|
+ String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY),
|
|
|
+ new QFilter[]{managerAllowanceFilter});
|
|
|
+
|
|
|
+ Map<Long, Boolean> managerAllowanceMap = managerAllowanceQuery.stream()
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ obj -> obj.getLong(String.join(".", FormConstant.NCKD_PERSON, FormConstant.ID_KEY)),
|
|
|
+ obj -> Boolean.TRUE
|
|
|
+ ));
|
|
|
+
|
|
|
+ // 合并判断结果
|
|
|
+ for (Long personId : personIds) {
|
|
|
+ boolean hasAllowance = (personJobLevelMap.containsKey(personId) && personJobLevelMap.get(personId) > 0)
|
|
|
+ || managerAllowanceMap.containsKey(personId);
|
|
|
+ result.put(personId, hasAllowance);
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 判断是否参与排名
|
|
|
* @param isTrial 是否试用
|
|
|
@@ -301,45 +427,47 @@ public class PerfrankMgmtFormPlugin extends AbstractFormPlugin implements Plugin
|
|
|
*/
|
|
|
private void sortEntry(){
|
|
|
DynamicObjectCollection entryEntityCols = this.getModel().getDataEntity(true).getDynamicObjectCollection(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
- int allowanceRank = entryEntityCols.get(0).getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
- entryEntityCols.sort((o1, o2) -> {
|
|
|
- // 先按 NCKD_TOPRANK 排序,空值或 0 视为最大值(排在最后)
|
|
|
- Integer topRank1 = o1.getInt(PerfRankMgmtConstant.NCKD_TOPRANK);
|
|
|
- Integer topRank2 = o2.getInt(PerfRankMgmtConstant.NCKD_TOPRANK);
|
|
|
- if (topRank1 == 0) {
|
|
|
- topRank1 = Integer.MAX_VALUE;
|
|
|
- }
|
|
|
- if (topRank2 == 0) {
|
|
|
- topRank2 = Integer.MAX_VALUE;
|
|
|
- }
|
|
|
+ if(!entryEntityCols.isEmpty()) {
|
|
|
+ int allowanceRank = entryEntityCols.get(0).getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
+ entryEntityCols.sort((o1, o2) -> {
|
|
|
+ // 先按 NCKD_TOPRANK 排序,空值或 0 视为最大值(排在最后)
|
|
|
+ Integer topRank1 = o1.getInt(PerfRankMgmtConstant.NCKD_TOPRANK);
|
|
|
+ Integer topRank2 = o2.getInt(PerfRankMgmtConstant.NCKD_TOPRANK);
|
|
|
+ if (topRank1 == 0) {
|
|
|
+ topRank1 = Integer.MAX_VALUE;
|
|
|
+ }
|
|
|
+ if (topRank2 == 0) {
|
|
|
+ topRank2 = Integer.MAX_VALUE;
|
|
|
+ }
|
|
|
|
|
|
- int topRankCompare = topRank1.compareTo(topRank2);
|
|
|
- if (topRankCompare != 0) {
|
|
|
- return topRankCompare;
|
|
|
- }
|
|
|
+ int topRankCompare = topRank1.compareTo(topRank2);
|
|
|
+ if (topRankCompare != 0) {
|
|
|
+ return topRankCompare;
|
|
|
+ }
|
|
|
|
|
|
- // 再按 NCKD_ALLOWANCERANK 排序,空值或 0 视为最大值(排在最后)
|
|
|
- Integer allowanceRank1 = o1.getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
- Integer allowanceRank2 = o2.getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
- if (allowanceRank1 == 0) {
|
|
|
- allowanceRank1 = Integer.MAX_VALUE;
|
|
|
- }
|
|
|
- if (allowanceRank2 == 0) {
|
|
|
- allowanceRank2 = Integer.MAX_VALUE;
|
|
|
- }
|
|
|
+ // 再按 NCKD_ALLOWANCERANK 排序,空值或 0 视为最大值(排在最后)
|
|
|
+ Integer allowanceRank1 = o1.getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
+ Integer allowanceRank2 = o2.getInt(PerfRankMgmtConstant.NCKD_ALLOWANCERANK);
|
|
|
+ if (allowanceRank1 == 0) {
|
|
|
+ allowanceRank1 = Integer.MAX_VALUE;
|
|
|
+ }
|
|
|
+ if (allowanceRank2 == 0) {
|
|
|
+ allowanceRank2 = Integer.MAX_VALUE;
|
|
|
+ }
|
|
|
|
|
|
- int allowanceRankCompare = allowanceRank1.compareTo(allowanceRank2);
|
|
|
- if (allowanceRankCompare != 0) {
|
|
|
- return allowanceRankCompare;
|
|
|
- }
|
|
|
+ int allowanceRankCompare = allowanceRank1.compareTo(allowanceRank2);
|
|
|
+ if (allowanceRankCompare != 0) {
|
|
|
+ return allowanceRankCompare;
|
|
|
+ }
|
|
|
|
|
|
- // 最后按 NCKD_ISRANKING 排序,true 在前,false 在后
|
|
|
- Boolean isRanking1 = o1.getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING);
|
|
|
- Boolean isRanking2 = o2.getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING);
|
|
|
- return Boolean.compare(isRanking2, isRanking1);
|
|
|
- });
|
|
|
- this.getModel().updateEntryCache(entryEntityCols);
|
|
|
- this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
+ // 最后按 NCKD_ISRANKING 排序,true 在前,false 在后
|
|
|
+ Boolean isRanking1 = o1.getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING);
|
|
|
+ Boolean isRanking2 = o2.getBoolean(PerfRankMgmtConstant.NCKD_ISRANKING);
|
|
|
+ return Boolean.compare(isRanking2, isRanking1);
|
|
|
+ });
|
|
|
+ this.getModel().updateEntryCache(entryEntityCols);
|
|
|
+ this.getView().updateView(PerfRankMgmtConstant.NCKD_PERFRANKMGMTENTRY);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|