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

1.新增工作流插件,根据岗位获取一级/二级部门负责人
2.出差核算二开插件优化,存在月中入职/离职的人员取不到排班,去除该情况

Tyx 2 hete
szülő
commit
bbe4a7f62e

+ 62 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/plugin/workflow/GetFirstDeptChargerByPosWorkflowPlugin.java

@@ -0,0 +1,62 @@
+package nckd.jimin.jyyy.hr.plugin.workflow;
+
+import kd.bos.exception.KDBizException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.servicehelper.DispatchServiceHelper;
+import kd.bos.workflow.api.AgentExecution;
+import kd.bos.workflow.engine.extitf.IWorkflowPlugin;
+import kd.hrmp.hrpi.business.domian.service.impl.PersonRoleServiceImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用工作流插件 Tyx 2025-07-01
+ * 通过岗位获取一级部门负责人
+ */
+public class GetFirstDeptChargerByPosWorkflowPlugin implements IWorkflowPlugin {
+    private static final Log log = LogFactory.getLog(GetFirstDeptChargerByPosWorkflowPlugin.class);
+    @Override
+    public List<Long> calcUserIds(AgentExecution execution) {
+        List<Long> approvers = execution.getCurrentApprover();
+        log.info(" before 获取流程变量 positionId ");
+        //如果变量选的是分录的岗位,则变量取出来是List
+        Long positionId = 0L;
+        //表头
+        if(execution.getVariable("positionId") == null) {
+            throw new KDBizException("未设置流程变量positionId");
+        }
+        Object var = execution.getVariable("positionId");
+        if(var instanceof List) {
+            List<Long> positionList = (List) var;
+            positionId = positionList.get(0);
+        }
+        else {
+            positionId = Long.valueOf(var.toString());
+        }
+        log.info(" 获取流程变量 positionId : {} ", positionId);
+        //获取岗位对应部门ID
+        Long adminOrgId = HRWorkflowUtils.getAdminOrgIdByPositionId(positionId);
+        log.info(" positionId 对应部门Id : {}", adminOrgId);
+        //获取一级部门
+        Long firstDeptId = HRWorkflowUtils.getFirstDeptId(adminOrgId);
+        log.info(" 一级部门ID : {}", firstDeptId);
+        //获取一级部门负责人
+        List deptIds = new ArrayList();
+        deptIds.add(firstDeptId);
+        List mainChargeInfos = PersonRoleServiceImpl.getInstance().getMainChargeByOrg(deptIds);
+        List chargerIds = new ArrayList();
+        for(Object obj : mainChargeInfos) {
+            Map map = (Map) obj;
+            String charger = map.get("person").toString();
+            log.info(" 计算出参与人personId : {}", charger);
+            chargerIds.add(Long.valueOf(charger));
+        }
+        //personId转换userId
+        List chargerUserId = HRWorkflowUtils.transPersonIdToUserId(chargerIds);
+        approvers.addAll(chargerUserId);
+        return approvers;
+    }
+}

+ 61 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/plugin/workflow/GetSecondDeptChargerByPosWorkflowPlugin.java

@@ -0,0 +1,61 @@
+package nckd.jimin.jyyy.hr.plugin.workflow;
+
+import kd.bos.exception.KDBizException;
+import kd.bos.logging.Log;
+import kd.bos.logging.LogFactory;
+import kd.bos.workflow.api.AgentExecution;
+import kd.bos.workflow.engine.extitf.IWorkflowPlugin;
+import kd.hrmp.hrpi.business.domian.service.impl.PersonRoleServiceImpl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用工作流插件 Tyx 2025-07-01
+ * 通过岗位获取一级部门负责人
+ */
+public class GetSecondDeptChargerByPosWorkflowPlugin implements IWorkflowPlugin {
+    private static final Log log = LogFactory.getLog(GetSecondDeptChargerByPosWorkflowPlugin.class);
+    @Override
+    public List<Long> calcUserIds(AgentExecution execution) {
+        List<Long> approvers = execution.getCurrentApprover();
+        log.info(" before 获取流程变量 positionId ");
+        //如果变量选的是分录的岗位,则变量取出来是List
+        Long positionId = 0L;
+        //表头
+        if(execution.getVariable("positionId") == null) {
+            throw new KDBizException("未设置流程变量positionId");
+        }
+        Object var = execution.getVariable("positionId");
+        if(var instanceof List) {
+            List<Long> positionList = (List) var;
+            positionId = positionList.get(0);
+        }
+        else {
+            positionId = Long.valueOf(var.toString());
+        }
+        log.info(" 获取流程变量 positionId : {} ", positionId);
+        //获取岗位对应部门ID
+        Long adminOrgId = HRWorkflowUtils.getAdminOrgIdByPositionId(positionId);
+        log.info(" positionId 对应部门Id : {}", adminOrgId);
+        //获取一级部门
+        Long firstDeptId = HRWorkflowUtils.getFirstDeptId(adminOrgId);
+        log.info(" 二级部门ID : {}", firstDeptId);
+        //获取一级部门负责人
+        List deptIds = new ArrayList();
+        deptIds.add(firstDeptId);
+        List mainChargeInfos = PersonRoleServiceImpl.getInstance().getMainChargeByOrg(deptIds);
+        List chargerIds = new ArrayList();
+        for(Object obj : mainChargeInfos) {
+            Map map = (Map) obj;
+            String charger = map.get("person").toString();
+            log.info(" 计算出参与人personId : {}", charger);
+            chargerIds.add(Long.valueOf(charger));
+        }
+        //personId转换userId
+        List chargerUserId = HRWorkflowUtils.transPersonIdToUserId(chargerIds);
+        approvers.addAll(chargerUserId);
+        return approvers;
+    }
+}

+ 10 - 0
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/plugin/workflow/HRWorkflowUtils.java

@@ -57,6 +57,16 @@ public class HRWorkflowUtils {
         return adminOrgId;
     }
 
+    /**
+     * 根据岗位获取行政组织ID
+     * @param positionId
+     * @return
+     */
+    public static Long getAdminOrgIdByPositionId(Long positionId) {
+        DynamicObject position = BusinessDataServiceHelper.loadSingle(positionId, "hbpm_positionhr");
+        return position.getLong("adminorg.id");
+    }
+
 
     public static List<Long> transPersonIdToUserId(List<Long> personIds) {
         log.info(" HRWorkflowUtils transPersonIdToUserId {}", personIds);

+ 32 - 5
code/jyyy/nckd-jimin-jyyy-hr/src/main/java/nckd/jimin/jyyy/hr/wtc/wtam/explugin/TvlBillTimeBucketSplitExtPluginEx.java

@@ -1,6 +1,8 @@
 package nckd.jimin.jyyy.hr.wtc.wtam.explugin;
 
 import com.google.common.collect.Lists;
+
+import java.lang.reflect.Field;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.chrono.ChronoLocalDate;
@@ -15,6 +17,7 @@ import kd.sdk.wtc.wtes.business.tie.model.roster.RosterExt;
 import kd.sdk.wtc.wtes.business.tie.model.roster.ShiftSpecExt;
 import kd.sdk.wtc.wtes.business.tie.model.roster.ShiftTableSingleExt;
 import kd.sdk.wtc.wtes.business.tie.model.timebucket.AttBillTimeBucketExt;
+import kd.wtc.wtes.business.ext.model.roster.RosterExtImpl;
 import org.apache.curator.shaded.com.google.common.collect.Sets;
 /**
  * Description      :出差核算时长计算扩展,处理跨天逻辑,去除休息时长
@@ -45,14 +48,18 @@ public class TvlBillTimeBucketSplitExtPluginEx implements TvlBillTimeBucketSplit
                 LocalDate date = LocalDate.of(2025,6, 1);
                 while (shiftstartDate.compareTo((ChronoLocalDate)shiftendDate) <= 0) {
                     //正式环境 加个判断 需要大于6-1
-                    if(shiftstartDate.compareTo(date) < 0) {
-                        log.info("shiftstartDate : " + shiftstartDate);
-                        shiftstartDate = shiftstartDate.plusDays(1L);
-                        continue;
-                    }
+//                    if(shiftstartDate.compareTo(date) < 0) {
+//                        log.info("shiftstartDate : " + shiftstartDate);
+//                        shiftstartDate = shiftstartDate.plusDays(1L);
+//                        continue;
+//                    }
                     LocalDateTime shiftStart = this.getshiftStartDateTime(shiftstartDate, shiftTableSingleExt);
                     LocalDateTime shiftEnd = this.getshiftEndDateTime(shiftstartDate, shiftTableSingleExt);
                     LocalDateTime shiftStartNext = this.getshiftStartDateTime(shiftstartDate.plusDays(1L), shiftTableSingleExt);
+                    if(shiftStart == null || shiftEnd == null || shiftStartNext == null) {
+                        shiftstartDate = shiftstartDate.plusDays(1L);
+                        continue;
+                    }
                     LocalDateTime start = (startDate.compareTo((ChronoLocalDateTime<?>)shiftStart) > 0) ? startDate : shiftStart;
                     LocalDateTime end = (endDate.compareTo((ChronoLocalDateTime<?>)shiftStartNext) < 0) ? endDate : shiftEnd;
                     if (start.compareTo((ChronoLocalDateTime<?>)end) < 0) {
@@ -71,6 +78,9 @@ public class TvlBillTimeBucketSplitExtPluginEx implements TvlBillTimeBucketSplit
 
     private LocalDateTime getshiftStartDateTime(final LocalDate localDate, final ShiftTableSingleExt shiftTableSingleExt) {
         final RosterExt rosterExt = shiftTableSingleExt.getRoster(localDate);
+        if(isRosterNull(rosterExt)){
+            return null;
+        }
         final ShiftSpecExt shiftSpecExt = rosterExt.getShiftSpec();
         if (shiftSpecExt.isOffNonPlan()) {
             return this.getshiftStartDateTimeNoPlan(localDate, shiftTableSingleExt);
@@ -93,6 +103,20 @@ public class TvlBillTimeBucketSplitExtPluginEx implements TvlBillTimeBucketSplit
         return shiftStart;
     }
 
+    public static boolean isRosterNull(RosterExt rosterExt) {
+        try {
+            // 获取私有字段
+            Field rosterField = rosterExt.getClass().getDeclaredField("roster");
+            // 设置可访问性(突破private限制)
+            rosterField.setAccessible(true);
+            // 获取字段值并判断
+            return rosterField.get(rosterExt) == null;
+        } catch (NoSuchFieldException | IllegalAccessException e) {
+            e.printStackTrace();
+            return true;
+        }
+    }
+
     private LocalDateTime getshiftStartDateTimeHasPlan(final LocalDate localDate, final ShiftTableSingleExt shiftTableSingleExt) {
         final RosterExt rosterExt = shiftTableSingleExt.getRoster(localDate);
         final ShiftSpecExt shiftSpecExt = rosterExt.getShiftSpec();
@@ -114,6 +138,9 @@ public class TvlBillTimeBucketSplitExtPluginEx implements TvlBillTimeBucketSplit
 
     private LocalDateTime getshiftEndDateTime(final LocalDate localDate, final ShiftTableSingleExt shiftTableSingleExt) {
         final RosterExt rosterExt = shiftTableSingleExt.getRoster(localDate);
+        if(isRosterNull(rosterExt)){
+            return null;
+        }
         final ShiftSpecExt shiftSpecExt = rosterExt.getShiftSpec();
         LocalDateTime shiftEnd = localDate.plusDays(1L).atStartOfDay();
         if (shiftSpecExt.isOffNonPlan()) {