feat: 实现需求管理、加班记录、成员/角色管理模块
- 需求模块:完整 CRUD、状态流转(采纳/拒绝/关闭)、详情抽屉、产品→项目级联选择 - 加班记录:产品→项目→版本三级联动、月份筛选(MonthPicker)、CSV 导出 - 成员管理:左右布局(部门树+成员列表)、手机号脱敏、初始密码自动生成及规则设置 - 角色管理:卡片列表、系统角色保护、CRUD - 通用组件:FilterSelect 下拉、MonthPicker 月份选择器、Pagination 分页 - 样式统一:状态标签加 border、日期输入现代化、筛选组件风格一致 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
103
apps/web/lib/requirement.ts
Normal file
103
apps/web/lib/requirement.ts
Normal file
@@ -0,0 +1,103 @@
|
||||
import type { Priority } from './derive';
|
||||
|
||||
export type RequirementStatus = 'pending_review' | 'adopted' | 'rejected' | 'planned' | 'developing' | 'testing' | 'released' | 'closed';
|
||||
export type Effort = 'S' | 'M' | 'L' | 'XL';
|
||||
export type SourceType = 'customer' | 'internal' | 'operation' | 'aftersale' | 'market' | 'competitor' | 'management';
|
||||
|
||||
export interface DictItem {
|
||||
id: string;
|
||||
name: string;
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export interface SourceTarget {
|
||||
id: string;
|
||||
name: string;
|
||||
sourceType: SourceType;
|
||||
createdAt: string;
|
||||
}
|
||||
|
||||
export interface Requirement {
|
||||
id: string;
|
||||
code: string;
|
||||
title: string;
|
||||
description: string;
|
||||
productId: string;
|
||||
projectId?: string;
|
||||
versionId?: string;
|
||||
sourceType: SourceType;
|
||||
sourceTarget: string;
|
||||
platforms: string[];
|
||||
typeId: string;
|
||||
status: RequirementStatus;
|
||||
priority: Priority;
|
||||
effort: Effort;
|
||||
currentStage?: string;
|
||||
productOwner?: string;
|
||||
creator: string;
|
||||
createdAt: string;
|
||||
parentId?: string;
|
||||
}
|
||||
|
||||
export const SOURCE_TYPE_LABEL: Record<SourceType, string> = {
|
||||
customer: '客户',
|
||||
internal: '内部',
|
||||
operation: '运营',
|
||||
aftersale: '售后',
|
||||
market: '市场',
|
||||
competitor: '竞品',
|
||||
management: '管理层',
|
||||
};
|
||||
|
||||
export const SOURCE_TARGET_LABEL: Record<SourceType, string> = {
|
||||
customer: '来源客户',
|
||||
internal: '提出部门',
|
||||
operation: '提出部门',
|
||||
aftersale: '提出部门',
|
||||
market: '来源渠道',
|
||||
competitor: '竞品名称',
|
||||
management: '提出人',
|
||||
};
|
||||
|
||||
export const REQ_STATUS_LABEL: Record<RequirementStatus, string> = {
|
||||
pending_review: '待评审',
|
||||
adopted: '已采纳',
|
||||
rejected: '已拒绝',
|
||||
planned: '已规划',
|
||||
developing: '开发中',
|
||||
testing: '测试中',
|
||||
released: '已上线',
|
||||
closed: '已关闭',
|
||||
};
|
||||
|
||||
export const REQ_STATUS_COLOR: Record<RequirementStatus, string> = {
|
||||
pending_review: 'bg-zinc-100 text-zinc-700 border border-zinc-200',
|
||||
adopted: 'bg-emerald-50 text-emerald-700 border border-emerald-200',
|
||||
rejected: 'bg-red-50 text-red-600 border border-red-200',
|
||||
planned: 'bg-blue-50 text-blue-700 border border-blue-200',
|
||||
developing: 'bg-indigo-50 text-indigo-700 border border-indigo-200',
|
||||
testing: 'bg-purple-50 text-purple-700 border border-purple-200',
|
||||
released: 'bg-emerald-50 text-emerald-700 border border-emerald-200',
|
||||
closed: 'bg-zinc-50 text-zinc-500 border border-zinc-200',
|
||||
};
|
||||
|
||||
export const EFFORT_LABEL: Record<Effort, string> = {
|
||||
S: 'S (1-2天)',
|
||||
M: 'M (3-5天)',
|
||||
L: 'L (5-10天)',
|
||||
XL: 'XL (10+天)',
|
||||
};
|
||||
|
||||
export const EFFORT_SHORT: Record<Effort, string> = {
|
||||
S: 'S',
|
||||
M: 'M',
|
||||
L: 'L',
|
||||
XL: 'XL',
|
||||
};
|
||||
|
||||
export const EFFORT_COLOR: Record<Effort, string> = {
|
||||
S: 'bg-emerald-50 text-emerald-700',
|
||||
M: 'bg-blue-50 text-blue-700',
|
||||
L: 'bg-orange-50 text-orange-700',
|
||||
XL: 'bg-red-50 text-red-700',
|
||||
};
|
||||
Reference in New Issue
Block a user