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

按轮询方式分配今日线索至用户:寻求更新查询逻辑帮助

线索轮询分配逻辑优化方案

问题背景

我正在开发一套线索管理系统,需要实现将今日线索以**轮询(round-robin)**方式分配给用户的逻辑,目标是为每个用户逐一分配一条线索,确保当日每个用户仅获得一条可用线索。

现有代码如下:

$USERIDs = array("10", "115", "145", "222","237","239","238");

$query = mysqli_query($mysqli, "SELECT Count(*) AS TOTALLEADS, Lead_Id AS SingleLeadsID  FROM leads_crm WHERE Referral_ID IN ('217') AND `Assigned_to` IS NULL AND `Date_Added` >= CURDATE() AND `Date_Added` < CURDATE() + INTERVAL 1 DAY");

while($row=mysqli_fetch_array($query)) {
   $z++;
   $Lead_Id = $row['TOTALLEADS'].'<br>';
   echo $SingleLeadsID = $row['SingleLeadsID'].'<br>';

}

for ($i=0; $i <=$Lead_Id; $i++) {
    if (in_array("10", $USERIDs)) {
        $sql1 = "UPDATE leads_crm Assigned_to='10', Assigned_Date='$noww'  WHERE Lead_Id='" . $Lead_Id . "'";
        $result = mysqli_query($mysqli, $sql1);
    }

    if (in_array("115", $USERIDs)) {
        $sql1 = "UPDATE leads_crm Assigned_to='115', Assigned_Date='$noww'  WHERE Lead_Id='" . $Lead_Id . "'";
        $result = mysqli_query($mysqli, $sql1);
    }
}

目前能获取今日未分配线索数量,但不知道怎么实现轮询分配逻辑,确保每个用户当日只拿一条线索,求修改指导或代码示例。


优化实现方案

原代码的核心问题

  • 同时用COUNT(*)和Lead_Id查询,只会返回一条聚合结果,根本拿不到所有待分配的线索ID
  • 循环逻辑完全错误:拿着线索数量循环,还硬编码用户ID,既实现不了轮询,还会重复更新同一条线索
  • 未定义$noww变量,直接拼接SQL语句存在SQL注入风险

修改后的完整代码

// 待分配用户列表
$USERIDs = array("10", "115", "145", "222", "237", "239", "238");
$userTotal = count($USERIDs);
// 获取当前时间(用于分配时间记录)
$noww = date('Y-m-d H:i:s');

// 1. 查询今日所有未分配的线索ID(去掉COUNT(*),直接取具体线索ID)
$query = mysqli_query($mysqli, "SELECT Lead_Id FROM leads_crm WHERE Referral_ID IN ('217') AND `Assigned_to` IS NULL AND `Date_Added` >= CURDATE() AND `Date_Added` < CURDATE() + INTERVAL 1 DAY");

// 2. 把所有待分配线索ID存入数组
$unassignedLeads = [];
while($row = mysqli_fetch_array($query)) {
    $unassignedLeads[] = $row['Lead_Id'];
}

// 3. 轮询分配:每个用户最多拿1条,直到线索用完或所有用户都分到
$assignedNum = 0;
foreach ($USERIDs as $userId) {
    if (empty($unassignedLeads)) {
        break; // 没线索了,直接停
    }
    // 取出数组里的第一条线索
    $currentLeadId = array_shift($unassignedLeads);

    // 用预处理语句防SQL注入,这步很重要
    $stmt = mysqli_prepare($mysqli, "UPDATE leads_crm SET Assigned_to = ?, Assigned_Date = ? WHERE Lead_Id = ?");
    mysqli_stmt_bind_param($stmt, "ssi", $userId, $noww, $currentLeadId);
    mysqli_stmt_execute($stmt);
    mysqli_stmt_close($stmt);

    $assignedNum++;
}

echo "成功分配 {$assignedNum} 条线索";

核心逻辑说明

  • 正确获取线索:直接查询所有未分配的Lead_Id,存入数组后可以逐个处理
  • 轮询分配:遍历用户列表,每个用户分配一条线索后立刻切换下一个用户,直到线索耗尽或所有用户都拿到,确保每个用户当日最多一条
  • 安全防护:用MySQLi预处理语句绑定参数,彻底避免SQL注入
  • 边界处理:线索用完就提前终止循环,不做无用功

额外建议

  • 如果之后要支持用户当日可分配多条(比如上限3条),可以加一个查询,统计每个用户当日已分配数量,再结合轮询逻辑调整
  • 可以加事务处理:如果分配过程中出错,能回滚所有操作,避免部分分配的混乱情况
  • 加日志记录:把每次分配的用户ID、线索ID、时间存到日志表,方便后续排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 03:53:10