编程与数学 03-008 《看潮企业管理软件》项目开发 06 数据库 3-3
编程与数学 03-008 《看潮企业管理软件》项目开发 06 数据库 3-3
- 五、系统初始化
- (一)初始化的“三件事”
- (二)初始化完成的标准
- (三)常见误区
- 六、账套初始化
- (一)完成初始化函数
- (二)函数说明文档
- 七、静态数据加注
- (一)时间框架
- (二)财务主数据
- (三)业务主数据
- (四)价格与税率
- (五)系统级参数
- (六)期初余额(静态部分)
- (七)校验清单(上线前打勾)
- 全文总结
摘要:本文档详细阐述了《看潮企业管理软件》的数据库架构设计与初始化方案。基于PostgreSQL 16构建的kc01账套采用"无触发器、无外键、全函数"设计哲学,通过PL/pgSQL函数实现业务逻辑与数据完整性控制。系统支持多组织、多账期、多币种业务模式,涵盖从需求计划到财务总账的全流程工业版ERP功能。文档重点介绍了账套初始化函数x9_start的实现机制,以及静态基础数据(科目、物料、往来单位等)的预置要求,为企业ERP系统上线提供了完整的技术实施指南。
关键词:ERP系统、PostgreSQL、数据库架构、账套初始化、管理软件开发、PL/pgSQL、企业信息化
人工智能助手:DeepSeek、Kimi
五、系统初始化
ERP 系统的初始化,就是“把一套空白的 ERP 数据库变成属于本企业、能开始第一笔业务的全过程”。
它相当于给 ERP “装机 + 装机后必须做的一次性设置”,做完以后,用户才能正常录入销售订单、采购订单、出入库、凭证等业务单据。
(一)初始化的“三件事”
-
建账套(建库)
在数据库服务器里新建一个 schema 或一套新库,导入系统标准表结构、函数、序列,得到“空壳 ERP”。 -
灌“静态主数据”
把企业自身固有的、一年内不会天天变的基础资料一次性灌进去,并保证格式、编码、层级关系正确。
典型清单如下:- 会计期间(2025-01 … 2025-12)
- 会计科目(1001 库存现金、1002 银行存款、1122 应收账款 …)
- 部门/车间/仓库/库位
- 币种、汇率、计量单位、税码
- 物料/商品/产品 BOM(含型号、规格、计量单位、计划价)
- 供应商、客户、联系人、结算方式、价格条款
- 工序、工艺路线、工作中心、计件单价
- 现金/银行账户、收付款条件、费用项目
- 用户、角色、权限、审批流程模板
-
设“动态期初值”
把“截止到上线前一日 24:00”的企业家底一次性搬进来,保证 ERP 账与实物、财务账、往来账能对上。- 库存期初:各仓库各物料的数量、单价、金额
- 往来期初:应收/应付余额(按客户/供应商+币种)
- 出纳期初:现金、各银行账号余额
- 总账期初:所有会计科目的借/贷/外币/数量余额
- 在途/暂估:已采购未到货、已销售未出库、已收票未付款等
- 在产工单:车间现场尚未完工的工单数量、已投料成本
- 固定资产卡片:原值、累计折旧、净值
(二)初始化完成的标准
- 库存账 = 实盘
- 往来账 = 财务应收应付明细表
- 现金银行 = 银行对账单 + 现金盘点表
- 总账 = 资产负债表/试算平衡表(借贷平衡、年初余额衔接)
- 单据号、序列号、当前期间已正确指向“上线当月”
- 系统日期切到上线当月,用户能顺利开出第一张销售订单、采购订单、入库单、凭证,且库存、往来、总账能实时联动。
(三)常见误区
- “初始化就是录物料”——忽略了科目、往来、库存数量、余额,导致后期总账永远对不上。
- “先跑一个月业务再补期初”——一旦已有交易,期初再也无法补平。
- “直接复制演示账套”——演示数据编码规则、科目体系、税率与本企业不符,越跑越乱。
一句话记住
ERP 初始化 = “装机 + 灌基础资料 + 对期初余额”,
三步全部完成并校验平衡后,系统才算“上线”,才能开始第一笔正式业务。
以上属于用户操作内容,下面说明属于系统设计的任务。
六、账套初始化
这里我们是在数据库中编写一个用于初始化的函数。
(一)完成初始化函数
-- 函数:系统级“完全初始化”——清空所有业务数据并把账套重置到指定年月
CREATE OR REPLACE FUNCTION public.x9_start(
sscsny character, -- 传入参数:要重置到的“起始年月”,格式 202301
ssdqyh character varying) -- 传入参数:当前执行人(日志用)
RETURNS character varying
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
ssqyny char(6); -- 变量:系统中原有的启用年月
BEGIN
/* 1. 把系统状态表 x9_x9zt 的启用年月、当前期间都改成传入值 */
SELECT qyny INTO ssqyny FROM x9_x9zt;
UPDATE x9_x9zt SET qyny = $1, dqny = $1;
/* 2. 重新生成期间表,只保留一条记录 */
DELETE FROM mlny;
INSERT INTO mlny (ny) VALUES ($1);
/* 3. 清掉所有错误日志、SQL 痕迹 */
DELETE FROM x9_errcode;
DELETE FROM x9_errproc;
DELETE FROM x9_jlsql;
/* 4. 把所有基础资料标记为“未启用、未审核” */
UPDATE mlbm SET sfqy = false;
UPDATE mlbmry SET sfqy = false, sfsh = false, shry = '';
UPDATE mlcbxm SET sfqy = false;
UPDATE mlch SET sfqy = false;
UPDATE mlck SET sfqy = false;
UPDATE mlgg SET sfqy = false;
UPDATE mlkm SET sfqy = false;
UPDATE mlqdmb SET sfqy = false;
UPDATE mlsb SET sfqy = false;
UPDATE mlwb SET sfqy = false;
UPDATE mlwl SET sfqy = false;
UPDATE mlzzsl SET sfqy = false;
UPDATE mlqd SET sfsh = false, shry = '';
UPDATE mljgch SET sfsh = false, shry = '';
UPDATE mljgxm SET sfsh = false, shry = '';
UPDATE mlscgx SET sfsh = false, shry = '';
/* 5. 清业务总账(保留期间 = 传入年月) */
DELETE FROM utzzch; -- 存货总账
DELETE FROM utzzkj; -- 会计总账
DELETE FROM utchpd; -- 盘点盈亏
DELETE FROM utmxch; -- 存货明细
DELETE FROM utmxxs; -- 销售明细
DELETE FROM gzgd01; -- 工资固定项
DELETE FROM gzbd01; -- 工资变动项
/* 6. 只删除“起始年月之后”的总账数据,避免误删历史 */
DELETE FROM utzzxs WHERE ny > $1;
DELETE FROM utzzch WHERE ny > $1;
DELETE FROM utzzkj WHERE ny > $1;
DELETE FROM utzzwl WHERE ny > $1;
DELETE FROM utzzcn WHERE ny > $1;
DELETE FROM utchpd WHERE ny > $1;
DELETE FROM utzczj WHERE ny > $1;
DELETE FROM utmxch WHERE ny > $1;
DELETE FROM utmxxs WHERE ny > $1;
/* 7. 把传入年月的期初数还原成“干净期初” */
UPDATE utzzch
SET jhjs=0,jhje=0,srjs=0,srsl=0,srje=0,xqjs=0,fcjs=0,fcje=0,
jcjs=qcjs, jcsl=qcsl, jcdj=qcdj, jcje=qcje
WHERE ny = $1;
UPDATE utzzwl SET jffs=0, dffs=0, ymye=ycye WHERE ny = $1;
UPDATE utzzcn SET jffs=0, dffs=0, ymye=ycye WHERE ny = $1;
UPDATE utzzkj
SET sljf=0,sldf=0,slym=slyc,jejf=0,jedf=0,jeym=jeyc,zzxh=0
WHERE ny = $1;
/* 8. 清所有单据(头+体) */
DELETE FROM djcho; DELETE FROM djchm;
DELETE FROM djcno; DELETE FROM djcnm;
DELETE FROM djgxtjo; DELETE FROM djgxtjm;
DELETE FROM djjyo; DELETE FROM djjym;
DELETE FROM gzjjo; DELETE FROM gzjjm;
DELETE FROM djcbhso; DELETE FROM djcbhsm;
DELETE FROM djcbgjo; DELETE FROM djcbgjm;
DELETE FROM djjzpzo; DELETE FROM djjzpzm;
/* 9. 清 MRP 计算结果 */
DELETE FROM utjswg;
DELETE FROM utjswx;
DELETE FROM utjszz;
/* 10. 清工作流任务及编号生成器 */
DELETE FROM x9_bprw;
DELETE FROM x9_iddjm;
DELETE FROM x9_iddjo;
DELETE FROM mlqdmblsb;
/* 11. 清列表输入数据审核标记 */
UPDATE x9_gn_0srxx_list SET sfsh = false, shry = '';
UPDATE x9_gn_0srxx_ml SET srsd = false;
RETURN '完全初始化完成,初始期间为' || $1 || ',所有站点重新登录!';
END;
$BODY$;
(二)函数说明文档
-
名称:x9_start(完全初始化)
-
级别:系统级后台函数,禁止前端菜单或用户自行调用
-
作用:
把当前账套一次性“格式化”到指定年月,效果等同于“新建空账套 + 把旧账套全部清空”。
适用于:- 正式上线前,把测试数据全部清掉;
- 年结后重新开新年度账;
- 演示/培训环境快速复位。
-
执行后果:
- 所有单据、总账、计算表、流程任务、编号序列 物理删除;
- 所有基础资料 取消启用、取消审核;
- 只保留指定年月的“空壳”期间;
- 期初余额字段被重置成“期初=期初、发生=0、期末=期初”。
-
调用示例:
SELECT x9_start('202501', 'Admin');
-- 返回:完全初始化完成,初始期间为202501,所有站点重新登录!
- 安全要求:
- 必须 DBA 或超级管理员角色;
- 执行前务必做全库备份;
- 执行后所有在线用户会被强制失效,需重新登录。
七、静态数据加注
ERP 数据库在“开始第一笔业务”之前,必须先把“静态基础数据”预置到位。
这些数据的共同特征:
- 不随日常交易频繁变动;
- 被单据、凭证、报表频繁引用;
- 一经使用就不允许随意删除(只能禁用或增加)。
下面给出最小闭环清单(工业版通用,可一套表打勾验收)。
(一)时间框架
-
会计期间表(mlny)
一行代表一个期间,至少预置当年 12 个月。
例:202501、202502… 202512 -
系统状态表(x9_x9zt)
写入当前启用年月、当前期间、是否月结等全局开关。
(二)财务主数据
-
会计科目表(mlkm)
必须末级明细,含:科目编码、名称、类别、余额方向、是否数量/外币/部门/个人/项目辅助核算。 -
币种与汇率(mlwb + mlwbpj)
人民币必须存在;如有外币,再预置美元、欧元等,并给出月初汇率。 -
现金流量项目(mlxjll)
直接法 4 大类 20+ 小项,用于现金流量表。 -
银行档案(mlyhzh)
开户银行、账号、币别、SWIFT/联行号,用于收付款单自动带账号。
(三)业务主数据
-
部门/车间/工作中心(mlbm)
树状结构,末级才能被单据引用;区分“生产中心”标志,用于成本归集。 -
仓库/库位(mlck)
必须末级;是否“MRP 可用仓”“负库存允许”等属性一次设好。 -
物料/产品/半成品(mlch → mlchxm)
先建目录级(mlch),再建细目级(mlchxm)。
必填:存货代号、名称、型号规格、计量单位、计划价、默认仓库、材料类别(外购/自制/外协)、计划批量、安全库存、是否批次管理。 -
物料清单(mlqd)
只预置“主 BOM”即可;后续可由技术部陆续补充。 -
工艺路线(mlgy → mlscgx → mljgxm)
工艺名称→工序→工序价格,用于计件工资或标准成本计算。 -
往来单位(mlwl)
客户(编码<50)与供应商(编码≥50)同表;必须末级;结算币种、税号、开户行、信用额度一次维护。 -
人员档案(mlbmry)
与部门关联,用于审批流、计件工资、个人往来核算。
(四)价格与税率
-
采购/销售价目表(可外挂)
至少给每种物料录入一条“计划价”,否则成本、MRP 无法计算。 -
税率字典(mlxz + mlzzsl)
13%、9%、6%、0% 四档,用于单据自动带税率。
(五)系统级参数
-
参数表(x9_ztcs)
企业名称、税号、启用多币种、启用批次、启用工作流、外购物料交付期限(天)、自制物料交付期限(天)等。 -
功能权限(x9_gn + x9_gnyhjs)
角色、用户、功能按钮、数据范围一次性导入。 -
单据编号规则(x9_iddjo 前缀)
销售订单前缀“SO”、采购订单“PO”、凭证“PZ”等,避免上线后跳号。
(六)期初余额(静态部分)
-
库存期初(utchpd 或 utzzch.qc*)
按仓库+物料+数量+单价+金额导入,必须实盘复盘签字。 -
往来期初(utzzwl.ycye)
按客户/供应商+币种导入应收应付余额。 -
科目期初(utzzkj.jeyc / slyc)
末级科目借贷余额、数量余额、外币余额,必须试算平衡。 -
银行对账单期初(utzzcn.ycye)
现金、各银行账号昨日余额。
(七)校验清单(上线前打勾)
□ 会计期间连续
□ 科目末级且无重复
□ 物料计划价 > 0
□ 仓库/部门/币种/税码完整
□ 库存期初数量 × 单价 = 金额
□ 往来期初借方 = 应收,贷方 = 应付
□ 科目期初借方合计 = 贷方合计
□ 银行余额与对账单一致
□ 所有基础资料已“启用”
□ 超级管理员可正常登录并开出第一张销售订单
在 ERP 项目中,“设计者”(即产品/实施/开发团队)负责把“系统能不能跑起来”的数据一次性灌好;
“用户”只需在此基础上补充“本企业长什么样”的数据。
二者边界如下表:
| 设计者必须预置(系统级) | 用户必须补充(企业级) |
|---|---|
| 1. 会计期间表(mlny) | 1. 科目末级明细(mlkm) |
| 2. 系统参数表(x9_ztcs)默认值 | 2. 部门/车间(mlbm) |
| 3. 币种与汇率框架(mlwb) | 3. 仓库(mlck) |
| 4. 现金流量项目(mlxjll) | 4. 物料/产品(mlch→mlchxm) |
| 5. 银行档案框架(mlyhzh) | 5. 供应商/客户(mlwl) |
| 6. 功能菜单与按钮(x9_gn) | 6. 人员(mlbmry) |
| 7. 角色模板(x9_gnyhjs) | 7. 价格、税率、信用额度 |
| 8. 单据编号前缀(x9_iddjo 初始行) | 8. 期初余额(库存、往来、科目、银行) |
| 9. 错误日志表结构(x9_err*) | 9. BOM、工艺路线(mlqd、mlgy) |
一句话记住
“设计者给骨架,用户长肉”——骨架不齐系统跑不起来,肉没长齐业务跑不顺。
其他数据库设计内容,将在相关项目内容中给出。
全文总结
本文档系统性地介绍了《看潮企业管理软件》项目中数据库层的设计思路与技术实现。开篇明确了ERP与数据库的本质关系——数据库作为数据存储基石,ERP作为业务逻辑指挥中心,二者共同构成企业数字化核心。文档核心部分详细描述了基于PostgreSQL 16的kc01账套架构,其技术特征体现为"无触发器、无外键、全函数封装"的创新设计,通过200余张表和100多个x9_前缀函数实现业务逻辑,避免了传统外键约束带来的数据清理难题,特别支持"回到上月"的整月数据重置需求。
架构设计采用"单库多组织、单库多账期"模式,涵盖主数据、单据数据、总账数据、计算表四大类表结构,并通过期间字段实现全库数据的时间维度管理。文档详细给出了系统初始化的三大任务:建账套、灌静态主数据、设动态期初值,特别提供了x9_start完全初始化函数的完整SQL实现,可一键清空业务数据并重置到指定年月。
最后文档列出了22项静态基础数据清单,明确区分设计者预置与用户补充的边界,确保"骨架"与"血肉"的有机结合。整体而言,该设计为中小型制造企业ERP实施提供了轻量级、可扩展、易维护的数据库解决方案。










