Forráskód Böngészése

1.招聘需求/Offer/候选人列表过滤

Tyx 1 hete
szülő
commit
acec8a26d3

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

@@ -100,7 +100,6 @@ public class AdjustJobBillEffectOp extends AbstractOperationServicePlugIn implem
                             entry.set("nckd_salsyncstatus", "1");
                             entry.set("nckd_synclog", null);
                         }
-                        index++;
                     }
                 }
 
@@ -194,8 +193,12 @@ public class AdjustJobBillEffectOp extends AbstractOperationServicePlugIn implem
             relperson_data.put("jobgrade", jobEntry.getLong("jobgrade.id"));
         }
         else {
-            relperson_data.put("joblevel", relPerson.getLong("joblevel.id"));
-            relperson_data.put("jobgrade", relPerson.getLong("jobgrade.id"));
+            if(relPerson.getLong("joblevel.id") != 0L) {
+                relperson_data.put("joblevel", relPerson.getLong("joblevel.id"));
+            }
+            if(relPerson.getLong("jobgrade.id") != 0L) {
+                relperson_data.put("jobgrade", relPerson.getLong("jobgrade.id"));
+            }
         }
         relperson_data.put("salaystructure", relPerson.getLong("salaystructure.id"));
         relperson_data.put("stdscm", relPerson.getLong("stdscm.id"));

+ 69 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsc/tso/formplugin/web/offer/infopage/WaitOfferBaseFormPluginEx.java

@@ -0,0 +1,69 @@
+package nckd.jimin.jyyy.hr.tsc.tso.formplugin.web.offer.infopage;
+
+import com.kingdee.util.ObjectUtils;
+import kd.bos.dataentity.entity.DynamicObject;
+import kd.bos.entity.datamodel.IDataModel;
+import kd.bos.form.plugin.AbstractFormPlugin;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.bos.servicehelper.QueryServiceHelper;
+import kd.drp.mdr.common.util.ObjectUtil;
+import kd.sdk.plugin.Plugin;
+import nckd.jimin.jyyy.hr.swc.hcdm.formplugin.web.AdjustJobBillEffectOp;
+import nckd.jimin.jyyy.hr.tsrsc.plugin.util.RecUtils;
+
+import java.util.EventObject;
+
+/**
+ * Offer携带招聘需求的部门和岗位
+ * 招聘需求负责人也携带过去,用于后面Offer过滤
+ * @author :Tyx
+ * @since :2025-06-30
+ */
+public class WaitOfferBaseFormPluginEx extends AbstractFormPlugin implements Plugin {
+
+    private static final Log log = LogFactory.getLog(WaitOfferBaseFormPluginEx.class);
+    private static String appFile_entity = "tspr_appfile";  //应聘档案/候选人
+    private static String arfrsm_entity = "tstpm_arfrsm";   //应聘登记表
+    private static String casApply_entity = "nckd_casrecrapply";    //临时招聘申请
+
+
+
+    @Override
+    public void afterCreateNewData(EventObject e) {
+        super.afterCreateNewData(e);
+//        IDataModel model = this.getModel();
+//        //根据应聘档案字段获取候选人档案-应聘登记表上的Moka招聘需求HC
+//        DynamicObject bill = model.getDataEntity();
+//        Long appFileId = bill.getLong("appfile.id");
+//        DynamicObject applyEntry = RecUtils.getCasApplyEntryDyn(appFileId);
+//        if(!ObjectUtil.isEmpty(applyEntry)) {
+//            model.setValue("peadminorg", applyEntry.getLong("entryentity.nckd_recruitorg.id"));
+//            model.setValue("peposition", applyEntry.getLong("entryentity.nckd_recruitpost.id"));
+//        }
+    }
+
+    @Override
+    public void beforeBindData(EventObject e) {
+        super.beforeBindData(e);
+    }
+
+    @Override
+    public void afterBindData(EventObject e) {
+        super.afterBindData(e);
+        IDataModel model = this.getModel();
+        if(model.getDataEntity().getBoolean("nckd_isuseapply"))
+            return;
+        //根据应聘档案字段获取候选人档案-应聘登记表上的Moka招聘需求HC
+        DynamicObject bill = model.getDataEntity();
+        Long appFileId = bill.getLong("appfile.id");
+        DynamicObject applyEntry = RecUtils.getCasApplyEntryDyn(appFileId);
+        if(!ObjectUtil.isEmpty(applyEntry)) {
+            model.setValue("peadminorg", applyEntry.getLong("entryentity.nckd_recruitorg.id"));
+            model.setValue("peposition", applyEntry.getLong("entryentity.nckd_recruitpost.id"));
+            model.setValue("nckd_responser", applyEntry.getLong("nckd_person.id"));
+            model.setValue("nckd_isuseapply", true);
+        }
+    }
+}

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

@@ -0,0 +1,35 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.form;
+
+import kd.bos.form.events.SetFilterEvent;
+import kd.bos.list.plugin.AbstractListPlugin;
+import kd.bos.servicehelper.permission.PermissionServiceHelper;
+import kd.bos.servicehelper.user.UserServiceHelper;
+import kd.hrmp.hrpi.business.domian.service.impl.PersonServiceImpl;
+import kd.sdk.plugin.Plugin;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 候选人列表过滤插件
+ * 默认按照制单人 = 当前用户 or 对应招聘需求的招聘需求负责人 = 当前HR人员
+ * 如果当前用户在 角色编码 = S-001 下,不受控制
+ * @author :Tyx
+ * @since :2025-07-09
+ */
+public class AppFileFilterListPlugin extends AbstractListPlugin implements Plugin {
+
+    @Override
+    public void setFilter(SetFilterEvent e) {
+        super.setFilter(e);
+        //当前用户ID
+        Long userId = UserServiceHelper.getCurrentUserId();
+        //查询角色是否在 编码=S-001 的角色下 在的话不做任何过滤
+        List<Long> userIds = PermissionServiceHelper.getUsersByRoleNum("S-001");
+        if(userIds.contains(userId))
+            return;
+        Long personId = 999999L;
+        Map<String, Object> map = PersonServiceImpl.getInstance().getPersonModelIdByUserId(userId);
+
+    }
+}

+ 3 - 3
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/tsrsc/plugin/form/CommonFilterListPlugin.java

@@ -14,7 +14,7 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * 通用列表过滤当插件
+ * 临时/年度招聘申请列表过滤当插件
  * 默认按照制单人=当前用户 or 招聘需求负责人 = 当前HR人员
  * 如果当前用户在 角色编码 = S-001 下,不受控制
  * @author :Tyx
@@ -27,8 +27,8 @@ public class CommonFilterListPlugin extends AbstractListPlugin implements Plugin
         super.setFilter(e);
         //当前用户ID
         Long userId = UserServiceHelper.getCurrentUserId();
-        //查询角色是否在 编码=999 的角色下 在的话不做任何过滤
-        List<Long> userIds = PermissionServiceHelper.getUsersByRoleNum("999");
+        //查询角色是否在 编码=S-001 的角色下 在的话不做任何过滤
+        List<Long> userIds = PermissionServiceHelper.getUsersByRoleNum("S-001");
         if(userIds.contains(userId))
             return;
 

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

@@ -0,0 +1,125 @@
+package nckd.jimin.jyyy.hr.tsrsc.plugin.operate;
+
+import com.alibaba.fastjson.JSONObject;
+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.AfterOperationArgs;
+import kd.bos.entity.plugin.args.EndOperationTransactionArgs;
+import kd.bos.exception.KDException;
+import kd.bos.servicehelper.BusinessDataServiceHelper;
+import kd.sdk.plugin.Plugin;
+import nckd.jimin.jyyy.hr.tsrsc.plugin.util.MokaApiUtil;
+import nckd.jimin.jyyy.hr.tsrsc.plugin.workflow.CasRecrApplyMokaWorkFlowPlugin;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * 提交生效插件
+ */
+public class ApplySubmitEffectOpPlugin extends AbstractOperationServicePlugIn implements Plugin {
+
+    @Override
+    public void onPreparePropertys(PreparePropertysEventArgs e) {
+        super.onPreparePropertys(e);
+    }
+
+    @Override
+    public void endOperationTransaction(EndOperationTransactionArgs e) {
+        super.endOperationTransaction(e);
+    }
+
+    @Override
+    public void afterExecuteOperationTransaction(AfterOperationArgs e) {
+        super.afterExecuteOperationTransaction(e);
+        DynamicObject[] bills = e.getDataEntities();
+        for (DynamicObject bill : bills) {
+            // 目标单据
+            DynamicObject dynamicObject = BusinessDataServiceHelper.loadSingle(bill.getPkValue(), bill.getDynamicObjectType().getName());
+            // 申请人数为零
+            if (dynamicObject == null || dynamicObject.getInt("nckd_applynum") <= 0) {
+                throw new KDException("申请人数为零!");
+            }
+            // 错误列表
+            ArrayList<String> errList = new ArrayList<>();
+            // 对外招聘组织 的 对外招聘组织编码(number)
+            Map<String, String> recruitOrgMap = CasRecrApplyMokaWorkFlowPlugin.getRecruitOrgMap();
+
+            DynamicObjectCollection entryEntity = dynamicObject.getDynamicObjectCollection("entryentity");
+            for (DynamicObject entry : entryEntity) {
+                // 招聘人数为零,跳过
+                // 原单编号
+                String billNo = ((DynamicObject) entry.getParent()).getString("billno");
+                // 排序号
+                int seq = entry.getInt("seq");
+
+                // 需求人数
+                String name = ((DynamicObject) entry.getParent()).getDynamicObjectType().getName();
+                int needNumber = 0;
+                try {
+                    needNumber = "nckd_yearcasreplan".equals(name) ? entry.getInt("nckd_approvednum") : entry.getInt("nckd_recruitnum");
+                } catch (NullPointerException e1) {
+                    String msg = String.format("单据编号为【%s】的第%s条数据:%s",
+                            billNo, seq, "需求人数或公司核定人数未填写"
+                    );
+                    errList.add(msg);
+                    continue;
+                }
+
+                if (needNumber > 0) {
+                    // 生产请求json
+                    JSONObject body = CasRecrApplyMokaWorkFlowPlugin.getRequestBody(dynamicObject, entry, needNumber, recruitOrgMap);
+
+                    // 新建 招聘需求
+                    // 招聘类型
+                    String recruitTypeFlag;
+                    switch (entry.getString("nckd_recruittype.number")) {
+                        case "1010_S":
+                            // 校园招聘
+                            recruitTypeFlag = "2";
+                            break;
+                        case "1020_S":
+                            // 社会招聘
+                            recruitTypeFlag = "1";
+                            break;
+                        default:
+                            continue;
+                    }
+
+                    // 发送新建招聘需求请求
+                    JSONObject responseObj = null;
+                    try {
+                        responseObj = MokaApiUtil.addMokaCurrentHire(recruitTypeFlag, body);
+                    } catch (IOException e2) {
+                        throw new RuntimeException(e2);
+                    }
+                    // 记录调用日志
+                    MokaApiUtil.newApiLog(
+                            "nckd_yearcasreplan",
+                            "年度招聘计划",
+                            "ndzp",
+                            MokaApiUtil.getParamValue("moka_url")
+                                    + "/api-platform/v1/headcount"
+                                    + "?currentHireMode=" + recruitTypeFlag,
+                            body.toString(),
+                            responseObj.toString()
+                    );
+
+                    if (responseObj.getInteger("code") != 0) {
+                        String msg = String.format("第%s条数据:%s",
+                                seq, responseObj.getString("msg")
+                        );
+                        errList.add(msg);
+                    }
+                }
+            }
+
+            if (!errList.isEmpty()) {
+                throw new KDException("该年度招聘计划新建Moka招聘需求时,发生以下错误:\r\n" + String.join("\r\n", errList));
+            }
+        }
+    }
+}

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

@@ -4,6 +4,7 @@ import kd.bos.algo.DataSet;
 import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.dataentity.entity.DynamicObjectCollection;
 import kd.bos.db.DBRoute;
+import kd.bos.entity.plugin.support.util.StringUtils;
 import kd.bos.orm.ORM;
 import kd.bos.orm.query.QCP;
 import kd.bos.orm.query.QFilter;
@@ -18,7 +19,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 public class RecUtils {
     private static String appFile_entity = "tspr_appfile";  //应聘档案/候选人
-    private static String arfrsm_entity = "tstpm_arfrsm";   //应聘登记表
+    private static String arfrsm_entity = "tstpm_srscarfmrsm";   //应聘登记表
     private static String casApply_entity = "nckd_casrecrapply";    //临时招聘申请
     private static String yearApply_entity = "nckd_yearapply";    //年度招聘申请
     private static String applyEntry_entity = "entryentity";    //招聘申请分录标识
@@ -68,7 +69,7 @@ public class RecUtils {
     }
 
     /**
-     * 根据候选人管理ID 获取 临时/年度招聘申请分录的招聘部门和岗位
+     * 根据候选人管理ID 获取 临时/年度招聘申请分录的招聘部门、岗位和招聘需求负责人
      * @param appFileId
      * @return
      */
@@ -77,15 +78,19 @@ public class RecUtils {
         DynamicObject appFile = BusinessDataServiceHelper.loadSingle(appFileId, appFile_entity);
         //获取应聘登记表ID
         Long arfRsmId = appFile.getLong("arfrsm.id");
+        arfrsm_entity = "tstpm_srscarfmrsm";
         DynamicObject arfRsm = BusinessDataServiceHelper.loadSingle(arfRsmId, arfrsm_entity);
         String applyEntryId = arfRsm.getString("nckd_mokahcnum");
-        QFilter filter = new QFilter(applyEntry_entity + ".id", QCP.equals, applyEntryId);
-        String selectFields = "entryentity.nckd_recruitorg.id,entryentity.nckd_recruitpost.id";
-        if(QueryServiceHelper.exists(casApply_entity, applyEntryId)) {
-            return QueryServiceHelper.queryOne(casApply_entity, selectFields, new QFilter[]{filter});
+        if(StringUtils.isEmpty(applyEntryId))
+            return null;
+        QFilter filter = new QFilter(applyEntry_entity + ".id", QCP.equals, Long.valueOf(applyEntryId));
+        String selectFields = "nckd_person.id,entryentity.nckd_recruitorg.id,entryentity.nckd_recruitpost.id";
+        QFilter[] filters = new QFilter[]{filter};
+        if(QueryServiceHelper.exists(casApply_entity, filters)) {
+            return QueryServiceHelper.queryOne(casApply_entity, selectFields, filters);
         }
-        else if(QueryServiceHelper.exists(yearApply_entity, applyEntryId)) {
-            return QueryServiceHelper.queryOne(yearApply_entity, selectFields, new QFilter[]{filter});
+        else if(QueryServiceHelper.exists(yearApply_entity, filters)) {
+            return QueryServiceHelper.queryOne(yearApply_entity, selectFields, filters);
         }
         else {
             return null;

+ 13 - 9
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtis/task/SyncPunchCardTask.java

@@ -139,17 +139,21 @@ public class SyncPunchCardTask extends AbstractTask implements Plugin {
             endTime = map.get("endTime").toString();
         }
         //取当天时间00:00:00 - 23:59:59
+        //20250710,改成取前天 00:00:00 - 今天 23:59:59
         else {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            Calendar calendar = Calendar.getInstance();
-            calendar.set(Calendar.HOUR_OF_DAY, 00);
-            calendar.set(Calendar.MINUTE, 00);
-            calendar.set(Calendar.SECOND, 00);
-            startTime = sdf.format(calendar.getTime());
-            calendar.set(Calendar.HOUR_OF_DAY, 23);
-            calendar.set(Calendar.MINUTE, 59);
-            calendar.set(Calendar.SECOND, 59);
-            endTime = sdf.format(calendar.getTime());
+            Calendar startCalendar = Calendar.getInstance();
+            startCalendar.add(Calendar.DAY_OF_MONTH, -2);
+            startCalendar.set(Calendar.HOUR_OF_DAY, 00);
+            startCalendar.set(Calendar.MINUTE, 00);
+            startCalendar.set(Calendar.SECOND, 00);
+            startTime = sdf.format(startCalendar.getTime());
+
+            Calendar endCalendar = Calendar.getInstance();
+            endCalendar.set(Calendar.HOUR_OF_DAY, 23);
+            endCalendar.set(Calendar.MINUTE, 59);
+            endCalendar.set(Calendar.SECOND, 59);
+            endTime = sdf.format(endCalendar.getTime());
         }
     }