feat: add assessment workbench and September reconciliation
Preserve August hydrogen revision and September audit evidence; calculate interrupted vehicle history across all prior months. Record remaining carry-policy and layout-baseline discrepancies.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
# 2026年8月绩效核算
|
||||
|
||||
> **四人全部奖金剔除(2026-09-15,当前口径,覆盖此前转接口径)**:伍仲文、岑彦、赵连飞、钱婧四人全部奖金(当月、结转、历史补发1—7月、累计补发8月)取消,本人不发放、不转交。最终发放表仅含非离职176条原项,应发=实发51,007.41元;钟祥恢复2,445.80元、刘念念恢复10,445.80元,其他人员逐项金额不变。主核算表`里程任务考核_8月核算.xlsx`共19张工作表(7公共+12个人),不含四人任何考核记录/分组/个人Sheet/姓名,全本无“暂算”字样;主表按原负责人过滤,同车其他负责人区间保留,不按车牌整删。原始records/daily/输入哈希不变。本轮权威验证为运行支持`verify_final_exclusion.py`(结果`最终全剔除验收.json`)。
|
||||
>
|
||||
> 离职业务交接转接(2026-09-14,已被上行覆盖,保留历史对照):仅伍仲文、岑彦、赵连飞、钱婧执行;四人旧引擎的结转、历史补发1—7月、累计补发8月及旧当月口径全部取消,仅8月当月达标奖励从records重新生成后转交接收人(伍仲文→钟祥、岑彦→钟祥、赵连飞→刘念念、钱婧→金可鹏;钟祥450.00、刘念念225.48、金可鹏0)。该口径使发放表为181项、实发51,682.89元,本轮已全部回退并由exclude_all口径取代;`verify_transfer_20260914.py`随之过时。
|
||||
>
|
||||
> 离职停发修正(2026-09-11,已被上行转接规则覆盖,保留历史对照):钱婧、岑彦、赵连飞已离职,2026年8月本次支付(当月、结转、历史补发1—7月、累计补发8月)全部实发0,仅本人,不转接、不重分配;旧“离职暂计本人”约定仅对三人失效,伍仲文及其他人员保持原状。原计算额保留供审计。覆盖后应发53,017.41元,离职停发扣减1,860.00元(钱婧150.00、岑彦300.00、赵连飞1,410.00),实发51,157.41元。不改里程、归属、资格、奖励基准与亏损规则,不追溯1—7月历史。独立验收见运行支持`verify_withhold_correction.py`与`离职停发独立验收.json`。
|
||||
>
|
||||
> 里程修正(覆盖下方旧版取数及结果):非测试日有纯氢数据(包括0)取纯氢,没有则仪表;测试日取GPS。保留测试候选逐日差值判定,无纯氢且无法判定测试的候选日兜底GPS。取消仪表未达标优先与测试日清零。按已有数据暂算53,017.41元,当月27,032.89、结转14,700、历史补发1,977.42、8月累计补发9,307.10。193条里程改变,少发的1,000元为粤A02007F刘念念累计补发。3辆49日GPS缺失标待核实,另17辆72日仪表缺值沿用已有合计。五表已同步;原始日矩阵不变。以下54,017.41及旧取数描述保留作历史对照,不是当前结果。
|
||||
|
||||
当前验收入口为运行支持目录`verify_final_exclusion.py`,证据`最终全剔除验收.json`;`verify_august.py`继续核验逐日取数与非改版工作簿。`verify_transfer_20260914.py`(转接口径181项/51,682.89)及`verify_restyle.py`、`verify_four_departed.py`、`verify_withhold_correction.py`、`verify_latest_correction.py`均已过时,仅作历史对照,不得作为本轮依据。当前实际作者以业务目录运行支持为准;项目`.aug_fix_staging`为历史暂存,未包含后续待核实显示与统计修正,不应再覆盖当前文件。
|
||||
|
||||
用户于2026年9月11日确认开始计算,采用此前确认的业务口径及已有里程。本次未覆盖原始输入和1—7月历史文件。
|
||||
|
||||
## 结果
|
||||
|
||||
- 当月奖励:26,839.99元。
|
||||
- 结转:14,700.00元。
|
||||
- 历史补发:1,977.42元(6月1,150.00元、7月827.42元)。
|
||||
- 累计补发8月:10,500.00元。
|
||||
- 合计:54,017.41元,按每条发放记录四舍五入到分后汇总。原引擎未逐条取分总和取分为54,017.42元,差0.01元。
|
||||
- 四人全部奖金剔除(当前口径,2026-09-15):伍仲文、岑彦、赵连飞、钱婧四人全部奖金取消,本人不发放、不转交;最终发放表176项、应发=实发51,007.41元,钟祥2,445.80元、刘念念10,445.80元。旧引擎口径应发53,017.41元,取消四人旧项2,010.00元。下方转接51,682.89元、停发51,157.41元、54,017.41元均为历史口径,仅作对照。
|
||||
- 原始考核354辆、364条,123条达标。结转延续另有20组无本月考核记录的历史组合,不增加原始考核车辆数。
|
||||
|
||||
## 规则及来源
|
||||
|
||||
输入目录:`/Users/shishengliang/Documents/羚牛/里程考核核算/8月/输入数据/`。
|
||||
|
||||
9月标签名单适用于8月:31辆采用150/300元新金额,36条记录;名单外8辆忽略。原有目标、折算和结转补发规则沿用。历史月份补发按历史月份有效奖励,1—7月不追溯更改。7辆销售、部门修正以确认名单为准。粤AGP9753的8月7日归尚建华,谯云从8月8日起计24天,目标3,870.97km。
|
||||
|
||||
取数:已有车机区间合计未达标,直接采用。其余优先区间纯氢;测试名单日差值“车机−GPS>50km”剔除纯氢,车机为空时改用“纯氢+纯电−GPS>50km”。非测试无纯氢取车机,测试名单无纯氢取GPS。不同GPS来源仅补缺日,不相加、不覆盖真实0。粤A00585F补25日,GPS合计8,326.50km。
|
||||
|
||||
138条采用车机合计的记录有日值空白,均已保留标记。其中此前待补的7辆已有合计足以达标,用户确认按已有值核算。空白未伪造成实测0,补数后须重新计算累计、结转及补发。
|
||||
|
||||
1—6月使用项目根目录历史源表,7月使用`7月绩效重算_多源考核里程_20260817/租赁任务考核_2026年7月.xlsx`。7月先按当时离职处理口径复算,62,616.73元与确认结果一致。8月离职处理按本次确认口径。
|
||||
|
||||
## 交付与复算
|
||||
|
||||
输出目录:`/Users/shishengliang/Documents/羚牛/里程考核核算/8月/8月核算结果/`。本轮仅交付更新后的主核算`里程任务考核_8月核算.xlsx`;处理后考核源表、取数干预说明与多源里程表保持原内容不重建。原《离职人员8月奖金处理明细.xlsx》为已过期的转接口径,已先备份并移至运行支持`本轮全剔除归档/`,避免与最终表混淆(审计保留)。
|
||||
|
||||
Python计算入口为项目根目录`calculate_august.py`。仅使用openpyxl读取输入,复用原calc_engine,输出JSON,不直接写Excel。注意:原通用read_file会按旧规则重新设置奖励,不能独立读取本次处理源表后直接套旧主程序。
|
||||
|
||||
Excel构建器位于运行支持目录,通过@oai/artifact-tool生成Excel。主核算表`里程任务考核_8月核算.xlsx`由`restyle_august.mjs`直接输出:按原负责人过滤四名离职人员的records/分组,只用`d.people`(12名非离职)建立个人表,里程明细、计算过程、追踪及两版汇总均不出现四人。发放金额、人员/部门汇总及个人发放明细为公式联动。奖金发放记录采用“考核应发G−不发/扣减I=实发J”;I列固定为0,本轮无停发、无转交,离职四人旧项不进入发放表。里程明细奖金公式范围按实际非离职记录数(345条)动态收缩,不再使用固定N2:N365。里程选择、资格、历史累计、结转余额由Python引擎计算,修改原始数据后须重新运行计算和构建流程。`build_august_workbooks.mjs`本轮不运行、其余三份工作簿不重建;原独立离职明细已归档。
|
||||
|
||||
验证脚本与结果在同一运行支持目录。本轮权威验证为`verify_final_exclusion.py`(结果`最终全剔除验收.json`):从`全部离职剔除前备份/august_calculation.json`核对非离职176条逐项完全不变、转接5条全部删除;净51,007.41元、钟祥2,445.80元、刘念念10,445.80元;主表19张工作表(7公共+12个人)、四名姓名不出现在整本任何单元格/表名/文件级XML、全本无“暂算/离职/转接/转交/转入”;原始records/daily/输入哈希不变;里程明细/计算过程/追踪按原负责人过滤且同车其他负责人区间保留;新旧汇总、12个个人表、发放表与部门合计一致、公式错误0;并对受影响区域渲染复核保存后的文件。`verify_august.py`继续核验逐日汇总、9,184个车日无重复、归属、政策、GPS补齐、非零纯氢6日替代测试判定、源文件哈希与各层金额。`verify_transfer_20260914.py`(转接口径181项/51,682.89)及`verify_latest_correction.py`、`verify_withhold_correction.py`、`verify_restyle.py`、`verify_four_departed.py`已失效,仅作历史对照,不得作为本轮依据。
|
||||
|
||||
## 样式调整
|
||||
|
||||
用户随后要求主核算文件与7月版式一致,并保留原横向汇总为“8月汇总(新版界面)”。当前主核算共19张工作表(7张公共+12张个人),采用7月的宋体、浅蓝表头、细边框、纵向分类汇总和逐车展开的个人对账单;新增月份扩展至8月。原横向深色汇总单独保留。非离职345条考核记录、176条发放项、实发合计51,007.41元(应发=实发,无停发扣减、无转交)经逐项对比保持一致;四名离职人员不列入汇总、不设个人表,原计算额仅保留在核算JSON审计字段。
|
||||
|
||||
运行支持目录的`restyle_august.mjs`为最后一步版式构建器,本轮在运行`calculate_august.py`后直接运行该脚本输出主核算表,不再运行`build_august_workbooks.mjs`。本轮金额与版式一致性验证使用`verify_final_exclusion.py`和`最终全剔除验收.json`;旧`verify_transfer_20260914.py`/`离职转接验收.json`及`verify_restyle.py`/`样式调整验证结果.json`的固定坐标与转接口径已失效。调整前主表、JSON、作者脚本与配置保存在`全部离职剔除前备份`供追溯,过期离职明细归档在`本轮全剔除归档`;原始里程四源、多源里程表及另两份交付工作簿未改动。
|
||||
@@ -0,0 +1,19 @@
|
||||
# 9月核算与提交状态(2026-10-09)
|
||||
|
||||
本次保存考核服务、前端原型、8月纯氢修正和9月核算脚本、结果及历史核对报告。
|
||||
|
||||
9月主表为 `outputs/september-20261009/里程任务考核_2026年9月_含缺口核算.xlsx`,145条发放项合计40,211.67元。8月实际已发按45,065.47元锁定。刘念念归业务一部,补发列倒序。目录中的 `_1009.xlsx` 为另存文件,本次保留原样,未将其替换为主表或对其背书。
|
||||
|
||||
## 本次检查
|
||||
|
||||
- `python -m unittest test_cumulative_history.py`:4项通过。
|
||||
- `npm --prefix prototype run build`:通过。
|
||||
- `python outputs/september-20261009/verify_september.py`:通过,逐日取数、历史补发去重、发放账与主表一致,无公式错误。
|
||||
- `python outputs/september-20261009/audit_history/audit_september_against_paid.py`:完成;锁定8月余额时独立核算金额一致。
|
||||
- `python outputs/september-20261009/verify_layout.py`:未通过。首次差异为“业务考核视图”P7,旧版式备份57.79,当前57.80。本次仅记录差异,未修改Excel;未宣称版式与备份完全一致。保留 `before-layout.xlsx.bak` 作为该检查的必要基线。
|
||||
|
||||
## 已知待复核事项
|
||||
|
||||
详见 `outputs/september-20261009/audit_history/1-8月与9月发放核对报告.md`。无当月考核记录的结转分支与累计公式不一致,其中粤AGP5158尚建华9月150元需要复核;另有累计资格显示差异和1,000个车辆日缺口。本次提交不是对最终付款资格的确认,未调整既定历史已发金额。
|
||||
|
||||
原始下载、依赖、巨型Excel调试扫描以及旧 `.aug_fix_staging` 交付留在本地。复现核算仍需脚本引用的原始文件和对应Python/Node依赖;前端与API的运行说明见 `prototype/README.md`。
|
||||
@@ -0,0 +1,309 @@
|
||||
# 交还车 Excel 导入与月度考核重建追溯
|
||||
|
||||
调查日期:2026-09-10。时间均为北京时间。此次仅查阅备份,未连接或修改数据库。
|
||||
|
||||
## 已定位文件
|
||||
|
||||
- 8 月最后一个保留的 Time Machine 快照:`com.apple.TimeMachine.2026-08-25-122304.backup`,外置卷“Mac备份”。
|
||||
- [只读挂载后的用户目录](</tmp/tm-20260825-investigation/2026-08-25-122304.backup/Macintosh HD - Data/Users/kkfluous>),备份中用户名为 `kkfluous`。
|
||||
- [导入脚本](</tmp/tm-20260825-investigation/2026-08-25-122304.backup/Macintosh HD - Data/Users/kkfluous/Projects/lingniu/ln_asset/lingniu_asset_server/lingniu-manager/doc/scripts/import_take_return_assessment.py>)。
|
||||
- [当时的 Excel(微信正式文件目录)](</tmp/tm-20260825-investigation/2026-08-25-122304.backup/Macintosh HD - Data/Users/kkfluous/Library/Containers/com.tencent.xinWeChat/Data/Documents/xwechat_files/wxid_1704407055112_3af8/msg/file/2026-08/v_vehicle_lease_delivery_return_record.xlsx>)。
|
||||
- [桌面旧 Excel](</tmp/tm-20260825-investigation/2026-08-25-122304.backup/Macintosh HD - Data/Users/kkfluous/Desktop/v_vehicle_lease_delivery_return_record.xlsx>)。
|
||||
- [全表清空前的 CSV 备份](</tmp/tm-20260825-investigation/2026-08-25-122304.backup/Macintosh HD - Data/Users/kkfluous/Desktop/lingniu_backup_20260812_150249/before_monthly.csv>),文件实际存在,1,320,201 字节。
|
||||
- 原始 Claude 会话 ID:`58ef022d-69bc-4913-84ff-59c8934beb5f`。下文标注原文件行号;会话包含数据库凭据,本报告不复制凭据。
|
||||
|
||||
挂载路径位于 `/tmp`,重启或卸载后需重新挂载才能打开上述链接。
|
||||
|
||||
## 关键结论
|
||||
|
||||
1. 最终实现是 Python 脚本写入已有表,不是早期讨论的 Java 上传接口。Excel → `tab_imported_take_return` → `tab_rent_task_assessment_monthly`。`--step all` 依次导入、生成,`--step generate` 只生成。
|
||||
2. 导入按 `delivery_vehicle_id` upsert,并将命中记录的 `is_generated` 重置为 0(脚本 156–182 行)。生成读取 `is_generated=0`(255–264 行),用 `rent_task_id=-delivery_vehicle_id` 写入月度表(339–340、460 行起)。这是实际重新生成的触发点。
|
||||
3. upsert 不是完整替换:不删除新 Excel 中已不存在的原始记录。历史执行输出显示 Excel 2,153 行,但生成读取 2,169 条原始记录,说明原始表范围大于本次文件,不能声称严格以新文件为唯一数据源。
|
||||
4. 2026-08-12 14:59 左右先清理 518 条月度记录,降至 4,315 条。15:02:49 才备份这 4,315 条,然后执行无 WHERE 的 `DELETE FROM tab_rent_task_assessment_monthly`,重置原始表 `is_generated=0` 并运行 `--step all`。CSV 并不是当天最初状态的备份。
|
||||
5. 第一次重建的按车牌去重过宽,错误跳过正常新合同,结果只有 3,738 条。15:09 修正后再次清空月度表、重置标志、运行 `--step generate`,15:11:59 输出 4,768 条。
|
||||
6. 最终去重按车牌、交车日期、经理分组,有已闭环记录才跳过同组未闭环记录。代码注释称经理名称,但实际 `rec[7]` 对应 `business_manager_id`,即按经理 ID 分组。
|
||||
7. 15:12 数据库查询输出:总计 4,768 条;7 月 396 条、380 辆车。相对清理后的 CSV 基线,7 月为 318 → 396 条、314 → 380 辆。用户提出的“最初 387 辆”在该会话结束时仍未解释,不能据此断言全部差异已解决。
|
||||
8. 历史“异常 0”只覆盖经理/目标字段为空、多条未闭环等有限查询;当时同车牌同月份多条记录仍有 231 组,不等价于全面数据质量验证。
|
||||
|
||||
## Git 佐证
|
||||
|
||||
- `98f7aa07`,2026-07-14 19:29:37:同一车牌多条未闭环只保留最新。
|
||||
- `c289213a`,2026-08-12 15:00:01:存在已闭环即跳同车牌未闭环;后续证实过宽。
|
||||
- `3e854a58`,2026-08-12 15:12:30:仅同一车牌、交车日期、经理相同时才去重。
|
||||
|
||||
以上提交已在备份中的 Git 历史核实。会话记录显示当时推送因认证未完成,不据此推断远端状态。
|
||||
|
||||
## 历史原文与实际执行输出
|
||||
|
||||
下列摘录保留当时表述,其中“全量覆盖”“数据干净”等说法应以上面的代码核验和后续纠正为准。
|
||||
|
||||
### 2026-07-08 19:21:23 · 原会话第 388 行 · assistant
|
||||
|
||||
所有任务完成。以下是实施总结:
|
||||
|
||||
---
|
||||
|
||||
## 实施完成总结
|
||||
|
||||
### 新建文件(13个)
|
||||
|
||||
| # | 文件 | 说明 |
|
||||
|---|---|---|
|
||||
| 1 | `src/main/resources/sql/V20260708__create_import_assessment_tables.sql` | DDL:2张新表 + 1个统一查询VIEW |
|
||||
| 2 | `module/excel_import_assessment/model/eo/TakeReturnImportEo.java` | EasyExcel 实体,18列映射 |
|
||||
| 3 | `module/excel_import_assessment/model/po/ImportedTakeReturnPo.java` | 导入原始记录 PO |
|
||||
| 4 | `module/excel_import_assessment/model/po/ImportedAssessmentMonthlyPo.java` | 月度考核记录 PO |
|
||||
| 5 | `module/excel_import_assessment/model/vo/ImportResultVo.java` | 导入结果 VO |
|
||||
| 6 | `module/excel_import_assessment/dao/ImportedTakeReturnDao.java` | 原始记录 DAO |
|
||||
| 7 | `module/excel_import_assessment/dao/ImportedAssessmentMonthlyDao.java` | 月度考核 DAO |
|
||||
| 8 | `module/excel_import_assessment/service/ExcelImportAssessmentService.java` | Service 接口 |
|
||||
| 9 | `module/excel_import_assessment/service/impl/ExcelImportAssessmentServiceImpl.java` | Service 实现(核心逻辑) |
|
||||
| 10 | `module/excel_import_assessment/controller/ExcelImportAssessmentController.java` | REST Controller |
|
||||
| 11 | `module/excel_import_assessment/task/ExcelImportMileageUpdateTask.java` | 定时任务(每30分钟刷新里程) |
|
||||
| 12 | `mapper/business/ImportedTakeReturnDao.xml` | Mapper XML |
|
||||
| 13 | `mapper/business/ImportedAssessmentMonthlyDao.xml` | Mapper XML |
|
||||
|
||||
### 修改文件(2个)
|
||||
|
||||
| # | 文件 | 变更 |
|
||||
|---|---|---|
|
||||
| 14 | `TabelNameConstant.java` | 新增 `TAB_IMPORTED_TAKE_RETURN` 和 `TAB_IMPORTED_ASSESSMENT_MONTHLY` |
|
||||
| 15 | `RentTaskAssessmentMonthlyDao.xml` | 5个SELECT查询的 FROM 改为 `v_rent_task_assessment_monthly` VIEW |
|
||||
|
||||
### API 端点
|
||||
|
||||
| Method | Path | 说明 |
|
||||
|---|---|---|
|
||||
| POST | `/zuul/v1/excel-import-assessment/upload` | 上传 Excel 文件导入 |
|
||||
| POST | `/zuul/v1/excel-import-assessment/generate-monthly` | 生成月度考核记录 |
|
||||
| POST | `/zuul/v1/excel-import-assessment/update-mileage` | 手动刷新实际里程 |
|
||||
|
||||
---
|
||||
|
||||
### 下一步操作
|
||||
|
||||
**1. 执行 DDL**(需要数据库连接):
|
||||
```sql
|
||||
-- 执行 src/main/resources/sql/V20260708__create_import_assessment_tables.sql
|
||||
```
|
||||
|
||||
**2. 导入数据**:
|
||||
```bash
|
||||
curl -X POST http://your-server:6903/zuul/v1/excel-import-assessment/upload \
|
||||
-F "file=@/Users/kkfluous/Desktop/v_vehicle_lease_delivery_return_record.xlsx"
|
||||
```
|
||||
|
||||
**3. 生成月度考核**:
|
||||
```bash
|
||||
curl -X POST http://your-server:6903/zuul/v1/excel-import-assessment/generate-monthly
|
||||
```
|
||||
|
||||
**4. 刷新里程**:
|
||||
```bash
|
||||
curl -X POST http://your-server:6903/zuul/v1/excel-import-assessment/update-mileage
|
||||
```
|
||||
|
||||
导入后的数据会自动出现在现有的 `/rent-task-assessment-view`、`/department-monthly-statistics` 等查询接口中。定时任务也会每30分钟自动更新进行中记录的实际里程。
|
||||
|
||||
### 2026-07-08 19:40:05 · 原会话第 492 行 · assistant
|
||||
|
||||
已推送。最终方案总结:
|
||||
|
||||
### 最终产物
|
||||
|
||||
| 内容 | 说明 |
|
||||
|---|---|
|
||||
| **DDL** `V20260708__create_import_assessment_tables.sql` | 只建 `tab_imported_take_return` 追溯表 |
|
||||
| **Python 脚本** `doc/scripts/import_take_return_assessment.py` | 解析 Excel → 写入 `tab_rent_task_assessment_monthly` |
|
||||
| **Java 代码** | **零改动**,已全部回退 |
|
||||
|
||||
### 原理
|
||||
|
||||
每条导入记录用 **`rent_task_id = -delivery_vehicle_id`**(负值)写入现有表,与系统正数 ID 不冲突,利用现有唯一键 `(rent_task_id, assessment_year, assessment_month)` 实现幂等。现有定时任务 `RentTaskAssessmentUpdateTask` 每30分钟自动刷新实际里程,无需额外代码。
|
||||
|
||||
### 使用步骤
|
||||
|
||||
```bash
|
||||
# 1. 执行 DDL(只需一次)
|
||||
mysql -h 47.101.148.99 -u root lingniu_prod < V20260708__create_import_assessment_tables.sql
|
||||
|
||||
# 2. 安装依赖
|
||||
pip install openpyxl pymysql
|
||||
|
||||
# 3. 导入并生成月度考核
|
||||
python doc/scripts/import_take_return_assessment.py \
|
||||
--excel /Users/kkfluous/Desktop/v_vehicle_lease_delivery_return_record.xlsx \
|
||||
--step all
|
||||
|
||||
# 4. 后续更新数据:重新执行第3步即可(幂等)
|
||||
```
|
||||
|
||||
### 2026-08-12 13:29:38 · 原会话第 881 行 · user
|
||||
|
||||
现在我要给你一份7月的交换车文件 你帮我更新月度考核任务。
|
||||
|
||||
### 2026-08-12 13:44:44 · 原会话第 903 行 · assistant
|
||||
|
||||
格式一致。新文件 2153 行(上月 2115),1570 辆已完成,583 辆进行中,数据到 2026-08-12。
|
||||
|
||||
现在跑导入更新:
|
||||
|
||||
### 2026-08-12 13:48:08 · 原会话第 912 行 · assistant
|
||||
|
||||
| 指标 | 上月 | 本月 |
|
||||
|---|---|---|
|
||||
| 总记录 | 4,461 | **4,833** |
|
||||
| 覆盖车辆 | 480 | **486** |
|
||||
| 异常记录 | 0 | **0** |
|
||||
| 去重跳过 | 6 辆 | 4 辆 |
|
||||
|
||||
新增 149 辆车有了还车日期,6 辆新车加入考核,数据已更新到 2026-12。
|
||||
|
||||
### 2026-08-12 13:50:27 · 原会话第 930 行 · assistant
|
||||
|
||||
全量。每次跑脚本都会:
|
||||
|
||||
1. **导入**:把 Excel 全部 2153 行 upsert 到 `tab_imported_take_return`(按 `delivery_vehicle_id` 去重),`is_generated` 重置为 0
|
||||
2. **生成**:对全部 `is_generated=0` 的记录重新生成月度考核(upsert 写入,幂等)
|
||||
|
||||
不是增量追加,是全量覆盖更新。好处是每次跑都保证数据跟 Excel 完全一致,不需要关心增量差异。
|
||||
|
||||
### 2026-08-12 14:57:32 · 原会话第 944 行 · assistant
|
||||
|
||||
问题清楚了。`粤AGQ5808` 有三条数据:
|
||||
|
||||
| dv_id | 交车 | 还车 | 状态 |
|
||||
|---|---|---|---|
|
||||
| 1148 | 2025-07-22 | 2026-01-16 | 已完成(旧合同) |
|
||||
| **2209** | 2026-05-10 | **None** | 未闭环 |
|
||||
| **257638** | 2026-05-10 | **2026-07-09** | 已闭环 |
|
||||
|
||||
2209 和 257638 是同一合同,但 257638 有还车时间、2209 没有。脚本去重只处理「两条都未闭环」的情况,漏掉了「一条已闭环一条未闭环」。
|
||||
|
||||
所以 7 月生成了两条:2209(7/1~7/31 进行中)+ 257638(7/1~7/9 已完成)。
|
||||
|
||||
修正逻辑:**同一车牌同一交车日期,如果存在已闭环记录,跳过未闭环的**。
|
||||
|
||||
### 2026-08-12 14:59:20 · 原会话第 966 行 · assistant
|
||||
|
||||
看到了!新文件里 `粤AGQ5808` 只有 **2 条**记录,dv=2209(未闭环的脏数据)已经被源系统清掉了:
|
||||
|
||||
- dv=1148:2025-07-22 ~ 2026-01-16(已完成)
|
||||
- dv=257638:2026-05-10 ~ **2026-07-09**(已闭环)
|
||||
|
||||
但数据库里还残留 dv=2209 的旧月度记录(5~7月)。新文件去掉了它,脚本的 upsert 不会删旧数据,所以还在。
|
||||
|
||||
我先清理残留,再修脚本处理「一条已闭环一条未闭环」的情况:
|
||||
|
||||
### 2026-08-12 14:59:45 · 原会话第 978 行 · assistant
|
||||
|
||||
清理了 **518 条**残留、93 组重复。现在修脚本:
|
||||
|
||||
### 2026-08-12 15:02:40 · 原会话第 1027 行 · user
|
||||
|
||||
是否可以根据新的xlsx 重新生成所有的月度考核记录。原来的备份下,对比下每月的差异。
|
||||
|
||||
### 2026-08-12 15:02:49 · 原会话第 1036 行 · user
|
||||
|
||||
备份: 4315 条 -> /Users/kkfluous/Desktop/lingniu_backup_20260812_150249/before_monthly.csv
|
||||
清空: 4315 条
|
||||
重置 is_generated=0
|
||||
|
||||
备份目录: /Users/kkfluous/Desktop/lingniu_backup_20260812_150249
|
||||
|
||||
### 2026-08-12 15:09:03 · 原会话第 1084 行 · assistant
|
||||
|
||||
找到根因了。去重规则太激进——「存在已闭环就跳所有未闭环」把正常的新合同也误杀了。
|
||||
|
||||
正确规则应该是:**仅当同一车牌 + 同一交车日期 + 同一经理 时,已闭环覆盖未闭环。**
|
||||
|
||||
立即修正并重跑:
|
||||
|
||||
### 2026-08-12 15:11:59 · 原会话第 1090 行 · user
|
||||
|
||||
清空: 3738
|
||||
[连接] rm-bp179zbv481rnw3e2no.mysql.rds.aliyuncs.com:3306/lingniu_prod
|
||||
[生成] 找到 2169 条未生成记录
|
||||
[去重] 沪A31595F: 同一合同(dt=2024-11-22, mgr=297201677868724224)已闭环(dv=828),跳过未闭环 dv=257625
|
||||
[去重] 浙F35688F: 同一合同(dt=2025-09-30, mgr=297201670641938432)已闭环(dv=257601),跳过未闭环 dv=257629
|
||||
[去重] 粤AGQ5808: 同一合同(dt=2026-05-10, mgr=297201677868724224)已闭环(dv=257638),跳过未闭环 dv=2209
|
||||
[去重] 粤AGR9896: 同一合同(dt=2026-05-10, mgr=297201677868724224)已闭环(dv=257637),跳过未闭环 dv=2271
|
||||
[去重] 共标记 4 条记录为已生成
|
||||
[生成] 完成: 成功=962, 跳过=1207, 共生成月度记录=4768条
|
||||
[完成]
|
||||
|
||||
### 2026-08-12 15:12:12 · 原会话第 1095 行 · user
|
||||
|
||||
年月 旧记录 新车 新记录 新车 记录差 车辆差
|
||||
-------------------------------------------------------
|
||||
2024-07 1 1 1 1 +0 +0
|
||||
2024-08 3 3 3 3 +0 +0
|
||||
2024-09 25 24 25 24 +0 +0
|
||||
2024-10 36 35 36 35 +0 +0
|
||||
2024-11 38 38 38 38 +0 +0
|
||||
2024-12 43 40 43 40 +0 +0
|
||||
2025-01 37 37 37 37 +0 +0
|
||||
2025-02 40 38 40 38 +0 +0
|
||||
2025-03 36 29 36 29 +0 +0
|
||||
2025-04 53 53 53 53 +0 +0
|
||||
2025-05 64 64 64 64 +0 +0
|
||||
2025-06 71 66 72 66 +1 +0
|
||||
2025-07 100 95 111 96 +11 +1 ***
|
||||
2025-08 156 151 168 162 +12 +11 ***
|
||||
2025-09 196 187 207 198 +11 +11 ***
|
||||
2025-10 203 197 216 207 +13 +10 ***
|
||||
2025-11 264 245 277 257 +13 +12 ***
|
||||
2025-12 274 263 290 276 +16 +13 ***
|
||||
2026-01 290 279 306 295 +16 +16 ***
|
||||
2026-02 292 280 312 296 +20 +16 ***
|
||||
2026-03 372 347 395 365 +23 +18 ***
|
||||
2026-04 412 397 446 420 +34 +23 ***
|
||||
2026-05 404 395 458 425 +54 +30 ***
|
||||
2026-06 349 348 414 404 +65 +56 ***
|
||||
2026-07 318 314 396 380 +78 +66 ***
|
||||
2026-08 238 238 324 321 +86 +83 ***
|
||||
|
||||
旧总计: 4315 新总计: 4768 差异: 453
|
||||
差异>5的月份: 14
|
||||
|
||||
### 2026-08-12 15:12:25 · 原会话第 1104 行 · user
|
||||
|
||||
总记录: 4768
|
||||
异常(sm_id/target null): 0
|
||||
同一车牌+月份多条记录: 231
|
||||
多条未闭环记录的车牌: 0
|
||||
|
||||
7月: 396条 380辆车
|
||||
|
||||
### 2026-08-12 15:12:38 · 原会话第 1113 行 · assistant
|
||||
|
||||
本地已提交 `3e854a58`,推送到 `gitea.lnh2e.com` 需要你的 Git 凭据。手动 `git push` 一下即可。
|
||||
|
||||
**总结**:新规则是「同一车牌 + 同一交车日期 + 同一经理」重合时才跳未闭环——从之前误杀 333 条降到仅命中 4 条真正的脏数据,7 月从 213 辆恢复到 380 辆。
|
||||
|
||||
### 2026-08-12 15:13:19 · 原会话第 1126 行 · assistant
|
||||
|
||||
差异清晰了:
|
||||
|
||||
| 类别 | 数量 | 说明 |
|
||||
|---|---|---|
|
||||
| **移除** | 5 辆 | 全部未闭环旧数据,同一客户「佛山市三水区国裕饮食」,脏数据清理 |
|
||||
| **新增** | 71 辆 | 全部是新合同进行中(旧去重规则误杀,修复后回归) |
|
||||
| **变更** | 12 辆 | 同一车但 dv_id 或 month_end 变了(Excel 数据更新) |
|
||||
|
||||
净增 66 辆(380 - 314),5 条删除全是脏数据,71 条新增全是之前被误杀的正常新合同。
|
||||
|
||||
### 2026-08-12 15:13:43 · 原会话第 1128 行 · user
|
||||
|
||||
最开始是 387车
|
||||
|
||||
### 2026-08-12 15:14:19 · 原会话第 1135 行 · assistant
|
||||
|
||||
备份里 7 月是 314 辆,不是 387。387 可能是更早的状态(在我们清空重导之前)。对比当前 vs 备份:
|
||||
|
||||
| | 车辆数 | 变化 |
|
||||
|---|---|---|
|
||||
| 旧备份 | 314 | — |
|
||||
| 当前 | **380** | +71 新合同 / -5 脏数据 |
|
||||
|
||||
少掉的 5 辆都是同一客户「佛山市三水区国裕饮食」的脏数据,被去重规则正确排除。要我再深入排查那 7 辆差异的来源吗?
|
||||
@@ -0,0 +1,72 @@
|
||||
# 里程绩效:原型与 API 对接
|
||||
|
||||
## 页面与业务流程
|
||||
|
||||
月度核算展示本次批次的考核明细;异常核对定位缺少里程、来源冲突、交车区间重叠;详情按车牌和租赁记录追溯到每日来源及原始行。数据接入接收租赁区间和三类里程长表。规则中心明确参与车辆、有效期、测试候选、来源提供方优先级。API 对接页面展示真实接口状态与契约。
|
||||
|
||||
演示数据完全虚构。真实模式与演示模式不混用结果。当前只提供试算,不模拟已审批或已发放。
|
||||
|
||||
## 已接通的本机接口
|
||||
|
||||
前端相对路径 `/api`,开发代理转发 `http://127.0.0.1:8765` 并移除 `/api`。JSON 返回 UTF-8;错误体 `{ "error": "说明" }`。状态码 200/201 成功、400 请求错误、404 快照不存在、409 有异常禁止导出。
|
||||
|
||||
| 方法 | 路径 | 请求与结果 |
|
||||
|---|---|---|
|
||||
| GET | /health | 服务状态、引擎 version |
|
||||
| POST | /imports/leases | 原始 xlsx 二进制;返回 id、raw_rows、accepted_rows、issues |
|
||||
| POST | /imports/mileage?source=hydrogen&provider=guangzhou | 原始 xlsx;source 支持 hydrogen/tbox/gps,provider 需与规则对应 |
|
||||
| GET | /imports/{id} | 标准化导入快照、行和错误 |
|
||||
| POST | /assessments | 下方请求;返回 id/status/summary/issues |
|
||||
| GET | /assessments/{id} | records、daily_trace、issues、excluded、inputs、engine_version |
|
||||
| GET | /assessments/{id}/export.xlsx | ready 时导出业务考核源表;异常返回 409 |
|
||||
|
||||
```json
|
||||
{
|
||||
"lease_import_id": "导入返回的64位ID",
|
||||
"mileage_import_ids": ["里程导入ID"],
|
||||
"config": {
|
||||
"month": "2026-08",
|
||||
"test_plates": [],
|
||||
"test_threshold_km": 50,
|
||||
"source_priority": {
|
||||
"hydrogen": ["guangzhou"],
|
||||
"tbox": ["vehicle-platform"],
|
||||
"gps": ["g7", "dongfang", "xinda", "guangan"]
|
||||
},
|
||||
"rules": [{
|
||||
"plate": "DEMO-001", "target_id": 1,
|
||||
"target_name": "交投40辆4.5T普货", "monthly_target_km": 3000,
|
||||
"valid_from": "2026-08-01", "valid_to": "2026-08-31"
|
||||
}]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
文件最大 20 MB,解压后最大 200 MB,表头必须在前十行。里程表必填 `plate_number,date,mileage_km`(日里程,km)。租赁表字段:`vehicle_id,plate_number,contract_id,contract_code,project_name,customer_name,business_department_name,business_manager_name,delivery_vehicle_id,delivery_time,return_vehicle_task_id,return_time`。未还车可留空最后两项。里程空值不可当零;合法零必须保留。来源提供方顺序用于按日补缺,不能叠加多个 GPS 提供方。
|
||||
|
||||
ID 为内容哈希,同输入生成相同快照标识。调用方应保存 ID 并随批次保存输入、规则和引擎版本;重新补数生成新批次,不覆盖旧批次。
|
||||
|
||||
## 最新规则与旧 API 的明确差异
|
||||
|
||||
依据项目 8 月说明顶部的当前口径:非测试日有纯氢(含 0)取纯氢,无纯氢取仪表;测试日取 GPS;测试候选日无法判定且无纯氢时兜底 GPS。现有 API 则按区间选来源并对测试日清零,不能直接固化为正式规则。规则中心的 JSON 参数只能配置现有引擎支持项,不能靠改参数完成算法迁移。
|
||||
|
||||
最新四名离职人员为全部奖金剔除,不发放不转交。历史说明存在被覆盖的停发、转接口径,应采用带生效月份和批准记录的规则版本。结转、累计补发、历史有效奖励和归属分段需从 `calc_engine.py` 与最新计算入口抽离;不能以简单完成率乘奖金替代。
|
||||
|
||||
## 后续系统设计(建议契约,尚未实现)
|
||||
|
||||
建议实体:source_snapshot、lease_segment、daily_mileage、rule_version、assessment_batch、assessment_record、bonus_ledger、review_event。逐日依据关联来源行;奖金账本以车辆、负责人、政策有效期和所属月份为粒度,金额使用整数分或 Decimal。
|
||||
|
||||
建议新增接口:
|
||||
|
||||
- `POST /v1/sync-jobs`:按月份从车辆平台、租赁系统及 GPS 拉取快照,返回 job_id;通过 `GET /v1/jobs/{id}` 查询进度与失败原因。
|
||||
- `GET/POST /v1/rule-versions`:草稿规则、版本、生效期和审批记录。
|
||||
- `POST /v1/assessment-batches`:固定输入快照 ID、规则版本 ID、历史账本版本,异步执行;支持 Idempotency-Key。
|
||||
- `GET /v1/assessment-batches/{id}/records`:分页与服务端筛选;详情包含分段和每日证据。
|
||||
- `GET /v1/assessment-batches/{id}/bonus-ledger`:当月、结转、历史补发、累计补发及剔除依据。
|
||||
- `POST /v1/assessment-batches/{id}/submit`、`/approve`、`/lock`:核算员提交、复核人审批、财务锁定。未解决异常禁止提交;输入变更后重建批次,锁定结果不可直接改写。
|
||||
|
||||
待对接系统提供:租赁区间接口、车辆唯一键、人员及归属变更接口、每日纯氢/仪表/GPS 接口、分页与增量游标、鉴权方法和限流规则。供应商密钥放服务端,不存前端。补数、重复记录、换牌、跨月交还车和跨月规则变更应有回归样本。
|
||||
|
||||
## 验收重点
|
||||
|
||||
真实零与空值区分;同日多源仅补缺;交还车及负责人切换不重不漏;测试日判定与所取来源可追溯;单条金额舍入后再汇总;历史奖励不被新政策追溯修改;异常阻止正式导出;同输入可复算;快照不可变。
|
||||
@@ -0,0 +1,89 @@
|
||||
# 项目背景与时间机器备份核对
|
||||
|
||||
核对日期:2026-09-10。本文件记录本次读取备份、历史项目记忆和工作簿得到的事实,供后续继续核算时定位背景。
|
||||
|
||||
## 备份来源与迁移状态
|
||||
|
||||
- 本项目原工作目录为 `/Users/kkfluous/Downloads`,电脑重置后迁至当前仓库。
|
||||
- 8 月最新 Time Machine 存档为 `2026-08-25-132718.backup`。
|
||||
- 本次实际读取的原用户目录为:
|
||||
|
||||
```text
|
||||
/Volumes/.timemachine/4F163928-1D0C-4E0E-B0DF-C3A7ECC330AF/2026-08-25-132718.backup/2026-08-25-132718.backup/Macintosh HD - Data/Users/kkfluous
|
||||
```
|
||||
|
||||
- 本次核对时,当前仓库全部 144 个 Git 已跟踪文件,都能在备份 `Downloads` 的相同相对路径下找到,SHA-256 全部一致。
|
||||
- 这证明迁移后的这些文件与存档一致,不代表全部原始输入都已迁入仓库。
|
||||
- 本次未覆盖代码、工作簿或全局记忆,未运行核算或数据库查询。
|
||||
|
||||
## 项目用途与架构
|
||||
|
||||
车辆租赁考核源表经里程修正后,按销售经理计算当月、结转、历史补发和累计补发奖金,输出可追溯的 Excel 对账文件。
|
||||
|
||||
- `calc_engine.py`:规则、源表读取、按车牌和销售分组、跨月状态及奖金计算。
|
||||
- `excel_writer.py`:明细、计算过程、车辆追踪、发放记录、汇总和个人对账页。
|
||||
- `main.py`:读取 1—7 月源数据,逐月重算历史,目前仅输出 7 月核算。
|
||||
- 多源里程脚本:汇总纯氢、TBOX、GPS 数据,识别测试日,再将确认后的核算里程回填源表。
|
||||
- 干预说明、离职明细和历史方案测算由独立脚本补充。
|
||||
|
||||
## 最新已核实的 7 月结果
|
||||
|
||||
截至本次找到的历史记忆,最新完成的是 2026-08-17 多源考核里程重算,目录为 `7月绩效重算_多源考核里程_20260817/`。
|
||||
|
||||
| 项目 | 旧版 `7月核算结果/` | 8 月 17 日重算版 |
|
||||
| --- | ---: | ---: |
|
||||
| 考核源表记录数 | 396 | 396 |
|
||||
| 达标记录数 | 161 | 129 |
|
||||
| 最终发放金额 | 74,864.62 元 | 62,616.73 元 |
|
||||
|
||||
减少 12,247.89 元,约 16.36%。记录数是考核区间记录数,不能直接称为车辆数。
|
||||
|
||||
本次只读核对位置:
|
||||
|
||||
- 旧版核算文件 `7月汇总!C83`(考核应发合计)、`B124`(最终发放)均为 74,864.62。
|
||||
- 新版核算文件 `7月汇总!C78`(考核应发合计)、`B119`(最终发放)均为 62,616.73。
|
||||
- 备份 `Downloads/7月考核车辆多源里程汇总_用户确认版.xlsx` 的 `7月考核车辆里程汇总` 页,有 396 条记录和 396 个唯一的车牌+开始日期+结束日期键。
|
||||
- 上述确认版与当前新版源表全部 396 条匹配,`核算里程(km)` 与 `实际行驶里程(km)` 全部一致(比较容差 0.005 km)。
|
||||
|
||||
这是文件与历史记录核对,尚未重新运行奖金引擎,亦未独立审计每条奖金。
|
||||
|
||||
## 规则演变与现行代码口径
|
||||
|
||||
1. 每条记录独立达标,奖金按考核天数折算;累计与结转按车牌+销售经理核算,换销售后分别计算。
|
||||
2. 结转占用当月奖励名额;累计整体达标后补发历史未发月份。
|
||||
3. Claude 早期六月流程曾记录 18T 的达标 800、未达标 300、结转 800、补发 500 方案。后续用户明确改为达标 1000、未达标 0、结转整月 1000、补发 1000 按天折算;当前引擎与后续记忆一致。旧方案仍保留为测算资料。
|
||||
4. 7 月四辆 18T(粤AGR0772、粤AGQ0178、粤AGP6675、粤AGP9757)使用 5000 km、150 元政策,其余 18T 当前仍为 6000 km、1000 元。
|
||||
5. 本次 7 月重算不做亏损拦截。旧 `project_rules.md` 的亏损拦截描述是历史口径,不能直接覆盖当前主流程。
|
||||
6. 离职人员仅当月奖金转给接任销售,其他结转和补发不发;转接主要体现在汇总层,原归属明细保留用于审计。7 月钱婧单独全部不发,不能把六月保留钱婧明细的旧讨论直接套用到七月。
|
||||
7. 普通车辆取考核区间纯氢里程;测试候选车辆逐日比较 TBOX 与 GPS,差值大于 50 km 的日期判为测试日,剔除当日纯氢里程。
|
||||
8. 无纯氢数据时的补充口径是普通车辆取 TBOX,测试候选车辆取 GPS。历史说明强调无纯氢数据的 4.5T 普货场景;当前日规则代码的回退分支没有显式车型限制。未来若改此处,应区分文字场景与实际分支范围。
|
||||
|
||||
## 恢复后可定位的补充输入
|
||||
|
||||
以下均已在上述备份的 Downloads 中确认存在,但本次没有复制到仓库:
|
||||
|
||||
- `7月考核车辆多源里程汇总_用户确认版.xlsx`:已验证与重算源表一致。
|
||||
- `广州新能源平台_纯氢纯电里程_2026年7月_按日.zip`:压缩包存在,本次未展开验证完整性。
|
||||
- `里程统计[天][2026-07-01至2026-07-31].xlsx`。
|
||||
- `智能管车_车辆里程日报-140106360.xlsx`。
|
||||
- `gps里程汇总2026年1-6月 3/`。
|
||||
|
||||
脚本引用的 `车辆里程查询_20260701-20260731_1024辆.xlsx` 和第二份 `里程统计[天][2026-07-01至2026-07-31] (1).xlsx` 未在该存档 Downloads 的预期位置找到。尚未检索其他存档或微信附件目录,不能据此判断文件已经彻底丢失。
|
||||
|
||||
## 记忆与会话来源索引
|
||||
|
||||
以下路径相对于上面的备份原用户目录:
|
||||
|
||||
- `.claude/projects/-Users-kkfluous-Downloads/memory/`:原始项目架构、规则、输出偏好、关键车辆及六月流程;其中部分条目早于后续规则调整。
|
||||
- `.codex/memories/MEMORY.md`:车辆绩效核算相关任务组,包含新版结果、历史去重、离职处理和用户偏好。
|
||||
- `.codex/memories/rollout_summaries/2026-07-16T08-28-44-2IEz-july_performance_recalculation_person_level_difference.md`:更新时间为 2026-08-17,记录此次重算和逐人差额。文件名中的 7 月日期不是最终更新时间。
|
||||
- `.codex/memories/rollout_summaries/2026-07-16T08-28-43-155y-june_18t_recalc_gps_pipeline_refresh.md`:记录改回 1000/0 方案,以及仅当月转接的用户明确要求。
|
||||
- `.codex/sessions/2026/07/16/rollout-2026-07-16T16-28-44-019f6a0a-dae0-79e3-a775-3bfe1288bdc3.jsonl`:本次读取了末段用户消息,确认纯氢考核、无纯氢回退、按确认表重算及逐人对比的请求。
|
||||
|
||||
## 后续工作的注意事项
|
||||
|
||||
- 默认入口仍指向旧 `7月核算结果/`;要复现新版必须选择新版源表及独立输出目录,不能仅直接运行默认入口。
|
||||
- 原路径 `/Users/kkfluous/Downloads` 需要做可移植配置后才能在当前环境运行。
|
||||
- 每次更新里程后应同步生成相关派生文件,避免核算表、干预说明与离职明细混用版本。
|
||||
- 汇报重算变化应列出每位销售原金额、新金额和差额,并核对差额合计;车辆计数用“辆”,考核记录用“条”。
|
||||
- 本次没有修复上一轮代码阅读发现的潜在问题,例如 12 期上限是否在引擎中实际限制;这些仍需专项验证。
|
||||
Reference in New Issue
Block a user