fix: some
Some checks failed
构建并部署前端到测试环境 / build-and-deploy (push) Failing after 28m40s

This commit is contained in:
luo
2026-09-18 18:11:53 +08:00
parent 5e7f5eaba4
commit 08889d2e42
55 changed files with 2888 additions and 414 deletions

View File

@@ -0,0 +1,41 @@
## Context
- 核销申请弹窗 `ApplicationFormDialog.vue` 同时服务于两处入口:账单列表页传 `presetBill`(含 `debtor_snapshot`),申请列表页传 `application``EmployeeCollectionApplication` 不含 `debtor_snapshot`)。
- 收款方式接口 `GET /api/admin/employee-collection-payment-methods` 支持 `keyword/page/page_size/enabled`;账单接口支持 `source_type/source_no/status/customer_id/created_from/created_to``page/page_size`
- 「我的佣金」三页签为同一文件 `my-commission/index.vue`,接口均以 `shop_id` 作路径参数;超管账号无 `shop_id`,现有逻辑直接提示「未关联店铺」并 return。
## Goals / Non-Goals
- Goals弹窗数据可筛选、可分页、交互体验一致代办原因语义准确超管可查看任意店铺的佣金数据。
- Non-Goals不改动后端接口契约仅使用现有查询参数不重构账单列表页与申请列表页。
## Decisions
### 抽屉替代对话框
使用 `ElDrawer``direction="rtl"`,宽度适配表单内容),保留原有表单校验、`destroy-on-close` 语义与底部操作按钮;关闭时沿用既有重置逻辑。
### 收款方式远程搜索
改为 `ElSelect` + `filterable` + `remote`,请求 `getPaymentMethods({ page: 1, page_size: 20, keyword, enabled: true })`;输入经防抖后请求,并以请求序号丢弃过期响应,避免竞态。编辑场景需缓存已选项,保证不在首屏结果内时仍能回显名称。
### 核销账单候选筛选与分页
沿用 `EmployeeCollectionBillQueryParams`,默认 `page_size=20`;新增与账单列表页一致的筛选表单,「店铺」映射 `customer_id` 并用 `ShopService.getShops` 远程搜索。已选账单与核销金额使用独立于当前页的集合维护,翻页/筛选不清空,核销合计覆盖所有已选账单。
### 代办原因判定
`isActing` 改为「当前账号 `user_type === 1` 且存在非本人负责的所选账单」。责任员工取所选账单 `debtor_snapshot.account_id`,缺失时回退 `debtor_account_id`;未选择账单或无法取得责任员工信息时,超管视为代办并要求填写。
### 我的佣金全局店铺选择
页面顶部新增 `ElSelect`,仅 `userStore.info.user_type === 1` 时展示,选项经 `ShopService.getShops` 远程搜索。`currentShopId = isSuperAdmin ? selectedShopId : userStore.info?.shop_id`;切换店铺时重置分页并刷新概览与当前页签。超管未选择时展示选择提示,而非阻断。
## Risks / Trade-offs
- 账单候选分页后,用户可能因筛选条件过窄而看不到目标账单;通过保留筛选条件与已选集合降低影响。
- 代办判定依赖 `debtor_snapshot` / `debtor_account_id` 数据完整性;数据缺失时按「代办必填」处理,偏保守但符合合规要求。
## Migration
- 无数据迁移。行为变化:超管本人办理核销申请不再要求填写代办原因。
## Open Questions
- 账单接口是否支持按 `shop_id` 过滤;现有类型仅有 `customer_id`,若后续新增需同步 `EmployeeCollectionBillQueryParams`
- 超管在「提现资料」页签提交/替换资格时,是否应使用所选店铺 `shop_id`(预期为是)。

View File

@@ -0,0 +1,23 @@
# Change: 核销申请弹窗体验优化与超管按店铺查看我的佣金
## Why
创建/修改核销申请弹窗的收款方式与核销账单候选各一次性拉取 100 条且无筛选,数据量大时难以定位;弹窗为居中对话框,账单筛选与表单内容在长列表中体验不佳;代办原因仅以「是否超管」判定,超管为本人办理时仍被强制填写,与「本人办理无需代办原因」的业务语义不符。
同时「我的佣金」页面所有接口均以当前账号 `shop_id` 作为路径参数,超级管理员账号没有 `shop_id`,进入页面即被提示「未关联店铺」且无法查看任何数据。
## What Changes
- 核销申请弹窗由居中 `ElDialog` 调整为右侧滑出抽屉。
- 收款方式改为远程搜索下拉:按 `keyword` 搜索,默认拉取 20 条(不再固定 100 条),仅展示启用项。
- 核销账单候选列表:默认按 20 条分页加载(不再固定 100 条),新增按来源、来源单号、核销状态、店铺、起止时间的筛选表单,筛选变化后回到第 1 页,翻页保持已选账单。
- 代办原因(`acting_reason`)判定改为「超级管理员且所选账单责任员工非本人」:当所选账单的 `debtor_snapshot.account_id` 不等于当前登录账号 `id`(或未选择账单 / 无责任员工信息)时展示且必填;所选账单全部归属于当前登录账号时不展示、不提交该字段。**BREAKING**:超管本人办理不再强制填写代办原因。
- 「我的佣金」页面顶部为超级管理员新增全局店铺下拉(远程搜索店铺),选中店铺后三个页签(佣金明细 / 提现记录 / 提现资料)均以所选 `shop_id` 调用接口;非超级管理员不展示该下拉,继续使用自身 `shop_id`
## Impact
- Affected specs: `employee-collection``commission-management`
- Affected code:
- `src/views/finance/employee-collection/applications/components/ApplicationFormDialog.vue`
- `src/views/commission-management/my-commission/index.vue`
- `src/types/api/employeeCollection.ts`(如需补充账单候选查询字段类型)

View File

@@ -0,0 +1,28 @@
## ADDED Requirements
### Requirement: 超级管理员按店铺查看我的佣金
「我的佣金」页面 MUST 为超级管理员(`user_type``1`,其账号无 `shop_id`)在页面顶部提供全局店铺选择下拉,选项 MUST 通过店铺列表接口远程搜索获取。选中店铺后,佣金概览与三个页签(佣金明细、提现记录、提现资料)的接口 MUST 使用所选 `shop_id`;切换店铺 MUST 刷新概览与当前页签数据。非超级管理员 MUST NOT 展示该下拉,且 MUST 继续使用当前账号自身的 `shop_id`。超级管理员未选择店铺时,页面 MUST 展示选择店铺的提示MUST NOT 以「未关联店铺」为由阻止其使用。
#### Scenario: 超管选择店铺后查看数据
- **GIVEN** 超级管理员进入「我的佣金」页面
- **WHEN** 其通过顶部下拉远程搜索并选择一个店铺
- **THEN** 佣金概览与当前页签 MUST 以所选 `shop_id` 调用接口
- **AND** 切换到其他页签 MUST 继续使用同一 `shop_id`
#### Scenario: 超管未选择店铺
- **GIVEN** 超级管理员进入「我的佣金」页面且尚未选择店铺
- **WHEN** 页面初始化
- **THEN** 页面 MUST 提示先选择店铺
- **AND** MUST NOT 展示「未关联店铺」的阻断提示
#### Scenario: 非超管不展示店铺下拉
- **GIVEN** 当前登录账号不是超级管理员
- **WHEN** 其进入「我的佣金」页面
- **THEN** 页面 MUST NOT 展示店铺下拉
- **AND** MUST 使用自身 `shop_id` 加载数据
#### Scenario: 切换店铺刷新数据
- **GIVEN** 超级管理员已选择店铺并加载数据
- **WHEN** 其切换为另一个店铺
- **THEN** 前端 MUST 重新加载佣金概览与当前页签列表
- **AND** 分页 MUST 重置到第 1 页

View File

@@ -0,0 +1,64 @@
## ADDED Requirements
### Requirement: 核销申请弹窗抽屉与收款方式远程搜索
创建/修改核销申请弹窗 MUST 以从右侧滑出的抽屉形式呈现,并 MUST 保留表单校验、关闭时重置与底部提交/取消操作。收款方式 MUST 改为远程搜索下拉:请求 MUST 携带 `keyword``page_size``20``enabled``true`,仅展示启用项;输入关键字 MUST 经防抖后发起请求,并发时 MUST 丢弃过期响应。编辑已提交申请时MUST 能回显并保留当前已选收款方式,即使其不在当前搜索结果内。
#### Scenario: 打开弹窗
- **GIVEN** 用户点击创建或修改核销申请
- **WHEN** 弹窗打开
- **THEN** 弹窗 MUST 从右侧滑出
- **AND** MUST 保留表单字段、校验与底部操作
#### Scenario: 收款方式远程搜索
- **GIVEN** 用户打开收款方式下拉
- **WHEN** 输入关键字
- **THEN** 前端 MUST 以防抖方式调用收款方式接口,携带 `keyword``page_size=20``enabled=true`
- **AND** 仅展示接口返回的启用项
- **AND** 过期请求的响应 MUST NOT 覆盖最新结果
#### Scenario: 编辑场景回显已选收款方式
- **GIVEN** 正在修改的申请已选择某收款方式且其不在首屏搜索结果中
- **WHEN** 弹窗初始化
- **THEN** 下拉 MUST 回显该收款方式名称
- **AND** MUST NOT 因搜索而清空已选值
### Requirement: 核销账单候选筛选与分页
核销申请弹窗的核销账单候选列表 MUST 默认以 `page_size``20` 加载MUST NOT 固定请求 100 条。候选列表 MUST 支持按来源(`source_type`)、来源单号(`source_no`)、核销状态(`status`)、店铺(`customer_id`)与创建时间(`created_from` / `created_to`)筛选,店铺筛选 MUST 使用远程搜索。筛选条件变化 MUST 回到第 1 页重新加载。翻页 MUST NOT 清空已选账单与已填核销金额;当前页之外已选账单 MUST 仍计入核销合计并随申请提交。
#### Scenario: 默认分页加载
- **GIVEN** 用户打开核销申请弹窗
- **WHEN** 账单候选列表加载
- **THEN** 请求 MUST 使用 `page_size=20`
- **AND** MUST 提供分页或加载更多入口以访问后续数据
#### Scenario: 按条件筛选账单
- **GIVEN** 用户已打开核销申请弹窗
- **WHEN** 其填写来源、来源单号、核销状态、店铺或起止时间中的任意条件
- **THEN** 前端 MUST 以对应查询参数从第 1 页重新加载候选账单
- **AND** 店铺 MUST 通过远程搜索选择
#### Scenario: 翻页保持已选
- **GIVEN** 用户已在当前页勾选账单并填写核销金额
- **WHEN** 其翻页后返回或直接提交
- **THEN** 已勾选账单与核销金额 MUST 保持不变
- **AND** 核销合计 MUST 包含所有页已选账单
### Requirement: 代办原因按所选账单责任员工判定
核销申请的 `acting_reason` MUST 仅在「当前登录账号为超级管理员(`user_type``1`)且存在非本人负责的所选账单」时展示并必填。责任员工 MUST 取自账单 `debtor_snapshot.account_id`,缺失时回退 `debtor_account_id`。当所选账单全部归属于当前登录账号时,前端 MUST NOT 展示且 MUST NOT 提交 `acting_reason`;当尚未选择任何账单或无法取得责任员工信息时,超级管理员 MUST 视为代办并要求填写。
#### Scenario: 超管为他人代办需填原因
- **GIVEN** 当前登录账号为超级管理员
- **WHEN** 其选择责任员工 `account_id` 不等于当前账号 `id` 的账单
- **THEN** 代办原因字段 MUST 展示且必填
- **AND** 未填写即提交 MUST 被阻止
#### Scenario: 超管本人办理无需原因
- **GIVEN** 当前登录账号为超级管理员且所选账单全部由其本人负责
- **WHEN** 其提交核销申请
- **THEN** 代办原因字段 MUST NOT 展示
- **AND** 提交载荷 MUST NOT 包含 `acting_reason`
#### Scenario: 非超管不判定代办
- **GIVEN** 当前登录账号不是超级管理员
- **WHEN** 其创建或重新提交核销申请
- **THEN** 代办原因字段 MUST NOT 展示

View File

@@ -0,0 +1,23 @@
## 1. 核销申请弹窗
- [x] 1.1 弹窗由 `ElDialog` 改为右侧 `ElDrawer`,保留表单校验、关闭重置与底部提交/取消操作
- [x] 1.2 收款方式改为远程搜索下拉:携带 `keyword``page_size=20``enabled=true`,防抖并发且丢弃过期响应
- [x] 1.3 核销账单候选默认按 20 条分页加载,新增来源 / 来源单号 / 核销状态 / 店铺 / 起止时间筛选表单
- [x] 1.4 店铺筛选使用远程搜索(复用账单列表页 `customer_id` + `ShopService.getShops` 范式)
- [x] 1.5 筛选条件变化回到第 1 页;翻页保持已选账单与已填核销金额
- [x] 1.6 代办原因按所选账单责任员工判定(超管且非本人时展示并必填,本人办理不展示不提交)
## 2. 我的佣金
- [x] 2.1 页面顶部新增超管可见的全局店铺下拉(远程搜索,复用 `ShopService.getShops`
- [x] 2.2 `currentShopId` 改为超管取所选店铺、非超管取自身 `shop_id`
- [x] 2.3 超管未选择店铺时展示选择提示,不再以「未关联店铺」阻断
- [x] 2.4 三个页签(佣金明细 / 提现记录 / 提现资料)与概览均使用所选 `shop_id`
- [x] 2.5 切换店铺时重置分页并刷新概览与当前页签数据
## 3. 验证
- [x] 3.1 改动文件 `npx eslint` 通过(必要时 `--fix`
- [x] 3.2 `npx vue-tsc --noEmit` 通过
- [x] 3.3 `npx vite build --mode production` 通过
- [x] 3.4 `npx openspec validate update-writeoff-application-and-superadmin-commission --strict` 通过