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

CodeIgniter中按年龄优先级更新队列序号(no_antrian)逻辑排查求助

队列表队列号调整逻辑问题排查与修复

原代码核心问题分析

  • 仅查询单条数据导致逻辑完全失效:原代码使用$this->db->limit(1),仅获取队列中的第一条数据,后续循环只能处理这一条,无法遍历所有需要调整的患者,这是数据无变化的核心原因。
  • 嵌套循环逻辑混乱:在第一个foreach内重复遍历同一个查询结果,内层循环的条件与外层逻辑无关联,无法正确定位需要后移队列号的患者。
  • SQL语句语法错误:手动拼接的UPDATE语句存在严重语法问题,例如把PHP逻辑运算符直接混入SQL条件,导致语句无效,执行后无任何更新。
  • 队列号计算逻辑错误:$noAntrian的初始化和递增逻辑完全偏离需求,无法正确计算新患者的插入位置。

修正后的实现代码

// 1. 查询当前科室、当天所有已排队患者,按年龄降序+队列号升序排序(年龄大的排前)
$this->db->where('id_poli', $id_poli);
$this->db->where('tanggal', $tanggal);
$this->db->order_by('umur', 'DESC');
$this->db->order_by('no_antrian', 'ASC');
$query = $this->db->get('booking');

$noAntrian = 1;
// 2. 计算新患者的队列号:统计年龄大于当前患者的人数+1
foreach ($query->result_array() as $row) {
    if ($row['umur'] > $usia) {
        $noAntrian++;
    } else {
        // 遇到年龄小于等于的患者,停止统计,后续队列都需要后移
        break;
    }
}

// 3. 批量更新:将所有队列号>=新队列号的患者,队列号+1(后移)
if ($noAntrian <= $query->num_rows()) {
    $this->db->set('no_antrian', 'no_antrian + 1', FALSE);
    $this->db->where('id_poli', $id_poli);
    $this->db->where('tanggal', $tanggal);
    $this->db->where('no_antrian >=', $noAntrian);
    $this->db->update('booking');
}

return $noAntrian;

修正说明

  • 移除limit(1),获取全部相关患者数据,确保能遍历整个队列。
  • 调整排序规则,按年龄降序排列,正确定位新患者的插入位置。
  • 使用CodeIgniter Active Record构建UPDATE语句,避免手动拼接SQL的语法错误,同时通过set方法的第三个参数FALSE实现直接执行no_antrian + 1的数值运算。
  • 逻辑简化:先计算插入位置,再批量更新需要后移的队列号,相比循环单条更新效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 05:15:38