ES5(BIRT环境)连续工作日计数逻辑异常求助
修复BIRT中员工连续10天打卡判断逻辑
核心问题分析
你的代码存在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
相关产品推荐
相关产品推荐

