You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

基于条件的考勤表格校验实现及临时外出/返回功能新增需求

针对你校园考勤系统要新增临时外出(break-in)和临时返回(break-out)功能的需求,结合你现有的PHP逻辑,我整理了一套可行的实现方案:

实现方案概述

核心思路是通过新增记录类型区分正常进出和临时操作,同时保证临时操作不干扰原有正常进出的计数逻辑,最终实现两种类型的标记独立展示。

1. 数据存储层调整

首先需要在你的考勤记录表中新增一个字段,用来标记每条记录的类型,比如命名为record_type

  • 字段类型:枚举(ENUM)或字符串类型
  • 可选值:normal(正常进出)、break_in(临时外出)、break_out(临时返回)

这个字段是区分两种操作的基础,后续前端录入时需要让用户选择本次操作的类型,后端将对应值存入数据库。

2. 前端交互补充

在人员打卡/登记的页面,新增操作类型选择控件(比如下拉框或单选按钮):

  • 默认选中「正常进出」
  • 提供「临时外出」「临时返回」选项供用户选择
  • 提交表单时将选中的类型值传给后端

3. PHP逻辑修改

基于你现有的代码,我们需要加入记录类型的判断逻辑,同时确保临时操作不影响正常进出的计数。以下是调整后的完整代码示例:

// 初始化计数变量,放在循环外部
$count = 0;
// 遍历考勤记录数组
foreach ($arr as $i => $record) {
    $in = '';
    $out = '';
    $breakIn = ''; // 临时外出标记
    $breakOut = ''; // 临时返回标记
    $currentRecordTime = $record[0];
    $recordType = $record[1]; // 假设数组第二个元素是记录类型,根据你的实际结构调整
    
    // 先处理正常进出逻辑
    if ($i == 0) {
        if ($recordType == 'normal') {
            $in = '✔';
        }
    } else {
        $currentDate = date('Y-m-d', strtotime($currentRecordTime));
        $prevRecordTime = $arr[$i-1][0];
        $prevDate = date('Y-m-d', strtotime($prevRecordTime));
        
        // 仅当当前记录是正常类型时,才更新计数和标记
        if ($recordType == 'normal') {
            if ($currentDate == $prevDate) {
                $count++;
                if ($count % 2 == 0) {
                    $in = '✔';
                } else {
                    $out = '✔';
                }
            } else {
                $count = 0;
                $in = '✔';
            }
        }
    }
    
    // 处理临时操作标记
    if ($recordType == 'break_in') {
        $breakIn = '✔';
    } elseif ($recordType == 'break_out') {
        $breakOut = '✔';
    }
    
    // 这里可以输出或保存标记结果,比如:
    // echo "日期: {$currentDate} | 正常进: {$in} | 正常出: {$out} | 临时外出: {$breakIn} | 临时返回: {$breakOut}<br>";
}

关键注意点

  • 临时操作不干扰正常计数:只有normal类型的记录才会更新$count变量,临时外出/返回操作不会改变正常进出的状态序列。
  • 日期判断优化:用date('Y-m-d', strtotime(...))替代substr截取,避免因时间格式变化导致的判断错误,兼容性更强。
  • 标记独立展示:新增的breakInbreakOut标记可以在页面上单独列出来,和正常进出标记区分开,方便查看。

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

火山引擎 最新活动