6.7 KiB
6.7 KiB
PROGRESS_AGI_ITERATION_7 · D2 业务员 H5 + P2-2 部署清单
跑法口径:后端
pytest全量(tests/+apps/core/tests),前端npm run build+npm test。
- 后端 SQLite:510 passed / 4 skipped(4 skipped 均为 PG 专用并发用例)
- 后端 PG 5433
-m postgres:4 passed- 前端:
npm run build✅ 5.64s;npm test✅ 11 pass / 0 failmanage.py check0 issues;makemigrations --checkNo changes- D2 移动模拟:
backend/scripts/verify_salesman_h5.py全 10 步通过,0 console errors- P2-2:
docker compose configexit 0 +docs/DEPLOY_CHECKLIST.md落地;镜像构建/上线因无凭证未做,不虚报- P3-1:按规格跳过,未建模
一、P2-3 D2 业务员移动开单 H5(PROGRESS_BATCH_D.md:236 + NEXT_PLAN.md §P2-3)
规格原文:复用 Storefront.vue 外壳 + SalesBills 取价/单位/抹零组件,
换业务员角色(外勤开单/查欠款/收款登记),Chrome 移动模拟全流程走通。
交付
- 新建
frontend/src/pages/Salesman.vue(约 550 行,dist/assets/Salesman-*.js16.26 kB):- 外壳:复用 Storefront 的
sf-wrap移动布局(max-width 560px + 480px 断点纵排), 登录用后台用户 JWT(POST /auth/token/,与 PC 同一套账号),公开路由/#/salesman。 - 外勤开单:客户/仓库下拉 + 商品搜索 + 单位下拉 + 数量;
取价走
GET /partner/price-quote/(客户专属价→等级价→上次成交价→默认价, 与 SalesBills 同源,source 标签同文案);单位换算走GET /catalog/products/<id>/units/+utils/transaction.js的unitRate/lineAmount(与 SalesBills 同口径);税率/税额行内显示(价内拆分,与 D4 同公式); 抹零(不抹/抹分/抹角/抹元)+ 应收合计;保存走POST /sales/bills/create-bill/后自动POST /sales/bills/<id>/confirm/(402 超限弹强制过账确认,与 SalesBills 同流程)。 - 查欠款:
GET /finance/receivables/只留 open/partial(前端过滤,BaseTenantViewSet 无精确 customer 过滤器,不伪造后端参数),显示单号/客户/日期/共欠/已收/未结余额 + 状态标签 + 未结合计。 - 收款登记:
POST /finance/receipts/(客户/单号必填/日期/金额>0/方式/备注), 单号必填是实测结论(Receipt.bill_no 无自生成,漏填 400),表单 rules 与Receivables.vue登记 dialog 同约束。
- 外壳:复用 Storefront 的
- 路由:
frontend/src/router/index.js加/salesman+PUBLIC_ROUTES加salesman(P0-3 同类坑:不加则匿名被踢回 login)。
验证(干净库实跑,非残留数据)
backend/scripts/verify_salesman_h5.py(Playwright Chromium,Pixel 5 移动模拟
393×851 + touch + 移动 UA),dev 后端 :18099 + vite :15173(临时 verify 配置代理 /api):
[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: 未结 ¥31.00(1 单)RC202609120001 … 未收
[6] receipt customer OK / submit clicked
[7] console errors: 0
[8] latest bill: XS202609120001 state=confirmed total=31.0000
[9] receipt SMH50002 ok amount=50.0000
[10] open receivables: 1, first balance=31.0000
ALL SALESMAN-H5 CHECKS PASSED
验证后残留(XS202609120001/SMH50002/RC202609120001)已删,default 租户恢复 0 单据。
为验证造的最小数据保留(alice/alice12345 + B001/C001/WH01/1000 库存),属可用 fixture。
踩坑
- 密码框无 placeholder(只有前两个 input 有),用
.sm-login input序号定位。 - 移动视口下
li[role=option](非.el-select-dropdown .el-option)且常判不可见, Playwright click(连 force)会被 visible 挡 → 一律用 JSoffsetParent过滤可见项后.click()。 - 收款 tab 切换用
#tab-receipt/#pane-receipt稳定选择器,不用 role 或 is-active。 - 填单号前先
Escape关残留 popper,否则输入框被浮层挡住无法 fill。
二、P2-2 部署 readiness(NEXT_PLAN.md §P2-2)
docs/DEPLOY_CHECKLIST.md(新建):本地校验表(7 项全 ✅ exit 0/实测值)+ 上线 gate(环境变量/构建/迁移/collectstatic/DEBUG/PG/HTTPS/日志轮转/备份/冒烟)+ 诚实记录(未构建镜像、未上线、无备份脚本,均不虚报)。- 附带真缺口修复:
backend/config/settings/prod.py拒绝DJANGO_ALLOWED_HOSTS含*。 根因:base.py:read_env把 dev.env(DJANGO_ALLOWED_HOSTS=*)写进os.environ, prod 空值门读到*静默通过。验证:不传变量 →ImproperlyConfigured(通配符);=example.com→ check 0 issues。全仓 grepsettings.prod零命中,无测试依赖。 - 本地校验实测:
docker compose configexit 0(插值全展开); prodcheck0 issues;collectstatic216 files;prod 基线 (DEBUG=False / dealerhub INFO / PG pool 2/10/10 / HSTS 30 天+include+preload / Secure Cookie / proxy https / DENY)逐项打印确认。
三、P3-1 跳过声明
按 NEXT_PLAN.md §P3-1 与 PROGRESS_BATCH_D.md:238 定调"按客户驱动,不提前做":
本轮未建 Serial/辅助属性/套装拆件,未动 inventory/catalog 模型,
makemigrations --check No changes 即为预期状态。
四、最终验证数字(本轮实跑)
backend pytest tests/(SQLite): 496 passed / 4 skipped
backend pytest 全量(含 core/tests): 510 passed / 4 skipped
backend PG -m postgres: 4 passed
frontend npm run build: ✓ 5.64s(含 Salesman-*.js 16.26 kB)
frontend npm test: 11 pass / 0 fail
manage.py check: 0 issues;makemigrations --check: No changes
D2 verify_salesman_h5.py: ALL PASSED(0 console errors)
五、变更文件清单
frontend/src/pages/Salesman.vue [新] D2 业务员 H5 三职一页
frontend/src/router/index.js [改] +/salesman 路由 + PUBLIC_ROUTES
backend/scripts/verify_salesman_h5.py [新] D2 移动模拟全流程脚本(10 步断言)
backend/config/settings/prod.py [改] ALLOWED_HOSTS 拒绝通配符 *
docs/DEPLOY_CHECKLIST.md [新] P2-2 readiness gate 清单
frontend/dist/ [重建]
六、遗留
- 镜像构建 + 上线 192.168.5.7:无 Docker 目标机/服务器凭证,停在清单 + 本地校验。
- 日志轮转/备份:运维侧动作,仓库无实现(清单已如实标注)。
- D2 欠款页用前端过滤(open/partial + 按客户),数据量大时应补后端
customer/status精确过滤;当前为 H5 外勤场景可接受范围。