首页 / 教程文章 / WordPress柔性供应链软件的用户权限与角色管理教程

WordPress柔性供应链软件的用户权限与角色管理教程

WordPress柔性供应链软件的用户权限与角色管理教程

引言:为什么权限管理对供应链软件至关重要

在当今数字化供应链环境中,数据安全和操作规范是企业运营的核心。WordPress作为全球最流行的内容管理系统,其强大的用户角色与权限管理系统为柔性供应链软件的开发提供了坚实基础。合理的权限管理不仅能防止数据泄露和误操作,还能确保各部门员工在权限范围内高效协作,实现供应链的透明化和可追溯性。

本教程将深入探讨如何在WordPress柔性供应链软件中实现精细化的用户权限与角色管理,包含完整的代码示例和最佳实践。

WordPress默认用户角色系统概述

WordPress自带了一套完善的用户角色系统,主要包括:

  1. 管理员(Administrator) - 拥有所有权限
  2. 编辑(Editor) - 可以发布和管理文章,包括其他人的文章
  3. 作者(Author) - 可以发布和管理自己的文章
  4. 投稿者(Contributor) - 可以撰写但不能发布文章
  5. 订阅者(Subscriber) - 只能管理个人资料

对于供应链软件,这些默认角色往往无法满足复杂业务需求,我们需要创建自定义角色和权限。

自定义供应链角色设计与规划

在柔性供应链系统中,我们通常需要以下角色:

  • 供应链总监 - 全面查看和管理所有供应链模块
  • 采购经理 - 管理供应商、采购订单和库存
  • 仓库主管 - 管理入库、出库和库存盘点
  • 物流协调员 - 管理运输和配送
  • 供应商代表 - 查看相关订单和提交发货信息
  • 财务专员 - 处理付款和发票

创建自定义用户角色与权限

以下代码展示了如何在WordPress中创建供应链系统的自定义角色:

/**
 * 初始化供应链系统自定义用户角色
 * 这段代码应该放在主题的functions.php文件或自定义插件中
 */
function init_supply_chain_roles() {
    // 添加供应链总监角色
    add_role('supply_chain_director', '供应链总监', array(
        'read' => true,
        'edit_posts' => true,
        'delete_posts' => true,
        'publish_posts' => true,
        'upload_files' => true,
        // 供应链特定权限
        'manage_suppliers' => true,
        'manage_inventory' => true,
        'manage_orders' => true,
        'manage_logistics' => true,
        'view_reports' => true,
        'export_data' => true,
    ));
    
    // 添加采购经理角色
    add_role('procurement_manager', '采购经理', array(
        'read' => true,
        'edit_posts' => true,
        'upload_files' => true,
        // 采购特定权限
        'manage_suppliers' => true,
        'create_purchase_orders' => true,
        'approve_purchase_orders' => false, // 需要总监审批
        'view_inventory' => true,
        'manage_inventory_levels' => true,
    ));
    
    // 添加仓库主管角色
    add_role('warehouse_supervisor', '仓库主管', array(
        'read' => true,
        'edit_posts' => true,
        'upload_files' => true,
        // 仓库特定权限
        'receive_shipments' => true,
        'process_fulfillment' => true,
        'manage_inventory' => true,
        'conduct_inventory_counts' => true,
        'view_orders' => true,
    ));
    
    // 添加供应商代表角色(外部用户)
    add_role('supplier_representative', '供应商代表', array(
        'read' => true,
        // 供应商特定权限
        'view_own_orders' => true,
        'update_order_status' => true,
        'upload_delivery_docs' => true,
        'communicate_with_buyer' => true,
    ));
}
add_action('init', 'init_supply_chain_roles');

自定义权限能力与访问控制

创建角色后,我们需要为这些角色分配具体的操作权限。以下是一个完整的权限管理类示例:

/**
 * 供应链权限管理类
 * 处理所有与权限相关的逻辑
 */
class SupplyChainPermissions {
    
    /**
     * 初始化权限钩子和过滤器
     */
    public function __construct() {
        // 添加自定义权限检查
        add_filter('user_has_cap', array($this, 'check_custom_capabilities'), 10, 4);
        
        // 管理菜单权限控制
        add_action('admin_menu', array($this, 'filter_admin_menu'), 999);
        
        // 前端访问控制
        add_action('template_redirect', array($this, 'restrict_frontend_access'));
    }
    
    /**
     * 检查用户自定义权限能力
     * @param array $allcaps 用户所有权限
     * @param array $caps 需要的权限
     * @param array $args 权限检查参数
     * @param WP_User $user 用户对象
     * @return array 修改后的权限数组
     */
    public function check_custom_capabilities($allcaps, $caps, $args, $user) {
        // 检查是否供应链相关权限
        $supply_chain_caps = array(
            'manage_suppliers',
            'manage_inventory',
            'manage_orders',
            'view_own_orders',
            // 添加其他供应链权限...
        );
        
        foreach ($caps as $cap) {
            if (in_array($cap, $supply_chain_caps)) {
                // 根据用户角色分配权限
                if (in_array('supply_chain_director', $user->roles)) {
                    $allcaps[$cap] = true;
                } elseif (in_array('procurement_manager', $user->roles) && in_array($cap, array('manage_suppliers', 'view_inventory'))) {
                    $allcaps[$cap] = true;
                } elseif (in_array('supplier_representative', $user->roles) && $cap === 'view_own_orders') {
                    $allcaps[$cap] = true;
                }
            }
        }
        
        return $allcaps;
    }
    
    /**
     * 根据用户角色过滤后台菜单
     */
    public function filter_admin_menu() {
        global $menu, $submenu;
        
        // 获取当前用户
        $user = wp_get_current_user();
        
        // 供应商代表只能看到有限菜单
        if (in_array('supplier_representative', $user->roles)) {
            remove_menu_page('index.php'); // 仪表盘
            remove_menu_page('edit.php'); // 文章
            remove_menu_page('upload.php'); // 媒体
            // 只保留供应链相关菜单
            add_menu_page(
                '供应商门户',
                '供应商门户',
                'read',
                'supplier-portal',
                array($this, 'supplier_portal_page'),
                'dashicons-truck',
                30
            );
        }
        
        // 仓库主管不能访问某些管理功能
        if (in_array('warehouse_supervisor', $user->roles)) {
            remove_menu_page('tools.php'); // 工具
            remove_menu_page('options-general.php'); // 设置
        }
    }
    
    /**
     * 供应商门户页面回调函数
     */
    public function supplier_portal_page() {
        echo '<div class="wrap">';
        echo '<h1>供应商门户</h1>';
        echo '<p>欢迎访问供应链管理系统。在这里您可以查看分配给您的订单、更新发货状态和上传相关文档。</p>';
        // 这里可以添加更多供应商特定功能
        $this->display_supplier_orders();
        echo '</div>';
    }
    
    /**
     * 显示供应商订单(示例函数)
     */
    private function display_supplier_orders() {
        // 这里应该从数据库获取供应商相关订单
        echo '<div class="supplier-orders">';
        echo '<h3>您的订单</h3>';
        echo '<table class="wp-list-table widefat fixed striped">';
        echo '<thead><tr><th>订单号</th><th>产品</th><th>数量</th><th>交货日期</th><th>状态</th><th>操作</th></tr></thead>';
        echo '<tbody>';
        echo '<tr><td>PO-2023-001</td><td>电子元件A</td><td>1000</td><td>2023-12-15</td><td>待发货</td><td><button class="button">更新状态</button></td></tr>';
        echo '</tbody>';
        echo '</table>';
        echo '</div>';
    }
    
    /**
     * 前端访问控制
     */
    public function restrict_frontend_access() {
        if (is_singular('supply_order')) { // 假设'supply_order'是自定义文章类型
            $user = wp_get_current_user();
            
            // 检查用户是否有权限查看订单
            if (!in_array('supply_chain_director', $user->roles) && 
                !in_array('procurement_manager', $user->roles) &&
                !in_array('warehouse_supervisor', $user->roles)) {
                
                // 供应商代表只能查看自己的订单
                if (in_array('supplier_representative', $user->roles)) {
                    $order_id = get_the_ID();
                    $supplier_id = get_post_meta($order_id, '_assigned_supplier', true);
                    $user_supplier_id = get_user_meta($user->ID, '_supplier_id', true);
                    
                    if ($supplier_id != $user_supplier_id) {
                        wp_redirect(home_url());
                        exit;
                    }
                } else {
                    wp_redirect(home_url());
                    exit;
                }
            }
        }
    }
}

// 初始化权限管理
new SupplyChainPermissions();

前端权限界面与用户管理

除了后端权限控制,我们还需要在前端提供用户友好的权限管理界面:

/**
 * 前端用户权限管理界面
 * 允许管理员从前端管理用户角色和权限
 */
function supply_chain_user_management_shortcode() {
    // 只有管理员和供应链总监可以访问
    if (!current_user_can('manage_options') && !current_user_can('manage_suppliers')) {
        return '<p>您没有权限访问此页面。</p>';
    }
    
    ob_start();
    ?>
    <div class="supply-chain-user-management">
        <h2>供应链用户管理</h2>
        
        <?php
        // 处理表单提交
        if (isset($_POST['update_user_role']) && wp_verify_nonce($_POST['_wpnonce'], 'update_user_role_nonce')) {
            $user_id = intval($_POST['user_id']);
            $new_role = sanitize_text_field($_POST['new_role']);
            
            $user = new WP_User($user_id);
            
            // 移除所有现有角色
            foreach ($user->roles as $role) {
                $user->remove_role($role);
            }
            
            // 添加新角色
            $user->add_role($new_role);
            
            echo '<div class="notice notice-success"><p>用户角色已更新!</p></div>';
        }
        ?>
        
        <table class="wp-list-table widefat fixed striped">
            <thead>
                <tr>
                    <th>用户名</th>
                    <th>当前角色</th>
                    <th>邮箱</th>
                    <th>最后登录</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>
                <?php
                // 获取所有用户
                $users = get_users(array(
                    'exclude' => array(1), // 排除超级管理员
                ));
                
                foreach ($users as $user) {
                    $roles = $user->roles;
                    $primary_role = !empty($roles) ? translate_user_role($roles[0]) : '无角色';
                    $last_login = get_user_meta($user->ID, 'last_login', true);
                    ?>
                    <tr>
                        <td><?php echo esc_html($user->display_name); ?></td>
                        <td><?php echo esc_html($primary_role); ?></td>
                        <td><?php echo esc_html($user->user_email); ?></td>
                        <td><?php echo $last_login ? date('Y-m-d H:i', $last_login) : '从未登录'; ?></td>
                        <td>
                            <form method="post" style="display:inline;">
                                <?php wp_nonce_field('update_user_role_nonce'); ?>
                                <input type="hidden" name="user_id" value="<?php echo $user->ID; ?>">
                                <select name="new_role">
                                    <option value="procurement_manager" <?php selected(in_array('procurement_manager', $roles)); ?>>采购经理</option>
                                    <option value="warehouse_supervisor" <?php selected(in_array('warehouse_supervisor', $roles)); ?>>仓库主管</option>
                                    <option value="supplier_representative" <?php selected(in_array('supplier_representative', $roles)); ?>>供应商代表</option>
                                    <option value="subscriber" <?php selected(in_array('subscriber', $roles)); ?>>订阅者</option>
                                </select>
                                <input type="submit" name="update_user_role" value="更新角色" class="button button-small">
                            </form>
                        </td>
                    </tr>
                    <?php
                }
                ?>
            </tbody>
        </table>
    </div>
    <?php
    
    return ob_get_clean();
}
add_shortcode('user_management', 'supply_chain_user_management_shortcode');

安全最佳实践与注意事项

  1. 最小权限原则:只授予用户完成工作所必需的最小权限
  2. 定期审计:定期检查用户角色和权限分配
  3. 日志记录:记录所有权限变更和敏感操作
  4. 输入验证:对所有用户输入进行严格验证和清理
  5. 非ces保护:所有表单操作都要使用WordPress nonce保护
  6. 数据加密:敏感数据在传输和存储时应加密

高级功能:基于上下文的动态权限

对于更复杂的供应链场景,可能需要基于上下文动态调整权限:

/**
 * 动态权限检查示例:基于订单状态的权限控制
 */
function dynamic_order_permission_check($user_id, $order_id) {
    $user = get_userdata($user_id);
    $order_status = get_post_meta($order_id, '_order_status', true);
    
    // 如果订单已标记为"已审核",只有供应链总监可以修改
    if ($order_status === 'approved' && !in_array('supply_chain_director', $user->roles)) {
        return false;
    }
    
    // 如果订单价值超过阈值,需要特殊权限
    $order_value = get_post_meta($order_id, '_order_value', true);
    if ($order_value > 10000 && !current_user_can('approve_high_value_orders')) {
        return false;
    }
    
    return true;
}

结论

WordPress的用户权限与角色管理系统为柔性供应链软件提供了强大而灵活的基础。通过合理设计自定义角色、精细分配权限能力,并结合前后端访问控制,可以构建出既安全又高效的供应链管理系统。

实施良好的权限管理不仅能提升数据安全性,还能优化工作流程,确保每个供应链参与者都能在正确的时间访问正确的信息,从而提升整体供应链的柔性和响应速度。

记住,权限管理不是一次性的设置,而是一个持续的过程。随着业务需求的变化和供应链网络的发展,定期审查和调整权限设置是保持系统安全高效运行的关键。


注意:本文提供的代码示例需要根据实际业务需求进行调整和扩展。在生产环境中使用前,请进行充分测试,并考虑使用专业的安全插件增强系统安全性。建议与WordPress开发专家合作,确保权限系统的正确实施。

用户注册与角色分配自动化

在供应链系统中,用户注册通常需要与业务逻辑紧密结合。以下代码实现了基于注册信息的自动角色分配:

/**
 * 供应链用户注册处理
 * 根据用户类型自动分配角色
 */
class SupplyChainRegistration {
    
    public function __construct() {
        // 修改默认注册流程
        add_action('register_form', array($this, 'add_registration_fields'));
        add_action('user_register', array($this, 'process_registration'), 10, 1);
        add_filter('registration_errors', array($this, 'validate_registration'), 10, 3);
    }
    
    /**
     * 添加自定义注册字段
     */
    public function add_registration_fields() {
        ?>
        <p>
            <label for="user_type">用户类型<span class="required">*</span></label>
            <select name="user_type" id="user_type" required>
                <option value="">请选择...</option>
                <option value="supplier">供应商代表</option>
                <option value="staff">内部员工</option>
                <option value="client">客户</option>
            </select>
        </p>
        
        <p id="company_field" style="display:none;">
            <label for="company">公司名称<span class="required">*</span></label>
            <input type="text" name="company" id="company" value="" />
        </p>
        
        <p id="department_field" style="display:none;">
            <label for="department">所属部门</label>
            <select name="department" id="department">
                <option value="procurement">采购部</option>
                <option value="warehouse">仓储部</option>
                <option value="logistics">物流部</option>
                <option value="finance">财务部</option>
            </select>
        </p>
        
        <script>
        jQuery(document).ready(function($) {
            $('#user_type').change(function() {
                var userType = $(this).val();
                $('#company_field, #department_field').hide();
                
                if (userType === 'supplier') {
                    $('#company_field').show();
                } else if (userType === 'staff') {
                    $('#department_field').show();
                }
            });
        });
        </script>
        <?php
    }
    
    /**
     * 验证注册信息
     */
    public function validate_registration($errors, $sanitized_user_login, $user_email) {
        if (empty($_POST['user_type'])) {
            $errors->add('user_type_error', '<strong>错误</strong>: 请选择用户类型。');
        }
        
        if ($_POST['user_type'] === 'supplier' && empty($_POST['company'])) {
            $errors->add('company_error', '<strong>错误</strong>: 供应商必须填写公司名称。');
        }
        
        return $errors;
    }
    
    /**
     * 处理用户注册
     */
    public function process_registration($user_id) {
        if (!empty($_POST['user_type'])) {
            $user_type = sanitize_text_field($_POST['user_type']);
            $user = new WP_User($user_id);
            
            // 根据用户类型分配角色
            switch ($user_type) {
                case 'supplier':
                    $user->set_role('supplier_representative');
                    update_user_meta($user_id, 'company', sanitize_text_field($_POST['company']));
                    update_user_meta($user_id, 'account_status', 'pending_approval');
                    
                    // 发送审批通知给管理员
                    $this->send_approval_notification($user_id);
                    break;
                    
                case 'staff':
                    $department = sanitize_text_field($_POST['department']);
                    $role = $this->map_department_to_role($department);
                    $user->set_role($role);
                    update_user_meta($user_id, 'department', $department);
                    break;
                    
                case 'client':
                    $user->set_role('subscriber');
                    update_user_meta($user_id, 'customer_type', 'supply_chain_client');
                    break;
            }
            
            // 记录注册信息
            update_user_meta($user_id, 'registration_date', current_time('mysql'));
            update_user_meta($user_id, 'registration_ip', $_SERVER['REMOTE_ADDR']);
        }
    }
    
    /**
     * 部门到角色的映射
     */
    private function map_department_to_role($department) {
        $mapping = array(
            'procurement' => 'procurement_manager',
            'warehouse' => 'warehouse_supervisor',
            'logistics' => 'logistics_coordinator',
            'finance' => 'finance_specialist'
        );
        
        return isset($mapping[$department]) ? $mapping[$department] : 'subscriber';
    }
    
    /**
     * 发送审批通知
     */
    private function send_approval_notification($user_id) {
        $user = get_userdata($user_id);
        $admin_email = get_option('admin_email');
        
        $subject = '新供应商注册等待审批';
        $message = sprintf(
            "新供应商代表已注册:nn用户名:%sn邮箱:%sn公司:%snn请登录后台审批:%s",
            $user->user_login,
            $user->user_email,
            get_user_meta($user_id, 'company', true),
            admin_url('users.php')
        );
        
        wp_mail($admin_email, $subject, $message);
    }
}

new SupplyChainRegistration();

细粒度数据访问控制

在供应链系统中,不同角色对数据的访问权限需要精确控制。以下实现基于元数据的数据访问控制:

/**
 * 供应链数据访问控制器
 * 实现行级和列级数据权限控制
 */
class SupplyChainDataAccess {
    
    public function __construct() {
        // 过滤查询结果
        add_filter('pre_get_posts', array($this, 'filter_data_access'));
        add_filter('the_posts', array($this, 'filter_post_content'));
        
        // 保护API端点
        add_filter('rest_pre_dispatch', array($this, 'protect_rest_api'), 10, 3);
    }
    
    /**
     * 过滤数据查询
     */
    public function filter_data_access($query) {
        if (!is_admin() && $query->is_main_query()) {
            $user = wp_get_current_user();
            
            // 处理供应链订单查询
            if ($query->get('post_type') == 'supply_order') {
                $this->apply_order_filters($query, $user);
            }
            
            // 处理供应商数据查询
            if ($query->get('post_type') == 'supplier') {
                $this->apply_supplier_filters($query, $user);
            }
            
            // 处理库存数据查询
            if ($query->get('post_type') == 'inventory') {
                $this->apply_inventory_filters($query, $user);
            }
        }
        
        return $query;
    }
    
    /**
     * 应用订单查询过滤器
     */
    private function apply_order_filters($query, $user) {
        $meta_query = $query->get('meta_query') ?: array();
        
        // 供应商代表只能看到自己的订单
        if (in_array('supplier_representative', $user->roles)) {
            $supplier_id = get_user_meta($user->ID, '_supplier_id', true);
            $meta_query[] = array(
                'key' => '_assigned_supplier',
                'value' => $supplier_id,
                'compare' => '='
            );
        }
        
        // 仓库主管只能看到自己仓库的订单
        elseif (in_array('warehouse_supervisor', $user->roles)) {
            $warehouse_id = get_user_meta($user->ID, '_assigned_warehouse', true);
            $meta_query[] = array(
                'key' => '_fulfillment_warehouse',
                'value' => $warehouse_id,
                'compare' => '='
            );
        }
        
        // 采购经理只能看到自己创建的订单
        elseif (in_array('procurement_manager', $user->roles)) {
            $meta_query[] = array(
                'key' => '_created_by',
                'value' => $user->ID,
                'compare' => '='
            );
        }
        
        if (!empty($meta_query)) {
            $query->set('meta_query', $meta_query);
        }
    }
    
    /**
     * 过滤文章内容
     */
    public function filter_post_content($posts) {
        if (empty($posts) || is_admin()) {
            return $posts;
        }
        
        $user = wp_get_current_user();
        
        foreach ($posts as $key => $post) {
            // 根据用户角色隐藏敏感字段
            if ($post->post_type == 'supply_order') {
                $posts[$key] = $this->filter_order_data($post, $user);
            }
        }
        
        return $posts;
    }
    
    /**
     * 过滤订单数据
     */
    private function filter_order_data($post, $user) {
        // 克隆文章对象以避免修改原始数据
        $filtered_post = clone $post;
        
        // 供应商代表不能看到成本信息
        if (in_array('supplier_representative', $user->roles)) {
            remove_filter('the_content', array($this, 'display_cost_info'));
            add_filter('the_content', array($this, 'remove_cost_info'), 20);
        }
        
        // 非财务角色不能看到利润信息
        if (!in_array('finance_specialist', $user->roles) && 
            !in_array('supply_chain_director', $user->roles)) {
            remove_filter('the_content', array($this, 'display_profit_margin'));
        }
        
        return $filtered_post;
    }
    
    /**
     * 保护REST API端点
     */
    public function protect_rest_api($result, $server, $request) {
        $route = $request->get_route();
        
        // 保护供应链API端点
        if (strpos($route, '/wp/v2/supply_chain/') === 0) {
            $user = wp_get_current_user();
            
            if (!$user->exists()) {
                return new WP_Error(
                    'rest_forbidden',
                    '您需要登录才能访问此数据',
                    array('status' => 401)
                );
            }
            
            // 检查特定端点的权限
            if (strpos($route, '/financial') !== false && 
                !current_user_can('view_financial_data')) {
                return new WP_Error(
                    'rest_forbidden',
                    '您没有权限查看财务数据',
                    array('status' => 403)
                );
            }
        }
        
        return $result;
    }
}

new SupplyChainDataAccess();

批量操作权限管理

在供应链系统中,批量操作需要特殊的权限控制:

/**
 * 批量操作权限管理器
 */
class BulkOperationsManager {
    
    public function __construct() {
        // 批量操作权限检查
        add_filter('bulk_actions-edit-supply_order', array($this, 'filter_bulk_actions'));
        add_filter('handle_bulk_actions-edit-supply_order', array($this, 'handle_bulk_actions'), 10, 3);
        
        // 批量导出控制
        add_action('admin_init', array($this, 'control_bulk_export'));
    }
    
    /**
     * 过滤批量操作选项
     */
    public function filter_bulk_actions($actions) {
        $user = wp_get_current_user();
        
        // 移除所有用户都不应看到的操作
        unset($actions['edit']);
        
        // 根据角色添加/移除操作
        if (!current_user_can('delete_others_posts')) {
            unset($actions['trash']);
        }
        
        // 只有特定角色可以批量审批
        if (current_user_can('approve_orders')) {
            $actions['bulk_approve'] = '批量审批';
            $actions['bulk_reject'] = '批量拒绝';
        }
        
        // 只有供应链总监可以批量分配
        if (in_array('supply_chain_director', $user->roles)) {
            $actions['bulk_assign'] = '批量分配';
        }
        
        // 添加批量导出选项
        if (current_user_can('export_data')) {
            $actions['bulk_export'] = '批量导出';
        }
        
        return $actions;
    }
    
    /**
     * 处理批量操作
     */
    public function handle_bulk_actions($redirect_to, $doaction, $post_ids) {
        $user = wp_get_current_user();
        
        switch ($doaction) {
            case 'bulk_approve':
                $this->bulk_approve_orders($post_ids, $user);
                $redirect_to = add_query_arg('bulk_approved', count($post_ids), $redirect_to);
                break;
                
            case 'bulk_assign':
                if (isset($_REQUEST['assign_to'])) {
                    $this->bulk_assign_orders($post_ids, $_REQUEST['assign_to'], $user);
                    $redirect_to = add_query_arg('bulk_assigned', count($post_ids), $redirect_to);
                }
                break;
                
            case 'bulk_export':
                $this->generate_bulk_export($post_ids, $user);
                break;
        }
        
        return $redirect_to;
    }
    
    /**
     * 批量审批订单
     */
    private function bulk_approve_orders($order_ids, $user) {
        $approved_count = 0;
        
        foreach ($order_ids as $order_id) {
            // 检查是否有权限审批此订单
            if ($this->can_approve_order($order_id, $user)) {
                update_post_meta($order_id, '_status', 'approved');
                update_post_meta($order_id, '_approved_by', $user->ID);
                update_post_meta($order_id, '_approved_at', current_time('mysql'));
                
                // 记录审批日志
                $this->log_approval_action($order_id, $user, 'approved');
                $approved_count++;
            }
        }
        
        return $approved_count;
    }
    
    /**
     * 检查订单审批权限
     */
    private function can_approve_order($order_id, $user) {
        $order_value = get_post_meta($order_id, '_order_value', true);
        
        // 高价值订单需要总监审批
        if ($order_value > 50000 && !in_array('supply_chain_director', $user->roles)) {
            return false;
        }
        
        // 检查订单是否属于用户管辖范围
        if (in_array('procurement_manager', $user->roles)) {
            $created_by = get_post_meta($order_id, '_created_by', true);
            if ($created_by != $user->ID) {
                return false;
            }
        }
        
        return current_user_can('approve_orders');
    }
    
    /**
     * 批量导出控制
     */
    public function control_bulk_export() {
        if (isset($_GET['action']) && $_GET['action'] == 'bulk_export' && 
            isset($_GET['post_type']) && $_GET['post_type'] == 'supply_order') {
            
            $user = wp_get_current_user();
            
            // 检查导出权限
            if (!current_user_can('export_data')) {
                wp_die('您没有权限执行此操作');
            }
            
            // 验证nonce
            if (!wp_verify_nonce($_GET['_wpnonce'], 'bulk-posts')) {
                wp_die('安全验证失败');
            }
            
            // 获取选中的订单ID
            $order_ids = isset($_GET['post']) ? array_map('intval', $_GET['post']) : array();
            
            if (empty($order_ids)) {
                wp_die('未选择任何订单');
            }
            
            // 生成导出文件
            $this->generate_export_file($order_ids, $user);
        }
    }
    
    /**
     * 生成导出文件
     */
    private function generate_export_file($order_ids, $user) {
        // 设置CSV文件头
        header('Content-Type: text/csv; charset=utf-8');
        header('Content-Disposition: attachment; filename=orders_export_' . date('Ymd_His') . '.csv');
        
        $output = fopen('php://output', 'w');
        
        // 根据用户角色决定导出的列
        $columns = $this->get_export_columns($user);
        fputcsv($output, $columns);
        
        // 导出数据
        foreach ($order_ids as $order_id) {
            $row_data = $this->get_order_export_data($order_id, $user, $columns);
            fputcsv($output, $row_data);
        }
        
        fclose($output);
        exit;
    }
    
    /**
     * 获取导出列配置
     */
    private function get_export_columns($user) {
        $base_columns = array('订单号', '创建日期', '状态', '产品名称', '数量');
        
        // 添加权限相关的列
        if (current_user_can('view_cost_info')) {
            $base_columns[] = '成本';
        }
        
        if (current_user_can('view_supplier_info')) {
            $base_columns[] = '供应商';
        }
        
        if (in_array('supply_chain_director', $user->roles)) {
            $base_columns[] = '利润率';
            $base_columns[] = '创建人';
        }
        
        return $base_columns;
    }
}

实时权限变更通知系统

/**
 * 权限变更通知系统
 * 监控并通知权限相关的重要变更
 */
class PermissionChangeNotifier {
    
    private $important_capabilities = array(
        'manage_suppliers',
        'approve_orders',
        'view_financial_data',
        'export_data',
        'manage_users'
    );
    
    public function __construct() {
        // 监控用户角色变更
        add_action('set_user_role', array($this, 'log_role_change'), 10, 3);
        
        // 监控权限变更
本文来自网络,不代表柔性供应链服务中心立场,转载请注明出处:https://mall.org.cn/6001.html

EXCHANGES®作者

上一篇
下一篇

为您推荐

发表回复

联系我们

联系我们

18559313275

在线咨询: QQ交谈

邮箱: vip@exchanges.center

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