3步解决Grocy食谱编辑功能异常:从数据关联到前端渲染全流程修复

3步解决Grocy食谱编辑功能异常:从数据关联到前端渲染全流程修复

【免费下载链接】grocy ERP beyond your fridge - Grocy is a web-based self-hosted groceries & household management solution for your home 【免费下载链接】grocy 项目地址: https://gitcode.com/GitHub_Trending/gr/grocy

你是否在使用Grocy管理家庭食谱时遇到编辑功能失效?食材无法保存、嵌套食谱计算错误、成本统计异常等问题不仅影响使用体验,更可能导致购物清单混乱。本文将通过分析RecipesController与RecipesService核心代码,揭示3类常见异常的技术根源,并提供可直接操作的修复方案。

异常表现与影响范围

Grocy食谱编辑功能异常主要表现为三类症状:

  • 数据保存失败:新增/修改食材后刷新页面丢失
  • 嵌套食谱计算错误:子食谱用量未正确累加到主食谱
  • 成本统计异常:总成本显示为0或与实际不符

这些问题主要涉及controllers/RecipesController.php的表单处理逻辑和services/RecipesService.php的数据计算服务。

异常1:食材保存失败的事务处理修复

技术根源:RecipePosEditForm方法未实现数据库事务,导致并发保存时出现数据冲突。

在RecipesController.php的RecipePosEditForm函数中,需添加事务处理确保数据一致性:

public function RecipePosEditForm(Request $request, Response $response, array $args)
{
    $this->getDatabaseService()->GetDbConnectionRaw()->beginTransaction();
    try {
        // 现有表单处理逻辑...
        
        $this->getDatabaseService()->GetDbConnectionRaw()->commit();
        return $this->renderPage($response, 'recipeposform', $viewData);
    } catch (\Exception $ex) {
        $this->getDatabaseService()->GetDbConnectionRaw()->rollback();
        throw $ex;
    }
}

验证方法:编辑食谱添加多种食材后,连续快速点击保存按钮,检查数据库recipes_pos表是否完整记录所有条目。

异常2:嵌套食谱计算错误的递归查询修复

技术根源:RecipesService.php的GetRecipesResolved方法未递归计算子食谱用量,导致多层嵌套时食材总量计算错误。

修改RecipesService.php的GetRecipesPosResolved函数,添加递归解析逻辑:

private function ResolveNestedRecipes($recipeId, &$allPositions = [])
{
    $positions = $this->getDatabase()->recipes_pos()->where('recipe_id', $recipeId)->fetchAll();
    foreach ($positions as $pos) {
        if ($this->IsRecipe($pos->product_id)) { // 检查是否为嵌套食谱
            $this->ResolveNestedRecipes($pos->product_id, $allPositions);
        } else {
            $allPositions[] = $pos;
        }
    }
    return $allPositions;
}

验证方法:创建包含子食谱的多层嵌套食谱,通过services/RecipesService.php的GetRecipesPosResolved方法验证食材总量是否正确累加。

异常3:成本统计异常的数据关联修复

技术根源:RecipesService.php的GetRecipesResolved方法未正确关联products表的价格数据,导致成本计算为空。

修复RecipesService.php的成本计算逻辑:

public function GetRecipesResolved($customWhere = null)
{
    $sql = "SELECT r.*, SUM(p.price * rp.amount) as total_cost 
            FROM recipes r
            LEFT JOIN recipes_pos rp ON r.id = rp.recipe_id
            LEFT JOIN products p ON rp.product_id = p.id
            " . ($customWhere ? "WHERE $customWhere" : "") . "
            GROUP BY r.id";
    return $this->getDataBaseService()->ExecuteDbQuery($sql)->fetchAll(\PDO::FETCH_OBJ);
}

验证方法:在食谱编辑页面添加带价格的食材后,检查controllers/RecipesController.php的Overview方法返回的selectedRecipeTotalCosts是否正确计算。

预防措施与最佳实践

  1. 定期数据校验:使用以下SQL查询检查食谱数据完整性:
-- 查找缺少食材的食谱
SELECT r.id, r.name FROM recipes r
LEFT JOIN recipes_pos rp ON r.id = rp.recipe_id
WHERE rp.id IS NULL AND r.type = 'normal';
  1. 代码维护建议
  • 为RecipesController添加请求参数验证
  • 对RecipesService实现单元测试,覆盖嵌套食谱场景
  • 监控recipes_resolved视图的计算性能
  1. 官方资源参考

通过以上步骤,可彻底解决Grocy食谱编辑功能的常见异常。这些修复方案已在v4.5.0版本中部分实现,建议通过官方更新脚本update.sh保持系统最新。

【免费下载链接】grocy ERP beyond your fridge - Grocy is a web-based self-hosted groceries & household management solution for your home 【免费下载链接】grocy 项目地址: https://gitcode.com/GitHub_Trending/gr/grocy

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值