appbase/README.md

85 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# appbase — 基础应用包(代码管理 + 系统参数/业务日期)
产线平台/Sage 系应用最底层的基础模块,提供两项全平台共用的能力:
1. **代码管理(编码/键值对)**appcodes + appcodes_kv 两级编码表全平台下拉框、状态字典、机构类型org_type等键值数据统一存放于此rbac/dapi 及所有业务模块的 models `codes` 关联都指向它。
2. **系统参数与业务日期**params 表集中管理可动态维护的参数;其中 `business_date`(业务日期)是记账/计费等业务的时间基准——**账单日期取业务日期而非自然日期**,由本模块提供读取/推进函数,另含 svgicon 图标表。
## 模块定位
- 加载顺序上位于所有模块**之前**rbac 的注册开关读 params 表、dapi/业务模块用编码表),宿主入口第一个调用 `load_appbase()`
- 无独立认证逻辑,页面/dspy 端点经 rbac 按 logined 权限保护。
- 数据库名解析:`ServerEnv().get_module_dbname('appbase')`
## 表清单models/*.json
| 表 | 标题 | 字段 | 说明 |
|---|---|---|---|
| `appcodes` | 应用编码表 | id, name(编码名称), hierarchy_flg(多级标志) | 编码组,如 `user_status``org_type` |
| `appcodes_kv` | 编码键值表 | id, parentid(父id→appcodes), k(键), v(值) | 组内键值对rbac 的 orgtypes/role 的 orgtypeid 下拉即取 `parentid='org_type'` |
| `params` | 参数表 | id, params_name(参数名称), params_value(参数值) | 已知参数:`business_date`(业务日期)、`register_open`rbac 注册开关1=开放 0=关闭superuser 可在参数管理界面修改) |
| `svgicon` | 图标 | id, icon(svg内容) | 平台内嵌 SVG 图标库 |
`json/` 为同名 bricks CRUD 页面定义。
## 业务日期参数机制(重点)
业务日期存储在 `params` 表的 `business_date` 行,代表"系统当前处于哪一业务日",与自然日期解耦(支持补账、日切前处理跨天业务)。
`appbase/businessdate.py` 提供(均为 async可传入已有 sor 复用事务,不传则自行开连接):
| 函数 | 作用 |
|---|---|
| `get_business_date(sor=None)` | 读当前业务日期params 无 `business_date` 行时抛 `BusinessDateParamsError` |
| `new_business_date(sor=None)` | **日切**:业务日期 +1 天并写回 params |
| `previous_business_date(sor=None)` | 当前业务日期 -1 天(只读计算) |
| `next_business_date(sor=None)` | 当前业务日期 +1 天(只读计算) |
`appbase/params.py` 提供通用参数读取 `_get_params(sor, name)`(按 params_name 查 params_value
**消费方示例**accounting 记账链路 `bill.bill_date = await get_business_date(sor)`账单落业务日期rbac 注册开关读 `register_open`。定时日切走 `wwwroot/cron/switch_bizdate.dspy`:把 `business_date` 重置为当天自然日期,**只允许本机127.0.0.1/::1/localhost调用**,其他 IP 一律返回中性拒绝信息(不回显探测结果)。
## 对外 API / dspy 端点wwwroot/
- 编码查询:`get_code.dspy`(通用代码下拉查询:传 table/valueField/textField/cond自动注入 userid/userorgid 变量)、`get_appcodes_kv.dspy`(专查 appcodes_kv
- 图标:`show_icon.dspy`(按 id 返回 svgicon.icon 内容)
- 编码 CRUD`api/appcodes_create.dspy``api/appcodes_update.dspy``api/appcodes_delete.dspy``api/appcodes_kv_create.dspy``api/appcodes_kv_update.dspy``api/appcodes_kv_delete.dspy`
- 图标 CRUD`api/svgicon_create.dspy``api/svgicon_update.dspy``api/svgicon_delete.dspy`
- 日切:`cron/switch_bizdate.dspy`(配套 `cron/index.ui` 管理页)
- UI`menu.ui`
## load 注册函数
入口 `appbase/init.py`**`load_appbase()`**
```python
g = ServerEnv()
g.get_business_date = get_business_date # 来自 appbase.businessdate
g.new_business_date = new_business_date
```
业务模块通过 `get_serverenv('get_business_date')``ServerEnv().get_business_date(sor)` 获取业务日期,不直接 import 本模块,保证跨宿主可移植。
## 宿主集成
宿主启动入口sage.py、pipeline_app.py、cpcc.py、fileMGR.py 等)中**最先**加载:
```python
from appbase.init import load_appbase
...
load_appbase() # 第一个rbac/dapi/业务模块都依赖 params 与编码表
load_rbac()
load_dapi()
```
依赖ahserverServerEnv、sqlorDBPools、appPublictimeUtils.strdate_add/jsonConfig。被依赖方rbacregister_open、org_type 编码、dapi、accountingbill_date/consume 取业务日期)、以及一切使用 appcodes_kv 下拉的业务模块。
## 部署注意
1. **初始化种子**params 表必须预置 `business_date` 行(当天日期),否则 `get_business_date` 直接抛异常、记账链路全断;`register_open` 决定是否开放用户注册。
2. **权限注册**:运行 `scripts/load_path.py``cd 宿主目录 && ./py3/bin/python ../appbase/scripts/load_path.py`)登记 /appbase 各端点为 logined 权限;它 import `rbac.rbac.set_path_perm`,因此须在 rbac 建表完成后执行。
3. **switch_bizdate 定时任务**:仅供本机 cron 调用;若经 nginx 反代转发,注意 client_ip 取值不是回环地址会被拒。日切语义是"重置为当天自然日期",手工推进用 `new_business_date()`+1 天)。
4. **编码表是全局字典**:新增下拉字典在 appcodes 建组、appcodes_kv 建键值,业务模块 models 的 `codes``cond: parentid='xxx'` 关联即可,勿在业务库重复造字典表。
5. svgicon 的 icon 字段存原始 SVG 文本,`show_icon.dspy` 直接回显;图标内容属可信管理端录入,勿开放任意用户写入。
6. 版本号见 `appbase/version.py`(当前 0.0.1)。