Files
STP/front-end/src/app/pages/ExpertManagement.tsx
T
vame d81ac936e7 feat(front-end): 依据内部评审意见对前端 UI 进行二次升级优化
- 主题色统一改回科技蓝(呼应滨化 LOGO)
- 合并"采购需求人员"、移除审批人角色(审批在 OA)
- 发起委托归属采购需求人员,招标专员不含该功能
- 删除合并招标/定标审批/合同生成/合同管理/供应商入库/审批中心/流程配置页面
- 小滨助手默认展开可收起、各角色主动提醒、问答直接给出按钮/链接
- 待办中心去掉"事找人"前缀
- 新增后台智能体任务监控组件(招标专员/管理员)
- 发起委托增加导入采购计划/直接填写/选择模板(含自动)
- 项目列表:排序/高级搜索/委托人列/提交审批/列显隐
- 项目详情:修正流程步骤、委托人信息、方案与文件合一、提交审批
- 长短名单去分支与推荐部门列、寻源关联项目并支持三来源
- 开标去自动开标、专家管理去抽取与回避、供应商管理去新增与入库
2026-07-10 23:35:54 +08:00

94 lines
3.7 KiB
TypeScript

import { useState } from "react";
import { Search, Filter } from "lucide-react";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "../components/ui/select";
import { Card } from "../components/ui/card";
import { PageHeader } from "../components/shared/common";
import { experts } from "../data/mock";
// 说明(评审意见):专家的随机抽取与回避校验属于"具体项目评标流程",
// 不在专家总体管理页体现;本页仅做专家库信息维护与查询。
export function ExpertManagement() {
const [q, setQ] = useState("");
const [cat, setCat] = useState("all");
const list = experts.filter(
(e) => (cat === "all" || e.category === cat) && e.name.includes(q),
);
return (
<div>
<PageHeader
title="专家管理"
description="维护内外部评标专家库信息(随机抽取与回避校验在具体项目评标流程中进行)"
/>
<Card className="mb-4 flex-row items-center gap-3 p-4">
<div className="relative flex-1">
<Search className="absolute left-3 top-1/2 size-4 -translate-y-1/2 text-muted-foreground" />
<input
value={q}
onChange={(e) => setQ(e.target.value)}
placeholder="搜索专家姓名"
className="h-9 w-full rounded-lg border bg-input-background pl-9 pr-3 text-sm outline-none focus:border-primary"
/>
</div>
<Select value={cat} onValueChange={setCat}>
<SelectTrigger className="w-40">
<Filter className="size-4" />
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="all"></SelectItem>
<SelectItem value="化工工艺"></SelectItem>
<SelectItem value="自动化控制"></SelectItem>
<SelectItem value="环保工程"></SelectItem>
<SelectItem value="招标采购"></SelectItem>
<SelectItem value="机械设备"></SelectItem>
</SelectContent>
</Select>
</Card>
<Card className="gap-0 overflow-hidden p-0">
<table className="w-full text-sm">
<thead>
<tr className="border-b bg-muted/40 text-left text-muted-foreground">
<th className="px-5 py-3 font-medium"></th>
<th className="px-4 py-3 font-medium"></th>
<th className="px-4 py-3 font-medium"></th>
<th className="px-4 py-3 font-medium"></th>
<th className="px-4 py-3 font-medium"></th>
<th className="px-4 py-3 font-medium"></th>
</tr>
</thead>
<tbody className="divide-y">
{list.map((e) => (
<tr key={e.id} className="hover:bg-muted/30">
<td className="px-5 py-4 font-medium text-foreground">{e.name}</td>
<td className="px-4 py-4 text-muted-foreground">{e.title}</td>
<td className="px-4 py-4 text-muted-foreground">{e.category}</td>
<td className="px-4 py-4 text-muted-foreground">{e.region}</td>
<td className="px-4 py-4 text-muted-foreground">{e.reviewCount}</td>
<td className="px-4 py-4">
<span
className={`rounded px-2 py-0.5 text-xs ${
e.type === "内部" ? "bg-blue-50 text-blue-600" : "bg-sky-50 text-sky-600"
}`}
>
{e.type}
</span>
</td>
</tr>
))}
</tbody>
</table>
</Card>
</div>
);
}