在更新生产状态和更新生产数量时,我们遇到了严重的滞后问题。我们正在使用JQUERY AJAX post方法来完成这项工作。当我们在“AppController.php”文件中注释掉“recalculateProduction()”函数以更新状态和更新数量时,事情会巧妙地运行并且速度很快。
用户体验 该应用程序从服务器上的制表符分隔文件中获取成品食品的订单,然后根据配方数据确定生产产品所需的原材料数量。系统的特定部分是滞后的,管理员可以手动调整客户订单的数量。因此,例如,管理员可能决定将意大利面沙拉的订单数量从50磅减少到40磅。然后,应用程序会因数量变化而重新计算所有必需的原材料。目前,当单个数量发生变化时,重新计算所有内容需要花费两分钟时间。
函数“recalculateProduction()”包含大量计算,更新不同数据库表的记录以及从不同表中删除记录。
public function recalculateProduction($production_id, $action_performed_by){
$this->loadModel(‘Production’);
$this->loadModel(‘ProductionItem’);
$this->loadModel(‘ProductionOrder’);
$this->loadModel(‘ProductionRecipe’);
$this->loadModel(‘ProductionIngredient’);
$this->loadModel(‘ProductionRawMaterial’);
$this->loadModel(‘ProductionOrderProductionRecipe’);
$this->loadModel(‘ProductionOrderProductionIngredient’);
$this->loadModel(‘ProductionOrderProductionRawMaterial’);
$production = $this->Production->read(null, $production_id);
$this->ProductionItem->updateAll(array('order_case_qty'=>0, 'quantity_lbs'=>0, 'production_case_qty'=>0), array('ProductionItem.production_id'=>$production_id));
$this->ProductionRecipe->updateAll(array('qty_lbs'=>0, 'batch_qty_lbs'=>0, 'batches'=>0, 'batch_size'=>0, 'actual_lbs'=>0, 'percent_yield'=>0), array('ProductionRecipe.production_id'=>$production_id));
$this->ProductionIngredient->updateAll(array('qty_lbs'=>0), array('ProductionIngredient.production_id'=>$production_id));
$this->ProductionRawMaterial->updateAll(array('qty_lbs'=>0), array('ProductionRawMaterial.production_id'=>$production_id));
$this->ProductionOrderProductionRecipe->deleteAll(array('ProductionOrderProductionRecipe.production_order_id IN (SELECT id FROM imrp_production_order ProductionOrder WHERE ProductionOrder.production_id='.$production_id.')'));
$this->ProductionOrderProductionIngredient->deleteAll(array('ProductionOrderProductionIngredient.production_order_id IN (SELECT id FROM imrp_production_order ProductionOrder WHERE ProductionOrder.production_id='.$production_id.')'));
$this->ProductionOrderProductionRawMaterial->deleteAll(array('ProductionOrderProductionRawMaterial.production_order_id IN (SELECT id FROM imrp_production_order ProductionOrder WHERE ProductionOrder.production_id='.$production_id.')'));
$this->ProductionOrder->recursive = 0;
$production_orders = $this->ProductionOrder->find('all', array('conditions'=>array('ProductionOrder.status IN (0, 1)', 'ProductionOrder.production_id'=>$production_id)));
if(count($production_orders)>0){
foreach($production_orders as $production_order){
$this->processOrderDetails($production_id, $production_order['ProductionOrder']['item_id'], $production_order['ProductionOrder']['id'], $production['Production']['production_date'], $production_order['ProductionOrder']['quantity_lbs'], $production_order['ProductionOrder']['quantity_cases'], $action_performed_by);
}
}
$this->ProductionItem->deleteAll(array('ProductionItem.production_id'=>$production_id, 'ProductionItem.order_case_qty'=>0.00, 'ProductionItem.quantity_lbs'=>0.00, 'ProductionItem.production_case_qty'=>0.00));
$this->ProductionRecipe->deleteAll(array('ProductionRecipe.production_id'=>$production_id, 'ProductionRecipe.qty_lbs'=>0.00, 'ProductionRecipe.batch_qty_lbs'=>0.00000, 'ProductionRecipe.batches'=>0.00000, 'ProductionRecipe.batch_size'=>0, 'ProductionRecipe.actual_lbs'=>0.00, 'ProductionRecipe.percent_yield'=>0.000));
$this->ProductionIngredient->deleteAll(array('ProductionIngredient.production_id'=>$production_id, 'ProductionIngredient.qty_lbs'=>0.00));
$this->ProductionRawMaterial->deleteAll(array('ProductionRawMaterial.production_id'=>$production_id, 'ProductionRawMaterial.qty_lbs'=>0.00));
$this->processProductionRecipes($production_id, $action_performed_by);
}
我可以调查使用存储过程,但我希望能够挽救我已经完成的工作。我的想法是因为PHP框架在单个查询中查询所有关系数据。要停止提取关系数据,我们应用了“recursive = 0”,但尚未解决问题。有什么建议吗?
注意:我们只处理几百条记录。最多,一旦投入生产,我们最多可能处理数千条记录。我们使用的是PHP版本:5.6.35和CakePHP版本:2.5.7。
感谢。