diff --git a/.axhub/make/sidebar-tree.json b/.axhub/make/sidebar-tree.json index 6385483..5fe0748 100644 --- a/.axhub/make/sidebar-tree.json +++ b/.axhub/make/sidebar-tree.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-07-14T15:10:00.000Z", + "updatedAt": "2026-07-16T01:03:00.000Z", "prototypes": [ { "id": "folder-1783875936186-27raza", @@ -80,6 +80,37 @@ "title": "工作台", "itemKey": "prototypes/oneos-web-workbench" }, + { + "id": "folder-oneos-approval", + "kind": "folder", + "title": "审批中心", + "children": [ + { + "id": "item:prototypes:oneos-web-approval-initiated", + "kind": "item", + "title": "我发起的", + "itemKey": "prototypes/oneos-web-approval-initiated" + }, + { + "id": "item:prototypes:oneos-web-approval-todo", + "kind": "item", + "title": "我的待办", + "itemKey": "prototypes/oneos-web-approval-todo" + }, + { + "id": "item:prototypes:oneos-web-approval-done", + "kind": "item", + "title": "我的已办", + "itemKey": "prototypes/oneos-web-approval-done" + }, + { + "id": "item:prototypes:oneos-web-approval-cc", + "kind": "item", + "title": "我的抄送", + "itemKey": "prototypes/oneos-web-approval-cc" + } + ] + }, { "id": "folder-1782874599304-roj8fd", "kind": "folder", diff --git a/scripts/sync-oneos-web-prototypes.mjs b/scripts/sync-oneos-web-prototypes.mjs index 31edda0..3bc5ee7 100644 --- a/scripts/sync-oneos-web-prototypes.mjs +++ b/scripts/sync-oneos-web-prototypes.mjs @@ -29,6 +29,11 @@ const STANDALONE_MODULES = [ { slug: 'oneos-web-h2-station-stats', title: '加氢站数量统计', skipCodegen: true }, { slug: 'vehicle-return-settlement', title: '还车应结款', skipCodegen: true }, { slug: 'vehicle-pickup-receivable', title: '提车应收款', skipCodegen: true }, + { slug: 'oneos-web-approval', title: '审批中心', skipCodegen: true }, + { slug: 'oneos-web-approval-initiated', title: '我发起的', skipCodegen: true }, + { slug: 'oneos-web-approval-todo', title: '我的待办', skipCodegen: true }, + { slug: 'oneos-web-approval-done', title: '我的已办', skipCodegen: true }, + { slug: 'oneos-web-approval-cc', title: '我的抄送', skipCodegen: true }, ]; const MODULES = [ diff --git a/src/common/oneos-web-approval/ApprovalApp.tsx b/src/common/oneos-web-approval/ApprovalApp.tsx new file mode 100644 index 0000000..9be4328 --- /dev/null +++ b/src/common/oneos-web-approval/ApprovalApp.tsx @@ -0,0 +1,57 @@ +import '../oneosWebLegacy/legacyGlobals'; +import '../../prototypes/vehicle-management/style.css';import './styles/index.css'; + +import React from 'react'; +import { ConfigProvider } from 'antd'; +import type { ApprovalTabKey } from './types'; +import { ApprovalCenterPage } from './pages/ApprovalCenterPage'; + +const approvalTheme = { + token: { + colorPrimary: '#165dff', + borderRadius: 8, + fontFamily: + 'Inter, -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", sans-serif', + colorBgLayout: '#f5f7fa', + }, + components: { + Tabs: { + inkBarColor: '#165dff', + itemSelectedColor: '#165dff', + itemHoverColor: '#165dff', + }, + Button: { + controlHeight: 32, + }, + Select: { + controlHeight: 32, + }, + Input: { + controlHeight: 32, + }, + }, +}; + +export interface ApprovalAppProps { + tabKey?: ApprovalTabKey; + pageTitle?: string; + showTabs?: boolean; +} + +export function ApprovalApp({ + tabKey, + pageTitle = '审批中心', + showTabs = false, +}: ApprovalAppProps) { + return ( + + + + ); +} + +export default ApprovalApp; diff --git a/src/common/oneos-web-approval/components/ApprovalCard.tsx b/src/common/oneos-web-approval/components/ApprovalCard.tsx new file mode 100644 index 0000000..9836c25 --- /dev/null +++ b/src/common/oneos-web-approval/components/ApprovalCard.tsx @@ -0,0 +1,96 @@ +import React from 'react'; +import { RightOutlined } from '@ant-design/icons'; +import type { ApprovalCardItem } from '../types'; +import { + formatStatusLabel, + getApprovalTypeColor, + getApprovalTypeLabel, +} from '../config/approvalTypeConfig'; + +export interface ApprovalCardProps { + item: ApprovalCardItem; + selected?: boolean; + onClick?: (item: ApprovalCardItem) => void; +} + +function statusClassName(status: ApprovalCardItem['status']): string { + if (status === 'approved') return 'ap-status ap-status--approved'; + if (status === 'rejected') return 'ap-status ap-status--rejected'; + return 'ap-status ap-status--pending'; +} + +export function ApprovalCard({ item, selected = false, onClick }: ApprovalCardProps) { + const typeColor = getApprovalTypeColor(item.type); + const statusLabel = formatStatusLabel(item); + + return ( +
onClick?.(item)} + onKeyDown={(event) => { + if (event.key === 'Enter' || event.key === ' ') { + event.preventDefault(); + onClick?.(item); + } + }} + > +
+ + {item.typeLabel ?? getApprovalTypeLabel(item.type)} + + {statusLabel} +
+ +
+

{item.title}

+ {item.subtitle ?

{item.subtitle}

: null} + + {item.keyFacts && item.keyFacts.length > 0 ? ( +
+ {item.keyFacts.map((fact) => ( +
+
{fact.label}
+
+ {fact.value} +
+
+ ))} +
+ ) : null} + + {item.risks && item.risks.length > 0 ? ( +
+ {item.risks.map((risk) => ( + + {risk.label} + + ))} +
+ ) : null} +
+ +
+
+ {item.showInitiatorInFooter ? ( + 发起人 {item.initiatedBy} + ) : null} + + {item.footerText ?? `发起时间 ${item.initiatedAt}`} + +
+ + 查看详情 + + +
+
+ ); +} diff --git a/src/common/oneos-web-approval/components/ApprovalCardList.tsx b/src/common/oneos-web-approval/components/ApprovalCardList.tsx new file mode 100644 index 0000000..a5a1b28 --- /dev/null +++ b/src/common/oneos-web-approval/components/ApprovalCardList.tsx @@ -0,0 +1,47 @@ +import React from 'react'; +import { Empty, Spin } from 'antd'; +import type { ApprovalCardItem } from '../types'; +import { ApprovalCard } from './ApprovalCard'; + +export interface ApprovalCardListProps { + items: ApprovalCardItem[]; + loading?: boolean; + selectedId?: string | null; + onItemClick?: (item: ApprovalCardItem) => void; +} + +export function ApprovalCardList({ + items, + loading = false, + selectedId, + onItemClick, +}: ApprovalCardListProps) { + if (loading) { + return ( +
+ +
+ ); + } + + if (items.length === 0) { + return ( +
+ +
+ ); + } + + return ( +
+ {items.map((item) => ( + + ))} +
+ ); +} diff --git a/src/common/oneos-web-approval/components/ApprovalDetailPlaceholder.tsx b/src/common/oneos-web-approval/components/ApprovalDetailPlaceholder.tsx new file mode 100644 index 0000000..d4c700d --- /dev/null +++ b/src/common/oneos-web-approval/components/ApprovalDetailPlaceholder.tsx @@ -0,0 +1,193 @@ +import React, { useState } from 'react'; +import { + Avatar, + Button, + Empty, + Space, + Tabs, + Timeline, + Typography, +} from 'antd'; +import { + CheckCircleOutlined, + ClockCircleOutlined, + CopyOutlined, + ReloadOutlined, + UserOutlined, +} from '@ant-design/icons'; +import type { ApprovalCardItem } from '../types'; +import { + formatStatusLabel, + getApprovalTypeLabel, +} from '../config/approvalTypeConfig'; +import { InsuranceComparisonDetail } from './InsuranceComparisonDetail'; + +const { Text, Title } = Typography; + +export interface ApprovalDetailPlaceholderProps { + item: ApprovalCardItem | null; + onRefresh?: () => void; +} + +function statusBadgeClass(status: ApprovalCardItem['status']): string { + if (status === 'approved') return 'ap-detail__badge ap-detail__badge--approved'; + if (status === 'rejected') return 'ap-detail__badge ap-detail__badge--rejected'; + return 'ap-detail__badge ap-detail__badge--pending'; +} + +const MOCK_TIMELINE = [ + { role: '发起人', name: '提交申请', time: '', color: 'blue' as const }, + { role: '部门主管', name: '审批通过', time: '2026-07-08 10:30', color: 'green' as const }, + { role: '财务审核', name: '审批中', time: '', color: 'gray' as const }, +]; + +export function ApprovalDetailPlaceholder({ item, onRefresh }: ApprovalDetailPlaceholderProps) { + const [activeTab, setActiveTab] = useState('detail'); + + if (!item) { + return ( +
+ +
+ ); + } + + if (item.typeLabel === '保险比价采购') { + return ; + } + + const statusLabel = formatStatusLabel(item); + const typeLabel = getApprovalTypeLabel(item.type); + + return ( +
+
+ + 编号: + , text: item.id }}>{item.id} + + +
+ +
+
+ + {item.title} + + {statusLabel} +
+
+ + + } /> + {item.initiatedBy} + + + 流程分类 + {typeLabel} + + + + 提交时间 + {item.initiatedAt} + + +
+
+ + + {item.subtitle ? ( +

{item.subtitle}

+ ) : null} + + {item.keyFacts && item.keyFacts.length > 0 ? ( +
+ {item.keyFacts.map((fact) => ( +
+
{fact.label}
+
+ {fact.value} +
+
+ ))} +
+ ) : null} + + {item.risks && item.risks.length > 0 ? ( +
+ {item.risks.map((risk) => ( + + {risk.label} + + ))} +
+ ) : null} + +
+ + 审批进度 + + ({ + color: step.color, + dot: + step.color === 'green' ? ( + + ) : undefined, + children: ( +
+
+ + {step.role} + {step.name ? ` · ${step.name}` : ''} + + {step.time ? ( + + {step.time} + + ) : null} +
+ {index === 0 ? ( + {item.initiatedBy} + ) : null} +
+ ), + }))} + /> +
+
+ ), + }, + { + key: 'flow', + label: '审批流程图', + children: ( +
+ +
+ ), + }, + ]} + /> + +
+ +
+ + ); +} diff --git a/src/common/oneos-web-approval/components/InsuranceComparisonDetail.tsx b/src/common/oneos-web-approval/components/InsuranceComparisonDetail.tsx new file mode 100644 index 0000000..ff49360 --- /dev/null +++ b/src/common/oneos-web-approval/components/InsuranceComparisonDetail.tsx @@ -0,0 +1,266 @@ +import React, { useState } from 'react'; +import { + Avatar, + Button, + Empty, + Space, + Table, + Tabs, + Tag, + Typography, +} from 'antd'; +import type { ColumnsType } from 'antd/es/table'; +import { + ClockCircleOutlined, + CopyOutlined, + ReloadOutlined, + UserOutlined, +} from '@ant-design/icons'; +import type { ApprovalCardItem } from '../types'; +import { formatStatusLabel } from '../config/approvalTypeConfig'; + +const { Text, Title } = Typography; + +export interface InsuranceComparisonDetailProps { + item: ApprovalCardItem; + onRefresh?: () => void; +} + +function getFact(item: ApprovalCardItem, label: string): string { + return item.keyFacts?.find((fact) => fact.label === label)?.value ?? '-'; +} + +interface VehicleRow { + key: string; + plateNo: string; + vin: string; + insuranceType: string; + latestPaymentDate: string; + finalQuote: string; + status: string; + approver: string; + remark: string; +} + +interface QuoteRow { + key: string; + company: string; + amount: string; + isFinal: boolean; + remark: string; +} + +function buildComparisonNo(item: ApprovalCardItem): string { + const datePart = item.initiatedAt.replace(/[-: ]/g, '').slice(0, 8); + const seq = item.id.replace(/\D/g, '').padStart(4, '0'); + return `BXBJ${datePart}${seq}`; +} + +function buildSummaryRows(item: ApprovalCardItem, comparisonNo: string) { + const finalQuote = getFact(item, '最终报价').replace('¥', ''); + const insuranceType = getFact(item, '采购险种'); + const companyCount = getFact(item, '保险公司数量'); + + return [ + { label: '比价单号', value: comparisonNo }, + { label: '采购状态', value: 审批中 }, + { label: '创建人', value: item.initiatedBy }, + { label: '创建时间', value: item.initiatedAt }, + { label: '车辆数', value: '1' }, + { label: '险种数', value: '1' }, + { label: '已确认报价数', value: '1' }, + { label: '确认报价总额', value: finalQuote }, + { label: '当前审批人', value: item.currentApprover ?? '-' }, + { label: '保险公司数量', value: companyCount }, + { label: '采购险种', value: insuranceType }, + { label: '中选保险公司', value: item.subtitle?.replace(/^中选:/, '') ?? '-' }, + ]; +} + +function buildVehicleRows(item: ApprovalCardItem): VehicleRow[] { + const finalQuote = getFact(item, '最终报价').replace('¥', ''); + + return [ + { + key: '1', + plateNo: item.title, + vin: '-', + insuranceType: getFact(item, '采购险种'), + latestPaymentDate: getFact(item, '最晚付费日'), + finalQuote, + status: '审批中', + approver: item.currentApprover ?? '-', + remark: item.subtitle ?? '-', + }, + ]; +} + +function buildQuoteRows(item: ApprovalCardItem): QuoteRow[] { + const winner = item.subtitle?.replace(/^中选:/, '') ?? '国元农业保险上海分公司'; + const finalAmount = getFact(item, '最终报价').replace('¥', ''); + + return [ + { key: '1', company: '国任财产保险股份有限公司广东分公司', amount: '111.00', isFinal: false, remark: '-' }, + { key: '2', company: winner, amount: finalAmount, isFinal: true, remark: '-' }, + { key: '3', company: '中国平安财产保险股份有限公司上海分公司', amount: '888.00', isFinal: false, remark: '-' }, + ]; +} + +export function InsuranceComparisonDetail({ item, onRefresh }: InsuranceComparisonDetailProps) { + const [activeTab, setActiveTab] = useState('detail'); + const comparisonNo = buildComparisonNo(item); + const statusLabel = formatStatusLabel(item); + const typeLabel = item.typeLabel ?? '保险比价采购'; + const summaryRows = buildSummaryRows(item, comparisonNo); + const vehicleRows = buildVehicleRows(item); + const quoteRows = buildQuoteRows(item); + + const vehicleColumns: ColumnsType = [ + { title: '车牌号', dataIndex: 'plateNo', width: 110 }, + { title: 'VIN', dataIndex: 'vin', width: 120 }, + { title: '险种', dataIndex: 'insuranceType', width: 90 }, + { title: '最晚付费日', dataIndex: 'latestPaymentDate', width: 120 }, + { title: '最终报价', dataIndex: 'finalQuote', width: 100 }, + { + title: '采购状态', + dataIndex: 'status', + width: 90, + render: (value: string) => {value}, + }, + { title: '当前审批人', dataIndex: 'approver', width: 120 }, + { title: '备注', dataIndex: 'remark', ellipsis: true }, + ]; + + const quoteColumns: ColumnsType = [ + { title: '保险公司', dataIndex: 'company', ellipsis: true }, + { title: '报价金额', dataIndex: 'amount', width: 110 }, + { + title: '最终', + dataIndex: 'isFinal', + width: 72, + render: (isFinal: boolean) => + isFinal ? : -, + }, + { title: '备注', dataIndex: 'remark', width: 80 }, + ]; + + return ( +
+
+ + 编号: + , text: comparisonNo }}>{comparisonNo} + + +
+ +
+
+ + {typeLabel}审批-{comparisonNo} + + {statusLabel} +
+
+ + + } /> + {item.initiatedBy} + + + 流程分类 + {typeLabel} + + + + 提交时间 + {item.initiatedAt} + + +
+
+ + + + + {Array.from({ length: Math.ceil(summaryRows.length / 2) }).map((_, rowIndex) => { + const left = summaryRows[rowIndex * 2]; + const right = summaryRows[rowIndex * 2 + 1]; + return ( + + + + {right ? ( + <> + + + + ) : ( + <> + + ); + })} + +
{left.label}{left.value}{right.label}{right.value} + + + )} +
+ +
+ + 车辆明细 + + ( +
+ ), + defaultExpandedRowKeys: ['1'], + }} + scroll={{ x: 900 }} + /> + + + ), + }, + { + key: 'flow', + label: '审批流程图', + children: ( +
+ +
+ ), + }, + ]} + /> + +
+ +
+ + ); +} diff --git a/src/common/oneos-web-approval/config/approvalTypeConfig.ts b/src/common/oneos-web-approval/config/approvalTypeConfig.ts new file mode 100644 index 0000000..406b6f6 --- /dev/null +++ b/src/common/oneos-web-approval/config/approvalTypeConfig.ts @@ -0,0 +1,71 @@ +import type { ApprovalCardItem, ApprovalStatus, ApprovalTypeKey, StatusFilterValue } from '../types'; + +export interface ApprovalTypeOption { + value: ApprovalTypeKey; + label: string; + shortLabel: string; + color: string; +} + +export const APPROVAL_TYPE_CONFIG: Record = { + parking: { value: 'parking', label: '停车场', shortLabel: '停车场', color: '#6366f1' }, + vehicle_procurement: { value: 'vehicle_procurement', label: '车辆采购', shortLabel: '采购', color: '#8b5cf6' }, + lease: { value: 'lease', label: '租赁合同', shortLabel: '租赁', color: '#2563eb' }, + charter: { value: 'charter', label: '包车合同', shortLabel: '包车', color: '#0ea5e9' }, + transfer: { value: 'transfer', label: '调拨', shortLabel: '调拨', color: '#14b8a6' }, + vehicle_change: { value: 'vehicle_change', label: '异动', shortLabel: '异动', color: '#f59e0b' }, + replacement: { value: 'replacement', label: '替换车', shortLabel: '替换', color: '#f97316' }, + delivery: { value: 'delivery', label: '交车', shortLabel: '交车', color: '#10b981' }, + return_settlement: { value: 'return_settlement', label: '还车应结款', shortLabel: '还车结款', color: '#ef4444' }, + pickup_receivable: { value: 'pickup_receivable', label: '提车应收款', shortLabel: '提车应收', color: '#ec4899' }, + billing: { value: 'billing', label: '租赁账单', shortLabel: '账单', color: '#a855f7' }, + insurance: { value: 'insurance', label: '保险采购', shortLabel: '保险', color: '#22c55e' }, + supplier: { value: 'supplier', label: '供应商准入', shortLabel: '供应商', color: '#64748b' }, + customer_risk: { value: 'customer_risk', label: '客户风险标签', shortLabel: '风险标签', color: '#dc2626' }, + third_party_return: { value: 'third_party_return', label: '三方退租', shortLabel: '退租', color: '#d97706' }, + contract_template: { value: 'contract_template', label: '合同模板', shortLabel: '模板', color: '#7c3aed' }, + annual_inspection: { value: 'annual_inspection', label: '年审', shortLabel: '年审', color: '#0891b2' }, + finance_payment: { value: 'finance_payment', label: '付款申请', shortLabel: '付款', color: '#be185d' }, + clearing: { value: 'clearing', label: '清分结算', shortLabel: '清分', color: '#4f46e5' }, + energy_account: { value: 'energy_account', label: '能源账户', shortLabel: '能源', color: '#059669' }, +}; + +export const APPROVAL_TYPE_OPTIONS = Object.values(APPROVAL_TYPE_CONFIG); + +export const STATUS_OPTIONS: { value: StatusFilterValue; label: string }[] = [ + { value: 'all', label: '全部' }, + { value: 'pending', label: '审批中' }, + { value: 'approved', label: '已通过' }, + { value: 'rejected', label: '已驳回' }, +]; + +const STATUS_LABEL_MAP: Record = { + pending: '审批中', + processing: '审批中', + approved: '已通过', + rejected: '已驳回', +}; + +export function getApprovalTypeLabel(type: ApprovalTypeKey): string { + return APPROVAL_TYPE_CONFIG[type]?.label ?? type; +} + +export function getApprovalTypeColor(type: ApprovalTypeKey): string { + return APPROVAL_TYPE_CONFIG[type]?.color ?? '#64748b'; +} + +export function formatStatusLabel(item: Pick): string { + const base = STATUS_LABEL_MAP[item.status] ?? item.status; + if ((item.status === 'pending' || item.status === 'processing') && item.currentApprover) { + return `审批中:${item.currentApprover}`; + } + return base; +} + +export function matchesStatusFilter(status: ApprovalStatus, filter: StatusFilterValue): boolean { + if (filter === 'all') return true; + if (filter === 'pending') return status === 'pending' || status === 'processing'; + if (filter === 'approved') return status === 'approved'; + if (filter === 'rejected') return status === 'rejected'; + return true; +} diff --git a/src/common/oneos-web-approval/data/mockApprovalCases.ts b/src/common/oneos-web-approval/data/mockApprovalCases.ts new file mode 100644 index 0000000..ffddfef --- /dev/null +++ b/src/common/oneos-web-approval/data/mockApprovalCases.ts @@ -0,0 +1,50 @@ +import type { ApprovalCardItem } from '../types'; +import { CURRENT_USER } from '../types'; + +export const MOCK_APPROVAL_CASES: ApprovalCardItem[] = [ + { + id: 'ac-22', + type: 'lease', + typeLabel: '合同审批', + status: 'rejected', + listTab: 'initiated', + title: '杭州迅达运输有限公司', + subtitle: '杭州城配项目', + keyFacts: [ + { label: '租赁车辆数', value: '5 辆' }, + { label: '租金及服务费合计', value: '192000.00 元' }, + { label: '保证金总额', value: '40000.00 元' }, + { label: '氢气预付款金额', value: '20000.00 元' }, + ], + showInitiatorInFooter: true, + initiatedBy: CURRENT_USER, + initiatedAt: '2026-06-10 14:00', + }, + { + id: 'ac-23', + type: 'insurance', + typeLabel: '保险比价采购', + status: 'processing', + listTab: 'initiated', + title: '沪A51676F', + subtitle: '中选:国元农业保险上海分公司', + keyFacts: [ + { label: '采购险种', value: '商业险' }, + { label: '最终报价', value: '¥1000.00' }, + { label: '保险公司数量', value: '3家' }, + { label: '最晚付费日', value: '2026-08-09' }, + ], + currentApprover: '财务部-赵总', + showInitiatorInFooter: true, + initiatedBy: CURRENT_USER, + initiatedAt: '2026-06-10 14:00', + }, +]; + +export function filterCasesByTab( + cases: ApprovalCardItem[], + tabKey?: string, +): ApprovalCardItem[] { + if (!tabKey) return cases; + return cases.filter((item) => item.listTab === tabKey); +} diff --git a/src/common/oneos-web-approval/pages/ApprovalCenterPage.tsx b/src/common/oneos-web-approval/pages/ApprovalCenterPage.tsx new file mode 100644 index 0000000..e18972e --- /dev/null +++ b/src/common/oneos-web-approval/pages/ApprovalCenterPage.tsx @@ -0,0 +1,156 @@ +import React, { useEffect, useMemo, useState } from 'react'; +import { Input, Select, Tabs } from 'antd'; +import { SearchOutlined } from '@ant-design/icons'; +import type { ApprovalCardItem, ApprovalListTab, ApprovalStatus } from '../types'; +import { ApprovalCardList } from '../components/ApprovalCardList'; +import { ApprovalDetailPlaceholder } from '../components/ApprovalDetailPlaceholder'; +import { + filterCasesByTab, + MOCK_APPROVAL_CASES, +} from '../data/mockApprovalCases'; +import { + APPROVAL_TYPE_OPTIONS, + formatStatusLabel, +} from '../config/approvalTypeConfig'; + +const TAB_ITEMS: { key: ApprovalListTab; label: string }[] = [ + { key: 'todo', label: '我的待办' }, + { key: 'initiated', label: '我发起的' }, + { key: 'done', label: '我的已办' }, + { key: 'cc', label: '我的抄送' }, +]; + +const STATUS_OPTIONS: { value: ApprovalStatus | 'all'; label: string }[] = [ + { value: 'all', label: '全部状态' }, + { value: 'pending', label: '审批中' }, + { value: 'approved', label: '已通过' }, + { value: 'rejected', label: '已驳回' }, +]; + +export interface ApprovalCenterPageProps { + tabKey?: ApprovalListTab; + pageTitle?: string; + showTabs?: boolean; +} + +export function ApprovalCenterPage({ + tabKey = 'todo', + pageTitle, + showTabs = false, +}: ApprovalCenterPageProps) { + const [activeTab, setActiveTab] = useState(tabKey); + const [statusFilter, setStatusFilter] = useState('all'); + const [typeFilter, setTypeFilter] = useState('all'); + const [keyword, setKeyword] = useState(''); + const [selectedId, setSelectedId] = useState(null); + + useEffect(() => { + setActiveTab(tabKey); + }, [tabKey]); + + const tabItems = useMemo(() => { + let list = filterCasesByTab(MOCK_APPROVAL_CASES, activeTab); + + if (statusFilter !== 'all') { + list = list.filter((item) => item.status === statusFilter); + } + if (typeFilter !== 'all') { + list = list.filter((item) => item.type === typeFilter); + } + if (keyword.trim()) { + const q = keyword.trim().toLowerCase(); + list = list.filter( + (item) => + item.title.toLowerCase().includes(q) || + (item.subtitle?.toLowerCase().includes(q) ?? false) || + item.initiatedBy.toLowerCase().includes(q) || + formatStatusLabel(item).toLowerCase().includes(q), + ); + } + return list; + }, [activeTab, statusFilter, typeFilter, keyword]); + + useEffect(() => { + if (tabItems.length === 0) { + setSelectedId(null); + return; + } + if (!selectedId || !tabItems.some((item) => item.id === selectedId)) { + setSelectedId(tabItems[0].id); + } + }, [tabItems, selectedId]); + + const selectedItem = useMemo( + () => tabItems.find((item) => item.id === selectedId) ?? null, + [tabItems, selectedId], + ); + + const handleItemClick = (item: ApprovalCardItem) => { + setSelectedId(item.id); + }; + + const currentTabMeta = TAB_ITEMS.find((t) => t.key === activeTab); + const displayTitle = pageTitle ?? currentTabMeta?.label ?? '审批中心'; + + return ( +
+ {showTabs ? ( +
+ setActiveTab(key as ApprovalListTab)} + items={TAB_ITEMS.map((t) => ({ key: t.key, label: t.label }))} + /> +
+ ) : null} + +
+ + +
+ +
+
+
+ ); +} diff --git a/src/common/oneos-web-approval/styles/index.css b/src/common/oneos-web-approval/styles/index.css new file mode 100644 index 0000000..dbb4288 --- /dev/null +++ b/src/common/oneos-web-approval/styles/index.css @@ -0,0 +1,603 @@ +.ap-page { + --ap-primary: #165dff; + --ap-primary-soft: rgba(22, 93, 255, 0.08); + --ap-border: #e5e7eb; + --ap-surface: #ffffff; + --ap-muted: #64748b; + --ap-text: #0f172a; + --ap-radius: 12px; + --ap-shadow: 0 1px 2px rgba(15, 23, 42, 0.06), 0 4px 16px rgba(15, 23, 42, 0.04); + --ap-sidebar-width: 400px; + display: flex; + flex-direction: column; + height: 100vh; + padding: 0; + background: var(--vm-bg, #f5f7fa); + overflow: hidden; +} + +.ap-page__tabs-bar { + flex-shrink: 0; + padding: 12px 20px 0; + background: var(--ap-surface); + border-bottom: 1px solid var(--ap-border); +} + +.ap-page__tabs-bar .ant-tabs-nav { + margin-bottom: 0; +} + +.ap-page__shell { + display: flex; + flex: 1; + min-height: 0; + gap: 0; +} + +.ap-page__sidebar { + display: flex; + flex-direction: column; + flex-shrink: 0; + width: var(--ap-sidebar-width); + background: var(--ap-surface); + border-right: 1px solid var(--ap-border); + min-height: 0; +} + +.ap-sidebar__head { + flex-shrink: 0; + padding: 20px 16px 12px; + border-bottom: 1px solid #f1f5f9; +} + +.ap-sidebar__title { + margin: 0; + font-size: 18px; + font-weight: 600; + color: var(--ap-text); + line-height: 1.4; +} + +.ap-sidebar__desc { + margin: 4px 0 0; + font-size: 12px; + color: var(--ap-muted); + line-height: 1.5; +} + +.ap-filter { + margin-bottom: 0; +} + +.ap-filter--sidebar { + flex-shrink: 0; + display: flex; + flex-direction: column; + gap: 10px; + padding: 12px 16px; + border-bottom: 1px solid #f1f5f9; +} + +.ap-filter__grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; +} + +.ap-filter__item { + display: flex; + flex-direction: column; + gap: 8px; +} + +.ap-filter__label { + font-size: 13px; + color: var(--ap-muted); + font-weight: 500; +} + +.ap-filter__control { + width: 100%; +} + +.ap-filter__search { + width: 100%; +} + +.ap-sidebar__list { + flex: 1; + min-height: 0; + overflow-y: auto; + padding: 12px; +} + +.ap-sidebar__foot { + flex-shrink: 0; + padding: 10px 16px; + border-top: 1px solid #f1f5f9; + font-size: 12px; + color: var(--ap-muted); + text-align: center; + background: #fafbfc; +} + +.ap-page__detail { + flex: 1; + min-width: 0; + min-height: 0; + overflow: hidden; + background: var(--ap-surface); +} + +.ap-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.ap-list--loading, +.ap-list--empty { + display: flex; + align-items: center; + justify-content: center; + min-height: 200px; + background: transparent; + border: 1px dashed var(--ap-border); + border-radius: var(--ap-radius); +} + +.ap-card { + display: flex; + flex-direction: column; + background: var(--ap-surface); + border: 1px solid var(--ap-border); + border-radius: var(--ap-radius); + box-shadow: var(--ap-shadow); + cursor: pointer; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background-color 0.2s ease; + overflow: hidden; + position: relative; +} + +.ap-card:hover, +.ap-card:focus-visible { + border-color: rgba(22, 93, 255, 0.35); + box-shadow: 0 4px 16px rgba(22, 93, 255, 0.08); + outline: none; +} + +.ap-card--selected { + border-color: rgba(22, 93, 255, 0.5); + background: var(--ap-primary-soft); + box-shadow: 0 4px 16px rgba(22, 93, 255, 0.1); +} + +.ap-card--selected::before { + content: ''; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 3px; + background: var(--ap-primary); + border-radius: var(--ap-radius) 0 0 var(--ap-radius); +} + +.ap-card__header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 14px 16px 0; +} + +.ap-card__type { + display: inline-flex; + align-items: center; + padding: 2px 10px; + border-radius: 999px; + border: 1px solid transparent; + font-size: 12px; + font-weight: 600; + line-height: 20px; +} + +.ap-status { + font-size: 12px; + font-weight: 600; + line-height: 20px; +} + +.ap-status--pending { + color: #d97706; +} + +.ap-status--approved { + color: #16a34a; +} + +.ap-status--rejected { + color: #dc2626; +} + +.ap-card__body { + flex: 1; + padding: 12px 16px 0; +} + +.ap-card__title { + margin: 0; + font-size: 16px; + font-weight: 600; + color: var(--ap-text); + line-height: 1.45; +} + +.ap-card__subtitle { + margin: 6px 0 0; + font-size: 13px; + color: var(--ap-muted); + line-height: 1.5; +} + +.ap-card__facts { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px 12px; + margin: 14px 0 0; + padding: 12px; + border-radius: 10px; + background: #f8fafc; +} + +.ap-card--selected .ap-card__facts { + background: rgba(255, 255, 255, 0.7); +} + +.ap-card__fact { + min-width: 0; +} + +.ap-card__fact dt { + margin: 0; + font-size: 12px; + color: var(--ap-muted); + line-height: 1.4; +} + +.ap-card__fact dd { + margin: 4px 0 0; + font-size: 13px; + color: var(--ap-text); + font-weight: 500; + line-height: 1.45; + word-break: break-word; +} + +.ap-card__fact-value--emphasis { + color: var(--ap-primary); + font-weight: 700; +} + +.ap-card__risks { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-top: 12px; +} + +.ap-card__risk { + display: inline-flex; + align-items: center; + padding: 2px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 500; + background: #fff7ed; + color: #c2410c; + border: 1px solid #fed7aa; +} + +.ap-card__risk--high { + background: #fef2f2; + color: #b91c1c; + border-color: #fecaca; +} + +.ap-card__risk--medium { + background: #fffbeb; + color: #b45309; + border-color: #fde68a; +} + +.ap-card__footer { + display: flex; + align-items: flex-end; + justify-content: space-between; + gap: 12px; + margin-top: 10px; + padding: 8px 16px 10px; + border-top: 1px solid #f1f5f9; +} + +.ap-card__footer-meta { + display: flex; + flex-direction: column; + gap: 2px; +} + +.ap-card__footer-text { + font-size: 12px; + color: var(--ap-muted); + line-height: 1.4; +} + +.ap-card__action { + display: inline-flex; + align-items: center; + gap: 4px; + font-size: 12px; + font-weight: 600; + color: var(--ap-primary); + line-height: 1.4; + flex-shrink: 0; +} + +/* Detail panel */ +.ap-detail { + display: flex; + flex-direction: column; + height: 100%; + min-height: 0; +} + +.ap-detail--empty { + align-items: center; + justify-content: center; +} + +.ap-detail__toolbar { + display: flex; + align-items: center; + justify-content: space-between; + flex-shrink: 0; + padding: 12px 24px; + border-bottom: 1px solid #f1f5f9; +} + +.ap-detail__header { + flex-shrink: 0; + padding: 20px 24px 0; +} + +.ap-detail__header-main { + display: flex; + align-items: flex-start; + gap: 12px; + flex-wrap: wrap; +} + +.ap-detail__title { + margin: 0 !important; + flex: 1; + min-width: 0; +} + +.ap-detail__badge { + flex-shrink: 0; + display: inline-flex; + align-items: center; + padding: 2px 10px; + border-radius: 999px; + font-size: 12px; + font-weight: 600; + line-height: 20px; +} + +.ap-detail__badge--pending { + background: #fff7ed; + color: #d97706; +} + +.ap-detail__badge--approved { + background: #f0fdf4; + color: #16a34a; +} + +.ap-detail__badge--rejected { + background: #fef2f2; + color: #dc2626; +} + +.ap-detail__meta { + margin-top: 12px; + padding-bottom: 4px; +} + +.ap-detail__tabs { + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + padding: 0 24px; +} + +.ap-detail__tabs .ant-tabs-content-holder { + flex: 1; + min-height: 0; + overflow-y: auto; +} + +.ap-detail__tabs .ant-tabs-content { + height: 100%; +} + +.ap-detail__content { + padding: 8px 0 24px; +} + +.ap-detail__subtitle { + margin: 0 0 16px; + color: var(--ap-muted); + font-size: 14px; +} + +.ap-detail__facts { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px 16px; + margin: 0 0 16px; + padding: 16px; + border-radius: 10px; + background: #f8fafc; +} + +.ap-detail__fact dt { + margin: 0; + font-size: 12px; + color: var(--ap-muted); +} + +.ap-detail__fact dd { + margin: 4px 0 0; + font-size: 14px; + color: var(--ap-text); + font-weight: 500; +} + +.ap-detail__fact-value--emphasis { + color: var(--ap-primary); + font-weight: 700; +} + +.ap-detail__risks { + display: flex; + flex-wrap: wrap; + gap: 8px; + margin-bottom: 20px; +} + +.ap-detail__timeline-section { + margin-top: 8px; +} + +.ap-detail__section-title { + display: block; + margin-bottom: 16px; +} + +.ap-detail__timeline { + margin-top: 8px; +} + +.ap-detail__timeline-item { + padding-bottom: 4px; +} + +.ap-detail__timeline-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; +} + +.ap-detail__timeline-time { + font-size: 12px; +} + +.ap-detail__flow-placeholder { + display: flex; + align-items: center; + justify-content: center; + min-height: 280px; +} + +.ap-detail__actions { + flex-shrink: 0; + display: flex; + justify-content: flex-end; + gap: 8px; + padding: 12px 24px 20px; + border-top: 1px solid #f1f5f9; + background: var(--ap-surface); +} + +.ap-insurance-summary { + width: 100%; + border-collapse: collapse; + margin-bottom: 20px; + border: 1px solid var(--ap-border); + border-radius: 8px; + overflow: hidden; + font-size: 13px; +} + +.ap-insurance-summary th, +.ap-insurance-summary td { + padding: 10px 14px; + border: 1px solid #f1f5f9; + vertical-align: middle; +} + +.ap-insurance-summary th { + width: 14%; + background: #fafbfc; + color: var(--ap-muted); + font-weight: 500; + text-align: left; +} + +.ap-insurance-summary td { + width: 36%; + color: var(--ap-text); +} + +.ap-insurance-table-section { + margin-top: 8px; +} + +.ap-insurance-table .ant-table, +.ap-insurance-quote-table .ant-table { + font-size: 13px; +} + +.ap-insurance-quote-table { + margin: 0; + background: #fafbfc; +} + +.ap-insurance-quote-table .ant-table-thead > tr > th { + background: #f1f5f9; +} + +@media (max-width: 960px) { + .ap-page { + height: auto; + min-height: 100vh; + overflow: auto; + } + + .ap-page__shell { + flex-direction: column; + } + + .ap-page__sidebar { + width: 100%; + max-height: 50vh; + border-right: none; + border-bottom: 1px solid var(--ap-border); + } + + .ap-page__detail { + min-height: 50vh; + } + + .ap-filter__grid { + grid-template-columns: 1fr; + } + + .ap-detail__facts { + grid-template-columns: 1fr; + } +} diff --git a/src/common/oneos-web-approval/types.ts b/src/common/oneos-web-approval/types.ts new file mode 100644 index 0000000..6d8bbdc --- /dev/null +++ b/src/common/oneos-web-approval/types.ts @@ -0,0 +1,73 @@ +export type ApprovalStatus = 'pending' | 'processing' | 'approved' | 'rejected'; + +export type ApprovalTabKey = 'todo' | 'done' | 'initiated' | 'cc'; + +export type ApprovalTypeKey = + | 'parking' + | 'vehicle_procurement' + | 'lease' + | 'charter' + | 'transfer' + | 'vehicle_change' + | 'replacement' + | 'delivery' + | 'return_settlement' + | 'pickup_receivable' + | 'billing' + | 'insurance' + | 'supplier' + | 'customer_risk' + | 'third_party_return' + | 'contract_template' + | 'annual_inspection' + | 'finance_payment' + | 'clearing' + | 'energy_account'; + +export type ApprovalListTab = ApprovalTabKey; + +export interface ApprovalKeyFact { + label: string; + value: string; + emphasis?: boolean; +} + +export interface ApprovalRisk { + label: string; + level?: 'high' | 'medium' | 'low'; +} + +export interface ApprovalCardItem { + id: string; + type: ApprovalTypeKey; + status: ApprovalStatus; + listTab: ApprovalListTab; + title: string; + subtitle?: string; + keyFacts?: ApprovalKeyFact[]; + risks?: ApprovalRisk[]; + currentApprover?: string; + initiatedBy: string; + initiatedAt: string; + typeLabel?: string; + footerText?: string; + showInitiatorInFooter?: boolean; + ccUsers?: string[]; + handledBy?: string; +} + +export const CURRENT_USER = '张明辉'; + +export type StatusFilterValue = 'all' | 'pending' | 'approved' | 'rejected'; + +export interface ApprovalFilters { + status: StatusFilterValue; + type: ApprovalTypeKey | 'all'; + keyword: string; +} + +export const EMPTY_APPROVAL_FILTERS: ApprovalFilters = { + status: 'all', + type: 'all', + keyword: '', +}; diff --git a/src/prototypes/oneos-prototype-nav/nav-menu.json b/src/prototypes/oneos-prototype-nav/nav-menu.json index d646d72..e5bb4c6 100644 --- a/src/prototypes/oneos-prototype-nav/nav-menu.json +++ b/src/prototypes/oneos-prototype-nav/nav-menu.json @@ -11,6 +11,37 @@ "title": "工作台", "itemKey": "prototypes/oneos-web-workbench" }, + { + "id": "folder-oneos-approval", + "kind": "folder", + "title": "审批中心", + "children": [ + { + "id": "item:prototypes:oneos-web-approval-initiated", + "kind": "item", + "title": "我发起的", + "itemKey": "prototypes/oneos-web-approval-initiated" + }, + { + "id": "item:prototypes:oneos-web-approval-todo", + "kind": "item", + "title": "我的待办", + "itemKey": "prototypes/oneos-web-approval-todo" + }, + { + "id": "item:prototypes:oneos-web-approval-done", + "kind": "item", + "title": "我的已办", + "itemKey": "prototypes/oneos-web-approval-done" + }, + { + "id": "item:prototypes:oneos-web-approval-cc", + "kind": "item", + "title": "我的抄送", + "itemKey": "prototypes/oneos-web-approval-cc" + } + ] + }, { "id": "folder-1782874599304-roj8fd", "kind": "folder", diff --git a/src/prototypes/oneos-prototype-nav/prototype-registry.json b/src/prototypes/oneos-prototype-nav/prototype-registry.json index 21159ac..ad3ed0a 100644 --- a/src/prototypes/oneos-prototype-nav/prototype-registry.json +++ b/src/prototypes/oneos-prototype-nav/prototype-registry.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-07-14T21:21:56.448Z", + "updatedAt": "2026-07-16T01:04:29.814Z", "prototypes": { "oneos-web-workbench": { "title": "工作台", @@ -3688,10 +3688,10 @@ }, "oneos-prototype-nav": { "title": "oneos-prototype-nav", - "version": "v1.5", - "revision": 5, - "lastUpdated": "2026-07-14T21:21:56.445Z", - "contentHash": "b422bb06fbff539d5519aff93209c84331cf4e503733a2b3e149ae9425b00056", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-16T01:04:20.841Z", + "contentHash": "93cb00f068ce0fb8e6b47f82419f13fc51c0bb2cd2a660b9d4f7bac3357f75b3", "trackedFiles": [ ".spec/prototype-comments.json", "index.tsx", @@ -3701,6 +3701,20 @@ "xll-nav-source.json" ], "changelog": [ + { + "version": "v1.6", + "date": "2026-07-16", + "time": "09:04", + "summary": "合并远程审批中心:保留加氢订单/记录与数量统计,同步导航注册表", + "files": [ + ".spec/prototype-comments.json", + "index.tsx", + "nav-data.ts", + "style.css", + "xll-nav-menu.json", + "xll-nav-source.json" + ] + }, { "version": "v1.5", "date": "2026-07-15", @@ -6959,735 +6973,897 @@ ] } ] + }, + "oneos-web-approval": { + "title": "oneos-web-approval", + "version": "v1.17", + "revision": 17, + "lastUpdated": "2026-07-16T01:04:28.186Z", + "contentHash": "d54f9542ce8e8bf62137245386bf33016140cbbe6e78243322c6a23130ae83fa", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [ + { + "version": "v1.17", + "date": "2026-07-16", + "time": "09:04", + "summary": "同步审批中心注册", + "files": [ + "index.tsx" + ] + }, + { + "version": "v1.16", + "date": "2026-07-14", + "time": "14:17", + "summary": "更新页面逻辑与交互", + "files": [ + ".spec/prototype-comments.json", + "index.tsx" + ] + }, + { + "version": "v1.15", + "date": "2026-07-14", + "time": "14:09", + "summary": "更新页面逻辑与交互", + "files": [ + "ApprovalApp.tsx" + ] + }, + { + "version": "v1.14", + "date": "2026-07-14", + "time": "14:03", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.13", + "date": "2026-07-14", + "time": "14:03", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.12", + "date": "2026-07-14", + "time": "13:59", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.11", + "date": "2026-07-14", + "time": "13:55", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.10", + "date": "2026-07-14", + "time": "13:54", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.9", + "date": "2026-07-14", + "time": "13:19", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.8", + "date": "2026-07-14", + "time": "10:58", + "summary": "更新页面样式", + "files": [ + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.7", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面样式", + "files": [ + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "version": "v1.6", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css" + ] + }, + { + "version": "v1.5", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面逻辑与交互", + "files": [ + "components/ApprovalDetailPlaceholder.tsx" + ] + }, + { + "version": "v1.4", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面逻辑与交互", + "files": [ + "components/ApprovalCardList.tsx" + ] + }, + { + "version": "v1.3", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面逻辑与交互", + "files": [ + "components/ApprovalCard.tsx" + ] + }, + { + "version": "v1.2", + "date": "2026-07-14", + "time": "10:55", + "summary": "更新 mockApprovalCases.ts", + "files": [ + "data/mockApprovalCases.ts" + ] + }, + { + "version": "v1.1", + "date": "2026-07-14", + "time": "10:55", + "summary": "更新 approvalTypeConfig.ts", + "files": [ + "config/approvalTypeConfig.ts" + ] + } + ] + }, + "oneos-web-approval-initiated": { + "title": "我发起的", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-16T01:04:29.438Z", + "contentHash": "3fba821920f13c7fff1e25a0da4c8a905a733197fae9f50ceca853525580f9f7", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [ + { + "version": "v1.1", + "date": "2026-07-16", + "time": "09:04", + "summary": "同步我发起的注册", + "files": [ + "index.tsx" + ] + } + ] + }, + "oneos-web-approval-cc": { + "title": "我的抄送", + "version": "v1.1", + "revision": 1, + "lastUpdated": "2026-07-16T01:04:29.814Z", + "contentHash": "4d0ea26865ca537c9227a99441ff1e552c7f0d1df05ae1c995287123a72b1090", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [ + { + "version": "v1.1", + "date": "2026-07-16", + "time": "09:04", + "summary": "同步我的抄送注册", + "files": [ + "index.tsx" + ] + } + ] + }, + "oneos-web-approval-todo": { + "title": "我的待办", + "version": "v1.0", + "revision": 0, + "lastUpdated": "2026-07-16T01:04:28.611Z", + "contentHash": "5766a14e5522689fbc89ca50891095a00672ea52c596ad00f0f9151c9ce1f3ba", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [] + }, + "oneos-web-approval-done": { + "title": "我的已办", + "version": "v1.0", + "revision": 0, + "lastUpdated": "2026-07-16T01:04:29.023Z", + "contentHash": "a1e94700ad17be8996ba2bed95a12a975a7ead4fd640326d5742d74d06f9782a", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [] } }, "recentUpdates": [ { - "prototypeId": "oneos-prototype-nav", - "title": "oneos-prototype-nav", - "version": "v1.5", - "date": "2026-07-15", - "time": "05:21", - "summary": "同步加氢站管理导航与加氢记录/订单变更", + "prototypeId": "oneos-web-approval-cc", + "title": "我的抄送", + "version": "v1.1", + "date": "2026-07-16", + "time": "09:04", + "summary": "同步我的抄送注册", "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "nav-data.ts", - "style.css", - "xll-nav-menu.json", - "xll-nav-source.json" + "index.tsx" ] }, { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.19", - "date": "2026-07-15", - "time": "05:21", - "summary": "Web加氢记录字段与H5订单对齐:同Store/对账口径;保留导出与预约加氢", + "prototypeId": "oneos-web-approval-initiated", + "title": "我发起的", + "version": "v1.1", + "date": "2026-07-16", + "time": "09:04", + "summary": "同步我发起的注册", "files": [ - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" + "index.tsx" ] }, { - "prototypeId": "oneos-prototype-nav", - "title": "oneos-prototype-nav", - "version": "v1.4", - "date": "2026-07-15", - "time": "05:20", - "summary": "同步加氢站管理:站点信息/加氢订单/加氢记录导航与变更", - "files": [ - ".spec/prototype-comments.json", - "index.tsx", - "nav-data.ts", - "style.css", - "xll-nav-menu.json", - "xll-nav-source.json" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.32", - "date": "2026-07-15", - "time": "05:20", - "summary": "H5加氢订单与Web加氢记录同源数据;站端上报与对账联动", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.18", - "date": "2026-07-14", - "time": "23:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/record-data-model.md", - ".spec/requirements-prd.md", - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", "version": "v1.17", - "date": "2026-07-14", - "time": "23:49", - "summary": "更新需求说明与标注", + "date": "2026-07-16", + "time": "09:04", + "summary": "同步审批中心注册", "files": [ - ".spec/record-data-model.md", - ".spec/requirements-prd.md" + "index.tsx" ] }, { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.16", - "date": "2026-07-14", - "time": "23:47", - "summary": "更新页面样式", + "prototypeId": "oneos-prototype-nav", + "title": "oneos-prototype-nav", + "version": "v1.6", + "date": "2026-07-16", + "time": "09:04", + "summary": "合并远程审批中心:保留加氢订单/记录与数量统计,同步导航注册表", "files": [ + ".spec/prototype-comments.json", "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" + "nav-data.ts", + "style.css", + "xll-nav-menu.json", + "xll-nav-source.json" ] }, { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.15", - "date": "2026-07-14", - "time": "23:47", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.14", - "date": "2026-07-14", - "time": "23:46", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.13", - "date": "2026-07-14", - "time": "23:45", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.12", - "date": "2026-07-14", - "time": "23:44", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.11", - "date": "2026-07-14", - "time": "23:44", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.31", - "date": "2026-07-14", - "time": "23:28", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.30", - "date": "2026-07-14", - "time": "23:28", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.29", - "date": "2026-07-14", - "time": "23:28", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.28", - "date": "2026-07-14", - "time": "23:27", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.27", - "date": "2026-07-14", - "time": "23:25", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.26", - "date": "2026-07-14", - "time": "23:25", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.25", - "date": "2026-07-14", - "time": "23:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.24", - "date": "2026-07-14", - "time": "23:24", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.23", - "date": "2026-07-14", - "time": "23:23", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/Icons.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.22", - "date": "2026-07-14", - "time": "23:23", + "prototypeId": "oneos-web-workbench", + "title": "工作台", + "version": "v1.6", + "date": "2026-07-15", + "time": "08:51", "summary": "更新页面逻辑与交互", "files": [ - "components/Icons.tsx" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.21", - "date": "2026-07-14", - "time": "23:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" + "pages/01-工作台.jsx" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.20", - "date": "2026-07-14", - "time": "23:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.19", - "date": "2026-07-14", - "time": "23:22", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.18", - "date": "2026-07-14", - "time": "23:21", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", - "version": "v1.17", - "date": "2026-07-14", - "time": "23:18", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", "version": "v1.16", "date": "2026-07-14", - "time": "23:17", - "summary": "更新需求说明与标注", + "time": "14:17", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" + ".spec/prototype-comments.json", + "index.tsx" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.15", "date": "2026-07-14", - "time": "23:17", - "summary": "更新需求说明与标注", + "time": "14:09", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" + "ApprovalApp.tsx" ] }, { - "prototypeId": "oneos-web-h2-station", - "title": "加氢记录", - "version": "v1.10", - "date": "2026-07-14", - "time": "23:15", - "summary": "更新页面样式", - "files": [ - "index.tsx", - "pages/01-加氢订单.jsx", - "pages/02-加氢记录.jsx", - "pages/03-站点信息.jsx", - "styles/h2-station-vm-filter.css" - ] - }, - { - "prototypeId": "oneos-h5-h2-order", - "title": "加氢订单", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.14", "date": "2026-07-14", - "time": "23:09", - "summary": "更新需求说明与标注", - "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", - "index.tsx", - "styles/index.css", - "types.ts", - "utils/format.ts" - ] - }, - { - "prototypeId": "lease-business-line-overview", - "title": "业务条线说明", - "version": "v1.6", - "date": "2026-07-14", - "time": "23:09", + "time": "14:03", "summary": "更新页面样式", "files": [ ".spec/prototype-comments.json", - "data-foundations.ts", - "hooks.ts", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", "index.tsx", - "lines.ts", - "style.css" + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.13", "date": "2026-07-14", - "time": "23:09", - "summary": "更新需求说明与标注", + "time": "14:03", + "summary": "更新页面样式", "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", "index.tsx", + "pages/ApprovalCenterPage.tsx", "styles/index.css", - "types.ts", - "utils/format.ts" + "types.ts" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.12", "date": "2026-07-14", - "time": "23:08", - "summary": "更新需求说明与标注", + "time": "13:59", + "summary": "更新页面样式", "files": [ - ".spec/reconcile-linkage.md", - ".spec/requirements-prd.md" + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.11", "date": "2026-07-14", - "time": "23:07", - "summary": "更新需求说明与标注", + "time": "13:55", + "summary": "更新页面样式", "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", "index.tsx", + "pages/ApprovalCenterPage.tsx", "styles/index.css", - "types.ts", - "utils/format.ts", - "utils/ocr-mock.ts", - "utils/orders.ts" + "types.ts" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.10", "date": "2026-07-14", - "time": "23:07", - "summary": "更新需求说明与标注", + "time": "13:54", + "summary": "更新页面样式", "files": [ - ".spec/2026-07-14-implementation-plan.md", - ".spec/2026-07-14-requirements-design.md", - "components/CreateWizard.tsx", - "components/OrderCard.tsx", - "components/OrderDetail.tsx", - "components/PhoneShell.tsx", + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", "index.tsx", + "pages/ApprovalCenterPage.tsx", "styles/index.css", - "types.ts", - "utils/format.ts", - "utils/ocr-mock.ts", - "utils/orders.ts" + "types.ts" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", + "prototypeId": "oneos-web-approval", + "title": "审批中心", "version": "v1.9", "date": "2026-07-14", - "time": "23:07", + "time": "13:19", + "summary": "更新页面样式", + "files": [ + ".spec/prototype-comments.json", + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "version": "v1.8", + "date": "2026-07-14", + "time": "10:58", + "summary": "更新页面样式", + "files": [ + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "prototypeId": "oneos-web-workbench", + "title": "工作台", + "version": "v1.5", + "date": "2026-07-14", + "time": "10:58", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx", + "pages/01-工作台.jsx" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.7", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面样式", + "files": [ + "components/ApprovalCard.tsx", + "components/ApprovalCardList.tsx", + "components/ApprovalDetailPlaceholder.tsx", + "config/approvalTypeConfig.ts", + "data/mockApprovalCases.ts", + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css", + "types.ts" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.6", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/ApprovalCenterPage.tsx", + "styles/index.css" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.5", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面逻辑与交互", + "files": [ + "components/ApprovalDetailPlaceholder.tsx" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.4", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面逻辑与交互", + "files": [ + "components/ApprovalCardList.tsx" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.3", + "date": "2026-07-14", + "time": "10:56", + "summary": "更新页面逻辑与交互", + "files": [ + "components/ApprovalCard.tsx" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.2", + "date": "2026-07-14", + "time": "10:55", + "summary": "更新 mockApprovalCases.ts", + "files": [ + "data/mockApprovalCases.ts" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.1", + "date": "2026-07-14", + "time": "10:55", + "summary": "更新 approvalTypeConfig.ts", + "files": [ + "config/approvalTypeConfig.ts" + ] + }, + { + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.6", + "date": "2026-07-13", + "time": "15:20", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" + ] + }, + { + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.5", + "date": "2026-07-13", + "time": "15:20", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" + ] + }, + { + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.4", + "date": "2026-07-13", + "time": "15:19", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" + ] + }, + { + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.3", + "date": "2026-07-13", + "time": "15:18", "summary": "更新页面逻辑与交互", "files": [ "index.tsx" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", - "version": "v1.8", - "date": "2026-07-14", - "time": "23:07", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.2", + "date": "2026-07-13", + "time": "15:18", "summary": "更新页面逻辑与交互", "files": [ - "components/OrderDetail.tsx" + "pages/01-加氢站分析.jsx" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", - "version": "v1.7", - "date": "2026-07-14", - "time": "23:06", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.1", + "date": "2026-07-13", + "time": "15:18", "summary": "更新页面逻辑与交互", "files": [ - "components/CreateWizard.tsx" + "shared/h2-analysis-charts.jsx" ] }, { - "prototypeId": "oneos-h5-h2-order", - "title": "oneos-h5-h2-order", - "version": "v1.6", - "date": "2026-07-14", - "time": "23:06", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.46", + "date": "2026-07-13", + "time": "14:55", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "shared/h2-station-view-shared.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.45", + "date": "2026-07-13", + "time": "14:55", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "shared/h2-station-view-shared.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.44", + "date": "2026-07-13", + "time": "14:55", "summary": "更新页面逻辑与交互", "files": [ - "components/OrderCard.tsx" + "shared/h2-station-view-shared.jsx" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.43", + "date": "2026-07-13", + "time": "14:30", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.42", + "date": "2026-07-13", + "time": "14:30", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.41", + "date": "2026-07-13", + "time": "14:30", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.40", + "date": "2026-07-13", + "time": "14:30", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.39", + "date": "2026-07-13", + "time": "14:30", + "summary": "更新需求说明与标注", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.38", + "date": "2026-07-13", + "time": "14:29", + "summary": "更新需求说明与标注", + "files": [ + "pages/站点周报统计-需求内容.js" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.37", + "date": "2026-07-13", + "time": "13:50", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.36", + "date": "2026-07-13", + "time": "13:50", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.35", + "date": "2026-07-13", + "time": "13:50", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] } ] diff --git a/src/prototypes/oneos-prototype-nav/xll-nav-menu.json b/src/prototypes/oneos-prototype-nav/xll-nav-menu.json index 5f73b90..5d6f5f2 100644 --- a/src/prototypes/oneos-prototype-nav/xll-nav-menu.json +++ b/src/prototypes/oneos-prototype-nav/xll-nav-menu.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-07-14T21:21:56.182Z", + "updatedAt": "2026-07-16T01:04:29.807Z", "title": "小羚羚", "sectionId": "folder-prototypes-xll-miniapp", "description": "氢能车辆运营移动端原型;菜单与小羚羚「小程序」项目目录同步。", diff --git a/src/prototypes/oneos-web-approval-cc/index.tsx b/src/prototypes/oneos-web-approval-cc/index.tsx new file mode 100644 index 0000000..3e49269 --- /dev/null +++ b/src/prototypes/oneos-web-approval-cc/index.tsx @@ -0,0 +1,8 @@ +/** + * @name 我的抄送 + */ +import { ApprovalApp } from '../../common/oneos-web-approval/ApprovalApp'; + +export default function OneosWebApprovalCc() { + return ; +} diff --git a/src/prototypes/oneos-web-approval-done/index.tsx b/src/prototypes/oneos-web-approval-done/index.tsx new file mode 100644 index 0000000..abf4cd8 --- /dev/null +++ b/src/prototypes/oneos-web-approval-done/index.tsx @@ -0,0 +1,8 @@ +/** + * @name 我的已办 + */ +import { ApprovalApp } from '../../common/oneos-web-approval/ApprovalApp'; + +export default function OneosWebApprovalDone() { + return ; +} diff --git a/src/prototypes/oneos-web-approval-initiated/index.tsx b/src/prototypes/oneos-web-approval-initiated/index.tsx new file mode 100644 index 0000000..10cb134 --- /dev/null +++ b/src/prototypes/oneos-web-approval-initiated/index.tsx @@ -0,0 +1,8 @@ +/** + * @name 我发起的 + */ +import { ApprovalApp } from '../../common/oneos-web-approval/ApprovalApp'; + +export default function OneosWebApprovalInitiated() { + return ; +} diff --git a/src/prototypes/oneos-web-approval-todo/index.tsx b/src/prototypes/oneos-web-approval-todo/index.tsx new file mode 100644 index 0000000..f9a2bc6 --- /dev/null +++ b/src/prototypes/oneos-web-approval-todo/index.tsx @@ -0,0 +1,8 @@ +/** + * @name 我的待办 + */ +import { ApprovalApp } from '../../common/oneos-web-approval/ApprovalApp'; + +export default function OneosWebApprovalTodo() { + return ; +} diff --git a/src/prototypes/oneos-web-approval/index.tsx b/src/prototypes/oneos-web-approval/index.tsx new file mode 100644 index 0000000..2d4ce6a --- /dev/null +++ b/src/prototypes/oneos-web-approval/index.tsx @@ -0,0 +1,8 @@ +/** + * @name 审批中心 + */ +import { ApprovalApp } from '../../common/oneos-web-approval/ApprovalApp'; + +export default function OneosWebApproval() { + return ; +}