You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ES5(BIRT环境)连续工作日计数逻辑异常求助

修复BIRT中员工连续10天打卡判断逻辑

核心问题分析

你的代码存在3个关键错误,导致连续打卡判断失效:

  1. 日期转换函数返回字符串格式,无法进行数值比较和排序
  2. 判断连续打卡时,未包含当前打卡记录
  3. Fetch标签中存在字段赋值错误

错误1:日期转换逻辑错误

getDayFromDateAndTime返回日/月格式的字符串(如"14/5"),导致:

  • 排序时dayA - dayB得到NaN,数组无法正确按日期排序
  • 连续天数判断时shiftDay === previousDay +1永远不成立(字符串和数字无法匹配)

修复方案:将日期转换为当年的第几天(数值类型),确保能正确比较连续性:

function getDayOfYear(datetimeString) {
  logger.warning("Received date-time string: " + datetimeString);

  if (!datetimeString || typeof datetimeString == "undefined") {
    logger.warning("Invalid day format: " + datetimeString);
    return null;
  }

  // 转换为日期对象
  var dateObj = BirtDateTime.toDate(datetimeString);
  // 计算当年第几天(1-366)
  var startOfYear = BirtDateTime.set(dateObj, 1, 1, BirtDateTime.year(dateObj));
  var dayOfYear = Math.floor((dateObj.getTime() - startOfYear.getTime()) / (1000 * 60 * 60 * 24)) + 1;
  
  return dayOfYear;
}

错误2:连续打卡判断时机错误

当前代码先调用getConsecutiveShifts,再把当前打卡记录push到数组中,导致每次判断时都缺少最新的打卡数据。

修复方案:先将当前条目push到数组,再调用判断函数:

var items = {
  EmployeeId: row["PEOPLE_PERSON_NUMBER_1"],
  EmployeeFullName: row["EMP_COMMON_FULL_NAME_1"],
  EmployeeHireDate: row["PEOPLE_HIRE_DATE_1"],
  EmployeeGender: row["PEOPLE_CUSTOM_3"],
  EmployeePermanentTemporary: row["PEOPLE_CUSTOM_2"],
  EmployeeReportsTo: row["PEOPLE_MANAGER_NAME_1"],
  EmployeeJobTitle: row["PEOPLE_CUSTOM_1"],
  EmployeeCerts: row["SCH_PEOPLE_CERTIFICATION_NAMES_FULL_DETAILS_1"],
  EmployeeStartDate: row["TKSHIFT_ACTUAL_START_DATETIME_ROUNDED_1"],
  EmployeeEndDate: row["TKSHIFT_ACTUAL_END_DATETIME_ROUNDED_1"],
};

// 先push当前记录到数组
ConsecutiveShifts.push(items);
// 再判断连续打卡
items.EmployeeConsecutiveShifts = getConsecutiveShifts(ConsecutiveShifts);

错误3:Fetch标签字段赋值错误

Employee End Date & Time被错误赋值为布尔值items.EmployeeConsecutiveShifts,应该改为items.EmployeeEndDate:

// 修复后代码
row["Employee End Date & Time"] = items.EmployeeEndDate;
row["Mail Triggered On"] = items.EmployeeConsecutiveShifts;

完整修改后的getConsecutiveShifts函数

function getConsecutiveShifts(ConsecutiveShifts) {
  if (ConsecutiveShifts.length === 0) {
    logger.warning("ConsecutiveShifts array is empty. Exiting function.");
    return false;
  }

  // 按当年第几天排序
  ConsecutiveShifts.sort(function (a, b) {
    var dayA = getDayOfYear(a.EmployeeStartDate);
    var dayB = getDayOfYear(b.EmployeeStartDate);
    logger.warning("Sorting shift days: " + dayA + ", " + dayB);
    // 数值排序,确保顺序正确
    return dayA - dayB;
  });

  var consecutiveCount = 1; // 初始为1,因为至少有当天的记录
  var previousDay = getDayOfYear(ConsecutiveShifts[0].EmployeeStartDate);

  for (var i = 1; i < ConsecutiveShifts.length; i++) { // 从第2条开始遍历
    var shiftDay = getDayOfYear(ConsecutiveShifts[i].EmployeeStartDate);

    if (shiftDay === null) {
      logger.warning("Null shift day encountered. Skipping shift.");
      continue;
    }

    // 判断是否连续:当天 = 前一天 +1
    if (shiftDay === previousDay + 1) {
      consecutiveCount++;
    } else if (shiftDay === previousDay) {
      // 同一天多次打卡,不增加连续天数
      continue;
    } else {
      // 中断连续,重置计数
      consecutiveCount = 1;
    }

    logger.warning(
      "Shift Day: " + shiftDay + ", Consecutive Count: " + consecutiveCount
    );

    if (consecutiveCount >= 10) {
      logger.warning("Found 10 consecutive shifts!");
      return true;
    }

    previousDay = shiftDay;
  }

  logger.warning("Did not find 10 consecutive shifts.");
  return false;
}

补充说明

  • 新增了同一天多次打卡不重复计数的逻辑,避免同一员工当天多次打卡导致连续天数误判
  • 使用当年第几天的数值比较,自动处理跨月的连续日期(比如3月31日到4月1日,会被识别为连续)

内容的提问来源于stack exchange,提问作者Jacquelyn Bloomfield

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 02:09:50