提交
This commit is contained in:
1 parent
80138c6388
commit
693e8a678e
682 files changed
+211375
-5306
No files matched your search
@@ -172,7 +172,7 @@ V1 **不**改详情主接口形状:前端根据 form_data / `relatedInstanceId
|
||||
- **Web**: `display:flex; flex-wrap` 标签流,尽量一行多字段
|
||||
- **移动 / 窄屏**: 每字段一行(`label:value`)
|
||||
|
||||
点击应用名(或行标题)→ 路由至现有实例详情页;权限不足时提示,不白屏。
|
||||
点击应用名(或行标题)→ 打开只读详情弹窗(盖在当前发起/详情等界面之上,不关父弹窗);权限不足时提示,不白屏。细则见 `2026-08-11-oa-related-approval-detail-dialog-design.md`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
# 登录确认弹窗(方案 F)设计
|
||||
|
||||
> 日期:2026-08-10
|
||||
> 适用范围:`mobile-h5` 员工登录页协议门禁确认
|
||||
> 视觉 Demo:`mobile-ui/zkxw-mobile-login-confirm-dialog-demo.html`(**登录采用 F**;A–F 全部保留)
|
||||
> 品牌 Token:对齐 `docs/miniprogram-ui-spec-sanqiang.md` §2(**非** web-admin Fresh Mint)
|
||||
> 关联:`docs/superpowers/specs/2026-08-10-miniprogram-login-ui-design.md`
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与约束
|
||||
|
||||
### 1.1 目标
|
||||
|
||||
1. 用自定义确认弹窗替换登录页 `uni.showModal`,视觉对齐 Demo **F(精简系统风)**。
|
||||
2. 未勾选协议时,账号登录与微信授权登录均先弹出该确认窗。
|
||||
3. `mobile-ui` 中 A–F 六套样例**全部保留**,作为后续其它场景弹窗选型资产;**本次登录仅落地 F**。
|
||||
|
||||
### 1.2 已确认选型
|
||||
|
||||
| 项 | 约定 |
|
||||
|----|------|
|
||||
| 登录确认样式 | **F · 精简系统风** |
|
||||
| 样例资产 | A–F 均保留在 `zkxw-mobile-login-confirm-dialog-demo.html` |
|
||||
| 协议正文链接 | 正文中《用户协议》《隐私政策》为**快捷链接**(品牌绿色),点击跳转对应协议页;登录页勾选行链接保留 |
|
||||
|
||||
### 1.3 硬约束
|
||||
|
||||
| 项 | 约定 |
|
||||
|----|------|
|
||||
| 主色确认按钮字色 | `#0a9f6d` |
|
||||
| 禁止 | 使用 web-admin `#10b981`;不引入 Vant Dialog |
|
||||
| 遮罩 | 半透明深色,**无** `backdrop-filter` 模糊 |
|
||||
| 触达 | 底栏按钮高度建议 ≥ 44px |
|
||||
|
||||
### 1.4 非目标
|
||||
|
||||
- 不实现 A/B/C/D/E 其它样式变体(仅 Demo 保留)
|
||||
- 不改 mock 鉴权、协议页内容、登录表单布局
|
||||
- 本期不做成全局命令式 API(如 `showConfirm()` 挂载到 uni);登录页内组件即可
|
||||
|
||||
---
|
||||
|
||||
## 2. 视觉规格(F)
|
||||
|
||||
权威预览:Demo 卡片 **F**。
|
||||
|
||||
| 元素 | 规格 |
|
||||
|------|------|
|
||||
| 遮罩 | `rgba(15, 30, 24, 0.32)` 全屏;点击关闭(等同取消) |
|
||||
| 卡片 | 居中;白底;圆角 **14px**;轻阴影 |
|
||||
| 标题 | 「请先同意协议」;约 17px;加粗;居中;色 `#1f2a26` |
|
||||
| 正文 | 「登录前需阅读并同意《用户协议》和《隐私政策》。是否同意并继续登录?」;约 13px;色约 `#555` / muted;居中;行高 1.5 |
|
||||
| 协议链接 | 《用户协议》《隐私政策》字色 `#0a9f6d`;可点击;与登录页勾选行一致跳转 `/pages/protocol/index?type=user|privacy` |
|
||||
| 分割线 | 标题区与按钮区之间 `1px` `#e8e8e8` |
|
||||
| 按钮区 | 左右等分;中间竖分割线 |
|
||||
| 取消 | 文案「取消」;字色 `#666`;透明底 |
|
||||
| 确认 | 文案「同意并登录」;字色 `#0a9f6d`;字重 600;透明底 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 交互
|
||||
|
||||
1. 用户未勾选协议且触发「登录」或「微信授权登录」→ 打开确认弹窗(不进入登录流程)。
|
||||
2. 点「同意并登录」→ 将 `agreed` 设为 `true` → 关闭弹窗 → 继续原登录流程。
|
||||
3. 点「取消」或点遮罩 → 关闭弹窗 → `agreed` 不变 → 中止本次登录。
|
||||
4. 已勾选协议时 → **不**弹窗,直接登录。
|
||||
5. 弹窗打开时页面禁止底层滚动穿透(`catchtouchmove` 或等价处理)。
|
||||
6. 点正文中《用户协议》/《隐私政策》→ `navigateTo` 协议页;**不关闭**确认弹窗(返回登录页后弹窗仍在,可继续同意或取消);点击链接须 `@click.stop`,避免误触遮罩关闭。
|
||||
|
||||
---
|
||||
|
||||
## 4. 实现结构
|
||||
|
||||
### 4.1 文件
|
||||
|
||||
| 路径 | 职责 |
|
||||
|------|------|
|
||||
| `mobile-h5/components/ConfirmDialog.vue` | 新建:F 样式确认弹窗(props:`show` / `title` / `content` / 按钮文案;**默认插槽**可自定义正文,用于协议快捷链接;events:`confirm` / `cancel` / `update:show`) |
|
||||
| `mobile-h5/styles/components/confirm-dialog.scss` | 新建:遮罩与卡片样式(Token 与 Demo F 一致) |
|
||||
| `mobile-h5/pages/login/index.vue` | 改:`ensureAgree` 改为控制本地 `agreeDialogVisible`,去掉 `uni.showModal` |
|
||||
| `mobile-h5/App.vue` | 改:引入 `confirm-dialog.scss` |
|
||||
| `mobile-ui/zkxw-mobile-login-confirm-dialog-demo.html` | 改:标注「登录页采用 F」;A–F 均保留 |
|
||||
| `docs/miniprogram-ui-spec-sanqiang.md` | 改(可选短注):确认弹窗 Demo / 登录采用 F 的指向 |
|
||||
|
||||
### 4.2 组件接口(约定)
|
||||
|
||||
```text
|
||||
props:
|
||||
show: Boolean
|
||||
title: String(默认「请先同意协议」)
|
||||
content: String(无插槽时的纯文本兜底)
|
||||
cancelText: String(默认「取消」)
|
||||
confirmText: String(默认「同意并登录」)
|
||||
|
||||
slots:
|
||||
default — 自定义正文(登录页放入带协议链接的文案)
|
||||
|
||||
emits:
|
||||
update:show
|
||||
confirm
|
||||
cancel
|
||||
```
|
||||
|
||||
登录页用 `:show` + `@update:show`(或等价)+ `@confirm` / `@cancel` 驱动 `ensureAgree` 的 Promise;正文用默认插槽渲染协议快捷链接,点击调用既有 `openProtocol(type)`。
|
||||
|
||||
### 4.3 与既有登录 Spec 的关系
|
||||
|
||||
`2026-08-10-miniprogram-login-ui-design.md` §4 曾写未勾选时 Toast;**本规格覆盖该门禁交互**:未勾选时改为 **F 确认弹窗**(与当前代码意图一致,并美化为自定义 F)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 验收
|
||||
|
||||
1. 未勾选协议点「登录」/「微信授权登录」→ 出现 F 样式弹窗(非系统 `showModal`)。
|
||||
2. 「同意并登录」后勾选态为开,并完成对应 mock 登录跳转。
|
||||
3. 「取消」或点遮罩 → 不登录、勾选仍为关。
|
||||
4. 已勾选时直接登录,无弹窗。
|
||||
5. Demo HTML 仍可浏览 A–F;说明中写明登录采用 F。
|
||||
6. 弹窗正文中点击《用户协议》《隐私政策》可进入对应协议页;返回后确认弹窗仍可见。
|
||||
|
||||
---
|
||||
|
||||
## 6. 后续扩展(非本期)
|
||||
|
||||
其它页面若需确认弹窗,优先对照同一 Demo 选型(A–F),再复用或扩展 `ConfirmDialog`;**不**默认改 F 的登录专用文案与布局。
|
||||
@@ -1,7 +1,7 @@
|
||||
# OA 加班套件 · 自动计算时长 + 中国节假日缓存 设计文档
|
||||
|
||||
**日期**: 2026-08-10
|
||||
**状态**: 待实现
|
||||
**状态**: 已实现
|
||||
**范围**: `web-admin` 加班套件运行时时长联动;`backend` 时长重算/校验;全国节假日日历同步与落库
|
||||
**前置**: 既有加班套件(手动时长);请假套件手改联动模式(`oa-leave-kit` / `oa_leave_hours`)
|
||||
**界面模式**: 对齐请假套件发起态交互;视觉 Fresh Mint
|
||||
@@ -128,9 +128,10 @@
|
||||
- 数据源:`CN_HOLIDAY_API_BASE`(默认 `https://holiday.ailcc.com`)。
|
||||
- **不要只用** `/api/holiday/year/{year}`(文档明确**不返回补班**)。
|
||||
- 使用 `GET /api/holiday/batch?d=日期列表&type=Y`,按月拆批(每月 ≤31,低于 50 上限)。
|
||||
- 覆盖:**当年**;若当前月为 12 月则同时拉**下一年**(或始终拉当年+下一年,实现任选其一并在计划中写死)。
|
||||
- 覆盖:**当年 + 下一年**;若某年在库中行数已 ≥ 该年天数(365/366),则**跳过该年**,不再请求 ailcc。
|
||||
- Upsert by `day_date`;失败打日志并**保留旧缓存**。
|
||||
- 超时与有限次重试(如 2 次)在服务层配置。
|
||||
- 若国务院中途调整放假安排需刷新:删除该年数据(或整表)后重启服务/等到下次同步即可重新拉取。
|
||||
|
||||
### 4.3 进程内后台循环(替代 cron)
|
||||
|
||||
|
||||
@@ -0,0 +1,217 @@
|
||||
# OA「关联审批单」选单:三 Tab + 卡片模式修订设计
|
||||
|
||||
**日期**: 2026-08-10
|
||||
**状态**: 已实现(计划见 `docs/superpowers/plans/2026-08-10-oa-related-approval-picker-tabs-card.md`)
|
||||
**方案**: 方案 1 — 扩展现有 `GET /related-candidates`(`tab` + 卡片字段),放宽 `assert_linkable_instance`
|
||||
**界面参考**: 钉钉关联选单卡片;Demo `docs/mockups/oa-related-approval-picker-card-demo.html`(实现时过滤区仅保留关键词)
|
||||
**前置文档**:
|
||||
- `docs/superpowers/specs/2026-07-22-oa-related-approval-design.md`(V1 基线)
|
||||
- `docs/superpowers/specs/2026-07-14-oa-approval-dingtalk-design.md` §5.5
|
||||
|
||||
**决策记录**:
|
||||
- 「我审批的」= 现网已办 `done`(非待办 `pending`)
|
||||
- 实例状态不限制:处理中 / 已通过 / 已拒绝 / 已打回 / 已撤销均可选、可关联;卡片须展示流程状态
|
||||
- 三 Tab 内可见的实例均可关联(放宽「只能关联本人发起」)
|
||||
- 部门:展示发起部门 `initiatorDeptName`;无则整行不显示
|
||||
- 过滤:仅关键词(流程名 / 标题);不做状态下拉、不做应用下拉
|
||||
- 实现路径:扩展 `/related-candidates`,不新建独立 picker 接口;不改 `form_data` / `oa_relation` 契约
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与范围
|
||||
|
||||
### 1.1 目标
|
||||
|
||||
将「关联审批单」发起选单从表格改为钉钉式卡片,并支持按关系维度浏览:**我发起的 / 我审批的(已办)/ 抄送我的**;取消「仅已通过」限制,使当前用户在上述关系下可见的实例均可关联。
|
||||
|
||||
### 1.2 包含(本期)
|
||||
|
||||
| 能力 | 说明 |
|
||||
|------|------|
|
||||
| 选单 Tab | `mine` / `done` / `cc`;默认 `mine` |
|
||||
| 状态放开 | 候选与提交校验均不再要求 `status=completed` |
|
||||
| 关联权限放宽 | 发起人 **或** 已办审批任务 **或** 抄送任务 → 可关联 |
|
||||
| 卡片 UI | 勾选 + 头像字 + 标题 + 部门(可选) + 字段摘要 + 时间 + 右侧状态 |
|
||||
| 关键词过滤 | 匹配应用名(流程名)或实例标题 |
|
||||
| 分页多选 | 保留;已关联 id 禁用勾选 |
|
||||
|
||||
### 1.3 不包含(本期)
|
||||
|
||||
- 状态筛选器、按审批应用下拉筛选
|
||||
- 新建独立 `/related-picker` 路由
|
||||
- 改变 `form_data[field]=string[]` 或 `oa_relation` 表结构
|
||||
- 选中后自动回填其它表单字段 / 自动串子流程
|
||||
- 小程序选单壳(契约兼容即可)
|
||||
- 改详情主接口批量附带 relatedSummaries
|
||||
|
||||
### 1.4 相对 V1 基线的变更点
|
||||
|
||||
| 项 | V1(2026-07-22) | 本期 |
|
||||
|----|------------------|------|
|
||||
| 选单范围 | 本人发起 + `completed` | 三 Tab 可见;状态不限 |
|
||||
| 选单 UI | 表格 | 卡片 |
|
||||
| 过滤 | 关键词 | 仍仅关键词(语义不变,UI 去掉多余筛选项若曾有) |
|
||||
| 校验 | 本人 + completed | 关系可见即可关联;状态不限 |
|
||||
|
||||
若与 V1 冲突,**以本文为选单/关联校验权威**;V1 其余(扁平化、嵌套打印、控件注册)仍有效。
|
||||
|
||||
---
|
||||
|
||||
## 2. 后端设计
|
||||
|
||||
### 2.1 `GET /related-candidates`
|
||||
|
||||
**Query**:
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| `tab` | string | `mine`(默认)\| `done` \| `cc` |
|
||||
| `keyword` | string | 可选;匹配 `OaApp.app_name` 或 `OaInstance.title` |
|
||||
| `page` | int | 默认 1 |
|
||||
| `pageSize` | int | 默认 20,上限 100 |
|
||||
|
||||
**Tab 语义(SHALL 与 `oa_engine.list_tasks` 对齐)**:
|
||||
|
||||
| tab | 含义 | 查询要点 |
|
||||
|-----|------|----------|
|
||||
| `mine` | 我发起的 | `OaInstance.initiator_user_id = 当前用户`,`del_flag=0`,租户隔离;**不**滤 status |
|
||||
| `done` | 我审批的(已办) | 存在 `OaTask`:`assignee_user_id=当前用户`、`task_type=approval`、`status ∈ (approved, rejected, returned, transferred)`;按 **instance 去重** |
|
||||
| `cc` | 抄送我的 | 存在 `OaTask`:`assignee_user_id=当前用户`、`task_type=cc`;按 **instance 去重** |
|
||||
|
||||
排序:实例 `create_time DESC`。
|
||||
租户:仅当前用户 `tenant_no`;不信任客户端覆盖。
|
||||
|
||||
**列表项(卡片 DTO)SHALL 包含**:
|
||||
|
||||
```ts
|
||||
{
|
||||
id: string
|
||||
appName: string
|
||||
title: string // 原始实例 title,可空
|
||||
displayTitle: string // 建议「{发起人}提交的{应用名}」;缺名时回退 appName/title
|
||||
initiatorUserName: string
|
||||
initiatorDeptName: string // 可空;空则前端不渲染部门行
|
||||
applyTime: string // YYYY-MM-DD HH:mm:ss
|
||||
status: string // running|completed|rejected|returned|cancelled|…
|
||||
statusText: string // 处理中|已通过|已拒绝|已打回|已撤销|…
|
||||
currentApproverNames: string // 处理中:当前审批人姓名,顿号拼接;否则可空
|
||||
previewFields: Array<{ label: string; value: string }> // 最多 2 条业务字段摘要
|
||||
}
|
||||
```
|
||||
|
||||
`previewFields`:复用 `flatten_form_fields_for_summary`,取前 2 条(跳过布局/说明等与现扁平化一致)。
|
||||
|
||||
### 2.2 `assert_linkable_instance`(放宽)
|
||||
|
||||
SHALL 同时满足:
|
||||
|
||||
1. 实例存在、`del_flag=0`、同 `tenant_no`
|
||||
2. **不再**要求 `status == completed`
|
||||
3. 当前用户满足**任一**:
|
||||
- `inst.initiator_user_id == user_id`,或
|
||||
- 存在该用户对该实例的已办审批任务(同 `done` 任务条件),或
|
||||
- 存在该用户对该实例的抄送任务
|
||||
|
||||
否则抛出明确错误(如「无权关联该审批单」)。
|
||||
`start_instance` 写 `oa_relation`、`build_related_summaries(mode=picker)` 均走此校验。
|
||||
|
||||
### 2.3 enrichment / 详情回显
|
||||
|
||||
- `mode=view`:保持「当前用户已能看当前单」前提下,对被关联 id 无可见权则 `unavailable: true`(不整接口 403)
|
||||
- `mode=picker`:按新的 `assert_linkable_instance` 判定
|
||||
- 已选卡片在表单上的收起/展开字段规则仍遵循 V1 §5(前 3 / 全部);与选单 `previewFields`(前 2)独立
|
||||
|
||||
### 2.4 兼容
|
||||
|
||||
- 未传 `tab` 时默认 `mine`
|
||||
- 旧前端只传 `keyword/page/pageSize`:行为变为「我发起的 + 状态不限」(相对 V1 的 breaking:不再仅 completed)。产品已确认接受。
|
||||
|
||||
---
|
||||
|
||||
## 3. 前端设计
|
||||
|
||||
### 3.1 改动面
|
||||
|
||||
| 模块 | 职责 |
|
||||
|------|------|
|
||||
| `OaRelatedApproval.vue` | 选单弹窗:Tab + 关键词 + 卡片列表 + 多选分页 |
|
||||
| `api/oaApproval.ts` | `fetchOaRelatedCandidates` 增加 `tab`;类型对齐卡片 DTO |
|
||||
| Demo | `oa-related-approval-picker-card-demo.html` 可同步去掉状态/应用筛选项(可选,非门禁) |
|
||||
|
||||
设计器 DragRule / `setupOaRelatedApproval` / `form_data` 写入逻辑不变。
|
||||
|
||||
### 3.2 选单交互(SHALL)
|
||||
|
||||
1. 打开弹窗 → 默认 Tab `mine`,拉候选
|
||||
2. 切换 Tab → 清空**本次**勾选草稿,`page=1`,重新请求
|
||||
3. 关键词回车或点查询 → `page=1` 刷新
|
||||
4. 卡片勾选多选;已在 `modelValue` 中的 id 禁用
|
||||
5. 确定 → 合并 id 到 `modelValue`(去重保序)
|
||||
6. 空列表文案:「暂无审批单」
|
||||
|
||||
### 3.3 卡片视觉(SHALL)
|
||||
|
||||
对齐钉钉截图 + Fresh Mint:
|
||||
|
||||
- 左:checkbox → 圆角方头像(发起人姓名末 2 字 + 色块)
|
||||
- 中:`displayTitle`;可选「部门:{initiatorDeptName}」;最多 2 行 `label:value`;底部 `applyTime`
|
||||
- 右:`status=running` 时展示当前审批人(如有)+「处理中」;其它状态展示 `statusText`;色语义:处理中/打回偏警告色,已通过成功色,已拒绝危险色,已撤销中性
|
||||
|
||||
遮罩/弹窗:现有 `dialog-form-layout`、无 backdrop blur。
|
||||
|
||||
---
|
||||
|
||||
## 4. 错误与边界
|
||||
|
||||
| 场景 | 行为 |
|
||||
|------|------|
|
||||
| Tab 无数据 | 空态「暂无审批单」 |
|
||||
| 关键词无命中 | 空态 |
|
||||
| 篡改不可关联 id | 提交/校验失败,明确错误,不写 relation |
|
||||
| 同一实例在 done/cc 多条 task | 列表按 instance 去重,只出一张卡 |
|
||||
| 无发起部门 | 不渲染部门行 |
|
||||
| 处理中但暂无审批人 | 右侧仅「处理中」 |
|
||||
| 必填未选 | FormCreate 校验拦截 |
|
||||
| 无该控件旧应用 | 行为不变 |
|
||||
|
||||
---
|
||||
|
||||
## 5. 测试建议
|
||||
|
||||
**后端**
|
||||
- `list_related_candidates`:三 tab 范围;keyword;分页;status 不限
|
||||
- `assert_linkable`:发起人任意状态可过;已办/抄送可过;无关用户失败;删除/跨租户失败
|
||||
- start 写 relation:他人已办实例可关联
|
||||
|
||||
**前端**
|
||||
- Tab 切换清空勾选并换源
|
||||
- 卡片字段渲染(部门有无、状态色、preview 两行)
|
||||
- 已选禁用、多选合并
|
||||
|
||||
**手工**
|
||||
- 对照 Demo/钉钉截图目视
|
||||
- 发起页选三 Tab 各关联一张并进详情跳转
|
||||
|
||||
---
|
||||
|
||||
## 6. 验收标准
|
||||
|
||||
1. 选单为卡片而非表格;三 Tab 可切换且数据语义正确(done=已办)
|
||||
2. 任意实例状态均可出现在候选中(在对应 Tab 关系下)且可成功关联
|
||||
3. 仅关键词过滤生效
|
||||
4. 有发起部门则显示,无则整行不出现
|
||||
5. 卡片展示流程状态;处理中尽量展示当前审批人
|
||||
6. 越权 id 无法提交;`form_data`/`oa_relation` 契约不变
|
||||
7. UI 符合 Fresh Mint,主色非设计器默认蓝
|
||||
|
||||
---
|
||||
|
||||
## 7. 实现顺序建议
|
||||
|
||||
1. 后端:放宽 `assert_linkable_instance` + 单测
|
||||
2. 后端:`list_related_candidates` 支持 `tab` 与卡片 DTO + 单测
|
||||
3. API 路由透传 `tab`
|
||||
4. 前端 API 类型与 `fetchOaRelatedCandidates`
|
||||
5. `OaRelatedApproval.vue` 选单 UI 卡片化 + Tab + 关键词
|
||||
6. 回归:发起关联、详情回显、嵌套打印不破坏
|
||||
7. (可选)同步精简 HTML Demo 过滤区;`./scripts/update-graph.sh backend`(若签名/调用图有变)
|
||||
@@ -0,0 +1,61 @@
|
||||
# OA「关联审批单」:只读详情弹窗展示设计
|
||||
|
||||
**日期**: 2026-08-11
|
||||
**状态**: 已批准
|
||||
**基线**: `docs/superpowers/specs/2026-07-22-oa-related-approval-design.md`
|
||||
**问题**: 发起审批等弹窗内点击关联单标题会 `router.push` 打开「审批详情」Tab,但被上层弹窗遮挡,用户看不到详情。
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标
|
||||
|
||||
点击「关联审批单」标题(及嵌套「已关联 M 条」)时,以**叠一层只读详情弹窗**展示关联实例;父级发起/编辑弹窗不关闭,关闭详情后可继续填单。
|
||||
|
||||
## 2. 非目标
|
||||
|
||||
- 不在弹窗内提供同意/拒绝/打回/加签/转交/撤销/复制并重新发起等操作
|
||||
- 不改后端 API、路由注册、权限模型
|
||||
- 不重构整页 `instances/detail.vue` 为共享组件(可局部复用其组装逻辑)
|
||||
|
||||
## 3. 交互
|
||||
|
||||
| 场景 | 行为 |
|
||||
|------|------|
|
||||
| 发起审批弹窗内点关联标题 | 打开只读详情弹窗(盖在发起弹窗上) |
|
||||
| 关闭只读详情 | 回到发起弹窗,表单状态保留 |
|
||||
| 详情弹窗内再点嵌套关联 | 再叠一层同款只读弹窗(各控件实例自管) |
|
||||
| `unavailable` / 无 id | 不打开;保持现有不可点态 |
|
||||
| 加载失败 / 无权限 | 接口错误提示;不白屏 |
|
||||
|
||||
**变更**:`OaRelatedApproval` 内 **不再** `router.push` 到实例详情页(一律弹窗)。列表页「查看详情」等入口不受影响。
|
||||
|
||||
## 4. UI
|
||||
|
||||
- `el-dialog`:`append-to-body`、`align-center`、`dialog-form-layout`、`modal-class="protocol-dialog-mask"`、`destroy-on-close`;无 backdrop blur
|
||||
- 宽度约 `920px`(对齐发起弹窗)
|
||||
- 标题区:实例标题 + 状态 `el-tag`
|
||||
- 正文:表单只读回显(form-create,与详情页同套 rule 预处理)+ `OaProgressChain`
|
||||
- 底栏:仅「关闭」(Close 图标 + 文案)
|
||||
|
||||
## 5. 实现落点
|
||||
|
||||
| 文件 | 职责 |
|
||||
|------|------|
|
||||
| `web-admin/src/components/oa-approval/OaInstanceDetailDialog.vue` | 新建:按 `instanceId` 拉详情并只读展示 |
|
||||
| `web-admin/src/components/oa-approval/OaRelatedApproval.vue` | `goDetail` 改为打开上述弹窗;挂载弹窗实例 |
|
||||
| 基线 spec §5 跳转句 | 改为交叉引用本文 |
|
||||
|
||||
详情组装(`applySchema` / progress 投影 / status 文案)与 `instances/detail.vue` 只读部分对齐;审批动作相关代码不迁入。
|
||||
|
||||
## 6. 验收
|
||||
|
||||
1. 发起弹窗内点关联标题 → 详情盖在上面,发起单仍在
|
||||
2. 关详情 → 可继续编辑/提交
|
||||
3. 嵌套关联可再叠一层并可逐层关闭
|
||||
4. 不可用项不可点;无权限有提示
|
||||
|
||||
## 7. 自检
|
||||
|
||||
- 无 TBD/占位未决项
|
||||
- 与基线「可跳转详情」意图一致,仅展示载体由路由页改为弹窗
|
||||
- 范围限于 web-admin 关联控件 + 新建只读弹窗
|
||||
@@ -0,0 +1,29 @@
|
||||
# OA 四个中心列表分页设计
|
||||
|
||||
## 背景
|
||||
|
||||
待办中心 / 已办中心 / 我发起的 / 抄送我的目前一次返回全量,无 `el-pagination`。需与同模块草稿箱及标准列表页对齐,补服务端分页。
|
||||
|
||||
## 决策
|
||||
|
||||
- 默认每页 **20** 条(与草稿箱一致);可选 10 / 20 / 50。
|
||||
- **DB 级** `count` + `offset/limit`,再对当前页 enrich。
|
||||
- 接口返回 `{ list, total }`;`page` / `pageSize` 查询参数。
|
||||
|
||||
## 后端
|
||||
|
||||
- `GET /api/.../oa-approval/tasks/{kind}` 增加 `page`(默认 1)、`pageSize`(默认 20,1–100)。
|
||||
- `list_tasks` 增加同名参数;返回 `{"list": [...], "total": N}`(破坏性:原直接返回 list,调用方与单测需同步)。
|
||||
- `pending` / `done` / `cc`:在 `OaTask` 查询上分页;`cc` 的 `readStatus` 仍先筛选再分页。
|
||||
- `mine`:在 `OaInstance` 查询上分页。
|
||||
- 排序保持 `create_time DESC`。
|
||||
|
||||
## 前端
|
||||
|
||||
- 四页:`list-body` 内表格 + `pagination list-pager-bar` + `el-pagination`(对齐草稿箱)。
|
||||
- 序号:`(page - 1) * pageSize + index + 1`。
|
||||
- `fetchOaTasks` 传 `page` / `pageSize`;抄送筛选/重置时 `page = 1`。
|
||||
|
||||
## 非目标
|
||||
|
||||
角标 count、详情/审批动作、额外筛选项、假分页。
|
||||
Reference in new issue
Block a user