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

同项目任务价格批量选取与求和的替代实现方案咨询

问题分析与解决方案

我仔细看了你的代码,核心问题出在遍历项目下单个任务时,错误地使用了外层分组后的$aRow数据,而不是当前循环的Task本身的数据。这就导致所有任务都复用了第一个Task的task_item_percentage、task_duration等值,自然无法正确计算每个任务的价格并求和。

具体问题点拆解

在这段有问题的代码里:

// =============== the code that doesn't work ============
$calF = get_task_user_hourly_rate($assignees_id[0]); // hourly_rate
$calG = get_task_custom_billable_amount($aRow['id']);
$calE = ($itemtotal+$aRow['task_item_manual_total_price']-$itemtotal);
if(isset($aRow['task_item_percentage'])){
    $calE = ((round($itemtotal + ((($calF * $aRow['task_duration'] / 60)))) *($aRow['task_item_percentage']/100))) +(round($itemtotal + (($calF * $aRow['task_duration'] / 60)))); // additionalPriceTotal
}
$totalCalEArr[] = $calE;
// =============== the code that doesnt work ============
  • $aRow是按项目分组后得到的行数据,仅包含分组聚合信息,不是单个Task的详情
  • 遍历$projectTaskIds时,应该使用当前$projectTaskId对应的Task数据,而非外层的$aRow

修复后的代码实现

我们需要先获取当前Task的完整数据,再基于它计算价格,最后累加求和:

// =============== 修复后的代码 ============
$totalCalEArr = []; // 提前初始化数组,避免重复声明
foreach ($projectTaskIds as $key => $projectTaskId) {
    // 1. 获取当前Task的完整数据
    $currentTask = $this->ci->db->get_where(db_prefix().'tasks', ['id' => $projectTaskId['id']])->row_array();
    
    $calF = get_task_user_hourly_rate($assignees_id[0]); // hourly_rate
    $calG = get_task_custom_billable_amount($currentTask['id']);
    $calE = ($itemtotal + $currentTask['task_item_manual_total_price'] - $itemtotal);
    
    if(isset($currentTask['task_item_percentage'])){
        // 全部替换为当前Task的字段
        $baseAmount = round($itemtotal + (($calF * $currentTask['task_duration'] / 60)));
        $calE = $baseAmount + ($baseAmount * ($currentTask['task_item_percentage']/100));
    }
    
    $totalCalEArr[] = $calE;
}

// 用内置函数简化求和逻辑
$totalsCalEaMount = array_sum($totalCalEArr);
// =============== 修复后的代码 ============

额外优化建议

  1. 减少循环内的数据库查询:可以在初始的data_tables_init查询中,通过关联或子查询预先取出所有Task的必要字段,避免在foreach里重复查询数据库,提升性能。
  2. 变量初始化规范:在循环外提前初始化$totalCalEArr等数组,避免重复声明导致的潜在问题。
  3. 代码可读性优化:把复杂的计算逻辑拆分成单独变量(比如示例中的$baseAmount),让代码更容易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:57:42