文章目录
-
- 在当今快速变化的市场环境中,企业需要一个能够灵活响应需求波动的供应链系统。传统的供应链管理系统往往僵化且成本高昂,而基于WordPress搭建的柔性供应链系统则提供了经济、灵活且可扩展的解决方案。本教程将指导您从零开始构建一个功能完善的柔性供应链系统。
-
- <?php /** * 注册供应商自定义帖子类型 */ function register_supplier_post_type() { $labels = array( 'name' => '供应商', 'singular_name' => '供应商', 'menu_name' => '供应链管理', 'add_new' => '添加供应商', 'add_new_item' => '添加新供应商', 'edit_item' => '编辑供应商', 'new_item' => '新供应商', 'view_item' => '查看供应商', 'search_items' => '搜索供应商', 'not_found' => '未找到供应商', 'not_found_in_trash' => '回收站中无供应商' ); $args = array( 'labels' => $labels, 'public' => false, 'publicly_queryable' => false, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array('slug' => 'supplier'), 'capability_type' => 'post', 'has_archive' => false, 'hierarchical' => false, 'menu_position' => 30, 'menu_icon' => 'dashicons-truck', 'supports' => array('title', 'editor', 'custom-fields') ); register_post_type('supplier', $args); } add_action('init', 'register_supplier_post_type'); ?>
- 创建供应商管理后台界面,包含添加、编辑、删除和查看供应商详细信息的功能。
-
- 集成WooCommerce订单系统,实现订单自动处理和供应商分配。
- <?php /** * 物流跟踪管理器 * 集成第三方物流API */ class LogisticsTracker { private $api_key; private $api_url = 'https://api.logistics.example.com/v1/'; public function __construct($api_key) { $this->api_key = $api_key; } /** * 创建物流跟踪 * @param array $shipment_data 货运数据 * @return array|bool API响应或false */ public function create_tracking($shipment_data) { $endpoint = $this->api_url . 'tracking/create'; $headers = array( 'Authorization' => 'Bearer ' . $this->api_key, 'Content-Type' => 'application/json' ); $body = wp_json_encode($shipment_data); $response = wp_remote_post($endpoint, array( 'headers' => $headers, 'body' => $body, 'timeout' => 30 )); if (is_wp_error($response)) { error_log('物流API错误: ' . $response->get_error_message()); return false; } $response_code = wp_remote_retrieve_response_code($response); $response_body = wp_remote_retrieve_body($response); if ($response_code === 200) { return json_decode($response_body, true); } else { error_log('物流API错误,状态码: ' . $response_code); return false; } } /** * 获取跟踪信息 * @param string $tracking_number 跟踪号码 * @return array|bool 跟踪信息或false */ public function get_tracking_info($tracking_number) { $endpoint = $this->api_url . 'tracking/' . urlencode($tracking_number); $headers = array( 'Authorization' => 'Bearer ' . $this->api_key ); $response = wp_remote_get($endpoint, array( 'headers' => $headers, 'timeout' => 15 )); if (is_wp_error($response)) { return false; } $response_code = wp_remote_retrieve_response_code($response); $response_body = wp_remote_retrieve_body($response); if ($response_code === 200) { return json_decode($response_body, true); } return false; } } ?>
-
- 使用WordPress对象缓存减少数据库查询 对大数据表添加适当索引 实现分页加载和延迟加载 使用CDN加速静态资源
- <?php /** * 供应链系统安全加固 */ class SupplyChainSecurity { /** * 验证用户权限 * @param string $capability 所需权限 * @return bool 是否有权限 */ public static function check_capability($capability = 'manage_woocommerce') { if (!current_user_can($capability)) { wp_die('您没有足够的权限访问此页面。'); return false; } return true; } /** * 数据输入清理 * @param mixed $data 输入数据 * @return mixed 清理后的数据 */ public static function sanitize_input($data) { if (is_array($data)) { foreach ($data as $key => $value) { $data[$key] = self::sanitize_input($value); } return $data; } // 移除危险标签和脚本 $data = wp_strip_all_tags($data); $data = esc_sql($data); return $data; } /** * 防止SQL注入 * @param string $query SQL查询 * @param array $params 参数数组 * @return string 安全的查询 */ public static function prepare_sql_query($query, $params = array()) { global $wpdb; if (empty($params)) { return $query; } return $wpdb->prepare($query, $params); } /** * 记录安全事件 * @param string $event 事件描述 * @param string $severity 严重程度:low, medium, high */ public static function log_security_event($event, $severity = 'medium') { $log_entry = sprintf( "[%s] [%s] %sn", current_time('mysql'), strtoupper($severity), $event ); $log_file = WP_CONTENT_DIR . '/supply-chain-security.log'; // 限制日志文件大小 if (file_exists($log_file) && filesize($log_file) > 10485760) { // 10MB $backup_file = $log_file . '.' . date('Y-m-d'); rename($log_file, $backup_file); } error_log($log_entry, 3, $log_file); } } ?>
-
- <?php /** * 供应链系统单元测试 */ class SupplyChainTests extends WP_UnitTestCase { /** * 测试库存更新功能 */ public function test_inventory_update() { // 创建测试产品 $product_id = $this->factory->post->create(array( 'post_type' => 'product' )); // 初始库存应为0 $this->assertTrue(InventoryManager::update_inventory($product_id, 100)); global $wpdb; $table_name = $wpdb->prefix . 'supply_chain_inventory'; $inventory = $wpdb->get_row($wpdb->prepare( "SELECT quantity FROM $table_name WHERE product_id = %d", $product_id )); $this->assertEquals(100, $inventory->quantity); // 测试减少库存 $this->assertTrue(InventoryManager::update_inventory($product_id, -30)); $inventory = $wpdb->get_row($wpdb->prepare( "SELECT quantity FROM $table_name WHERE product_id = %d", $product_id )); $this->assertEquals(70, $inventory->quantity); // 测试库存不会低于0 $this->assertTrue(InventoryManager::update_inventory($product_id, -100)); $inventory = $wpdb->get_row($wpdb->prepare( "SELECT quantity FROM $table_name WHERE product_id = %d", $product_id )); $this->assertEquals(0, $inventory->quantity); } /** * 测试供应商自定义帖子类型 */ public function test_supplier_post_type() { $post_types = get_post_types(); $this->assertArrayHasKey('supplier', $post_types); // 创建测试供应商 $supplier_id = $this->factory->post->create(array( 'post_type' => 'supplier', 'post_title' => '测试供应商' )); $supplier = get_post($supplier_id); $this->assertEquals('supplier', $supplier->post_type); $this->assertEquals('测试供应商', $supplier->post_title); } /** * 测试API权限验证 */ public function test_api_permission() { $api = new SupplyChainAPI(); // 测试无权限情况 $request = new WP_REST_Request(); $this->assertFalse($api->check_api_permission($request)); // 创建有权限的用户 $user_id = $this->factory->user->create(array( 'role' => 'administrator' )); wp_set_current_user($user_id); $this->assertTrue($api->check_api_permission($request)); } } /** * 集成测试:完整订单流程 */ function test_complete_order_workflow() { // 1. 创建供应商 // 2. 添加产品库存 // 3. 创建客户订单 // 4. 验证库存扣减 // 5. 生成采购订单 // 6. 验证整个流程 } ?>
- 环境检查 PHP版本 ≥ 7.4 MySQL版本 ≥ 5.7 WordPress版本 ≥ 6.0 WooCommerce插件已安装 数据库备份 -- 备份现有数据 mysqldump -u username -p database_name > backup.sql -- 创建新表 source supply_chain_tables.sql 文件部署 /wp-content/plugins/supply-chain-system/ ├── supply-chain.php # 主插件文件 ├── includes/ # 包含文件 │ ├── class-inventory.php │ ├── class-suppliers.php │ ├── class-api.php │ └── class-analytics.php ├── assets/ # 静态资源 │ ├── css/ │ ├── js/ │ └── images/ ├── templates/ # 模板文件 └── uninstall.php # 卸载脚本 配置步骤 激活插件 运行数据库安装脚本 配置API密钥 设置初始供应商 配置库存参数
-
- 数据库优化 -- 每周执行一次 OPTIMIZE TABLE wp_supply_chain_inventory; ANALYZE TABLE wp_supply_chain_purchase_orders; -- 清理旧日志 DELETE FROM wp_supply_chain_logs WHERE log_date < DATE_SUB(NOW(), INTERVAL 90 DAY); 性能监控 <?php /** * 系统性能监控 */ class PerformanceMonitor { public static function log_performance() { $memory_usage = memory_get_usage(true) / 1024 / 1024; // MB $load_time = timer_stop(0, 3); // 秒 if ($memory_usage > 256 || $load_time > 3) { error_log(sprintf( "性能警报: 内存使用 %.2fMB, 加载时间 %.3fs", $memory_usage, $load_time )); } } } add_action('shutdown', array('PerformanceMonitor', 'log_performance')); ?>
- 多仓库支持 // 扩展库存表支持多仓库 ALTER TABLE wp_supply_chain_inventory ADD warehouse_id INT(11) AFTER product_id, ADD INDEX (warehouse_id); 预测分析模块 class DemandForecaster { public function predict_demand($product_id, $period = 'monthly') { // 使用历史销售数据进行需求预测 // 可集成机器学习算法 } } 移动端应用 // 使用React Native或Flutter开发移动应用
在当今快速变化的市场环境中,企业需要一个能够灵活响应需求波动的供应链系统。传统的供应链管理系统往往僵化且成本高昂,而基于WordPress搭建的柔性供应链系统则提供了经济、灵活且可扩展的解决方案。本教程将指导您从零开始构建一个功能完善的柔性供应链系统。
我们的柔性供应链系统将包含以下核心模块:
- 供应商管理模块
- 库存管理模块
- 订单处理模块
- 物流跟踪模块
- 数据分析与报告模块
- WordPress 6.0+
- WooCommerce插件
- 自定义PHP开发
- MySQL数据库
- REST API接口
首先确保您已安装最新版本的WordPress,并完成基本配置。建议使用支持PHP 7.4+和MySQL 5.7+的主机环境。
在WordPress后台安装以下核心插件:
- WooCommerce - 电子商务基础
- Advanced Custom Fields - 自定义字段管理
- WP REST API - API接口支持
我们需要创建几个核心数据表来支持供应链系统:
<?php
/**
* 创建供应链系统所需的数据表
* 这段代码应放在插件激活钩子中执行
*/
function create_supply_chain_tables() {
global $wpdb;
$charset_collate = $wpdb->get_charset_collate();
// 供应商表
$suppliers_table = $wpdb->prefix . 'supply_chain_suppliers';
$suppliers_sql = "CREATE TABLE IF NOT EXISTS $suppliers_table (
supplier_id INT(11) NOT NULL AUTO_INCREMENT,
supplier_name VARCHAR(255) NOT NULL,
contact_person VARCHAR(100),
email VARCHAR(100),
phone VARCHAR(50),
address TEXT,
rating DECIMAL(3,2) DEFAULT 0.00,
lead_time_days INT(5) DEFAULT 7,
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (supplier_id)
) $charset_collate;";
// 库存表
$inventory_table = $wpdb->prefix . 'supply_chain_inventory';
$inventory_sql = "CREATE TABLE IF NOT EXISTS $inventory_table (
inventory_id INT(11) NOT NULL AUTO_INCREMENT,
product_id INT(11) NOT NULL,
supplier_id INT(11),
quantity INT(11) DEFAULT 0,
reorder_level INT(11) DEFAULT 10,
location VARCHAR(100),
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (inventory_id),
KEY product_id (product_id),
KEY supplier_id (supplier_id)
) $charset_collate;";
// 采购订单表
$purchase_orders_table = $wpdb->prefix . 'supply_chain_purchase_orders';
$purchase_orders_sql = "CREATE TABLE IF NOT EXISTS $purchase_orders_table (
order_id INT(11) NOT NULL AUTO_INCREMENT,
supplier_id INT(11) NOT NULL,
order_date DATE NOT NULL,
expected_delivery DATE,
status ENUM('pending', 'confirmed', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
total_amount DECIMAL(10,2),
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (order_id)
) $charset_collate;";
require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
dbDelta($suppliers_sql);
dbDelta($inventory_sql);
dbDelta($purchase_orders_sql);
}
?>
<?php
/**
* 注册供应商自定义帖子类型
*/
function register_supplier_post_type() {
$labels = array(
'name' => '供应商',
'singular_name' => '供应商',
'menu_name' => '供应链管理',
'add_new' => '添加供应商',
'add_new_item' => '添加新供应商',
'edit_item' => '编辑供应商',
'new_item' => '新供应商',
'view_item' => '查看供应商',
'search_items' => '搜索供应商',
'not_found' => '未找到供应商',
'not_found_in_trash' => '回收站中无供应商'
);
$args = array(
'labels' => $labels,
'public' => false,
'publicly_queryable' => false,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'supplier'),
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'menu_position' => 30,
'menu_icon' => 'dashicons-truck',
'supports' => array('title', 'editor', 'custom-fields')
);
register_post_type('supplier', $args);
}
add_action('init', 'register_supplier_post_type');
?>
<?php
/**
* 注册供应商自定义帖子类型
*/
function register_supplier_post_type() {
$labels = array(
'name' => '供应商',
'singular_name' => '供应商',
'menu_name' => '供应链管理',
'add_new' => '添加供应商',
'add_new_item' => '添加新供应商',
'edit_item' => '编辑供应商',
'new_item' => '新供应商',
'view_item' => '查看供应商',
'search_items' => '搜索供应商',
'not_found' => '未找到供应商',
'not_found_in_trash' => '回收站中无供应商'
);
$args = array(
'labels' => $labels,
'public' => false,
'publicly_queryable' => false,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => array('slug' => 'supplier'),
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => false,
'menu_position' => 30,
'menu_icon' => 'dashicons-truck',
'supports' => array('title', 'editor', 'custom-fields')
);
register_post_type('supplier', $args);
}
add_action('init', 'register_supplier_post_type');
?>
创建供应商管理后台界面,包含添加、编辑、删除和查看供应商详细信息的功能。
<?php
/**
* 库存管理类
* 处理库存相关操作
*/
class InventoryManager {
/**
* 更新库存数量
* @param int $product_id 产品ID
* @param int $quantity_change 数量变化(正数为增加,负数为减少)
* @return bool 操作是否成功
*/
public static function update_inventory($product_id, $quantity_change) {
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
// 检查库存记录是否存在
$existing = $wpdb->get_var($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
if ($existing === null) {
// 创建新的库存记录
$result = $wpdb->insert(
$table_name,
array(
'product_id' => $product_id,
'quantity' => max(0, $quantity_change),
'last_updated' => current_time('mysql')
),
array('%d', '%d', '%s')
);
} else {
// 更新现有库存
$new_quantity = max(0, $existing + $quantity_change);
$result = $wpdb->update(
$table_name,
array(
'quantity' => $new_quantity,
'last_updated' => current_time('mysql')
),
array('product_id' => $product_id),
array('%d', '%s'),
array('%d')
);
}
// 检查是否需要重新订货
if ($result !== false) {
self::check_reorder_level($product_id);
}
return $result !== false;
}
/**
* 检查库存是否低于重新订货水平
* @param int $product_id 产品ID
*/
private static function check_reorder_level($product_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity, reorder_level FROM $table_name WHERE product_id = %d",
$product_id
));
if ($inventory && $inventory->quantity <= $inventory->reorder_level) {
// 触发重新订货通知
self::send_reorder_alert($product_id, $inventory->quantity);
}
}
/**
* 发送重新订货警报
* @param int $product_id 产品ID
* @param int $current_quantity 当前库存数量
*/
private static function send_reorder_alert($product_id, $current_quantity) {
// 获取产品信息
$product = wc_get_product($product_id);
if ($product) {
$admin_email = get_option('admin_email');
$subject = '库存警报:产品需要重新订货';
$message = sprintf(
"产品:%s (ID: %d)n当前库存:%dn请及时联系供应商补充库存。",
$product->get_name(),
$product_id,
$current_quantity
);
wp_mail($admin_email, $subject, $message);
}
}
}
?>
<?php
/**
* 库存管理类
* 处理库存相关操作
*/
class InventoryManager {
/**
* 更新库存数量
* @param int $product_id 产品ID
* @param int $quantity_change 数量变化(正数为增加,负数为减少)
* @return bool 操作是否成功
*/
public static function update_inventory($product_id, $quantity_change) {
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
// 检查库存记录是否存在
$existing = $wpdb->get_var($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
if ($existing === null) {
// 创建新的库存记录
$result = $wpdb->insert(
$table_name,
array(
'product_id' => $product_id,
'quantity' => max(0, $quantity_change),
'last_updated' => current_time('mysql')
),
array('%d', '%d', '%s')
);
} else {
// 更新现有库存
$new_quantity = max(0, $existing + $quantity_change);
$result = $wpdb->update(
$table_name,
array(
'quantity' => $new_quantity,
'last_updated' => current_time('mysql')
),
array('product_id' => $product_id),
array('%d', '%s'),
array('%d')
);
}
// 检查是否需要重新订货
if ($result !== false) {
self::check_reorder_level($product_id);
}
return $result !== false;
}
/**
* 检查库存是否低于重新订货水平
* @param int $product_id 产品ID
*/
private static function check_reorder_level($product_id) {
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity, reorder_level FROM $table_name WHERE product_id = %d",
$product_id
));
if ($inventory && $inventory->quantity <= $inventory->reorder_level) {
// 触发重新订货通知
self::send_reorder_alert($product_id, $inventory->quantity);
}
}
/**
* 发送重新订货警报
* @param int $product_id 产品ID
* @param int $current_quantity 当前库存数量
*/
private static function send_reorder_alert($product_id, $current_quantity) {
// 获取产品信息
$product = wc_get_product($product_id);
if ($product) {
$admin_email = get_option('admin_email');
$subject = '库存警报:产品需要重新订货';
$message = sprintf(
"产品:%s (ID: %d)n当前库存:%dn请及时联系供应商补充库存。",
$product->get_name(),
$product_id,
$current_quantity
);
wp_mail($admin_email, $subject, $message);
}
}
}
?>
集成WooCommerce订单系统,实现订单自动处理和供应商分配。
<?php
/**
* 物流跟踪管理器
* 集成第三方物流API
*/
class LogisticsTracker {
private $api_key;
private $api_url = 'https://api.logistics.example.com/v1/';
public function __construct($api_key) {
$this->api_key = $api_key;
}
/**
* 创建物流跟踪
* @param array $shipment_data 货运数据
* @return array|bool API响应或false
*/
public function create_tracking($shipment_data) {
$endpoint = $this->api_url . 'tracking/create';
$headers = array(
'Authorization' => 'Bearer ' . $this->api_key,
'Content-Type' => 'application/json'
);
$body = wp_json_encode($shipment_data);
$response = wp_remote_post($endpoint, array(
'headers' => $headers,
'body' => $body,
'timeout' => 30
));
if (is_wp_error($response)) {
error_log('物流API错误: ' . $response->get_error_message());
return false;
}
$response_code = wp_remote_retrieve_response_code($response);
$response_body = wp_remote_retrieve_body($response);
if ($response_code === 200) {
return json_decode($response_body, true);
} else {
error_log('物流API错误,状态码: ' . $response_code);
return false;
}
}
/**
* 获取跟踪信息
* @param string $tracking_number 跟踪号码
* @return array|bool 跟踪信息或false
*/
public function get_tracking_info($tracking_number) {
$endpoint = $this->api_url . 'tracking/' . urlencode($tracking_number);
$headers = array(
'Authorization' => 'Bearer ' . $this->api_key
);
$response = wp_remote_get($endpoint, array(
'headers' => $headers,
'timeout' => 15
));
if (is_wp_error($response)) {
return false;
}
$response_code = wp_remote_retrieve_response_code($response);
$response_body = wp_remote_retrieve_body($response);
if ($response_code === 200) {
return json_decode($response_body, true);
}
return false;
}
}
?>
<?php
/**
* 物流跟踪管理器
* 集成第三方物流API
*/
class LogisticsTracker {
private $api_key;
private $api_url = 'https://api.logistics.example.com/v1/';
public function __construct($api_key) {
$this->api_key = $api_key;
}
/**
* 创建物流跟踪
* @param array $shipment_data 货运数据
* @return array|bool API响应或false
*/
public function create_tracking($shipment_data) {
$endpoint = $this->api_url . 'tracking/create';
$headers = array(
'Authorization' => 'Bearer ' . $this->api_key,
'Content-Type' => 'application/json'
);
$body = wp_json_encode($shipment_data);
$response = wp_remote_post($endpoint, array(
'headers' => $headers,
'body' => $body,
'timeout' => 30
));
if (is_wp_error($response)) {
error_log('物流API错误: ' . $response->get_error_message());
return false;
}
$response_code = wp_remote_retrieve_response_code($response);
$response_body = wp_remote_retrieve_body($response);
if ($response_code === 200) {
return json_decode($response_body, true);
} else {
error_log('物流API错误,状态码: ' . $response_code);
return false;
}
}
/**
* 获取跟踪信息
* @param string $tracking_number 跟踪号码
* @return array|bool 跟踪信息或false
*/
public function get_tracking_info($tracking_number) {
$endpoint = $this->api_url . 'tracking/' . urlencode($tracking_number);
$headers = array(
'Authorization' => 'Bearer ' . $this->api_key
);
$response = wp_remote_get($endpoint, array(
'headers' => $headers,
'timeout' => 15
));
if (is_wp_error($response)) {
return false;
}
$response_code = wp_remote_retrieve_response_code($response);
$response_body = wp_remote_retrieve_body($response);
if ($response_code === 200) {
return json_decode($response_body, true);
}
return false;
}
}
?>
<?php
/**
* 供应链分析报告生成器
*/
class SupplyChainAnalytics {
/**
* 计算关键绩效指标
* @param string $period 时间段:'daily', 'weekly', 'monthly'
* @return array KPI数据
*/
public static function calculate_kpis($period = 'monthly') {
global $wpdb;
$kpis = array();
// 计算订单履行率
$orders_table = $wpdb->prefix . 'posts';
$order_items_table = $wpdb->prefix . 'woocommerce_order_items';
$date_filter = self::get_date_filter($period);
// 总订单数
$total_orders = $wpdb->get_var("
SELECT COUNT(*) FROM $orders_table
WHERE post_type = 'shop_order'
AND post_status IN ('wc-completed', 'wc-processing')
AND post_date >= '$date_filter'
");
// 已完成的订单数
$fulfilled_orders = $wpdb->get_var("
SELECT COUNT(*) FROM $orders_table
WHERE post_type = 'shop_order'
AND post_status = 'wc-completed'
AND post_date >= '$date_filter'
");
$kpis['order_fulfillment_rate'] = $total_orders > 0 ?
round(($fulfilled_orders / $total_orders) * 100, 2) : 0;
// 计算平均订单处理时间
$processing_time = $wpdb->get_var("
SELECT AVG(TIMESTAMPDIFF(HOUR,
MIN(CASE WHEN meta_key = '_paid_date' THEN meta_value END),
MAX(CASE WHEN meta_key = '_completed_date' THEN meta_value END)
))
FROM $orders_table o
LEFT JOIN {$wpdb->prefix}postmeta pm ON o.ID = pm.post_id
WHERE o.post_type = 'shop_order'
AND o.post_status = 'wc-completed'
AND o.post_date >= '$date_filter'
GROUP BY o.ID
");
$kpis['avg_order_processing_hours'] = round($processing_time ?: 0, 1);
// 库存周转率计算
$inventory_table = $wpdb->prefix . 'supply_chain_inventory';
$inventory_data = $wpdb->get_results("
SELECT product_id, quantity, last_updated
FROM $inventory_table
WHERE last_updated >= '$date_filter'
");
// 这里可以添加更复杂的库存周转计算逻辑
$kpis['inventory_turnover'] = self::calculate_inventory_turnover($inventory_data);
return $kpis;
}
/**
* 根据时间段获取日期过滤器
*/
private static function get_date_filter($period) {
$date = new DateTime();
switch ($period) {
case 'daily':
$date->modify('-1 day');
break;
case 'weekly':
$date->modify('-1 week');
break;
case 'monthly':
default:
$date->modify('-1 month');
break;
}
return $date->format('Y-m-d H:i:s');
}
/**
* 计算库存周转率
*/
private static function calculate_inventory_turnover($inventory_data) {
// 简化的库存周转计算
// 实际应用中可能需要更复杂的逻辑
if (empty($inventory_data)) {
return 0;
}
$total_value = 0;
$total_quantity = 0;
foreach ($inventory_data as $item) {
$product = wc_get_product($item->product_id);
if ($product) {
$total_value += $product->get_price() * $item->quantity;
$total_quantity += $item->quantity;
}
}
// 这里使用简化的周转率计算
// 实际应基于销售成本和平均库存价值
return $total_quantity > 0 ? round($total_value / $total_quantity, 2) : 0;
}
}
?>
<?php
/**
* 供应链分析报告生成器
*/
class SupplyChainAnalytics {
/**
* 计算关键绩效指标
* @param string $period 时间段:'daily', 'weekly', 'monthly'
* @return array KPI数据
*/
public static function calculate_kpis($period = 'monthly') {
global $wpdb;
$kpis = array();
// 计算订单履行率
$orders_table = $wpdb->prefix . 'posts';
$order_items_table = $wpdb->prefix . 'woocommerce_order_items';
$date_filter = self::get_date_filter($period);
// 总订单数
$total_orders = $wpdb->get_var("
SELECT COUNT(*) FROM $orders_table
WHERE post_type = 'shop_order'
AND post_status IN ('wc-completed', 'wc-processing')
AND post_date >= '$date_filter'
");
// 已完成的订单数
$fulfilled_orders = $wpdb->get_var("
SELECT COUNT(*) FROM $orders_table
WHERE post_type = 'shop_order'
AND post_status = 'wc-completed'
AND post_date >= '$date_filter'
");
$kpis['order_fulfillment_rate'] = $total_orders > 0 ?
round(($fulfilled_orders / $total_orders) * 100, 2) : 0;
// 计算平均订单处理时间
$processing_time = $wpdb->get_var("
SELECT AVG(TIMESTAMPDIFF(HOUR,
MIN(CASE WHEN meta_key = '_paid_date' THEN meta_value END),
MAX(CASE WHEN meta_key = '_completed_date' THEN meta_value END)
))
FROM $orders_table o
LEFT JOIN {$wpdb->prefix}postmeta pm ON o.ID = pm.post_id
WHERE o.post_type = 'shop_order'
AND o.post_status = 'wc-completed'
AND o.post_date >= '$date_filter'
GROUP BY o.ID
");
$kpis['avg_order_processing_hours'] = round($processing_time ?: 0, 1);
// 库存周转率计算
$inventory_table = $wpdb->prefix . 'supply_chain_inventory';
$inventory_data = $wpdb->get_results("
SELECT product_id, quantity, last_updated
FROM $inventory_table
WHERE last_updated >= '$date_filter'
");
// 这里可以添加更复杂的库存周转计算逻辑
$kpis['inventory_turnover'] = self::calculate_inventory_turnover($inventory_data);
return $kpis;
}
/**
* 根据时间段获取日期过滤器
*/
private static function get_date_filter($period) {
$date = new DateTime();
switch ($period) {
case 'daily':
$date->modify('-1 day');
break;
case 'weekly':
$date->modify('-1 week');
break;
case 'monthly':
default:
$date->modify('-1 month');
break;
}
return $date->format('Y-m-d H:i:s');
}
/**
* 计算库存周转率
*/
private static function calculate_inventory_turnover($inventory_data) {
// 简化的库存周转计算
// 实际应用中可能需要更复杂的逻辑
if (empty($inventory_data)) {
return 0;
}
$total_value = 0;
$total_quantity = 0;
foreach ($inventory_data as $item) {
$product = wc_get_product($item->product_id);
if ($product) {
$total_value += $product->get_price() * $item->quantity;
$total_quantity += $item->quantity;
}
}
// 这里使用简化的周转率计算
// 实际应基于销售成本和平均库存价值
return $total_quantity > 0 ? round($total_value / $total_quantity, 2) : 0;
}
}
?>
- 使用WordPress对象缓存减少数据库查询
- 对大数据表添加适当索引
- 实现分页加载和延迟加载
- 使用CDN加速静态资源
<?php
/**
* 供应链系统安全加固
*/
class SupplyChainSecurity {
/**
* 验证用户权限
* @param string $capability 所需权限
* @return bool 是否有权限
*/
public static function check_capability($capability = 'manage_woocommerce') {
if (!current_user_can($capability)) {
wp_die('您没有足够的权限访问此页面。');
return false;
}
return true;
}
/**
* 数据输入清理
* @param mixed $data 输入数据
* @return mixed 清理后的数据
*/
public static function sanitize_input($data) {
if (is_array($data)) {
foreach ($data as $key => $value) {
$data[$key] = self::sanitize_input($value);
}
return $data;
}
// 移除危险标签和脚本
$data = wp_strip_all_tags($data);
$data = esc_sql($data);
return $data;
}
/**
* 防止SQL注入
* @param string $query SQL查询
* @param array $params 参数数组
* @return string 安全的查询
*/
public static function prepare_sql_query($query, $params = array()) {
global $wpdb;
if (empty($params)) {
return $query;
}
return $wpdb->prepare($query, $params);
}
/**
* 记录安全事件
* @param string $event 事件描述
* @param string $severity 严重程度:low, medium, high
*/
public static function log_security_event($event, $severity = 'medium') {
$log_entry = sprintf(
"[%s] [%s] %sn",
current_time('mysql'),
strtoupper($severity),
$event
);
$log_file = WP_CONTENT_DIR . '/supply-chain-security.log';
// 限制日志文件大小
if (file_exists($log_file) && filesize($log_file) > 10485760) { // 10MB
$backup_file = $log_file . '.' . date('Y-m-d');
rename($log_file, $backup_file);
}
error_log($log_entry, 3, $log_file);
}
}
?>
<?php
/**
* 供应链系统安全加固
*/
class SupplyChainSecurity {
/**
* 验证用户权限
* @param string $capability 所需权限
* @return bool 是否有权限
*/
public static function check_capability($capability = 'manage_woocommerce') {
if (!current_user_can($capability)) {
wp_die('您没有足够的权限访问此页面。');
return false;
}
return true;
}
/**
* 数据输入清理
* @param mixed $data 输入数据
* @return mixed 清理后的数据
*/
public static function sanitize_input($data) {
if (is_array($data)) {
foreach ($data as $key => $value) {
$data[$key] = self::sanitize_input($value);
}
return $data;
}
// 移除危险标签和脚本
$data = wp_strip_all_tags($data);
$data = esc_sql($data);
return $data;
}
/**
* 防止SQL注入
* @param string $query SQL查询
* @param array $params 参数数组
* @return string 安全的查询
*/
public static function prepare_sql_query($query, $params = array()) {
global $wpdb;
if (empty($params)) {
return $query;
}
return $wpdb->prepare($query, $params);
}
/**
* 记录安全事件
* @param string $event 事件描述
* @param string $severity 严重程度:low, medium, high
*/
public static function log_security_event($event, $severity = 'medium') {
$log_entry = sprintf(
"[%s] [%s] %sn",
current_time('mysql'),
strtoupper($severity),
$event
);
$log_file = WP_CONTENT_DIR . '/supply-chain-security.log';
// 限制日志文件大小
if (file_exists($log_file) && filesize($log_file) > 10485760) { // 10MB
$backup_file = $log_file . '.' . date('Y-m-d');
rename($log_file, $backup_file);
}
error_log($log_entry, 3, $log_file);
}
}
?>
<?php
/**
* 供应链系统REST API
*/
class SupplyChainAPI {
public function register_routes() {
register_rest_route('supply-chain/v1', '/inventory/(?P<id>d+)', array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_inventory'),
'permission_callback' => array($this, 'check_api_permission'),
'args' => array(
'id' => array(
'validate_callback' => function($param) {
return is_numeric($param);
}
),
),
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array($this, 'update_inventory'),
'permission_callback' => array($this, 'check_api_permission'),
),
));
register_rest_route('supply-chain/v1', '/suppliers', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_suppliers'),
'permission_callback' => array($this, 'check_api_permission'),
));
register_rest_route('supply-chain/v1', '/analytics/kpi', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_kpi_data'),
'permission_callback' => array($this, 'check_api_permission'),
));
}
/**
* 获取库存信息
*/
public function get_inventory($request) {
$product_id = $request['id'];
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $table_name WHERE product_id = %d",
$product_id
));
if (!$inventory) {
return new WP_Error('not_found', '库存记录不存在', array('status' => 404));
}
return rest_ensure_response($inventory);
}
/**
* 获取供应商列表
*/
public function get_suppliers($request) {
$args = array(
'post_type' => 'supplier',
'posts_per_page' => -1,
'post_status' => 'publish',
);
if (isset($request['active_only']) && $request['active_only']) {
$args['meta_query'] = array(
array(
'key' => 'is_active',
'value' => '1',
'compare' => '='
)
);
}
$suppliers = get_posts($args);
$formatted_suppliers = array();
foreach ($suppliers as $supplier) {
$formatted_suppliers[] = array(
'id' => $supplier->ID,
'name' => $supplier->post_title,
'contact' => get_field('contact_person', $supplier->ID),
'email' => get_field('email', $supplier->ID),
'rating' => get_field('rating', $supplier->ID),
'lead_time' => get_field('lead_time_days', $supplier->ID),
);
}
return rest_ensure_response($formatted_suppliers);
}
/**
* 获取KPI数据
*/
public function get_kpi_data($request) {
$period = $request->get_param('period') ?: 'monthly';
$kpis = SupplyChainAnalytics::calculate_kpis($period);
return rest_ensure_response(array(
'period' => $period,
'kpis' => $kpis,
'timestamp' => current_time('mysql'),
));
}
/**
* 检查API权限
*/
public function check_api_permission($request) {
// 使用API密钥验证或用户权限验证
$api_key = $request->get_header('X-API-Key');
if ($api_key) {
return $this->validate_api_key($api_key);
}
// 或者检查用户权限
return current_user_can('manage_woocommerce');
}
private function validate_api_key($api_key) {
$valid_keys = get_option('supply_chain_api_keys', array());
return in_array(hash('sha256', $api_key), $valid_keys);
}
}
// 初始化API
add_action('rest_api_init', function() {
$api = new SupplyChainAPI();
$api->register_routes();
});
?>
<?php
/**
* 供应链系统REST API
*/
class SupplyChainAPI {
public function register_routes() {
register_rest_route('supply-chain/v1', '/inventory/(?P<id>d+)', array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_inventory'),
'permission_callback' => array($this, 'check_api_permission'),
'args' => array(
'id' => array(
'validate_callback' => function($param) {
return is_numeric($param);
}
),
),
),
array(
'methods' => WP_REST_Server::EDITABLE,
'callback' => array($this, 'update_inventory'),
'permission_callback' => array($this, 'check_api_permission'),
),
));
register_rest_route('supply-chain/v1', '/suppliers', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_suppliers'),
'permission_callback' => array($this, 'check_api_permission'),
));
register_rest_route('supply-chain/v1', '/analytics/kpi', array(
'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_kpi_data'),
'permission_callback' => array($this, 'check_api_permission'),
));
}
/**
* 获取库存信息
*/
public function get_inventory($request) {
$product_id = $request['id'];
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT * FROM $table_name WHERE product_id = %d",
$product_id
));
if (!$inventory) {
return new WP_Error('not_found', '库存记录不存在', array('status' => 404));
}
return rest_ensure_response($inventory);
}
/**
* 获取供应商列表
*/
public function get_suppliers($request) {
$args = array(
'post_type' => 'supplier',
'posts_per_page' => -1,
'post_status' => 'publish',
);
if (isset($request['active_only']) && $request['active_only']) {
$args['meta_query'] = array(
array(
'key' => 'is_active',
'value' => '1',
'compare' => '='
)
);
}
$suppliers = get_posts($args);
$formatted_suppliers = array();
foreach ($suppliers as $supplier) {
$formatted_suppliers[] = array(
'id' => $supplier->ID,
'name' => $supplier->post_title,
'contact' => get_field('contact_person', $supplier->ID),
'email' => get_field('email', $supplier->ID),
'rating' => get_field('rating', $supplier->ID),
'lead_time' => get_field('lead_time_days', $supplier->ID),
);
}
return rest_ensure_response($formatted_suppliers);
}
/**
* 获取KPI数据
*/
public function get_kpi_data($request) {
$period = $request->get_param('period') ?: 'monthly';
$kpis = SupplyChainAnalytics::calculate_kpis($period);
return rest_ensure_response(array(
'period' => $period,
'kpis' => $kpis,
'timestamp' => current_time('mysql'),
));
}
/**
* 检查API权限
*/
public function check_api_permission($request) {
// 使用API密钥验证或用户权限验证
$api_key = $request->get_header('X-API-Key');
if ($api_key) {
return $this->validate_api_key($api_key);
}
// 或者检查用户权限
return current_user_can('manage_woocommerce');
}
private function validate_api_key($api_key) {
$valid_keys = get_option('supply_chain_api_keys', array());
return in_array(hash('sha256', $api_key), $valid_keys);
}
}
// 初始化API
add_action('rest_api_init', function() {
$api = new SupplyChainAPI();
$api->register_routes();
});
?>
<?php
/**
* 供应链管理后台界面
*/
class SupplyChainAdminUI {
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_woocommerce',
'supply-chain-dashboard',
array($this, 'render_dashboard'),
'dashicons-networking',
58
);
add_submenu_page(
'supply-chain-dashboard',
'库存管理',
'库存管理',
'manage_woocommerce',
'supply-chain-inventory',
array($this, 'render_inventory_page')
);
add_submenu_page(
'supply-chain-dashboard',
'供应商管理',
'供应商管理',
'manage_woocommerce',
'supply-chain-suppliers',
array($this, 'render_suppliers_page')
);
add_submenu_page(
'supply-chain-dashboard',
'分析报告',
'分析报告',
'manage_woocommerce',
'supply-chain-analytics',
array($this, 'render_analytics_page')
);
}
/**
* 加载管理界面脚本和样式
*/
public function enqueue_admin_scripts($hook) {
if (strpos($hook, 'supply-chain') === false) {
return;
}
wp_enqueue_style(
'supply-chain-admin',
plugin_dir_url(__FILE__) . 'css/admin.css',
array(),
'1.0.0'
);
wp_enqueue_script(
'supply-chain-admin',
plugin_dir_url(__FILE__) . 'js/admin.js',
array('jquery', 'chartjs'),
'1.0.0',
true
);
// 本地化脚本数据
wp_localize_script('supply-chain-admin', 'supplyChainData', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('supply_chain_nonce'),
'api_endpoint' => rest_url('supply-chain/v1/'),
));
}
/**
* 渲染仪表板
*/
public function render_dashboard() {
?>
<div class="wrap supply-chain-dashboard">
<h1>供应链仪表板</h1>
<div class="dashboard-widgets">
<div class="widget kpi-widget">
<h3>关键绩效指标</h3>
<div class="kpi-grid">
<div class="kpi-item">
<span class="kpi-value" id="fulfillment-rate">--%</span>
<span class="kpi-label">订单履行率</span>
</div>
<div class="kpi-item">
<span class="kpi-value" id="processing-time">--h</span>
<span class="kpi-label">平均处理时间</span>
</div>
<div class="kpi-item">
<span class="kpi-value" id="inventory-turnover">--</span>
<span class="kpi-label">库存周转率</span>
</div>
</div>
</div>
<div class="widget inventory-alerts">
<h3>库存警报</h3>
<div id="inventory-alerts-list">
<!-- 通过AJAX动态加载 -->
</div>
</div>
<div class="widget recent-orders">
<h3>最近采购订单</h3>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>订单号</th>
<th>供应商</th>
<th>金额</th>
<th>状态</th>
<th>预计交付</th>
</tr>
</thead>
<tbody id="recent-orders-list">
<!-- 通过AJAX动态加载 -->
</tbody>
</table>
</div>
</div>
<div class="dashboard-chart">
<canvas id="supply-chain-chart" width="800" height="300"></canvas>
</div>
</div>
<script>
jQuery(document).ready(function($) {
// 加载KPI数据
$.ajax({
url: supplyChainData.api_endpoint + 'analytics/kpi',
method: 'GET',
beforeSend: function(xhr) {
xhr.setRequestHeader('X-WP-Nonce', supplyChainData.nonce);
},
success: function(response) {
if (response.kpis) {
$('#fulfillment-rate').text(response.kpis.order_fulfillment_rate + '%');
$('#processing-time').text(response.kpis.avg_order_processing_hours + 'h');
$('#inventory-turnover').text(response.kpis.inventory_turnover);
}
}
});
// 加载库存警报
loadInventoryAlerts();
// 加载最近订单
loadRecentOrders();
// 初始化图表
initSupplyChainChart();
});
</script>
<?php
}
/**
* 渲染库存管理页面
*/
public function render_inventory_page() {
?>
<div class="wrap">
<h1>库存管理</h1>
<div class="inventory-controls">
<input type="text" id="inventory-search" placeholder="搜索产品..." />
<select id="inventory-filter">
<option value="all">所有库存</option>
<option value="low">低库存</option>
<option value="out">缺货</option>
</select>
<button id="export-inventory" class="button">导出CSV</button>
</div>
<table id="inventory-table" class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>产品ID</th>
<th>产品名称</th>
<th>当前库存</th>
<th>重新订货水平</th>
<th>供应商</th>
<th>最后更新</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 通过AJAX动态加载 -->
</tbody>
</table>
<div id="inventory-pagination"></div>
</div>
<?php
}
}
?>
<?php
/**
* 供应链管理后台界面
*/
class SupplyChainAdminUI {
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_woocommerce',
'supply-chain-dashboard',
array($this, 'render_dashboard'),
'dashicons-networking',
58
);
add_submenu_page(
'supply-chain-dashboard',
'库存管理',
'库存管理',
'manage_woocommerce',
'supply-chain-inventory',
array($this, 'render_inventory_page')
);
add_submenu_page(
'supply-chain-dashboard',
'供应商管理',
'供应商管理',
'manage_woocommerce',
'supply-chain-suppliers',
array($this, 'render_suppliers_page')
);
add_submenu_page(
'supply-chain-dashboard',
'分析报告',
'分析报告',
'manage_woocommerce',
'supply-chain-analytics',
array($this, 'render_analytics_page')
);
}
/**
* 加载管理界面脚本和样式
*/
public function enqueue_admin_scripts($hook) {
if (strpos($hook, 'supply-chain') === false) {
return;
}
wp_enqueue_style(
'supply-chain-admin',
plugin_dir_url(__FILE__) . 'css/admin.css',
array(),
'1.0.0'
);
wp_enqueue_script(
'supply-chain-admin',
plugin_dir_url(__FILE__) . 'js/admin.js',
array('jquery', 'chartjs'),
'1.0.0',
true
);
// 本地化脚本数据
wp_localize_script('supply-chain-admin', 'supplyChainData', array(
'ajax_url' => admin_url('admin-ajax.php'),
'nonce' => wp_create_nonce('supply_chain_nonce'),
'api_endpoint' => rest_url('supply-chain/v1/'),
));
}
/**
* 渲染仪表板
*/
public function render_dashboard() {
?>
<div class="wrap supply-chain-dashboard">
<h1>供应链仪表板</h1>
<div class="dashboard-widgets">
<div class="widget kpi-widget">
<h3>关键绩效指标</h3>
<div class="kpi-grid">
<div class="kpi-item">
<span class="kpi-value" id="fulfillment-rate">--%</span>
<span class="kpi-label">订单履行率</span>
</div>
<div class="kpi-item">
<span class="kpi-value" id="processing-time">--h</span>
<span class="kpi-label">平均处理时间</span>
</div>
<div class="kpi-item">
<span class="kpi-value" id="inventory-turnover">--</span>
<span class="kpi-label">库存周转率</span>
</div>
</div>
</div>
<div class="widget inventory-alerts">
<h3>库存警报</h3>
<div id="inventory-alerts-list">
<!-- 通过AJAX动态加载 -->
</div>
</div>
<div class="widget recent-orders">
<h3>最近采购订单</h3>
<table class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>订单号</th>
<th>供应商</th>
<th>金额</th>
<th>状态</th>
<th>预计交付</th>
</tr>
</thead>
<tbody id="recent-orders-list">
<!-- 通过AJAX动态加载 -->
</tbody>
</table>
</div>
</div>
<div class="dashboard-chart">
<canvas id="supply-chain-chart" width="800" height="300"></canvas>
</div>
</div>
<script>
jQuery(document).ready(function($) {
// 加载KPI数据
$.ajax({
url: supplyChainData.api_endpoint + 'analytics/kpi',
method: 'GET',
beforeSend: function(xhr) {
xhr.setRequestHeader('X-WP-Nonce', supplyChainData.nonce);
},
success: function(response) {
if (response.kpis) {
$('#fulfillment-rate').text(response.kpis.order_fulfillment_rate + '%');
$('#processing-time').text(response.kpis.avg_order_processing_hours + 'h');
$('#inventory-turnover').text(response.kpis.inventory_turnover);
}
}
});
// 加载库存警报
loadInventoryAlerts();
// 加载最近订单
loadRecentOrders();
// 初始化图表
initSupplyChainChart();
});
</script>
<?php
}
/**
* 渲染库存管理页面
*/
public function render_inventory_page() {
?>
<div class="wrap">
<h1>库存管理</h1>
<div class="inventory-controls">
<input type="text" id="inventory-search" placeholder="搜索产品..." />
<select id="inventory-filter">
<option value="all">所有库存</option>
<option value="low">低库存</option>
<option value="out">缺货</option>
</select>
<button id="export-inventory" class="button">导出CSV</button>
</div>
<table id="inventory-table" class="wp-list-table widefat fixed striped">
<thead>
<tr>
<th>产品ID</th>
<th>产品名称</th>
<th>当前库存</th>
<th>重新订货水平</th>
<th>供应商</th>
<th>最后更新</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<!-- 通过AJAX动态加载 -->
</tbody>
</table>
<div id="inventory-pagination"></div>
</div>
<?php
}
}
?>
<?php
/**
* 供应链系统单元测试
*/
class SupplyChainTests extends WP_UnitTestCase {
/**
* 测试库存更新功能
*/
public function test_inventory_update() {
// 创建测试产品
$product_id = $this->factory->post->create(array(
'post_type' => 'product'
));
// 初始库存应为0
$this->assertTrue(InventoryManager::update_inventory($product_id, 100));
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
$this->assertEquals(100, $inventory->quantity);
// 测试减少库存
$this->assertTrue(InventoryManager::update_inventory($product_id, -30));
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
$this->assertEquals(70, $inventory->quantity);
// 测试库存不会低于0
$this->assertTrue(InventoryManager::update_inventory($product_id, -100));
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
$this->assertEquals(0, $inventory->quantity);
}
/**
* 测试供应商自定义帖子类型
*/
public function test_supplier_post_type() {
$post_types = get_post_types();
$this->assertArrayHasKey('supplier', $post_types);
// 创建测试供应商
$supplier_id = $this->factory->post->create(array(
'post_type' => 'supplier',
'post_title' => '测试供应商'
));
$supplier = get_post($supplier_id);
$this->assertEquals('supplier', $supplier->post_type);
$this->assertEquals('测试供应商', $supplier->post_title);
}
/**
* 测试API权限验证
*/
public function test_api_permission() {
$api = new SupplyChainAPI();
// 测试无权限情况
$request = new WP_REST_Request();
$this->assertFalse($api->check_api_permission($request));
// 创建有权限的用户
$user_id = $this->factory->user->create(array(
'role' => 'administrator'
));
wp_set_current_user($user_id);
$this->assertTrue($api->check_api_permission($request));
}
}
/**
* 集成测试:完整订单流程
*/
function test_complete_order_workflow() {
// 1. 创建供应商
// 2. 添加产品库存
// 3. 创建客户订单
// 4. 验证库存扣减
// 5. 生成采购订单
// 6. 验证整个流程
}
?>
<?php
/**
* 供应链系统单元测试
*/
class SupplyChainTests extends WP_UnitTestCase {
/**
* 测试库存更新功能
*/
public function test_inventory_update() {
// 创建测试产品
$product_id = $this->factory->post->create(array(
'post_type' => 'product'
));
// 初始库存应为0
$this->assertTrue(InventoryManager::update_inventory($product_id, 100));
global $wpdb;
$table_name = $wpdb->prefix . 'supply_chain_inventory';
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
$this->assertEquals(100, $inventory->quantity);
// 测试减少库存
$this->assertTrue(InventoryManager::update_inventory($product_id, -30));
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
$this->assertEquals(70, $inventory->quantity);
// 测试库存不会低于0
$this->assertTrue(InventoryManager::update_inventory($product_id, -100));
$inventory = $wpdb->get_row($wpdb->prepare(
"SELECT quantity FROM $table_name WHERE product_id = %d",
$product_id
));
$this->assertEquals(0, $inventory->quantity);
}
/**
* 测试供应商自定义帖子类型
*/
public function test_supplier_post_type() {
$post_types = get_post_types();
$this->assertArrayHasKey('supplier', $post_types);
// 创建测试供应商
$supplier_id = $this->factory->post->create(array(
'post_type' => 'supplier',
'post_title' => '测试供应商'
));
$supplier = get_post($supplier_id);
$this->assertEquals('supplier', $supplier->post_type);
$this->assertEquals('测试供应商', $supplier->post_title);
}
/**
* 测试API权限验证
*/
public function test_api_permission() {
$api = new SupplyChainAPI();
// 测试无权限情况
$request = new WP_REST_Request();
$this->assertFalse($api->check_api_permission($request));
// 创建有权限的用户
$user_id = $this->factory->user->create(array(
'role' => 'administrator'
));
wp_set_current_user($user_id);
$this->assertTrue($api->check_api_permission($request));
}
}
/**
* 集成测试:完整订单流程
*/
function test_complete_order_workflow() {
// 1. 创建供应商
// 2. 添加产品库存
// 3. 创建客户订单
// 4. 验证库存扣减
// 5. 生成采购订单
// 6. 验证整个流程
}
?>
-
环境检查
- PHP版本 ≥ 7.4
- MySQL版本 ≥ 5.7
- WordPress版本 ≥ 6.0
- WooCommerce插件已安装
-
数据库备份
-- 备份现有数据
mysqldump -u username -p database_name > backup.sql
-- 创建新表
source supply_chain_tables.sql
-
文件部署
/wp-content/plugins/supply-chain-system/
├── supply-chain.php # 主插件文件
├── includes/ # 包含文件
│ ├── class-inventory.php
│ ├── class-suppliers.php
│ ├── class-api.php
│ └── class-analytics.php
├── assets/ # 静态资源
│ ├── css/
│ ├── js/
│ └── images/
├── templates/ # 模板文件
└── uninstall.php # 卸载脚本
-
配置步骤
- 激活插件
- 运行数据库安装脚本
- 配置API密钥
- 设置初始供应商
- 配置库存参数
环境检查
- PHP版本 ≥ 7.4
- MySQL版本 ≥ 5.7
- WordPress版本 ≥ 6.0
- WooCommerce插件已安装
数据库备份
-- 备份现有数据
mysqldump -u username -p database_name > backup.sql
-- 创建新表
source supply_chain_tables.sql
文件部署
/wp-content/plugins/supply-chain-system/
├── supply-chain.php # 主插件文件
├── includes/ # 包含文件
│ ├── class-inventory.php
│ ├── class-suppliers.php
│ ├── class-api.php
│ └── class-analytics.php
├── assets/ # 静态资源
│ ├── css/
│ ├── js/
│ └── images/
├── templates/ # 模板文件
└── uninstall.php # 卸载脚本
配置步骤
- 激活插件
- 运行数据库安装脚本
- 配置API密钥
- 设置初始供应商
- 配置库存参数
-
数据库优化
-- 每周执行一次
OPTIMIZE TABLE wp_supply_chain_inventory;
ANALYZE TABLE wp_supply_chain_purchase_orders;
-- 清理旧日志
DELETE FROM wp_supply_chain_logs
WHERE log_date < DATE_SUB(NOW(), INTERVAL 90 DAY);
-
性能监控
<?php
/**
* 系统性能监控
*/
class PerformanceMonitor {
public static function log_performance() {
$memory_usage = memory_get_usage(true) / 1024 / 1024; // MB
$load_time = timer_stop(0, 3); // 秒
if ($memory_usage > 256 || $load_time > 3) {
error_log(sprintf(
"性能警报: 内存使用 %.2fMB, 加载时间 %.3fs",
$memory_usage,
$load_time
));
}
}
}
add_action('shutdown', array('PerformanceMonitor', 'log_performance'));
?>
数据库优化
-- 每周执行一次
OPTIMIZE TABLE wp_supply_chain_inventory;
ANALYZE TABLE wp_supply_chain_purchase_orders;
-- 清理旧日志
DELETE FROM wp_supply_chain_logs
WHERE log_date < DATE_SUB(NOW(), INTERVAL 90 DAY);
性能监控
<?php
/**
* 系统性能监控
*/
class PerformanceMonitor {
public static function log_performance() {
$memory_usage = memory_get_usage(true) / 1024 / 1024; // MB
$load_time = timer_stop(0, 3); // 秒
if ($memory_usage > 256 || $load_time > 3) {
error_log(sprintf(
"性能警报: 内存使用 %.2fMB, 加载时间 %.3fs",
$memory_usage,
$load_time
));
}
}
}
add_action('shutdown', array('PerformanceMonitor', 'log_performance'));
?>
-
多仓库支持
// 扩展库存表支持多仓库
ALTER TABLE wp_supply_chain_inventory
ADD warehouse_id INT(11) AFTER product_id,
ADD INDEX (warehouse_id);
-
预测分析模块
class DemandForecaster {
public function predict_demand($product_id, $period = 'monthly') {
// 使用历史销售数据进行需求预测
// 可集成机器学习算法
}
}
- 移动端应用
// 使用React Native或Flutter开发移动应用
多仓库支持
// 扩展库存表支持多仓库
ALTER TABLE wp_supply_chain_inventory
ADD warehouse_id INT(11) AFTER product_id,
ADD INDEX (warehouse_id);
预测分析模块
class DemandForecaster {
public function predict_demand($product_id, $period = 'monthly') {
// 使用历史销售数据进行需求预测
// 可集成机器学习算法
}
}
// 使用React Native或Flutter开发移动应用


