首页 / 教程文章 / WordPress小批量定制插件实现智能采购决策的教程

WordPress小批量定制插件实现智能采购决策的教程

WordPress小批量定制插件实现智能采购决策的教程

概述

在当今电子商务快速发展的时代,智能采购决策对于小型企业和个人卖家来说至关重要。本教程将指导您如何创建一个WordPress插件,帮助用户根据销售数据、库存情况和市场趋势做出更明智的采购决策。这个插件特别适合处理小批量采购场景,通过数据分析提供采购建议。

插件功能设计

我们的智能采购决策插件将包含以下核心功能:

  1. 销售数据分析 - 跟踪产品销售趋势
  2. 库存监控 - 实时监控库存水平
  3. 采购建议算法 - 基于数据提供采购建议
  4. 可视化报告 - 以图表形式展示数据
  5. 供应商管理 - 管理供应商信息和采购历史

插件基础结构

首先,我们创建插件的基本文件结构:

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
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6261.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

工作时间:周一至周五,9:00-17:30,节假日休息
返回顶部