Преглед изворни кода

1.休假相关代码优化
2.休假预警:提醒长假结束人员及时销假
3.新增自动取消兼岗调度

Tyx пре 4 дана
родитељ
комит
0a816e4875

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

@@ -0,0 +1,93 @@
+package nckd.jimin.jyyy.hr.hrmp.hbpm.opplugin.web.position;
+
+import kd.bos.algo.DataSet;
+import kd.bos.algo.Row;
+import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
+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;
+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.*;
+import java.util.stream.Collectors;
+
+/**
+ * 自动取消兼岗调度插件
+ * Tyx 2025-05-06
+ * 查询 同时存在主职和兼职的岗位,取消该岗位的所有兼职,需排除长假场景(长假员工的基本信息中的员工状态为长假,但实际主职岗位不发生变化,这种场景视作该岗位上没有主职
+ */
+public class AutoEndPartTimeTask extends AbstractTask implements Plugin {
+    private static final Log log = LogFactory.getLog(AutoEndPartTimeTask.class);
+    private static String ermanFile_entity = "hspm_ermanfile";
+
+    @Override
+    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
+        log.info(" -------- 自动取消兼岗开始 -------- ");
+        StringBuilder sb = new StringBuilder();
+        sb.append(" /*dialect*/ select a.fpositionid,max(a.fisprimary) maxp,min(a.fisprimary) minp \n");
+        sb.append(" from t_hrpi_empposorgrel a \n");
+        sb.append(" left join t_hrpi_pernontsprop b on a.fpersonid = b.fpersonid and b.fiscurrentversion = '1' \n");
+        sb.append(" left join t_hbss_laborrelstatus c on c.fid = b.fk_nckd_ygzt \n");
+        sb.append(" where a.fiscurrentversion = '1' \n");
+        sb.append("   and a.fbusinessstatus = '1' \n");
+        sb.append("   and (c.fnumber <> '9010_S' or c.fnumber is null) \n");
+        sb.append(" group by a.fpositionid");
+        log.info(" -------- sql : " +sb.toString()+ " -------- ");
+        DataSet dataSet = DB.queryDataSet(this.getClass().getName(), DBRoute.of("hr"), sb.toString());
+
+        List<Long> positionIds = new ArrayList<Long>();
+        while(dataSet.hasNext()) {
+            Row rowData = dataSet.next();
+            //取同时有兼职和主职的岗位
+            if(rowData.getInteger("maxp") == 1 && rowData.getInteger("minp") == 0) {
+                positionIds.add(rowData.getLong("fpositionid"));
+            }
+        }
+
+        //取出岗位下所有兼职
+        if(positionIds.size() > 0) {
+            //获取档案
+            DynamicObject[] ermanFiles = VaApplyBillUtil.getErmanFilesByPosition(positionIds);
+            //转成List<Long>
+            List<Long> ermanFileIds = Arrays.stream(ermanFiles).map(dyx -> dyx.getLong("id")).collect(Collectors.toList());
+            //调用标准方法获取ermanFile
+            List<Map<String, Object>> erManFiles = PersonExternalService.getInstance().invokeGetCardFields(ermanFileIds);
+            //actionId 默认201100_S
+            QFilter filter = new QFilter("number", "=", "201100_S");
+            DynamicObject action = BusinessDataServiceHelper.loadSingle("hpfs_chgaction",new QFilter[]{filter});
+            Date partEndDate = new Date();
+            //调用标准终止兼职方法
+            log.info(" -------- begin 调用标品终止兼职方法 --------");
+            ParttimeServiceHelper.batchEndParttime(action.getLong("id"), partEndDate, erManFiles);
+            log.info(" -------- after 调用标品终止兼职方法 --------");
+        }
+
+    }
+
+    /**
+     * 组装查询兼职档案的过滤条件
+     * @param positionIds
+     * @return
+     */
+    public QFilter getQFilter(List<Long> positionIds) {
+        QFilter filter = new QFilter("depemp.iscurrentversion", QCP.equals, "1");
+        filter.and("depemp.businessstatus", QCP.equals, "1");
+        filter.and("depemp.postype.number",QCP.equals, "1020_S");
+        filter.and("depemp.position", QCP.in, positionIds);
+        filter.and("iscurrentversion", QCP.equals, "1");
+        filter.and("businessstatus", QCP.equals, "1");
+        return filter;
+    }
+}

+ 46 - 2
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtabm/opplugin/web/vaapply/VaApplyAlertTask.java

@@ -1,12 +1,23 @@
 package nckd.jimin.jyyy.hr.wtc.wtabm.opplugin.web.vaapply;
 
 import kd.bos.context.RequestContext;
+import kd.bos.dataentity.entity.DynamicObject;
 import kd.bos.exception.KDException;
 import kd.bos.logging.Log;
 import kd.bos.logging.LogFactory;
+import kd.bos.message.api.MessageChannels;
+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.bos.servicehelper.workflow.MessageCenterServiceHelper;
+import kd.bos.workflow.engine.msg.info.MessageInfo;
+import kd.hr.hbp.business.servicehelper.HRBaseServiceHelper;
 import kd.sdk.plugin.Plugin;
 
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -17,11 +28,44 @@ import java.util.Map;
 public class VaApplyAlertTask extends AbstractTask implements Plugin {
 
     private static final Log log = LogFactory.getLog(VaApplyAlertTask.class);
-
+    private static String apply_entity = "wtabm_vaapply";
     @Override
     public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
 
+        log.info("-------- 开始执行未销假休假单定时提醒 --------");
+        String selectFields = "personid.number,billno,startdate,enddate,nckd_isupdateperson,nckd_islongleave,entryentity.entryvacationtype";
+        HRBaseServiceHelper helper = HRBaseServiceHelper.create(apply_entity);
+        QFilter filter = new QFilter("nckd_islongleave", QCP.equals, true);
+        filter.and("nckd_iscancelleave", QCP.equals, false);
+        filter.and("auditstatus", QCP.equals, "C");
+        filter.and("enddate", QCP.large_equals, new Date());
+        DynamicObject[] bills = BusinessDataServiceHelper.load(apply_entity, selectFields, new QFilter[]{filter});
+        log.info("-------- 查询出符合条件的休假单条数:" + bills.length + " --------");
+        for (DynamicObject bill : bills) {
+            //提醒person对应的user
+            String personNo = bill.getString("personid.number");
+            String billNo = bill.getString("billno");
+            DynamicObject user = VaApplyBillUtil.getUserByPersonNo(personNo);
+            //发送消息
+            sendMessage(user, billNo);
+        }
+    }
 
-
+    /**
+     * 发送消息给指定用户
+     * @param user userDyn
+     * @param billNo 休假单单据编号
+     */
+    public void sendMessage (DynamicObject user, String billNo) {
+        MessageInfo msgInfo = new MessageInfo();
+        List<Long> userList = new ArrayList();
+        userList.add(user.getLong("id"));
+        msgInfo.setUserIds(userList);
+        msgInfo.setNotifyType(MessageChannels.MC.getNumber());
+        msgInfo.setType(MessageInfo.TYPE_MESSAGE);
+        msgInfo.setContent("您有待销假的休假申请,单据号:" + billNo);
+        //msgInfo.setContentUrl(); TODO 界面链接
+        msgInfo.setTitle("销假提醒");
+        Long msgId = MessageCenterServiceHelper.sendMessage(msgInfo);
     }
 }

+ 1 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtabm/opplugin/web/vaapply/VaApplyBillOpEx.java

@@ -25,6 +25,7 @@ public class VaApplyBillOpEx extends AbstractOperationServicePlugIn implements P
             Date startDate = bill.getDate("startdate");
             Date endDate = bill.getDate("enddate");
             //判断两个日期是不是相差30天
+            //2025-05-06 判断是否哺乳假 是的话不算长假
             long dateDiff = Math.abs(endDate.getTime() - startDate.getTime());
             long day = dateDiff / ( 1000 * 60 * 60 * 24);
             log.info(" -------- 相差天数:" + day + " -------- ");

+ 10 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtabm/opplugin/web/vaapply/VaApplyBillUtil.java

@@ -100,7 +100,6 @@ public class VaApplyBillUtil {
 
     /**
      * 获取职位上的兼职档案
-     *
      * @param positionIds
      * @return
      */
@@ -116,5 +115,15 @@ public class VaApplyBillUtil {
         return ermanFiles;
     }
 
+    /**
+     * 根据HR人员工号获取平台人员Dyn
+     * @param personNo
+     * @return
+     */
+    public static DynamicObject getUserByPersonNo (String personNo) {
+        QFilter filter = new QFilter("number", QCP.equals, personNo);
+        return QueryServiceHelper.queryOne("bos_user", "id", new QFilter[]{filter});
+    }
+
 
 }

+ 7 - 1
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtabm/opplugin/web/vaapply/VaChangeBillAuditOp.java

@@ -26,6 +26,7 @@ import java.util.stream.Collectors;
 public class VaChangeBillAuditOp extends AbstractOperationServicePlugIn implements Plugin {
 
     private static String vaUpdate_entity = "wtabm_vaupdate";
+    private static String vaApply_entity = "wtabm_vaapply";
 
     private static final Log log = LogFactory.getLog(VaChangeBillAuditOp.class);
 
@@ -34,6 +35,7 @@ public class VaChangeBillAuditOp extends AbstractOperationServicePlugIn implemen
         super.onPreparePropertys(e);
         e.getFieldKeys().add("nckd_islongleave");
         e.getFieldKeys().add("nckd_iscancelleave");
+        e.getFieldKeys().add("parentid");
     }
 
     @Override
@@ -65,7 +67,11 @@ public class VaChangeBillAuditOp extends AbstractOperationServicePlugIn implemen
             String typeNumber = VaApplyBillUtil.getLaborStatusNumber(personId);
             if(!StringUtils.isBlank(typeNumber)) {
                 VaApplyBillUtil.updatePersonType(typeNumber, personId);
-                bill.set("nckd_iscancelleave",true);
+                //反写源单是否已销假为是
+                Long parentId = bill.getLong("parentid");
+                DynamicObject parentBill = BusinessDataServiceHelper.loadSingle(parentId, vaApply_entity);
+                parentBill.set("nckd_iscancelleave",true);
+                SaveServiceHelper.save(new DynamicObject[]{parentBill});
             }
 
             DynamicObject position = VaApplyBillUtil.getPersonPrimaryPosition(personId);