个人编制软件展示

PSI - Purchase Sale Inventory 进销存软件

PSI进销存系统信创适配与国产化替代方案

引言

随着国家信息技术应用创新战略的推进,越来越多的企业开始关注软件的信创适配。PSI进销存系统需要支持国产化软硬件环境,包括国产操作系统、数据库、中间件等,以满足政企客户的质量要求。

信创适配总体架构

PSI 信创适配的总体技术架构:

层次 国产替代方案 适配状态
操作系统 银河麒麟、统信UOS、华为欧拉 已完成
数据库 达梦DM8、人大金仓、openGauss 已完成
中间件 东方通TongWeb、金蝶Apusic 已完成
CPU 鲲鹏、飞腾、海光、兆芯 已完成

国产数据库适配

PSI 对国产数据库的适配实现:

// 数据库适配层抽象
class DatabaseAdapter {
  constructor(config) {
    this.config = config;
    this.type = config.type; // dm8, kingbase8, opengauss, mysql
  }

  // 获取对应数据库的适配器
  static create(config) {
    const adapters = {
      'dm8': DM8Adapter,
      'kingbase8': KingbaseAdapter,
      'opengauss': OpenGaussAdapter,
      'mysql': MySQLAdapter
    };

    const AdapterClass = adapters[config.type];
    if (!AdapterClass) {
      throw new Error(`Unsupported database type: ${config.type}`);
    }

    return new AdapterClass(config);
  }

  // 抽象方法,由各数据库适配器实现
  async connect() { throw new Error('Not implemented'); }
  async query(sql, params) { throw new Error('Not implemented'); }
  async execute(sql, params) { throw new Error('Not implemented'); }
  getEscapeFunction() { throw new Error('Not implemented'); }
}

// 达梦数据库适配器
class DM8Adapter extends DatabaseAdapter {
  constructor(config) {
    super(config);
    this.pool = null;
  }

  async connect() {
    const dm = require('dmdb');
    this.pool = dm.pool({
      host: this.config.host,
      port: this.config.port || 5236,
      database: this.config.database,
      user: this.config.user,
      password: this.config.password,
      poolMin: this.config.poolMin || 2,
      poolMax: this.config.poolMax || 10
    });
    return this.pool;
  }

  // 达梦特殊语法处理
  async query(sql, params) {
    // 达梦使用 ? 作为占位符
    const adaptedSql = this.adaptSQL(sql);
    return this.pool.query(adaptedSql, params);
  }

  // 分页适配
  getPaginationSQL(sql, page, pageSize) {
    const offset = (page - 1) * pageSize;
    return `${sql} LIMIT ${pageSize} OFFSET ${offset}`;
  }

  // 字符串转义
 escape(str) {
    if (str === null) return 'NULL';
    return "'" + String(str).replace(/'/g, "''") + "'";
  }

  // 日期处理
  formatDate(date) {
    return `TO_DATE('${date.toISOString()}', 'YYYY-MM-DD HH24:MI:SS')`;
  }
}

// openGauss 适配器
class OpenGaussAdapter extends DatabaseAdapter {
  constructor(config) {
    super(config);
    this.pool = null;
  }

  async connect() {
    const { Pool } = require('pg');
    this.pool = new Pool({
      host: this.config.host,
      port: this.config.port || 5432,
      database: this.config.database,
      user: this.config.user,
      password: this.config.password,
      max: this.config.poolMax || 10
    });
    return this.pool;
  }

  escape(str) {
    if (str === null) return 'NULL';
    return "'" + String(str).replace(/'/g, "''") + "'";
  }

  // openGauss 分区表支持
  async createPartitionedTable(tableName, partitions) {
    const sql = `
      CREATE TABLE ${tableName} (
        id BIGSERIAL,
        create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (id)
      ) PARTITION BY RANGE (create_time) (
        ${partitions.map(p =>
          `PARTITION ${p.name} VALUES LESS THAN (TO_DATE('${p.endDate}', 'YYYY-MM-DD'))`
        ).join(', ')}
      )
    `;
    return this.execute(sql);
  }
}

// 数据库连接工厂
class DatabaseFactory {
  static async createConnection(config) {
    const adapter = DatabaseAdapter.create(config);
    await adapter.connect();
    return adapter;
  }

  // 切换数据库类型
  static async switchDatabase(oldConfig, newConfig) {
    const oldAdapter = DatabaseAdapter.create(oldConfig);
    const newAdapter = DatabaseAdapter.create(newConfig);

    // 数据迁移
    await this.migrateData(oldAdapter, newAdapter);

    return newAdapter;
  }

  // 数据迁移
  static async migrateData(sourceAdapter, targetAdapter) {
    const tables = ['products', 'customers', 'suppliers', 'orders', 'inventory'];

    for (const table of tables) {
      // 读取源数据
      const data = await sourceAdapter.query(`SELECT * FROM ${table}`);

      // 写入目标数据库
      for (const row of data) {
        const columns = Object.keys(row).join(', ');
        const placeholders = Object.keys(row).map(() => '?').join(', ');
        await targetAdapter.query(
          `INSERT INTO ${table} (${columns}) VALUES (${placeholders})`,
          Object.values(row)
        );
      }
    }
  }
}

国产操作系统适配

PSI 在国产操作系统上的适配要点:

// 操作系统检测与适配
class OSAdapter {
  static detectOS() {
    const platform = process.platform;
    const release = require('os').release();

    let osType = 'unknown';
    let osName = 'Unknown OS';

    if (platform === 'linux') {
      // 读取系统信息
      const osRelease = this.readOSRelease();

      if (osRelease.includes('Kylin') || osRelease.includes('Neokylin')) {
        osType = 'kylin';
        osName = '银河麒麟';
      } else if (osRelease.includes('UOS') || osRelease.includes('UnionTech')) {
        osType = 'uos';
        osName = '统信UOS';
      } else if (osRelease.includes('EulerOS') || osRelease.includes('openEuler')) {
        osType = 'euler';
        osName = '华为欧拉';
      } else if (osRelease.includes('CentOS') || osRelease.includes('Red Hat')) {
        osType = 'redhat';
        osName = 'Red Hat/CentOS';
      }
    }

    return { platform, release, osType, osName };
  }

  static readOSRelease() {
    try {
      return require('fs').readFileSync('/etc/os-release', 'utf8');
    } catch {
      return '';
    }
  }

  // 路径处理适配
  static getConfigPath() {
    const os = this.detectOS();

    switch (os.osType) {
      case 'kylin':
      case 'uos':
      case 'euler':
        // Linux 标准路径
        return '/etc/psi/config.json';
      default:
        return process.env.HOME + '/.psi/config.json';
    }
  }

  // 文件路径分隔符适配
  static pathJoin(...paths) {
    return require('path').join(...paths);
  }

  // 环境变量适配
  static getEnvVars() {
    const os = this.detectOS();

    // 根据系统类型设置默认环境变量
    const envVars = { ...process.env };

    if (os.osType === 'kylin' || os.osType === 'uos') {
      // 银河麒麟/统信需要设置的语言环境
      envVars.LANG = 'zh_CN.UTF-8';
      envVars.LC_ALL = 'zh_CN.UTF-8';
    }

    return envVars;
  }
}

// 启动适配
class StartupAdapter {
  static async init() {
    const os = OSAdapter.detectOS();
    console.log(`Running on: ${os.osName} (${os.platform})`);

    // 根据操作系统配置
    switch (os.osType) {
      case 'kylin':
        await this.setupKylin();
        break;
      case 'uos':
        await this.setupUOS();
        break;
      case 'euler':
        await this.setupEuler();
        break;
    }
  }

  // 银河麒麟特定配置
  static async setupKylin() {
    // 设置中文字体路径
    process.env.FONTCONFIG_PATH = '/usr/share/fontconfig';

    // 加载GTK主题(如果有)
    // ...
  }

  // 统信UOS特定配置
  static async setupUOS() {
    // 打印机驱动适配
    // ...
  }

  // 欧拉系统特定配置
  static async setupEuler() {
    //鲲鹏处理器优化
    // ...
  }
}

中间件适配配置

国产中间件的配置适配:

// 东方通TongWeb配置
const tongwebConfig = {
  // 部署描述符配置
  context: {
    'display-name': 'PSI进销存系统',
    'description': 'PSI进销存管理系统'
  },

  // 数据源配置
  datasource: {
    'jndi-name': 'jdbc/psi',
    'driver-class-name': 'dm8.jdbc.driver.DMDriver',
    'url': 'jdbc:dm://localhost:5236/PSI',
    'username': 'SYSDBA',
    'password': 'password',
    'initial-size': 5,
    'max-active': 20,
    'min-idle': 5,
    'max-wait': 10000
  },

  // 会话配置
  session: {
    'timeout': 30,
    'cookie-name': 'PSI_SESSION',
    'cookie-http-only': true,
    'cookie-secure': false
  },

  // 安全配置
  security: {
    'enabled': true,
    'ssl-enabled': false
  }
};

// 金蝶Apusic配置
const apusicConfig = {
  application: {
    'name': 'PSI',
    'version': '1.0.0'
  },

  // 连接池配置
  pool: {
    ' datasource': 'jdbc/psi',
    'initial-capacity': 5,
    'max-capacity': 50,
    'acquire-increment': 5,
    'validation-query': 'SELECT 1'
  },

  // 线程池配置
  threadPool: {
    'min-threads': 10,
    'max-threads': 200,
    'queue-capacity': 500
  }
};

// 适配器选择
function getMiddlewareConfig(middlewareType) {
  const configs = {
    'tongweb': tongwebConfig,
    'apusic': apusicConfig,
    'weblogic': getWeblogicConfig(),
    'websphere': getWebsphereConfig()
  };

  return configs[middlewareType] || configs['tongweb'];
}

信创适配检查清单

检查项 检查内容 状态
数据库连接 测试达梦、金仓、openGauss连接 通过
字符集 UTF-8编码、中文显示 通过
文件路径 中文路径、特殊字符处理 通过
打印功能 国产打印机驱动支持 通过
电子签章 国产电子签章软件集成 通过

总结

PSI 进销存系统信创适配的核心价值:

通过信创适配,PSI进销存系统可以更好地服务政企客户,满足国产化替代的质量要求。

← 下一篇:PSI进销存系统跨平台架构与性能优化