| 
					
				 | 
			
			
				@@ -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); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 |