Selaa lähdekoodia

1.批量职等调整单相关插件

Tyx 1 viikko sitten
vanhempi
säilyke
6ad8a8ee11

+ 169 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/validator/AdjustJobBillSaveValidator.java

@@ -0,0 +1,169 @@
+package nckd.jimin.jyyy.hr.swc.hcdm.formplugin.validator;
+
+import com.google.common.collect.Lists;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QFilter;
+import kd.hr.hbp.common.util.HRArrayUtils;
+import kd.hr.hbp.common.util.HRCollUtil;
+import kd.hr.hbp.common.util.HRMapUtils;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.hr.hbp.opplugin.validator.HRDataBaseValidator;
+import kd.tdc.tjga.business.domain.repository.BatchChangeJobRepository;
+import kd.tdc.tjga.business.domain.repository.TalentFileRepository;
+import kd.tdc.tjga.business.formservice.BatchChangeGradeLevelFormService;
+import kd.tdc.tjga.common.util.CommUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class AdjustJobBillSaveValidator extends HRDataBaseValidator {
+    @Override
+    public void validate() {
+        super.validate();
+        ExtendedDataEntity[] dataEntities = this.getDataEntities();
+        if (!HRArrayUtils.isEmpty(dataEntities)) {
+            DynamicObject dataEntity = dataEntities[0].getDataEntity();
+            DynamicObjectCollection entryObjs = dataEntity.getDynamicObjectCollection("changeentry");
+            if (!HRCollUtil.isEmpty(entryObjs)) {
+                BatchChangeGradeLevelFormService fromService = new BatchChangeGradeLevelFormService();
+                String dimissionName = fromService.empDimission(entryObjs);
+                String billStatus;
+                if (HRStringUtils.isNotEmpty(dimissionName)) {
+                    billStatus = ResManager.loadKDString("员工“{0}”已经离职,无法继续调整职级职等。", "BatchChangeGradeLevelSaveValidator_0", "tdc-tjga-opplugin", new Object[]{dimissionName});
+                    this.addErrorMessage(dataEntities[0], billStatus);
+                } else {
+                    billStatus = dataEntity.getString("billstatus");
+                    String billno = HRStringUtils.isEmpty(billStatus) ? null : dataEntity.getString("billno");
+                    String errorMsg = this.isInProcessing(entryObjs, billno);
+                    if (HRStringUtils.isNotEmpty(errorMsg)) {
+                        this.addErrorMessage(dataEntities[0], errorMsg);
+                    } else {
+                        String nameNumStr = fromService.gradeAndLevelBothEmpty(entryObjs);
+                        String nameNumSameStr;
+                        if (HRStringUtils.isNotEmpty(nameNumStr)) {
+                            nameNumSameStr = ResManager.loadKDString("员工“{0}”调整后的职级和职等不能同时为空。", "BatchChangeGradeLevelSaveValidator_1", "tdc-tjga-opplugin", new Object[]{nameNumStr});
+                            this.addErrorMessage(dataEntities[0], nameNumSameStr);
+                        } else {
+                            nameNumSameStr = fromService.sameValue(entryObjs);
+                            if (HRStringUtils.isNotEmpty(nameNumSameStr)) {
+                                String sameStr = ResManager.loadKDString("员工“{0}”调整前后的职级职等信息没有变化,请重新确认。", "BatchChangeGradeLevelSaveValidator_2", "tdc-tjga-opplugin", new Object[]{nameNumSameStr});
+                                this.addErrorMessage(dataEntities[0], sameStr);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public String isInProcessing(DynamicObjectCollection entryObj, String billno) {
+        List<Long> talentFiles = (List)entryObj.stream().map((obj) -> {
+            return obj.getLong("employee.id");
+        }).collect(Collectors.toList());
+        Map<Long, String> allErrorMsgMap = this.getProcessingDataErrorMsg(talentFiles, billno);
+        if (HRMapUtils.isEmpty(allErrorMsgMap)) {
+            return "";
+        } else {
+            Iterator var5 = entryObj.iterator();
+
+            String errorMsg;
+            do {
+                if (!var5.hasNext()) {
+                    return "";
+                }
+
+                DynamicObject row = (DynamicObject)var5.next();
+                errorMsg = (String)allErrorMsgMap.get(row.getLong("employee.id"));
+            } while(!HRStringUtils.isNotEmpty(errorMsg));
+
+            return errorMsg;
+        }
+    }
+
+    public Map<Long, String> getProcessingDataErrorMsg(Collection<Long> talentFileIds, String billno) {
+        Map<Long, String> resultMap = new HashMap();
+        Map<Long, String> batchChangeMap = this.batchChangeJob(talentFileIds, billno);
+        String inBatchProcssingErrMsg = ResManager.loadKDString("{0}:员工已处于批量职级职等调整流程中,单据编码为{1},请重新选择。", "BatchChangeGradeLevelFromService_2", "tdc-tjga-business", new Object[0]);
+        resultMap.putAll(this.appendErrorMsg(batchChangeMap, inBatchProcssingErrMsg));
+        return resultMap;
+    }
+
+    public Map<Long, String> batchChangeJob(Collection<Long> talentFileIds, String billno) {
+        QFilter status = new QFilter("billstatus", "not in", "");
+        QFilter talentFile = new QFilter("changeentry.employee.id", "in", talentFileIds);
+        QFilter changeStatus = new QFilter("changeentry.changestatus", "=", "0");
+        List<QFilter> filters = Lists.newArrayList(new QFilter[]{status, talentFile, changeStatus});
+        if (HRStringUtils.isNotEmpty(billno)) {
+            filters.add(new QFilter("billno", "not in", billno));
+        }
+
+        Set<Long> talentFileSet = (Set)talentFileIds.stream().collect(Collectors.toSet());
+        List<DynamicObject> entryObjs = this.batchJobEntry((QFilter[])filters.toArray(new QFilter[0]), talentFileSet);
+        return (Map)(HRCollUtil.isEmpty(entryObjs) ? new HashMap() : (Map)entryObjs.stream().collect(Collectors.toMap((k) -> {
+            return k.getLong("employee.id");
+        }, (v) -> {
+            return v.getString("billnoentry");
+        }, (k1, k2) -> {
+            return k1;
+        })));
+    }
+
+    public List<DynamicObject> batchJobEntry(QFilter[] filters, Set<Long> talentFileSet) {
+        DynamicObject[] dynamicObjects = BatchChangeJobRepository.queryBatchJob((String)null, filters);
+        if (HRArrayUtils.isEmpty(dynamicObjects)) {
+            return null;
+        } else {
+            List<DynamicObject> allEntryObj = new ArrayList(16);
+            Arrays.stream(dynamicObjects).forEach((d) -> {
+                String billno = d.getString("billno");
+                DynamicObjectCollection dynamicObjectCollection = d.getDynamicObjectCollection("changeentry");
+                if (HRCollUtil.isNotEmpty(dynamicObjectCollection)) {
+                    List<DynamicObject> collect = (List)dynamicObjectCollection.stream().filter((row) -> {
+                        return talentFileSet.contains(row.getLong("employee.id"));
+                    }).peek((row) -> {
+                        row.set("billnoentry", billno);
+                    }).collect(Collectors.toList());
+                    allEntryObj.addAll(collect);
+                }
+
+            });
+            return allEntryObj;
+        }
+    }
+
+
+    public Map<Long, String> appendErrorMsg(Map<Long, String> map, String errorMsg) {
+        Map<Long, String> errorMsgMap = new HashMap(16);
+        if (!HRMapUtils.isEmpty(map)) {
+            Map<Long, String> nameAndNumberMap = this.queryTalentFile(map.keySet());
+            Iterator var5 = map.entrySet().iterator();
+
+            while(var5.hasNext()) {
+                Map.Entry<Long, String> entry = (Map.Entry)var5.next();
+                String nameAndNumber = (String)nameAndNumberMap.get(entry.getKey());
+                if (HRStringUtils.isNotEmpty(nameAndNumber)) {
+                    errorMsgMap.put(entry.getKey(), errorMsg.replace("{0}", nameAndNumber).replace("{1}", (CharSequence)entry.getValue()));
+                }
+            }
+        }
+
+        return errorMsgMap;
+    }
+
+    private Map<Long, String> queryTalentFile(Collection<Long> talentFileIds) {
+        DynamicObject[] talentFileObjs = (new TalentFileRepository()).queryTalentFileInfoById(talentFileIds, "name,number");
+        return (Map)(HRArrayUtils.isEmpty(talentFileObjs) ? new HashMap() : (Map) Arrays.stream(talentFileObjs).collect(Collectors.toMap((k) -> {
+            return k.getLong("id");
+        }, (v) -> {
+            return CommUtils.appendStr(new String[]{v.getString("name"), " ", v.getString("number")});
+        }, (k1, k2) -> {
+            return k1;
+        })));
+    }
+
+
+}

+ 142 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/web/AdjustJobBillAuditOp.java

@@ -0,0 +1,142 @@
+package nckd.jimin.jyyy.hr.swc.hcdm.formplugin.web;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRMServiceHelper;
+import kd.hr.hbp.common.util.HRArrayUtils;
+import kd.hr.hbp.common.util.HRCollUtil;
+import kd.hr.hbp.common.util.HRDateTimeUtils;
+import kd.hr.hbp.common.util.HRObjectUtils;
+import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
+import kd.sdk.plugin.Plugin;
+import kd.tdc.tjga.business.application.external.ChgService;
+import kd.tdc.tjga.business.domain.repository.BatchChangeJobRepository;
+import kd.tdc.tjga.business.domain.service.hrpi.IHrpiDomainService;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 单据操作插件
+ */
+public class AdjustJobBillAuditOp extends AbstractOperationServicePlugIn implements Plugin {
+    private static final Log logger = LogFactory.getLog(AdjustJobBillAuditOp.class);
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+        Date nowDateTime = HRDateTimeUtils.getNowDateTime();
+        DynamicObject[] batchJobObj = e.getDataEntities();
+        if (!HRArrayUtils.isEmpty(batchJobObj)) {
+            List<DynamicObject> allEntryObjs = new ArrayList(16);
+            DynamicObject[] var11 = batchJobObj;
+            int var12 = batchJobObj.length;
+
+            for(int var13 = 0; var13 < var12; ++var13) {
+                DynamicObject jobObj = var11[var13];
+                DynamicObjectCollection entryObj = jobObj.getDynamicObjectCollection("changeentry");
+                if (!HRCollUtil.isEmpty(entryObj)) {
+                    allEntryObjs.addAll(entryObj);
+                }
+            }
+
+            if (!HRCollUtil.isEmpty(allEntryObjs)) {
+                List<Long> employeeIds = (List)allEntryObjs.stream().map((e1) -> {
+                    return e1.getLong("employee.id");
+                }).collect(Collectors.toList());
+                IHrpiDomainService hrpiDomainService = IHrpiDomainService.getInstance();
+                Map<Long, DynamicObject> mainEmpposorgrels = hrpiDomainService.getEmpposorgrelByEmployeeIds(employeeIds, "employee,company");
+                Iterator var28 = allEntryObjs.iterator();
+
+                while(var28.hasNext()) {
+                    DynamicObject entryObj = (DynamicObject)var28.next();
+                    Date effectDate = entryObj.getDate("changeeffdate");
+                    if (!nowDateTime.before(effectDate)) {
+                        Map<String, Object> map = new HashMap(16);
+                        map.put("personId", entryObj.getLong("person.id"));
+                        Long employeeId = entryObj.getLong("employee.id");
+                        map.put("employeeId", employeeId);
+                        map.put("chgActionId", 1360L);
+                        map.put("appId", "tjga");
+                        map.put("effectTime", effectDate.getTime());
+
+                        //查询任职经历Id
+                        QFilter filter = QFilterUtil.getCurrentQf();
+                        filter.and("datastatus", QCP.equals, "1");
+                        filter.and("employee.id", QCP.equals, employeeId);
+                        filter.and("person.id", QCP.equals, entryObj.getLong("person.id"));
+                        DynamicObject posOrgRel = QueryServiceHelper.queryOne("hrpi_empposorgrel", "id", new QFilter[]{filter});
+
+                        (new ChgService()).queryPersonInfo(posOrgRel.getLong("id"), map);
+                        Map<String, Object> valueMap = new HashMap(16);
+                        DynamicObject dynamicObject = (DynamicObject)mainEmpposorgrels.get(employeeId);
+                        if (!HRObjectUtils.isEmpty(dynamicObject)) {
+                            valueMap.put("1310_S_empjobrel_company", dynamicObject.getLong("company.id"));
+                        }
+
+                        valueMap.put("1310_S_empjobrel_hrbu", entryObj.getLong("hrbu.id"));
+                        valueMap.put("1310_S_empjobrel_job", entryObj.getLong("job.id"));
+                        valueMap.put("1310_S_empjobrel_jobgradescm", entryObj.getLong("jobgradescm.id"));
+                        valueMap.put("1310_S_empjobrel_jobgrade", entryObj.getLong("jobgrade.id"));
+                        valueMap.put("1310_S_empjobrel_joblevelscm", entryObj.getLong("joblevelscm.id"));
+                        valueMap.put("1310_S_empjobrel_joblevel", entryObj.getLong("joblevel.id"));
+                        if (!HRObjectUtils.isEmpty(entryObj.getDynamicObject("job"))) {
+                            valueMap.put("1310_S_empjobrel_jobscm", entryObj.getDynamicObject("job").getLong("jobscm.id"));
+                        }
+
+                        DynamicObject jobObj = entryObj.getDynamicObject("job");
+                        if (!HRObjectUtils.isEmpty(jobObj)) {
+                            valueMap.put("1310_S_empjobrel_jobseq", jobObj.getLong("jobseq.id"));
+                            valueMap.put("1310_S_empjobrel_jobfamily", jobObj.getLong("jobfamily.id"));
+                            valueMap.put("1310_S_empjobrel_jobclass", jobObj.getLong("jobclass.id"));
+                        }
+
+                        valueMap.put("1310_S_empjobrel_variationtype", 102030L);
+                        valueMap.put("1310_S_empjobrel_enddate", HRDateTimeUtils.getSysMaxDate());
+                        map.put("valueMap", valueMap);
+                        logger.info("BatchChangeGradeLevelTask.begin");
+                        Map<String, Object> userInfo = (Map) HRMServiceHelper.invokeHRService("hpfs", "IHPFSPersonChgService", "executeActionPersonalChange", new Object[]{map});
+                        logger.info("BatchChangeGradeLevelTask.end");
+                        boolean success = (Boolean)userInfo.get("success");
+                        if (!success) {
+                            String errorMsg = (String)userInfo.get("errorMsg");
+                            logger.info("BatchChangeGradeLevelTask.error map value:{}", map.toString());
+                            logger.error("BatchChangeGradeLevelTask.error error:{}", errorMsg);
+                            entryObj.set("synresult", "2");
+                        } else {
+                            entryObj.set("synresult", "1");
+                            entryObj.set("changestatus", "1");
+                        }
+                    }
+                }
+
+                DynamicObject[] var29 = batchJobObj;
+                int var31 = batchJobObj.length;
+
+                for(int var32 = 0; var32 < var31; ++var32) {
+                    DynamicObject gradeLevelObj = var29[var32];
+                    DynamicObjectCollection dynamicObjectCollection = gradeLevelObj.getDynamicObjectCollection("changeentry");
+                    if (!HRCollUtil.isEmpty(dynamicObjectCollection)) {
+                        Long changedNum = dynamicObjectCollection.stream().filter((d) -> {
+                            return "1".equals(d.getString("changestatus"));
+                        }).count();
+                        gradeLevelObj.set("changednum", changedNum.intValue());
+                        gradeLevelObj.set("totalnum", dynamicObjectCollection.size());
+                        if (changedNum.intValue() == dynamicObjectCollection.size()) {
+                            gradeLevelObj.set("changeover", "1");
+                        }
+                    }
+                }
+
+                BatchChangeJobRepository.updates(batchJobObj);
+            }
+        }
+
+    }
+}

+ 697 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/web/AdjustJobBillEdit.java

@@ -0,0 +1,697 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by FernFlower decompiler)
+//
+
+package nckd.jimin.jyyy.hr.swc.hcdm.formplugin.web;
+
+import com.google.common.collect.Lists;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.dataentity.resource.ResManager;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.entity.datamodel.ListSelectedRow;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.entity.operate.result.OperateErrorInfo;
+import kd.bos.entity.operate.result.OperationResult;
+import kd.bos.entity.validate.ValidateResult;
+import kd.bos.ext.hr.metadata.edit.MulPersonEdit;
+import kd.bos.form.*;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.events.BeforeItemClickEvent;
+import kd.bos.form.control.events.EntryGridBindDataEvent;
+import kd.bos.form.control.events.EntryGridBindDataListener;
+import kd.bos.form.control.events.ItemClickEvent;
+import kd.bos.form.events.*;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.DateEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.field.events.DateClickListener;
+import kd.bos.form.field.events.ResetDateFilterEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.ListShowParameter;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.mvc.SessionManager;
+import kd.bos.orm.query.QFilter;
+import kd.bos.orm.util.CollectionUtils;
+import kd.bos.servicehelper.operation.OperationServiceHelper;
+import kd.bos.servicehelper.workflow.WorkflowServiceHelper;
+import kd.hr.hbp.bussiness.cert.HRCertCommonHelper;
+import kd.hr.hbp.bussiness.cert.HRCertNoticeTypeEnum;
+import kd.hr.hbp.common.util.*;
+import kd.hr.hbp.formplugin.web.HRDataBaseEdit;
+import kd.tdc.tdcs.bussiness.formservice.FormCommonService;
+import kd.tdc.tdcs.bussiness.license.TDCSCertCommonHelper;
+import kd.tdc.tjga.business.application.quickchange.BatchChangeGradeLevelApplication;
+import kd.tdc.tjga.business.formservice.BatchChangeGradeLevelFormService;
+import kd.tdc.tjga.common.util.CommUtils;
+import kd.tdc.tjga.common.util.ControlDataSyn;
+import kd.tdc.tjga.common.util.TjgaObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.ParseException;
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class AdjustJobBillEdit extends HRDataBaseEdit implements BeforeF7SelectListener, DateClickListener, EntryGridBindDataListener {
+    private static final Log logger = LogFactory.getLog(AdjustJobBillEdit.class);
+
+    public AdjustJobBillEdit() {
+    }
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        MulPersonEdit ermanfileF7 = (MulPersonEdit)this.getControl("ermanfiles");
+        ermanfileF7.addBeforeF7SelectListener(this);
+        BasedataEdit hrbu = (BasedataEdit)this.getControl("hrbu");
+        hrbu.addBeforeF7SelectListener(this);
+        BasedataEdit jobGrade = (BasedataEdit)this.getControl("jobgrade");
+        jobGrade.addBeforeF7SelectListener(this);
+        BasedataEdit jobLevel = (BasedataEdit)this.getControl("joblevel");
+        jobLevel.addBeforeF7SelectListener(this);
+        this.addItemClickListeners(new String[]{"advcontoolbarap"});
+        DateEdit dateEdit = (DateEdit)this.getControl("changeeffdate");
+        dateEdit.addDateClickListener(this);
+        EntryGrid changeEntry = (EntryGrid)this.getControl("changeentry");
+        changeEntry.addDataBindListener(this);
+    }
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+        BillShowParameter formShowParameter = (BillShowParameter)this.getView().getFormShowParameter();
+        String billStatus = this.getModel().getDataEntity().getString("billstatus");
+        if (!"A".equals(billStatus)) {
+            String billNo = this.getModel().getDataEntity().getString("billno");
+            String capation = ResManager.loadKDString("批量职等调整单", "BatchChangeGradeLevelEdit_3", "tdc-tjga-formplugin", new Object[0]);
+            formShowParameter.setCaption(CommUtils.appendStr(new String[]{capation, "-", billNo}));
+        }
+
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+    }
+
+
+    public void setEntryEnable() {
+        DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("changeentry");
+        for(int i = 0; i < entryEntity.size(); ++i) {
+            DynamicObject entryRowObj = (DynamicObject)entryEntity.get(i);
+            //this.setRowEnable(entryRowObj, i);
+        }
+
+    }
+
+    public void setRowEnable(DynamicObject entryRowObj, Integer row) {
+        Set<String> falseEnableSet = this.getFalseEnableColumnName(entryRowObj);
+        this.getView().setEnable(Boolean.FALSE, row, (String[])falseEnableSet.toArray(new String[0]));
+        String[] trueEnableArr = (String[])this.getTrueEnableColumnName(entryRowObj, falseEnableSet).toArray(new String[0]);
+        this.getView().setEnable(Boolean.TRUE, row, trueEnableArr);
+    }
+
+    public Set<String> getFalseEnableColumnName(DynamicObject entryRowObj) {
+        Set<String> falseFieldNameSet = new HashSet(6);
+        if (HRObjectUtils.isEmpty(entryRowObj.get("hrbu"))) {
+            falseFieldNameSet.addAll(Lists.newArrayList(new String[]{"job", "jobgradescm", "joblevelscm", "jobgrade", "joblevel"}));
+            return falseFieldNameSet;
+        } else if (HRObjectUtils.isEmpty(entryRowObj.get("job"))) {
+            falseFieldNameSet.addAll(Lists.newArrayList(new String[]{"jobgradescm", "joblevelscm", "jobgrade", "joblevel"}));
+            return falseFieldNameSet;
+        } else {
+            if (!HRObjectUtils.isEmpty(entryRowObj.get("job"))) {
+                DynamicObject jobObj = entryRowObj.getDynamicObject("job");
+                BatchChangeGradeLevelFormService formService = new BatchChangeGradeLevelFormService();
+                long jobGradeScmId = formService.getJobGradeOrLevelScm(jobObj, "jobgradescm");
+                long gradeScmId = entryRowObj.getLong("jobgradescm.id");
+                if (gradeScmId != 0L && jobGradeScmId == gradeScmId) {
+                    falseFieldNameSet.addAll(Lists.newArrayList(new String[]{"jobgradescm"}));
+                }
+
+                long jobLevleScmId = formService.getJobGradeOrLevelScm(jobObj, "joblevelscm");
+                long levelScmId = entryRowObj.getLong("joblevelscm.id");
+                if (levelScmId != 0L && jobLevleScmId == levelScmId) {
+                    falseFieldNameSet.addAll(Lists.newArrayList(new String[]{"joblevelscm"}));
+                }
+            }
+
+            if (HRObjectUtils.isEmpty(entryRowObj.get("jobgradescm"))) {
+                falseFieldNameSet.add("jobgrade");
+            }
+
+            if (HRObjectUtils.isEmpty(entryRowObj.get("joblevelscm"))) {
+                falseFieldNameSet.add("joblevel");
+            }
+
+            return falseFieldNameSet;
+        }
+    }
+
+    public Set<String> getTrueEnableColumnName(DynamicObject entryRowObj, Set<String> falseEnableSet) {
+        Set<String> trueFieldNameList = new HashSet(6);
+        trueFieldNameList.add("hrbu");
+        if (!HRObjectUtils.isEmpty(entryRowObj.get("hrbu"))) {
+            trueFieldNameList.add("job");
+        }
+
+        if (!falseEnableSet.contains("jobgradescm")) {
+            trueFieldNameList.add("jobgradescm");
+        }
+
+        if (!falseEnableSet.contains("joblevelscm")) {
+            trueFieldNameList.add("joblevelscm");
+        }
+
+        if (!falseEnableSet.contains("jobgrade")) {
+            trueFieldNameList.add("jobgrade");
+        }
+
+        if (!falseEnableSet.contains("joblevel")) {
+            trueFieldNameList.add("joblevel");
+        }
+
+        return trueFieldNameList;
+    }
+
+    public void setViewFlowChartVisible(String billStatus) {
+        Boolean isExistsWorkFlow = this.getModel().getDataEntity().getBoolean("isexistsworkflow");
+        Boolean isShowViewFlowChartBtn = CommUtils.anyMatchStr(billStatus, new String[]{"F", "B", "D", "C", "E"}) && isExistsWorkFlow;
+        this.getView().setVisible(isShowViewFlowChartBtn, new String[]{"bar_viewflowchart"});
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs args) {
+        String name = args.getProperty().getName();
+        int rowNum;
+        if ("job".equals(name)) {
+            rowNum = this.getModel().getEntryCurrentRowIndex("changeentry");
+            ChangeData[] changeDataArr = args.getChangeSet();
+            Object newValue = changeDataArr[0].getNewValue();
+            if (HRObjectUtils.isEmpty(newValue)) {
+                this.getModel().setValue("seqfamclass", "", rowNum);
+            } else {
+                String afterSeqFailyClass = (new BatchChangeGradeLevelFormService()).getAfterSeqFailyClass((DynamicObject)newValue);
+                this.getModel().setValue("seqfamclass", afterSeqFailyClass, rowNum);
+            }
+
+            BatchChangeGradeLevelFormService formService = new BatchChangeGradeLevelFormService();
+            Long jobGradeScmId = formService.getJobGradeOrLevelScm((DynamicObject)newValue, "jobgradescm");
+            Boolean gradeScmEnable = jobGradeScmId == 0L ? Boolean.TRUE : Boolean.FALSE;
+            this.getView().setEnable(gradeScmEnable, rowNum, new String[]{"jobgradescm"});
+            this.getModel().setValue("jobgradescm", jobGradeScmId, rowNum);
+            Long jobLevelScmId = formService.getJobGradeOrLevelScm((DynamicObject)newValue, "joblevelscm");
+            Boolean levelScmEnable = jobLevelScmId == 0L ? Boolean.TRUE : Boolean.FALSE;
+            this.getView().setEnable(levelScmEnable, rowNum, new String[]{"joblevelscm"});
+            this.getModel().setValue("joblevelscm", jobLevelScmId, rowNum);
+        }
+
+        if (CommUtils.anyMatchStr(name, new String[]{"hrbu", "job", "jobgradescm", "joblevelscm"})) {
+            rowNum = this.getModel().getEntryCurrentRowIndex("changeentry");
+            DynamicObject dynamicObject = (DynamicObject)this.getModel().getEntryEntity("changeentry").get(rowNum);
+            this.setRowEnable(dynamicObject, rowNum);
+        }
+
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate source = (FormOperate)args.getSource();
+        String operateKey = source.getOperateKey();
+        String cache = this.getView().getPageCache().get("notNeedCheck");
+        if (CommUtils.anyMatchStr(operateKey, new String[]{"save", "submit", "submiteffect"}) && HRStringUtils.isEmpty(cache)) {
+            if (HRCollUtil.isEmpty(this.opCheck())) {
+                args.setCancel(true);
+                return;
+            }
+
+            DynamicObject dataEntity = this.getModel().getDataEntity(true);
+            DynamicObjectCollection entryObj = dataEntity.getDynamicObjectCollection("changeentry");
+            if (HRCollUtil.isNotEmpty(entryObj)) {
+                OperateOption operateOption = OperateOption.create();
+                operateOption.setVariableValue("isopcancel", "1");
+                OperationResult result = OperationServiceHelper.executeOperate("savecheck", "nckd_jobadjustbill", new DynamicObject[]{dataEntity}, operateOption);
+                if (!result.isSuccess()) {
+                    List<ValidateResult> validateErrors = result.getValidateResult().getValidateErrors();
+                    if (HRCollUtil.isNotEmpty(validateErrors)) {
+                        ValidateResult validateResult = (ValidateResult)validateErrors.get(0);
+                        List<OperateErrorInfo> allErrorInfo = validateResult.getAllErrorInfo();
+                        if (HRCollUtil.isNotEmpty(allErrorInfo)) {
+                            this.getView().showErrorNotification(((OperateErrorInfo)allErrorInfo.get(0)).getMessage());
+                        }
+
+                        args.setCancel(true);
+                        return;
+                    }
+                }
+            }
+
+            BatchChangeGradeLevelFormService fromService = new BatchChangeGradeLevelFormService();
+            String jobGradeNameStr = fromService.afterEmptyBeforeHaveValue(entryObj, "bjobgrade", "jobgrade");
+            String jobLevelNameStr = fromService.afterEmptyBeforeHaveValue(entryObj, "bjoblevel", "joblevel");
+            if (HRStringUtils.isNotEmpty(jobGradeNameStr) || HRStringUtils.isNotEmpty(jobLevelNameStr)) {
+                String msg = ResManager.loadKDString("请确认以下信息,确定继续吗?", "BatchChangeGradeLevelEdit_6", "tdc-tjga-formplugin", new Object[0]);
+                String detailStr = "";
+                if (HRStringUtils.isNotEmpty(jobGradeNameStr)) {
+                    detailStr = ResManager.loadKDString("员工“{0}”调整前职等不为空,调整后职等为空。", "BatchChangeGradeLevelEdit_7", "tdc-tjga-formplugin", new Object[]{jobGradeNameStr});
+                }
+
+                if (HRStringUtils.isNotEmpty(jobLevelNameStr)) {
+                    String levelStr = ResManager.loadKDString("员工“{0}”调整前职级不为空,调整后职级为空。", "BatchChangeGradeLevelEdit_8", "tdc-tjga-formplugin", new Object[]{jobLevelNameStr});
+                    detailStr = StringUtils.isEmpty(detailStr) ? levelStr : CommUtils.appendStr(new String[]{detailStr, "\n", levelStr});
+                }
+
+                this.getView().showConfirm(msg, detailStr, MessageBoxOptions.OKCancel, ConfirmTypes.Default, new ConfirmCallBackListener(operateKey));
+                args.setCancel(true);
+                return;
+            }
+        } else if (CommUtils.anyMatchStr(operateKey, new String[]{"save", "submit", "submiteffect"}) && "notNeedCheck".equals(cache)) {
+            this.getView().getPageCache().put("notNeedCheck", (String)null);
+        }
+
+        if ("submit".equals(operateKey) && (!WorkflowServiceHelper.existProcDefByEntityNumber("nckd_jobadjustbill") || CollectionUtils.isEmpty(WorkflowServiceHelper.getEnabledProcesses(this.getModel().getDataEntity(), "submit")))) {
+            this.getView().showErrorNotification(ResManager.loadKDString("未匹配到工作流,请先完成相关流程配置。", "BatchChangeGradeLevelEdit_9", "tdc-tjga-formplugin", new Object[0]));
+            args.setCancel(true);
+        } else {
+            if (CommUtils.anyMatchStr(operateKey, new String[]{"save", "submit", "submiteffect"})) {
+                int size = this.getModel().getEntryEntity("changeentry").size();
+                this.getModel().setValue("totalnum", size);
+            }
+
+            if ("import_entrydata_hr".equals(operateKey)) {
+                SessionManager.getCurrent().put("tjga_batchjob_pageid", this.getView().getPageId());
+            }
+
+        }
+    }
+
+    private boolean permVerification(BeforeDoOperationEventArgs args) {
+        DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("changeentry");
+        List<Long> personIdList = (List)entryEntity.stream().map((row) -> {
+            return row.getLong("person.id");
+        }).collect(Collectors.toList());
+        if (HRCollUtil.isEmpty(personIdList)) {
+            args.setCancel(true);
+            return true;
+        } else {
+            Map<String, Object> certRstMap = TDCSCertCommonHelper.verifyCertByPersonId("326PLYR3VT8A", "tjga_batchjob", personIdList);
+            String state = (String)certRstMap.get("STATE");
+            if ("FORBID".equals(state)) {
+                Map<String, Object> data = (Map)certRstMap.get("DATA");
+                String message = (String)data.get("FD_HTML_MESSAGE");
+                this.getView().showForm(HRCertCommonHelper.getFormShowParameter(HRCertNoticeTypeEnum.FORBIDDEN.getName(), (String)null, message));
+                args.setCancelMessage(message);
+                args.setCancel(true);
+                return true;
+            } else if ("FAIL".equals(state)) {
+                String message = (String)certRstMap.get("FAIL_HTML_MESSAGE");
+                this.getView().showForm(HRCertCommonHelper.getFormShowParameter(HRCertNoticeTypeEnum.ENCODE.getName(), (String)null, message));
+                args.setCancelMessage(message);
+                args.setCancel(true);
+                return true;
+            } else {
+                return false;
+            }
+        }
+    }
+
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        String operateKey = afterDoOperationEventArgs.getOperateKey();
+        if ("deleteentry".equals(operateKey)) {
+            (new ControlDataSyn()).entryToMulBaseEdit(this, "ermanfiles", "changeentry", "employee");
+        }
+
+        if ("terminate_bill".equals(operateKey) && afterDoOperationEventArgs.getOperationResult().isSuccess()) {
+            List<DynamicObject> processingBills = this.opCheck();
+            if (HRCollUtil.isEmpty(processingBills)) {
+                return;
+            }
+
+            (new BatchChangeGradeLevelFormService()).showTerminatePage(this, "terminate_bill_callback");
+        }
+
+        if ("submit".equals(operateKey)) {
+            String billStatus = this.getModel().getDataEntity().getString("billstatus");
+            this.setViewFlowChartVisible(billStatus);
+        }
+
+        if (CommUtils.anyMatchStr(operateKey, new String[]{"unsubmit", "save", "submit", "submiteffect"})) {
+            this.getView().updateView();
+        }
+
+    }
+
+    public void beforeItemClick(BeforeItemClickEvent evt) {
+        String key = evt.getItemKey();
+        int[] selectRows;
+        String confirmStr;
+        if (HRStringUtils.equals(key, "delemp")) {
+            selectRows = ((EntryGrid)this.getControl("changeentry")).getSelectRows();
+            if (selectRows.length != 0) {
+                confirmStr = ResManager.loadKDString("确定要删除选中的数据吗?", "BatchChangeGradeLevelEdit_1", "tdc-tjga-formplugin", new Object[0]);
+                this.getView().showConfirm(confirmStr, MessageBoxOptions.OKCancel, new ConfirmCallBackListener("delemp"));
+                evt.setCancel(true);
+            }
+        }
+
+        if ("batchwrite".equals(key)) {
+            selectRows = ((EntryGrid)this.getControl("changeentry")).getSelectRows();
+            if (selectRows.length == 0) {
+                confirmStr = ResManager.loadKDString("请选择要执行的数据。", "BatchChangeGradeLevelEdit_2", "tdc-tjga-formplugin", new Object[0]);
+                this.getView().showTipNotification(confirmStr);
+                evt.setCancel(true);
+            }
+        }
+
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        super.confirmCallBack(messageBoxClosedEvent);
+        String callBackId = messageBoxClosedEvent.getCallBackId();
+        if ("delemp".equals(callBackId) && MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+            this.getView().invokeOperation("deleteentry");
+            this.setEntryEnable();
+        }
+
+        if (CommUtils.anyMatchStr(callBackId, new String[]{"save", "submit", "submiteffect"}) && MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+            this.getView().getPageCache().put("notNeedCheck", "notNeedCheck");
+            this.getView().invokeOperation(callBackId);
+        }
+
+    }
+
+    @Override
+    public void itemClick(ItemClickEvent evt) {
+        super.itemClick(evt);
+        String key = evt.getItemKey();
+        if (HRStringUtils.equals(key, "addemp")) {
+            (new ControlDataSyn()).entryToMulBaseEdit(this, "ermanfiles", "changeentry", "employee");
+            BasedataEdit talentfile = (BasedataEdit)this.getControl("ermanfiles");
+            talentfile.click();
+        }
+    }
+
+    public void beforeF7Select(BeforeF7SelectEvent beforeF7SelectEvent) {
+        String name = beforeF7SelectEvent.getProperty().getName();
+        ListShowParameter formShowParameter = (ListShowParameter)beforeF7SelectEvent.getFormShowParameter();
+        if ("ermanfiles".equals(name)) {
+            List<QFilter> customQFilters = beforeF7SelectEvent.getCustomQFilters();
+//            QFilter orgPermissionQFilter = PermissionApplicationService.bosOrgQFilter("tjga", "tjga_batchjob", "47150e89000000ac", "org");
+//            customQFilters.add(orgPermissionQFilter);
+//            customQFilters.add(new QFilter("iscurrentversion", "=", "1"));
+//            customQFilters.add(new QFilter("datastatus", "=", "1"));
+//            customQFilters.add(new QFilter("isprimary", "=", "1"));
+//            logger.info("BatchChangeGradeLevelEdit#beforeF7Select TALENT_FILE filter:{}", customQFilters.toString());
+            formShowParameter.setCloseCallBack(new CloseCallBack(this, "ermanfiles"));
+        }
+
+        if ("hrbu".equals(name)) {
+            formShowParameter.setMultiSelect(false);
+        }
+
+        if ("jobgrade".equals(name) || "joblevel".equals(name)) {
+            int currRow = this.getModel().getEntryCurrentRowIndex("changeentry");
+            DynamicObject entryRowEntity = this.getModel().getEntryRowEntity("changeentry", currRow);
+            DynamicObject jobObj = entryRowEntity.getDynamicObject("job");
+            BatchChangeGradeLevelFormService formService = new BatchChangeGradeLevelFormService();
+            String scmName = "jobgrade".equals(name) ? "jobgradescm" : "joblevelscm";
+            DynamicObject scmObj = entryRowEntity.getDynamicObject(scmName);
+            String lowJobIdKey = "jobgrade".equals(name) ? "lowjobgrade.id" : "lowjoblevel.id";
+            String highJobIdKey = "jobgrade".equals(name) ? "highjobgrade.id" : "highjoblevel.id";
+            String sortKey = "jobgrade".equals(name) ? "jobgrade_seq" : "joblevel_seq";
+            String sortStr = "jobgrade".equals(name) ? "jobgradeseq asc" : "joblevelseq asc";
+            List<Long> ids = formService.getGradeOrLevelRangeIds(jobObj, lowJobIdKey, highJobIdKey, sortKey, scmObj);
+            beforeF7SelectEvent.getCustomQFilters().add(new QFilter("id", "in", ids));
+            formShowParameter.getListFilterParameter().setOrderBy(sortStr);
+        }
+
+    }
+
+    public void closedCallBack(ClosedCallBackEvent closedCallBackEvent) {
+        String actionId = closedCallBackEvent.getActionId();
+        long entryGradeId;
+        if ("ermanfiles".equals(actionId)) {
+            List<Object> primaryIds = getCallBackSelectIds(closedCallBackEvent);
+            if (HRCollUtil.isEmpty(primaryIds)) {
+                return;
+            }
+
+            if (primaryIds.size() >= 100000) {
+                this.getView().showErrorNotification(ResManager.loadKDString("最多只能添加100000条数据。", "BatchChangeGradeLevelEdit_11", "tdc-tjga-formplugin", new Object[0]));
+                return;
+            }
+
+            BatchChangeGradeLevelFormService formService = new BatchChangeGradeLevelFormService();
+            List<Long> primaryIdList = (List)primaryIds.stream().map((p) -> {
+                return (Long)p;
+            }).collect(Collectors.toList());
+            DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("changeentry");
+            Set<Long> existsTalentId = (Set)entryEntity.stream().map((d) -> {
+                return d.getLong("employee.id");
+            }).collect(Collectors.toSet());
+            Set<Long> checkProcessingId = (Set)primaryIdList.stream().filter((id) -> {
+                return !existsTalentId.contains(id);
+            }).collect(Collectors.toSet());
+            Set<Long> processingTalentIds = (Set)formService.showProcessingEmp(this, checkProcessingId);
+            Set<Long> notProcessingIds = (Set)primaryIdList.stream().filter((id) -> {
+                return !processingTalentIds.contains(id);
+            }).collect(Collectors.toSet());
+            this.getModel().setValue("ermanfiles", notProcessingIds.toArray());
+            Set<Long> newIdSet = (new ControlDataSyn()).mulBaseEditToEntry(this, "ermanfiles", new String[]{"id","person.id"}, "changeentry", new String[]{"employee","person"});
+
+            DynamicObjectCollection changeCollection = this.getModel().getDataEntity(true).getDynamicObjectCollection("changeentry");
+            Set<Long> empIdSet = (Set)changeCollection.stream().filter((d) -> {
+                return newIdSet.contains(d.getLong("employee.id"));
+            }).map((d) -> {
+                return d.getLong("employee.id");
+            }).collect(Collectors.toSet());
+            Map<Long, DynamicObject> empJobMap = (new BatchChangeGradeLevelApplication()).queryEmpJobInfo(empIdSet);
+            Map<String, Object> permissionHrBuMap = formService.currentUserPermissionHrBu();
+            IDataModel model = this.getModel();
+            model.beginInit();
+
+            for(int rowNum = 0; rowNum < changeCollection.size(); ++rowNum) {
+                DynamicObject changeRowObj = (DynamicObject)changeCollection.get(rowNum);
+                if (newIdSet.contains(changeRowObj.getLong("employee.id"))) {
+                    model.setValue("name", changeRowObj.getString("person.name"), rowNum);
+                    model.setValue("number", changeRowObj.getString("person.number"), rowNum);
+                    Long employeeId = changeRowObj.getLong("employee.id");
+                    DynamicObject empJobObj = (DynamicObject)empJobMap.get(employeeId);
+                    if (!HRObjectUtils.isEmpty(empJobObj)) {
+                        entryGradeId = empJobObj.getLong("hrbu.id");
+                        model.setValue("bhrbu", entryGradeId, rowNum);
+                        model.setValue("bjob", empJobObj.getLong("job.id"), rowNum);
+                        model.setValue("bjobgradescm", empJobObj.getLong("jobgradescm.id"), rowNum);
+                        model.setValue("bjobgrade", empJobObj.getLong("jobgrade.id"), rowNum);
+                        model.setValue("bjoblevelscm", empJobObj.getLong("joblevelscm.id"), rowNum);
+                        model.setValue("bjoblevel", empJobObj.getLong("joblevel.id"), rowNum);
+                        model.setValue("bjobscm", empJobObj.getLong("jobscm.id"), rowNum);
+                        Date startDate = empJobObj.getDate("startdate");
+                        model.setValue("startdate", startDate, rowNum);
+                        String bjobSeqName = HRStringUtils.isEmpty(empJobObj.getString("jobseq.name")) ? "-" : empJobObj.getString("jobseq.name");
+                        String bjobFailyName = HRStringUtils.isEmpty(empJobObj.getString("jobfamily.name")) ? "-" : empJobObj.getString("jobfamily.name");
+                        String bjobClassName = HRStringUtils.isEmpty(empJobObj.getString("jobclass.name")) ? "-" : empJobObj.getString("jobclass.name");
+                        String seqFamilyClass = CommUtils.appendStr(new String[]{bjobSeqName, "/", bjobFailyName, "/", bjobClassName});
+                        model.setValue("bseqfamclass", seqFamilyClass, rowNum);
+                        Boolean superUser = (Boolean)permissionHrBuMap.get("superUser");
+                        Set<Long> ids = (Set)permissionHrBuMap.get("PermissionHrBuIds");
+                        if (superUser || ids.contains(entryGradeId)) {
+                            model.setValue("hrbu", entryGradeId, rowNum);
+                            model.setValue("job", empJobObj.getLong("job.id"), rowNum);
+                            model.setValue("seqfamclass", seqFamilyClass, rowNum);
+                            DynamicObject entryRowEntity = this.getModel().getEntryRowEntity("changeentry", rowNum);
+                            Long jobGradeScmId = formService.getJobGradeOrLevelScm(entryRowEntity.getDynamicObject("job"), "jobgradescm");
+                            Boolean gradeScmEnable = jobGradeScmId == 0L ? Boolean.TRUE : Boolean.FALSE;
+                            this.getView().setEnable(gradeScmEnable, rowNum, new String[]{"jobgradescm"});
+                            model.setValue("jobgradescm", jobGradeScmId, rowNum);
+                            Long jobLevelScmId = formService.getJobGradeOrLevelScm(entryRowEntity.getDynamicObject("job"), "joblevelscm");
+                            Boolean levelScmEnable = jobLevelScmId == 0L ? Boolean.TRUE : Boolean.FALSE;
+                            this.getView().setEnable(levelScmEnable, rowNum, new String[]{"joblevelscm"});
+                            model.setValue("joblevelscm", jobLevelScmId, rowNum);
+                        }
+
+                        model.setValue("billnoentry", this.getModel().getDataEntity().getString("billno"), rowNum);
+                    }
+                }
+            }
+
+            model.endInit();
+            this.getView().updateView("changeentry");
+            this.setEntryEnable();
+        }
+
+        Map returnData;
+        if ("batchwrite".equals(actionId)) {
+            returnData = (Map)closedCallBackEvent.getReturnData();
+            if (returnData != null && returnData.size() > 0) {
+                DynamicObjectCollection changeEntry = this.getModel().getEntryEntity("changeentry");
+                int[] selectRows = ((EntryGrid)this.getControl("changeentry")).getSelectRows();
+                Set<Integer> selectRowSet = (Set)Arrays.stream(selectRows).boxed().collect(Collectors.toSet());
+                IDataModel model = this.getModel();
+                model.beginInit();
+
+                for(int i = 0; i < changeEntry.size(); ++i) {
+                    if (selectRowSet.contains(i)) {
+                        if (!HRObjectUtils.isEmpty(returnData.get("changetype"))) {
+                            this.getModel().setValue("changetype", returnData.get("changetype"), i);
+                        }
+
+                        Date startDate = ((DynamicObject)changeEntry.get(i)).getDate("startdate");
+                        Date changeEffDate = (Date)returnData.get("changeeffdate");
+                        if ((HRObjectUtils.isEmpty(changeEffDate) || startDate == null || !startDate.before(changeEffDate)) && startDate != null) {
+                            if (!HRObjectUtils.isEmpty(changeEffDate)) {
+                                this.getModel().setValue("changeeffdate", (Object)null, i);
+                            }
+                        } else {
+                            this.getModel().setValue("changeeffdate", changeEffDate, i);
+                        }
+
+                        Object batchHrBUId = returnData.get("hrbu");
+                        long entryHuBuId = ((DynamicObject)changeEntry.get(i)).getLong("hrbu.id");
+                        if (!TjgaObjectUtils.isEmpty(batchHrBUId) && (Long)batchHrBUId != entryHuBuId) {
+                            this.getModel().setValue("hrbu", returnData.get("hrbu"), i);
+                            this.getModel().setValue("job", (Object)null, i);
+                            this.getModel().setValue("jobgradescm", (Object)null, i);
+                            this.getModel().setValue("jobgrade", (Object)null, i);
+                            this.getModel().setValue("joblevelscm", (Object)null, i);
+                            this.getModel().setValue("joblevel", (Object)null, i);
+                        }
+
+                        Object batchJobId = returnData.get("job");
+                        long entryJobId = ((DynamicObject)changeEntry.get(i)).getLong("job.id");
+                        if (!TjgaObjectUtils.isEmpty(batchJobId) && (Long)batchJobId != entryJobId) {
+                            this.getModel().setValue("job", returnData.get("job"), i);
+                            this.getModel().setValue("seqfamclass", returnData.get("seqfamclass"), i);
+                            this.getModel().setValue("jobgradescm", (Object)null, i);
+                            this.getModel().setValue("jobgrade", (Object)null, i);
+                            this.getModel().setValue("joblevelscm", (Object)null, i);
+                            this.getModel().setValue("joblevel", (Object)null, i);
+                        }
+
+                        Object batchGradeScmId = returnData.get("jobgradescm");
+                        long entryGradeScmId = ((DynamicObject)changeEntry.get(i)).getLong("jobgradescm.id");
+                        if (!TjgaObjectUtils.isEmpty(batchGradeScmId) && (Long)batchGradeScmId != entryGradeScmId) {
+                            this.getModel().setValue("jobgradescm", returnData.get("jobgradescm"), i);
+                            this.getModel().setValue("jobgrade", (Object)null, i);
+                        }
+
+                        Object batchGradeId = returnData.get("jobgrade");
+                        entryGradeId = ((DynamicObject)changeEntry.get(i)).getLong("jobgrade.id");
+                        if (!TjgaObjectUtils.isEmpty(batchGradeId) && (Long)batchGradeId != entryGradeId) {
+                            this.getModel().setValue("jobgrade", returnData.get("jobgrade"), i);
+                        }
+
+                        Object batchLevelScmId = returnData.get("joblevelscm");
+                        long entryLevelScmId = ((DynamicObject)changeEntry.get(i)).getLong("joblevelscm.id");
+                        if (!TjgaObjectUtils.isEmpty(batchLevelScmId) && (Long)batchLevelScmId != entryLevelScmId) {
+                            this.getModel().setValue("joblevelscm", returnData.get("joblevelscm"), i);
+                            this.getModel().setValue("joblevel", (Object)null, i);
+                        }
+
+                        Object batchLevelId = returnData.get("joblevel");
+                        long entryLevelId = ((DynamicObject)changeEntry.get(i)).getLong("joblevel.id");
+                        if (!TjgaObjectUtils.isEmpty(batchLevelId) && (Long)batchLevelId != entryLevelId) {
+                            this.getModel().setValue("joblevel", returnData.get("joblevel"), i);
+                        }
+
+                        if (!HRObjectUtils.isEmpty(returnData.get("changereason"))) {
+                            this.getModel().setValue("changereason", returnData.get("changereason"), i);
+                        }
+                    }
+                }
+
+                model.endInit();
+                this.getView().updateView("changeentry");
+                this.setEntryEnable();
+            }
+        }
+
+        if ("terminate_bill_callback".equals(actionId)) {
+            returnData = (Map)closedCallBackEvent.getReturnData();
+            if (!HRMapUtils.isEmpty(returnData) && returnData.get("iscofirm") != null && (Boolean)returnData.get("iscofirm")) {
+                List<DynamicObject> processingBills = this.opCheck();
+                if (HRCollUtil.isEmpty(processingBills)) {
+                    return;
+                }
+
+                OperateOption operateOption = OperateOption.create();
+                operateOption.setVariableValue("terreason", returnData.get("details").toString());
+                this.getView().invokeOperation("terminate", operateOption);
+                String successStr = ResManager.loadKDString("终止成功。", "BatchChangeGradeLevelList_3", "tdc-tjga-formplugin", new Object[0]);
+                this.getView().showSuccessNotification(successStr);
+                this.getView().invokeOperation("refresh");
+            }
+        }
+
+    }
+
+    private List<DynamicObject> opCheck() {
+        String billStatus = this.getModel().getDataEntity().getString("billstatus");
+        if ("A".equals(billStatus)) {
+            return Lists.newArrayList(new DynamicObject[]{new DynamicObject()});
+        } else {
+            Long id = this.getModel().getDataEntity().getLong("id");
+            List<DynamicObject> processingBills = (new BatchChangeGradeLevelFormService()).getProcessingBills(Lists.newArrayList(new Long[]{id}));
+            if (HRCollUtil.isEmpty(processingBills)) {
+                String listStr = ResManager.loadKDString("操作失败,当前单据状态已变更。", "BatchChangeGradeLevelEdit_10", "tdc-tjga-formplugin", new Object[0]);
+                this.getView().showErrorNotification(listStr);
+                this.getView().invokeOperation("refresh");
+                return new ArrayList();
+            } else {
+                return processingBills;
+            }
+        }
+    }
+
+    public static List<Object> getCallBackSelectIds(ClosedCallBackEvent closedCallBackEvent) {
+        ListSelectedRowCollection returnData = (ListSelectedRowCollection)closedCallBackEvent.getReturnData();
+        if (returnData == null) {
+            return new ArrayList();
+        } else {
+            List<Object> primaryIds = (List)returnData.stream().map(ListSelectedRow::getPrimaryKeyValue).collect(Collectors.toList());
+            return primaryIds;
+        }
+    }
+
+    public void beforeClosed(BeforeClosedEvent e) {
+        super.beforeClosed(e);
+        FormCommonService FORM_COMMON_SERVICE = new FormCommonService();
+        FORM_COMMON_SERVICE.setPropertyNotDataChanged(this.getModel(), new String[]{"talentfile", "talentfileentry", "person", "employee", "startdate", "billnoentry"});
+    }
+
+    public void resetDateFilter(ResetDateFilterEvent resetDateFilterEvent) {
+        int currentRow = this.getModel().getEntryCurrentRowIndex("changeentry");
+        DynamicObject entryRowEntity = this.getModel().getEntryRowEntity("changeentry", currentRow);
+        Date startDate = entryRowEntity.getDate("startdate");
+        DateEdit changeeffdate = (DateEdit)this.getControl("changeeffdate");
+        if (startDate != null) {
+            changeeffdate.setMinDate(HRDateTimeUtils.addDay(startDate, 1L));
+        } else {
+            try {
+                changeeffdate.setMinDate(HRDateTimeUtils.parseDate("1900-01-01", "yyyy-MM-dd"));
+            } catch (ParseException var7) {
+                var7.printStackTrace();
+            }
+        }
+
+    }
+
+    public void entryGridBindData(EntryGridBindDataEvent e) {
+        this.setEntryEnable();
+    }
+}

+ 25 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/web/AdjustJobBillEffectOp.java

@@ -0,0 +1,25 @@
+package nckd.jimin.jyyy.hr.swc.hcdm.formplugin.web;
+
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.args.AfterOperationArgs;
+import kd.sdk.plugin.Plugin;
+import kd.tdc.tjga.business.task.ScheduleExecutor;
+
+import java.util.HashMap;
+
+/**
+ * 批量职等调整单生效插件
+ * 调用调度计划
+ * Tyx
+ * 2025-06-08
+ */
+public class AdjustJobBillEffectOp extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+        ScheduleExecutor scheduleExecutor = new ScheduleExecutor();
+        scheduleExecutor.setJobCustomParams("5/BIP+ZNTT/6", new HashMap(4));
+        scheduleExecutor.dispatch("5/BIRZNR2F16", ScheduleExecutor.isSerialWithJobTask("5/BIP+ZNTT/6"));
+    }
+}

+ 36 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/formplugin/web/AdjustJobBillSaveCheckOp.java

@@ -0,0 +1,36 @@
+package nckd.jimin.jyyy.hr.swc.hcdm.formplugin.web;
+
+import com.google.common.collect.Lists;
+import kd.bos.dataentity.OperateOption;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeforeOperationArgs;
+import kd.hr.hbp.common.util.HRStringUtils;
+import kd.sdk.plugin.Plugin;
+import kd.tdc.tjga.opplugin.validator.quickchange.BatchChangeGradeLevelSaveValidator;
+import nckd.jimin.jyyy.hr.swc.hcdm.formplugin.validator.AdjustJobBillSaveValidator;
+
+/**
+ * 单据操作插件
+ */
+public class AdjustJobBillSaveCheckOp extends AbstractOperationServicePlugIn implements Plugin {
+    public void onPreparePropertys(PreparePropertysEventArgs eventArgs) {
+        eventArgs.getFieldKeys().addAll(Lists.newArrayList(new String[]{"billstatus", "changeentry"}));
+    }
+
+    public void onAddValidators(AddValidatorsEventArgs eventArgs) {
+        super.onAddValidators(eventArgs);
+        eventArgs.addValidator(new AdjustJobBillSaveValidator());
+    }
+
+    public void beforeExecuteOperationTransaction(BeforeOperationArgs e) {
+        super.beforeExecuteOperationTransaction(e);
+        OperateOption operateOption = this.getOption();
+        String isOpCancel = operateOption.getVariableValue("isopcancel", (String)null);
+        if (HRStringUtils.equals(isOpCancel, "1")) {
+            e.setCancel(true);
+        }
+
+    }
+}

+ 148 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/swc/hcdm/task/AdjustJobBillEffectTask.java

@@ -0,0 +1,148 @@
+package nckd.jimin.jyyy.hr.swc.hcdm.task;
+
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.exception.KDException;
+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.schedule.executor.AbstractTask;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
+import kd.hr.hbp.business.servicehelper.HRMServiceHelper;
+import kd.hr.hbp.common.util.HRArrayUtils;
+import kd.hr.hbp.common.util.HRCollUtil;
+import kd.hr.hbp.common.util.HRDateTimeUtils;
+import kd.hr.hbp.common.util.HRObjectUtils;
+import kd.hrmp.hrpi.business.infrastructure.utils.QFilterUtil;
+import kd.sdk.plugin.Plugin;
+import kd.tdc.tjga.business.application.external.ChgService;
+import kd.tdc.tjga.business.domain.repository.BatchChangeJobRepository;
+import kd.tdc.tjga.business.domain.service.hrpi.IHrpiDomainService;
+import kd.tdc.tjga.business.task.BatchChangeGradeLevelTask;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 后台任务插件
+ */
+public class AdjustJobBillEffectTask extends AbstractTask implements Plugin {
+    private static final Log log = LogFactory.getLog(AdjustJobBillEffectTask.class);
+    private static HRBaseServiceHelper BillHelper = new HRBaseServiceHelper("nckd_jobadjustbill");
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map1) throws KDException {
+        Date nowDateTime = HRDateTimeUtils.getNowDateTime();
+        QFilter billStatus = new QFilter("billstatus", "=", "C");
+        QFilter auditStatus = new QFilter("auditstatus", "=", "C");
+        QFilter changeOver = new QFilter("changeover", "=", "0");
+        QFilter effectFilter = new QFilter("changeentry.changeeffdate", "<=", nowDateTime);
+        QFilter changeStatus = new QFilter("changeentry.changestatus", "=", "0");
+        DynamicObject[] batchJobObj = BillHelper.loadDynamicObjectArray(new QFilter[]{billStatus, auditStatus, changeOver, effectFilter, changeStatus});
+        if (!HRArrayUtils.isEmpty(batchJobObj)) {
+            List<DynamicObject> allEntryObjs = new ArrayList(16);
+            DynamicObject[] var11 = batchJobObj;
+            int var12 = batchJobObj.length;
+
+            for(int var13 = 0; var13 < var12; ++var13) {
+                DynamicObject jobObj = var11[var13];
+                DynamicObjectCollection entryObj = jobObj.getDynamicObjectCollection("changeentry");
+                if (!HRCollUtil.isEmpty(entryObj)) {
+                    allEntryObjs.addAll(entryObj);
+                }
+            }
+
+            if (!HRCollUtil.isEmpty(allEntryObjs)) {
+                List<Long> employeeIds = (List)allEntryObjs.stream().map((e1) -> {
+                    return e1.getLong("employee.id");
+                }).collect(Collectors.toList());
+                IHrpiDomainService hrpiDomainService = IHrpiDomainService.getInstance();
+                Map<Long, DynamicObject> mainEmpposorgrels = hrpiDomainService.getEmpposorgrelByEmployeeIds(employeeIds, "employee,company");
+                Iterator var28 = allEntryObjs.iterator();
+
+                while(var28.hasNext()) {
+                    DynamicObject entryObj = (DynamicObject)var28.next();
+                    Date effectDate = entryObj.getDate("changeeffdate");
+                    if (!nowDateTime.before(effectDate)) {
+                        Map<String, Object> map = new HashMap(16);
+                        map.put("personId", entryObj.getLong("person.id"));
+                        Long employeeId = entryObj.getLong("employee.id");
+                        map.put("employeeId", employeeId);
+                        map.put("chgActionId", 1360L);
+                        map.put("appId", "tjga");
+                        map.put("effectTime", effectDate.getTime());
+
+                        //查询任职经历Id
+                        QFilter filter = QFilterUtil.getCurrentQf();
+                        filter.and("datastatus", QCP.equals, "1");
+                        filter.and("employee.id", QCP.equals, employeeId);
+                        filter.and("person.id", QCP.equals, entryObj.getLong("person.id"));
+                        DynamicObject posOrgRel = QueryServiceHelper.queryOne("hrpi_empposorgrel", "id", new QFilter[]{filter});
+                        (new ChgService()).queryPersonInfo(posOrgRel.getLong("id"), map);
+                        Map<String, Object> valueMap = new HashMap(16);
+                        DynamicObject dynamicObject = (DynamicObject)mainEmpposorgrels.get(employeeId);
+                        if (!HRObjectUtils.isEmpty(dynamicObject)) {
+                            valueMap.put("1310_S_empjobrel_company", dynamicObject.getLong("company.id"));
+                        }
+
+                        valueMap.put("1310_S_empjobrel_hrbu", entryObj.getLong("hrbu.id"));
+                        valueMap.put("1310_S_empjobrel_job", entryObj.getLong("job.id"));
+                        valueMap.put("1310_S_empjobrel_jobgradescm", entryObj.getLong("jobgradescm.id"));
+                        valueMap.put("1310_S_empjobrel_jobgrade", entryObj.getLong("jobgrade.id"));
+                        valueMap.put("1310_S_empjobrel_joblevelscm", entryObj.getLong("joblevelscm.id"));
+                        valueMap.put("1310_S_empjobrel_joblevel", entryObj.getLong("joblevel.id"));
+                        if (!HRObjectUtils.isEmpty(entryObj.getDynamicObject("job"))) {
+                            valueMap.put("1310_S_empjobrel_jobscm", entryObj.getDynamicObject("job").getLong("jobscm.id"));
+                        }
+
+                        DynamicObject jobObj = entryObj.getDynamicObject("job");
+                        if (!HRObjectUtils.isEmpty(jobObj)) {
+                            valueMap.put("1310_S_empjobrel_jobseq", jobObj.getLong("jobseq.id"));
+                            valueMap.put("1310_S_empjobrel_jobfamily", jobObj.getLong("jobfamily.id"));
+                            valueMap.put("1310_S_empjobrel_jobclass", jobObj.getLong("jobclass.id"));
+                        }
+
+                        valueMap.put("1310_S_empjobrel_variationtype", 102030L);
+                        valueMap.put("1310_S_empjobrel_enddate", HRDateTimeUtils.getSysMaxDate());
+                        map.put("valueMap", valueMap);
+                        log.info("BatchChangeGradeLevelTask.begin");
+                        Map<String, Object> userInfo = (Map) HRMServiceHelper.invokeHRService("hpfs", "IHPFSPersonChgService", "executeActionPersonalChange", new Object[]{map});
+                        log.info("BatchChangeGradeLevelTask.end");
+                        boolean success = (Boolean)userInfo.get("success");
+                        if (!success) {
+                            String errorMsg = (String)userInfo.get("errorMsg");
+                            log.info("BatchChangeGradeLevelTask.error map value:{}", map.toString());
+                            log.error("BatchChangeGradeLevelTask.error error:{}", errorMsg);
+                            entryObj.set("synresult", "2");
+                        } else {
+                            entryObj.set("synresult", "1");
+                            entryObj.set("changestatus", "1");
+                        }
+                    }
+                }
+
+                DynamicObject[] var29 = batchJobObj;
+                int var31 = batchJobObj.length;
+
+                for(int var32 = 0; var32 < var31; ++var32) {
+                    DynamicObject gradeLevelObj = var29[var32];
+                    DynamicObjectCollection dynamicObjectCollection = gradeLevelObj.getDynamicObjectCollection("changeentry");
+                    if (!HRCollUtil.isEmpty(dynamicObjectCollection)) {
+                        Long changedNum = dynamicObjectCollection.stream().filter((d) -> {
+                            return "1".equals(d.getString("changestatus"));
+                        }).count();
+                        gradeLevelObj.set("changednum", changedNum.intValue());
+                        gradeLevelObj.set("totalnum", dynamicObjectCollection.size());
+                        if (changedNum.intValue() == dynamicObjectCollection.size()) {
+                            gradeLevelObj.set("changeover", "1");
+                        }
+                    }
+                }
+
+                BatchChangeJobRepository.updates(batchJobObj);
+            }
+        }
+    }
+}