feat(projects): 1、站内信、通知功能完善;2、项目列表按会议需求重新开发
This commit is contained in:
24
src/typings/api/notice.d.ts
vendored
Normal file
24
src/typings/api/notice.d.ts
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
declare namespace Api {
|
||||
/**
|
||||
* namespace Notice
|
||||
*
|
||||
* backend api module: "notice"(通知公告)
|
||||
*/
|
||||
namespace Notice {
|
||||
/** 公告(ID 在 API 适配层已统一为 string) */
|
||||
interface Notice {
|
||||
/** 公告编号 */
|
||||
id: string;
|
||||
/** 公告标题 */
|
||||
title: string;
|
||||
/** 公告类型,字典 system_notice_type */
|
||||
type: number;
|
||||
/** 公告内容(富文本 / 纯文本,由录入决定) */
|
||||
content: string;
|
||||
/** 状态:0 开启 / 1 关闭 */
|
||||
status: number;
|
||||
/** 创建时间 */
|
||||
createTime: string | number;
|
||||
}
|
||||
}
|
||||
}
|
||||
44
src/typings/api/notify-message.d.ts
vendored
Normal file
44
src/typings/api/notify-message.d.ts
vendored
Normal file
@@ -0,0 +1,44 @@
|
||||
declare namespace Api {
|
||||
/**
|
||||
* namespace NotifyMessage
|
||||
*
|
||||
* backend api module: "notify-message"(站内信 · 我的收件箱)
|
||||
*/
|
||||
namespace NotifyMessage {
|
||||
interface PageParams {
|
||||
pageNo: number;
|
||||
pageSize: number;
|
||||
}
|
||||
|
||||
interface PageResult<T = any> {
|
||||
total: number;
|
||||
list: T[];
|
||||
}
|
||||
|
||||
/** 站内信(铃铛 / 收件箱展示用;ID 在 API 适配层已统一为 string) */
|
||||
interface NotifyMessage {
|
||||
/** 站内信编号(雪花 Long,按 string 接收) */
|
||||
id: string;
|
||||
/** 发送人名称(模板配置的发件人显示名) */
|
||||
templateNickname: string;
|
||||
/** 最终消息正文(占位符已渲染,直接展示) */
|
||||
templateContent: string;
|
||||
/** 消息类型,字典 system_notify_template_type */
|
||||
templateType: number;
|
||||
/** 是否已读 */
|
||||
readStatus: boolean;
|
||||
/** 阅读时间;未读为 null */
|
||||
readTime: string | number | null;
|
||||
/** 收到时间 */
|
||||
createTime: string | number;
|
||||
}
|
||||
|
||||
/** 我的站内信分页查询参数 */
|
||||
interface MyPageParams extends PageParams {
|
||||
/** true 只看已读 / false 只看未读 / 不传 = 全部 */
|
||||
readStatus?: boolean;
|
||||
/** 关键字,后端对消息正文模糊匹配;不传或空串 = 不过滤 */
|
||||
keyword?: string;
|
||||
}
|
||||
}
|
||||
}
|
||||
23
src/typings/api/product.d.ts
vendored
23
src/typings/api/product.d.ts
vendored
@@ -21,10 +21,27 @@ declare namespace Api {
|
||||
list: T[];
|
||||
}
|
||||
|
||||
/** 入口页概览统计状态看板项(状态机全部启用状态,按 sort 升序,计数为 0 也返回;与项目域契约同构) */
|
||||
interface OverviewStatusItem {
|
||||
statusCode: string;
|
||||
/** 状态展示名(状态机配置中文名,前端直接渲染,不做本地名称映射) */
|
||||
statusName: string;
|
||||
count: number;
|
||||
sort: number;
|
||||
/** 是否终态(状态机 terminal_flag) */
|
||||
terminal: boolean;
|
||||
/** 是否计入"全部";当前口径无排除项恒为 true(产品列表暂无"全部"视图,按同构契约返回) */
|
||||
includeInAll: boolean;
|
||||
}
|
||||
|
||||
/** 产品入口页概览统计 */
|
||||
interface ProductOverviewSummary {
|
||||
/** 产品状态数量映射,key 为后端状态编码 */
|
||||
/** 产品状态数量映射,key 为后端状态编码(过渡兼容字段,前端迁移完成后由后端删除) */
|
||||
statusCounts: Record<string, number>;
|
||||
/** "全部"口径总数 = items 各状态 count 之和 */
|
||||
total: number;
|
||||
/** 状态看板项,覆盖状态机全部启用状态,按 sort 升序 */
|
||||
items: OverviewStatusItem[];
|
||||
}
|
||||
|
||||
interface Product {
|
||||
@@ -172,8 +189,10 @@ declare namespace Api {
|
||||
|
||||
type ProductSearchParams = CommonType.RecordNullable<
|
||||
Pick<PageParams, 'pageNo' | 'pageSize'> &
|
||||
Pick<Product, 'directionCode' | 'managerUserId' | 'statusCode'> & {
|
||||
Pick<Product, 'directionCode' | 'managerUserId'> & {
|
||||
keyword: string;
|
||||
/** 状态编码来自状态机(overview-summary items 动态下发),不再用前端字面量联合约束 */
|
||||
statusCode: string;
|
||||
updateTime: string[];
|
||||
}
|
||||
>;
|
||||
|
||||
87
src/typings/api/project.d.ts
vendored
87
src/typings/api/project.d.ts
vendored
@@ -681,10 +681,29 @@ declare namespace Api {
|
||||
list: T[];
|
||||
}
|
||||
|
||||
/** 入口页概览统计状态看板项(状态机全部启用状态,按 sort 升序,计数为 0 也返回) */
|
||||
interface OverviewStatusItem {
|
||||
statusCode: string;
|
||||
/** 状态展示名(状态机配置中文名,前端直接渲染,不做本地名称映射) */
|
||||
statusName: string;
|
||||
count: number;
|
||||
sort: number;
|
||||
/** 是否终态(状态机 terminal_flag);不能用于"全部"排除或左栏分区(completed 也可能是终态) */
|
||||
terminal: boolean;
|
||||
/** 是否计入"全部";当前口径无排除项恒为 true,将来恢复排除项由该字段表达 */
|
||||
includeInAll: boolean;
|
||||
}
|
||||
|
||||
/** 项目入口页概览统计 */
|
||||
interface ProjectOverviewSummary {
|
||||
/** 项目状态数量映射,key 为后端状态编码 */
|
||||
/** 项目状态数量映射,key 为后端状态编码(过渡兼容字段,前端迁移完成后由后端删除) */
|
||||
statusCounts: Record<string, number>;
|
||||
/** "全部"口径总数 = items 各状态 count 之和(作废/归档计入) */
|
||||
total: number;
|
||||
/** 状态看板项,覆盖状态机全部启用状态,按 sort 升序 */
|
||||
items: OverviewStatusItem[];
|
||||
/** 游离项目计数 = 所有未挂产品的项目(不按状态过滤),左栏游离入口据此显隐 */
|
||||
orphanCount?: number;
|
||||
}
|
||||
|
||||
interface Project {
|
||||
@@ -787,11 +806,75 @@ declare namespace Api {
|
||||
projectType: string;
|
||||
productId: string;
|
||||
managerUserId: string;
|
||||
statusCode: ProjectStatusCode;
|
||||
/** 状态编码来自状态机(overview-summary items 动态下发),不再用前端字面量联合约束 */
|
||||
statusCode: string;
|
||||
/** 多值状态筛选(存在时后端优先于单值 statusCode);分组页"展开剩余"按"全部"口径传 items 派生的全量编码 */
|
||||
statusCodes: string[];
|
||||
/** 仅查游离项目(productId 为空);与 productId 互斥,分组页展开游离组剩余时用 */
|
||||
orphanOnly: boolean;
|
||||
updateTime: string[];
|
||||
}
|
||||
>;
|
||||
|
||||
/**
|
||||
* 项目列表"按产品分组"查询入参(GET /project/project/group-page)。
|
||||
*
|
||||
* - pageNo / pageSize 为**产品组维度**分页(一页 M 个产品组),不是项目行分页。
|
||||
* - statusCode 不传 = "全部"视图(后端从状态机推导;2026-06-11 口径变更后无排除项,作废/归档计入)。
|
||||
* - orphanOnly = true 仅返回游离组(productId 为空的项目);不可与 productId 同传。
|
||||
* - topN:每组返回项目条数上限(后端默认 5,范围 1~50),超出由页面展开拉取。
|
||||
*/
|
||||
type ProjectGroupSearchParams = CommonType.RecordNullable<
|
||||
Pick<PageParams, 'pageNo' | 'pageSize'> & {
|
||||
keyword: string;
|
||||
productId: string;
|
||||
projectType: string;
|
||||
/** 状态编码来自状态机(overview-summary items 动态下发),不再用前端字面量联合约束 */
|
||||
statusCode: string;
|
||||
orphanOnly: boolean;
|
||||
topN: number;
|
||||
}
|
||||
>;
|
||||
|
||||
/** 按产品聚合的项目分组 */
|
||||
interface ProjectGroup {
|
||||
/** 产品 ID;游离组为 null */
|
||||
productId: string | null;
|
||||
/** 产品名称;游离组固定为"游离项目" */
|
||||
productName: string;
|
||||
/** 产品编码;游离组为 null */
|
||||
productCode: string | null;
|
||||
/** 产品方向字典值;游离组为空串 */
|
||||
directionCode: string;
|
||||
/** 产品经理用户 ID */
|
||||
managerUserId: string | null;
|
||||
/** 产品经理昵称(后端回填;游离组为 null,前端 managerLabelMap 兜底) */
|
||||
managerUserNickname: string | null;
|
||||
/** 当前筛选口径下组内项目总数 */
|
||||
projectTotal: number;
|
||||
/** 组内项目前 topN 条,按最近更新倒序;剩余由页面按 productId/orphanOnly + statusCodes 走 page 接口展开拉取 */
|
||||
projects: Project[];
|
||||
/** 组内按项目类型字典 value 的计数(现状按"全部口径"统计;已提需求改为跟随 statusCode 与 projectTotal 同口径,后端落地后更新本注释) */
|
||||
typeCounts: Record<string, number>;
|
||||
/** 是否已有主线项目(口径=存在非已取消 cancelled 的主线,已归档/完成也算占坑);前端直接消费、不用 typeCounts 推导 */
|
||||
hasBaseline: boolean;
|
||||
/** 是否游离组(未挂产品) */
|
||||
orphan: boolean;
|
||||
}
|
||||
|
||||
/** 产品分组分页结果 */
|
||||
interface ProjectGroupPageResult {
|
||||
/** 当前筛选口径下产品组总数(分页 total,含游离组) */
|
||||
total: number;
|
||||
/** 当前筛选口径下项目总数(标题 meta 用) */
|
||||
projectTotal: number;
|
||||
/** 当前筛选口径下可见产品跨方向数(≥2 时前端渲染方向层) */
|
||||
directionCount: number;
|
||||
/** 当前筛选口径下游离项目数(标题/分页用);左栏常驻游离计数改用 overview-summary 的 orphanCount 全口径 */
|
||||
orphanTotal: number;
|
||||
list: ProjectGroup[];
|
||||
}
|
||||
|
||||
/** 创建/保存项目参数 */
|
||||
type SaveProjectParams = Pick<Project, 'projectName' | 'directionCode' | 'projectType' | 'projectDesc'> & {
|
||||
projectCode: string | null;
|
||||
|
||||
Reference in New Issue
Block a user