编程与数学 03-008 《看潮企业管理软件》项目开发 09 功能定义 3-1

编程与数学 03-008 《看潮企业管理软件》项目开发 09 功能定义 3-1

摘要:本文档详细阐述了《看潮企业管理软件》中功能定义模块的设计与实现方案。系统基于x9_gn功能列表表构建元数据驱动的功能配置平台,支持分类目录、查询输入、单据输入等8种功能类型。通过FmGndy窗体提供可视化配置界面,实现功能树形管理、动态表单生成、计算公式配置及打印模板设置。采用DevExpress Ribbon界面框架,支持功能复制、XML导入导出、数据字典联动等高级特性,实现零代码化的功能定制与扩展。
关键词:功能定义、ERP系统、元数据驱动、动态表单、DevExpress、功能配置、数据字典、模块化设计
人工智能助手:DeepSeek、Kimi


一、功能列表

软件本身只是一个平台,用户功能是用软件本身的功能定义出来的。首先把用户需要的功能,填写到功能列表中去。

(一)功能列表存储结构

sql 复制代码
-- Table: public.x9_gn

-- DROP TABLE IF EXISTS public.x9_gn;

CREATE TABLE IF NOT EXISTS public.x9_gn
(
    gnbh character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    sj character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    bj character varying(10) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    jc smallint NOT NULL DEFAULT 0,
    gnmc character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    gnly character varying(8) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    gnlb character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    ssmk character varying(40) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    t1 character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    t2 character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    zdbb character varying(20) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    sfyc boolean NOT NULL DEFAULT false,
    sfqy boolean NOT NULL DEFAULT false,
    sfsd boolean NOT NULL DEFAULT false,
    sfql boolean NOT NULL DEFAULT false,
    zjm character varying(60) COLLATE pg_catalog."default" NOT NULL DEFAULT ''::character varying,
    CONSTRAINT x9_gn_pkey PRIMARY KEY (gnbh)
)

TABLESPACE pg_default;

ALTER TABLE IF EXISTS public.x9_gn
    OWNER to postgres;

功能列表的操作就是把用户需求的功能,存入这个数据表中。

(二)功能列表项目说明

根据您提供的x9_gn表结构,这是一个典型的ERP功能菜单/模块管理表。让我分析其字段含义,并说明如何基于此结构实现用户自定义功能:

(1)表结构解读

字段 含义(推测) 用途说明
gnbh 功能编号 主键,功能唯一标识(如"SAL001")
sj 上级编号 构建菜单树形结构
bj 本级编号 可能用于特殊标记
jc 级次/层级 菜单层级(0,1,2...)
gnmc 功能名称 显示名称(如"销售订单")
gnly 功能来源 区分系统内置/用户自定义
gnlb 功能类别 分类(如"销售"、"采购")
ssmk 所属模块 关联具体业务模块
t1/t2 功能使用的数据表 功能使用的一个或多个数据表
zdbb 字典版本 功能使用数据字典的版本控制
sfyc 是否隐藏 控制是否显示
sfqy 是否启用 功能开关
sfsd 是否锁定 防止误修改
sfql 是否清理 标识为清理
zjm 助记码 快速搜索码

(2)自定义功能实现方案

1. 功能菜单的自定义配置
sql 复制代码
-- 示例:用户添加自定义功能菜单
INSERT INTO public.x9_gn (
    gnbh, sj, jc, gnmc, gnly, gnlb, ssmk, sfyc, sfqy, zjm
) VALUES (
    'CUS001',         -- 自定义功能编号
    'SAL',            -- 挂到销售模块下
    2,                -- 二级菜单
    '客户行业分析',     -- 功能名称
    'USER',           -- 来源:用户自定义
    '报表',           -- 类别
    '销售管理',        -- 所属模块
    false,            -- 不隐藏
    true,             -- 启用
    'KHHYFX'          -- 助记码
);
2. 用户自定义功能管理界面设计
html 复制代码
<!-- 前端配置界面应包含: -->
1. 基础信息
   - 功能编号、名称、助记码
   - 上级菜单选择(从现有gnbh选择)
   - 层级设置

2. 显示控制
   - 是否隐藏(sfyc)
   - 是否启用(sfqy)
   - 是否设为缺省功能(sfql)

3. 分类管理
   - 功能类别(gnlb)下拉选择或新增
   - 所属模块(ssmk)选择

4. 权限关联
   - 该功能关联的角色权限配置
3. 实际应用场景示例
场景1:用户自定义报表功能
sql 复制代码
-- 用户创建"销售趋势分析"报表功能
INSERT INTO x9_gn VALUES (
    'RPT_CUS001',
    'RPT',        -- 挂到报表模块
    1,
    '销售趋势分析',
    'USER_CUSTOM', -- 用户自定义标识
    '自定义报表',
    '销售分析',
    'ANALYSIS',   -- t1: 分析类型
    'CHART',      -- t2: 图表类型
    'V1.0',
    false, true, false, true,
    'XSQSFX'
);
场景2:隐藏不需要的功能
sql 复制代码
-- 禁用某个不使用的功能
UPDATE x9_gn 
SET sfqy = false, sfyc = true 
WHERE gnbh = 'INV005' AND gnly = 'SYSTEM';
场景3:调整菜单结构
sql 复制代码
-- 将功能移动到新位置
UPDATE x9_gn 
SET sj = 'NEW_PARENT', jc = 2 
WHERE gnbh = 'CUS001';

-- 更新所有子项的层级
UPDATE x9_gn 
SET jc = jc + 1 
WHERE sj = 'CUS001';
4. 系统集成与扩展
4.1 关联权限表
sql 复制代码
-- 通常会有角色-功能关联表
CREATE TABLE x9_role_function (
    role_id VARCHAR(20),
    gnbh VARCHAR(10),  -- 关联x9_gn.gnbh
    permission_level INT
);

-- 为自定义功能分配权限
INSERT INTO x9_role_function VALUES 
('SALES_MGR', 'CUS001', 3),  -- 3:完全权限
('SALES_STAFF', 'CUS001', 1); -- 1:查看权限
4.2 功能配置元数据扩展
sql 复制代码
-- 扩展表:存储自定义功能的详细配置
CREATE TABLE x9_gn_config (
    gnbh VARCHAR(10) REFERENCES x9_gn(gnbh),
    config_type VARCHAR(20),  -- 配置类型:FORM/REPORT/FLOW
    config_json JSONB,        -- 具体配置(表单布局、查询条件等)
    created_by VARCHAR(50),
    created_time TIMESTAMP
);
5. 前端实现逻辑
javascript 复制代码
// 1. 动态加载菜单
function loadUserMenu(userId) {
    // 查询:系统功能 + 用户自定义功能
    const sql = `
        SELECT g.* FROM x9_gn g
        LEFT JOIN x9_role_function rf ON g.gnbh = rf.gnbh
        LEFT JOIN user_roles ur ON rf.role_id = ur.role_id
        WHERE ur.user_id = $1 
          AND g.sfqy = true 
          AND g.sfyc = false
          AND (g.gnly IN ('SYSTEM', 'USER_CUSTOM'))
        ORDER BY g.jc, g.gnbh`;
    
    // 递归构建树形菜单
    buildMenuTree(data);
}

// 2. 功能启用/停用控制
function toggleFunction(gnbh, enabled) {
    // 更新启用状态
    updateFunctionStatus(gnbh, enabled);
    
    // 如果停用,同时隐藏
    if (!enabled) {
        hideFunction(gnbh);
    }
}
6. 管理控制台设计
复制代码
用户自定义功能管理中心
├── 功能库管理
│   ├── 系统功能列表(gnly='SYSTEM')
│   ├── 自定义功能列表(gnly='USER')
│   └── 功能导入/导出
├── 菜单编排
│   ├── 拖拽调整层级(修改sj, jc)
│   ├── 批量显示/隐藏
│   └── 菜单排序
├── 权限分配
│   ├── 按角色分配功能
│   └── 功能使用统计
└── 配置扩展
    ├── 使用t1/t2扩展字段
    └── 关联业务规则
7. 最佳实践建议
  1. 命名规范

    • 系统功能:SYS_xxx, INV_xxx
    • 用户自定义:CUS_xxx, USR_xxx
    • 第三方集成:EXT_xxx
  2. 版本控制

    • 使用zdbb字段记录版本
    • 修改时创建新版本,保留历史
  3. 权限隔离

    sql 复制代码
    -- 控制用户只能修改自己的自定义功能
    UPDATE x9_gn 
    SET gnmc = '新名称'
    WHERE gnbh = 'CUS001' 
      AND gnly = 'USER_CUSTOM'
      AND created_by = current_user;
  4. 性能优化

    • sjgnlysfqy等查询条件建索引
    • 定期归档不用的自定义功能
8. 扩展建议

如果要实现更灵活的自定义,建议增加以下表:

sql 复制代码
-- 1. 自定义字段表
CREATE TABLE x9_custom_fields (
    field_id SERIAL PRIMARY KEY,
    entity_type VARCHAR(30),  -- 关联实体:客户、订单
    field_name VARCHAR(50),
    field_type VARCHAR(20),   -- 文本/数字/日期
    gnbh VARCHAR(10)          -- 关联到哪个功能
);

-- 2. 用户界面布局表
CREATE TABLE x9_ui_layout (
    user_id VARCHAR(20),
    gnbh VARCHAR(10),
    layout_config JSONB,      -- 字段顺序、宽度等
    UNIQUE(user_id, gnbh)
);

这种基于元数据表的设计,让用户可以通过配置而非代码修改来定制ERP功能,平衡了灵活性和系统稳定性。

(三)功能窗口

在些界面中,用户可以增加、编辑或删除系统功能。每个功能都声明所用的功能模型可系统特定程序。

二、功能定义窗体设计器代码

C# 复制代码
namespace KcErp
{
    partial class FmGndy
    {
        private System.ComponentModel.IContainer components = null;

        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        private void InitializeComponent()
        {
            DevExpress.Utils.SuperToolTip superToolTip1 = new DevExpress.Utils.SuperToolTip();
            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem1 = new DevExpress.Utils.ToolTipTitleItem();
            DevExpress.Utils.ToolTipItem toolTipItem1 = new DevExpress.Utils.ToolTipItem();
            DevExpress.Utils.SuperToolTip superToolTip2 = new DevExpress.Utils.SuperToolTip();
            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem2 = new DevExpress.Utils.ToolTipTitleItem();
            DevExpress.Utils.ToolTipItem toolTipItem2 = new DevExpress.Utils.ToolTipItem();
            DevExpress.Utils.SuperToolTip superToolTip3 = new DevExpress.Utils.SuperToolTip();
            DevExpress.Utils.ToolTipItem toolTipItem3 = new DevExpress.Utils.ToolTipItem();
            DevExpress.Utils.SuperToolTip superToolTip4 = new DevExpress.Utils.SuperToolTip();
            DevExpress.Utils.ToolTipTitleItem toolTipTitleItem3 = new DevExpress.Utils.ToolTipTitleItem();
            DevExpress.Utils.ToolTipItem toolTipItem4 = new DevExpress.Utils.ToolTipItem();
            this.RibbonControl = new DevExpress.XtraBars.Ribbon.RibbonControl();
            this.BarZR = new DevExpress.XtraBars.BarButtonItem();
            this.BarTJ = new DevExpress.XtraBars.BarButtonItem();
            this.BarButtonItem3 = new DevExpress.XtraBars.BarButtonItem();
            this.BarButtonItem4 = new DevExpress.XtraBars.BarButtonItem();
            this.BarZDGN = new DevExpress.XtraBars.BarButtonItem();
            this.L1 = new DevExpress.XtraBars.BarStaticItem();
            this.R1 = new DevExpress.XtraBars.BarStaticItem();
            this.V1 = new DevExpress.XtraBars.BarCheckItem();
            this.V2 = new DevExpress.XtraBars.BarCheckItem();
            this.BarRUN = new DevExpress.XtraBars.BarButtonItem();
            this.BarEXIT = new DevExpress.XtraBars.BarButtonItem();
            this.BarHELP = new DevExpress.XtraBars.BarButtonItem();
            this.BarFZ = new DevExpress.XtraBars.BarButtonItem();
            this.BarZDDY = new DevExpress.XtraBars.BarButtonItem();
            this.BarZDTY = new DevExpress.XtraBars.BarButtonItem();
            this.R2 = new DevExpress.XtraBars.BarStaticItem();
            this.BarWJDR = new DevExpress.XtraBars.BarButtonItem();
            this.BarGS = new DevExpress.XtraBars.BarButtonItem();
            this.BarXZ = new DevExpress.XtraBars.BarButtonItem();
            this.CheckDx = new DevExpress.XtraBars.BarCheckItem();
            this.BarWJDC = new DevExpress.XtraBars.BarButtonItem();
            this.RibbonPage1 = new DevExpress.XtraBars.Ribbon.RibbonPage();
            this.RibbonPageGroup1 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            this.RibbonPageGroup6 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            this.RibbonPageGroup2 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            this.RibbonPageGroup3 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            this.RibbonPageGroup4 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            this.RibbonPageGroup5 = new DevExpress.XtraBars.Ribbon.RibbonPageGroup();
            this.RibbonStatusBar = new DevExpress.XtraBars.Ribbon.RibbonStatusBar();
            this.Sp2 = new DevExpress.XtraEditors.SplitContainerControl();
            this.ButtonCancel = new DevExpress.XtraEditors.SimpleButton();
            this.ButtonOK = new DevExpress.XtraEditors.SimpleButton();
            this.TBtab = new DevExpress.XtraTab.XtraTabControl();
            this.XtpT1 = new DevExpress.XtraTab.XtraTabPage();
            this.XtpT2 = new DevExpress.XtraTab.XtraTabPage();
            this.XtpTJ = new DevExpress.XtraTab.XtraTabPage();
            this.GridTJ = new DevExpress.XtraGrid.GridControl();
            this.GridView1 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.GridView10 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.XtpCK = new DevExpress.XtraTab.XtraTabPage();
            this.GridCK = new DevExpress.XtraGrid.GridControl();
            this.GridView2 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.GridView9 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.XtpGS = new DevExpress.XtraTab.XtraTabPage();
            this.GridGS = new DevExpress.XtraGrid.GridControl();
            this.GridView3 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.GridView8 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.XtpDR = new DevExpress.XtraTab.XtraTabPage();
            this.GridDR = new DevExpress.XtraGrid.GridControl();
            this.GridView4 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.XtpXZ = new DevExpress.XtraTab.XtraTabPage();
            this.GridXZ = new DevExpress.XtraGrid.GridControl();
            this.GridView5 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.XtpDY = new DevExpress.XtraTab.XtraTabPage();
            this.GridDY = new DevExpress.XtraGrid.GridControl();
            this.GridView7 = new DevExpress.XtraGrid.Views.Grid.GridView();
            this.LabelControl10 = new DevExpress.XtraEditors.LabelControl();
            this.TextMC = new DevExpress.XtraEditors.TextEdit();
            this.TextBH = new DevExpress.XtraEditors.TextEdit();
            this.Lgnbh = new DevExpress.XtraEditors.LabelControl();
            this.Lgnmc = new DevExpress.XtraEditors.LabelControl();
            this.FDTab = new DevExpress.XtraTab.XtraTabControl();
            this.Ltp1 = new DevExpress.XtraTab.XtraTabPage();
            this.ListT1 = new DevExpress.XtraEditors.CheckedListBoxControl();
            this.Ltp2 = new DevExpress.XtraTab.XtraTabPage();
            this.ListT2 = new DevExpress.XtraEditors.CheckedListBoxControl();
            this.ListGN = new DevExpress.XtraEditors.ListBoxControl();
            this.Sp1 = new DevExpress.XtraEditors.SplitContainerControl();
            this.BackgroundWorker1 = new System.ComponentModel.BackgroundWorker();
            ((System.ComponentModel.ISupportInitialize)(this.RibbonControl)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.Sp2)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.Sp2.Panel1)).BeginInit();
            this.Sp2.Panel1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.Sp2.Panel2)).BeginInit();
            this.Sp2.Panel2.SuspendLayout();
            this.Sp2.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.TBtab)).BeginInit();
            this.TBtab.SuspendLayout();
            this.XtpTJ.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.GridTJ)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView10)).BeginInit();
            this.XtpCK.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.GridCK)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView2)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView9)).BeginInit();
            this.XtpGS.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.GridGS)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView3)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView8)).BeginInit();
            this.XtpDR.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.GridDR)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView4)).BeginInit();
            this.XtpXZ.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.GridXZ)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView5)).BeginInit();
            this.XtpDY.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.GridDY)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView7)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.TextMC.Properties)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.TextBH.Properties)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.FDTab)).BeginInit();
            this.FDTab.SuspendLayout();
            this.Ltp1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.ListT1)).BeginInit();
            this.Ltp2.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.ListT2)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.ListGN)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.Sp1)).BeginInit();
            ((System.ComponentModel.ISupportInitialize)(this.Sp1.Panel1)).BeginInit();
            this.Sp1.Panel1.SuspendLayout();
            ((System.ComponentModel.ISupportInitialize)(this.Sp1.Panel2)).BeginInit();
            this.Sp1.Panel2.SuspendLayout();
            this.Sp1.SuspendLayout();
            this.SuspendLayout();
            // 
            // RibbonControl
            // 
            this.RibbonControl.ApplicationButtonText = null;
            this.RibbonControl.EmptyAreaImageOptions.ImagePadding = new System.Windows.Forms.Padding(34, 43, 34, 43);
            this.RibbonControl.ExpandCollapseItem.Id = 0;
            this.RibbonControl.Items.AddRange(new DevExpress.XtraBars.BarItem[] {
            this.RibbonControl.ExpandCollapseItem,
            this.RibbonControl.SearchEditItem,
            this.BarZR,
            this.BarTJ,
            this.BarButtonItem3,
            this.BarButtonItem4,
            this.BarZDGN,
            this.L1,
            this.R1,
            this.V1,
            this.V2,
            this.BarRUN,
            this.BarEXIT,
            this.BarHELP,
            this.BarFZ,
            this.BarZDDY,
            this.BarZDTY,
            this.R2,
            this.BarWJDR,
            this.BarGS,
            this.BarXZ,
            this.CheckDx,
            this.BarWJDC});
            this.RibbonControl.Location = new System.Drawing.Point(0, 0);
            this.RibbonControl.Margin = new System.Windows.Forms.Padding(0);
            this.RibbonControl.MaxItemId = 32;
            this.RibbonControl.Name = "RibbonControl";
            this.RibbonControl.OptionsMenuMinWidth = 377;
            this.RibbonControl.Pages.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPage[] {
            this.RibbonPage1});
            this.RibbonControl.ShowApplicationButton = DevExpress.Utils.DefaultBoolean.False;
            this.RibbonControl.ShowDisplayOptionsMenuButton = DevExpress.Utils.DefaultBoolean.False;
            this.RibbonControl.ShowQatLocationSelector = false;
            this.RibbonControl.ShowToolbarCustomizeItem = false;
            this.RibbonControl.Size = new System.Drawing.Size(1558, 128);
            this.RibbonControl.StatusBar = this.RibbonStatusBar;
            this.RibbonControl.Toolbar.ShowCustomizeItem = false;
            this.RibbonControl.ToolbarLocation = DevExpress.XtraBars.Ribbon.RibbonQuickAccessToolbarLocation.Hidden;
            // 
            // BarZR
            // 
            this.BarZR.Caption = "载入";
            this.BarZR.Id = 1;
            this.BarZR.ImageOptions.LargeImageIndex = 0;
            this.BarZR.Name = "BarZR";
            this.BarZR.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarTJ
            // 
            this.BarTJ.Caption = "提交";
            this.BarTJ.Id = 2;
            this.BarTJ.ImageOptions.LargeImageIndex = 1;
            this.BarTJ.Name = "BarTJ";
            this.BarTJ.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarButtonItem3
            // 
            this.BarButtonItem3.Caption = "确定";
            this.BarButtonItem3.Id = 3;
            this.BarButtonItem3.Name = "BarButtonItem3";
            this.BarButtonItem3.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarButtonItem4
            // 
            this.BarButtonItem4.Caption = "取消";
            this.BarButtonItem4.Id = 4;
            this.BarButtonItem4.Name = "BarButtonItem4";
            this.BarButtonItem4.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarZDGN
            // 
            this.BarZDGN.Caption = "功能字典";
            this.BarZDGN.Id = 7;
            this.BarZDGN.ImageOptions.LargeImageIndex = 11;
            this.BarZDGN.Name = "BarZDGN";
            this.BarZDGN.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // L1
            // 
            this.L1.Caption = "L1";
            this.L1.Id = 8;
            this.L1.Name = "L1";
            // 
            // R1
            // 
            this.R1.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
            this.R1.Caption = "R1";
            this.R1.Id = 11;
            this.R1.Name = "R1";
            // 
            // V1
            // 
            this.V1.BindableChecked = true;
            this.V1.Caption = "网格";
            this.V1.Checked = true;
            this.V1.Id = 12;
            this.V1.ImageOptions.LargeImageIndex = 2;
            this.V1.Name = "V1";
            this.V1.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // V2
            // 
            this.V2.Caption = "卡片";
            this.V2.Id = 13;
            this.V2.ImageOptions.LargeImageIndex = 3;
            this.V2.Name = "V2";
            this.V2.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarRUN
            // 
            this.BarRUN.Caption = "当前功能运行测试";
            this.BarRUN.Id = 14;
            this.BarRUN.ImageOptions.LargeImageIndex = 5;
            this.BarRUN.Name = "BarRUN";
            this.BarRUN.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarEXIT
            // 
            this.BarEXIT.Caption = "返回";
            this.BarEXIT.Id = 17;
            this.BarEXIT.ImageOptions.LargeImageIndex = 6;
            this.BarEXIT.Name = "BarEXIT";
            this.BarEXIT.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarHELP
            // 
            this.BarHELP.Caption = "帮助";
            this.BarHELP.Id = 18;
            this.BarHELP.ImageOptions.LargeImageIndex = 7;
            this.BarHELP.Name = "BarHELP";
            this.BarHELP.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarFZ
            // 
            this.BarFZ.Caption = "复制功能定义";
            this.BarFZ.Id = 19;
            this.BarFZ.ImageOptions.LargeImageIndex = 8;
            this.BarFZ.Name = "BarFZ";
            this.BarFZ.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            toolTipTitleItem1.Text = "从当前定义复制其他功能";
            toolTipItem1.LeftIndent = 6;
            toolTipItem1.Text = "复制时输入目标功能编号,如果目标功能已经定义将被覆盖。";
            superToolTip1.Items.Add(toolTipTitleItem1);
            superToolTip1.Items.Add(toolTipItem1);
            this.BarFZ.SuperTip = superToolTip1;
            // 
            // BarZDDY
            // 
            this.BarZDDY.Caption = "设计字典";
            this.BarZDDY.Id = 21;
            this.BarZDDY.ImageOptions.LargeImageIndex = 4;
            this.BarZDDY.Name = "BarZDDY";
            this.BarZDDY.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarZDTY
            // 
            this.BarZDTY.Caption = "系统字典";
            this.BarZDTY.Id = 22;
            this.BarZDTY.ImageOptions.LargeImageIndex = 10;
            this.BarZDTY.Name = "BarZDTY";
            this.BarZDTY.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // R2
            // 
            this.R2.Alignment = DevExpress.XtraBars.BarItemLinkAlignment.Right;
            this.R2.Caption = "R2";
            this.R2.Id = 25;
            this.R2.Name = "R2";
            // 
            // BarWJDR
            // 
            this.BarWJDR.Caption = "文件导入";
            this.BarWJDR.Id = 26;
            this.BarWJDR.Name = "BarWJDR";
            this.BarWJDR.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            toolTipTitleItem2.Text = "从文件中导入当前功能的定义";
            toolTipItem2.LeftIndent = 6;
            toolTipItem2.Text = "从之前导出的文件中导入当前功能的定义,导入输入之前文件中的功能编号";
            superToolTip2.Items.Add(toolTipTitleItem2);
            superToolTip2.Items.Add(toolTipItem2);
            this.BarWJDR.SuperTip = superToolTip2;
            // 
            // BarGS
            // 
            this.BarGS.Caption = "复制计算公式";
            this.BarGS.Id = 28;
            this.BarGS.Name = "BarGS";
            this.BarGS.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // BarXZ
            // 
            this.BarXZ.Caption = "复制输入限制";
            this.BarXZ.Id = 29;
            this.BarXZ.Name = "BarXZ";
            this.BarXZ.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            // 
            // CheckDx
            // 
            this.CheckDx.Caption = "多选模式";
            this.CheckDx.Id = 30;
            this.CheckDx.Name = "CheckDx";
            this.CheckDx.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            toolTipItem3.Text = "多选模式是指在表格中可选择多个单元或多个行,用于复制和粘贴。";
            superToolTip3.Items.Add(toolTipItem3);
            this.CheckDx.SuperTip = superToolTip3;
            // 
            // BarWJDC
            // 
            this.BarWJDC.Caption = "文件导出";
            this.BarWJDC.Id = 31;
            this.BarWJDC.Name = "BarWJDC";
            this.BarWJDC.RibbonStyle = DevExpress.XtraBars.Ribbon.RibbonItemStyles.Large;
            toolTipTitleItem3.Text = "导出所有功能定义到文件";
            toolTipItem4.Text = "将当前账套所有功能定义导出到文件中";
            superToolTip4.Items.Add(toolTipTitleItem3);
            superToolTip4.Items.Add(toolTipItem4);
            this.BarWJDC.SuperTip = superToolTip4;
            // 
            // RibbonPage1
            // 
            this.RibbonPage1.Groups.AddRange(new DevExpress.XtraBars.Ribbon.RibbonPageGroup[] {
            this.RibbonPageGroup1,
            this.RibbonPageGroup6,
            this.RibbonPageGroup2,
            this.RibbonPageGroup3,
            this.RibbonPageGroup4,
            this.RibbonPageGroup5});
            this.RibbonPage1.Name = "RibbonPage1";
            this.RibbonPage1.Text = "功能定义";
            // 
            // RibbonPageGroup1
            // 
            this.RibbonPageGroup1.ItemLinks.Add(this.BarZR);
            this.RibbonPageGroup1.ItemLinks.Add(this.BarTJ);
            this.RibbonPageGroup1.Name = "RibbonPageGroup1";
            this.RibbonPageGroup1.Text = "数据";
            // 
            // RibbonPageGroup6
            // 
            this.RibbonPageGroup6.ItemLinks.Add(this.BarFZ);
            this.RibbonPageGroup6.ItemLinks.Add(this.BarGS);
            this.RibbonPageGroup6.ItemLinks.Add(this.BarXZ);
            this.RibbonPageGroup6.ItemLinks.Add(this.BarWJDC);
            this.RibbonPageGroup6.ItemLinks.Add(this.BarWJDR);
            this.RibbonPageGroup6.Name = "RibbonPageGroup6";
            this.RibbonPageGroup6.Text = "复制";
            // 
            // RibbonPageGroup2
            // 
            this.RibbonPageGroup2.ItemLinks.Add(this.CheckDx, true);
            this.RibbonPageGroup2.Name = "RibbonPageGroup2";
            this.RibbonPageGroup2.Text = "编辑";
            // 
            // RibbonPageGroup3
            // 
            this.RibbonPageGroup3.ItemLinks.Add(this.BarZDDY, true);
            this.RibbonPageGroup3.ItemLinks.Add(this.BarZDTY);
            this.RibbonPageGroup3.ItemLinks.Add(this.BarZDGN);
            this.RibbonPageGroup3.Name = "RibbonPageGroup3";
            this.RibbonPageGroup3.Text = "数据字典";
            // 
            // RibbonPageGroup4
            // 
            this.RibbonPageGroup4.ItemLinks.Add(this.BarRUN);
            this.RibbonPageGroup4.Name = "RibbonPageGroup4";
            this.RibbonPageGroup4.Text = "功能测试";
            // 
            // RibbonPageGroup5
            // 
            this.RibbonPageGroup5.ItemLinks.Add(this.BarHELP);
            this.RibbonPageGroup5.ItemLinks.Add(this.BarEXIT);
            this.RibbonPageGroup5.Name = "RibbonPageGroup5";
            this.RibbonPageGroup5.Text = "帮助";
            // 
            // RibbonStatusBar
            // 
            this.RibbonStatusBar.ItemLinks.Add(this.L1);
            this.RibbonStatusBar.ItemLinks.Add(this.R1);
            this.RibbonStatusBar.ItemLinks.Add(this.R2);
            this.RibbonStatusBar.Location = new System.Drawing.Point(0, 741);
            this.RibbonStatusBar.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.RibbonStatusBar.Name = "RibbonStatusBar";
            this.RibbonStatusBar.Ribbon = this.RibbonControl;
            this.RibbonStatusBar.Size = new System.Drawing.Size(1558, 27);
            // 
            // Sp2
            // 
            this.Sp2.CollapsePanel = DevExpress.XtraEditors.SplitCollapsePanel.Panel2;
            this.Sp2.Dock = System.Windows.Forms.DockStyle.Fill;
            this.Sp2.FixedPanel = DevExpress.XtraEditors.SplitFixedPanel.Panel2;
            this.Sp2.Location = new System.Drawing.Point(2, 2);
            this.Sp2.Margin = new System.Windows.Forms.Padding(0);
            this.Sp2.Name = "Sp2";
            // 
            // Sp2.Panel1
            // 
            this.Sp2.Panel1.Controls.Add(this.ButtonCancel);
            this.Sp2.Panel1.Controls.Add(this.ButtonOK);
            this.Sp2.Panel1.Controls.Add(this.TBtab);
            this.Sp2.Panel1.Controls.Add(this.LabelControl10);
            this.Sp2.Panel1.Controls.Add(this.TextMC);
            this.Sp2.Panel1.Controls.Add(this.TextBH);
            this.Sp2.Panel1.Controls.Add(this.Lgnbh);
            this.Sp2.Panel1.Controls.Add(this.Lgnmc);
            this.Sp2.Panel1.Text = "Panel1";
            // 
            // Sp2.Panel2
            // 
            this.Sp2.Panel2.Controls.Add(this.FDTab);
            this.Sp2.Panel2.Text = "Panel2";
            this.Sp2.Size = new System.Drawing.Size(1272, 609);
            this.Sp2.SplitterPosition = 272;
            this.Sp2.TabIndex = 1;
            this.Sp2.Text = "SplitContainerControl2";
            // 
            // ButtonCancel
            // 
            this.ButtonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.ButtonCancel.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.ButtonCancel.Appearance.Options.UseFont = true;
            this.ButtonCancel.Location = new System.Drawing.Point(858, 9);
            this.ButtonCancel.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.ButtonCancel.Name = "ButtonCancel";
            this.ButtonCancel.Size = new System.Drawing.Size(90, 36);
            this.ButtonCancel.TabIndex = 21;
            this.ButtonCancel.Text = "取消(&C)";
            this.ButtonCancel.ToolTip = "取消编辑";
            // 
            // ButtonOK
            // 
            this.ButtonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
            this.ButtonOK.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.ButtonOK.Appearance.Options.UseFont = true;
            this.ButtonOK.Location = new System.Drawing.Point(752, 9);
            this.ButtonOK.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.ButtonOK.Name = "ButtonOK";
            this.ButtonOK.Size = new System.Drawing.Size(90, 36);
            this.ButtonOK.TabIndex = 20;
            this.ButtonOK.Text = "确定(&O)";
            this.ButtonOK.ToolTip = "保存编辑";
            // 
            // TBtab
            // 
            this.TBtab.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
            | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.TBtab.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.TBtab.Appearance.Options.UseFont = true;
            this.TBtab.Location = new System.Drawing.Point(1, 61);
            this.TBtab.Margin = new System.Windows.Forms.Padding(0);
            this.TBtab.Name = "TBtab";
            this.TBtab.SelectedTabPage = this.XtpT1;
            this.TBtab.ShowTabHeader = DevExpress.Utils.DefaultBoolean.True;
            this.TBtab.Size = new System.Drawing.Size(987, 546);
            this.TBtab.TabIndex = 0;
            this.TBtab.TabPages.AddRange(new DevExpress.XtraTab.XtraTabPage[] {
            this.XtpT1,
            this.XtpT2,
            this.XtpTJ,
            this.XtpCK,
            this.XtpGS,
            this.XtpDR,
            this.XtpXZ,
            this.XtpDY});
            // 
            // XtpT1
            // 
            this.XtpT1.Margin = new System.Windows.Forms.Padding(0);
            this.XtpT1.Name = "XtpT1";
            this.XtpT1.Size = new System.Drawing.Size(775, 471);
            this.XtpT1.Text = "数据表1";
            // 
            // XtpT2
            // 
            this.XtpT2.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.XtpT2.Name = "XtpT2";
            this.XtpT2.Size = new System.Drawing.Size(775, 471);
            this.XtpT2.Text = "数据表2";
            // 
            // XtpTJ
            // 
            this.XtpTJ.Controls.Add(this.GridTJ);
            this.XtpTJ.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.XtpTJ.Name = "XtpTJ";
            this.XtpTJ.Size = new System.Drawing.Size(775, 471);
            this.XtpTJ.Text = "载入条件";
            // 
            // GridTJ
            // 
            this.GridTJ.Dock = System.Windows.Forms.DockStyle.Fill;
            this.GridTJ.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridTJ.Location = new System.Drawing.Point(0, 0);
            this.GridTJ.MainView = this.GridView1;
            this.GridTJ.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridTJ.MenuManager = this.RibbonControl;
            this.GridTJ.Name = "GridTJ";
            this.GridTJ.Size = new System.Drawing.Size(775, 471);
            this.GridTJ.TabIndex = 0;
            this.GridTJ.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
            this.GridView1,
            this.GridView10});
            // 
            // GridView1
            // 
            this.GridView1.DetailHeight = 389;
            this.GridView1.GridControl = this.GridTJ;
            this.GridView1.Name = "GridView1";
            // 
            // GridView10
            // 
            this.GridView10.DetailHeight = 389;
            this.GridView10.GridControl = this.GridTJ;
            this.GridView10.Name = "GridView10";
            // 
            // XtpCK
            // 
            this.XtpCK.Controls.Add(this.GridCK);
            this.XtpCK.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.XtpCK.Name = "XtpCK";
            this.XtpCK.Size = new System.Drawing.Size(775, 471);
            this.XtpCK.Text = "关联信息";
            // 
            // GridCK
            // 
            this.GridCK.Dock = System.Windows.Forms.DockStyle.Fill;
            this.GridCK.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridCK.Location = new System.Drawing.Point(0, 0);
            this.GridCK.MainView = this.GridView2;
            this.GridCK.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridCK.MenuManager = this.RibbonControl;
            this.GridCK.Name = "GridCK";
            this.GridCK.Size = new System.Drawing.Size(775, 471);
            this.GridCK.TabIndex = 0;
            this.GridCK.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
            this.GridView2,
            this.GridView9});
            // 
            // GridView2
            // 
            this.GridView2.DetailHeight = 389;
            this.GridView2.GridControl = this.GridCK;
            this.GridView2.Name = "GridView2";
            // 
            // GridView9
            // 
            this.GridView9.DetailHeight = 389;
            this.GridView9.GridControl = this.GridCK;
            this.GridView9.Name = "GridView9";
            // 
            // XtpGS
            // 
            this.XtpGS.Controls.Add(this.GridGS);
            this.XtpGS.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.XtpGS.Name = "XtpGS";
            this.XtpGS.Size = new System.Drawing.Size(775, 471);
            this.XtpGS.Text = "计算公式";
            // 
            // GridGS
            // 
            this.GridGS.Dock = System.Windows.Forms.DockStyle.Fill;
            this.GridGS.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridGS.Location = new System.Drawing.Point(0, 0);
            this.GridGS.MainView = this.GridView3;
            this.GridGS.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridGS.MenuManager = this.RibbonControl;
            this.GridGS.Name = "GridGS";
            this.GridGS.Size = new System.Drawing.Size(775, 471);
            this.GridGS.TabIndex = 1;
            this.GridGS.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
            this.GridView3,
            this.GridView8});
            // 
            // GridView3
            // 
            this.GridView3.DetailHeight = 389;
            this.GridView3.GridControl = this.GridGS;
            this.GridView3.Name = "GridView3";
            // 
            // GridView8
            // 
            this.GridView8.DetailHeight = 389;
            this.GridView8.GridControl = this.GridGS;
            this.GridView8.Name = "GridView8";
            // 
            // XtpDR
            // 
            this.XtpDR.Controls.Add(this.GridDR);
            this.XtpDR.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.XtpDR.Name = "XtpDR";
            this.XtpDR.Size = new System.Drawing.Size(985, 520);
            this.XtpDR.Text = "数据调入";
            // 
            // GridDR
            // 
            this.GridDR.Dock = System.Windows.Forms.DockStyle.Fill;
            this.GridDR.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridDR.Location = new System.Drawing.Point(0, 0);
            this.GridDR.MainView = this.GridView4;
            this.GridDR.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridDR.MenuManager = this.RibbonControl;
            this.GridDR.Name = "GridDR";
            this.GridDR.Size = new System.Drawing.Size(985, 520);
            this.GridDR.TabIndex = 1;
            this.GridDR.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
            this.GridView4});
            // 
            // GridView4
            // 
            this.GridView4.DetailHeight = 389;
            this.GridView4.GridControl = this.GridDR;
            this.GridView4.Name = "GridView4";
            // 
            // XtpXZ
            // 
            this.XtpXZ.Controls.Add(this.GridXZ);
            this.XtpXZ.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.XtpXZ.Name = "XtpXZ";
            this.XtpXZ.Size = new System.Drawing.Size(775, 471);
            this.XtpXZ.Text = "输入限制";
            // 
            // GridXZ
            // 
            this.GridXZ.Dock = System.Windows.Forms.DockStyle.Fill;
            this.GridXZ.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridXZ.Location = new System.Drawing.Point(0, 0);
            this.GridXZ.MainView = this.GridView5;
            this.GridXZ.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridXZ.MenuManager = this.RibbonControl;
            this.GridXZ.Name = "GridXZ";
            this.GridXZ.Size = new System.Drawing.Size(775, 471);
            this.GridXZ.TabIndex = 1;
            this.GridXZ.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
            this.GridView5});
            // 
            // GridView5
            // 
            this.GridView5.DetailHeight = 389;
            this.GridView5.GridControl = this.GridXZ;
            this.GridView5.Name = "GridView5";
            // 
            // XtpDY
            // 
            this.XtpDY.Controls.Add(this.GridDY);
            this.XtpDY.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.XtpDY.Name = "XtpDY";
            this.XtpDY.Size = new System.Drawing.Size(985, 520);
            this.XtpDY.Text = "打印模板";
            // 
            // GridDY
            // 
            this.GridDY.Dock = System.Windows.Forms.DockStyle.Fill;
            this.GridDY.EmbeddedNavigator.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridDY.Location = new System.Drawing.Point(0, 0);
            this.GridDY.MainView = this.GridView7;
            this.GridDY.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.GridDY.MenuManager = this.RibbonControl;
            this.GridDY.Name = "GridDY";
            this.GridDY.Size = new System.Drawing.Size(985, 520);
            this.GridDY.TabIndex = 3;
            this.GridDY.ViewCollection.AddRange(new DevExpress.XtraGrid.Views.Base.BaseView[] {
            this.GridView7});
            // 
            // GridView7
            // 
            this.GridView7.DetailHeight = 389;
            this.GridView7.GridControl = this.GridDY;
            this.GridView7.Name = "GridView7";
            // 
            // LabelControl10
            // 
            this.LabelControl10.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
            | System.Windows.Forms.AnchorStyles.Right)));
            this.LabelControl10.Appearance.BorderColor = System.Drawing.Color.Red;
            this.LabelControl10.Appearance.Options.UseBorderColor = true;
            this.LabelControl10.AutoSizeMode = DevExpress.XtraEditors.LabelAutoSizeMode.None;
            this.LabelControl10.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Simple;
            this.LabelControl10.Location = new System.Drawing.Point(12, 49);
            this.LabelControl10.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.LabelControl10.Name = "LabelControl10";
            this.LabelControl10.Size = new System.Drawing.Size(969, 3);
            this.LabelControl10.TabIndex = 19;
            // 
            // TextMC
            // 
            this.TextMC.Location = new System.Drawing.Point(235, 13);
            this.TextMC.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.TextMC.MenuManager = this.RibbonControl;
            this.TextMC.Name = "TextMC";
            this.TextMC.Properties.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.TextMC.Properties.Appearance.Options.UseFont = true;
            this.TextMC.Properties.ReadOnly = true;
            this.TextMC.Size = new System.Drawing.Size(225, 28);
            this.TextMC.TabIndex = 3;
            // 
            // TextBH
            // 
            this.TextBH.Location = new System.Drawing.Point(86, 13);
            this.TextBH.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.TextBH.MenuManager = this.RibbonControl;
            this.TextBH.Name = "TextBH";
            this.TextBH.Properties.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.TextBH.Properties.Appearance.Options.UseFont = true;
            this.TextBH.Properties.ReadOnly = true;
            this.TextBH.Size = new System.Drawing.Size(55, 28);
            this.TextBH.TabIndex = 2;
            // 
            // Lgnbh
            // 
            this.Lgnbh.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.Lgnbh.Appearance.Options.UseFont = true;
            this.Lgnbh.Location = new System.Drawing.Point(16, 17);
            this.Lgnbh.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.Lgnbh.Name = "Lgnbh";
            this.Lgnbh.Size = new System.Drawing.Size(64, 21);
            this.Lgnbh.TabIndex = 0;
            this.Lgnbh.Text = "功能编号";
            // 
            // Lgnmc
            // 
            this.Lgnmc.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.Lgnmc.Appearance.Options.UseFont = true;
            this.Lgnmc.Location = new System.Drawing.Point(165, 17);
            this.Lgnmc.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.Lgnmc.Name = "Lgnmc";
            this.Lgnmc.Size = new System.Drawing.Size(64, 21);
            this.Lgnmc.TabIndex = 1;
            this.Lgnmc.Text = "功能名称";
            // 
            // FDTab
            // 
            this.FDTab.Dock = System.Windows.Forms.DockStyle.Fill;
            this.FDTab.HeaderLocation = DevExpress.XtraTab.TabHeaderLocation.Bottom;
            this.FDTab.Location = new System.Drawing.Point(0, 0);
            this.FDTab.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.FDTab.MultiLine = DevExpress.Utils.DefaultBoolean.False;
            this.FDTab.Name = "FDTab";
            this.FDTab.SelectedTabPage = this.Ltp1;
            this.FDTab.Size = new System.Drawing.Size(272, 609);
            this.FDTab.TabIndex = 0;
            this.FDTab.TabPages.AddRange(new DevExpress.XtraTab.XtraTabPage[] {
            this.Ltp1,
            this.Ltp2});
            // 
            // Ltp1
            // 
            this.Ltp1.Controls.Add(this.ListT1);
            this.Ltp1.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.Ltp1.Name = "Ltp1";
            this.Ltp1.Size = new System.Drawing.Size(270, 534);
            this.Ltp1.Text = "表1";
            // 
            // ListT1
            // 
            this.ListT1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.ListT1.ItemHeight = 23;
            this.ListT1.ItemPadding = new System.Windows.Forms.Padding(3);
            this.ListT1.Location = new System.Drawing.Point(0, 0);
            this.ListT1.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.ListT1.Name = "ListT1";
            this.ListT1.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
            this.ListT1.Size = new System.Drawing.Size(270, 534);
            this.ListT1.TabIndex = 1;
            // 
            // Ltp2
            // 
            this.Ltp2.Controls.Add(this.ListT2);
            this.Ltp2.Margin = new System.Windows.Forms.Padding(3, 6, 3, 6);
            this.Ltp2.Name = "Ltp2";
            this.Ltp2.Size = new System.Drawing.Size(270, 583);
            this.Ltp2.Text = "表2";
            // 
            // ListT2
            // 
            this.ListT2.Dock = System.Windows.Forms.DockStyle.Fill;
            this.ListT2.ItemHeight = 29;
            this.ListT2.Location = new System.Drawing.Point(0, 0);
            this.ListT2.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.ListT2.Name = "ListT2";
            this.ListT2.SelectionMode = System.Windows.Forms.SelectionMode.MultiSimple;
            this.ListT2.Size = new System.Drawing.Size(270, 583);
            this.ListT2.TabIndex = 1;
            // 
            // ListGN
            // 
            this.ListGN.Dock = System.Windows.Forms.DockStyle.Fill;
            this.ListGN.ItemHeight = 23;
            this.ListGN.ItemPadding = new System.Windows.Forms.Padding(3);
            this.ListGN.Location = new System.Drawing.Point(0, 0);
            this.ListGN.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.ListGN.Name = "ListGN";
            this.ListGN.Size = new System.Drawing.Size(272, 613);
            this.ListGN.TabIndex = 0;
            // 
            // Sp1
            // 
            this.Sp1.Dock = System.Windows.Forms.DockStyle.Fill;
            this.Sp1.Location = new System.Drawing.Point(0, 128);
            this.Sp1.Margin = new System.Windows.Forms.Padding(0);
            this.Sp1.Name = "Sp1";
            // 
            // Sp1.Panel1
            // 
            this.Sp1.Panel1.Controls.Add(this.ListGN);
            this.Sp1.Panel1.Text = "Panel1";
            // 
            // Sp1.Panel2
            // 
            this.Sp1.Panel2.Controls.Add(this.Sp2);
            this.Sp1.Panel2.Padding = new System.Windows.Forms.Padding(2);
            this.Sp1.Panel2.Text = "Panel2";
            this.Sp1.Size = new System.Drawing.Size(1558, 613);
            this.Sp1.SplitterPosition = 272;
            this.Sp1.TabIndex = 3;
            this.Sp1.Text = "SplitContainerControl1";
            // 
            // BackgroundWorker1
            // 
            this.BackgroundWorker1.WorkerSupportsCancellation = true;
            // 
            // RF0gndy
            // 
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
            this.ClientSize = new System.Drawing.Size(1558, 768);
            this.Controls.Add(this.Sp1);
            this.Controls.Add(this.RibbonStatusBar);
            this.Controls.Add(this.RibbonControl);
            this.IconOptions.ShowIcon = false;
            this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
            this.Name = "RF0gndy";
            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
            this.Text = "RFgndy";
            ((System.ComponentModel.ISupportInitialize)(this.RibbonControl)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.Sp2.Panel1)).EndInit();
            this.Sp2.Panel1.ResumeLayout(false);
            this.Sp2.Panel1.PerformLayout();
            ((System.ComponentModel.ISupportInitialize)(this.Sp2.Panel2)).EndInit();
            this.Sp2.Panel2.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.Sp2)).EndInit();
            this.Sp2.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.TBtab)).EndInit();
            this.TBtab.ResumeLayout(false);
            this.XtpTJ.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.GridTJ)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView1)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView10)).EndInit();
            this.XtpCK.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.GridCK)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView2)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView9)).EndInit();
            this.XtpGS.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.GridGS)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView3)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView8)).EndInit();
            this.XtpDR.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.GridDR)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView4)).EndInit();
            this.XtpXZ.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.GridXZ)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView5)).EndInit();
            this.XtpDY.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.GridDY)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.GridView7)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.TextMC.Properties)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.TextBH.Properties)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.FDTab)).EndInit();
            this.FDTab.ResumeLayout(false);
            this.Ltp1.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.ListT1)).EndInit();
            this.Ltp2.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.ListT2)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.ListGN)).EndInit();
            ((System.ComponentModel.ISupportInitialize)(this.Sp1.Panel1)).EndInit();
            this.Sp1.Panel1.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.Sp1.Panel2)).EndInit();
            this.Sp1.Panel2.ResumeLayout(false);
            ((System.ComponentModel.ISupportInitialize)(this.Sp1)).EndInit();
            this.Sp1.ResumeLayout(false);
            this.ResumeLayout(false);
            this.PerformLayout();

        }

        private DevExpress.XtraBars.Ribbon.RibbonControl RibbonControl;
        private DevExpress.XtraBars.BarButtonItem BarZR;
        private DevExpress.XtraBars.BarButtonItem BarTJ;
        private DevExpress.XtraBars.BarButtonItem BarButtonItem3;
        private DevExpress.XtraBars.BarButtonItem BarButtonItem4;
        private DevExpress.XtraBars.BarButtonItem BarZDGN;
        private DevExpress.XtraBars.BarStaticItem L1;
        private DevExpress.XtraBars.BarStaticItem R1;
        private DevExpress.XtraBars.BarCheckItem V1;
        private DevExpress.XtraBars.BarCheckItem V2;
        private DevExpress.XtraBars.BarButtonItem BarRUN;
        private DevExpress.XtraBars.BarButtonItem BarEXIT;
        private DevExpress.XtraBars.BarButtonItem BarHELP;
        private DevExpress.XtraBars.BarButtonItem BarFZ;
        private DevExpress.XtraBars.BarButtonItem BarZDDY;
        private DevExpress.XtraBars.BarButtonItem BarZDTY;
        private DevExpress.XtraBars.BarStaticItem R2;
        private DevExpress.XtraBars.BarButtonItem BarWJDR;
        private DevExpress.XtraBars.BarButtonItem BarGS;
        private DevExpress.XtraBars.BarButtonItem BarXZ;
        private DevExpress.XtraBars.BarCheckItem CheckDx;
        private DevExpress.XtraBars.BarButtonItem BarWJDC;
        private DevExpress.XtraBars.Ribbon.RibbonPage RibbonPage1;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup RibbonPageGroup1;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup RibbonPageGroup6;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup RibbonPageGroup2;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup RibbonPageGroup3;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup RibbonPageGroup4;
        private DevExpress.XtraBars.Ribbon.RibbonPageGroup RibbonPageGroup5;
        private DevExpress.XtraBars.Ribbon.RibbonStatusBar RibbonStatusBar;
        private DevExpress.XtraEditors.SplitContainerControl Sp2;
        private DevExpress.XtraEditors.SimpleButton ButtonCancel;
        private DevExpress.XtraEditors.SimpleButton ButtonOK;
        private DevExpress.XtraTab.XtraTabControl TBtab;
        private DevExpress.XtraTab.XtraTabPage XtpT1;
        private DevExpress.XtraTab.XtraTabPage XtpT2;
        private DevExpress.XtraTab.XtraTabPage XtpTJ;
        private DevExpress.XtraGrid.GridControl GridTJ;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView1;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView10;
        private DevExpress.XtraTab.XtraTabPage XtpCK;
        private DevExpress.XtraGrid.GridControl GridCK;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView2;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView9;
        private DevExpress.XtraTab.XtraTabPage XtpGS;
        private DevExpress.XtraGrid.GridControl GridGS;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView3;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView8;
        private DevExpress.XtraTab.XtraTabPage XtpDR;
        private DevExpress.XtraGrid.GridControl GridDR;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView4;
        private DevExpress.XtraTab.XtraTabPage XtpXZ;
        private DevExpress.XtraGrid.GridControl GridXZ;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView5;
        private DevExpress.XtraTab.XtraTabPage XtpDY;
        private DevExpress.XtraGrid.GridControl GridDY;
        private DevExpress.XtraGrid.Views.Grid.GridView GridView7;
        private DevExpress.XtraEditors.LabelControl LabelControl10;
        private DevExpress.XtraEditors.TextEdit TextMC;
        private DevExpress.XtraEditors.TextEdit TextBH;
        private DevExpress.XtraEditors.LabelControl Lgnbh;
        private DevExpress.XtraEditors.LabelControl Lgnmc;
        private DevExpress.XtraTab.XtraTabControl FDTab;
        private DevExpress.XtraTab.XtraTabPage Ltp1;
        private DevExpress.XtraEditors.CheckedListBoxControl ListT1;
        private DevExpress.XtraTab.XtraTabPage Ltp2;
        private DevExpress.XtraEditors.CheckedListBoxControl ListT2;
        private DevExpress.XtraEditors.ListBoxControl ListGN;
        private DevExpress.XtraEditors.SplitContainerControl Sp1;
        private System.ComponentModel.BackgroundWorker BackgroundWorker1;
    }
}

三、功能定义窗体设计器代码说明

FmGndy.Designer.cs 窗口设计器代码说明。

(一)文件概述

文件名称 : FmGndy.Designer.cs
所属项目 : KcErp (ERP系统)
窗口类型 : 功能定义管理窗口
主要用途 : ERP系统的功能配置与自定义管理界面,对应 x9_gn 表的数据管理

(二)界面结构设计

2.1 整体布局架构

复制代码
FmGndy (功能定义窗口)
├── RibbonControl (功能区控件)
├── Sp1 (主分割容器)
│   ├── Panel1: ListGN (功能列表)
│   └── Panel2: Sp2 (功能详细编辑区)
│       ├── Panel1: TBtab + 基本信息 (功能配置区)
│       └── Panel2: FDTab (字段选择区)
└── RibbonStatusBar (状态栏)

2.2 功能区(RibbonControl)设计

功能区按钮分组:
分组名称 包含按钮 功能描述
数据 BarZR, BarTJ 载入、提交数据操作
复制 BarFZ, BarGS, BarXZ, BarWJDC, BarWJDR 功能复制、导入导出
编辑 CheckDx 多选模式切换
数据字典 BarZDDY, BarZDTY, BarZDGN 字典相关操作
功能测试 BarRUN 运行当前功能测试
帮助 BarHELP, BarEXIT 帮助和返回
核心按钮功能说明:
按钮名称 功能说明
BarZR (载入) 加载功能数据
BarTJ (提交) 保存功能定义
BarFZ (复制功能定义) 复制当前功能到其他功能
BarZDDY (设计字典) 打开设计字典管理
BarZDTY (系统字典) 打开系统字典管理
BarRUN (当前功能运行测试) 测试当前定义的功能
BarWJDR (文件导入) 从文件导入功能定义
BarWJDC (文件导出) 导出功能定义到文件

2.3 核心功能区设计

左侧面板 (Panel1)
  • ListGN: 功能列表控件,显示所有功能供选择
右侧编辑区 (Panel2 → Sp2)

2.3.1 基本信息区

  • TextBH: 功能编号输入框 (只读)
  • TextMC: 功能名称输入框 (只读)
  • ButtonOK: 确定按钮 (保存)
  • ButtonCancel: 取消按钮

2.3.2 标签页配置区 (TBtab)

包含8个配置标签页:

标签页 名称 用途 对应控件
XtpT1 数据表1 主数据表配置 (待填充)
XtpT2 数据表2 辅助数据表配置 (待填充)
XtpTJ 载入条件 数据加载条件配置 GridTJ (网格控件)
XtpCK 关联信息 关联信息配置 GridCK (网格控件)
XtpGS 计算公式 计算规则配置 GridGS (网格控件)
XtpDR 数据调入 数据导入配置 GridDR (网格控件)
XtpXZ 输入限制 输入验证规则 GridXZ (网格控件)
XtpDY 打印模板 打印模板配置 GridDY (网格控件)

2.3.3 字段选择区 (FDTab)

包含2个字段列表标签页:

  • Ltp1 (表1): ListT1 (表1字段复选框列表)
  • Ltp2 (表2): ListT2 (表2字段复选框列表)

(三)控件映射关系

3.1 与数据库表 x9_gn 的映射

界面控件 对应字段 说明
TextBH gnbh 功能编号
TextMC gnmc 功能名称
(推测) gnly 通过功能来源区分系统/自定义
(推测) sfqy 通过BarRUN测试启用状态
(推测) sfyc 通过显示/隐藏控制

3.2 功能配置存储结构推测

复制代码
功能定义 → 对应多个配置项:
├── 基本信息 (x9_gn表)
├── 数据表配置 (T1/T2标签页)
├── 加载条件 (XtpTJ网格)
├── 关联信息 (XtpCK网格)
├── 计算公式 (XtpGS网格)
├── 输入限制 (XtpXZ网格)
├── 打印模板 (XtpDY网格)
└── 字段选择 (ListT1/ListT2)

(四)用户自定义功能流程

4.1 新建自定义功能

  1. 选择源功能: 在ListGN中选择要复制的功能
  2. 复制功能: 点击BarFZ复制功能定义
  3. 修改配置 : 在TBtab各标签页中修改配置
    • 设置数据表字段 (ListT1/ListT2)
    • 配置加载条件 (GridTJ)
    • 定义计算公式 (GridGS)
    • 设置输入限制 (GridXZ)
  4. 保存功能: 点击ButtonOK保存
  5. 测试功能: 点击BarRUN测试新功能

4.2 导入导出功能

  1. 导出功能: BarWJDC → 导出当前账套所有功能
  2. 导入功能: BarWJDR → 从文件导入功能定义

4.3 字典管理

  1. 设计字典: BarZDDY → 用户自定义字典
  2. 系统字典: BarZDTY → 系统内置字典
  3. 功能字典: BarZDGN → 功能相关字典

(五)技术特点

5.1 UI框架

  • 使用DevExpress WinForms控件库
  • Ribbon界面风格,符合现代应用标准
  • 分割容器布局,灵活调整界面区域

5.2 数据绑定

  • 网格控件(GridControl)用于复杂数据编辑
  • 复选框列表(CheckedListBoxControl)用于字段选择
  • 列表控件(ListBoxControl)用于功能导航

5.3 异步处理

  • 包含BackgroundWorker1,支持后台操作
  • 防止界面卡顿,提升用户体验

(六)扩展建议

6.1 可增强的功能

  1. 版本管理: 增加功能版本历史记录
  2. 权限控制: 不同用户可自定义的功能范围
  3. 模板库: 预置常用功能模板
  4. 批量操作: 批量启用/禁用功能

6.2 代码结构优化

  1. 分离业务逻辑: 将界面与业务逻辑分离
  2. 配置持久化: 完善配置的保存和加载机制
  3. 错误处理: 增加详细的错误提示和日志

6.3 用户体验改进

  1. 拖拽配置: 支持字段拖拽排序
  2. 预览功能: 实时预览功能效果
  3. 搜索过滤: 在功能列表中增加搜索功能

(七)注意事项

  1. 命名规范: 控件命名使用匈牙利命名法(如TextBH, ListGN)
  2. 布局适应: 使用Dock和Anchor确保窗口自适应
  3. 资源管理: 正确实现Dispose方法释放资源
  4. 线程安全: BackgroundWorker使用需注意线程同步

总结: 这是一个功能完善的ERP功能定义管理界面,通过可视化配置方式实现用户自定义功能,降低了二次开发的技术门槛,提升了系统的灵活性和可扩展性。

相关推荐
大猫子的技术日记4 天前
VibeBlog-AI 时代个人博客Agent项目开源之路[9]: 基于ui-ux-pro-max 的前端重新设计
开源项目·skill·项目实践·vibe-blog
明月看潮生5 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 06 数据库 3-2
数据库·erp·企业开发·项目实践·编程与数学·.net开发·c#编程
明月看潮生6 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 05 入口验证 3-1
erp·企业开发·项目实践·编程与数学·.net开发·c#编程
明月看潮生8 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 04 主窗口 3-1
企业开发·项目实践·编程与数学·.net开发·c#编程
明月看潮生8 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 02 技术选型 3-2
企业开发·技术选型·项目实践·编程与数学·.net开发·c#编程
明月看潮生9 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 03 项目结构 3-2
erp·企业开发·项目实践·编程与数学·.net开发·c#编程
明月看潮生9 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 03 项目结构 3-3
erp·企业开发·编程与数学·.net开发·c#编程·项目实践、
明月看潮生10 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 02 技术选型 3-1
erp·企业开发·技术选型·编程与数学·.net开发·c#编程·项目实践、
明月看潮生11 天前
编程与数学 03-008 《看潮企业管理软件》项目开发 01 需求分析 3-1
c#·.net·需求分析·erp·企业开发·项目实践·编程与数学