WordPress小批量定制插件实现智能采购决策的教程
概述
在当今电子商务快速发展的时代,智能采购决策对于小型企业和个人卖家来说至关重要。本教程将指导您如何创建一个WordPress插件,帮助用户根据销售数据、库存情况和市场趋势做出更明智的采购决策。这个插件特别适合处理小批量采购场景,通过数据分析提供采购建议。
插件功能设计
我们的智能采购决策插件将包含以下核心功能:
- 销售数据分析 - 跟踪产品销售趋势
- 库存监控 - 实时监控库存水平
- 采购建议算法 - 基于数据提供采购建议
- 可视化报告 - 以图表形式展示数据
- 供应商管理 - 管理供应商信息和采购历史
插件基础结构
首先,我们创建插件的基本文件结构:
smart-purchase-decision/
├── smart-purchase-decision.php
├── includes/
│ ├── class-data-analyzer.php
│ ├── class-inventory-manager.php
│ └── class-purchase-advisor.php
├── admin/
│ ├── admin-page.php
│ └── js/
│ └── admin-scripts.js
├── assets/
│ ├── css/
│ │ └── admin-styles.css
│ └── js/
│ └── chart-loader.js
└── templates/
└── dashboard-template.php
主插件文件
<?php
/**
* Plugin Name: 智能采购决策助手
* Plugin URI: https://yourwebsite.com/smart-purchase-decision
* Description: 为WordPress网站提供智能采购决策支持,特别适合小批量采购场景
* Version: 1.0.0
* Author: 您的名称
* License: GPL v2 or later
* Text Domain: smart-purchase-decision
*/
// 防止直接访问
if (!defined('ABSPATH')) {
exit;
}
// 定义插件常量
define('SPD_VERSION', '1.0.0');
define('SPD_PLUGIN_DIR', plugin_dir_path(__FILE__));
define('SPD_PLUGIN_URL', plugin_dir_url(__FILE__));
// 自动加载类文件
spl_autoload_register(function ($class) {
$prefix = 'SPD_';
$base_dir = SPD_PLUGIN_DIR . 'includes/';
$len = strlen($prefix);
if (strncmp($prefix, $class, $len) !== 0) {
return;
}
$relative_class = substr($class, $len);
$file = $base_dir . 'class-' . str_replace('_', '-', strtolower($relative_class)) . '.php';
if (file_exists($file)) {
require $file;
}
});
// 初始化插件
class Smart_Purchase_Decision {
private static $instance = null;
public static function get_instance() {
if (null === self::$instance) {
self::$instance = new self();
}
return self::$instance;
}
private function __construct() {
$this->init_hooks();
}
private function init_hooks() {
// 激活和停用钩子
register_activation_hook(__FILE__, array($this, 'activate'));
register_deactivation_hook(__FILE__, array($this, 'deactivate'));
// 初始化
add_action('plugins_loaded', array($this, 'init'));
// 管理界面
if (is_admin()) {
require_once SPD_PLUGIN_DIR . 'admin/admin-page.php';
new SPD_Admin_Page();
}
}
public function activate() {
// 创建必要的数据库表
$this->create_tables();
// 设置默认选项
add_option('spd_purchase_threshold', 10);
add_option('spd_forecast_days', 30);
add_option('spd_safety_stock', 5);
// 记录插件激活
error_log('智能采购决策插件已激活');
}
public function deactivate() {
// 清理临时数据
delete_transient('spd_daily_sales_cache');
// 记录插件停用
error_log('智能采购决策插件已停用');
}
private function create_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
$table_name = $wpdb->prefix . 'spd_purchase_history';
$sql = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
product_id mediumint(9) NOT NULL,
purchase_date datetime DEFAULT CURRENT_TIMESTAMP NOT NULL,
quantity int NOT NULL,
unit_price decimal(10,2) NOT NULL,
supplier varchar(255),
notes text,
PRIMARY KEY (id),
KEY product_id (product_id),
KEY purchase_date (purchase_date)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($sql);
}
public function init() {
// 加载文本域
load_plugin_textdomain('smart-purchase-decision', false, dirname(plugin_basename(__FILE__)) . '/languages');
// 初始化核心类
$this->data_analyzer = new SPD_Data_Analyzer();
$this->inventory_manager = new SPD_Inventory_Manager();
$this->purchase_advisor = new SPD_Purchase_Advisor();
}
}
// 启动插件
Smart_Purchase_Decision::get_instance();
?>
数据分析类
<?php
/**
* 销售数据分析类
* 负责分析销售数据并预测未来需求
*/
class SPD_Data_Analyzer {
private $sales_data_cache;
public function __construct() {
$this->sales_data_cache = array();
}
/**
* 获取产品销售历史
* @param int $product_id 产品ID
* @param int $days 分析天数
* @return array 销售数据数组
*/
public function get_sales_history($product_id, $days = 30) {
global $wpdb;
$cache_key = 'sales_history_' . $product_id . '_' . $days;
// 检查缓存
if (isset($this->sales_data_cache[$cache_key])) {
return $this->sales_data_cache[$cache_key];
}
$start_date = date('Y-m-d', strtotime('-' . $days . ' days'));
// 查询WooCommerce订单数据
$query = $wpdb->prepare(
"SELECT
DATE(p.post_date) as sale_date,
SUM(im.meta_value) as total_quantity
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->prefix}woocommerce_order_items oi ON p.ID = oi.order_id
INNER JOIN {$wpdb->prefix}woocommerce_order_itemmeta im ON oi.order_item_id = im.order_item_id
WHERE p.post_type = 'shop_order'
AND p.post_status IN ('wc-completed', 'wc-processing')
AND p.post_date >= %s
AND oi.order_item_type = 'line_item'
AND im.meta_key = '_product_id'
AND im.meta_value = %d
GROUP BY DATE(p.post_date)
ORDER BY sale_date ASC",
$start_date,
$product_id
);
$results = $wpdb->get_results($query, ARRAY_A);
// 填充缺失的日期
$sales_data = $this->fill_missing_dates($results, $days);
// 缓存结果
$this->sales_data_cache[$cache_key] = $sales_data;
return $sales_data;
}
/**
* 填充缺失的日期数据
* @param array $data 原始数据
* @param int $days 天数
* @return array 完整的数据数组
*/
private function fill_missing_dates($data, $days) {
$filled_data = array();
$date_format = 'Y-m-d';
for ($i = $days; $i >= 0; $i--) {
$current_date = date($date_format, strtotime('-' . $i . ' days'));
$found = false;
foreach ($data as $item) {
if ($item['sale_date'] == $current_date) {
$filled_data[] = array(
'date' => $current_date,
'quantity' => (int)$item['total_quantity']
);
$found = true;
break;
}
}
if (!$found) {
$filled_data[] = array(
'date' => $current_date,
'quantity' => 0
);
}
}
return $filled_data;
}
/**
* 计算移动平均销量
* @param array $sales_data 销售数据
* @param int $period 周期(默认7天)
* @return array 移动平均数据
*/
public function calculate_moving_average($sales_data, $period = 7) {
$moving_averages = array();
$data_count = count($sales_data);
for ($i = 0; $i < $data_count; $i++) {
if ($i < $period - 1) {
// 前period-1天数据不足,使用已有数据计算
$slice = array_slice($sales_data, 0, $i + 1);
$sum = array_sum(array_column($slice, 'quantity'));
$average = $sum / ($i + 1);
} else {
// 计算移动平均
$slice = array_slice($sales_data, $i - $period + 1, $period);
$sum = array_sum(array_column($slice, 'quantity'));
$average = $sum / $period;
}
$moving_averages[] = array(
'date' => $sales_data[$i]['date'],
'average' => round($average, 2)
);
}
return $moving_averages;
}
/**
* 预测未来需求
* @param int $product_id 产品ID
* @param int $forecast_days 预测天数
* @return array 预测结果
*/
public function forecast_demand($product_id, $forecast_days = 30) {
// 获取历史数据
$history_days = $forecast_days * 3; // 使用3倍预测天数的历史数据
$sales_data = $this->get_sales_history($product_id, $history_days);
if (empty($sales_data)) {
return array(
'success' => false,
'message' => '没有足够的销售数据进行分析'
);
}
// 计算移动平均
$moving_average = $this->calculate_moving_average($sales_data, 7);
// 提取最近的平均值作为预测基础
$recent_averages = array_slice($moving_average, -14); // 最近14天
$avg_sales = array_sum(array_column($recent_averages, 'average')) / count($recent_averages);
// 考虑季节性因素(简单实现)
$seasonality_factor = $this->calculate_seasonality_factor($sales_data);
// 生成预测
$forecast = array();
$start_date = date('Y-m-d', strtotime('+1 day'));
for ($i = 0; $i < $forecast_days; $i++) {
$forecast_date = date('Y-m-d', strtotime($start_date . ' + ' . $i . ' days'));
$day_of_week = date('w', strtotime($forecast_date));
// 根据星期几调整预测(简单模型)
$weekday_factor = $this->get_weekday_factor($day_of_week);
// 计算预测销量
$predicted_sales = $avg_sales * $seasonality_factor * $weekday_factor;
$forecast[] = array(
'date' => $forecast_date,
'predicted_quantity' => round($predicted_sales),
'confidence' => $this->calculate_confidence($sales_data, $predicted_sales)
);
}
return array(
'success' => true,
'forecast' => $forecast,
'average_daily_sales' => round($avg_sales, 2),
'total_predicted' => array_sum(array_column($forecast, 'predicted_quantity'))
);
}
/**
* 计算季节性因子
* @param array $sales_data 销售数据
* @return float 季节性因子
*/
private function calculate_seasonality_factor($sales_data) {
// 简化版本:基于月份的季节性调整
$current_month = date('n');
// 示例季节性因子(可根据实际数据调整)
$monthly_factors = array(
1 => 0.9, // 1月
2 => 0.8, // 2月
3 => 1.0, // 3月
4 => 1.1, // 4月
5 => 1.2, // 5月
6 => 1.3, // 6月
7 => 1.2, // 7月
8 => 1.1, // 8月
9 => 1.0, // 9月
10 => 1.1, // 10月
11 => 1.3, // 11月
12 => 1.5 // 12月
);
return isset($monthly_factors[$current_month]) ? $monthly_factors[$current_month] : 1.0;
}
/**
* 获取星期几因子
* @param int $day_of_week 星期几(0-6,0代表周日)
* @return float 调整因子
*/
private function get_weekday_factor($day_of_week) {
// 根据星期几调整销量预测
$factors = array(
0 => 0.7, // 周日
1 => 1.1, // 周一
2 => 1.0, // 周二
3 => 1.0, // 周三
4 => 1.2, // 周四
5 => 1.3, // 周五
6 => 1.5 // 周六
);
return isset($factors[$day_of_week]) ? $factors[$day_of_week] : 1.0;
}
/**
* 计算预测置信度
* @param array $sales_data 历史销售数据
* @param float $prediction 预测值
* @return float 置信度(0-1)
*/
private function calculate_confidence($sales_data, $prediction) {
if (count($sales_data) < 7) {
return 0.3; // 数据不足,置信度低
}
// 计算历史数据的标准差
$quantities = array_column($sales_data, 'quantity');
$mean = array_sum($quantities) / count($quantities);
$variance = 0;
foreach ($quantities as $qty) {
$variance += pow($qty - $mean, 2);
}
$std_dev = sqrt($variance / count($quantities));
// 计算变异系数
$coefficient_of_variation = ($mean > 0) ? $std_dev / $mean : 1;
// 基于变异系数计算置信度
$confidence = 1 - min($coefficient_of_variation, 1);
return round(max($confidence, 0.1), 2); // 最低置信度10%
}
}
?>
采购建议算法类
<?php
/**
* 采购建议类
* 基于数据分析生成采购建议
*/
class SPD_Purchase_Advisor {
public function __construct() {
// 初始化
}
/**
* 生成采购建议
* @param int $product_id 产品ID
* @return array 采购建议
*/
public function generate_purchase_recommendation($product_id) {
// 获取当前库存
$inventory_manager = new SPD_Inventory_Manager();
$current_stock = $inventory_manager->get_current_stock($product_id);
// 获取需求预测
$data_analyzer = new SPD_Data_Analyzer();
$forecast = $data_analyzer->forecast_demand($product_id, 30);
if (!$forecast['success']) {
return array(
'success' => false,
'message' => $forecast['message']
);
}
// 获取采购参数
$lead_time = get_post_meta($product_id, '_spd_lead_time', true) ?: 7;
$safety_stock = get_option('spd_safety_stock', 5);
$moq = get_post_meta($product_id, '_spd_minimum_order_quantity', true) ?: 1;
// 计算建议采购量
$recommendation = $this->calculate_purchase_quantity(
$current_stock,
$forecast,
$lead_time,
$safety_stock,
$moq
);
// 获取供应商信息
$suppliers = $this->get_product_suppliers($product_id);
// 计算最佳供应商
$best_supplier = $this->select_best_supplier($suppliers, $recommendation['quantity_to_order']);
return array(
'success' => true,
'product_id' => $product_id,
$current_stock,
'forecast_summary' => array(
'total_predicted_demand' => $forecast['total_predicted'],
'average_daily_sales' => $forecast['average_daily_sales'],
'forecast_period' => 30
),
'recommendation' => $recommendation,
'suppliers' => $suppliers,
'best_supplier' => $best_supplier,
'calculation_date' => current_time('mysql')
);
}
/**
* 计算建议采购量
* @param int $current_stock 当前库存
* @param array $forecast 需求预测
* @param int $lead_time 交货期(天)
* @param int $safety_stock 安全库存
* @param int $moq 最小起订量
* @return array 采购建议详情
*/
private function calculate_purchase_quantity($current_stock, $forecast, $lead_time, $safety_stock, $moq) {
// 计算交货期内的预测需求
$lead_time_demand = 0;
$forecast_data = $forecast['forecast'];
for ($i = 0; $i < min($lead_time, count($forecast_data)); $i++) {
$lead_time_demand += $forecast_data[$i]['predicted_quantity'];
}
// 计算再订货点
$reorder_point = $lead_time_demand + $safety_stock;
// 计算建议采购量
$shortage = $reorder_point - $current_stock;
if ($shortage <= 0) {
// 库存充足,无需采购
return array(
'action' => 'hold',
'quantity_to_order' => 0,
'reason' => '当前库存充足,可满足未来' . $lead_time . '天的预测需求',
'reorder_point' => $reorder_point,
'lead_time_demand' => $lead_time_demand,
'days_of_supply' => $this->calculate_days_of_supply($current_stock, $forecast['average_daily_sales'])
);
}
// 考虑经济订购批量(EOQ)简化版
$eoq = $this->calculate_eoq(
$forecast['total_predicted'],
get_post_meta($product_id, '_spd_ordering_cost', true) ?: 50,
get_post_meta($product_id, '_spd_holding_cost_rate', true) ?: 0.2,
get_post_meta($product_id, '_spd_unit_cost', true) ?: 10
);
// 确定订购量
$quantity_to_order = max($shortage, $eoq, $moq);
// 考虑包装规格
$package_size = get_post_meta($product_id, '_spd_package_size', true) ?: 1;
if ($package_size > 1) {
$quantity_to_order = ceil($quantity_to_order / $package_size) * $package_size;
}
// 检查仓储限制
$storage_limit = get_post_meta($product_id, '_spd_storage_limit', true);
if ($storage_limit && ($current_stock + $quantity_to_order) > $storage_limit) {
$quantity_to_order = $storage_limit - $current_stock;
}
return array(
'action' => 'purchase',
'quantity_to_order' => $quantity_to_order,
'reason' => '库存低于再订货点,建议补充库存',
'reorder_point' => $reorder_point,
'lead_time_demand' => $lead_time_demand,
'eoq_recommendation' => $eoq,
'days_of_supply' => $this->calculate_days_of_supply($current_stock, $forecast['average_daily_sales'])
);
}
/**
* 计算经济订购批量(EOQ)
* @param float $annual_demand 年需求量
* @param float $ordering_cost 订购成本
* @param float $holding_cost_rate 持有成本率
* @param float $unit_cost 单位成本
* @return float 经济订购批量
*/
private function calculate_eoq($annual_demand, $ordering_cost, $holding_cost_rate, $unit_cost) {
if ($annual_demand <= 0 || $ordering_cost <= 0 || $holding_cost_rate <= 0 || $unit_cost <= 0) {
return 0;
}
// EOQ公式:√(2DS/H)
// D = 年需求量,S = 订购成本,H = 单位持有成本(单位成本 × 持有成本率)
$holding_cost_per_unit = $unit_cost * $holding_cost_rate;
$eoq = sqrt((2 * $annual_demand * $ordering_cost) / $holding_cost_per_unit);
return round($eoq);
}
/**
* 计算库存可供应天数
* @param int $current_stock 当前库存
* @param float $average_daily_sales 日均销量
* @return float 可供应天数
*/
private function calculate_days_of_supply($current_stock, $average_daily_sales) {
if ($average_daily_sales <= 0) {
return $current_stock > 0 ? 999 : 0;
}
return round($current_stock / $average_daily_sales, 1);
}
/**
* 获取产品供应商
* @param int $product_id 产品ID
* @return array 供应商列表
*/
private function get_product_suppliers($product_id) {
$suppliers = array();
// 从产品元数据获取供应商信息
$supplier_data = get_post_meta($product_id, '_spd_suppliers', true);
if ($supplier_data && is_array($supplier_data)) {
foreach ($supplier_data as $supplier) {
$suppliers[] = array(
'id' => $supplier['id'] ?? uniqid(),
'name' => $supplier['name'] ?? '未知供应商',
'unit_price' => floatval($supplier['unit_price'] ?? 0),
'lead_time' => intval($supplier['lead_time'] ?? 7),
'minimum_order_quantity' => intval($supplier['moq'] ?? 1),
'reliability_score' => floatval($supplier['reliability'] ?? 0.8),
'quality_score' => floatval($supplier['quality'] ?? 0.8)
);
}
}
// 如果没有设置供应商,返回默认供应商
if (empty($suppliers)) {
$suppliers[] = array(
'id' => 'default',
'name' => '默认供应商',
'unit_price' => get_post_meta($product_id, '_price', true) ?: 10,
'lead_time' => 7,
'minimum_order_quantity' => 1,
'reliability_score' => 0.7,
'quality_score' => 0.7
);
}
return $suppliers;
}
/**
* 选择最佳供应商
* @param array $suppliers 供应商列表
* @param int $required_quantity 需求数量
* @return array 最佳供应商信息
*/
private function select_best_supplier($suppliers, $required_quantity) {
if (empty($suppliers)) {
return null;
}
$best_supplier = null;
$best_score = -1;
foreach ($suppliers as $supplier) {
// 检查是否满足最小起订量
if ($required_quantity < $supplier['minimum_order_quantity']) {
continue;
}
// 计算供应商综合评分
$score = $this->calculate_supplier_score($supplier, $required_quantity);
if ($score > $best_score) {
$best_score = $score;
$best_supplier = $supplier;
$best_supplier['score'] = $score;
}
}
return $best_supplier;
}
/**
* 计算供应商综合评分
* @param array $supplier 供应商信息
* @param int $quantity 采购数量
* @return float 综合评分
*/
private function calculate_supplier_score($supplier, $quantity) {
$weights = array(
'price' => 0.4, // 价格权重
'lead_time' => 0.3, // 交货期权重
'reliability' => 0.2, // 可靠性权重
'quality' => 0.1 // 质量权重
);
// 价格得分(价格越低得分越高)
$max_price = max(array_column($this->get_product_suppliers($product_id), 'unit_price'));
$min_price = min(array_column($this->get_product_suppliers($product_id), 'unit_price'));
if ($max_price > $min_price) {
$price_score = 1 - (($supplier['unit_price'] - $min_price) / ($max_price - $min_price));
} else {
$price_score = 1;
}
// 交货期得分(交货期越短得分越高)
$max_lead_time = max(array_column($this->get_product_suppliers($product_id), 'lead_time'));
$min_lead_time = min(array_column($this->get_product_suppliers($product_id), 'lead_time'));
if ($max_lead_time > $min_lead_time) {
$lead_time_score = 1 - (($supplier['lead_time'] - $min_lead_time) / ($max_lead_time - $min_lead_time));
} else {
$lead_time_score = 1;
}
// 可靠性得分
$reliability_score = $supplier['reliability_score'];
// 质量得分
$quality_score = $supplier['quality_score'];
// 计算加权总分
$total_score =
($price_score * $weights['price']) +
($lead_time_score * $weights['lead_time']) +
($reliability_score * $weights['reliability']) +
($quality_score * $weights['quality']);
return round($total_score, 3);
}
/**
* 批量生成采购建议
* @param array $product_ids 产品ID数组
* @return array 批量采购建议
*/
public function generate_batch_recommendations($product_ids) {
$results = array();
$total_investment = 0;
$priority_products = array();
foreach ($product_ids as $product_id) {
$recommendation = $this->generate_purchase_recommendation($product_id);
if ($recommendation['success']) {
$results[$product_id] = $recommendation;
if ($recommendation['recommendation']['action'] === 'purchase') {
$quantity = $recommendation['recommendation']['quantity_to_order'];
$unit_price = $recommendation['best_supplier']['unit_price'] ?? 0;
$total_investment += $quantity * $unit_price;
// 根据紧急程度设置优先级
$days_of_supply = $recommendation['recommendation']['days_of_supply'];
$priority = $this->calculate_priority($days_of_supply);
$priority_products[] = array(
'product_id' => $product_id,
'product_name' => get_the_title($product_id),
'priority' => $priority,
'days_of_supply' => $days_of_supply,
'quantity_to_order' => $quantity,
'estimated_cost' => $quantity * $unit_price
);
}
}
}
// 按优先级排序
usort($priority_products, function($a, $b) {
return $a['priority'] - $b['priority'];
});
return array(
'success' => true,
'recommendations' => $results,
'summary' => array(
'total_products_analyzed' => count($product_ids),
'products_need_purchase' => count($priority_products),
'total_investment_required' => round($total_investment, 2),
'priority_list' => $priority_products
)
);
}
/**
* 计算采购优先级
* @param float $days_of_supply 可供应天数
* @return int 优先级(数字越小优先级越高)
*/
private function calculate_priority($days_of_supply) {
if ($days_of_supply <= 7) {
return 1; // 紧急
} elseif ($days_of_supply <= 14) {
return 2; // 高优先级
} elseif ($days_of_supply <= 30) {
return 3; // 中等优先级
} else {
return 4; // 低优先级
}
}
}
?>
## 管理界面实现
<?php
/**
- 管理页面类
- 提供插件后台管理界面
*/
class SPD_Admin_Page {
public function __construct() {
add_action('admin_menu', array($this, 'add_admin_menu'));
add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
}
/**
* 添加管理菜单
*/
public function add_admin_menu() {
add_menu_page(
'智能采购决策',
'采购决策',
'manage_options',
'smart-purchase-decision',
array($this, 'render_dashboard'),
'dashicons-cart',
30
);
add_submenu_page(
'smart-purchase-decision',
'采购建议',
'采购建议',
'manage_options',
'spd-recommendations',
array($this, 'render_recommendations_page')
);
add_submenu_page(
'smart-purchase-decision',
'库存分析',
'库存分析',
'manage_options',
'spd-inventory',
array($this, 'render_inventory_page')
);
add_submenu_page(
'smart-purchase-decision',
'设置',
'设置',
'manage_options',
'spd-settings',
array($this, 'render_settings_page')
);
}
/**
* 加载管理端脚本和样式
*/
public function enqueue_admin_scripts($hook) {
if (strpos($hook, 'smart-purchase-decision') === false) {
return;
}
// 加载Chart.js用于数据可视化
wp_enqueue_script(
'chart-js',
'https://cdn.jsdelivr.net/npm/chart.js',
array(),
'3.7.0',
true
);
// 加载自定义脚本
wp_enqueue_script(
'spd-admin-script',
SPD_PLUGIN_URL . 'admin/js/admin-scripts.js',
array('jquery', 'chart-js'),
SPD_VERSION,
true
);
// 加载样式
wp_enqueue_style(
'spd-admin-style',
SPD_PLUGIN_URL . 'assets/css/admin-styles.css',
array(),
SPD_VERSION
);
// 传递数据到JavaScript
wp_localize_script('spd-admin-script', 'spd_ajax', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('spd_ajax_nonce')
));
}
/**
* 渲染仪表板页面
*/
public function render_dashboard() {
?>
<div class="wrap spd-dashboard">
<h1>智能采购决策仪表板</h1>
<div class="spd-stats-container">
<div class="spd-stat-card">
<h3>库存状态</h3>
<div class="stat-value" id="low-stock-count">加载中...</div>
<p>低库存产品数量</p>
</div>
<div class="spd-stat-card">
<h3>建议采购总额</h3>
<div class="stat-value" id="total-purchase-value">加载中...</div>
<p>本月建议采购金额</p>
</div>
<div class="spd-stat-card">
<h3>库存周转率</h3>
<div class="stat-value" id="turnover-rate">加载中...</div>
<p>预计年周转次数</p>
</div>
</div>
<div class="spd-chart-container">
<div class="spd-chart-box">
<h3>库存水平分析</h3>
<canvas id="inventory-level-chart" width="400" height="200"></canvas>
</div>
<div class="spd-chart-box">
<h3>采购建议分布</h3>
<canvas id="recommendation-chart" width="400" height="200"></canvas>
</div>
</div>
<div class="spd-priority-list">
<h3>高优先级采购建议</h3>
<div id="priority-recommendations">
<p>加载中...</p>
</div>
</div>
</div>
<script>
jQuery(document).ready(function($) {
// 加载仪表板数据
loadDashboardData();
function loadDashboardData() {
$.ajax({
url: spd_ajax.ajax_url,
type: 'POST',
data: {
action: 'spd_get_dashboard_data',
nonce: spd_ajax.nonce
},
success: function(response) {
if (response.success) {
update
