Explorar o código

1.MDM相关代码package变动
2.年度招聘申请、年度招聘计划、临时招聘申请相关表单和操作插件

Tyx hai 3 días
pai
achega
9030cfd767
Modificáronse 20 ficheiros con 2863 adicións e 11 borrados
  1. 0 2
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/opplugin/web/position/AutoEndPartTimeTask.java
  2. 1 1
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/PositionTree.java
  3. 1 1
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncAdminOrgTask.java
  4. 1 1
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncPersonTask.java
  5. 1 3
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncPositionTask.java
  6. 1 3
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncUtil.java
  7. 695 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/CasRecrApplyFormPlugin.java
  8. 103 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/CasRecrApplyListPlugin.java
  9. 781 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyFormPlugin.java
  10. 130 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyListPlugin.java
  11. 441 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyPlanFormPlugin.java
  12. 68 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyPlanListPlugin.java
  13. 61 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/CasRecrApplyUnAuditValidator.java
  14. 86 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/CasRecrApplyWorkFlowPlugin.java
  15. 151 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyPlanOperatePlugin.java
  16. 66 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyPlanUnAuditValidator.java
  17. 73 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyPlanWorkFlowPlugin.java
  18. 56 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplySubmitValidator.java
  19. 86 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyWorkFlowPlugin.java
  20. 61 0
      code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/util/RecUtils.java

+ 0 - 2
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/opplugin/web/position/AutoEndPartTimeTask.java

@@ -13,11 +13,9 @@ import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
 import kd.bos.schedule.executor.AbstractTask;
 import kd.bos.servicehelper.BusinessDataServiceHelper;
-import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.hr.hdm.business.domain.parttime.ParttimeServiceHelper;
 import kd.hr.hdm.business.domain.transfer.service.external.PersonExternalService;
 import kd.sdk.plugin.Plugin;
-import nckd.jimin.jyyy.hr.haos.staff.plugin.task.SyncAdminOrgTask;
 import nckd.jimin.jyyy.hr.wtc.wtabm.opplugin.web.vaapply.VaApplyBillUtil;
 
 import java.util.*;

+ 1 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/staff/plugin/task/PositionTree.java → code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/PositionTree.java

@@ -1,4 +1,4 @@
-package nckd.jimin.jyyy.hr.haos.staff.plugin.task;
+package nckd.jimin.jyyy.hr.hrmp.hbpm.task;
 
 import java.io.Serializable;
 import java.util.ArrayList;

+ 1 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/staff/plugin/task/SyncAdminOrgTask.java → code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncAdminOrgTask.java

@@ -1,4 +1,4 @@
-package nckd.jimin.jyyy.hr.haos.staff.plugin.task;
+package nckd.jimin.jyyy.hr.hrmp.hbpm.task;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;

+ 1 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/staff/plugin/task/SyncPersonTask.java → code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncPersonTask.java

@@ -1,4 +1,4 @@
-package nckd.jimin.jyyy.hr.haos.staff.plugin.task;
+package nckd.jimin.jyyy.hr.hrmp.hbpm.task;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;

+ 1 - 3
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/staff/plugin/task/SyncPositionTask.java → code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncPositionTask.java

@@ -1,4 +1,4 @@
-package nckd.jimin.jyyy.hr.haos.staff.plugin.task;
+package nckd.jimin.jyyy.hr.hrmp.hbpm.task;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -8,11 +8,9 @@ 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.orm.util.CollectionUtils;
 import kd.bos.schedule.executor.AbstractTask;
-import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.util.StringUtils;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.sdk.plugin.Plugin;

+ 1 - 3
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/haos/staff/plugin/task/SyncUtil.java → code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/hrmp/hbpm/task/SyncUtil.java

@@ -1,4 +1,4 @@
-package nckd.jimin.jyyy.hr.haos.staff.plugin.task;
+package nckd.jimin.jyyy.hr.hrmp.hbpm.task;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -8,7 +8,6 @@ import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.db.DB;
 import kd.bos.db.DBRoute;
-import kd.bos.exception.KDException;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
 import kd.bos.orm.query.QCP;
@@ -17,7 +16,6 @@ import kd.bos.servicehelper.BusinessDataServiceHelper;
 import kd.bos.servicehelper.QueryServiceHelper;
 import kd.bos.servicehelper.operation.SaveServiceHelper;
 import kd.bos.util.HttpClientUtils;
-import kd.bos.workflow.exception.WFErrorCode;
 import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 
 import java.io.IOException;

+ 695 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/CasRecrApplyFormPlugin.java

@@ -0,0 +1,695 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.bill.BillShowParameter;
+import kd.bos.bill.OperationStatus;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.datamodel.events.*;
+import kd.bos.exception.KDBizException;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.importentry.resolving.ImportEntryData;
+import kd.bos.list.ListShowParameter;
+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.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.org.OrgUnitServiceHelper;
+import kd.hr.hbp.business.openservicehelper.hrpi.HRPIPersonServiceHelper;
+import nckd.jimin.jyyy.hr.tsrsc.plugin.util.RecUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-临时招聘申请
+ * Description      :临时招聘申请单据插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_casrecrapply
+ */
+
+
+
+public class CasRecrApplyFormPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener {
+
+    private static Log logger = LogFactory.getLog(CasRecrApplyFormPlugin.class);
+
+    // 公司类型
+    private final List<String> COMPANY_LIST = Arrays.asList(new String[]{"1020_S","1050_S","1060_S","1070_S"});
+
+    private final List<String> COMPANY_LIST2 = Arrays.asList(new String[]{"Orgform01","Orgform01-100","Orgform02","Orgform03"});
+
+    // 定义日期格式
+    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+    private final String SUBMIT = "submit";
+
+    private static String OPPARAM_AFTERCONFIRM = "afterconfirm";
+
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+//        DispatchServiceHelper.invokeService("kd.hrmp.haos.servicehelper","haos","IHAOSStaffService","queryUseStaffInfo",objects);
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+        Object billstatus = this.getModel().getValue("billstatus");
+        // 暂存状态才发生变化
+        if(ObjectUtils.equals(billstatus,"A")){
+            DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+            updateStaffCount();
+            // 实际人数
+            this.getModel().setValue("nckd_relnum", RecUtils.getStaffCount(org.getPkValue()));
+        }
+    }
+
+    private void updateStaffCount(){
+
+        DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+        //  组织id
+        Long pkValue = (Long) org.getPkValue();
+        List<Long> longs = new ArrayList<Long>();
+        longs.add(pkValue);
+        QFilter qFilter = new QFilter("boid", QCP.equals, pkValue);
+        // 获取组织历史查询
+        DynamicObjectCollection query = QueryServiceHelper.query("haos_adminorgdetail", "id,boid,hisversion", new QFilter[]{qFilter}, "hisversion desc");
+        if(ObjectUtils.isNotEmpty(query)){
+            long boid = query.get(0).getLong("id");
+            // 获取填写的年度 nckd_year
+            Object nckdYear =  this.getModel().getValue("nckd_year");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+
+            if(ObjectUtils.isEmpty(nckdYear)){
+                nckdYear = new Date();
+            }else{
+                nckdYear = (Date) nckdYear;
+            }
+            String dateStr = sdf.format(nckdYear);
+//            QFilter qFilter2 = new QFilter("staff.year", QCP.like, dateStr + "%");
+            QFilter qFilter1 = new QFilter("dutyorg.id", QCP.equals, boid);
+
+            DynamicObject[] haosDutyorgdetail = BusinessDataServiceHelper.load( "haos_dutyorgdetail","id,dutyorg,staff,staffcount",new QFilter[]{qFilter1},"staff.year desc");
+            if(ObjectUtils.isNotEmpty(haosDutyorgdetail)){
+                DynamicObject dynamicObject = haosDutyorgdetail[0];
+                int staffcount = dynamicObject.getInt("staffcount");
+                this.getModel().setValue("nckd_sftaffcount",staffcount);
+                this.getModel().setValue("nckd_sftaff",dynamicObject.getLong("staff.id"));
+//                for (DynamicObject dynamicObject : haosDutyorgdetail) {
+//                    String format = sdf.format(dynamicObject.getDate("staff.year"));
+//                    if(dateStr.equals(format)){
+//                        int staffcount = dynamicObject.getInt("staffcount");
+//                        this.getModel().setValue("nckd_sftaffcount",staffcount);
+//                        return;
+//                    }
+//                }
+            }
+            this.getModel().setValue("nckd_sftaffcount",null);
+
+//            int staffcount = ObjectUtils.isNotEmpty(haosDutyorgdetail) ? haosDutyorgdetail.getInt("staffcount"):null;
+//            this.getModel().setValue("nckd_sftaffcount",staffcount);
+
+        }
+
+    }
+
+    private List<String> getPostNumber(){
+        DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+        List<String> postNumber = new ArrayList<>();
+        for (DynamicObject dynamicObject : entryentity) {
+            if(ObjectUtils.isNotEmpty(dynamicObject.get("nckd_recruitpost"))){
+                postNumber.add(dynamicObject.getString("nckd_recruitpost.number"));
+            }
+        }
+        return postNumber;
+    }
+
+    @Override
+    public void beforeImportEntry(BeforeImportEntryEventArgs e) {
+        // 临时招聘 导入数据
+//        super.beforeImportEntry(e);
+        logger.info("临时招聘导入数据--------");
+        QFilter qFilter = new QFilter("status", QCP.equals, "C")
+                .and("enable", QCP.equals, "1")
+                .and("iscurrentversion", QCP.equals, "1");
+        Map<String, List<Object>> entryDataMap = e.getEntryDataMap();
+        ObjectMapper objectMapper = new ObjectMapper();
+        List<String> postNumber = getPostNumber();
+        DynamicObject nckdRecruitcompany = (DynamicObject)this.getModel().getValue("org");
+
+        List<Long> longs = new ArrayList<Long>();
+        Long pkValue = (Long) nckdRecruitcompany.getPkValue();
+        longs.add(pkValue);
+        List<Long> allSubordinateOrgIds = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs, true);
+        Integer index = 0;
+        try {
+            String jsonString = objectMapper.writeValueAsString(entryDataMap);
+            logger.info("jsonString:{}",jsonString);
+            JSONObject jsonObject = (JSONObject) JSONObject.parse(jsonString);
+            JSONArray entryentity = jsonObject.getJSONArray("entryentity");
+            JSONObject jsonObject1 = entryentity.getJSONObject(0);
+            index =jsonObject1.getInteger("rowIndex");
+        } catch (JsonProcessingException ex) {
+            throw new RuntimeException(ex);
+        }
+
+
+        Map<String, List<ImportEntryData>> source = (Map)e.getSource();
+        Set<Map.Entry<String, List<ImportEntryData>>> entries = source.entrySet();
+        Iterator var4 = entries.iterator();
+        while (var4.hasNext()){
+            Map.Entry<String, List<ImportEntryData>> entry = (Map.Entry)var4.next();
+            String key = entry.getKey();
+            logger.info("entryentity,key:{}",key);
+            if("entryentity".equals(key)){
+                List<ImportEntryData> entryValue = (List) entry.getValue();
+                List<ImportEntryData> entryValue2 = entryValue;
+                logger.info("获取到导入数据");
+                logger.info("获取到导入数据.size:{}",entryValue2.size());
+                if(entryValue2.size() > 0){
+                    StringBuilder errorBuilder = new StringBuilder();
+                    logger.info("分录数据不为空");
+                    List<Object> listQuerOrg = new ArrayList<>();
+                    List<Object> listQuerPost = new ArrayList<>();
+                    String orgQuery = null;
+                    String postQuery = null;
+                    logger.info("开始构建查询条件");
+                    for (int i = 0; i < entryValue2.size(); i++) {
+                        // 部门
+                        JSONObject nckdRecruitorg = entryValue2.get(i).getData().getJSONObject("nckd_recruitorg");
+                        // 岗位
+                        JSONObject nckdRecruitpost = entryValue2.get(i).getData().getJSONObject("nckd_recruitpost");
+
+                        if(i == 0){
+                            orgQuery = nckdRecruitorg.getString("importprop");
+                            postQuery = nckdRecruitpost.getString("importprop");
+                        }
+                        listQuerOrg.add(nckdRecruitorg.get(orgQuery));
+                        listQuerPost.add(nckdRecruitpost.get(postQuery));
+                    }
+                    logger.info("查询条件listQuerOrg:{},listQuerPost:{}",listQuerOrg,listQuerPost);
+                    QFilter qFilterorg = new QFilter(orgQuery, QCP.in, listQuerOrg);
+                    QFilter qFilterpost = new QFilter(postQuery, QCP.in, listQuerPost);
+                    QFilter qFilterbelongcompany = new QFilter("belongcompany", QCP.in,allSubordinateOrgIds);
+                    DynamicObject[] haosAdminorgf7s = BusinessDataServiceHelper.load("haos_adminorgf7", "id,name,number,status,enable,iscurrentversion", new QFilter[]{qFilter, qFilterorg,qFilterbelongcompany});
+//                    logger.info("查询结果haosAdminorgf7s:{}",haosAdminorgf7s);
+                    String finalOrgQuery = orgQuery;
+                    Map<String, DynamicObject> map1 =
+                            Arrays.stream(haosAdminorgf7s)
+                                    .collect(Collectors.toMap(
+                                            detail -> detail.get(finalOrgQuery).toString(),
+                                            detail -> detail,
+                                            (existing, replacement) -> existing // 保留前面的值
+                                    ));
+
+                    DynamicObject[] hbpmPositionhrs = BusinessDataServiceHelper.load("hbpm_positionhr", "id,name,number,status,enable,iscurrentversion", new QFilter[]{qFilter, qFilterpost});
+//                    logger.info("查询结果hbpmPositionhrs:{}",hbpmPositionhrs);
+                    String finalOrgQuery2 = postQuery;
+                    Map<String, Object> map2 =
+                            Arrays.stream(hbpmPositionhrs)
+                                    .collect(Collectors.toMap(
+                                            detail -> detail.get(finalOrgQuery2).toString(),
+                                            detail -> detail.get("id"),
+                                            (existing, replacement) -> existing // 保留前面的值
+                                    ));
+
+                    String finalPostQuery = postQuery;
+
+                    for (int i = 0; i < entryValue.size(); i++) {
+                        ImportEntryData importEntryData = entryValue.get(i);
+                        int i1 = index + i;
+                        logger.info("修改前importEntryData:{},jsondata:{}",importEntryData.getEntryName(),importEntryData.getData().toString());
+                        // 部门
+                        JSONObject nckdRecruitorg = importEntryData.getData().getJSONObject("nckd_recruitorg");
+                        String imoportprop = nckdRecruitorg.getString("importprop");
+                        Object o = nckdRecruitorg.get(imoportprop);
+                        if(ObjectUtils.isNotEmpty(o)){
+                            DynamicObject o1 = map1.get(o);
+                            JSONObject jsonObject = new JSONObject();
+                            if(ObjectUtils.isEmpty(o1)){
+                                errorBuilder.append("第"+i1+"行"+"部门"+o+"在组织"+nckdRecruitcompany.getString("name")+"下未找到!" + "\n");
+                            }else{
+                                jsonObject.put("importprop","id");
+                                jsonObject.put("id",o1.getPkValue());
+                                importEntryData.getData().remove("nckd_recruitorg");
+                                importEntryData.getData().put("nckd_recruitorg",jsonObject);
+                                // 岗位
+                                JSONObject nckdRecruitpost = importEntryData.getData().getJSONObject("nckd_recruitpost");
+                                String imoportprop2 = nckdRecruitpost.getString("importprop");
+                                Object o2 = nckdRecruitpost.get(imoportprop2);
+                                if(ObjectUtils.isNotEmpty(o)){
+                                    List<Long> longs2 = new ArrayList<Long>();
+                                    longs2.add((Long) o1.getPkValue());
+                                    List<Long> allSubordinateOrgIds2 = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs2, true);
+                                    QFilter qFilter1 = new QFilter("adminorg.id", QCP.in, allSubordinateOrgIds2);
+                                    QFilter qFilter2 = new QFilter(finalPostQuery, QCP.equals, o2);
+                                    DynamicObject hbpmPositionhr = BusinessDataServiceHelper.loadSingle("hbpm_positionhr", "id,name,number,status,enable,iscurrentversion", new QFilter[]{qFilter, qFilterpost, qFilter1,qFilter2});
+                                    if(ObjectUtils.isEmpty(hbpmPositionhr)){
+                                        ((List)source.get("entryentity")).clear();
+                                        errorBuilder.append("第"+i1+"行:"+o2 +"岗位不存在!" + "\n");
+                                    }else{
+                                        if(postNumber.contains(hbpmPositionhr.getString("number"))){
+                                            errorBuilder.append("第"+i1+"行:"+o2 +"岗位重复!"+"\n");
+                                        }else{
+                                            postNumber.add(hbpmPositionhr.getString("number"));
+                                            JSONObject jsonObject2 = new JSONObject();
+                                            jsonObject2.put("importprop","id");
+                                            jsonObject2.put("id",hbpmPositionhr.getPkValue());
+                                            importEntryData.getData().remove("nckd_recruitpost");
+                                            importEntryData.getData().put("nckd_recruitpost",jsonObject2);
+                                        }
+                                    }
+                                }
+                            }
+
+                        }
+                    }
+                    if(ObjectUtils.isNotEmpty(errorBuilder)){
+                        ((List)source.get("entryentity")).clear();
+                        throw new KDBizException(errorBuilder.toString());
+                    }
+                }
+
+
+            }
+
+        }
+
+    }
+
+    @Override
+    public void afterImportData(ImportDataEventArgs e) {
+        super.afterImportData(e);
+    }
+
+    @Override
+    public void loadData(LoadDataEventArgs e) {
+        super.loadData(e);
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        String key = e.getProperty().getName();
+        ChangeData[] changeData = e.getChangeSet();
+        Object newValue = changeData[0].getNewValue();
+        Object oldValue = changeData[0].getOldValue();
+        int iRow = changeData[0].getRowIndex();
+        switch (key) {
+            case "nckd_year":
+                updateStaffCount();
+                break;
+            case "nckd_recruitcompany":
+                // 公司为空清除部门岗位
+                if(!isNotEmpty(newValue)){
+                    this.getModel().setValue("nckd_recruitorg", null,iRow);
+                    this.getModel().setValue("nckd_recruitpost", null,iRow);
+                }
+                break;
+            case "nckd_recruitorg":
+                // 部门,判断是否存企业,如果不存在企业则将部门的所属公司带入到企业中
+                // 修改部门,岗位置为null
+                this.getModel().setValue("nckd_recruitpost", null,iRow);
+                this.getModel().setValue("nckd_compilation", null,iRow);
+                this.getModel().setValue("nckd_currentnum", null,iRow);
+                this.getModel().setValue("nckd_majortype", null,iRow);
+                this.getModel().setValue("nckd_education", null,iRow);
+                this.getModel().setValue("nckd_payrangemin", null,iRow);
+                this.getModel().setValue("nckd_payrange", null,iRow);
+                this.getModel().setValue("nckd_employcategory", null,iRow);
+                this.getModel().setValue("nckd_recruittype", null,iRow);
+                this.getModel().setValue("nckd_employmentreasons", null,iRow);
+                this.getModel().setValue("nckd_approvednum", null,iRow);
+                this.getModel().setValue("nckd_recruitnum", 0,iRow);
+                break;
+            case "nckd_recruitpost":
+                // 岗位,判断是否存企业,如果不存在企业则将部门的所属公司带入到企业中
+                if(isNotEmpty(newValue)){
+                    DynamicObject newValue1 = (DynamicObject) newValue;
+                    // 校验是否有相同岗位
+                    if(!checkPosition(newValue1,iRow)){
+                        this.getView().showErrorNotification("已录入相同岗位!"+newValue1.getString("name")+newValue1.getString("number"));
+                        this.getModel().setValue("nckd_recruitpost", null,iRow);
+                        return;
+                    }
+                    // 获取行政组织,和行政组织的所属公司
+                    // 行政组织
+                    DynamicObject nckdRecruitcompany = (DynamicObject)this.getModel().getValue("nckd_recruitorg", iRow);
+                    if(ObjectUtils.isEmpty(nckdRecruitcompany)){
+                        DynamicObject adminorg = newValue1.getDynamicObject("adminorg");
+                        DynamicObjectCollection entryentity = this.getModel().getDataEntity().getDynamicObjectCollection("entryentity");
+                        for (DynamicObject object : entryentity) {
+                            if(newValue1.getString("number").equals(object.getString("nckd_recruitpost.number"))){
+                                object.set("nckd_recruitorg",adminorg);
+                                break;
+                            }
+                        }
+                    }
+                    this.getModel().setValue("nckd_compilation",getFieldValue(newValue1),iRow);
+                    long id = newValue1.getLong("id");
+                    List<Long> longs = new ArrayList<Long>();
+                    longs.add(id);
+                    Map<Long, Set<Long>> allUsersOfPosition = HRPIPersonServiceHelper.getAllUsersOfPosition("1010_S", longs);
+                    int num = 0;
+                    if(ObjectUtils.isNotEmpty(allUsersOfPosition)){
+                        Set<Long> longSet = allUsersOfPosition.get(id);
+                        List<String> zaizhiStatus = Arrays.asList(new String[]{"1020_S","1010_S","1190_S","1050_S","1140_S","1060_S","1120_S","1210_S"});
+                        QFilter qFilter = new QFilter("person.id", QCP.in, longSet)
+                                .and("iscurrentversion",QCP.equals,"1")
+                                .and("businessstatus",QCP.equals,"1")
+                                .and("labrelstatusprd.number",QCP.in,zaizhiStatus);
+
+                        DynamicObject[] hrpiEmpentrels = BusinessDataServiceHelper.load("hrpi_empentrel", "id,person", qFilter.toArray());
+                        num = hrpiEmpentrels.length;
+                    }
+                    this.getModel().setValue("nckd_currentnum",num,iRow);
+                }else{
+                    this.getModel().setValue("nckd_compilation",null,iRow);
+                    this.getModel().setValue("nckd_currentnum",null,iRow);
+                }
+                this.getModel().setValue("nckd_recruitnum",0,iRow);
+                break;
+            case "nckd_recruitnum":
+                // 人数字段统计
+                setSumRecruitnum(newValue,iRow);
+                checkRecruitnum(newValue,iRow);
+                break;
+            case "nckd_payrangemin":
+                changePayrangemin(newValue,oldValue,iRow);
+                break;
+            case "nckd_payrange":
+                changepayrange(newValue,oldValue,iRow);
+                break;
+            default:
+                break;
+        }
+
+    }
+
+    // 校验岗位人数是否超编制
+    private void checkRecruitnum(Object recruitnum,int row) {
+        if(recruitnum instanceof Integer){
+            // 获取编制人数
+            Object nckdCompilation = this.getModel().getValue("nckd_compilation",row);
+            if(ObjectUtils.isNotEmpty(nckdCompilation)){
+                Integer integer =  (Integer)nckdCompilation;
+                Integer nckdCurrentnum = (Integer)this.getModel().getValue("nckd_currentnum", row);
+                Integer recruitnum1 =  (Integer)recruitnum;
+                if (integer < (nckdCurrentnum + recruitnum1)){
+                    this.getView().showErrorNotification("最高薪资不能低于最低薪资!");
+                }
+            }
+        }
+    }
+
+    // 校验分录的最高薪资和最低薪资大小关系
+    private String vaildatorPayrange(){
+        DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+        StringBuilder errorBuilder = new StringBuilder();
+        for (DynamicObject object : entryentity) {
+            int nckdPayrange = object.getInt("nckd_payrange");
+            int nckdPayrangemin = object.getInt("nckd_payrangemin");
+            if(nckdPayrange < nckdPayrangemin){
+                errorBuilder.append(object.get("seq"));
+            }
+        }
+        if(ObjectUtils.isNotEmpty(errorBuilder)){
+            errorBuilder.append("行,最高薪资不能低于最低薪资!");
+        }
+        return errorBuilder.toString();
+
+    }
+
+    private void changePayrangemin(Object newValue,Object oldValue,int row){
+        if(newValue instanceof Integer){
+            // 最大值
+            Integer nckdPayrange = (Integer)this.getModel().getValue("nckd_payrange",row);
+            int comparisonResult = nckdPayrange.compareTo( (Integer) newValue);
+            if(comparisonResult < 0){
+                this.getView().showErrorNotification("最高薪资不能低于最低薪资!");
+                this.getModel().setValue("nckd_payrangemin",oldValue,row);
+            }
+        }
+    }
+    private void changepayrange(Object newValue,Object oldValue,int row){
+        if(newValue instanceof Integer){
+            // 最大值
+            Integer nckdPayrange = (Integer)this.getModel().getValue("nckd_payrangemin",row);
+            int comparisonResult = ((Integer) newValue).compareTo( (Integer) nckdPayrange);
+            if(comparisonResult < 0){
+                this.getView().showErrorNotification("最高薪资不能低于最低薪资!");
+                this.getModel().setValue("nckd_payrange",oldValue,row);
+            }
+        }
+    }
+
+    private boolean checkPosition(DynamicObject  newValue,int row) {
+        DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+        for (int i = 0; i < entryentity.size(); i++) {
+            if(row == i){
+                break;
+            }
+            if(ObjectUtils.isNotEmpty(entryentity.get(i).get("nckd_recruitpost"))){
+                if(entryentity.get(i).get("nckd_recruitpost.number").equals(newValue.get("number"))){
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    // 公司,部门,岗位选择过滤
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent e) {
+        String fieldKey = e.getProperty().getName();
+        switch (fieldKey){
+            case "nckd_recruitcompany":
+                // 企业名称
+                ListShowParameter showParameter = (ListShowParameter)e.getFormShowParameter();
+                //是否展示审核的改为false
+                QFilter qFilter = new QFilter("adminorgtype.number", "in", COMPANY_LIST);
+                showParameter.getListFilterParameter().setFilter(qFilter);
+                break;
+            case "nckd_recruitorg":
+                // 组织名称
+                ListShowParameter showParameter2 = (ListShowParameter)e.getFormShowParameter();
+                // 展示部门,如果选择了企业,展示企业下的部门,添加企业筛选条件
+                DynamicObject nckdRecruitcompany = (DynamicObject)this.getModel().getValue("org");
+
+                List<Long> longs = new ArrayList<Long>();
+                Long pkValue = (Long) nckdRecruitcompany.getPkValue();
+                longs.add(pkValue);
+                List<Long> allSubordinateOrgIds = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs, true);
+                // 使用流处理过滤掉指定的值
+//                List<Long> filteredOrgIds = allSubordinateOrgIds.stream()
+//                        .filter(orgId -> !orgId.equals(pkValue)) // 过滤掉值
+//                        .collect(Collectors.toList());
+
+                // 获取组织编码
+//                QFilter belongcompanyFilter = new QFilter("belongcompany", "in", allSubordinateOrgIds);
+                QFilter qFilter2 = new QFilter("belongcompany", QCP.in,allSubordinateOrgIds);
+                showParameter2.getListFilterParameter().setFilter(qFilter2);
+
+                break;
+            case "nckd_recruitpost":
+                // 岗位名称
+                ListShowParameter showParameter3 = (ListShowParameter)e.getFormShowParameter();
+                // 展示部门,如果选择了企业,展示企业下的部门
+                EntryGrid treeEntryEntity2 = this.getControl("entryentity");
+                int[] rows2 = treeEntryEntity2.getSelectRows();
+                DynamicObject nckdRecruitcompany2 = (DynamicObject)this.getModel().getValue("org");
+                DynamicObject nckdRecruitorg = (DynamicObject)this.getModel().getValue("nckd_recruitorg", rows2[0]);
+                List<Long> longs2 = new ArrayList<Long>();
+                longs2.add((Long)nckdRecruitcompany2.getPkValue());
+                List<Long> allSubordinateOrgIds2 = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs2, true);
+                QFilter qFilter1 = new QFilter("adminorg.id", QCP.in, allSubordinateOrgIds2);
+                if(ObjectUtils.isNotEmpty(nckdRecruitorg)){
+                    qFilter1.and("adminorg.id", QCP.equals, nckdRecruitorg.getPkValue());
+                }
+                showParameter3.getListFilterParameter().setFilter(qFilter1);
+                break;
+            case "org":
+                ListShowParameter showParameter4 = (ListShowParameter)e.getFormShowParameter();
+                // 去除部门
+                QFilter qFilter4 = new QFilter("orgpattern.number", "in", COMPANY_LIST2);
+                showParameter4.getListFilterParameter().setFilter(qFilter4);
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    // 获取岗位对应编制人数
+    public Object getFieldValue(DynamicObject nckd_recruitpost) {
+        Object num = null;
+        if(ObjectUtils.isNotEmpty(nckd_recruitpost)){
+            Object nckdSftaff = this.getModel().getValue("nckd_sftaff");
+
+            DynamicObject haosStaff = null;
+            if(ObjectUtils.isNotEmpty(nckdSftaff)){
+                haosStaff = BusinessDataServiceHelper.loadSingle(nckdSftaff,"haos_staff");
+            }else{
+                QFilter qFilter = new QFilter("enable", QCP.equals, "1");
+                DynamicObject[] haosStaffs = BusinessDataServiceHelper.load("haos_staff", "id,name,number", new QFilter[]{qFilter},"year desc");
+                if (haosStaffs != null && haosStaffs.length > 0) {
+                    haosStaff = haosStaffs[0];
+                } else {
+                    return null;
+                }
+                this.getModel().setValue("nckd_sftaff",haosStaff.getPkValue());
+            }
+
+            Object pkValue = nckd_recruitpost.get("id");
+            QFilter qFilter3 = new QFilter("staff.id", QCP.equals, haosStaff.getPkValue())
+                    .and("enable", QCP.not_equals, "0")
+                    .and("datastatus",QCP.not_equals,"-2")
+                    .and("datastatus",QCP.not_equals,"2")
+                    .and("datastatus",QCP.not_equals,"-1")
+                    .and("dutyworkrole.boid",QCP.equals,pkValue);
+            DynamicObject[] haosDutyorgdetails = BusinessDataServiceHelper.load("haos_muldimendetail", "id,staff,dutyworkrole,dutyworkrole.boid,yearstaff", new QFilter[]{qFilter3});
+            num = haosDutyorgdetails[0].get("yearstaff");
+        }
+        return num;
+    }
+
+
+    @Override
+    public void registerListener(EventObject e) {
+        BasedataEdit fieldEdit = (BasedataEdit) this.getView().getControl("nckd_recruitcompany");
+        BasedataEdit fieldEdit2 = (BasedataEdit) this.getView().getControl("nckd_recruitorg");
+        BasedataEdit fieldEdit3 = (BasedataEdit) this.getView().getControl("nckd_recruitpost");
+        BasedataEdit fieldEdit4 = this.getView().getControl("org");
+        fieldEdit.addBeforeF7SelectListener(this);
+        fieldEdit.addBeforeF7SelectListener(this);
+        fieldEdit2.addBeforeF7SelectListener(this);
+        fieldEdit3.addBeforeF7SelectListener(this);
+        fieldEdit4.addBeforeF7SelectListener(this);
+    }
+
+
+    public static boolean isNotEmpty(Object  key) {
+        // 基础资料判空
+        if(ObjectUtils.isEmpty(key) || ObjectUtils.isEmpty(((DynamicObject)key).getDataStorage())){
+            return false;
+        }
+        return true;
+    }
+
+
+    public void setSumRecruitnum(Object newValue,int row){
+        // 计算招聘人数,获取出所有分录,然后统计所有分录的招聘人数累加
+        DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("entryentity");
+        int num = 0;
+        for (int i = 0; i < entryEntity.size(); i++) {
+            if(row == i){
+                num = num + (Integer) newValue;
+            }else{
+                num = num + (Integer) entryEntity.get(i).get("nckd_recruitnum");
+            }
+        }
+        this.getModel().setValue("nckd_applynum", num);
+    }
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate opreate = (FormOperate) args.getSource();
+        switch (opreate.getOperateKey()) {
+            case "submit":
+                String errorMessage = vaildatorPayrange();
+                if(StringUtils.isNotEmpty(errorMessage)){
+                    this.getView().showErrorNotification(errorMessage);
+                    args.setCancel(true);
+                    return;
+                }
+                // 在此添加处理逻辑
+                Object nckdSftaffcount1 = this.getModel().getValue("nckd_sftaffcount");
+                if(ObjectUtils.isNotEmpty(nckdSftaffcount1)){
+                    int nckdSftaffcount = (int) this.getModel().getValue("nckd_sftaffcount");
+                    // 实际人数
+                    int nckdRelnum = (int) this.getModel().getValue("nckd_relnum");
+                    // 申请人数
+                    int nckdApplynum = (int) this.getModel().getValue("nckd_applynum");
+                    if(nckdApplynum > 0){
+                        if(nckdSftaffcount < nckdRelnum + nckdApplynum){
+                            // 判断是否处理过
+                            String isDealed = this.getView().getPageCache().get("isDealed");
+                            if (!"true".equals(isDealed)) {
+                                // 取消原来的操作
+                                args.setCancel(true);
+                                // 在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+                                ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("isExceed", this);
+                                // 设置页面确认框,参数为:标题,选项框类型,回调监听
+                                this.getView().showConfirm("请注意,申请人数超编,是否继续提报?", MessageBoxOptions.YesNo, confirmCallBackListener);
+                                // 只执行一次
+                                this.getView().getPageCache().put("isDealed", "true");
+                            }
+                        }
+                    }
+
+                }
+
+                break;
+            case "save":
+                String errorMessage2 = vaildatorPayrange();
+                if(StringUtils.isNotEmpty(errorMessage2)){
+                    this.getView().showErrorNotification(errorMessage2);
+                    args.setCancel(true);
+                    return;
+                }
+            default:
+                break;
+        }
+    }
+
+
+
+
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        this.getView().getPageCache().remove("isDealed");
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        //判断回调参数id
+        if ("isExceed".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("submit");
+            } else if (MessageBoxResult.No.equals(messageBoxClosedEvent.getResult())) {
+                // 点击否也清除
+                this.getView().getPageCache().remove("isDealed");
+            }
+        }
+    }
+
+
+
+}

+ 103 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/CasRecrApplyListPlugin.java

@@ -0,0 +1,103 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.EntityType;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+import kd.bos.list.BillList;
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-临时招聘申请
+ * Description      :临时招聘申请列表操作插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_casrecrapply
+ */
+
+
+
+public class CasRecrApplyListPlugin extends AbstractListPlugin {
+
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate opreate = (FormOperate) args.getSource();
+        switch (opreate.getOperateKey()) {
+            case "submit":
+                ListSelectedRowCollection selectCols = args.getListSelectedData();
+                StringBuffer exceedMsg = new StringBuffer();
+                Object[] primaryKeyValues  = selectCols.getPrimaryKeyValues();
+                BillList billlistap = this.getView().getControl("billlistap");
+                EntityType entityType = billlistap.getEntityType();
+                //获取完整数据
+                DynamicObject[] casPaybillArr = BusinessDataServiceHelper.load(primaryKeyValues, entityType);
+                for (int i = 0; i < casPaybillArr.length; i++) {
+                    // 在此添加处理逻辑
+                    DynamicObject dynamicObject = casPaybillArr[i];
+                    Object nckdSftaffcount1 = dynamicObject.get("nckd_sftaffcount");
+                    if(ObjectUtils.isNotEmpty(nckdSftaffcount1)){
+                        int nckdSftaffcount = dynamicObject.getInt("nckd_sftaffcount");
+                        // 实际人数
+                        int nckdRelnum = dynamicObject.getInt("nckd_relnum");
+                        // 申请人数
+                        int nckdApplynum = dynamicObject.getInt("nckd_applynum");
+
+                        if(nckdSftaffcount < nckdRelnum + nckdApplynum){
+                            // 判断是否处理过
+                            String isDealed = this.getView().getPageCache().get("isDealed");
+                            if (!"true".equals(isDealed)) {
+                                if(ObjectUtils.isEmpty(exceedMsg)){
+                                    exceedMsg.append("单据:");
+                                }
+                                exceedMsg.append(dynamicObject.getString("billno")+",");
+                            }
+                        }
+                    }
+                }
+                if(ObjectUtils.isNotEmpty(exceedMsg)){
+                    args.setCancel(true);
+                    exceedMsg.append("请注意,申请人数超编,是否继续提报?");
+                    ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("isExceed", this);
+                    // 设置页面确认框,参数为:标题,选项框类型,回调监听
+                    this.getView().showConfirm(exceedMsg.toString(), MessageBoxOptions.YesNo, confirmCallBackListener);
+                    // 只执行一次
+                    this.getView().getPageCache().put("isDealed", "true");
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        // 清除
+        this.getView().getPageCache().remove("isDealed");
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        //判断回调参数id
+        if ("isExceed".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("submit");
+            } else if (MessageBoxResult.No.equals(messageBoxClosedEvent.getResult())) {
+                // 点击否也清除
+                this.getView().getPageCache().remove("isDealed");
+            }
+        }
+    }
+
+}

+ 781 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyFormPlugin.java

@@ -0,0 +1,781 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import kd.bos.algo.DataSet;
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.datamodel.events.BeforeImportEntryEventArgs;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.LoadDataEventArgs;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.exception.KDBizException;
+import kd.bos.form.*;
+import kd.bos.form.control.EntryGrid;
+import kd.bos.form.control.events.BeforeItemClickEvent;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.form.plugin.importentry.resolving.ImportEntryData;
+import kd.bos.list.ListShowParameter;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.org.OrgUnitServiceHelper;
+import kd.hr.hbp.business.openservicehelper.hrpi.HRPIPersonServiceHelper;
+import kd.hr.hbp.common.util.HRDBUtil;
+import nckd.jimin.jyyy.hr.tsrsc.plugin.util.RecUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import scala.Int;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-年度招聘申请
+ * Description      :年度招聘申请单据插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_yearapply
+ */
+
+
+
+public class YearCrApplyFormPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener {
+
+    private static Log logger = LogFactory.getLog(YearCrApplyFormPlugin.class);
+
+    // 公司类型
+    private final List<String> COMPANY_LIST = Arrays.asList(new String[]{"1020_S","1050_S","1060_S","1070_S"});
+
+    private final List<String> COMPANY_LIST2 = Arrays.asList(new String[]{"Orgform01","Orgform01-100","Orgform02","Orgform03"});
+
+    // 定义日期格式
+    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+//        DispatchServiceHelper.invokeService("kd.hrmp.haos.servicehelper","haos","IHAOSStaffService","queryUseStaffInfo",objects);
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+
+        Object billstatus = this.getModel().getValue("billstatus");
+        // 暂存状态才发生变化
+        if(ObjectUtils.equals(billstatus,"A")){
+            DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+            updateStaffCount();
+            // 实际人数
+            this.getModel().setValue("nckd_relnum", RecUtils.getStaffCount(org.getPkValue()));
+        }
+//        DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+//        //  组织id
+//        Long pkValue = (Long) org.getPkValue();
+//        updateStaffCount();
+        /*
+        List<Long> longs = new ArrayList<Long>();
+        longs.add(pkValue);
+        QFilter qFilter = new QFilter("boid", QCP.equals, pkValue);
+        // 获取组织历史查询
+        DynamicObjectCollection query = QueryServiceHelper.query("haos_adminorgdetail", "id,boid,hisversion", new QFilter[]{qFilter}, "hisversion desc");
+        if(ObjectUtils.isNotEmpty(query)){
+            long boid = query.get(0).getLong("id");
+            QFilter qFilter1 = new QFilter("dutyorg.id", QCP.equals, boid);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+            String dateStr = sdf.format(new Date());
+            QFilter qFilter2 = new QFilter("staff.year", QCP.like, dateStr + "%");
+
+            DynamicObject haosDutyorgdetail = BusinessDataServiceHelper.loadSingle( "haos_dutyorgdetail","id,dutyorg,staff,staffcount",new QFilter[]{qFilter1,qFilter2});
+            int staffcount = ObjectUtils.isNotEmpty(haosDutyorgdetail) ? haosDutyorgdetail.getInt("staffcount"):0;
+            this.getModel().setValue("nckd_sftaffcount",staffcount);
+
+//            QFilter qFilter1 = new QFilter("useorgbo", QCP.equals, boid);
+//            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle("haos_useorgdetail", "id,useorgbo,useorg.id,yearstaff", new QFilter[]{qFilter1});
+//            if(ObjectUtils.isNotEmpty(dynamicObject)){
+//                this.getModel().setValue("nckd_sftaffcount",dynamicObject.get("yearstaff"));
+//            }
+
+        }
+        */
+
+//        this.getModel().setValue("nckd_relnum",getStaffCount(org.getPkValue()));
+
+    }
+
+    private List<String> getPostNumber(){
+        DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+        List<String> postNumber = new ArrayList<>();
+        for (DynamicObject dynamicObject : entryentity) {
+            if(ObjectUtils.isNotEmpty(dynamicObject.get("nckd_recruitpost"))){
+                postNumber.add(dynamicObject.getString("nckd_recruitpost.number"));
+            }
+        }
+        return postNumber;
+    }
+
+
+    @Override
+    public void beforeImportEntry(BeforeImportEntryEventArgs e) {
+        // 临时招聘 导入数据
+//        super.beforeImportEntry(e);
+        logger.info("年度招聘导入数据--------");
+        QFilter qFilter = new QFilter("status", QCP.equals, "C")
+                .and("enable", QCP.equals, "1")
+                .and("iscurrentversion", QCP.equals, "1");
+        Map<String, List<Object>> entryDataMap = e.getEntryDataMap();
+        ObjectMapper objectMapper = new ObjectMapper();
+        List<String> postNumber = getPostNumber();
+        DynamicObject nckdRecruitcompany = (DynamicObject)this.getModel().getValue("org");
+
+        List<Long> longs = new ArrayList<Long>();
+        Long pkValue = (Long) nckdRecruitcompany.getPkValue();
+        longs.add(pkValue);
+        List<Long> allSubordinateOrgIds = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs, true);
+        Integer index = 0;
+        try {
+            String jsonString = objectMapper.writeValueAsString(entryDataMap);
+            logger.info("jsonString:{}",jsonString);
+            JSONObject jsonObject = (JSONObject) JSONObject.parse(jsonString);
+            JSONArray entryentity = jsonObject.getJSONArray("entryentity");
+            JSONObject jsonObject1 = entryentity.getJSONObject(0);
+            index =jsonObject1.getInteger("rowIndex");
+        } catch (JsonProcessingException ex) {
+            throw new RuntimeException(ex);
+        }
+
+
+        Map<String, List<ImportEntryData>> source = (Map)e.getSource();
+        Set<Map.Entry<String, List<ImportEntryData>>> entries = source.entrySet();
+        Iterator var4 = entries.iterator();
+        while (var4.hasNext()){
+            Map.Entry<String, List<ImportEntryData>> entry = (Map.Entry)var4.next();
+            String key = entry.getKey();
+            if("entryentity".equals(key)){
+                List<ImportEntryData> entryValue = (List) entry.getValue();
+                List<ImportEntryData> entryValue2 = entryValue;
+
+                if(entryValue2.size() > 0){
+                    StringBuilder errorBuilder = new StringBuilder();
+                    logger.info("分录数据不为空");
+                    List<Object> listQuerOrg = new ArrayList<>();
+                    List<Object> listQuerPost = new ArrayList<>();
+                    String orgQuery = null;
+                    String postQuery = null;
+                    logger.info("开始构建查询条件");
+                    for (int i = 0; i < entryValue2.size(); i++) {
+                        // 部门
+                        JSONObject nckdRecruitorg = entryValue2.get(i).getData().getJSONObject("nckd_recruitorg");
+                        // 岗位
+                        JSONObject nckdRecruitpost = entryValue2.get(i).getData().getJSONObject("nckd_recruitpost");
+
+                        if(i == 0){
+                            orgQuery = nckdRecruitorg.getString("importprop");
+                            postQuery = nckdRecruitpost.getString("importprop");
+                        }
+                        listQuerOrg.add(nckdRecruitorg.get(orgQuery));
+                        listQuerPost.add(nckdRecruitpost.get(postQuery));
+                    }
+                    logger.info("查询条件listQuerOrg:{},listQuerPost:{}",listQuerOrg,listQuerPost);
+                    QFilter qFilterorg = new QFilter(orgQuery, QCP.in, listQuerOrg);
+                    QFilter qFilterpost = new QFilter(postQuery, QCP.in, listQuerPost);
+                    QFilter qFilterbelongcompany = new QFilter("belongcompany", QCP.in,allSubordinateOrgIds);
+                    DynamicObject[] haosAdminorgf7s = BusinessDataServiceHelper.load("haos_adminorgf7", "id,name,number,status,enable,iscurrentversion", new QFilter[]{qFilter, qFilterorg,qFilterbelongcompany});
+//                    logger.info("查询结果haosAdminorgf7s:{}",haosAdminorgf7s);
+                    String finalOrgQuery = orgQuery;
+                    Map<String, DynamicObject> map1 =
+                            Arrays.stream(haosAdminorgf7s)
+                                    .collect(Collectors.toMap(
+                                            detail -> detail.get(finalOrgQuery).toString(),
+                                            detail -> detail,
+                                            (existing, replacement) -> existing // 保留前面的值
+                                    ));
+
+                    DynamicObject[] hbpmPositionhrs = BusinessDataServiceHelper.load("hbpm_positionhr", "id,name,number,status,enable,iscurrentversion", new QFilter[]{qFilter, qFilterpost});
+//                    logger.info("查询结果hbpmPositionhrs:{}",hbpmPositionhrs);
+                    String finalOrgQuery2 = postQuery;
+                    Map<String, Object> map2 =
+                            Arrays.stream(hbpmPositionhrs)
+                                    .collect(Collectors.toMap(
+                                            detail -> detail.get(finalOrgQuery2).toString(),
+                                            detail -> detail.get("id"),
+                                            (existing, replacement) -> existing // 保留前面的值
+                                    ));
+
+                    String finalPostQuery = postQuery;
+
+                    for (int i = 0; i < entryValue.size(); i++) {
+                        ImportEntryData importEntryData = entryValue.get(i);
+                        int i1 = index + i;
+                        logger.info("修改前importEntryData:{},jsondata:{}",importEntryData.getEntryName(),importEntryData.getData().toString());
+                        // 部门
+                        JSONObject nckdRecruitorg = importEntryData.getData().getJSONObject("nckd_recruitorg");
+                        String imoportprop = nckdRecruitorg.getString("importprop");
+                        Object o = nckdRecruitorg.get(imoportprop);
+                        if(ObjectUtils.isNotEmpty(o)){
+                            DynamicObject o1 = map1.get(o);
+                            JSONObject jsonObject = new JSONObject();
+                            if(ObjectUtils.isEmpty(o1)){
+                                errorBuilder.append("第"+i1+"行"+"部门"+o+"在组织"+nckdRecruitcompany.getString("name")+"下未找到!" + "\n");
+                            }else{
+                                jsonObject.put("importprop","id");
+                                jsonObject.put("id",o1.getPkValue());
+                                importEntryData.getData().remove("nckd_recruitorg");
+                                importEntryData.getData().put("nckd_recruitorg",jsonObject);
+                                // 岗位
+                                JSONObject nckdRecruitpost = importEntryData.getData().getJSONObject("nckd_recruitpost");
+                                String imoportprop2 = nckdRecruitpost.getString("importprop");
+                                Object o2 = nckdRecruitpost.get(imoportprop2);
+                                if(ObjectUtils.isNotEmpty(o)){
+                                    List<Long> longs2 = new ArrayList<Long>();
+                                    longs2.add((Long) o1.getPkValue());
+                                    List<Long> allSubordinateOrgIds2 = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs2, true);
+                                    QFilter qFilter1 = new QFilter("adminorg.id", QCP.in, allSubordinateOrgIds2);
+                                    QFilter qFilter2 = new QFilter(finalPostQuery, QCP.equals, o2);
+                                    DynamicObject hbpmPositionhr = BusinessDataServiceHelper.loadSingle("hbpm_positionhr", "id,name,number,status,enable,iscurrentversion", new QFilter[]{qFilter, qFilterpost, qFilter1,qFilter2});
+                                    if(ObjectUtils.isEmpty(hbpmPositionhr)){
+                                        ((List)source.get("entryentity")).clear();
+                                        errorBuilder.append("第"+i1+"行:"+o2 +"岗位不存在!" + "\n");
+                                    }else{
+                                        if(postNumber.contains(hbpmPositionhr.getString("number"))){
+                                            errorBuilder.append("第"+i1+"行:"+o2 +"岗位重复!"+"\n");
+                                        }else{
+                                            postNumber.add(hbpmPositionhr.getString("number"));
+                                            JSONObject jsonObject2 = new JSONObject();
+                                            jsonObject2.put("importprop","id");
+                                            jsonObject2.put("id",hbpmPositionhr.getPkValue());
+
+                                            // 获取对应岗位编制人数
+                                            Object fieldValue = getFieldValue(hbpmPositionhr);
+                                            importEntryData.getData().put("nckd_compilation",fieldValue);
+
+                                            // 获取对应岗位现有人数
+                                            List<Long> postIds = new ArrayList<Long>();
+                                            long id = hbpmPositionhr.getLong("id");
+                                            postIds.add(id);
+                                            Map<Long, Set<Long>> allUsersOfPosition = HRPIPersonServiceHelper.getAllUsersOfPosition("1010_S", postIds);
+                                            int num = 0;
+                                            if(ObjectUtils.isNotEmpty(allUsersOfPosition)){
+                                                Set<Long> longSet = allUsersOfPosition.get(id);
+                                                List<String> zaizhiStatus = Arrays.asList(new String[]{"1020_S","1010_S","1190_S","1050_S","1140_S","1060_S","1120_S","1210_S"});
+                                                QFilter qFilterEmepentrel = new QFilter("person.id", QCP.in, longSet)
+                                                        .and("iscurrentversion",QCP.equals,"1")
+                                                        .and("businessstatus",QCP.equals,"1")
+                                                        .and("labrelstatusprd.number",QCP.in,zaizhiStatus);
+
+                                                DynamicObject[] hrpiEmpentrels = BusinessDataServiceHelper.load("hrpi_empentrel", "id,person", qFilterEmepentrel.toArray());
+                                                num = hrpiEmpentrels.length;
+                                            }
+                                            importEntryData.getData().put("nckd_currentnum",num);
+
+                                            importEntryData.getData().put("nckd_recruitpost",jsonObject2);
+                                        }
+                                    }
+                                }
+                            }
+
+                        }
+                    }
+                    if(ObjectUtils.isNotEmpty(errorBuilder)){
+                        ((List)source.get("entryentity")).clear();
+                        throw new KDBizException(errorBuilder.toString());
+                    }
+                }
+            }
+        }
+    }
+
+    private void updateStaffCount(){
+
+        DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+        //  组织id
+        Long pkValue = (Long) org.getPkValue();
+        List<Long> longs = new ArrayList<Long>();
+        longs.add(pkValue);
+        QFilter qFilter = new QFilter("boid", QCP.equals, pkValue);
+        // 获取组织历史查询
+        DynamicObjectCollection query = QueryServiceHelper.query("haos_adminorgdetail", "id,boid,hisversion", new QFilter[]{qFilter}, "hisversion desc");
+        if(ObjectUtils.isNotEmpty(query)){
+            long boid = query.get(0).getLong("id");
+            // 获取填写的年度 nckd_year
+            Object nckdYear =  this.getModel().getValue("nckd_year");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+
+            if(ObjectUtils.isEmpty(nckdYear)){
+                nckdYear = new Date();
+            }else{
+                nckdYear = (Date) nckdYear;
+            }
+            String dateStr = sdf.format(nckdYear);
+//            QFilter qFilter2 = new QFilter("staff.year", QCP.like, dateStr + "%");
+            QFilter qFilter1 = new QFilter("dutyorg.id", QCP.equals, boid);
+
+            DynamicObject[] haosDutyorgdetail = BusinessDataServiceHelper.load( "haos_dutyorgdetail","id,dutyorg,staff,staffcount",new QFilter[]{qFilter1});
+            if(ObjectUtils.isNotEmpty(haosDutyorgdetail)){
+                for (DynamicObject dynamicObject : haosDutyorgdetail) {
+                    String format = sdf.format(dynamicObject.getDate("staff.year"));
+                    if(dateStr.equals(format)){
+                        int staffcount = dynamicObject.getInt("staffcount");
+                        this.getModel().setValue("nckd_sftaffcount",staffcount);
+                        return;
+                    }
+                }
+            }
+            this.getModel().setValue("nckd_sftaffcount",null);
+
+//            int staffcount = ObjectUtils.isNotEmpty(haosDutyorgdetail) ? haosDutyorgdetail.getInt("staffcount"):null;
+//            this.getModel().setValue("nckd_sftaffcount",staffcount);
+
+        }
+
+    }
+
+    @Override
+    public void loadData(LoadDataEventArgs e) {
+        super.loadData(e);
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        String key = e.getProperty().getName();
+        ChangeData[] changeData = e.getChangeSet();
+        Object newValue = changeData[0].getNewValue();
+        Object oldValue = changeData[0].getOldValue();
+        int iRow = changeData[0].getRowIndex();
+        switch (key) {
+            case "nckd_year":
+                updateStaffCount();
+                break;
+            case "nckd_recruitcompany":
+                // 公司为空清除部门岗位
+                if(!isNotEmpty(newValue)){
+                    this.getModel().setValue("nckd_recruitorg", null,iRow);
+                    this.getModel().setValue("nckd_recruitpost", null,iRow);
+                }
+                break;
+            case "nckd_recruitorg":
+                // 部门,判断是否存企业,如果不存在企业则将部门的所属公司带入到企业中
+                this.getModel().setValue("nckd_recruitpost", null,iRow);
+                this.getModel().setValue("nckd_compilation", null,iRow);
+                this.getModel().setValue("nckd_currentnum", null,iRow);
+                this.getModel().setValue("nckd_majortype", null,iRow);
+                this.getModel().setValue("nckd_education", null,iRow);
+                this.getModel().setValue("nckd_payrangemin", null,iRow);
+                this.getModel().setValue("nckd_payrange", null,iRow);
+                this.getModel().setValue("nckd_employcategory", null,iRow);
+                this.getModel().setValue("nckd_recruittype", null,iRow);
+                this.getModel().setValue("nckd_employmentreasons", null,iRow);
+                this.getModel().setValue("nckd_approvednum", null,iRow);
+                this.getModel().setValue("nckd_recruitnum", 0,iRow);
+
+                break;
+            case "nckd_recruitpost":
+                // 岗位,判断是否存企业,如果不存在企业则将部门的所属公司带入到企业中
+                if(isNotEmpty(newValue)){
+                    DynamicObject newValue1 = (DynamicObject) newValue;
+                    if(!checkPosition(newValue1,iRow)){
+                        this.getView().showErrorNotification("已录入相同岗位!"+newValue1.getString("name")+newValue1.getString("number"));
+                        this.getModel().setValue("nckd_recruitpost", null,iRow);
+                        return;
+                    }
+                    // 获取行政组织,和行政组织的所属公司
+                    // 行政组织
+                    DynamicObject nckdRecruitcompany = (DynamicObject)this.getModel().getValue("nckd_recruitorg", iRow);
+                    if(ObjectUtils.isEmpty(nckdRecruitcompany)){
+                        DynamicObject adminorg = newValue1.getDynamicObject("adminorg");
+                        DynamicObjectCollection entryentity = this.getModel().getDataEntity().getDynamicObjectCollection("entryentity");
+                        for (DynamicObject object : entryentity) {
+                            if(newValue1.getString("number").equals(object.getString("nckd_recruitpost.number"))){
+                                object.set("nckd_recruitorg",adminorg);
+                                break;
+                            }
+                        }
+                    }
+                    this.getModel().setValue("nckd_compilation",getFieldValue(newValue1),iRow);
+                    long id = newValue1.getLong("id");
+                    List<Long> longs = new ArrayList<Long>();
+                    longs.add(id);
+                    Map<Long, Set<Long>> allUsersOfPosition = HRPIPersonServiceHelper.getAllUsersOfPosition("1010_S", longs);
+                    int num = 0;
+                    if(ObjectUtils.isNotEmpty(allUsersOfPosition)){
+                        Set<Long> longSet = allUsersOfPosition.get(id);
+                        List<String> zaizhiStatus = Arrays.asList(new String[]{"1020_S","1010_S","1190_S","1050_S","1140_S","1060_S","1120_S","1210_S"});
+                        QFilter qFilter = new QFilter("person.id", QCP.in, longSet)
+                                .and("iscurrentversion",QCP.equals,"1")
+                                .and("businessstatus",QCP.equals,"1")
+                                .and("labrelstatusprd.number",QCP.in,zaizhiStatus);
+
+                        DynamicObject[] hrpiEmpentrels = BusinessDataServiceHelper.load("hrpi_empentrel", "id,person", qFilter.toArray());
+                        num = hrpiEmpentrels.length;
+                    }
+                    this.getModel().setValue("nckd_currentnum",num,iRow);
+                }else{
+                    this.getModel().setValue("nckd_compilation",null,iRow);
+                    this.getModel().setValue("nckd_currentnum",null,iRow);
+                }
+                this.getModel().setValue("nckd_recruitnum",0,iRow);
+                this.getView().updateView("entryentity");
+                break;
+            case "nckd_recruitnum":
+                // 人数字段统计
+                setSumRecruitnum(newValue,iRow);
+                checkRecruitnum(newValue,iRow);
+                break;
+            default:
+                break;
+        }
+
+    }
+
+    // 校验岗位人数是否超编制
+    private void checkRecruitnum(Object recruitnum,int row) {
+        if(recruitnum instanceof Integer){
+            // 获取编制人数
+            Object nckdCompilation = this.getModel().getValue("nckd_compilation",row);
+            if(ObjectUtils.isNotEmpty(nckdCompilation)){
+                Integer integer =  (Integer)nckdCompilation;
+                Integer nckdCurrentnum = (Integer)this.getModel().getValue("nckd_currentnum", row);
+                Integer recruitnum1 =  (Integer)recruitnum;
+                if (integer < (nckdCurrentnum + recruitnum1)){
+                    this.getView().showErrorNotification("最高薪资不能低于最低薪资!");
+                }
+            }
+        }
+    }
+
+    // 获取岗位对应编制人数
+    private Object getFieldValue(DynamicObject nckd_recruitpost) {
+        Object num = null;
+        if(ObjectUtils.isNotEmpty(nckd_recruitpost)){
+            Object nckdSftaff = this.getModel().getValue("nckd_sftaff");
+
+            DynamicObject haosStaff = null;
+            if(ObjectUtils.isNotEmpty(nckdSftaff)){
+                haosStaff = BusinessDataServiceHelper.loadSingle(nckdSftaff,"haos_staff");
+            }else{
+                QFilter qFilter = new QFilter("enable", QCP.equals, "1");
+                DynamicObject[] haosStaffs = BusinessDataServiceHelper.load("haos_staff", "id,name,number", new QFilter[]{qFilter},"year desc");
+                if (haosStaffs != null && haosStaffs.length > 0) {
+                    haosStaff = haosStaffs[0];
+                    this.getModel().setValue("nckd_sftaff",haosStaff.getPkValue());
+                } else {
+                    return null;
+                }
+            }
+
+            Object pkValue = nckd_recruitpost.get("id");
+            QFilter qFilter3 = new QFilter("staff.id", QCP.equals, haosStaff.getPkValue())
+                    .and("enable", QCP.not_equals, "0")
+                    .and("datastatus",QCP.not_equals,"-2")
+                    .and("datastatus",QCP.not_equals,"2")
+                    .and("datastatus",QCP.not_equals,"-1")
+                    .and("dutyworkrole.boid",QCP.equals,pkValue);
+            DynamicObject[] haosDutyorgdetails = BusinessDataServiceHelper.load("haos_muldimendetail", "id,staff,dutyworkrole,dutyworkrole.boid,yearstaff", new QFilter[]{qFilter3});
+            num = haosDutyorgdetails[0].get("yearstaff");
+        }
+        return num;
+    }
+
+    private boolean checkPosition(DynamicObject  newValue,int row) {
+        DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+        for (int i = 0; i < entryentity.size(); i++) {
+            if(row == i){
+                break;
+            }
+            if(ObjectUtils.isNotEmpty(entryentity.get(i).get("nckd_recruitpost"))){
+                if(entryentity.get(i).get("nckd_recruitpost.number").equals(newValue.get("number"))){
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    // 公司,部门,岗位选择过滤
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent e) {
+        String fieldKey = e.getProperty().getName();
+        switch (fieldKey){
+            case "nckd_recruitcompany":
+                // 企业名称
+                ListShowParameter showParameter = (ListShowParameter)e.getFormShowParameter();
+                //是否展示审核的改为false
+                QFilter qFilter = new QFilter("adminorgtype.number", "in", COMPANY_LIST);
+                showParameter.getListFilterParameter().setFilter(qFilter);
+                break;
+            case "nckd_recruitorg":
+                // 组织名称
+                ListShowParameter showParameter2 = (ListShowParameter)e.getFormShowParameter();
+                // 展示部门,如果选择了企业,展示企业下的部门
+                DynamicObject nckdRecruitcompany = (DynamicObject)this.getModel().getValue("org");
+
+                List<Long> longs = new ArrayList<Long>();
+                Long pkValue = (Long) nckdRecruitcompany.getPkValue();
+                longs.add(pkValue);
+                List<Long> allSubordinateOrgIds = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs, true);
+                // 使用流处理过滤掉指定的值
+//                List<Long> filteredOrgIds = allSubordinateOrgIds.stream()
+//                        .filter(orgId -> !orgId.equals(pkValue)) // 过滤掉值
+//                        .collect(Collectors.toList());
+                QFilter qFilter2 = new QFilter("belongcompany", QCP.in,allSubordinateOrgIds);
+                showParameter2.getListFilterParameter().setFilter(qFilter2);
+                break;
+            case "nckd_recruitpost":
+                // 岗位名称
+                ListShowParameter showParameter3 = (ListShowParameter)e.getFormShowParameter();
+                // 展示部门,如果选择了企业,展示企业下的部门
+                EntryGrid treeEntryEntity2 = this.getControl("entryentity");
+                int[] rows2 = treeEntryEntity2.getSelectRows();
+                DynamicObject nckdRecruitcompany2 = (DynamicObject)this.getModel().getValue("org");
+
+
+
+                QFilter qFilter1 = new QFilter("adminorg.number", QCP.like, nckdRecruitcompany2.getString("number") + "%");
+                DynamicObject nckdRecruitorg = (DynamicObject)this.getModel().getValue("nckd_recruitorg", rows2[0]);
+                if(ObjectUtils.isNotEmpty(nckdRecruitorg)){
+                    qFilter1.and("adminorg.id", QCP.equals, nckdRecruitorg.getPkValue());
+                }
+                showParameter3.getListFilterParameter().setFilter(qFilter1);
+                break;
+            case "org":
+                ListShowParameter showParameter4 = (ListShowParameter)e.getFormShowParameter();
+                // 去除部门
+                QFilter qFilter4 = new QFilter("orgpattern.number", "in", COMPANY_LIST2);
+                showParameter4.getListFilterParameter().setFilter(qFilter4);
+                break;
+            default:
+                break;
+        }
+    }
+
+
+
+    @Override
+    public void registerListener(EventObject e) {
+        BasedataEdit fieldEdit = (BasedataEdit) this.getView().getControl("nckd_recruitcompany");
+        BasedataEdit fieldEdit2 = (BasedataEdit) this.getView().getControl("nckd_recruitorg");
+        BasedataEdit fieldEdit3 = (BasedataEdit) this.getView().getControl("nckd_recruitpost");
+        BasedataEdit fieldEdit4 = this.getView().getControl("org");
+        this.addItemClickListeners("advcontoolbarap2");
+        fieldEdit.addBeforeF7SelectListener(this);
+        fieldEdit.addBeforeF7SelectListener(this);
+        fieldEdit2.addBeforeF7SelectListener(this);
+        fieldEdit3.addBeforeF7SelectListener(this);
+        fieldEdit4.addBeforeF7SelectListener(this);
+    }
+
+    public void beforeItemClick(BeforeItemClickEvent evt) {
+        super.beforeItemClick(evt);
+        String key = evt.getItemKey();
+        //监听分录引入按钮
+        if (key.equals("nckd_advconbaritemap1")) {
+            DynamicObject dataEntity = this.getModel().getDataEntity();
+            if(!getErrorMsg(dataEntity)){
+                evt.setCancel(true);     // 取消事件,不执行默认的分录引入功能
+                this.getView().showErrorNotification("招聘单位已生成该年度招聘计划,不允许新增该年度招聘计划!");
+            }
+        }
+    }
+
+
+    public static boolean isNotEmpty(Object  key) {
+        // 基础资料判空
+        if(ObjectUtils.isEmpty(key) || ObjectUtils.isEmpty(((DynamicObject)key).getDataStorage())){
+            return false;
+        }
+        return true;
+    }
+
+    public void setSumRecruitnum(Object newValue,int row){
+        // 计算招聘人数,获取出所有分录,然后统计所有分录的招聘人数累加
+        DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("entryentity");
+        int num = 0;
+        for (int i = 0; i < entryEntity.size(); i++) {
+            if(row == i){
+                num = num + (Integer) newValue;
+            }else{
+                num = num + (Integer) entryEntity.get(i).get("nckd_recruitnum");
+            }
+        }
+        this.getModel().setValue("nckd_applynum", num);
+    }
+
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate opreate = (FormOperate) args.getSource();
+        switch (opreate.getOperateKey()) {
+            case "submit":
+                // 先校验岗位是否重复
+//                String errorMsg1 = checkPosition();
+//                if(StringUtils.isNotBlank(errorMsg1)){
+//                    args.setCancel(true);
+//                    this.getView().showErrorNotification("年度招聘申请单(单据编号):" + errorMsg1 +"中存在相同岗位!\n");
+//                    return;
+//                }
+//
+//                // 判断是否存在年度招聘计划
+//                StringBuilder errorMsg = new StringBuilder();
+//                DynamicObject org =(DynamicObject) this.getModel().getValue("org");
+//                DynamicObject dataEntity = this.getModel().getDataEntity();
+//                if(!getErrorMsg(dataEntity)){
+//                    errorMsg.append("招聘单位:"+org.getString("org.name")+":已生成该年度招聘计划,不允许新增该年度招聘计划!\n");
+//                }
+
+                String errorMessage = vaildatorPayrange();
+                if(StringUtils.isNotEmpty(errorMessage)){
+                    this.getView().showErrorNotification(errorMessage);
+                    args.setCancel(true);
+                    return;
+                }
+                StringBuilder errorMsg = new StringBuilder();
+                // 在此添加处理逻辑
+                Object nckdSftaffcount1 = this.getModel().getValue("nckd_sftaffcount");
+                if(ObjectUtils.isNotEmpty(nckdSftaffcount1)){
+
+                    int nckdSftaffcount = (int) this.getModel().getValue("nckd_sftaffcount");
+                    // 实际人数
+                    int nckdRelnum = (int) this.getModel().getValue("nckd_relnum");
+                    // 申请人数
+                    int nckdApplynum = (int) this.getModel().getValue("nckd_applynum");
+                    if(ObjectUtils.isNotEmpty(errorMsg)){
+                        args.setCancel(true);
+                        this.getView().showErrorNotification(errorMsg.toString());
+                        return;
+                    }
+                    if(nckdApplynum>0){
+                        if(nckdSftaffcount < nckdRelnum + nckdApplynum){
+                            // 判断是否处理过
+                            String isDealed = this.getView().getPageCache().get("isDealed");
+                            if (!"true".equals(isDealed)) {
+                                // 取消原来的操作
+                                args.setCancel(true);
+                                // 在用户点击确认框上的按钮后,系统会调用confirmCallBack方法
+                                ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("isExceed", this);
+                                // 设置页面确认框,参数为:标题,选项框类型,回调监听
+                                this.getView().showConfirm("请注意,申请人数超编,是否继续提报?", MessageBoxOptions.YesNo, confirmCallBackListener);
+                                // 只执行一次
+                                this.getView().getPageCache().put("isDealed", "true");
+                            }
+                        }
+                    }
+
+                }
+                break;
+            case "save":
+                String errorMessage2 = vaildatorPayrange();
+                if(StringUtils.isNotEmpty(errorMessage2)){
+                    this.getView().showErrorNotification(errorMessage2);
+                    args.setCancel(true);
+                    return;
+                }
+                // 先校验岗位是否重复
+//                String errorMsg2 = checkPosition();
+//                if(StringUtils.isNotBlank(errorMsg2)){
+//                    args.setCancel(true);
+//                    this.getView().showErrorNotification("年度招聘申请单(单据编号):" + errorMsg2 +"中存在相同岗位!\n");
+//                    return;
+//                }
+
+//                if(!getErrorMsg(this.getModel().getDataEntity())){
+//                    args.setCancel(true);
+//                    DynamicObject org2 =(DynamicObject) this.getModel().getValue("org");
+//                    this.getView().showErrorNotification("招聘单位:"+org2.getString("org.name")+":已生成该年度招聘计划,不允许新增该年度招聘计划!\n");
+//                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    private String vaildatorPayrange(){
+        DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+        StringBuilder errorBuilder = new StringBuilder();
+        for (DynamicObject object : entryentity) {
+            int nckdPayrange = object.getInt("nckd_payrange");
+            int nckdPayrangemin = object.getInt("nckd_payrangemin");
+            if(nckdPayrange < nckdPayrangemin){
+                errorBuilder.append(object.get("seq"));
+            }
+        }
+        if(ObjectUtils.isNotEmpty(errorBuilder)){
+            errorBuilder.append("行,最高薪资不能低于最低薪资!");
+        }
+        return errorBuilder.toString();
+
+    }
+
+    private String checkPosition() {
+        // 获取岗位编码,筛选掉 单据状态为 E:审批不通过的状态
+        List<String> postNumber = getPostNumber();
+        Object nckdYear = this.getModel().getValue("nckd_year");
+        Object billno = this.getModel().getValue("billno");
+        QFilter qFilter = new QFilter("billstatus", QCP.not_equals, "E")
+                .and("nckd_year", QCP.equals, nckdYear)
+                .and("billno",QCP.not_equals,billno);
+        QFilter qFilter1 = new QFilter("entryentity.nckd_recruitpost.number", QCP.in, postNumber);
+        DynamicObject[] nckdYearapplies = BusinessDataServiceHelper.load("nckd_yearapply", "id,billno,nckd_name,nckd_year,entryentity,entryentity.nckd_recruitpost", new QFilter[]{qFilter, qFilter1});
+        StringBuilder errorMsg = new StringBuilder();
+        for (DynamicObject nckdYearapply : nckdYearapplies) {
+            errorMsg.append(nckdYearapply.getString("billno")+",");
+        }
+        return errorMsg.toString();
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        this.getView().getPageCache().remove("isDealed");
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        //判断回调参数id
+        if ("isExceed".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("submit");
+            } else if (MessageBoxResult.No.equals(messageBoxClosedEvent.getResult())) {
+                // 点击否也清除
+                this.getView().getPageCache().remove("isDealed");
+            }
+        }
+    }
+
+    // 判断组织是否存在年度招聘计划表
+    public  boolean getErrorMsg(DynamicObject dynamicObject){
+        Object nckdYear = dynamicObject.get("nckd_year");
+        QFilter nckdYear1 = new QFilter("nckd_year", QCP.equals, nckdYear);
+        QFilter qBillstatus = new QFilter("billstatus", QCP.equals, "C");
+        QFilter qFilter = new QFilter("org.id", QCP.equals, dynamicObject.getDynamicObject("org").getPkValue());
+        DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_yearcasreplan", "id,org,org.id,billstatus,nckd_year", new QFilter[]{nckdYear1,qBillstatus,qFilter});
+        if(ObjectUtils.isNotEmpty(dynamicObject1)){
+            return false;
+        }
+        return true;
+    }
+
+
+}

+ 130 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyListPlugin.java

@@ -0,0 +1,130 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.EntityType;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.ConfirmCallBackListener;
+import kd.bos.form.MessageBoxOptions;
+import kd.bos.form.MessageBoxResult;
+import kd.bos.form.events.AfterDoOperationEventArgs;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.events.MessageBoxClosedEvent;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.BillList;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-年度招聘申请
+ * Description      :年度招聘申请列表插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_casrecrapply
+ */
+
+
+
+public class YearCrApplyListPlugin extends AbstractListPlugin {
+
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate opreate = (FormOperate) args.getSource();
+        switch (opreate.getOperateKey()) {
+            case "submit":
+                ListSelectedRowCollection selectCols = args.getListSelectedData();
+                StringBuffer exceedMsg = new StringBuffer();
+                StringBuffer errorMsg = new StringBuffer();
+                Object[] primaryKeyValues  = selectCols.getPrimaryKeyValues();
+                BillList billlistap = this.getView().getControl("billlistap");
+                EntityType entityType = billlistap.getEntityType();
+                //获取完整数据
+                DynamicObject[] casPaybillArr = BusinessDataServiceHelper.load(primaryKeyValues, entityType);
+                for (int i = 0; i < casPaybillArr.length; i++) {
+                    // 在此添加处理逻辑
+                    DynamicObject dynamicObject = casPaybillArr[i];
+                    // 获取组织,根据组织查询年度招聘计划表,判断该组织是否存在年度招聘计划表
+//                    if(!getErrorMsg(dynamicObject)){
+//                        errorMsg.append("招聘单位:"+dynamicObject.getString("org.name")+":已生成该年度招聘计划,不允许提交该年度招聘申请!\n");
+//                        continue;
+//                    }
+                    Object nckdSftaffcount1 = dynamicObject.get("nckd_sftaffcount");
+                    if(ObjectUtils.isNotEmpty(nckdSftaffcount1)){
+                        int nckdSftaffcount = dynamicObject.getInt("nckd_sftaffcount");
+                        // 实际人数
+                        int nckdRelnum = dynamicObject.getInt("nckd_relnum");
+                        // 申请人数
+                        int nckdApplynum = dynamicObject.getInt("nckd_applynum");
+
+                        if(nckdSftaffcount < nckdRelnum + nckdApplynum){
+                            // 判断是否处理过
+                            String isDealed = this.getView().getPageCache().get("isDealed");
+                            if (!"true".equals(isDealed)) {
+                                if(ObjectUtils.isEmpty(exceedMsg)){
+                                    exceedMsg.append("单据:");
+                                }
+                                exceedMsg.append(dynamicObject.getString("billno")+",");
+                            }
+                        }
+                    }
+
+                }
+                if(ObjectUtils.isNotEmpty(errorMsg)){
+                    args.setCancel(true);
+                    this.getView().showErrorNotification(errorMsg.toString());
+                    return;
+                }
+                if(ObjectUtils.isNotEmpty(exceedMsg)){
+                    args.setCancel(true);
+                    exceedMsg.append("请注意,申请人数超编,是否继续提报?");
+                    ConfirmCallBackListener confirmCallBackListener = new ConfirmCallBackListener("isExceed", this);
+                    // 设置页面确认框,参数为:标题,选项框类型,回调监听
+                    this.getView().showConfirm(exceedMsg.toString(), MessageBoxOptions.YesNo, confirmCallBackListener);
+                    // 只执行一次
+                    this.getView().getPageCache().put("isDealed", "true");
+                }
+                break;
+            default:
+                break;
+        }
+    }
+
+    // 判断组织是否存在年度招聘计划表
+    public  boolean getErrorMsg(DynamicObject dynamicObject){
+        Object nckdYear = dynamicObject.get("nckd_year");
+        QFilter nckdYear1 = new QFilter("nckd_year", QCP.equals, nckdYear);
+        QFilter qBillstatus = new QFilter("billstatus", QCP.equals, "C");
+        QFilter qFilter = new QFilter("org.id", QCP.equals, dynamicObject.getDynamicObject("org").getPkValue());
+        DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_yearcasreplan", "id,org,org.id", new QFilter[]{nckdYear1, qBillstatus, qFilter});
+        if(ObjectUtils.isNotEmpty(dynamicObject1)){
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public void afterDoOperation(AfterDoOperationEventArgs afterDoOperationEventArgs) {
+        super.afterDoOperation(afterDoOperationEventArgs);
+        // 清除
+        this.getView().getPageCache().remove("isDealed");
+    }
+
+    @Override
+    public void confirmCallBack(MessageBoxClosedEvent messageBoxClosedEvent) {
+        //判断回调参数id
+        if ("isExceed".equals(messageBoxClosedEvent.getCallBackId())) {
+            if (MessageBoxResult.Yes.equals(messageBoxClosedEvent.getResult())) {
+                this.getView().invokeOperation("submit");
+            } else if (MessageBoxResult.No.equals(messageBoxClosedEvent.getResult())) {
+                // 点击否也清除
+                this.getView().getPageCache().remove("isDealed");
+            }
+        }
+    }
+
+}

+ 441 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyPlanFormPlugin.java

@@ -0,0 +1,441 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+
+import kd.bos.algo.DataSet;
+import kd.bos.bill.AbstractBillPlugIn;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DBRoute;
+import kd.bos.entity.EntityMetadataCache;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.datamodel.events.ChangeData;
+import kd.bos.entity.datamodel.events.LoadDataEventArgs;
+import kd.bos.entity.datamodel.events.PropertyChangedArgs;
+import kd.bos.form.control.events.BeforeItemClickEvent;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.field.BasedataEdit;
+import kd.bos.form.field.events.BeforeF7SelectEvent;
+import kd.bos.form.field.events.BeforeF7SelectListener;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.ListShowParameter;
+import kd.bos.orm.ORM;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.bos.servicehelper.org.OrgUnitServiceHelper;
+import kd.hr.hbp.common.util.HRDBUtil;
+import nckd.jimin.jyyy.hr.tsrsc.plugin.util.RecUtils;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-年度招聘计划
+ * Description      :年度招聘计划单据插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_yearcasreplan
+ */
+
+
+public class YearCrApplyPlanFormPlugin extends AbstractBillPlugIn implements BeforeF7SelectListener {
+
+    // 公司类型
+    private final List<String> COMPANY_LIST = Arrays.asList(new String[]{"1020_S", "1050_S", "1060_S", "1070_S"});
+
+    private final List<String> COMPANY_LIST2 = Arrays.asList(new String[]{"Orgform01", "Orgform01-100", "Orgform02", "Orgform03","Orgform04"});
+
+    // 定义日期格式
+    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+        //  组织id
+//        Long pkValue = (Long) org.getPkValue();
+        Object billstatus = this.getModel().getValue("billstatus");
+        // 暂存状态才发生变化
+        if(ObjectUtils.equals(billstatus,"A")){
+            DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+            updateStaffCount();
+            // 实际人数
+            this.getModel().setValue("nckd_relnum", RecUtils.getStaffCount(org.getPkValue()));
+        }
+
+    }
+
+    // 获取组织编制人数
+    private void updateStaffCount() {
+
+        DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+        //  组织id
+        Long pkValue = (Long) org.getPkValue();
+        List<Long> longs = new ArrayList<Long>();
+        longs.add(pkValue);
+        QFilter qFilter = new QFilter("boid", QCP.equals, pkValue);
+        // 获取组织历史查询
+        DynamicObjectCollection query = QueryServiceHelper.query("haos_adminorgdetail", "id,boid,hisversion", new QFilter[]{qFilter}, "hisversion desc");
+        if (ObjectUtils.isNotEmpty(query)) {
+            long boid = query.get(0).getLong("id");
+            // 获取填写的年度 nckd_year
+            Object nckdYear = this.getModel().getValue("nckd_year");
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
+
+            if (ObjectUtils.isEmpty(nckdYear)) {
+                nckdYear = new Date();
+            } else {
+                nckdYear = (Date) nckdYear;
+            }
+            String dateStr = sdf.format(nckdYear);
+//            QFilter qFilter2 = new QFilter("staff.year", QCP.like, dateStr + "%");
+            QFilter qFilter1 = new QFilter("dutyorg.id", QCP.equals, boid);
+
+            DynamicObject[] haosDutyorgdetail = BusinessDataServiceHelper.load("haos_dutyorgdetail", "id,dutyorg,staff,staffcount", new QFilter[]{qFilter1});
+            if (ObjectUtils.isNotEmpty(haosDutyorgdetail)) {
+                for (DynamicObject dynamicObject : haosDutyorgdetail) {
+                    String format = sdf.format(dynamicObject.getDate("staff.year"));
+                    if (dateStr.equals(format)) {
+                        int staffcount = dynamicObject.getInt("staffcount");
+                        this.getModel().setValue("nckd_sftaffcount", staffcount);
+                        return;
+                    }
+                }
+            }
+            this.getModel().setValue("nckd_sftaffcount", null);
+
+//            int staffcount = ObjectUtils.isNotEmpty(haosDutyorgdetail) ? haosDutyorgdetail.getInt("staffcount"):null;
+//            this.getModel().setValue("nckd_sftaffcount",staffcount);
+
+        }
+
+    }
+
+    @Override
+    public void loadData(LoadDataEventArgs e) {
+        super.loadData(e);
+    }
+
+    @Override
+    public void propertyChanged(PropertyChangedArgs e) {
+        super.propertyChanged(e);
+        String key = e.getProperty().getName();
+        ChangeData[] changeData = e.getChangeSet();
+        Object newValue = changeData[0].getNewValue();
+        Object oldValue = changeData[0].getOldValue();
+        int iRow = changeData[0].getRowIndex();
+        switch (key) {
+            case "nckd_recruitnum":
+                // 人数字段统计
+                setSumRecruitnum(newValue, iRow);
+                break;
+            default:
+                break;
+        }
+
+    }
+
+    // 公司,部门,岗位选择过滤
+    @Override
+    public void beforeF7Select(BeforeF7SelectEvent e) {
+        String fieldKey = e.getProperty().getName();
+        switch (fieldKey) {
+            case "org":
+                ListShowParameter showParameter4 = (ListShowParameter) e.getFormShowParameter();
+                // 去除部门
+                QFilter qFilter4 = new QFilter("orgpattern.number", "in", COMPANY_LIST2);
+                showParameter4.getListFilterParameter().setFilter(qFilter4);
+                break;
+            default:
+                break;
+        }
+    }
+
+
+    @Override
+    public void registerListener(EventObject e) {
+        super.registerListener(e);
+        // 添加对分录按钮的监听
+        this.addItemClickListeners("advcontoolbarap");
+        BasedataEdit fieldEdit = this.getView().getControl("org");
+        fieldEdit.addBeforeF7SelectListener(this);
+    }
+
+
+    @Override
+    public void beforeItemClick(BeforeItemClickEvent evt) {
+        super.beforeItemClick(evt);
+        String key = evt.getItemKey();
+        //监听分录刷新招聘申请按钮
+        if (key.equals("nckd_advconbaritemap1")) {
+            DynamicObjectCollection entryentity = this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
+            // 获取年度
+            Object nckdYear = this.getModel().getValue("nckd_year");
+            if (ObjectUtils.isEmpty(nckdYear)) {
+                this.getView().showErrorNotification("请先填写年度");
+                return;
+            }
+            entryentity.clear();
+            // 删除分录数据,然后使用表单组织去拉去年度招聘计划中的数据,然后获取他的下级分录,然后添加到本单据分录中,然后刷新本单分录
+            DynamicObject org = (DynamicObject) this.getModel().getValue("org");
+            QFilter nckdYear1 = new QFilter("nckd_year", QCP.equals, nckdYear);
+            QFilter qBillstatus = new QFilter("billstatus", QCP.equals, "C");
+            List<Long> longs = new ArrayList<Long>();
+            longs.add((Long) org.getPkValue());
+            // 获取组织历史查询
+            List<Long> allSubordinateOrgs = OrgUnitServiceHelper.getAllSubordinateOrgs("01", longs, true);
+            QFilter qFilter = new QFilter("org.id", QCP.in, allSubordinateOrgs);
+            Object pkValue = this.getModel().getDataEntity(true).getPkValue();
+            List<String> strings = Arrays.asList(new String[]{"B", "C"});
+            QFilter summary = new QFilter("entryentity.nckd_summary", QCP.not_in, strings);
+            if (ObjectUtils.isNotEmpty(pkValue)) {
+                summary.or("entryentity.nckd_casreplanid", QCP.equals, pkValue);
+            }
+            qFilter.and(summary);
+            // 年度招聘计划数据
+            DynamicObject[] loads = BusinessDataServiceHelper.load("nckd_yearapply", "id,org,org.id,billstatus,entryentity,entryentity.nckd_recruitorg," +
+                    "entryentity.nckd_recruitpost,entryentity.nckd_recruitnum,entryentity.nckd_majortype,entryentity.nckd_qualifications," +
+                    "entryentity.nckd_payrange,entryentity.nckd_employcategory,entryentity.nckd_recruittype,nckd_year,entryentity.nckd_summary," +
+                    "entryentity.nckd_casreplanid,entryentity.nckd_payrangemin,entryentity.nckd_education,entryentity.nckd_compilation," +
+                    "entryentity.nckd_currentnum,entryentity.nckd_employmentreasons", new QFilter[]{nckdYear1, qFilter, qBillstatus});
+            if (ObjectUtils.isEmpty(loads)) {
+                return;
+            }
+            ORM orm = ORM.create();
+            for (DynamicObject dynamicObject : loads) {
+                // 获取招聘计划的下级分录
+                DynamicObjectCollection entryentity1 = dynamicObject.getDynamicObjectCollection("entryentity");
+                if (ObjectUtils.isEmpty(entryentity1)) {
+                    continue;
+                }
+                for (DynamicObject object : entryentity1) {
+                    Object nckdCasreplanid = object.get("nckd_casreplanid");
+                    String nckdSummary = object.getString("nckd_summary");
+
+                    if (ObjectUtils.isEmpty(nckdCasreplanid) || nckdCasreplanid.equals(pkValue) || !strings.contains(nckdSummary)) {
+                        DynamicObject dynamicObjentryrow = entryentity.addNew();
+                        // 招聘单位
+                        dynamicObjentryrow.set("nckd_recruitcompany", dynamicObject.getDynamicObject("org"));
+                        dynamicObjentryrow.set("nckd_recruitorg", object.getDynamicObject("nckd_recruitorg"));
+                        dynamicObjentryrow.set("nckd_recruitpost", object.get("nckd_recruitpost"));
+                        dynamicObjentryrow.set("nckd_recruitnum", object.get("nckd_recruitnum"));
+                        dynamicObjentryrow.set("nckd_approvednum", object.get("nckd_recruitnum"));
+                        // 1专业类别
+                        StringBuilder sqlBuilder = new StringBuilder("SELECT m.fbasedataid FROM tk_nckd_yearcrapp_major m WHERE m.fentryid = ?");
+                        // 2 学历
+                        StringBuilder sqlBuilder2 = new StringBuilder("SELECT m.fbasedataid FROM tk_nckd_yearcrapp_qualifi m WHERE m.fentryid = ?");
+
+                        Object[] param = new Object[]{object.getPkValue()};
+                        DataSet rows = HRDBUtil.queryDataSet("tk_nckd_yearcrapp_major", new DBRoute("tsc"), sqlBuilder.toString(), param);
+
+                        DataSet rows2 = HRDBUtil.queryDataSet("tk_nckd_yearcrapp_qualifi", new DBRoute("tsc"), sqlBuilder2.toString(), param);
+
+                        // 多选基础资料key
+                        DynamicObjectCollection retDynCol = orm.toPlainDynamicObjectCollection(rows);
+                        MainEntityType type = EntityMetadataCache.getDataEntityType("nckd_specialityclass");
+                        DynamicObjectCollection newColList = dynamicObjentryrow.getDynamicObjectCollection("nckd_majortype");
+
+                        DynamicObjectCollection retDynCol2 = orm.toPlainDynamicObjectCollection(rows2);
+                        MainEntityType type2 = EntityMetadataCache.getDataEntityType("hbss_diploma");
+                        DynamicObjectCollection newColList2 = dynamicObjentryrow.getDynamicObjectCollection("nckd_qualifications");
+
+                        if (ObjectUtils.isNotEmpty(retDynCol)) {
+                            // 创建多选基础资料,
+                            for (DynamicObject dynamicObject1 : retDynCol) {
+                                DynamicObject dynamicObject2 = newColList.addNew();
+                                dynamicObject2.set("fbasedataId", BusinessDataServiceHelper.loadSingle(dynamicObject1.get("fbasedataid"), type));
+                            }
+                        }
+                        if (ObjectUtils.isNotEmpty(retDynCol2)) {
+                            // 创建多选基础资料,
+                            for (DynamicObject dynamicObject2 : retDynCol2) {
+                                DynamicObject dynamicObject3 = newColList2.addNew();
+                                dynamicObject3.set("fbasedataId", BusinessDataServiceHelper.loadSingle(dynamicObject2.get("fbasedataid"), type2));
+                            }
+                        }
+                        dynamicObjentryrow.set("nckd_payrange", object.get("nckd_payrange"));
+                        dynamicObjentryrow.set("nckd_payrangemin", object.get("nckd_payrangemin"));
+                        dynamicObjentryrow.set("nckd_employcategory", object.get("nckd_employcategory"));
+                        dynamicObjentryrow.set("nckd_recruittype", object.get("nckd_recruittype"));
+                        dynamicObjentryrow.set("nckd_yearapplyid", dynamicObject.getPkValue());
+                        dynamicObjentryrow.set("nckd_yearapplyentryid", object.getPkValue());
+                        dynamicObjentryrow.set("nckd_education", object.get("nckd_education"));
+                        dynamicObjentryrow.set("nckd_employmentreasons", object.get("nckd_employmentreasons"));
+                        dynamicObjentryrow.set("nckd_compilation", object.get("nckd_compilation"));
+                        dynamicObjentryrow.set("nckd_currentnum", object.get("nckd_currentnum"));
+
+                    }
+
+                }
+            }
+            // 计算人数
+            setSumRecruitnum(0, -1);
+            getView().updateView("entryentity");
+
+        }
+    }
+
+
+    // 校验
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate opreate = (FormOperate) args.getSource();
+//        switch (opreate.getOperateKey()) {
+//            case "save":
+//            case "submit":
+//                DynamicObject dataEntity = this.getModel().getDataEntity(true);
+//                if (!getErrorMsg(dataEntity)) {
+//                    args.setCancel(true);
+//                }
+//                break;
+//            default:
+//                break;
+//        }
+    }
+
+    public boolean getErrorMsg(DynamicObject dynamicObject) {
+        Object nckdYear = dynamicObject.get("nckd_year");
+        String billno = dynamicObject.getString("billno");
+        QFilter nckdYear1 = new QFilter("nckd_year", QCP.equals, nckdYear);
+        QFilter qBillstatus = new QFilter("billstatus", QCP.equals, "C");
+        qBillstatus.and("billno", QCP.not_equals, billno);
+        QFilter qFilter = new QFilter("org.id", QCP.equals, dynamicObject.getDynamicObject("org").getPkValue());
+        DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_yearcasreplan", "id,org,org.id", new QFilter[]{nckdYear1, qBillstatus, qFilter});
+        if (ObjectUtils.isNotEmpty(dynamicObject1)) {
+            return false;
+        }
+        return true;
+    }
+
+    private boolean planValidator(DynamicObject org) {
+        Object nckdYear = this.getModel().getValue("nckd_year");
+        QFilter nckdYear1 = new QFilter("nckd_year", QCP.equals, nckdYear);
+        QFilter qBillstatus = new QFilter("billstatus", QCP.equals, "C");
+        // 获取所有下级组织 org.getPkValue()
+        String selectFields = "id,org,org.id,org.name,longnumber,parent,orgpattern";
+        QFilter numberFilter = new QFilter("number", "=", "01");
+        DynamicObject viewObj = BusinessDataServiceHelper.loadSingleFromCache("bos_org_viewschema", "id", new QFilter[]{numberFilter});
+        QFilter viewFilter = new QFilter("view", "=", viewObj.getPkValue());
+        QFilter viewFilter2 = new QFilter("parent.id", "=", org.getPkValue());
+        QFilter[] filters = new QFilter[]{viewFilter, viewFilter2};
+        // 获取组织所有直属下级组织
+        DynamicObject[] bosOrgStructures = BusinessDataServiceHelper.load("bos_org_structure", selectFields, filters);
+        if (ObjectUtils.isNotEmpty(bosOrgStructures)) {
+            // 存在下级组织,使用下级组织查询
+            Set<Long> allSubOrgIds = new HashSet(10000);
+            for (int i = 0; i < bosOrgStructures.length; i++) {
+                allSubOrgIds.add((Long) bosOrgStructures[i].get("org.id"));
+            }
+            QFilter qFilter4 = new QFilter("orgpattern.number", "in", COMPANY_LIST2).and("id", QCP.in, allSubOrgIds);
+            DynamicObject[] bosOrgs = BusinessDataServiceHelper.load("bos_org", "id,name,orgpattern", new QFilter[]{qFilter4});
+            Set<Long> allSubOrgIds2 = new HashSet(10000);
+            for (DynamicObject bosOrg : bosOrgs) {
+                allSubOrgIds2.add((Long) bosOrg.get("id"));
+            }
+            // 获取所有下级组织的招聘计划
+            QFilter bosOrgFilter = new QFilter("org.id", QCP.in, allSubOrgIds2);
+            StringBuilder errBuilder = new StringBuilder();
+            DynamicObject[] nckdYearcasreplans = BusinessDataServiceHelper.load("nckd_yearcasreplan", "id,org", new QFilter[]{nckdYear1, bosOrgFilter, qBillstatus});
+            if (ObjectUtils.isEmpty(nckdYearcasreplans)) {
+                errBuilder.append("直属下级组织未配置完年度招聘计划");
+            } else {
+                Map<Object, DynamicObject> resultMap = Arrays.stream(nckdYearcasreplans)
+                        .collect(Collectors.toMap(
+                                obj -> obj.get("org.id"), // 使用 org.id 作为 key
+                                obj -> obj, // 使用 DynamicObject 本身作为 value
+                                (existing, replacement) -> existing // 如果键冲突,保留现有值
+                        ));
+                for (DynamicObject bosOrgStructure : bosOrgStructures) {
+                    DynamicObject dynamicObject = resultMap.get(bosOrgStructure.get("org.id"));
+                    if (ObjectUtils.isEmpty(dynamicObject)) {
+                        errBuilder.append("组织[" + bosOrgStructure.get("org.name") + "]未配置完年度招聘计划");
+                    }
+                }
+            }
+            if (ObjectUtils.isNotEmpty(errBuilder)) {
+                // 未通过校验
+                this.getView().showErrorNotification(errBuilder.toString());
+                return false;
+            }
+
+        }
+
+        return true;
+    }
+
+
+    public static boolean isNotEmpty(Object key) {
+        // 基础资料判空
+        if (ObjectUtils.isEmpty(key) || ObjectUtils.isEmpty(((DynamicObject) key).getDataStorage())) {
+            return false;
+        }
+        return true;
+    }
+
+
+    // 获取组织对应人员编制总数(包含下级)
+    public static int getStaffCount(Object orgId) {
+
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String dateStr = sdf.format(date);
+
+        // 拼接 SQL 查询
+        // 拼接 SQL 查询 haos_stafforgempcount
+        StringBuilder sql = new StringBuilder("SELECT DISTINCT T.fstructlongnumber,ST.fcount as count "
+                + "FROM T_HAOS_ADMINORG A "
+                + "LEFT JOIN T_HAOS_ADMINSTRUCT T ON a.fboid = T.fadminorgid "
+                + "left join T_HAOS_STAFFORGEMPCOUNT ST on A.fboid = ST.fuseorgboid "
+                + "WHERE A.fiscurrentversion = '0' AND A.fdatastatus = '1' AND A.finitstatus = '2' "
+                + "AND T.fiscurrentversion = '0' AND T.fdatastatus = '1' AND T.fstructprojectid = 1010 "
+                + "AND T.finitstatus = '2' AND T.fbsed <= '" + dateStr + "' "
+                + "AND T.fbsled >= '" + dateStr + "' AND T.fenable = '1' "
+                + "AND A.fbsed <= '" + dateStr + "' AND A.fbsled >= '" + dateStr + "' "
+                + "AND A.fenable = '1' "
+                + "AND ( T.fstructlongnumber LIKE ( select top 1 concat(F.fstructlongnumber,'%')  from  T_HAOS_ADMINSTRUCT F where  F.fadminorgid = ? "
+                + "AND F.fiscurrentversion = '0' AND F.fdatastatus = '1' AND F.fstructprojectid = 1010 "
+                + "AND F.finitstatus = '2' AND F.fbsed <= '" + dateStr + "' "
+                + "AND F.fbsled >= '" + dateStr + "' AND F.fenable = '1' "
+                + ") " + ") "
+        );
+        Object[] param = new Object[]{(Long) orgId};
+        DataSet dataSet = HRDBUtil.queryDataSet("haos_adminOrgHisSearch", new DBRoute("hr"), sql.toString(), param);
+
+        ORM orm = ORM.create();
+        DynamicObjectCollection retDynCol = orm.toPlainDynamicObjectCollection(dataSet);
+        // 获取实际人数
+        AtomicInteger nckdRellownum2 = new AtomicInteger(0);
+        retDynCol.forEach(dynObj -> {
+            int count = dynObj.getInt("count");
+            if (ObjectUtils.isNotEmpty(count)) {
+                nckdRellownum2.addAndGet(count);
+            }
+        });
+        return nckdRellownum2.get();
+    }
+
+    public void setSumRecruitnum(Object newValue, int row) {
+        // 计算招聘人数,获取出所有分录,然后统计所有分录的招聘人数累加
+        DynamicObjectCollection entryEntity = this.getModel().getEntryEntity("entryentity");
+        int num = 0;
+        for (int i = 0; i < entryEntity.size(); i++) {
+            if (row == i) {
+                num = num + (Integer) newValue;
+            } else {
+                num = num + (Integer) entryEntity.get(i).get("nckd_recruitnum");
+            }
+        }
+        this.getModel().setValue("nckd_applynum", num);
+    }
+
+}

+ 68 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/YearCrApplyPlanListPlugin.java

@@ -0,0 +1,68 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.EntityType;
+import kd.bos.entity.datamodel.ListSelectedRowCollection;
+import kd.bos.form.events.BeforeDoOperationEventArgs;
+import kd.bos.form.operate.FormOperate;
+import kd.bos.list.BillList;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-年度招聘计划
+ * Description      :年度招聘计划列表插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_yearcasreplan
+ */
+
+public class YearCrApplyPlanListPlugin extends AbstractListPlugin {
+
+    @Override
+    public void beforeDoOperation(BeforeDoOperationEventArgs args) {
+        super.beforeDoOperation(args);
+        FormOperate opreate = (FormOperate) args.getSource();
+        switch (opreate.getOperateKey()) {
+            case "submit":
+            case "save":
+//                ListSelectedRowCollection selectCols = args.getListSelectedData();
+//                StringBuffer exceedMsg = new StringBuffer();
+//                StringBuffer errorMsg = new StringBuffer();
+//                Object[] primaryKeyValues = selectCols.getPrimaryKeyValues();
+//                BillList billlistap = this.getView().getControl("billlistap");
+//                EntityType entityType = billlistap.getEntityType();
+//                //获取完整数据
+//                DynamicObject[] casPaybillArr = BusinessDataServiceHelper.load(primaryKeyValues, entityType);
+//                for (DynamicObject dynamicObject : casPaybillArr) {
+//                    if(!getErrorMsg(dynamicObject)){
+//                        errorMsg.append("招聘单位:"+dynamicObject.getString("org.name")+":已生成该年度招聘计划,请勿重复生成!\n");
+//                    }
+//                }
+//                if(ObjectUtils.isNotEmpty(errorMsg)){
+//                    args.setCancelMessage(exceedMsg.toString());
+//                    args.setCancel(true);
+//                }
+        }
+
+    }
+
+    public  boolean getErrorMsg(DynamicObject dynamicObject){
+        Object nckdYear = dynamicObject.get("nckd_year");
+        String billno = dynamicObject.getString("billno");
+        QFilter nckdYear1 = new QFilter("nckd_year", QCP.equals, nckdYear);
+        QFilter qBillstatus = new QFilter("billstatus", QCP.equals, "C");
+        qBillstatus.and("billno",QCP.not_equals,billno);
+        QFilter qFilter = new QFilter("org.id", QCP.equals, dynamicObject.getDynamicObject("org").getPkValue());
+        DynamicObject dynamicObject1 = BusinessDataServiceHelper.loadSingle("nckd_yearcasreplan", "id,org,org.id", new QFilter[]{nckdYear1, qBillstatus, qFilter});
+        if(ObjectUtils.isNotEmpty(dynamicObject1)){
+            return false;
+        }
+        return true;
+    }
+
+
+}

+ 61 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/CasRecrApplyUnAuditValidator.java

@@ -0,0 +1,61 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * description: 年度招聘计划校验插件,反审核校验器
+ * nckd_yearapply
+ * @author Tyx
+ * @date  2025/5/8
+ */
+
+public class CasRecrApplyUnAuditValidator extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                ExtendedDataEntity[] dataEntities = this.getDataEntities();
+
+                for (ExtendedDataEntity dataEntity : dataEntities) {
+                    DynamicObject dynamicObject = dataEntity.getDataEntity();
+                    DynamicObjectCollection entryentity = dynamicObject.getDynamicObjectCollection("entryentity");
+                    if(entryentity.size() > 0){
+                        List<String> objectList = entryentity.stream()
+                                .map(entry -> {
+                                    return String.valueOf(entry.getPkValue());
+                                })
+                                .collect(Collectors.toList());
+                        DynamicObject[] load = BusinessDataServiceHelper.load("tstpm_srscarfmrsm", "id", (new QFilter("nckd_mokahcnum", QCP.in, objectList)).toArray());
+                        if(load.length > 0){
+                            this.addErrorMessage(dataEntity, "已存在候选人信息,不允许反审核!");
+                            break;
+                        }
+                    }
+                }
+            }
+        });
+    }
+}

+ 86 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/CasRecrApplyWorkFlowPlugin.java

@@ -0,0 +1,86 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.swc.hsbp.business.servicehelper.SWCDataServiceHelper;
+
+
+import java.util.ArrayList;
+import java.util.List;
+/**
+ * Module           :人才供应云-招聘直通车-首页-临时招聘申请
+ * Description      :审批流按钮操作插件
+ * @author Tyx
+ * @date  2025/05/08
+ * 标识 nckd_casrecrapply
+ */
+
+public class CasRecrApplyWorkFlowPlugin extends AbstractOperationServicePlugIn {
+
+    private static Log logger = LogFactory.getLog(CasRecrApplyWorkFlowPlugin.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    public void beginOperationTransaction(BeginOperationTransactionArgs args) {
+        super.beginOperationTransaction(args);
+        DynamicObject[] regBillObjs = args.getDataEntities();
+//        List<Long> billIdList = new ArrayList(10);
+//        DynamicObject[] var5 = regBillObjs;
+//        int var6 = regBillObjs.length;
+//
+//        for(int var7 = 0; var7 < var6; ++var7) {
+//            DynamicObject dynamicObject = var5[var7];
+//            long id = dynamicObject.getLong("id");
+//            billIdList.add(id);
+//        }
+//
+        SWCDataServiceHelper helper = new SWCDataServiceHelper("nckd_casrecrapply");
+//        QFilter filter = new QFilter("id", "in", billIdList);
+//        DynamicObject[] needUpdateBillDy = helper.query("id,billstatus", new QFilter[]{filter});
+        switch (args.getOperationKey()) {
+            case "wfauditnotpass":
+                this.setApproveStatus(regBillObjs, "E");
+                break;
+            case "wfrejecttosubmit":
+                this.setApproveStatus(regBillObjs, "A");
+                break;
+            case "wfauditing":
+                this.setApproveStatus(regBillObjs, "D");
+                break;
+            case "wfauditpass":
+                this.setApproveStatus(regBillObjs, "C");
+                break;
+            default:
+                break;
+        }
+
+        helper.save(regBillObjs);
+    }
+
+
+    private void setApproveStatus(DynamicObject[] regBillObjs, String billstatus) {
+        DynamicObject[] var3 = regBillObjs;
+        int var4 = regBillObjs.length;
+
+        for(int var5 = 0; var5 < var4; ++var5) {
+            DynamicObject dynamicObject = var3[var5];
+            dynamicObject.set("billstatus", billstatus);
+        }
+
+    }
+
+
+}
+

+ 151 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyPlanOperatePlugin.java

@@ -0,0 +1,151 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.operation.SaveServiceHelper;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ *
+ * @author Tyx
+ * @date  2025/5/8
+ * 年度招聘计划操作插件
+ *
+ */
+public class YearCrApplyPlanOperatePlugin extends AbstractOperationServicePlugIn {
+
+
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    public void beginOperationTransaction(BeginOperationTransactionArgs args) {
+        super.beginOperationTransaction(args);
+        DynamicObject[] regBillObjs = args.getDataEntities();
+
+        switch (args.getOperationKey()) {
+            case "wfauditnotpass":
+            case "delete":
+                // 审批不通过,删除
+
+                updateYearcrapplyPlan(regBillObjs, "A");
+                break;
+            case "wfauditpass":
+                // 审批通过
+            case "audit":
+                // 审批
+                updateYearcrapplyPlan(regBillObjs, "C");
+                updatePersonNum(regBillObjs);
+                break;
+            case "unsubmit":
+                // 校验是否存在下级单据
+                String errorMsg = validateYearcrapplyPlan(regBillObjs);
+                if(StringUtils.isNoneBlank(errorMsg)){
+
+                }
+
+
+                updateYearcrapplyPlan(regBillObjs, "B");
+                break;
+                // 反审批
+            case "save":
+                // 保存
+                updateYearcrapplyPlan(regBillObjs, "B");
+                break;
+            default:
+                break;
+        }
+
+    }
+
+    private String validateYearcrapplyPlan(DynamicObject[] yearcrapplyPlanObj){
+
+        return null;
+    }
+
+
+    // 更新年度招聘申请核定人数
+    private void updatePersonNum(DynamicObject[] yearcrapplyPlanObjs){
+        List<DynamicObject> yearcrapplyPlanObjsList = new ArrayList<>();
+        Set<Long> yearcrapplyPlanIds = new HashSet<>();
+        for (DynamicObject yearcrapplyPlanObj : yearcrapplyPlanObjs) {
+            DynamicObjectCollection entryentity = yearcrapplyPlanObj.getDynamicObjectCollection("entryentity");
+            for (DynamicObject dynamicObject : entryentity) {
+                yearcrapplyPlanObjsList.add(dynamicObject);
+                yearcrapplyPlanIds.add(dynamicObject.getLong("nckd_yearapplyid"));
+            }
+        }
+        Map<Object, DynamicObject> resultMap = yearcrapplyPlanObjsList.stream()
+                .collect(Collectors.toMap(
+                        obj -> obj.get("nckd_yearapplyentryid"), // 获取key
+                        obj -> obj // 获取value
+                ));
+
+        QFilter qFilter = new QFilter("id", QCP.in, yearcrapplyPlanIds);
+        DynamicObject[] nckdYearapplies = BusinessDataServiceHelper.load("nckd_yearapply", "id,entryentity,entryentity.nckd_summary,entryentity.nckd_approvednum", new QFilter[]{qFilter});
+        for (DynamicObject nckdYearapply : nckdYearapplies) {
+            DynamicObjectCollection entryentity = nckdYearapply.getDynamicObjectCollection("entryentity");
+            for (DynamicObject dynamicObject : entryentity) {
+                DynamicObject dynamicObjectentry = resultMap.get(dynamicObject.getPkValue());
+                if(ObjectUtils.isNotEmpty(dynamicObjectentry)){
+                    dynamicObject.set("nckd_approvednum", dynamicObjectentry.get("nckd_approvednum"));
+                }
+            }
+        }
+        if(nckdYearapplies.length>0){
+            SaveServiceHelper.save(nckdYearapplies);
+        }
+    }
+
+    private void updateYearcrapplyPlan(DynamicObject[] yearcrapplyPlanObjs, String status) {
+        //  获取单据单内 年度招聘申请id和申请分录id
+
+        for (DynamicObject yearcrapplyPlanObj : yearcrapplyPlanObjs) {
+            Set<Long> yearcrapplyPlanIds = new HashSet<>();
+            Set<Long> yearcrapplyPlanEntryIds = new HashSet<>();
+            DynamicObjectCollection entryentity = yearcrapplyPlanObj.getDynamicObjectCollection("entryentity");
+            for (DynamicObject entry : entryentity) {
+                yearcrapplyPlanEntryIds.add(entry.getLong("nckd_yearapplyentryid"));
+                yearcrapplyPlanIds.add(entry.getLong("nckd_yearapplyid"));
+            }
+
+            List<Long> yearcrapplyPlanEntryIdsList = new ArrayList<>(yearcrapplyPlanEntryIds);
+            List<Long> yearcrapplyPlanIdsList = new ArrayList<>(yearcrapplyPlanIds);
+            QFilter qFilter = new QFilter("id", QCP.in, yearcrapplyPlanIdsList);
+            QFilter qFilter1 = new QFilter("entryentity.id", QCP.in, yearcrapplyPlanEntryIdsList);
+
+            DynamicObject[] loads = BusinessDataServiceHelper.load("nckd_yearapply","id,nckd_summarstatus,entryentity,entryentity.id,entryentity.,entryentity.nckd_summary,entryentity.nckd_casreplanid",new QFilter[]{qFilter,qFilter1});
+            for (DynamicObject load : loads) {
+                load.set("nckd_summarstatus", status);
+                DynamicObjectCollection entryentity1 = load.getDynamicObjectCollection("entryentity");
+                for (DynamicObject dynamicObject : entryentity1) {
+                    if(yearcrapplyPlanEntryIdsList.contains(dynamicObject.getLong("id"))){
+                        dynamicObject.set("nckd_summary", status);
+                        if(status.equals("A")){
+                            dynamicObject.set("nckd_casreplanid", null);
+                        }else{
+                            dynamicObject.set("nckd_casreplanid", yearcrapplyPlanObj.getPkValue());
+                        }
+                    }
+                }
+            }
+            SaveServiceHelper.save(loads);
+        }
+    }
+}

+ 66 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyPlanUnAuditValidator.java

@@ -0,0 +1,66 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.orm.query.QCP;
+import kd.bos.orm.query.QFilter;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * description: 年度招聘计划校验插件
+ * nckd_yearapply
+ * @author Tyx
+ * @date  2025/5/8
+ */
+
+public class YearCrApplyPlanUnAuditValidator extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+
+
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                ExtendedDataEntity[] dataEntities = this.getDataEntities();
+
+                for (ExtendedDataEntity dataEntity : dataEntities) {
+                    DynamicObject dynamicObject = dataEntity.getDataEntity();
+                    DynamicObjectCollection entryentity = dynamicObject.getDynamicObjectCollection("entryentity");
+                    if(entryentity.size() > 0){
+                        List<String> objectList = entryentity.stream()
+                                .map(entry -> {
+                                    return String.valueOf(entry.getPkValue());
+                                })
+                                .collect(Collectors.toList());
+                        DynamicObject[] load = BusinessDataServiceHelper.load("tstpm_srscarfmrsm", "id", (new QFilter("nckd_mokahcnum", QCP.in, objectList)).toArray());
+                        if(load.length > 0){
+                            this.addErrorMessage(dataEntity, "已存在候选人信息,不允许反审核!");
+                            break;
+                        }
+                    }
+                }
+            }
+        });
+    }
+
+}

+ 73 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyPlanWorkFlowPlugin.java

@@ -0,0 +1,73 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.swc.hsbp.business.servicehelper.SWCDataServiceHelper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-年度招聘计划
+ * Description      :审批流按钮操作插件
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_yearapply
+ */
+
+
+public class YearCrApplyPlanWorkFlowPlugin extends AbstractOperationServicePlugIn {
+
+    private static Log logger = LogFactory.getLog(YearCrApplyPlanWorkFlowPlugin.class);
+
+
+    public void beginOperationTransaction(BeginOperationTransactionArgs args) {
+        super.beginOperationTransaction(args);
+        DynamicObject[] regBillObjs = args.getDataEntities();
+
+        SWCDataServiceHelper helper = new SWCDataServiceHelper("nckd_yearcasreplan");
+
+        switch (args.getOperationKey()) {
+            case "wfauditnotpass":
+                this.setApproveStatus(regBillObjs, "E");
+                break;
+            case "wfrejecttosubmit":
+                this.setApproveStatus(regBillObjs, "A");
+                break;
+            case "wfauditing":
+                this.setApproveStatus(regBillObjs, "D");
+                break;
+            case "wfauditpass":
+                this.setApproveStatus(regBillObjs, "C");
+                break;
+            default:
+                break;
+        }
+        helper.update(regBillObjs);
+    }
+
+    private void setApproveStatus(DynamicObject[] regBillObjs, String billstatus) {
+        DynamicObject[] var3 = regBillObjs;
+        int var4 = regBillObjs.length;
+        for(int var5 = 0; var5 < var4; ++var5) {
+            DynamicObject dynamicObject = var3[var5];
+            dynamicObject.set("billstatus", billstatus);
+        }
+    }
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+}
+

+ 56 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplySubmitValidator.java

@@ -0,0 +1,56 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.dataentity.metadata.IDataEntityProperty;
+import kd.bos.entity.ExtendedDataEntity;
+import kd.bos.entity.MainEntityType;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.AddValidatorsEventArgs;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.validate.AbstractValidator;
+import kd.bos.servicehelper.MetadataServiceHelper;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * description: 年度招聘申请提交校验插件
+ * nckd_yearapply
+ * @author Tyx
+ * @date  2025/5/8
+ */
+
+public class YearCrApplySubmitValidator extends AbstractOperationServicePlugIn {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+
+
+
+    @Override
+    public void onAddValidators(AddValidatorsEventArgs e) {
+        super.onAddValidators(e);
+        e.addValidator(new AbstractValidator() {
+            @Override
+            public void validate() {
+                ExtendedDataEntity[] dataEntities = this.getDataEntities();
+                for (ExtendedDataEntity dataEntity : dataEntities) {
+                    DynamicObject dynamicObject = dataEntity.getDataEntity();
+                    String nckdSummarstatus = dynamicObject.getString("nckd_summarstatus");
+                    if(StringUtils.isNotEmpty(nckdSummarstatus) && !"A".equals(nckdSummarstatus)){
+                        this.addErrorMessage(dataEntity, "汇总状态为已汇总和汇总中的数据,不能进行操作!");
+                        break;
+                    }
+                }
+            }
+        });
+    }
+
+}

+ 86 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/operate/YearCrApplyWorkFlowPlugin.java

@@ -0,0 +1,86 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.plugin.AbstractOperationServicePlugIn;
+import kd.bos.entity.plugin.PreparePropertysEventArgs;
+import kd.bos.entity.plugin.args.BeginOperationTransactionArgs;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.orm.query.QFilter;
+import kd.swc.hsbp.business.servicehelper.SWCDataServiceHelper;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * Module           :人才供应云-招聘直通车-首页-年度招聘申请
+ * Description      :审批流按钮操作插件
+ *
+ * @author Tyx
+ * @date  2025/5/8
+ * 标识 nckd_yearapply
+ */
+
+
+public class YearCrApplyWorkFlowPlugin extends AbstractOperationServicePlugIn {
+
+    private static Log logger = LogFactory.getLog(YearCrApplyWorkFlowPlugin.class);
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+        // 提前加载表单里的字段
+        List<String> fieldKeys = e.getFieldKeys();
+        fieldKeys.addAll(this.billEntityType.getAllFields().keySet());
+    }
+
+    public void beginOperationTransaction(BeginOperationTransactionArgs args) {
+        super.beginOperationTransaction(args);
+        DynamicObject[] regBillObjs = args.getDataEntities();
+//        List<Long> billIdList = new ArrayList(10);
+//        DynamicObject[] var5 = regBillObjs;
+//        int var6 = regBillObjs.length;
+//
+//        for(int var7 = 0; var7 < var6; ++var7) {
+//            DynamicObject dynamicObject = var5[var7];
+//            long id = dynamicObject.getLong("id");
+//            billIdList.add(id);
+//        }
+
+        SWCDataServiceHelper helper = new SWCDataServiceHelper("nckd_yearapply");
+//        QFilter filter = new QFilter("id", "in", billIdList);
+//        DynamicObject[] needUpdateBillDy = helper.query("id,billstatus", new QFilter[]{filter});
+
+        switch (args.getOperationKey()) {
+            case "wfauditnotpass":
+                this.setApproveStatus(regBillObjs, "E");
+                break;
+            case "wfrejecttosubmit":
+                this.setApproveStatus(regBillObjs, "A");
+                break;
+            case "wfauditing":
+                this.setApproveStatus(regBillObjs, "D");
+                break;
+            case "wfauditpass":
+                this.setApproveStatus(regBillObjs, "C");
+                break;
+            default:
+                break;
+        }
+
+        helper.save(regBillObjs);
+    }
+
+    private void setApproveStatus(DynamicObject[] regBillObjs, String billstatus) {
+        DynamicObject[] var3 = regBillObjs;
+        int var4 = regBillObjs.length;
+        for(int var5 = 0; var5 < var4; ++var5) {
+            DynamicObject dynamicObject = var3[var5];
+            dynamicObject.set("billstatus", billstatus);
+        }
+    }
+}
+

+ 61 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/util/RecUtils.java

@@ -0,0 +1,61 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.util;
+
+import kd.bos.algo.DataSet;
+import kd.bos.dataentity.entity.DynamicObjectCollection;
+import kd.bos.db.DBRoute;
+import kd.bos.orm.ORM;
+import kd.hr.hbp.common.util.HRDBUtil;
+import org.apache.commons.lang3.ObjectUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class RecUtils {
+
+    /**
+     * 获取组织对应人员编制总数(包含下级)
+     * @param orgId 组织ID
+     * @return 编制数
+     */
+    public static int getStaffCount(Object orgId){
+
+        Date date = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        String dateStr = sdf.format(date);
+
+        // 拼接 SQL 查询 haos_stafforgempcount
+        StringBuilder sql2 = new StringBuilder("SELECT DISTINCT T.fstructlongnumber,ST.fcount as count "
+                + "FROM T_HAOS_ADMINORG A "
+                + "LEFT JOIN T_HAOS_ADMINSTRUCT T ON a.fboid = T.fadminorgid "
+                + "left join T_HAOS_STAFFORGEMPCOUNT ST on A.fboid = ST.fuseorgboid "
+                + "WHERE A.fiscurrentversion = '0' AND A.fdatastatus = '1' AND A.finitstatus = '2' "
+                + "AND T.fiscurrentversion = '0' AND T.fdatastatus = '1' AND T.fstructprojectid = 1010 "
+                + "AND T.finitstatus = '2' AND T.fbsed <= '" + dateStr + "' "
+                + "AND T.fbsled >= '" + dateStr + "' AND T.fenable = '1' "
+                + "AND A.fbsed <= '" + dateStr + "' AND A.fbsled >= '" + dateStr + "' "
+                + "AND A.fenable = '1' "
+                + "AND ( T.fstructlongnumber LIKE ( select top 1 concat(F.fstructlongnumber,'%')  from  T_HAOS_ADMINSTRUCT F where  F.fadminorgid = ? "
+                + "AND F.fiscurrentversion = '0' AND F.fdatastatus = '1' AND F.fstructprojectid = 1010 "
+                + "AND F.finitstatus = '2' AND F.fbsed <= '" + dateStr + "' "
+                + "AND F.fbsled >= '" + dateStr + "' AND F.fenable = '1' "
+                +") " +") "
+        );
+
+        Object[] param = new Object[]{(Long) orgId};
+//        DataSet dataSet = HRDBUtil.queryDataSet("haos_adminOrgHisSearch", new DBRoute("hr"), sql.toString(), param);
+        DataSet dataSet = HRDBUtil.queryDataSet("haos_adminOrgHisSearch", new DBRoute("hr"), sql2.toString(), param);
+
+        ORM orm = ORM.create();
+        DynamicObjectCollection retDynCol = orm.toPlainDynamicObjectCollection(dataSet);
+        // 获取实际人数
+        AtomicInteger nckdRellownum2 = new AtomicInteger(0);
+        retDynCol.forEach(dynObj -> {
+            if(ObjectUtils.isNotEmpty(dynObj.getInt("count"))){
+                nckdRellownum2.addAndGet(dynObj.getInt("count"));
+            }
+        });
+        return nckdRellownum2.get();
+    }
+
+}