首页 / 教程文章 / 小批量定制订单在WordPress中的柔性处理教程

小批量定制订单在WordPress中的柔性处理教程

小批量定制订单在WordPress中的柔性处理教程

概述:为什么需要柔性处理小批量定制订单?

在当今电商环境中,个性化定制需求日益增长,小批量定制订单成为许多WordPress商家的核心业务。与传统标准化产品不同,定制订单需要灵活的产品选项、动态价格计算和特殊流程处理。本教程将指导您如何在WordPress中构建一个柔性处理系统,既能满足客户个性化需求,又能保持运营效率。

系统架构设计

核心组件选择

对于小批量定制订单处理,我们推荐以下WordPress插件组合:

  • WooCommerce(电商基础)
  • Product Add-Ons(产品选项扩展)
  • Advanced Custom Fields(自定义字段)
  • 自定义开发模块(处理特殊逻辑)

数据库结构优化

定制订单需要存储额外数据,建议在WooCommerce订单结构基础上扩展:

/**
 * 创建定制订单扩展表
 * 用于存储定制化选项和工艺参数
 */
function create_custom_order_meta_table() {
    global $wpdb;
    
    $table_name = $wpdb->prefix . 'custom_order_metadata';
    $charset_collate = $wpdb->get_charset_collate();
    
    $sql = "CREATE TABLE IF NOT EXISTS $table_name (
        id int(11) NOT NULL AUTO_INCREMENT,
        order_id int(11) NOT NULL,
        product_id int(11) NOT NULL,
        option_key varchar(100) NOT NULL,
        option_value text NOT NULL,
        option_price decimal(10,2) DEFAULT 0.00,
        created_at datetime DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id),
        KEY order_id (order_id),
        KEY product_id (product_id)
    ) $charset_collate;";
    
    require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
    dbDelta($sql);
}
add_action('init', 'create_custom_order_meta_table');

前端定制化选项实现

动态选项表单生成

使用Product Add-Ons结合自定义代码创建灵活的前端界面:

/**
 * 为定制产品生成动态选项表单
 * @param int $product_id 产品ID
 * @return string 生成的HTML表单
 */
function generate_customization_form($product_id) {
    ob_start();
    
    // 获取产品定制选项配置
    $options = get_post_meta($product_id, '_custom_options', true);
    
    if (!empty($options) && is_array($options)) {
        echo '<div class="custom-options-wrapper">';
        echo '<h3>定制选项</h3>';
        
        foreach ($options as $index => $option) {
            echo '<div class="custom-option-group">';
            echo '<label for="option-' . $index . '">' . esc_html($option['label']) . '</label>';
            
            switch ($option['type']) {
                case 'select':
                    echo '<select id="option-' . $index . '" 
                            name="custom_options[' . $index . ']" 
                            class="custom-option-select"
                            data-price-adjust="' . esc_attr($option['price_adjust']) . '">';
                    foreach ($option['choices'] as $value => $label) {
                        echo '<option value="' . esc_attr($value) . '">' . esc_html($label) . '</option>';
                    }
                    echo '</select>';
                    break;
                    
                case 'text':
                    echo '<input type="text" 
                            id="option-' . $index . '" 
                            name="custom_options[' . $index . ']" 
                            placeholder="' . esc_attr($option['placeholder']) . '"
                            maxlength="' . esc_attr($option['maxlength']) . '">';
                    break;
                    
                case 'file':
                    echo '<input type="file" 
                            id="option-' . $index . '" 
                            name="custom_options[' . $index . ']"
                            accept="' . esc_attr($option['accept']) . '">';
                    break;
            }
            
            if (!empty($option['description'])) {
                echo '<p class="description">' . esc_html($option['description']) . '</p>';
            }
            
            echo '</div>';
        }
        
        echo '</div>';
        
        // 实时价格计算脚本
        ?>
        <script>
        jQuery(document).ready(function($) {
            // 监听定制选项变化
            $('.custom-option-select, .custom-option-input').on('change input', function() {
                calculateCustomPrice();
            });
            
            function calculateCustomPrice() {
                let basePrice = <?php echo get_post_meta($product_id, '_price', true); ?>;
                let extraPrice = 0;
                
                // 计算所有选项的附加价格
                $('[data-price-adjust]').each(function() {
                    let adjustment = parseFloat($(this).data('price-adjust')) || 0;
                    extraPrice += adjustment;
                });
                
                // 更新显示价格
                let totalPrice = basePrice + extraPrice;
                $('.product-price .amount').text('¥' + totalPrice.toFixed(2));
            }
        });
        </script>
        <?php
    }
    
    return ob_get_clean();
}

后端订单处理逻辑

定制数据保存与验证

确保定制数据正确保存到订单中:

/**
 * 保存定制选项到订单项元数据
 * @param int $item_id 订单项ID
 * @param array $cart_item 购物车项目数据
 */
function save_custom_options_to_order($item_id, $cart_item) {
    if (isset($cart_item['custom_options'])) {
        // 保存每个定制选项
        foreach ($cart_item['custom_options'] as $option_key => $option_value) {
            wc_add_order_item_meta(
                $item_id,
                'custom_' . $option_key,
                $option_value
            );
        }
    }
    
    // 保存上传的文件(如果有)
    if (isset($cart_item['custom_files'])) {
        foreach ($cart_item['custom_files'] as $file_key => $file_data) {
            // 将文件从临时位置移动到永久目录
            $upload_dir = wp_upload_dir();
            $custom_dir = $upload_dir['basedir'] . '/custom-orders/';
            
            if (!file_exists($custom_dir)) {
                wp_mkdir_p($custom_dir);
            }
            
            $new_filename = uniqid() . '_' . sanitize_file_name($file_data['name']);
            $new_filepath = $custom_dir . $new_filename;
            
            if (move_uploaded_file($file_data['tmp_name'], $new_filepath)) {
                wc_add_order_item_meta(
                    $item_id,
                    'custom_file_' . $file_key,
                    $new_filename
                );
            }
        }
    }
}
add_action('woocommerce_checkout_create_order_line_item', 'save_custom_options_to_order', 10, 2);

订单处理工作流

创建定制订单的特殊处理流程:

/**
 * 定制订单处理工作流
 * @param int $order_id 订单ID
 */
function process_custom_order_workflow($order_id) {
    $order = wc_get_order($order_id);
    
    // 检查是否为定制订单
    $is_custom_order = false;
    foreach ($order->get_items() as $item) {
        $item_meta = $item->get_meta_data();
        foreach ($item_meta as $meta) {
            if (strpos($meta->key, 'custom_') === 0) {
                $is_custom_order = true;
                break 2;
            }
        }
    }
    
    if ($is_custom_order) {
        // 添加定制订单标记
        update_post_meta($order_id, '_is_custom_order', 'yes');
        
        // 设置特殊订单状态
        $order->update_status('custom-processing', '定制订单已接收,开始处理');
        
        // 发送定制确认邮件
        send_custom_order_confirmation($order_id);
        
        // 创建生产任务
        create_production_task($order_id);
    }
}

/**
 * 创建生产任务
 * @param int $order_id 订单ID
 */
function create_production_task($order_id) {
    // 获取订单中的定制信息
    $order = wc_get_order($order_id);
    $custom_data = [];
    
    foreach ($order->get_items() as $item_id => $item) {
        $item_meta = $item->get_meta_data();
        foreach ($item_meta as $meta) {
            if (strpos($meta->key, 'custom_') === 0) {
                $custom_data[$meta->key] = $meta->value;
            }
        }
    }
    
    // 创建生产任务记录
    $task_id = wp_insert_post([
        'post_title' => '生产任务 - 订单#' . $order_id,
        'post_type' => 'production_task',
        'post_status' => 'publish',
        'meta_input' => [
            'order_id' => $order_id,
            'custom_data' => serialize($custom_data),
            'task_status' => 'pending',
            'assigned_to' => '',
            'due_date' => date('Y-m-d', strtotime('+3 days')),
            'priority' => 'normal'
        ]
    ]);
    
    return $task_id;
}
add_action('woocommerce_thankyou', 'process_custom_order_workflow');

管理界面优化

定制订单管理面板

为管理员提供专门的定制订单管理界面:

/**
 * 添加定制订单管理列
 * @param array $columns 现有列
 * @return array 修改后的列
 */
function add_custom_order_admin_columns($columns) {
    $new_columns = [];
    
    foreach ($columns as $key => $column) {
        $new_columns[$key] = $column;
        
        if ($key === 'order_status') {
            $new_columns['custom_type'] = '订单类型';
            $new_columns['production_status'] = '生产状态';
        }
    }
    
    return $new_columns;
}

/**
 * 显示定制订单列内容
 * @param string $column 列名
 * @param int $order_id 订单ID
 */
function show_custom_order_admin_column_content($column, $order_id) {
    $order = wc_get_order($order_id);
    
    switch ($column) {
        case 'custom_type':
            $is_custom = get_post_meta($order_id, '_is_custom_order', true);
            echo $is_custom === 'yes' ? 
                 '<span class="dashicons dashicons-admin-customizer" title="定制订单"></span> 定制订单' : 
                 '标准订单';
            break;
            
        case 'production_status':
            $task_status = get_post_meta($order_id, '_production_status', true);
            $status_labels = [
                'pending' => '<span class="status-pending">待处理</span>',
                'in_progress' => '<span class="status-in-progress">生产中</span>',
                'quality_check' => '<span class="status-quality">质检中</span>',
                'completed' => '<span class="status-completed">已完成</span>'
            ];
            echo isset($status_labels[$task_status]) ? 
                 $status_labels[$task_status] : 
                 '<span class="status-unknown">未设置</span>';
            break;
    }
}
add_filter('manage_shop_order_posts_columns', 'add_custom_order_admin_columns');
add_action('manage_shop_order_posts_custom_column', 'show_custom_order_admin_column_content', 10, 2);

客户沟通与进度跟踪

客户门户定制视图

为客户提供订单进度跟踪界面:

/**
 * 在客户账户页面添加定制订单跟踪
 */
function add_custom_order_tracking_to_account() {
    // 获取当前用户的定制订单
    $customer_orders = wc_get_orders([
        'customer_id' => get_current_user_id(),
        'meta_key' => '_is_custom_order',
        'meta_value' => 'yes',
        'limit' => 10
    ]);
    
    if (!empty($customer_orders)) {
        echo '<h2>我的定制订单</h2>';
        echo '<div class="custom-orders-tracking">';
        
        foreach ($customer_orders as $order) {
            $order_id = $order->get_id();
            $production_status = get_post_meta($order_id, '_production_status', true);
            
            echo '<div class="custom-order-card">';
            echo '<h3>订单 #' . $order_id . '</h3>';
            echo '<p>状态: ' . wc_get_order_status_name($order->get_status()) . '</p>';
            echo '<p>生产状态: ' . get_production_status_label($production_status) . '</p>';
            
            // 显示进度条
            echo '<div class="production-progress">';
            echo get_production_progress_bar($production_status);
            echo '</div>';
            
            echo '</div>';
        }
        
        echo '</div>';
    }
}
add_action('woocommerce_account_content', 'add_custom_order_tracking_to_account');

性能优化与扩展建议

缓存策略

对于频繁访问的定制选项数据,实施适当的缓存:

/**
 * 获取带缓存的定制选项配置
 * @param int $product_id 产品ID
 * @return array 选项配置
 */
function get_cached_custom_options($product_id) {
    $cache_key = 'custom_options_' . $product_id;
    $options = wp_cache_get($cache_key, 'products');
    
    if (false === $options) {
        $options = get_post_meta($product_id, '_custom_options', true);
        
        if (empty($options)) {
            $options = [];
        }
        
        wp_cache_set($cache_key, $options, 'products', 3600); // 缓存1小时
    }
    
    return $options;
}

扩展性考虑

  1. API集成:为生产系统提供REST API接口
  2. 批量操作:添加批量处理定制订单的功能
  3. 自动化规则:根据订单特征自动分配生产资源
  4. 数据分析:收集定制偏好数据用于产品开发

总结

通过本教程的实现,您可以在WordPress中建立一个完整的小批量定制订单处理系统。这个方案提供了从前端定制界面到后端生产管理的全流程解决方案,具有高度灵活性和可扩展性。关键成功因素包括:清晰的选项设计、可靠的数据存储、高效的工作流程和透明的客户沟通。

随着业务增长,您可以在此基础上进一步扩展功能,如集成ERP系统、添加AI推荐选项或实现更复杂的定价策略。柔性处理系统的核心在于平衡标准化与个性化,在满足客户定制需求的同时保持运营效率。

记住,每个企业的定制需求都有所不同,建议根据实际业务场景调整和优化这个基础框架,打造最适合您业务的小批量定制订单处理解决方案。

高级定制功能实现

条件逻辑与选项联动

实现智能选项显示,根据用户选择动态展示相关选项:

/**
 * 条件逻辑选项系统
 * 根据用户选择显示/隐藏相关选项
 */
class Conditional_Options_System {
    
    private $product_id;
    private $conditions;
    
    public function __construct($product_id) {
        $this->product_id = $product_id;
        $this->conditions = $this->load_conditions();
    }
    
    /**
     * 加载条件规则
     */
    private function load_conditions() {
        return get_post_meta($this->product_id, '_conditional_rules', true) ?: [];
    }
    
    /**
     * 生成带条件逻辑的选项表单
     */
    public function render_conditional_form() {
        ob_start();
        ?>
        <div id="conditional-options-container" data-product="<?php echo $this->product_id; ?>">
            <?php $this->render_option_groups(); ?>
        </div>
        
        <script type="text/javascript">
        jQuery(document).ready(function($) {
            // 初始化条件逻辑处理器
            var ConditionEngine = {
                rules: <?php echo json_encode($this->conditions); ?>,
                
                // 检查条件是否满足
                checkCondition: function(condition, currentValues) {
                    var targetValue = currentValues[condition.target_field];
                    
                    switch(condition.operator) {
                        case 'equals':
                            return targetValue == condition.value;
                        case 'not_equals':
                            return targetValue != condition.value;
                        case 'contains':
                            return targetValue.includes(condition.value);
                        case 'greater_than':
                            return parseFloat(targetValue) > parseFloat(condition.value);
                        default:
                            return false;
                    }
                },
                
                // 更新选项可见性
                updateVisibility: function() {
                    var self = this;
                    var currentValues = {};
                    
                    // 收集当前所有选项值
                    $('.option-field').each(function() {
                        var fieldName = $(this).data('field-name');
                        if ($(this).is('select')) {
                            currentValues[fieldName] = $(this).val();
                        } else if ($(this).is(':checkbox')) {
                            currentValues[fieldName] = $(this).is(':checked');
                        } else {
                            currentValues[fieldName] = $(this).val();
                        }
                    });
                    
                    // 应用所有规则
                    $.each(this.rules, function(index, rule) {
                        var shouldShow = self.checkCondition(rule, currentValues);
                        var $targetGroup = $('[data-option-group="' + rule.show_field + '"]');
                        
                        if (shouldShow) {
                            $targetGroup.slideDown(300);
                            $targetGroup.find('input, select, textarea').prop('disabled', false);
                        } else {
                            $targetGroup.slideUp(300);
                            $targetGroup.find('input, select, textarea').prop('disabled', true);
                        }
                    });
                }
            };
            
            // 监听所有选项变化
            $(document).on('change', '.option-field', function() {
                ConditionEngine.updateVisibility();
                calculateDynamicPrice();
            });
            
            // 初始更新
            ConditionEngine.updateVisibility();
        });
        </script>
        <?php
        return ob_get_clean();
    }
    
    /**
     * 渲染选项组
     */
    private function render_option_groups() {
        $option_groups = get_post_meta($this->product_id, '_option_groups', true);
        
        if (empty($option_groups)) {
            return '<p>暂无定制选项</p>';
        }
        
        foreach ($option_groups as $group) {
            echo '<div class="option-group" data-option-group="' . esc_attr($group['id']) . '">';
            echo '<h4>' . esc_html($group['title']) . '</h4>';
            
            if (!empty($group['description'])) {
                echo '<p class="group-description">' . esc_html($group['description']) . '</p>';
            }
            
            $this->render_field($group['field']);
            echo '</div>';
        }
    }
    
    /**
     * 渲染字段
     */
    private function render_field($field) {
        $field_id = 'option_' . $field['name'];
        
        echo '<div class="form-field">';
        echo '<label for="' . $field_id . '">' . esc_html($field['label']) . '</label>';
        
        switch ($field['type']) {
            case 'select':
                echo '<select id="' . $field_id . '" 
                        name="options[' . $field['name'] . ']" 
                        class="option-field" 
                        data-field-name="' . $field['name'] . '">';
                
                foreach ($field['choices'] as $value => $label) {
                    echo '<option value="' . esc_attr($value) . '">' . esc_html($label) . '</option>';
                }
                echo '</select>';
                break;
                
            case 'color':
                echo '<input type="color" 
                        id="' . $field_id . '"
                        name="options[' . $field['name'] . ']"
                        value="' . esc_attr($field['default'] ?? '#000000') . '"
                        class="option-field"
                        data-field-name="' . $field['name'] . '">';
                break;
                
            case 'measurement':
                echo '<div class="measurement-field">';
                echo '<input type="number" 
                        id="' . $field_id . '"
                        name="options[' . $field['name'] . '][value]"
                        min="' . ($field['min'] ?? 0) . '"
                        max="' . ($field['max'] ?? 1000) . '"
                        step="' . ($field['step'] ?? 1) . '"
                        class="option-field"
                        data-field-name="' . $field['name'] . '_value">';
                
                echo '<select name="options[' . $field['name'] . '][unit]"
                        class="option-field"
                        data-field-name="' . $field['name'] . '_unit">';
                
                foreach (['cm' => '厘米', 'mm' => '毫米', 'inch' => '英寸'] as $unit => $label) {
                    echo '<option value="' . $unit . '">' . $label . '</option>';
                }
                echo '</select>';
                echo '</div>';
                break;
        }
        
        if (!empty($field['description'])) {
            echo '<p class="field-description">' . esc_html($field['description']) . '</p>';
        }
        
        echo '</div>';
    }
}

// 使用示例
add_action('woocommerce_before_add_to_cart_button', function() {
    global $product;
    $conditional_system = new Conditional_Options_System($product->get_id());
    echo $conditional_system->render_conditional_form();
});

智能定价引擎

动态价格计算系统

/**
 * 智能定价引擎
 * 处理复杂的价格计算逻辑
 */
class Smart_Pricing_Engine {
    
    private $base_price;
    private $pricing_rules;
    
    public function __construct($product_id) {
        $this->base_price = get_post_meta($product_id, '_price', true);
        $this->pricing_rules = $this->load_pricing_rules($product_id);
    }
    
    /**
     * 加载定价规则
     */
    private function load_pricing_rules($product_id) {
        $rules = get_post_meta($product_id, '_pricing_rules', true);
        
        // 默认规则
        $default_rules = [
            'quantity_tiers' => [
                ['min' => 1, 'max' => 10, 'discount' => 0],
                ['min' => 11, 'max' => 50, 'discount' => 0.05],
                ['min' => 51, 'max' => 100, 'discount' => 0.10],
                ['min' => 101, 'max' => 0, 'discount' => 0.15]
            ],
            'material_costs' => [],
            'complexity_factors' => []
        ];
        
        return wp_parse_args($rules, $default_rules);
    }
    
    /**
     * 计算最终价格
     * @param array $options 用户选择的选项
     * @param int $quantity 数量
     * @return float 计算后的价格
     */
    public function calculate_price($options, $quantity = 1) {
        $price = floatval($this->base_price);
        
        // 应用数量阶梯折扣
        $price = $this->apply_quantity_discount($price, $quantity);
        
        // 应用选项附加费
        $price = $this->apply_option_surcharges($price, $options);
        
        // 应用材料成本
        $price = $this->apply_material_costs($price, $options);
        
        // 应用复杂度系数
        $price = $this->apply_complexity_factor($price, $options);
        
        // 应用促销规则
        $price = $this->apply_promotion_rules($price, $quantity);
        
        // 确保最低价格
        $price = max($price, $this->base_price * 0.5);
        
        return round($price, 2);
    }
    
    /**
     * 应用数量折扣
     */
    private function apply_quantity_discount($price, $quantity) {
        foreach ($this->pricing_rules['quantity_tiers'] as $tier) {
            if ($quantity >= $tier['min'] && 
                ($tier['max'] == 0 || $quantity <= $tier['max'])) {
                return $price * (1 - $tier['discount']);
            }
        }
        return $price;
    }
    
    /**
     * 应用选项附加费
     */
    private function apply_option_surcharges($price, $options) {
        if (empty($options)) return $price;
        
        $surcharge_rules = get_option('custom_option_surcharges', []);
        
        foreach ($options as $option_key => $option_value) {
            if (isset($surcharge_rules[$option_key][$option_value])) {
                $surcharge = $surcharge_rules[$option_key][$option_value];
                
                if (strpos($surcharge, '%') !== false) {
                    // 百分比附加费
                    $percentage = floatval(str_replace('%', '', $surcharge)) / 100;
                    $price += $this->base_price * $percentage;
                } else {
                    // 固定附加费
                    $price += floatval($surcharge);
                }
            }
        }
        
        return $price;
    }
    
    /**
     * 实时价格预览AJAX端点
     */
    public static function ajax_price_preview() {
        check_ajax_referer('custom_price_calculation', 'nonce');
        
        $product_id = intval($_POST['product_id']);
        $options = isset($_POST['options']) ? $_POST['options'] : [];
        $quantity = intval($_POST['quantity'] ?? 1);
        
        $engine = new self($product_id);
        $price = $engine->calculate_price($options, $quantity);
        
        wp_send_json_success([
            'price' => wc_price($price),
            'raw_price' => $price,
            'breakdown' => $engine->get_price_breakdown($options, $quantity)
        ]);
    }
    
    /**
     * 获取价格明细
     */
    public function get_price_breakdown($options, $quantity) {
        return [
            'base_price' => $this->base_price,
            'quantity_discount' => $this->calculate_quantity_discount($quantity),
            'option_surcharges' => $this->calculate_total_surcharges($options),
            'material_costs' => $this->calculate_material_costs($options),
            'final_price' => $this->calculate_price($options, $quantity)
        ];
    }
}

// 注册AJAX端点
add_action('wp_ajax_calculate_custom_price', ['Smart_Pricing_Engine', 'ajax_price_preview']);
add_action('wp_ajax_nopriv_calculate_custom_price', ['Smart_Pricing_Engine', 'ajax_price_preview']);

生产管理系统集成

生产任务自动分配

/**
 * 生产任务管理系统
 */
class Production_Management_System {
    
    /**
     * 自动分配生产任务
     */
    public function auto_assign_tasks() {
        global $wpdb;
        
        // 获取待分配的任务
        $pending_tasks = $wpdb->get_results("
            SELECT * FROM {$wpdb->prefix}production_tasks 
            WHERE assigned_to = '' 
            AND task_status = 'pending'
            AND due_date >= CURDATE()
            ORDER BY priority DESC, created_at ASC
        ");
        
        // 获取可用技术人员
        $technicians = $this->get_available_technicians();
        
        foreach ($pending_tasks as $task) {
            $best_technician = $this->find_best_technician($task, $technicians);
            
            if ($best_technician) {
                $this->assign_task($task->id, $best_technician);
                $this->update_technician_workload($best_technician, $task->estimated_hours);
            }
        }
    }
    
    /**
     * 智能匹配最佳技术人员
     */
    private function find_best_technician($task, $technicians) {
        $best_score = 0;
        $best_technician = null;
        
        foreach ($technicians as $tech) {
            $score = $this->calculate_match_score($task, $tech);
            
            if ($score > $best_score && $this->can_take_more_work($tech)) {
                $best_score = $score;
                $best_technician = $tech['id'];
            }
        }
        
        return $best_technician;
    }
    
    /**
     * 计算匹配分数
     */
    private function calculate_match_score($task, $technician) {
        $score = 0;
        
        // 技能匹配(40%)
        $required_skills = json_decode($task->required_skills, true);
        $tech_skills = json_decode($technician['skills'], true);
        
        $skill_match = count(array_intersect($required_skills, $tech_skills)) 
                     / max(count($required_skills), 1);
        $score += $skill_match * 40;
        
        // 工作量平衡(30%)
        $workload_factor = 1 - ($technician['current_load'] / $technician['max_capacity']);
        $score += $workload_factor * 30;
        
        // 历史完成质量(20%)
        $quality_score = $technician['avg_quality'] / 100;
        $score += $quality_score * 20;
        
        // 紧急程度匹配(10%)
        if ($task->priority === 'urgent' && $technician['can_handle_urgent']) {
            $score += 10;
        }
        
        return $score;
    }
    
    /**
     * 生产进度跟踪
     */
    public function track_production_progress($order_id) {
        $task = $this->get_task_by_order($order_id);
        
        if (!$task) {
            return null;
        }
        
        $progress = [
            'design' => $this->get_stage_progress($task->id, 'design'),
            'material_prep' => $this->get_stage_progress($task->id, 'material_prep'),
            'production' => $this->get_stage_progress($task->id, 'production'),
            'quality_check' => $this->get_stage_progress($task->id, 'quality_check'),
            'packaging' => $this->get_stage_progress($task->id, 'packaging')
        ];
        
        // 计算总体进度
        $total_progress = array_sum($progress) / count($progress);
        
        // 更新订单进度
        update_post_meta($order_id, '_production_progress', $total_progress);
        
        // 如果完成,更新订单状态
        if ($total_progress >= 100 && $task->task_status !== 'completed') {
            $this->complete_task($task->id);
            $this->notify_order_completion($order_id);
        }
        
        return $progress;
    }
    
    /**
     * 生成生产报告
     */
    public function generate_production_report($start_date, $end_date) {
        global $wpdb;
        
        $report = $wpdb->get_results($wpdb->prepare("
            SELECT 
                DATE(created_at) as date,
                COUNT(*) as total_tasks,
                SUM(CASE WHEN task_status = 'completed' THEN 1 ELSE 0 END) as completed_tasks,
                AVG(TIMESTAMPDIFF(HOUR, created_at, completed_at)) as avg_completion_hours,
                SUM(estimated_hours) as total_estimated_hours,
                SUM(actual_hours) as total_actual_hours
            FROM {$wpdb->prefix}production_tasks
            WHERE created_at BETWEEN %s AND %s
            GROUP BY DATE(created_at)
            ORDER BY date ASC
        ", $start_date, $end_date));
        
        // 计算效率指标
        foreach ($report as &$day) {
            if ($day->total_estimated_hours > 0) {
                $day->efficiency = ($day->total_estimated_hours / $day->total_actual_hours) * 100;
            } else {
                $day->efficiency = 0;
            }
            
            $day->completion_rate = ($day->completed_tasks / $day->total_tasks) * 100;
        }
        
        return $report;
    }
}

// 定时任务:自动分配生产任务
add_action('hourly_production_assign', function() {
    $pms = new Production_Management_System();
    $pms->auto_assign_tasks();
});

// 添加定时任务
if (!wp_next_scheduled('hourly_production_assign')) {
    wp_schedule_event(time(), 'hourly', 'hourly_production_assign');
}

客户沟通自动化

智能

本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/5779.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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