同项目任务价格批量选取与求和的替代实现方案咨询
问题分析与解决方案
我仔细看了你的代码,核心问题出在遍历项目下单个任务时,错误地使用了外层分组后的$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); // =============== 修复后的代码 ============
额外优化建议
- 减少循环内的数据库查询:可以在初始的
data_tables_init查询中,通过关联或子查询预先取出所有Task的必要字段,避免在foreach里重复查询数据库,提升性能。 - 变量初始化规范:在循环外提前初始化
$totalCalEArr等数组,避免重复声明导致的潜在问题。 - 代码可读性优化:把复杂的计算逻辑拆分成单独变量(比如示例中的
$baseAmount),让代码更容易维护。
内容的提问来源于stack exchange,提问作者rkmitza17
相关产品推荐
相关产品推荐

