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进销存系统可以更好地服务政企客户,满足国产化替代的质量要求。