From 6971529cd75141f557bbefb32b39da7574cba503 Mon Sep 17 00:00:00 2001 From: hsu06 Date: Wed, 15 Jul 2026 08:55:49 +0800 Subject: [PATCH] feat: add approval center module with split layout and nav registration --- .axhub/make/sidebar-tree.json | 39 +- scripts/sync-oneos-web-prototypes.mjs | 6 + src/common/oneos-web-approval/ApprovalApp.tsx | 57 + .../components/ApprovalCard.tsx | 96 + .../components/ApprovalCardList.tsx | 47 + .../components/ApprovalDetailPlaceholder.tsx | 193 ++ .../components/InsuranceComparisonDetail.tsx | 266 +++ .../config/approvalTypeConfig.ts | 71 + .../data/mockApprovalCases.ts | 50 + .../pages/ApprovalCenterPage.tsx | 156 ++ .../oneos-web-approval/styles/index.css | 603 +++++ src/common/oneos-web-approval/types.ts | 73 + .../oneos-prototype-nav/nav-menu.json | 56 + .../prototype-registry.json | 2057 +++++++++++------ .../oneos-web-approval-cc/index.tsx | 8 + .../oneos-web-approval-done/index.tsx | 8 + .../oneos-web-approval-initiated/index.tsx | 8 + .../oneos-web-approval-todo/index.tsx | 8 + src/prototypes/oneos-web-approval/index.tsx | 8 + 19 files changed, 3046 insertions(+), 764 deletions(-) create mode 100644 src/common/oneos-web-approval/ApprovalApp.tsx create mode 100644 src/common/oneos-web-approval/components/ApprovalCard.tsx create mode 100644 src/common/oneos-web-approval/components/ApprovalCardList.tsx create mode 100644 src/common/oneos-web-approval/components/ApprovalDetailPlaceholder.tsx create mode 100644 src/common/oneos-web-approval/components/InsuranceComparisonDetail.tsx create mode 100644 src/common/oneos-web-approval/config/approvalTypeConfig.ts create mode 100644 src/common/oneos-web-approval/data/mockApprovalCases.ts create mode 100644 src/common/oneos-web-approval/pages/ApprovalCenterPage.tsx create mode 100644 src/common/oneos-web-approval/styles/index.css create mode 100644 src/common/oneos-web-approval/types.ts create mode 100644 src/prototypes/oneos-web-approval-cc/index.tsx create mode 100644 src/prototypes/oneos-web-approval-done/index.tsx create mode 100644 src/prototypes/oneos-web-approval-initiated/index.tsx create mode 100644 src/prototypes/oneos-web-approval-todo/index.tsx create mode 100644 src/prototypes/oneos-web-approval/index.tsx diff --git a/.axhub/make/sidebar-tree.json b/.axhub/make/sidebar-tree.json index b933e97..98ddeb1 100644 --- a/.axhub/make/sidebar-tree.json +++ b/.axhub/make/sidebar-tree.json @@ -1,6 +1,6 @@ { "version": 1, - "updatedAt": "2026-07-12T17:06:54.186Z", + "updatedAt": "2026-07-15T00:52:00.000Z", "prototypes": [ { "id": "folder-1783875936186-27raza", @@ -86,6 +86,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", @@ -153,6 +184,12 @@ "kind": "item", "title": "站点信息", "itemKey": "prototypes/oneos-web-h2-station-site" + }, + { + "id": "item:prototypes:oneos-web-h2-station-weekly", + "kind": "item", + "title": "站点周报统计", + "itemKey": "prototypes/oneos-web-h2-station-weekly" } ] }, diff --git a/scripts/sync-oneos-web-prototypes.mjs b/scripts/sync-oneos-web-prototypes.mjs index ce65f60..f7d32e9 100644 --- a/scripts/sync-oneos-web-prototypes.mjs +++ b/scripts/sync-oneos-web-prototypes.mjs @@ -25,8 +25,14 @@ const STANDALONE_MODULES = [ { slug: 'business-dept-ledger', title: '业务部台账', skipCodegen: true }, { slug: 'vehicle-maintenance-ledger', title: '车辆维修明细', skipCodegen: true }, { slug: 'oneos-web-h2-station-site', title: '站点信息', skipCodegen: true }, + { slug: 'oneos-web-h2-station-weekly', 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 f114a66..993cfc1 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", @@ -78,6 +109,12 @@ "kind": "item", "title": "站点信息", "itemKey": "prototypes/oneos-web-h2-station-site" + }, + { + "id": "item:prototypes:oneos-web-h2-station-weekly", + "kind": "item", + "title": "站点周报统计", + "itemKey": "prototypes/oneos-web-h2-station-weekly" } ] }, @@ -161,6 +198,25 @@ "itemKey": "prototypes/vehicle-return-settlement-v2" } ] + }, + { + "id": "folder-1783875880945-4r6tq1", + "kind": "folder", + "title": "任务工单", + "children": [ + { + "id": "item:prototypes:task-work-order", + "kind": "item", + "title": "任务工单", + "itemKey": "prototypes/task-work-order" + } + ] + }, + { + "id": "item:prototypes:lease-business-line-overview", + "kind": "item", + "title": "业务条线说明", + "itemKey": "prototypes/lease-business-line-overview" } ] } diff --git a/src/prototypes/oneos-prototype-nav/prototype-registry.json b/src/prototypes/oneos-prototype-nav/prototype-registry.json index 7a742cd..8bbaebc 100644 --- a/src/prototypes/oneos-prototype-nav/prototype-registry.json +++ b/src/prototypes/oneos-prototype-nav/prototype-registry.json @@ -1,18 +1,38 @@ { "version": 1, - "updatedAt": "2026-07-13T01:31:56.619Z", + "updatedAt": "2026-07-15T00:51:55.977Z", "prototypes": { "oneos-web-workbench": { "title": "工作台", - "version": "v1.4", - "revision": 4, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "3d7954b2ad60057932b8a0b25e645a83ef0ff1b5fe3db37d1a25382810e29126", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-15T00:51:55.976Z", + "contentHash": "278a917e174783edccc1915cfa757bdfdf8fc81e83c9e42e31e7ed99811d5b4b", "trackedFiles": [ "index.tsx", "pages/01-工作台.jsx" ], "changelog": [ + { + "version": "v1.6", + "date": "2026-07-15", + "time": "08:51", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx", + "pages/01-工作台.jsx" + ] + }, + { + "version": "v1.5", + "date": "2026-07-14", + "time": "10:58", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx", + "pages/01-工作台.jsx" + ] + }, { "version": "v1.4", "date": "2026-07-12", @@ -444,11 +464,13 @@ }, "supplier-management": { "title": "供应商管理", - "version": "v1.5", - "revision": 5, - "lastUpdated": "2026-07-13T01:31:56.619Z", - "contentHash": "94e568a299b24aa7e59d17185bd2bc95e4dafb447fb521bf3ca937046a849486", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-13T04:59:56.469Z", + "contentHash": "1ed2c828156b908e834d6b346e149d94e34c80eff52985fcba277c115d37cf1c", "trackedFiles": [ + ".spec/acp/conversations.json", + ".spec/prototype-comments.json", ".spec/prototype-review.md", "components/BankAccountConfirmModal.tsx", "components/ChangeLogDrawer.tsx", @@ -475,6 +497,16 @@ "utils/validation.ts" ], "changelog": [ + { + "version": "v1.6", + "date": "2026-07-13", + "time": "12:59", + "summary": "更新 2 个文件", + "files": [ + ".spec/acp/conversations.json", + ".spec/prototype-comments.json" + ] + }, { "version": "v1.5", "date": "2026-07-13", @@ -2136,11 +2168,11 @@ ] }, "task-work-order": { - "title": "task work order", - "version": "v1.1", - "revision": 1, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "15f17a2d566dbe11036326fbc3727d43f23bdf8a67e3400e68052f1f0eda57e0", + "title": "任务工单", + "version": "v1.2", + "revision": 2, + "lastUpdated": "2026-07-13T01:59:13.978Z", + "contentHash": "a2b1853998ec7655a1ddfb705d0d39496b2544e8b21941d1ec73f17c828c038c", "trackedFiles": [ ".spec/2026-07-10-requirements.md", "components/task-work-order-kpi.jsx", @@ -2150,6 +2182,20 @@ "TaskWorkOrderPage.jsx" ], "changelog": [ + { + "version": "v1.2", + "date": "2026-07-13", + "time": "09:59", + "summary": "更新需求说明与标注", + "files": [ + ".spec/2026-07-10-requirements.md", + "components/task-work-order-kpi.jsx", + "data/task-work-order-seed.js", + "index.tsx", + "styles/index.css", + "TaskWorkOrderPage.jsx" + ] + }, { "version": "v1.1", "date": "2026-07-12", @@ -2944,79 +2990,439 @@ ] }, "oneos-web-h2-station": { - "title": "oneos web h2 station", - "version": "v1.5", - "revision": 5, - "lastUpdated": "2026-07-12T14:45:00.000Z", - "contentHash": "ef1dc5bf2f93f80d38273976fa63752796cd9f39bddb1dced1cf779960d68ff3", + "title": "加氢站管理", + "version": "v1.46", + "revision": 46, + "lastUpdated": "2026-07-13T06:55:56.033Z", + "contentHash": "c7c517f3cae14adf4e84dc7cf39386331a84f144b3055882485cacdbce96978b", "trackedFiles": [ "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" ], "changelog": [ { - "version": "v1.5", - "date": "2026-07-12", - "time": "22:45", - "summary": "加氢站合包:站点信息编辑提升为主操作", - "details": [ - "加氢订单/记录/站点信息 3 页 OperationActions;站点编辑不再藏在「更多」" - ], - "commit": "131b963", - "files": [ - "index.tsx" - ] - }, - { - "version": "v1.4", - "date": "2026-07-08", - "time": "11:44", - "summary": "样式与布局:h2-station-vm-filter.css", - "details": [], - "commit": "6d14c58", - "files": [ - "styles/h2-station-vm-filter.css" - ] - }, - { - "version": "v1.3", - "date": "2026-07-02", - "time": "03:35", - "summary": "页面逻辑与交互:index.tsx", - "details": [ - "样式与布局:h2-station-vm-filter.css" - ], - "commit": "f5e3126", + "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" ] }, { - "version": "v1.2", - "date": "2026-06-30", - "time": "16:54", - "summary": "页面逻辑与交互:index.tsx", - "details": [], - "commit": "0982837", + "version": "v1.45", + "date": "2026-07-13", + "time": "14:55", + "summary": "更新需求说明与标注", "files": [ - "index.tsx" + "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" ] }, { - "version": "v1.1", - "date": "2026-06-30", - "time": "16:36", - "summary": "Import desktop web originals into dedicated prototypes with a shared legacy shell, sync script, and a new「ONE-OS Web 端」sidebar section for review alongside existing refactored pages.", - "details": [ - "页面逻辑与交互:index.tsx" - ], - "commit": "d71ebc5", + "version": "v1.44", + "date": "2026-07-13", + "time": "14:55", + "summary": "更新页面逻辑与交互", "files": [ - "index.tsx" + "shared/h2-station-view-shared.jsx" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "version": "v1.38", + "date": "2026-07-13", + "time": "14:29", + "summary": "更新需求说明与标注", + "files": [ + "pages/站点周报统计-需求内容.js" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "version": "v1.34", + "date": "2026-07-13", + "time": "13:09", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.33", + "date": "2026-07-13", + "time": "13:09", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.32", + "date": "2026-07-13", + "time": "13:09", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.31", + "date": "2026-07-13", + "time": "13:09", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.30", + "date": "2026-07-13", + "time": "13:09", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.29", + "date": "2026-07-13", + "time": "13:08", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.28", + "date": "2026-07-13", + "time": "13:08", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.27", + "date": "2026-07-13", + "time": "11:32", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.26", + "date": "2026-07-13", + "time": "11:32", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.25", + "date": "2026-07-13", + "time": "11:32", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.24", + "date": "2026-07-13", + "time": "11:32", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.23", + "date": "2026-07-13", + "time": "11:27", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.22", + "date": "2026-07-13", + "time": "11:27", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.21", + "date": "2026-07-13", + "time": "11:27", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.20", + "date": "2026-07-13", + "time": "11:25", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.19", + "date": "2026-07-13", + "time": "11:25", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.18", + "date": "2026-07-13", + "time": "11:25", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" + ] + }, + { + "version": "v1.17", + "date": "2026-07-13", + "time": "11:17", + "summary": "更新页面样式", + "files": [ + "index.tsx", + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] } ] @@ -3383,14 +3789,32 @@ }, "vm-shared": { "title": "vm-shared", - "version": "v1.4", - "revision": 4, - "lastUpdated": "2026-07-12T14:44:00.000Z", - "contentHash": "4a8d78c8ffaa1ffbf48164c0a77651919681b3e89b7b5ed700a2acf9c7f00e91", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-13T03:04:59.958Z", + "contentHash": "c3e7223b1958455ae3fbf88f59f3126cce94d06b5ca419057a7377d6b6887e90", "trackedFiles": [ "DESIGN.md" ], "changelog": [ + { + "version": "v1.6", + "date": "2026-07-13", + "time": "11:04", + "summary": "更新 DESIGN.md", + "files": [ + "DESIGN.md" + ] + }, + { + "version": "v1.5", + "date": "2026-07-13", + "time": "11:04", + "summary": "更新 DESIGN.md", + "files": [ + "DESIGN.md" + ] + }, { "version": "v1.4", "date": "2026-07-12", @@ -3442,844 +3866,951 @@ ] } ] + }, + "oneos-web-h2-station-weekly": { + "title": "oneos-web-h2-station-weekly", + "version": "v1.0", + "revision": 0, + "lastUpdated": "2026-07-13T03:01:39.575Z", + "contentHash": "68652d2c7c04dfe1dbf6a7254a1915043d509935d81db857f90464c9d1df9c6a", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [] + }, + "oneos-web-h2-station-analysis": { + "title": "oneos-web-h2-station-analysis", + "version": "v1.6", + "revision": 6, + "lastUpdated": "2026-07-13T07:20:12.550Z", + "contentHash": "a9a6164ccd59111309617d0c4421bd809d07d84a496ad7552bb0af57a4afa463", + "trackedFiles": [ + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" + ], + "changelog": [ + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "version": "v1.3", + "date": "2026-07-13", + "time": "15:18", + "summary": "更新页面逻辑与交互", + "files": [ + "index.tsx" + ] + }, + { + "version": "v1.2", + "date": "2026-07-13", + "time": "15:18", + "summary": "更新页面逻辑与交互", + "files": [ + "pages/01-加氢站分析.jsx" + ] + }, + { + "version": "v1.1", + "date": "2026-07-13", + "time": "15:18", + "summary": "更新页面逻辑与交互", + "files": [ + "shared/h2-analysis-charts.jsx" + ] + } + ] + }, + "oneos-web-approval": { + "title": "oneos-web-approval", + "version": "v1.16", + "revision": 16, + "lastUpdated": "2026-07-14T06:17:46.246Z", + "contentHash": "36d94bc093043173cf16e2262f46f4ad753f6cacca8fbe970feed2ce020d2446", + "trackedFiles": [ + ".spec/prototype-comments.json", + "index.tsx" + ], + "changelog": [ + { + "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": "oneos-web-approval-initiated", + "version": "v1.0", + "revision": 0, + "lastUpdated": "2026-07-14T06:09:13.385Z", + "contentHash": "196b147a8d49f4ac747ed77dc131b9d222ef91e35adfc93e68265cc8d4b1921e", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [] + }, + "oneos-web-approval-cc": { + "title": "我的抄送", + "version": "v1.0", + "revision": 0, + "lastUpdated": "2026-07-14T06:17:50.422Z", + "contentHash": "ec088ac4ada1abdcee6e5a2049fe96b26c63d27814699835d2b23debe9b65311", + "trackedFiles": [ + "index.tsx" + ], + "changelog": [] } }, "recentUpdates": [ { - "prototypeId": "supplier-management", - "title": "供应商管理", - "version": "v1.5", - "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", + "prototypeId": "oneos-web-workbench", + "title": "工作台", + "version": "v1.6", + "date": "2026-07-15", + "time": "08:51", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/prototype-review.md", - "components/BankAccountConfirmModal.tsx", - "components/ChangeLogDrawer.tsx", - "components/CoopStatusBadge.tsx", - "components/DeleteConfirmModal.tsx", - "components/FilterPanel.tsx", - "components/KpiCards.tsx", - "components/LeaveConfirmModal.tsx", - "components/RoleSwitcher.tsx", - "components/SupplierTable.tsx", - "data/suppliers.json", + "index.tsx", + "pages/01-工作台.jsx" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "oneos-web-approval", + "version": "v1.16", + "date": "2026-07-14", + "time": "14:17", + "summary": "更新页面逻辑与交互", + "files": [ + ".spec/prototype-comments.json", "index.tsx" ] }, { - "prototypeId": "customer-management", - "title": "客户管理", - "version": "v1.7", - "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "version": "v1.15", + "date": "2026-07-14", + "time": "14:09", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/prototype-review.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/BatchRiskTagModal.tsx", - "components/CustomerTable.tsx", - "components/FilterPanel.tsx", - "components/LabelTags.tsx", - "components/MultiSelectField.tsx", - "components/RiskKpiCards.tsx", - "components/RiskLabelTags.tsx", - "components/RiskTagDrawer.tsx" + "ApprovalApp.tsx" ] }, { - "prototypeId": "customer-management", - "title": "客户管理", + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "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" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "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" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "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" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "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" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "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" + ] + }, + { + "prototypeId": "oneos-web-approval", + "title": "审批中心", + "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" + ] + }, + { + "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": "09:31", - "summary": "更新需求说明与标注", + "time": "15:20", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/prototype-review.md", - ".spec/requirements-prd-create.md", - ".spec/requirements-prd-list.md", - ".spec/ui-review.md", - "components/BatchRiskTagModal.tsx", - "components/CustomerTable.tsx", - "components/FilterPanel.tsx", - "components/LabelTags.tsx", - "components/MultiSelectField.tsx", - "components/RiskKpiCards.tsx", - "components/RiskLabelTags.tsx", - "components/RiskTagDrawer.tsx" + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" ] }, { - "prototypeId": "customer-management", - "title": "客户管理", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", "version": "v1.5", "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", + "time": "15:20", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/prototype-review.md", - "components/RiskKpiCards.tsx", - "utils/riskKpi.ts" + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" ] }, { - "prototypeId": "supplier-management", - "title": "供应商管理", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", "version": "v1.4", "date": "2026-07-13", - "time": "09:31", - "summary": "更新需求说明与标注", + "time": "15:19", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/prototype-review.md", - "components/BankAccountConfirmModal.tsx", - "components/ChangeLogDrawer.tsx", - "components/DeleteConfirmModal.tsx", - "components/LeaveConfirmModal.tsx", - "components/RoleSwitcher.tsx", - "utils/createForm.ts", - "utils/permissions.ts", - "utils/phone.ts", - "utils/region.ts", - "utils/supplierFields.ts", - "utils/validation.ts" + "index.tsx", + "pages/01-加氢站分析.jsx", + "shared/h2-analysis-charts.jsx", + "shared/h2-analysis-mock.js" ] }, { - "prototypeId": "lease-business-detail", - "title": "租赁业务明细", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", "version": "v1.3", "date": "2026-07-13", - "time": "09:26", - "summary": "更新需求说明与标注", + "time": "15:18", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/prototype-comments.json", - ".spec/prototype-review.md", - ".spec/requirements-prd.md", - "columnHeaderTips.ts", - "components/DetailChangeLogModal.tsx", - "components/DetailDeleteConfirmModal.tsx", - "components/DetailEditModal.tsx", - "components/DetailImportModal.tsx", - "components/DetailKpiRow.tsx", - "components/DetailTable.tsx", - "components/FieldCheckIcon.tsx", - "components/FilterPanel.tsx" + "index.tsx" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.167", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.2", "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", + "time": "15:18", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢站分析.jsx" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.166", + "prototypeId": "oneos-web-h2-station-analysis", + "title": "oneos-web-h2-station-analysis", + "version": "v1.1", "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", + "time": "15:18", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "shared/h2-analysis-charts.jsx" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.165", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.46", "date": "2026-07-13", - "time": "01:21", + "time": "14:55", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "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": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.164", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.45", "date": "2026-07-13", - "time": "01:21", + "time": "14:55", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "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": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.163", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.44", "date": "2026-07-13", - "time": "01:21", - "summary": "更新需求说明与标注", + "time": "14:55", + "summary": "更新页面逻辑与交互", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "shared/h2-station-view-shared.jsx" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.162", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.43", "date": "2026-07-13", - "time": "01:21", + "time": "14:30", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.161", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.42", "date": "2026-07-13", - "time": "01:21", + "time": "14:30", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.160", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.41", "date": "2026-07-13", - "time": "01:21", + "time": "14:30", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.159", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.40", "date": "2026-07-13", - "time": "01:16", + "time": "14:30", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.158", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.39", "date": "2026-07-13", - "time": "01:16", + "time": "14:30", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "pages/站点周报统计-需求内容.js", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.157", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.38", "date": "2026-07-13", - "time": "01:16", + "time": "14:29", "summary": "更新需求说明与标注", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/站点周报统计-需求内容.js" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.156", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.37", "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", + "time": "13:50", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.155", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.36", "date": "2026-07-13", - "time": "01:16", - "summary": "更新需求说明与标注", + "time": "13:50", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.154", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.35", "date": "2026-07-13", - "time": "01:04", - "summary": "更新需求说明与标注", + "time": "13:50", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.153", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.34", "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", + "time": "13:09", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.152", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.33", "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", + "time": "13:09", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.151", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.32", "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", + "time": "13:09", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] }, { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.150", + "prototypeId": "oneos-web-h2-station", + "title": "加氢站管理", + "version": "v1.31", "date": "2026-07-13", - "time": "01:03", - "summary": "更新需求说明与标注", + "time": "13:09", + "summary": "更新页面样式", "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.149", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.148", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.147", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.146", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.145", - "date": "2026-07-13", - "time": "00:54", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.144", - "date": "2026-07-13", - "time": "00:50", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.143", - "date": "2026-07-13", - "time": "00:50", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.142", - "date": "2026-07-13", - "time": "00:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.141", - "date": "2026-07-13", - "time": "00:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.140", - "date": "2026-07-13", - "time": "00:49", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.139", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.138", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.137", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.136", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.135", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" - ] - }, - { - "prototypeId": "vehicle-pickup-receivable", - "title": "提车应收款", - "version": "v1.134", - "date": "2026-07-13", - "time": "00:45", - "summary": "更新需求说明与标注", - "files": [ - ".spec/PRD.md", - ".spec/prototype-comments.json", - "data/pickup-receivable-list-data.js", - "index.tsx", - "pickup-receivable-bridge.js", - "pickup-receivable-calc.js", - "styles/index.css", - "VehiclePickupReceivableApp.jsx", - "VehiclePickupReceivableCollectPage.jsx", - "VehiclePickupReceivableContractView.jsx", - "VehiclePickupReceivableList.jsx" + "pages/01-加氢订单.jsx", + "pages/02-加氢记录.jsx", + "pages/03-站点信息.jsx", + "pages/04-站点周报统计.jsx", + "styles/h2-station-vm-filter.css" ] } ] 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 ; +}