首页 / 教程文章 / 针对小批量定制的WordPress柔性供应链插件开发详解

针对小批量定制的WordPress柔性供应链插件开发详解

针对小批量定制的WordPress柔性供应链插件开发详解

引言:小批量定制时代的供应链挑战

在当今个性化消费趋势下,小批量定制生产模式日益普及。传统WordPress电商网站通常对接的是标准化、大批量的供应链系统,难以适应小批量、多品种、快速响应的定制需求。柔性供应链插件正是为解决这一痛点而生,它能够在WordPress平台上实现生产订单的智能分配、供应商动态管理和生产进度跟踪等功能。

本文将详细解析如何开发一个面向小批量定制的WordPress柔性供应链插件,包含完整的代码实现和架构设计。

插件架构设计

1.1 核心功能模块

柔性供应链插件需要包含以下核心模块:

  • 供应商管理模块
  • 订单智能分配模块
  • 生产进度跟踪模块
  • 库存动态管理模块
  • 数据分析与报表模块

1.2 数据库设计

<?php
/**
 * 创建插件所需数据库表
 * 在插件激活时执行
 */
function fsc_create_database_tables() {
    global $wpdb;
    
    $charset_collate = $wpdb->get_charset_collate();
    
    // 供应商表
    $suppliers_table = $wpdb->prefix . 'fsc_suppliers';
    $suppliers_sql = "CREATE TABLE IF NOT EXISTS $suppliers_table (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        name varchar(100) NOT NULL,
        specialty text,
        capacity int NOT NULL DEFAULT 0,
        current_workload int NOT NULL DEFAULT 0,
        lead_time int NOT NULL DEFAULT 7,
        quality_rating decimal(3,2) DEFAULT 5.00,
        is_active tinyint(1) DEFAULT 1,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
    ) $charset_collate;";
    
    // 生产订单表
    $orders_table = $wpdb->prefix . 'fsc_production_orders';
    $orders_sql = "CREATE TABLE IF NOT EXISTS $orders_table (
        id mediumint(9) NOT NULL AUTO_INCREMENT,
        woo_order_id bigint(20),
        product_id bigint(20),
        custom_specs text,
        quantity int NOT NULL,
        assigned_to mediumint(9),
        status varchar(50) DEFAULT 'pending',
        priority int DEFAULT 1,
        deadline date,
        started_at datetime,
        completed_at datetime,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        FOREIGN KEY (assigned_to) REFERENCES $suppliers_table(id)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($suppliers_sql);
    dbDelta($orders_sql);
}
register_activation_hook(__FILE__, 'fsc_create_database_tables');
?>

供应商管理模块开发

2.1 供应商注册与管理界面

<?php
/**
 * 供应商管理类
 */
class FSC_Supplier_Manager {
    
    /**
     * 添加新供应商
     * @param array $supplier_data 供应商数据
     * @return int|false 供应商ID或false
     */
    public function add_supplier($supplier_data) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'fsc_suppliers';
        
        $defaults = array(
            'name' => '',
            'specialty' => '',
            'capacity' => 100,
            'lead_time' => 7,
            'quality_rating' => 5.0,
            'is_active' => 1
        );
        
        $data = wp_parse_args($supplier_data, $defaults);
        
        // 数据验证
        if (empty($data['name'])) {
            return new WP_Error('missing_name', __('供应商名称不能为空', 'fsc'));
        }
        
        $result = $wpdb->insert(
            $table_name,
            $data,
            array('%s', '%s', '%d', '%d', '%f', '%d')
        );
        
        return $result ? $wpdb->insert_id : false;
    }
    
    /**
     * 获取可用供应商列表
     * @param array $criteria 筛选条件
     * @return array 供应商列表
     */
    public function get_available_suppliers($criteria = array()) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'fsc_suppliers';
        
        $defaults = array(
            'specialty' => '',
            'min_capacity' => 0,
            'max_workload' => 80,
            'limit' => 10
        );
        
        $args = wp_parse_args($criteria, $defaults);
        
        $sql = "SELECT * FROM $table_name WHERE is_active = 1";
        
        // 添加专业领域筛选
        if (!empty($args['specialty'])) {
            $sql .= $wpdb->prepare(" AND specialty LIKE %s", '%' . $args['specialty'] . '%');
        }
        
        // 添加容量筛选
        $sql .= $wpdb->prepare(" AND capacity >= %d", $args['min_capacity']);
        
        // 添加工作负载筛选(当前工作量/容量 < 指定百分比)
        $sql .= $wpdb->prepare(" AND (current_workload / capacity * 100) < %d", $args['max_workload']);
        
        $sql .= " ORDER BY quality_rating DESC, lead_time ASC";
        $sql .= $wpdb->prepare(" LIMIT %d", $args['limit']);
        
        return $wpdb->get_results($sql);
    }
}
?>

订单智能分配算法

3.1 基于多因素评估的分配逻辑

<?php
/**
 * 智能订单分配器
 */
class FSC_Order_Allocator {
    
    /**
     * 为生产订单分配合适的供应商
     * @param int $order_id 生产订单ID
     * @return int|WP_Error 分配的供应商ID或错误
     */
    public function allocate_order($order_id) {
        global $wpdb;
        
        // 获取订单详情
        $orders_table = $wpdb->prefix . 'fsc_production_orders';
        $order = $wpdb->get_row($wpdb->prepare(
            "SELECT * FROM $orders_table WHERE id = %d", 
            $order_id
        ));
        
        if (!$order) {
            return new WP_Error('order_not_found', __('订单不存在', 'fsc'));
        }
        
        // 获取产品定制规格
        $product_specs = json_decode($order->custom_specs, true);
        $required_specialty = isset($product_specs['production_type']) ? 
                              $product_specs['production_type'] : 'general';
        
        // 获取候选供应商
        $supplier_manager = new FSC_Supplier_Manager();
        $candidates = $supplier_manager->get_available_suppliers(array(
            'specialty' => $required_specialty,
            'min_capacity' => $order->quantity
        ));
        
        if (empty($candidates)) {
            // 如果没有专业匹配的供应商,尝试通用供应商
            $candidates = $supplier_manager->get_available_suppliers(array(
                'min_capacity' => $order->quantity
            ));
        }
        
        if (empty($candidates)) {
            return new WP_Error('no_available_suppliers', __('没有可用的供应商', 'fsc'));
        }
        
        // 计算每个候选供应商的得分
        $scored_suppliers = array();
        foreach ($candidates as $supplier) {
            $score = $this->calculate_supplier_score($supplier, $order);
            $scored_suppliers[] = array(
                'supplier' => $supplier,
                'score' => $score
            );
        }
        
        // 按得分排序
        usort($scored_suppliers, function($a, $b) {
            return $b['score'] <=> $a['score'];
        });
        
        // 选择得分最高的供应商
        $selected_supplier = $scored_suppliers[0]['supplier'];
        
        // 更新订单分配
        $wpdb->update(
            $orders_table,
            array('assigned_to' => $selected_supplier->id, 'status' => 'assigned'),
            array('id' => $order_id),
            array('%d', '%s'),
            array('%d')
        );
        
        // 更新供应商工作负载
        $this->update_supplier_workload($selected_supplier->id, $order->quantity);
        
        return $selected_supplier->id;
    }
    
    /**
     * 计算供应商得分
     * @param object $supplier 供应商对象
     * @param object $order 订单对象
     * @return float 综合得分
     */
    private function calculate_supplier_score($supplier, $order) {
        $weights = array(
            'quality' => 0.4,      // 质量权重
            'lead_time' => 0.3,    // 交货时间权重
            'workload' => 0.2,     // 工作负载权重
            'history' => 0.1       // 合作历史权重
        );
        
        // 质量得分(0-10分)
        $quality_score = $supplier->quality_rating * 2;
        
        // 交货时间得分(时间越短得分越高)
        $max_lead_time = 30; // 最大允许交货时间
        $lead_time_score = 10 * (1 - ($supplier->lead_time / $max_lead_time));
        $lead_time_score = max(0, min(10, $lead_time_score));
        
        // 工作负载得分(负载越低得分越高)
        $workload_ratio = $supplier->current_workload / $supplier->capacity;
        $workload_score = 10 * (1 - $workload_ratio);
        
        // 历史合作得分(简化处理)
        $history_score = $this->calculate_history_score($supplier->id);
        
        // 计算综合得分
        $total_score = 
            $quality_score * $weights['quality'] +
            $lead_time_score * $weights['lead_time'] +
            $workload_score * $weights['workload'] +
            $history_score * $weights['history'];
        
        return round($total_score, 2);
    }
    
    /**
     * 更新供应商工作负载
     */
    private function update_supplier_workload($supplier_id, $order_quantity) {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'fsc_suppliers';
        
        $wpdb->query($wpdb->prepare(
            "UPDATE $table_name 
             SET current_workload = current_workload + %d 
             WHERE id = %d",
            $order_quantity,
            $supplier_id
        ));
    }
}
?>

生产进度跟踪模块

4.1 进度状态管理与通知

<?php
/**
 * 生产进度跟踪器
 */
class FSC_Production_Tracker {
    
    /**
     * 更新生产状态
     * @param int $order_id 订单ID
     * @param string $status 新状态
     * @param string $notes 备注
     * @return bool 是否成功
     */
    public function update_production_status($order_id, $status, $notes = '') {
        global $wpdb;
        
        $table_name = $wpdb->prefix . 'fsc_production_orders';
        $status_log_table = $wpdb->prefix . 'fsc_status_logs';
        
        $allowed_statuses = array('pending', 'assigned', 'in_production', 'quality_check', 'completed', 'delayed');
        
        if (!in_array($status, $allowed_statuses)) {
            return false;
        }
        
        $update_data = array('status' => $status);
        
        // 如果是开始生产,记录开始时间
        if ($status === 'in_production') {
            $update_data['started_at'] = current_time('mysql');
        }
        
        // 如果是完成,记录完成时间
        if ($status === 'completed') {
            $update_data['completed_at'] = current_time('mysql');
            
            // 减少供应商工作负载
            $order = $wpdb->get_row($wpdb->prepare(
                "SELECT assigned_to, quantity FROM $table_name WHERE id = %d", 
                $order_id
            ));
            
            if ($order && $order->assigned_to) {
                $wpdb->query($wpdb->prepare(
                    "UPDATE {$wpdb->prefix}fsc_suppliers 
                     SET current_workload = GREATEST(0, current_workload - %d) 
                     WHERE id = %d",
                    $order->quantity,
                    $order->assigned_to
                ));
            }
        }
        
        // 更新订单状态
        $result = $wpdb->update(
            $table_name,
            $update_data,
            array('id' => $order_id),
            array('%s', '%s'),
            array('%d')
        );
        
        // 记录状态变更日志
        if ($result) {
            $wpdb->insert(
                $status_log_table,
                array(
                    'order_id' => $order_id,
                    'old_status' => $this->get_current_status($order_id),
                    'new_status' => $status,
                    'notes' => $notes,
                    'changed_by' => get_current_user_id(),
                    'changed_at' => current_time('mysql')
                ),
                array('%d', '%s', '%s', '%s', '%d', '%s')
            );
            
            // 发送状态变更通知
            $this->send_status_notification($order_id, $status);
        }
        
        return $result;
    }
    
    /**
     * 获取订单进度时间线
     */
    public function get_order_timeline($order_id) {
        global $wpdb;
        
        $log_table = $wpdb->prefix . 'fsc_status_logs';
        
        return $wpdb->get_results($wpdb->prepare(
            "SELECT * FROM $log_table 
             WHERE order_id = %d 
             ORDER BY changed_at DESC",
            $order_id
        ));
    }
}
?>

前端界面与短代码集成

5.1 供应商前端展示与客户进度查询

<?php
/**
 * 前端短代码处理器
 */
class FSC_Shortcodes {
    
    /**
     * 注册所有短代码
     */
    public function register_shortcodes() {
        add_shortcode('fsc_supplier_dashboard', array($this, 'render_supplier_dashboard'));
        add_shortcode('fsc_order_tracking', array($this, 'render_order_tracking'));
        add_shortcode('fsc_supplier_list', array($this, 'render_supplier_list'));
    }
    
    /**
     * 供应商仪表盘短代码
     */
    public function render_supplier_dashboard($atts) {
        // 验证供应商权限
        if (!is_user_logged_in() || !$this->is_supplier_user()) {
            return '<p>请以供应商账号登录</p>';
        }
        
        $supplier_id = $this->get_current_supplier_id();
        
        ob_start();
        ?>
        <div class="fsc-supplier-dashboard">
            <h2>供应商工作台</h2>
            
            <div class="dashboard-stats">
                <?php
                $stats = $this->get_supplier_stats($supplier_id);
                ?>
                <div class="stat-card">
                    <h3>当前工作量</h3>
                    <p class="stat-value"><?php echo $stats['current_workload']; ?> / <?php echo $stats['capacity']; ?></p>
                </div>
                
                <div class="stat-card">
                    <h3>进行中订单</h3>
                    <p class="stat-value"><?php echo $stats['active_orders']; ?></p>
                </div>
            </div>
            
            <div class="assigned-orders">
                <h3>分配给我的订单</h3>
                <?php echo $this->render_supplier_orders($supplier_id); ?>
            </div>
        </div>
        
        <style>
        .fsc-supplier-dashboard {
            max-width: 1200px;
            margin: 0 auto;
            padding: 20px;
        }
        
        .dashboard-stats {
            display: grid;
            grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
            gap: 20px;
            margin-bottom: 30px;
        }
        
        .stat-card {
            background: #f8f9fa;
            border-radius: 8px;
            padding: 20px;
            text-align: center;
            border-left: 4px solid #007cba;
        }
        
        .stat-value {
            font-size: 24px;
            font-weight: bold;
            color: #007cba;
            margin: 10px 0 0;
        }
        </style>
        <?php
        
        return ob_get_clean();
    }
    
    /**
     * 订单跟踪短代码
     */
    public function render_order_tracking($atts) {
        $atts = shortcode_atts(array(
            'order_id' => 0
        ), $atts);
        
        ob_start();
        ?>
        <div class="fsc-order-tracking">
            <h3>生产进度查询</h3>
            
            <form method="get" class="tracking-form">
                <input type="text" name="fsc_tracking_number" 
                       placeholder="输入订单号或WooCommerce订单号"
                       value="<?php echo esc_attr($_GET['fsc_tracking_number'] ?? ''); ?>">
                <button type="submit">查询</button>
            </form>
            
            <?php
            if (isset($_GET['fsc_tracking_number']) && !empty($_GET['fsc_tracking_number'])) {
                $this->display_tracking_results($_GET['fsc_tracking_number']);
            }
            ?>
        </div>
        <?php
        
        return ob_get_clean();
    }
}

插件与WooCommerce集成

6.1 WooCommerce订单自动转换

<?php
/**
 * WooCommerce集成处理器
 */
class FSC_WooCommerce_Integration {
    
    /**
     * 初始化WooCommerce钩子
     */
    public function init_hooks() {
        // 订单状态变更时触发生产订单创建
        add_action('woocommerce_order_status_processing', array($this, 'create_production_order'), 10, 2);
        
        // 在订单详情页显示生产进度
        add_action('woocommerce_order_details_after_order_table', array($this, 'display_production_status'), 10, 1);
        
        // 添加自定义订单状态
        add_filter('woocommerce_register_shop_order_post_statuses', array($this, 'register_custom_order_statuses'));
        add_filter('wc_order_statuses', array($this, 'add_custom_order_statuses'));
    }
    
    /**
     * 创建生产订单
     * @param int $order_id WooCommerce订单ID
     * @param WC_Order $order 订单对象
     */
    public function create_production_order($order_id, $order) {
        global $wpdb;
        
        // 检查是否已创建生产订单
        $existing = $wpdb->get_var($wpdb->prepare(
            "SELECT COUNT(*) FROM {$wpdb->prefix}fsc_production_orders 
             WHERE woo_order_id = %d",
            $order_id
        ));
        
        if ($existing > 0) {
            return;
        }
        
        // 获取订单中的定制产品
        $items = $order->get_items();
        $production_orders = array();
        
        foreach ($items as $item) {
            $product = $item->get_product();
            
            // 检查是否为定制产品
            if ($this->is_custom_product($product->get_id())) {
                $custom_specs = $this->extract_custom_specifications($item);
                
                $production_orders[] = array(
                    'woo_order_id' => $order_id,
                    'product_id' => $product->get_id(),
                    'custom_specs' => json_encode($custom_specs, JSON_UNESCAPED_UNICODE),
                    'quantity' => $item->get_quantity(),
                    'priority' => $this->calculate_priority($order),
                    'deadline' => $this->calculate_deadline($order),
                    'status' => 'pending'
                );
            }
        }
        
        // 批量插入生产订单
        if (!empty($production_orders)) {
            foreach ($production_orders as $production_order) {
                $wpdb->insert(
                    "{$wpdb->prefix}fsc_production_orders",
                    $production_order,
                    array('%d', '%d', '%s', '%d', '%d', '%s', '%s')
                );
                
                // 触发自动分配
                $allocator = new FSC_Order_Allocator();
                $allocator->allocate_order($wpdb->insert_id);
            }
            
            // 更新WooCommerce订单状态
            $order->update_status('fsc-in-production', __('订单已进入生产流程', 'fsc'));
        }
    }
    
    /**
     * 提取产品定制规格
     */
    private function extract_custom_specifications($order_item) {
        $specs = array();
        
        // 从订单项元数据中获取定制信息
        $meta_data = $order_item->get_meta_data();
        
        foreach ($meta_data as $meta) {
            $data = $meta->get_data();
            if (strpos($data['key'], 'custom_') === 0) {
                $specs[str_replace('custom_', '', $data['key'])] = $data['value'];
            }
        }
        
        // 添加默认规格
        $specs['order_item_id'] = $order_item->get_id();
        $specs['production_type'] = $this->determine_production_type($specs);
        
        return $specs;
    }
    
    /**
     * 在订单详情页显示生产状态
     */
    public function display_production_status($order) {
        global $wpdb;
        
        $order_id = $order->get_id();
        
        $production_orders = $wpdb->get_results($wpdb->prepare(
            "SELECT po.*, s.name as supplier_name 
             FROM {$wpdb->prefix}fsc_production_orders po
             LEFT JOIN {$wpdb->prefix}fsc_suppliers s ON po.assigned_to = s.id
             WHERE po.woo_order_id = %d",
            $order_id
        ));
        
        if (empty($production_orders)) {
            return;
        }
        
        echo '<section class="fsc-production-status">';
        echo '<h2>' . __('生产进度', 'fsc') . '</h2>';
        
        foreach ($production_orders as $production_order) {
            $this->render_production_order_status($production_order);
        }
        
        echo '</section>';
        
        // 添加CSS样式
        $this->add_status_styles();
    }
    
    /**
     * 渲染单个生产订单状态
     */
    private function render_production_order_status($production_order) {
        $status_labels = array(
            'pending' => __('等待分配', 'fsc'),
            'assigned' => __('已分配供应商', 'fsc'),
            'in_production' => __('生产中', 'fsc'),
            'quality_check' => __('质检中', 'fsc'),
            'completed' => __('已完成', 'fsc'),
            'delayed' => __('已延迟', 'fsc')
        );
        
        $status_class = 'status-' . $production_order->status;
        $status_text = $status_labels[$production_order->status] ?? $production_order->status;
        
        echo '<div class="production-order-status ' . esc_attr($status_class) . '">';
        echo '<h3>' . sprintf(__('生产订单 #%d', 'fsc'), $production_order->id) . '</h3>';
        
        echo '<div class="status-info">';
        echo '<span class="status-label">' . esc_html($status_text) . '</span>';
        
        if ($production_order->supplier_name) {
            echo '<span class="supplier-info">' . 
                 sprintf(__('供应商: %s', 'fsc'), esc_html($production_order->supplier_name)) . 
                 '</span>';
        }
        
        if ($production_order->started_at) {
            echo '<span class="start-date">' . 
                 sprintf(__('开始时间: %s', 'fsc'), date('Y-m-d', strtotime($production_order->started_at))) . 
                 '</span>';
        }
        
        echo '</div>';
        
        // 显示进度时间线
        $this->render_progress_timeline($production_order->id);
        
        echo '</div>';
    }
}
?>

数据分析与报表系统

7.1 供应链性能监控

<?php
/**
 * 数据分析与报表生成器
 */
class FSC_Analytics_Engine {
    
    /**
     * 生成供应商绩效报告
     */
    public function generate_supplier_performance_report($start_date, $end_date) {
        global $wpdb;
        
        $report = array(
            'summary' => array(),
            'suppliers' => array(),
            'metrics' => array()
        );
        
        // 获取时间段内的订单数据
        $orders = $wpdb->get_results($wpdb->prepare(
            "SELECT po.*, s.name as supplier_name 
             FROM {$wpdb->prefix}fsc_production_orders po
             JOIN {$wpdb->prefix}fsc_suppliers s ON po.assigned_to = s.id
             WHERE po.created_at BETWEEN %s AND %s 
             AND po.status = 'completed'",
            $start_date,
            $end_date
        ));
        
        // 计算总体指标
        $total_orders = count($orders);
        $total_quantity = array_sum(array_column($orders, 'quantity'));
        
        // 按供应商分组计算
        $supplier_stats = array();
        foreach ($orders as $order) {
            $supplier_id = $order->assigned_to;
            
            if (!isset($supplier_stats[$supplier_id])) {
                $supplier_stats[$supplier_id] = array(
                    'name' => $order->supplier_name,
                    'order_count' => 0,
                    'total_quantity' => 0,
                    'total_delay' => 0,
                    'completion_times' => array()
                );
            }
            
            $supplier_stats[$supplier_id]['order_count']++;
            $supplier_stats[$supplier_id]['total_quantity'] += $order->quantity;
            
            // 计算延迟天数
            if ($order->completed_at && $order->deadline) {
                $completion_date = new DateTime($order->completed_at);
                $deadline_date = new DateTime($order->deadline);
                
                if ($completion_date > $deadline_date) {
                    $delay_days = $completion_date->diff($deadline_date)->days;
                    $supplier_stats[$supplier_id]['total_delay'] += $delay_days;
                }
                
                // 计算生产周期
                if ($order->started_at) {
                    $start_date = new DateTime($order->started_at);
                    $production_days = $completion_date->diff($start_date)->days;
                    $supplier_stats[$supplier_id]['completion_times'][] = $production_days;
                }
            }
        }
        
        // 计算每个供应商的平均指标
        foreach ($supplier_stats as $supplier_id => &$stats) {
            $stats['avg_delay'] = $stats['order_count'] > 0 ? 
                $stats['total_delay'] / $stats['order_count'] : 0;
            
            $stats['avg_completion_time'] = !empty($stats['completion_times']) ? 
                array_sum($stats['completion_times']) / count($stats['completion_times']) : 0;
            
            $stats['efficiency_score'] = $this->calculate_efficiency_score($stats);
        }
        
        $report['summary'] = array(
            'total_orders' => $total_orders,
            'total_quantity' => $total_quantity,
            'supplier_count' => count($supplier_stats),
            'period' => array('start' => $start_date, 'end' => $end_date)
        );
        
        $report['suppliers'] = $supplier_stats;
        
        return $report;
    }
    
    /**
     * 计算供应商效率得分
     */
    private function calculate_efficiency_score($stats) {
        $weights = array(
            'avg_delay' => -0.3,      // 延迟扣分
            'avg_completion_time' => -0.2, // 生产时间长扣分
            'order_count' => 0.3,     // 订单数量加分
            'quantity' => 0.2         // 生产数量加分
        );
        
        // 标准化各项指标(0-10分)
        $max_orders = max(array_column($this->get_all_supplier_stats(), 'order_count'));
        $order_score = $max_orders > 0 ? ($stats['order_count'] / $max_orders) * 10 : 0;
        
        $max_quantity = max(array_column($this->get_all_supplier_stats(), 'total_quantity'));
        $quantity_score = $max_quantity > 0 ? ($stats['total_quantity'] / $max_quantity) * 10 : 0;
        
        // 延迟得分(延迟越少得分越高)
        $delay_score = max(0, 10 - min($stats['avg_delay'], 10));
        
        // 生产时间得分(时间越短得分越高)
        $completion_score = max(0, 10 - min($stats['avg_completion_time'] / 2, 10));
        
        // 计算综合得分
        $total_score = 
            $delay_score * $weights['avg_delay'] +
            $completion_score * $weights['avg_completion_time'] +
            $order_score * $weights['order_count'] +
            $quantity_score * $weights['quantity'];
        
        return round(max(0, min(100, $total_score * 10)), 2);
    }
    
    /**
     * 生成产能利用率图表数据
     */
    public function generate_capacity_utilization_data($period = 'monthly') {
        global $wpdb;
        
        $data = array();
        
        switch ($period) {
            case 'daily':
                $date_format = '%Y-%m-%d';
                $interval = '7 DAY';
                break;
            case 'weekly':
                $date_format = '%Y-%u';
                $interval = '8 WEEK';
                break;
            default: // monthly
                $date_format = '%Y-%m';
                $interval = '6 MONTH';
        }
        
        // 获取供应商产能数据
        $capacity_data = $wpdb->get_results(
            "SELECT s.id, s.name, s.capacity,
                    DATE_FORMAT(po.created_at, '{$date_format}') as period,
                    SUM(po.quantity) as total_quantity
             FROM {$wpdb->prefix}fsc_suppliers s
             LEFT JOIN {$wpdb->prefix}fsc_production_orders po 
                    ON s.id = po.assigned_to 
                   AND po.created_at >= DATE_SUB(NOW(), INTERVAL {$interval})
             WHERE s.is_active = 1
             GROUP BY s.id, period
             ORDER BY period, s.name"
        );
        
        // 格式化数据供图表使用
        $periods = array();
        $suppliers = array();
        
        foreach ($capacity_data as $row) {
            if (!in_array($row->period, $periods)) {
                $periods[] = $row->period;
            }
            
            if (!isset($suppliers[$row->id])) {
                $suppliers[$row->id] = array(
                    'name' => $row->name,
                    'capacity' => $row->capacity,
                    'data' => array()
                );
            }
            
            $utilization = $row->capacity > 0 ? 
                min(100, ($row->total_quantity / $row->capacity) * 100) : 0;
            
            $suppliers[$row->id]['data'][$row->period] = round($utilization, 2);
        }
        
        // 填充缺失的周期数据
        foreach ($suppliers as &$supplier) {
            foreach ($periods as $period) {
                if (!isset($supplier['data'][$period])) {
                    $supplier['data'][$period] = 0;
                }
            }
            ksort($supplier['data']);
        }
        
        return array(
            'periods' => $periods,
            'suppliers' => $suppliers,
            'type' => 'capacity_utilization'
        );
    }
}
?>

插件管理后台界面

8.1 综合管理仪表盘

<?php
/**
 * 插件管理后台
 */
class FSC_Admin_Dashboard {
    
    /**
     * 初始化管理菜单
     */
    public function init_admin_menu() {
        add_menu_page(
            __('柔性供应链', 'fsc'),
            __('柔性供应链', 'fsc'),
            'manage_options',
            'fsc-dashboard',
            array($this, 'render_dashboard'),
            'dashicons-networking',
            30
        );
        
        add_submenu_page(
            'fsc-dashboard',
            __('供应商管理', 'fsc'),
            __('供应商管理', 'fsc'),
            'manage_options',
            'fsc-suppliers',
            array($this, 'render_suppliers_page')
        );
        
        add_submenu_page(
            'fsc-dashboard',
            __('生产订单', 'fsc'),
            __('生产订单', 'fsc'),
            'manage_options',
            'fsc-production-orders',
            array($this, 'render_orders_page')
        );
        
        add_submenu_page(
            'fsc-dashboard',
            __('数据分析', 'fsc'),
            __('数据分析', 'fsc'),
            'manage_options',
            'fsc-analytics',
            array($this, 'render_analytics_page')
        );
        
        add_submenu_page(
            'fsc-dashboard',
            __('系统设置', 'fsc'),
            __('系统设置', 'fsc'),
            'manage_options',
            'fsc-settings',
            array($this, 'render_settings_page')
        );
    }
    
    /**
     * 渲染主仪表盘
     */
    public function render_dashboard() {
        global $wpdb;
        
        // 获取实时统计数据
        $stats = array(
            'total_suppliers' => $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}fsc_suppliers WHERE is_active = 1"),
            'active_orders' => $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}fsc_production_orders WHERE status NOT IN ('completed', 'cancelled')"),
            'pending_allocation' => $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}fsc_production_orders WHERE status = 'pending'"),
            'today_completed' => $wpdb->get_var($wpdb->prepare(
                "SELECT COUNT(*) FROM {$wpdb->prefix}fsc_production_orders 
                 WHERE DATE(completed_at) = %s",
                date('Y-m-d')
            ))
        );
        
        // 获取最近订单
        $recent_orders = $wpdb->get_results(
            "SELECT po.*, s.name as supplier_name, p.post_title as product_name
             FROM {$wpdb->prefix}fsc_production_orders po
             LEFT JOIN {$wpdb->prefix}fsc_suppliers s ON po.assigned_to = s.id
             LEFT JOIN {$wpdb->posts} p ON po.product_id = p.ID
             ORDER BY po.created_at DESC
             LIMIT 10"
        );
        
        ?>
        <div class="wrap fsc-admin-dashboard">
            <h1><?php _e('柔性供应链管理', 'fsc'); ?></h1>
            
            <div class="dashboard-widgets">
                <!-- 统计卡片 -->
                <div class="stats-grid">
                    <?php foreach ($stats as $key => $value): ?>
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5659.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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