# SassLuo **Repository Path**: CrossOverLiuZX/sass-luo ## Basic Information - **Project Name**: SassLuo - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-11-02 - **Last Updated**: 2026-11-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 政府债券还本付息计划 · HTML 管理后台原型 纯静态单页后台:左侧菜单 + 顶栏 + 表格筛选 + Excel 导入导出。打开后先选 **版本1 / 版本2**(记住在 `localStorage`,顶栏可随时切换)。余额/节假日/费率两套版本共用同一本地数据;「项目发行对照」的表1/表2/表3数据仅存内存(刷新会丢)。 ## 版本说明 | 版本 | 说明 | |------|------| | **版本1** | 完整版:债券余额 + 还本付息计划(原版/合并)+ **项目发行对照** + 节假日 + 费率备份 | | **版本2** | 侧重还本付息:**分区划分年汇总**(近5年+5年之后)+ 余额/计划/节假日/费率;侧栏**不显示**「项目发行对照」 | - 首页落地页可选版本;进入后顶栏「版本1 | 版本2」可切换;侧栏底部可「返回首页选版本」 - 切到版本2 时若正停留在项目发行对照页,会自动回到债券余额 - 版本2 重点菜单「分区划分年汇总」:按区划×年度汇总到期本金/利息/服务费/合计(本金按到期日年;存续年按一年期计息,到期年半年/全年特例;到期年后不再计息) - 计算引擎共用:服务费 =(本金 + 利息)× 费率 × 0.01 ## 如何打开 **macOS / Linux:** ```bash cd /Users/kobe/sass-luo # 或你的克隆目录 python3 -m http.server 5173 # 浏览器打开 http://localhost:5173 ``` **Windows:** ```bat cd sass-luo python -m http.server 5173 ``` 浏览器打开 http://localhost:5173。若 `npx serve` 因 npm 镜像证书失败,请用上面的 Python 方式。也可直接打开 `index.html`;导入异常时改用本地服务。 远端:https://gitee.com/CrossOverLiuZX/sass-luo.git ## 目录 ``` sass-luo/ index.html css/app.css js/app.js # 路由 / 版本切换 / Toast / Modal js/storage.js # localStorage js/engine.js # 还本付息计算引擎 js/project-engine.js # 表1/2/3 → 项目发行对照 js/excel.js # 导入/导出 Excel(含项目发行导出) js/pages/ balances.js plan.js summary.js projects.js holidays.js settings.js vendor/xlsx.full.min.js vendor/exceljs.min.js # 项目发行导出色标 templates/导入模版.xlsx templates/导出模版.xlsx templates/项目发行导出样式.xlsx README.md ``` ## 已实现功能 - **债券余额**:批量导入 Excel、筛选(区划/期限即时刷新)、分页、增删改、清空、下载导入模版、**按当前筛选结果导出** - **还本付息计划**:选年度生成预览并导出;开关「合并期限为30年期分期还本」(原版存储不变;同区划才合并;转贷金额叠加、本金取一期、利息/服务费按公式重算);**表顶汇总行**对当前筛选结果求和:汇总合计、应还本金、应还利息、服务费(导出含汇总) - **分区划分年汇总**(版本2 主报表,版本1 亦可进):选起始年度 → 展示该年起连续 **5** 个年度的区划×本金/利息/代理付息兑付服务费/合计;第 6 年起合并为「**5年之后**」一行(每区划);**表顶汇总行**对当前筛选结果求和:到期本金、利息、代理付息/兑付服务费、合计;支持区划筛选与导出 Excel。本金按**债券余额表到期日自然年**归集;利息在存续各年按一年期计、到期年可半年特例,**到期年后不再计息**;服务费按格子重算(与还本付息计划页应上缴资金日口径分离) - **项目发行对照**(版本1 · 需求分析(1).docx):导入表1/表2/表3 → 市本级单位配置 → 生成对照 → **差额/区划调整**(不平衡组可手动指定项目区划,localStorage 持久化)→ 截止日筛选 → 导出;置换债务名称行标黄 - **节假日**:按年维护(日期 / 节日名称 / 阴历);首次进入某年自动填入内置法定假日(2026 正式安排,2027–2028 按放假办法推算),「重新填入法定假日」覆盖本年;影响 `WORKDAY(结息日, -10)` - **费率与备份**:全局兑付服务费率(默认 `0.00475`);JSON 备份(不含项目对照大表) ## 还本付息计算口径 1. `<10年`:一年一付;利息=`金额×利率%` 2. `≥10年`(含分期还本):半年一付;利息再 `/2` 3. **服务费 = (本金 + 利息) × 费率 × 0.01**(不分期限,不再 `/2`) 4. 半年两期:应还本金落在**到期期**(结息日=到期日;同债多条取结息日较大);归属年度以应上缴资金日为准(到期日在年初、应上缴日跨到上一年时,本金计入上一年,不按到期日自然年) 5. 进表条件:应上缴资金日的自然年 = 计划年度 6. 分期还本:Excel 预拆多行原样用;同区划+编码仅一行且到期跨度约 30 年时自动拆 25 期 ## 分区划分年汇总(版本2) 1. 入口:侧栏「分区划分年汇总」(两套版本均有;版本2 落地页主推) 2. **起始年度**下拉:从当年起可选;生成后自该年连续展示 5 个年度(默认自 2027 起) 3. 列:区划、年度、到期本金、利息、代理付息/兑付服务费、合计(三者之和) 4. 「5年之后」:起始年+5 及以后按区划加总为一条 5. **归年口径**:本金按债券余额表「到期日」所属自然年归集。利息:存续年(自 max(起始年, 起息日自然年) 至到期年,含到期年)按正常一年期 `本金×利率×0.01`;到期年特例——期限≥10年且到期日在上半年再×0.5,其余整年;**到期自然年之后不再计息**(例:2027 到期 → 2028 及以后对该债/切片利息为 0;分期拆片按各片到期日分别截断)。「5年之后」仅累加 afterStart 至各债到期年(含)的本金与利息。服务费=`(本金+利息)×费率×0.01`。还本付息计划页仍按应上缴资金日与期次规则,互不影响 6. 服务费=(本金+利息)×费率×0.01 7. 区划按固定标准名与顺序显示/汇总:宜宾市本级、三江新区、高新区、翠屏区、叙州区、南溪区、江安县、长宁县、高县、珙县、筠连县、兴文县、屏山县;别名映射如市本级→宜宾市本级、开发区→高新区;未知区划保留并排最后 8. 导出:`分区划分年汇总_{起始年}.xlsx` ## 项目发行对照规则(需求分析(1).docx · 版本1) 1. 以 **表3(政府债券余额明细)** 为底;分期多行按「**表3原区划** + 编码」汇总余额(不同区划绝不合并) 2. 查项目:**先表2,再表1**;查找键用规范化区划(见下) 3. 同输出区划 + 同项目名称合并,发行金额累加;表3 已是 **三江新区/高新区** 时输出保持原区划 4. 表2 发行金额单位为 **万元 → ×10000 转元**;表1 用 **支出金额(原币)**(元) 5. 资金投向领域:优先「资金投向领域」,否则「资金投向领域(大类)」,再否则「项目类型」 6. 到期日为空时:起息日 + 期限年数;**30年期分期还本**同区划同债多行取**最大到期日**(有截止日时仅就仍计入的切片取最大);输出与导出均含 **到期日期** 列 7. 区划别名**仅用于查找**:表3 的 **宜宾市本级 / 三江新区 / 高新区** → 到表1/表2 的「宜宾市本级」查找 8. **固定金额拆分(可配置,`fixedBondSplits`)**:对表3 宜宾市本级家族(宜宾市本级/三江新区/高新区)中、债券 **名称** 命中规则的债,按规则 `parts`(区划+发行金额)输出固定行,项目名取市本级查找池并加 `nameMark`(默认「拆分」);进入已处理集合,**不再**走单位配置改挂与第9条 30 年转贷拆分。未在 localStorage 配置时默认仍为「2021年四川省政府一般债券(二期)」→ 宜宾市本级 `40425000` + 三江新区 `5580000`;可在页面「特例规则」改金额/债名/增删,或保存空列表关闭;表3无该债则静默跳过 9. **30年期分期还本·转贷拆分**(仅表3 宜宾市本级/三江新区/高新区,期限含「30」且含「分期还本」):同一债券编码下汇总各区划转贷 `T`;排在第8条固定拆分之后。若已配置单位到**高新区/三江新区**且表3确有该区划转贷,则这些单位的项目金额**整额挂该区划**(不再按比例摊进其它区划);其余(宜宾市本级/未配置,或配置区划不在表3转贷中)仍按剩余区划做转贷拆——单项目各区划发行=`T`,多项目 `项目×T/ΣT`;按区划校验 `T`与发行合计 10. **市本级单位配置**(localStorage `municipalUnits`):候选单位 = 表1「**区划**=宜宾市本级/市本级」的「**单位**」∪ 表2「**所属区县**=宜宾市本级/市本级」的「**单位名称**」(多选/全选;名称按「编码+名称」规范去重,兼容双空格/`--` 变体);按高新区 / 三江新区 / 宜宾市本级分组。生成时对市本级家族按单位把项目发行金额合计到对应表3区划——**优先同名项目的表2单位,其次表1单位**;未配置单位默认 **宜宾市本级**;表3姐妹行并存时禁止双计;第8条固定拆分仍整债跳过单位改挂;第9条在高新/三江独占后对剩余项目继续转贷拆 11. **项目编码划拨(可配置,`projectBondTransfers`)**:表2「**项目编码**」命中规则时,将该项目发行金额并入规则指定的 `targetBondName` + `targetRegion`(默认宜宾市本级),项目名加 `nameMark`(默认「三江划拨」);原挂载不再重复计。未配置时默认仍为编码 `511500155313608894706` →「2020年四川省社会事业专项债券(一期)-2020年四川省政府专项债券(五十四期)」;可在「特例规则」改编码/目标债/标注或关闭;找不到编码或表3无目标债则静默跳过(可记 tip) 12. **已删除(勿再加回)**:原先「备选库项目-宜宾学院临港校区项目(一期)」「备选库项目-四川外国语大学成都学院宜宾校区(一期)」整额强制宜宾市本级的写死规则已移除;区划请用第 15 条差额/区划调整(`projectRegionOverrides`)手动配置 13. **已删除(勿再加回)**:下列「整额划拨三江新区 + 项目名标市本级转贷」硬编码已移除——`P24511500-0059`、`P22511500-0138`、「川南城际铁路自宜段」支出 512 万元、「新建铁路重庆至昆明高速铁路收益与融资自求平衡专项债券」支出 220 万元;若需改区划请用第 15 条差额/区划调整 14. 项目名称为空:输出用 **置换债务名称**,行标黄 15. 同一区划同一债券:以表3为组头,按**最终输出**核对转贷与该区划该债发行合计(容差 0.5 元)。「差额 / 区划调整」:组头为**宜宾市本级/三江新区/高新区**时,组内列举该债在家族三区的全部项目(可互改挂);**其它区划**仅列本区项目。标注现属,下拉默认为现属,修改后写入 `projectRegionOverrides` 并立即重算 16. **截止日**:页面时间选择器;列表与导出均排除「到期日 < 截止日」的数据(等于截止日的保留)。**30年期分期还本**另在汇总前按切片排除:到期日早于截止日的切片余额不计入该区划该期债的合计(转贷 `T`、项目发行合计与对账同口径)。市本级家族走第9条转贷拆分(按剩余 `T` 重算发行);**其它区划**的「本区发行合计」按剩余余额/原余额比例缩减项目发行金额,与剔除后的表3余额同一口径。未选截止日不排除;切片全部被排除则该组不出现。非分期债仍按输出行整行过滤,汇总逻辑不变 ### 特例规则怎么配(固定拆分 / 编码划拨) 入口:**项目发行对照**页 → 「特例规则(可配置)」卡片(可展开/收起)。 | 配置项 | localStorage 字段 | 默认(未写入时) | 说明 | |--------|-------------------|------------------|------| | 固定金额拆分 | `fixedBondSplits` | 2021一般债二期:市本级 40425000 + 三江 5580000,标注「拆分」 | 每条:启用、债名、标注、拆分行 `区划\|金额` | | 项目编码划拨 | `projectBondTransfers` | 编码 511500155313608894706 → 五十四期 / 宜宾市本级,标注「三江划拨」 | 每条:启用、项目编码、目标债名、目标区划、标注 | - **null / 未配置**:用引擎内置默认(与旧硬编码行为一致)。 - **保存空列表**:关闭该类规则。 - **取消勾选「启用」**:单条关闭,其余仍生效。 - **恢复默认**:清空该字段(写回 null),下次按内置默认。 - 与 JSON 备份/导入一并持久化;改完点「保存」后会自动重算(已导入表时)。 - **不必做成特例配置的通用逻辑**:区划查找别名、市本级单位配置、30 年家族转贷拆分、差额对账、区划手动覆盖(`projectRegionOverrides`)。 ## 建议自测 ### 还本付息 1. 余额页导入 `templates/导入模版.xlsx` 或表3 2. 计划页填年度 → 生成 → 切换合并开关 → 导出 3. 抽查:利息半年付 `/2`;服务费 `(本金+利息)×0.00475×0.01`(无本金期亦同) 4. 「分区划分年汇总」选起始年 → 生成 → 核对某区划 5 年行 +「5年之后」→ 导出 自动化:`node _verify/test-v2-summary.mjs` ### 项目发行对照(版本1) 1. 首页选版本1 → 侧栏「项目发行对照」依次导入桌面 `2026-11` 的表1、表2、表3 2. 点「生成对照」:样例约 债券 ~2420、输出 ~8079、差额/未命中数百条(样例数据本身有不一致) 3. 在「差额 / 区划调整」中打开不平衡组,改某一项目区划 → 应立即重算;刷新后覆盖仍在(表需重导后再生成) 4. 搜索「2019年四川省政府一般债券(六期)」:应能看到 **三江新区** 行(不得变成宜宾市本级) 5. 设截止日如 `2027-01-01`:列表行数减少;导出文件名含 `_截止20270101`,且无到期日早于该日的行;导出列含 **到期日期**;30年期分期还本中到期日早于截止日的切片不计入项目合计 6. 硬刷新后需重新导入表1/2/3(仅存内存);区划覆盖仍保留在 localStorage 7. 「特例规则」:展开 → 改固定拆分金额或关闭编码划拨 → 保存并重算 →「恢复默认」应回到 2021二期 / 三江划拨默认 自动化:`node _verify/test-v1-req.mjs`(单元)与 `node _verify/test-v1-real.mjs`(需 `/workspace/uploads/2026-11` 样表)。 ## 已知限制 - 无登录 / 多租户;单浏览器本地数据 - 表1/2/3 体量大,仅放内存,刷新需重导 - 节假日内置 2026–2028,不在线拉取国务院安排;正式通知更新后请「重新填入」或手工改 - 自动分期默认等额;非等额请 Excel 预拆 - 「已付本金」仅存储,不扣减余额 - 三江新区/高新区在表2常挂在「宜宾市本级」下:按别名可查找;配置市本级单位后,项目发行金额按单位拆到对应表3区划(未配置时仍整池挂本行,可能与余额不一致并进差额提示) ## 后续扩展 可迁 Vue3 + Element Plus + NestJS + PostgreSQL;`engine.js` / `project-engine.js` / `excel.js` 可复用为共享逻辑。