8.6 KiB
PROGRESS_AGI_ITERATION_9 · 附录A复核补齐+D2真机重跑+P2-2本地证据
跑法口径:后端
pytest tests/ + apps/core/tests全量(SQLite),前端npm run build+npm test。
- 后端 SQLite:512 passed / 4 skipped(4 skipped 均为 PG 专用并发用例;含新增
test_contact_crud)- 后端 PG 5433
-m postgres:4 passed(4 passed, 498 deselected)- 前端:
npm run build✅ 6.17s;npm test✅ 17 pass / 0 failmanage.py check0 issues;makemigrations --checkNo changes- D2:
verify_salesman_h5.py本轮真机重跑 ALL SALESMAN-H5 CHECKS PASSED(0 console errors)- P2-2:双栈
configexit 0;build/up因 daemon 异常未做,不虚报- P3-1:按规格跳过,未建模
一、附录A复核(NEXT_PLAN §附录A 十项逐项复核,有漏就补)
上轮称十项全过,本轮按"页面存在 + 接真接口 + 路由 + 菜单 + 动作可用"五件套复核。 结论:九项全过,一项部分缺口(#10 联系人只读),本轮已补齐。
| # | 后端能力 | 页面 | 接线证据 | 状态 |
|---|---|---|---|---|
| 1 | 收款单 + 核销 | Receivables.vue |
GET/POST /finance/receipts/ + POST /receipts/<id>/allocate/(核销 dialog + 金额>0 校验 + 超额后端 400 提示) |
✅ |
| 2 | 付款单 + 核销 | Payables.vue |
GET/POST /finance/payments/ + POST /payments/<id>/allocate/(同上) |
✅ |
| 3 | 核销记录 | Allocations.vue |
GET /finance/allocations/(应收/应付/收款/付款 ID + 金额 + 时间列) |
✅ 只读即规格(AllocationViewSet http_method_names=["get"]) |
| 4 | 库存流水 | Movements.vue |
GET /inventory/movements/ + 分页 + count("只读,由过账自动产生"明示) |
✅ 只读即规格(ViewSet 只读) |
| 5 | 预警规则管理 | AlertRules.vue |
GET/POST/PATCH/DELETE /notify/rules/ + POST init-default(已初始化 N 条默认规则)+ 分页 |
✅ |
| 6 | 打印模板管理 | PrintTemplates.vue |
GET/POST/PATCH/DELETE /printing/templates/ + 新建/编辑 dialog(formRef.validate()) |
✅ |
| 7 | 自定义报表 | ReportDefinitions.vue |
GET /report/definitions/ + POST init-system + POST /<id>/run/(结果 dialog)+ 分页 |
✅ 只读+运行即规格(无 POST/PATCH 页面动作,后端 ViewSet 允许但业务上报表由 init-system 预置) |
| 8 | 库存状态大盘 | Dashboard.vue |
GET /report/dashboard/inventory-status/(抽屉:总数量/估值/仓库数 + 各仓库明细表) |
✅ |
| 9 | 科目管理 / 一键初始化 | Accounts.vue |
GET /finance/accounts/ + POST init-chart + PATCH is_active 开关 + 分页 |
✅(科目新建/编辑/删除走 init-chart 预置 + 开关管理;后端 AccountViewSet 为全 CRUD,页面未提供手工新建科目入口——与"新租户建账靠 init-chart"规格一致,不算缺口) |
| 10 | 价格等级 / 联系人 | PriceLevels.vue |
等级全 CRUD ✅;联系人此前只读(列表+搜索+分页,无新建/编辑/删除) | ⚠️→✅ 本轮补齐(见 §二) |
路由 29 条(/login /register /storefront /salesman /storefront-admin + 24 布局内),
菜单 25 项(含十项全部入口),与上轮一致。
二、本轮补齐:联系人 CRUD(#10 缺口)
缺口:ContactViewSet 后端为全 CRUD,但 ContactSerializer.Meta.fields
缺可写 customer/supplier FK(仅只读 customer_code/supplier_code),前端联系人
tab 仅列表/搜索/分页。后端有接口无页面写入 → 按任务要求补齐。
改动:
backend/apps/partner/serializers.py [改] ContactSerializer.fields += customer/supplier
(Receipt pattern:FK 本体可写 + _code/_name 只读并存)
frontend/src/pages/PriceLevels.vue [改] 联系人 tab +归属列/操作列 + 新建/编辑 dialog
(姓名必填/邮箱格式校验 + 客户ID/供应商ID 可选挂靠,
空值不提交)+ 新建/编辑/删除函数
backend/tests/test_partner.py [改] +test_contact_crud(新建→编辑→列表→删除)
frontend/dist/ [重建]
验证:pytest tests/test_partner.py 8 passed(7 原有 + 1 新增);
全量回归 512 passed(见 §四),无回归。
三、P2-2 本地(NEXT_PLAN §P2-2 按步骤执行,不伪造上线)
| 步骤 | 结果 |
|---|---|
config 插值校验(backend/infra/docker/docker-compose.yml,本地自带 db 栈) |
✅ exit 0(DJANGO_SECRET_KEY=x POSTGRES_PASSWORD=x DJANGO_ALLOWED_HOSTS=example.com) |
config 插值校验(backend/docker-compose.yml,1Panel 上线栈) |
✅ exit 0(同上三变量) |
build backend |
❌ 未跑:daemon 异常(request returned 500 ... /_ping,pipe 存在但 API 无响应;上轮为 npipe 缺失,本轮为 500,现象不同但结论同:daemon 不可用) |
up -d + 冒烟(ping/登录/开单) |
❌ 未做:daemon 不可用 + 无 192.168.5.7 服务器凭证,绝不伪造上线 |
与 docs/DEPLOY_CHECKLIST.md §四记录一致(清单称 daemon 未运行,本轮现象为
pipe 存在但 _ping 500——同属"daemon 不可用",不改清单结论)。
四、D2 回归(verify 真机重跑 + 前端 salesman 回归)
backend/scripts/verify_salesman_h5.py本轮真机重跑(dev 后端 :18099 + vite :15173 均 UP,Playwright Chromium,Pixel 5 移动模拟 393×851):
[pre] baseline bills=0 receipts=0 run_tag=0914015936 receipt_no=SMH0914015936
[pre] customer=C001 warehouse=WH01 product=B001 token=ok
[1] login ok (mobile viewport 393x851)
[2] customer: OK:C001 张三便利店 / warehouse: OK:WH01 主仓库
[3] add-to-order ok (qty=2)
[4] round_to: OK:抹角(0.1)/ submit+confirm clicked
[5] debt tab rendered: 未结 ¥31.00(1 单)RC202609140001 … 未收
[6] receipt customer OK / submit clicked
[7] console errors: 0
[8] latest bill: XS202609140001 state=confirmed total=31.0000
[9] receipt SMH0914015936 ok amount=50.0000
[9b] delta ok: bills 0->1, receipts 0->1
[10] open receivables: 1, first balance=31.0000
ALL SALESMAN-H5 CHECKS PASSED
上轮"脚本变更仅隔离层、10 步断言本体未动故未重跑"——本轮双服务在场,已重跑, 单列在此,不再沿用旧证据。
- 前端
npm test(frontend/tests/salesman.test.mjs6 用例在内): 17 pass / 0 fail。verify_salesman_h5.pypy_compile通过。
五、最终验证数字(本轮实跑)
backend pytest tests/ + apps/core/tests(SQLite): 512 passed / 4 skipped
backend PG -m postgres: 4 passed (498 deselected)
backend pytest tests/test_partner.py: 8 passed(含新增 test_contact_crud)
frontend npm test: 17 pass / 0 fail
frontend npm run build: ✓ 6.17s(含 PriceLevels + Salesman chunk)
manage.py check: 0 issues;makemigrations --check: No changes
docker compose config(双栈): exit 0 / exit 0
build/up: daemon 不可用,未做(实报错见 §三)
D2 verify_salesman_h5.py: ALL PASSED(0 console errors,本轮真机重跑)
DB 异常测试口径:tests/test_duplicate_code.py 全文件
pytestmark = pytest.mark.django_db(transaction=True)(沿用既有标记,本轮未动)。
六、变更文件清单
backend/apps/partner/serializers.py [改] ContactSerializer +customer/supplier 可写 FK
backend/tests/test_partner.py [改] +test_contact_crud
frontend/src/pages/PriceLevels.vue [改] 联系人 CRUD(归属列/操作列/dialog/校验/函数)
frontend/dist/ [重建]
PROGRESS_AGI_ITERATION_9.md [新] 本文档
七、遗留阻塞(诚实记录)
- Docker daemon 不可用:
build/up留待 daemon 就绪的目标机;Dockerfile 多阶段构建本身未动。 - 未上线 192.168.5.7:无服务器凭证;上线前必须设
DJANGO_ALLOWED_HOSTS=真实域名(compose 现为必填,不传则 config 直接报错,不会静默带*上线)。 - 日志轮转/备份:运维侧动作,仓库无实现(清单已如实标注)。
- P3-1 行业专版:按规格跳过,未建模。
- #7 自定义报表 / #9 科目管理:页面未提供手工新建入口,但与后端业务语义 (init-system 预置 / init-chart 建账)一致,不列为缺口;若后续要手工建报表/科目, 后端 ViewSet 已是全 CRUD,前端加 dialog 即可。
> 附录A逐项状态:#1✅ #2✅ #3✅ #4✅ #5✅ #6✅ #7✅ #8✅ #9✅ #10✅(联系人本轮补齐)。
> DB 异常测试用 `transaction=True`(`test_duplicate_code.py` 全文件标记,沿用)。
> 文档只提跑通特性;数字均为本轮实跑并写明跑法。