diff --git a/backend/app.pid b/backend/app.pid index 957b27947..b8d440ca0 100644 --- a/backend/app.pid +++ b/backend/app.pid @@ -1 +1 @@ -27977 +31370 diff --git a/backend/app/api/crm.py b/backend/app/api/crm.py index bb04a4e10..5ce732b9f 100644 --- a/backend/app/api/crm.py +++ b/backend/app/api/crm.py @@ -53,6 +53,7 @@ from app.crud.crm.product import ( from app.schemas.crm.product import ( CategoryDeleteBody, ProductCategoryCreateBody, + ProductCategoryTreeBody, ProductCategoryUpdateBody, ProductCreateBody, ProductDeleteBody, @@ -325,23 +326,20 @@ router = APIRouter(prefix="/web/crm", tags=["CRM管理"]) @router.post("/product-categories/tree") def category_tree( - body: dict = None, + body: ProductCategoryTreeBody = None, _user: dict = Depends(require_admin_or_super_admin), db: Session = Depends(get_db), ): - """获取产品分类树""" + """获取产品分类树(名称/状态由服务端过滤)""" try: tenant_no = get_tenant_no(db, _user) user_info = crm_user_info(_user) - user_info = crm_user_info(_user) - payload = body or {} - category_name = payload.get("categoryName") or payload.get("category_name") - status = payload.get("status") + q = body or ProductCategoryTreeBody() rows = list_category_tree( db, tenant_no, - category_name=category_name, - status=status, + category_name=q.category_name, + status=q.status, user_info=user_info, ) return success_response(rows) diff --git a/backend/app/schemas/crm/product.py b/backend/app/schemas/crm/product.py index ed8be4d94..0c8c0a385 100644 --- a/backend/app/schemas/crm/product.py +++ b/backend/app/schemas/crm/product.py @@ -44,6 +44,15 @@ class CategoryDeleteBody(BaseModel): id: str = Field(..., description="分类ID") +class ProductCategoryTreeBody(BaseModel): + """产品分类树查询(密文解密后须用 Pydantic 绑定,裸 dict=None 在部分链路下会丢 body)""" + + model_config = ConfigDict(populate_by_name=True) + + category_name: Optional[str] = Field(default=None, alias="categoryName", description="分类名称(模糊)") + status: Optional[str] = Field(default=None, description="状态") + + class ProductUpdateStatusBody(BaseModel): """产品批量上下架请求体""" diff --git a/docs/miniprogram-dev-checklist.md b/docs/miniprogram-dev-checklist.md index da70ad018..24dd47c44 100644 --- a/docs/miniprogram-dev-checklist.md +++ b/docs/miniprogram-dev-checklist.md @@ -221,8 +221,22 @@ Tab:首页(占位) | 待办(占位) | 工作台★ | 我的 | S9 | 运输 | 运费结算 + 用户选项 | 列表/选人接口正常 | [x] freight 列表 + users/options ok;无待结算 | | S10 | 运输 | 运费待审批列表 | 列表正常 | [x] 列表空态 ok | -**接口冒烟结论**:S1–S10 **读路径全部通**(0 FAIL)。写路径有 3 处需跟进:① 线索跟进字段;② 报销创建体应用 `details` 而非 `items`;③ 安排运输依赖证书齐备业务数据。 -**前端 UI**:仍由人工在微信开发者工具/真机验收。 +**接口冒烟结论**:S1–S10 **读路径全部通**(0 FAIL)。写路径有 3 处需跟进:① 线索跟进字段;② 报销创建体应用 `details` 而非 `items`;③ 安排运输依赖证书齐备业务数据。 + +### 7.2 H5 UI 冒烟(Playwright,不改 uni-app 工程) + +> **执行**:2026-07-17,H5 `http://localhost:5173/`,账号 `admin` / `admin123`,后端 `127.0.0.1:8000`。 +> 脚本:独立目录 `miniprogram-e2e/smoke.mjs`(`cd miniprogram-e2e && node smoke.mjs`);截图与 JSON 在 `miniprogram-e2e/artifacts/`。 + +| # | 路径 | 结果 | +|---|------|------| +| E1 | 登录 → 工作台四模块可见 | [x] PASS | +| E2 | 线索管理 | [x] PASS | +| E3 | 报销申请 | [x] PASS | +| E4 | 地磅仪表盘 | [x] PASS | +| E5 | 运输计划 | [x] PASS | + +**UI 冒烟结论**:E1–E5 **全通**(0 FAIL)。微信开发者工具 / 真机验收仍见 §7 未勾项。 --- @@ -248,6 +262,8 @@ Tab:首页(占位) | 待办(占位) | 工作台★ | 我的 | 2026-07-16 | P1–P4 | CRM / 报销 / 地磅 / 运输业务页落地并接线工作台 | | 2026-07-16 | P4+ | 运费提交审批改为用户选项选人 Sheet;P5 冒烟表写入 §7.1 | | 2026-07-17 | P5 | 接口冒烟 S1–S10 读路径全通(脚本 `mp_api_smoke.py`);写路径 3 处待对齐见 §7.1 | +| 2026-07-17 | P5 | H5 Playwright E1–E5 冒烟全通(`miniprogram-e2e/smoke.mjs`,见 §7.2) | +| 2026-07-17 | P5 | 按 QA 节奏启动:先全量文字用例(`miniprogram-e2e/cases/`),脚本验证待用例评审后逐步开展 | + + + + + 操作分类 + {{ moreTarget?.categoryName || '' }} + + + + 编 + + 编辑 + 修改名称、上级、状态等 + + › + + + 子 + + 新增子分类 + 在此分类下创建下级 + + › + + + 删 + + 删除 + 有子分类或关联产品时不可删 + + › + + + 取消 + + + + + + diff --git a/miniprogram/pages/crm/quote/list.vue b/miniprogram/pages/crm/quote/list.vue index 496d4aaa1..6ec6a03f3 100644 --- a/miniprogram/pages/crm/quote/list.vue +++ b/miniprogram/pages/crm/quote/list.vue @@ -105,10 +105,7 @@ onReachBottom(() => loadList(false)) - - - 暂无报价 - + diff --git a/miniprogram/pages/db/inventory/list.vue b/miniprogram/pages/db/inventory/list.vue index 592c46168..b21f26316 100644 --- a/miniprogram/pages/db/inventory/list.vue +++ b/miniprogram/pages/db/inventory/list.vue @@ -107,10 +107,7 @@ onShow(() => load()) - - - 暂无出入库单 - + diff --git a/miniprogram/pages/db/plans/detail.vue b/miniprogram/pages/db/plans/detail.vue index ec872fea3..44f9ac153 100644 --- a/miniprogram/pages/db/plans/detail.vue +++ b/miniprogram/pages/db/plans/detail.vue @@ -100,9 +100,7 @@ onShow(() => load()) 关联出入库({{ related.inventories?.length || 0 }}) - - 暂无出入库单 - + load()) 关联地磅单({{ related.weighings?.length || 0 }}) - - 暂无地磅单 - + load()) - - - 暂无计划 - + diff --git a/miniprogram/pages/db/weighing/list.vue b/miniprogram/pages/db/weighing/list.vue index b2e144681..d8a0ceabb 100644 --- a/miniprogram/pages/db/weighing/list.vue +++ b/miniprogram/pages/db/weighing/list.vue @@ -137,10 +137,7 @@ onShow(() => load()) - - - 暂无地磅单 - + diff --git a/miniprogram/pages/pl/archive/list.vue b/miniprogram/pages/pl/archive/list.vue index d13fd13b8..79ae830ba 100644 --- a/miniprogram/pages/pl/archive/list.vue +++ b/miniprogram/pages/pl/archive/list.vue @@ -81,10 +81,7 @@ onShow(() => load(true)) - - - 暂无已归档计划 - + diff --git a/miniprogram/pages/pl/cert/detail.vue b/miniprogram/pages/pl/cert/detail.vue index d5f3a4c1c..fbb3fe849 100644 --- a/miniprogram/pages/pl/cert/detail.vue +++ b/miniprogram/pages/pl/cert/detail.vue @@ -114,9 +114,7 @@ onShow(() => load()) 产品购买证 - - 暂无产品明细 - + {{ dash(p.productName) }} diff --git a/miniprogram/pages/pl/cert/list.vue b/miniprogram/pages/pl/cert/list.vue index b3fabf6c8..9133b21bd 100644 --- a/miniprogram/pages/pl/cert/list.vue +++ b/miniprogram/pages/pl/cert/list.vue @@ -118,10 +118,7 @@ onShow(() => load(true)) - - - 暂无计划 - + diff --git a/miniprogram/pages/pl/freight/approval.vue b/miniprogram/pages/pl/freight/approval.vue index d347a7dbb..ec6d9be13 100644 --- a/miniprogram/pages/pl/freight/approval.vue +++ b/miniprogram/pages/pl/freight/approval.vue @@ -106,10 +106,7 @@ onShow(() => load(true)) - - - 暂无审批单据 - + diff --git a/miniprogram/pages/pl/freight/list.vue b/miniprogram/pages/pl/freight/list.vue index 339d91d98..6be467245 100644 --- a/miniprogram/pages/pl/freight/list.vue +++ b/miniprogram/pages/pl/freight/list.vue @@ -173,10 +173,10 @@ onShow(() => load(true)) - - - {{ activeTab === 'unsettled' ? '暂无待结算计划' : '暂无结算单' }} - +