文章目录[隐藏]
WordPress柔性供应链中的智能补货算法开发教程
引言:柔性供应链与智能补货的重要性
在当今快速变化的电商环境中,WordPress作为全球最流行的内容管理系统,承载着大量电子商务网站。柔性供应链管理成为企业保持竞争力的关键,而智能补货算法则是柔性供应链的核心组成部分。本文将详细介绍如何在WordPress环境中开发一个智能补货算法,帮助电商企业实现库存优化、减少缺货损失并降低库存成本。
系统架构设计
环境准备与数据模型
首先,我们需要在WordPress中建立合适的数据结构来支持智能补货算法。以下是一个完整的数据表创建代码示例:
/**
* 创建智能补货所需的数据表
* 这段代码应该放在插件激活钩子中执行
*/
function create_smart_replenishment_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'smart_inventory';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
product_id bigint(20) NOT NULL,
sku varchar(100) NOT NULL,
current_stock int(11) DEFAULT 0,
safety_stock int(11) DEFAULT 10,
lead_time_days int(11) DEFAULT 7,
daily_demand_avg decimal(10,2) DEFAULT 0.00,
daily_demand_std decimal(10,2) DEFAULT 0.00,
reorder_point decimal(10,2) DEFAULT 0.00,
order_quantity decimal(10,2) DEFAULT 0.00,
last_calculated datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY product_id (product_id),
KEY sku (sku)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
// 创建销售历史表
$sales_table = $wpdb->prefix . 'sales_history';
$sales_sql = "CREATE TABLE IF NOT EXISTS $sales_table (
id mediumint(9) NOT NULL AUTO_INCREMENT,
product_id bigint(20) NOT NULL,
order_id bigint(20) NOT NULL,
quantity int(11) NOT NULL,
sale_date datetime NOT NULL,
price decimal(10,2) NOT NULL,
PRIMARY KEY (id),
KEY product_id (product_id),
KEY sale_date (sale_date)
) $charset_collate;";
dbDelta($sales_sql);
}
register_activation_hook(__FILE__, 'create_smart_replenishment_tables');
需求预测算法实现
移动平均法实现
需求预测是智能补货的基础。以下是基于移动平均法的需求预测实现:
/**
* 计算产品的移动平均需求
* @param int $product_id 产品ID
* @param int $period_days 计算周期(天)
* @return array 包含平均需求和标准差的结果
*/
function calculate_moving_average_demand($product_id, $period_days = 30) {
global $wpdb;
$sales_table = $wpdb->prefix . 'sales_history';
// 获取最近period_days天的销售数据
$query = $wpdb->prepare(
"SELECT
DATE(sale_date) as sale_day,
SUM(quantity) as daily_quantity
FROM $sales_table
WHERE product_id = %d
AND sale_date >= DATE_SUB(NOW(), INTERVAL %d DAY)
GROUP BY DATE(sale_date)
ORDER BY sale_date DESC",
$product_id,
$period_days
);
$daily_sales = $wpdb->get_results($query);
if (empty($daily_sales)) {
return array('avg' => 0, 'std' => 0);
}
// 计算日销售量的总和
$total_quantity = 0;
$daily_quantities = array();
foreach ($daily_sales as $sale) {
$total_quantity += $sale->daily_quantity;
$daily_quantities[] = $sale->daily_quantity;
}
// 计算平均值
$average_demand = $total_quantity / count($daily_sales);
// 计算标准差
$variance_sum = 0;
foreach ($daily_quantities as $quantity) {
$variance_sum += pow($quantity - $average_demand, 2);
}
$standard_deviation = sqrt($variance_sum / count($daily_quantities));
return array(
'avg' => round($average_demand, 2),
'std' => round($standard_deviation, 2)
);
}
智能补货点计算
安全库存与再订货点算法
基于需求预测,我们可以计算安全库存和再订货点:
/**
* 计算安全库存和再订货点
* @param float $avg_demand 平均日需求
* @param float $std_demand 需求标准差
* @param int $lead_time 交货期(天)
* @param float $service_level 服务水平(如0.95表示95%的服务水平)
* @return array 包含安全库存和再订货点的数组
*/
function calculate_reorder_point($avg_demand, $std_demand, $lead_time, $service_level = 0.95) {
// 服务水平因子(Z值),对应不同的服务水平
$z_values = array(
0.80 => 0.84,
0.85 => 1.04,
0.90 => 1.28,
0.95 => 1.65,
0.99 => 2.33
);
// 获取Z值,如果未找到则使用默认值
$z_value = isset($z_values[$service_level]) ? $z_values[$service_level] : 1.65;
// 计算安全库存:Z * σ * √(交货期)
$safety_stock = $z_value * $std_demand * sqrt($lead_time);
// 计算再订货点:(平均需求 * 交货期) + 安全库存
$reorder_point = ($avg_demand * $lead_time) + $safety_stock;
return array(
'safety_stock' => ceil($safety_stock),
'reorder_point' => ceil($reorder_point)
);
}
/**
* 计算经济订货批量(EOQ)
* @param float $annual_demand 年需求量
* @param float $ordering_cost 每次订货成本
* @param float $holding_cost 单位持有成本
* @return float 经济订货批量
*/
function calculate_eoq($annual_demand, $ordering_cost, $holding_cost) {
if ($holding_cost <= 0) {
return 0;
}
// EOQ公式:√((2 * 年需求 * 订货成本) / 持有成本)
$eoq = sqrt((2 * $annual_demand * $ordering_cost) / $holding_cost);
return ceil($eoq);
}
集成WordPress库存管理系统
自动补货检查与通知
将智能算法集成到WordPress的库存管理系统中:
/**
* 检查库存并触发补货建议
* 此函数可以设置为WordPress定时任务
*/
function check_and_suggest_replenishment() {
global $wpdb;
$inventory_table = $wpdb->prefix . 'smart_inventory';
$products_table = $wpdb->prefix . 'posts';
$postmeta_table = $wpdb->prefix . 'postmeta';
// 获取所有需要监控的产品
$query = "
SELECT
i.*,
p.post_title as product_name,
pm.meta_value as woocommerce_stock
FROM $inventory_table i
LEFT JOIN $products_table p ON i.product_id = p.ID
LEFT JOIN $postmeta_table pm ON i.product_id = pm.post_id AND pm.meta_key = '_stock'
WHERE p.post_type = 'product' AND p.post_status = 'publish'
";
$products = $wpdb->get_results($query);
$replenishment_suggestions = array();
foreach ($products as $product) {
$current_stock = intval($product->woocommerce_stock);
// 如果当前库存低于再订货点,则生成补货建议
if ($current_stock <= $product->reorder_point) {
// 计算建议订货量
$suggested_quantity = max(
$product->order_quantity,
$product->reorder_point + $product->safety_stock - $current_stock
);
$replenishment_suggestions[] = array(
'product_id' => $product->product_id,
'product_name' => $product->product_name,
'sku' => $product->sku,
'current_stock' => $current_stock,
'reorder_point' => $product->reorder_point,
'suggested_quantity' => $suggested_quantity,
'urgency' => $current_stock < $product->safety_stock ? 'high' : 'medium'
);
// 更新库存记录
$wpdb->update(
$inventory_table,
array('current_stock' => $current_stock),
array('id' => $product->id)
);
}
}
// 如果有补货建议,发送通知
if (!empty($replenishment_suggestions)) {
send_replenishment_notification($replenishment_suggestions);
}
return $replenishment_suggestions;
}
/**
* 发送补货通知
* @param array $suggestions 补货建议数组
*/
function send_replenishment_notification($suggestions) {
$to = get_option('admin_email');
$subject = '智能补货系统提醒:以下产品需要补货';
$message = "<h2>补货建议报告</h2>";
$message .= "<p>生成时间:" . date('Y-m-d H:i:s') . "</p>";
$message .= "<table border='1' cellpadding='10'>";
$message .= "<tr>
<th>产品名称</th>
<th>SKU</th>
<th>当前库存</th>
<th>再订货点</th>
<th>建议补货量</th>
<th>紧急程度</th>
</tr>";
foreach ($suggestions as $suggestion) {
$urgency_color = $suggestion['urgency'] == 'high' ? 'red' : 'orange';
$message .= "<tr>
<td>{$suggestion['product_name']}</td>
<td>{$suggestion['sku']}</td>
<td>{$suggestion['current_stock']}</td>
<td>{$suggestion['reorder_point']}</td>
<td>{$suggestion['suggested_quantity']}</td>
<td style='color:{$urgency_color};font-weight:bold;'>{$suggestion['urgency']}</td>
</tr>";
}
$message .= "</table>";
// 设置邮件头
$headers = array('Content-Type: text/html; charset=UTF-8');
// 发送邮件
wp_mail($to, $subject, $message, $headers);
// 同时记录到WordPress日志
error_log('智能补货系统:已发送' . count($suggestions) . '条补货建议');
}
管理界面开发
WordPress后台管理页面
创建一个用户友好的管理界面来展示补货建议和算法配置:
/**
* 添加智能补货管理菜单
*/
function add_smart_replenishment_menu() {
add_menu_page(
'智能补货系统',
'智能补货',
'manage_options',
'smart-replenishment',
'display_smart_replenishment_page',
'dashicons-chart-area',
56
);
add_submenu_page(
'smart-replenishment',
'补货建议',
'补货建议',
'manage_options',
'smart-replenishment-suggestions',
'display_replenishment_suggestions'
);
add_submenu_page(
'smart-replenishment',
'算法配置',
'算法配置',
'manage_options',
'smart-replenishment-settings',
'display_algorithm_settings'
);
}
add_action('admin_menu', 'add_smart_replenishment_menu');
/**
* 显示补货建议页面
*/
function display_replenishment_suggestions() {
// 检查权限
if (!current_user_can('manage_options')) {
wp_die('您没有访问此页面的权限。');
}
// 获取补货建议
$suggestions = check_and_suggest_replenishment();
echo '<div class="wrap">';
echo '<h1>智能补货建议</h1>';
if (empty($suggestions)) {
echo '<div class="notice notice-success"><p>当前没有需要补货的产品。所有产品库存充足!</p></div>';
} else {
echo '<table class="wp-list-table widefat fixed striped">';
echo '<thead>
<tr>
<th>产品名称</th>
<th>SKU</th>
<th>当前库存</th>
<th>安全库存</th>
<th>建议补货量</th>
<th>操作</th>
</tr>
</thead>';
echo '<tbody>';
foreach ($suggestions as $suggestion) {
$product_edit_url = get_edit_post_link($suggestion['product_id']);
echo '<tr>';
echo '<td><a href="' . esc_url($product_edit_url) . '">' . esc_html($suggestion['product_name']) . '</a></td>';
echo '<td>' . esc_html($suggestion['sku']) . '</td>';
echo '<td>' . esc_html($suggestion['current_stock']) . '</td>';
echo '<td>' . esc_html($suggestion['reorder_point']) . '</td>';
echo '<td>' . esc_html($suggestion['suggested_quantity']) . '</td>';
echo '<td>
<a href="' . esc_url($product_edit_url) . '" class="button button-small">管理库存</a>
</td>';
echo '</tr>';
}
echo '</tbody>';
echo '</table>';
// 导出功能
echo '<br><a href="' . admin_url('admin-post.php?action=export_replenishment_suggestions') . '" class="button button-primary">导出补货建议为CSV</a>';
}
echo '</div>';
}
部署与优化建议
系统集成与性能优化
-
定时任务设置:使用WordPress的Cron系统定期运行补货检查
// 设置每日补货检查 if (!wp_next_scheduled('daily_smart_replenishment_check')) { wp_schedule_event(time(), 'daily', 'daily_smart_replenishment_check'); } add_action('daily_smart_replenishment_check', 'check_and_suggest_replenishment'); -
缓存策略:对计算结果进行缓存,减少数据库查询
/** * 获取带缓存的需求预测数据 */ function get_cached_demand_forecast($product_id) { $cache_key = 'demand_forecast_' . $product_id; $cached_data = wp_cache_get($cache_key, 'smart_replenishment'); if (false === $cached_data) { $cached_data = calculate_moving_average_demand($product_id); wp_cache_set($cache_key, $cached_data, 'smart_replenishment', 3600); // 缓存1小时 } return $cached_data; } - 机器学习集成:考虑集成简单的机器学习模型进行需求预测
/**
* 使用线性回归预测未来需求(简化版)
*/
function predict_future_demand_regression($product_id, $future_days = 7) {
global $wpdb;
$sales_table = $wpdb->prefix . 'sales_history';
// 获取历史销售数据
$query = $wpdb->prepare(
"SELECT
DATEDIFF(NOW(), sale_date) as days_ago,
SUM(quantity) as total_quantity
FROM $sales_table
WHERE product_id = %d
AND sale_date >= DATE_SUB(NOW(), INTERVAL 90 DAY)
GROUP BY DATE(sale_date)
ORDER BY sale_date",
$product_id
);
$historical_data = $wpdb->get_results($query);
if (count($historical_data) < 14) {
return null; // 数据不足
}
// 简化的线性回归计算
// 在实际应用中,可以考虑使用PHP-ML等库
$n = count($historical_data);
$sum_x = 0; $sum_y = 0; $sum_xy = 0; $sum_x2 = 0;
foreach ($historical_data as $i => $data) {
$x = $i; // 时间序列索引
$y = $data->total_quantity;
$sum_x += $x;
$sum_y += $y;
$sum_xy += $x * $y;
$sum_x2 += $x * $x;
}
// 计算斜率和截距
$slope = ($n * $sum_xy - $sum_x * $sum_y) / ($n * $sum_x2 - $sum_x * $sum_x);
$intercept = ($sum_y - $slope * $sum_x) / $n;
// 预测未来需求
$future_demand = array();
future_days; $i++) {
$future_index = $n + $i;
$predicted = $slope * $future_index + $intercept;
$future_demand[] = max(0, round($predicted, 2)); // 确保非负
}
return $future_demand;
}
## 算法调优与参数配置
### 自适应参数调整机制
智能补货算法需要根据实际运营数据不断优化参数:
/**
- 自适应算法参数调整
- 根据历史预测准确度调整安全库存系数
*/
function adaptive_parameter_adjustment($product_id) {
global $wpdb;
$inventory_table = $wpdb->prefix . 'smart_inventory';
$sales_table = $wpdb->prefix . 'sales_history';
// 获取最近30天的预测与实际数据
$query = $wpdb->prepare(
"SELECT
DATE(sale_date) as sale_date,
SUM(quantity) as actual_demand,
(SELECT daily_demand_avg FROM $inventory_table WHERE product_id = %d) as predicted_demand
FROM $sales_table
WHERE product_id = %d
AND sale_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)
GROUP BY DATE(sale_date)",
$product_id,
$product_id
);
$daily_data = $wpdb->get_results($query);
if (count($daily_data) < 7) {
return false; // 数据不足
}
// 计算预测误差
$total_error = 0;
$error_count = 0;
foreach ($daily_data as $day) {
if ($day->predicted_demand > 0) {
$error = abs($day->actual_demand - $day->predicted_demand) / $day->predicted_demand;
$total_error += $error;
$error_count++;
}
}
if ($error_count == 0) {
return false;
}
$mean_absolute_percentage_error = ($total_error / $error_count) * 100;
// 根据误差调整安全库存系数
$current_safety_factor = get_post_meta($product_id, '_safety_stock_factor', true);
$current_safety_factor = $current_safety_factor ? floatval($current_safety_factor) : 1.65;
// 误差大于20%时增加安全系数,小于5%时减少安全系数
if ($mean_absolute_percentage_error > 20) {
$new_factor = min(2.5, $current_safety_factor * 1.1); // 最大不超过2.5
} elseif ($mean_absolute_percentage_error < 5) {
$new_factor = max(1.0, $current_safety_factor * 0.95); // 最小不低于1.0
} else {
$new_factor = $current_safety_factor;
}
// 更新安全库存系数
update_post_meta($product_id, '_safety_stock_factor', $new_factor);
// 重新计算安全库存
$demand_data = calculate_moving_average_demand($product_id);
$lead_time = get_post_meta($product_id, '_lead_time_days', true) ?: 7;
$reorder_data = calculate_reorder_point(
$demand_data['avg'],
$demand_data['std'],
$lead_time,
$new_factor / 1.65 // 转换为服务水平
);
// 更新库存记录
$wpdb->update(
$inventory_table,
array(
'safety_stock' => $reorder_data['safety_stock'],
'reorder_point' => $reorder_data['reorder_point'],
'last_calculated' => current_time('mysql')
),
array('product_id' => $product_id)
);
return array(
'mape' => round($mean_absolute_percentage_error, 2),
'old_factor' => round($current_safety_factor, 2),
'new_factor' => round($new_factor, 2)
);
}
## 实时监控与预警系统
### 库存健康度监控
/**
- 库存健康度评分系统
- 评估每个产品的库存状况
*/
function calculate_inventory_health_score($product_id) {
global $wpdb;
$inventory_table = $wpdb->prefix . 'smart_inventory';
// 获取库存数据
$query = $wpdb->prepare(
"SELECT * FROM $inventory_table WHERE product_id = %d",
$product_id
);
$inventory_data = $wpdb->get_row($query);
if (!$inventory_data) {
return null;
}
$current_stock = intval(get_post_meta($product_id, '_stock', true));
$reorder_point = floatval($inventory_data->reorder_point);
$safety_stock = floatval($inventory_data->safety_stock);
// 计算各项指标
$score = 100; // 初始分数
// 1. 库存覆盖天数评分
if ($inventory_data->daily_demand_avg > 0) {
$cover_days = $current_stock / $inventory_data->daily_demand_avg;
if ($cover_days < 3) {
$score -= 30; // 库存严重不足
} elseif ($cover_days < 7) {
$score -= 15; // 库存不足
} elseif ($cover_days > 90) {
$score -= 20; // 库存积压
} elseif ($cover_days > 60) {
$score -= 10; // 库存偏高
}
}
// 2. 相对于再订货点的评分
if ($current_stock <= $safety_stock) {
$score -= 40; // 低于安全库存,紧急
} elseif ($current_stock <= $reorder_point) {
$score -= 20; // 低于再订货点,需要补货
}
// 3. 需求波动性评分
$cv = ($inventory_data->daily_demand_avg > 0) ?
($inventory_data->daily_demand_std / $inventory_data->daily_demand_avg) * 100 : 0;
if ($cv > 100) {
$score -= 15; // 需求波动极大
} elseif ($cv > 50) {
$score -= 8; // 需求波动较大
}
// 确保分数在0-100之间
$score = max(0, min(100, $score));
// 确定健康等级
if ($score >= 80) {
$level = 'excellent';
$color = '#4CAF50';
} elseif ($score >= 60) {
$level = 'good';
$color = '#8BC34A';
} elseif ($score >= 40) {
$level = 'fair';
$color = '#FFC107';
} elseif ($score >= 20) {
$level = 'poor';
$color = '#FF9800';
} else {
$level = 'critical';
$color = '#F44336';
}
return array(
'score' => round($score),
'level' => $level,
'color' => $color,
'cover_days' => isset($cover_days) ? round($cover_days, 1) : 0,
'current_stock' => $current_stock,
'reorder_point' => $reorder_point
);
}
/**
- 生成库存健康度报告
*/
function generate_inventory_health_report() {
global $wpdb;
$inventory_table = $wpdb->prefix . 'smart_inventory';
$products_table = $wpdb->prefix . 'posts';
$query = "
SELECT i.product_id, p.post_title
FROM $inventory_table i
JOIN $products_table p ON i.product_id = p.ID
WHERE p.post_type = 'product' AND p.post_status = 'publish'
ORDER BY i.last_calculated DESC
LIMIT 50
";
$products = $wpdb->get_results($query);
$report = array(
'excellent' => 0,
'good' => 0,
'fair' => 0,
'poor' => 0,
'critical' => 0,
'products' => array()
);
foreach ($products as $product) {
$health = calculate_inventory_health_score($product->product_id);
if ($health) {
$report[$health['level']]++;
$report['products'][] = array(
'id' => $product->product_id,
'name' => $product->post_title,
'health' => $health
);
}
}
return $report;
}
## 供应商协同与自动化采购
### 供应商API集成
/**
- 供应商API集成类
- 支持多个供应商的自动采购
*/
class SupplierAPIIntegration {
private $supplier_configs;
public function __construct() {
$this->supplier_configs = get_option('smart_replenishment_suppliers', array());
}
/**
* 创建采购订单
*/
public function create_purchase_order($items, $supplier_id) {
if (!isset($this->supplier_configs[$supplier_id])) {
return new WP_Error('invalid_supplier', '供应商配置不存在');
}
$supplier = $this->supplier_configs[$supplier_id];
// 根据供应商类型调用不同的API
switch ($supplier['type']) {
case 'api_rest':
return $this->call_rest_api($supplier, $items);
case 'email':
return $this->send_email_order($supplier, $items);
case 'webhook':
return $this->send_webhook_order($supplier, $items);
default:
return new WP_Error('unsupported_type', '不支持的供应商类型');
}
}
/**
* 调用REST API创建订单
*/
private function call_rest_api($supplier, $items) {
$api_url = $supplier['api_url'] . '/purchase-orders';
$order_data = array(
'order_id' => 'WP-' . time() . '-' . rand(1000, 9999),
'items' => array(),
'shipping_address' => get_option('woocommerce_store_address'),
'contact_email' => get_option('admin_email'),
'notes' => '自动补货订单 - ' . date('Y-m-d H:i:s')
);
foreach ($items as $item) {
$order_data['items'][] = array(
'sku' => $item['sku'],
'quantity' => $item['quantity'],
'unit_price' => $item['unit_price'] ?? 0
);
}
$args = array(
'headers' => array(
'Content-Type' => 'application/json',
'Authorization' => 'Bearer ' . $supplier['api_key']
),
'body' => json_encode($order_data),
'timeout' => 30
);
$response = wp_remote_post($api_url, $args);
if (is_wp_error($response)) {
return $response;
}
$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);
// 记录采购订单
$this->log_purchase_order($order_data['order_id'], $items, $supplier, $data);
return $data;
}
/**
* 记录采购订单到数据库
*/
private function log_purchase_order($order_id, $items, $supplier, $response) {
global $wpdb;
$table_name = $wpdb->prefix . 'purchase_orders';
$wpdb->insert(
$table_name,
array(
'order_id' => $order_id,
'supplier_id' => $supplier['id'],
'supplier_name' => $supplier['name'],
'items' => json_encode($items),
'response' => json_encode($response),
'status' => isset($response['status']) ? $response['status'] : 'pending',
'created_at' => current_time('mysql')
),
array('%s', '%s', '%s', '%s', '%s', '%s', '%s')
);
return $wpdb->insert_id;
}
/**
* 自动处理补货建议并创建采购订单
*/
public function auto_process_replenishment($urgency_filter = 'all') {
$suggestions = check_and_suggest_replenishment();
if (empty($suggestions)) {
return array('success' => false, 'message' => '没有需要补货的产品');
}
// 按供应商分组
$supplier_items = array();
foreach ($suggestions as $suggestion) {
// 获取产品的供应商信息
$supplier_id = get_post_meta($suggestion['product_id'], '_main_supplier', true);
if (!$supplier_id || $suggestion['urgency'] == 'low') {
continue; // 跳过没有供应商或紧急度低的产品
}
// 应用紧急度过滤
if ($urgency_filter != 'all') {
if ($urgency_filter == 'high' && $suggestion['urgency'] != 'high') {
continue;
}
if ($urgency_filter == 'medium' && $suggestion['urgency'] == 'low') {
continue;
}
}
if (!isset($supplier_items[$supplier_id])) {
$supplier_items[$supplier_id] = array();
}
$supplier_items[$supplier_id][] = array(
'product_id' => $suggestion['product_id'],
'sku' => $suggestion['sku'],
'quantity' => $suggestion['suggested_quantity'],
'product_name' => $suggestion['product_name']
);
}
// 为每个供应商创建采购订单
$results = array();
foreach ($supplier_items as $supplier_id => $items) {
if (count($items) > 0) {
$result = $this->create_purchase_order($items, $supplier_id);
$results[$supplier_id] = $result;
// 更新产品状态
foreach ($items as $item) {
update_post_meta(
$item['product_id'],
'_last_replenishment_order',
array(
'date' => current_time('mysql'),
'quantity' => $item['quantity'],
'supplier' => $supplier_id
)
);
}
}
}
return array(
'success' => true,
'processed_suppliers' => count($results),
'results' => $results
);
}
}
## 性能监控与报表系统
### 算法性能追踪
/**
- 追踪算法性能指标
*/
class AlgorithmPerformanceTracker {
private static $instance = null;
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
/**
* 记录预测准确度
*/
public function log_prediction_accuracy($product_id, $predicted, $actual, $period = 'daily') {
global $wpdb;
$table_name = $wpdb->prefix . 'algorithm_performance';
$error = $actual > 0 ? abs($predicted - $actual) / $actual * 100 : 0;
$wpdb->insert(
$table_name,
array(
'product_id' => $product_id,
'period' => $period,
'predicted_value' => $predicted,
'actual_value' => $actual,
'error_percentage' => $error,
'logged_at' => current_time('mysql')
)
);
}
/**
* 生成性能报告
*/
public function generate_performance_report($start_date, $end_date) {
global $wpdb;
$table_name = $wpdb->prefix . 'algorithm_performance';
$products_table = $wpdb->prefix . 'posts';
$query = $wpdb->prepare(
"SELECT
p.ID as product_id,
p.post_title as product_name,
COUNT(*) as total_predictions,
AVG(ap.error_percentage) as avg_error,
MIN(ap.error_percentage) as min_error,
MAX(ap.error_percentage) as max_error,
STDDEV(ap.error_percentage) as std_error
FROM $table_name ap
JOIN $products_table p ON ap.product_id = p.ID
WHERE ap.logged_at BETWEEN %s AND %s
GROUP BY ap.product_id
ORDER BY avg_error DESC",
$start_date,
$end_date
);
$performance_data = $wpdb->get_results($query);
// 计算总体统计
$overall_stats = array(
'total_products' => count($performance_data),
'avg_error_all' => 0,
'best_performing' => null,
'worst_performing' => null
);
$total_error = 0;
$count = 0;
foreach ($performance_data as $data) {
$total_error += $data->avg_error;
$count++;
if (!$overall_stats['best_performing'] ||
$data->avg_error < $overall_stats['best_performing']->avg_error) {
$overall_stats['best_performing'] = $data;
}
if (!$overall_stats['worst_performing'] ||
$data->avg_error > $overall_stats['worst_per
