183 lines
6.3 KiB
TypeScript
183 lines
6.3 KiB
TypeScript
import type { H2OrderRow, StationPrepaid } from '../types';
|
|
|
|
/** 辅助生成 200 条逼真高质量订单明细假数据 */
|
|
function generate200MockOrders(): H2OrderRow[] {
|
|
const stations = [
|
|
{ id: 'st-ln', name: '佛山南海羚牛加氢站' },
|
|
{ id: 'st-dp', name: '东鹏大道甲醇制氢一体站' },
|
|
{ id: 'st-jx', name: '嘉兴中石化滨海加氢站' },
|
|
{ id: 'st-jj', name: '嘉兴嘉锦加氢站' },
|
|
{ id: 'st-cd', name: '成都中石化天府机场高速北站加氢站' },
|
|
{ id: 'st-gz', name: '广州黄埔高新区氢能示范加氢站' },
|
|
{ id: 'st-sh', name: '上海安亭加氢站' },
|
|
];
|
|
|
|
const ownPlates = [
|
|
'粤A99887', '粤B12001', '浙A52088', '浙F77881', '浙A88888F',
|
|
'浙A66666', '浙F11223', '浙F33445', '川A77889', '川B99001',
|
|
'沪A33219', '粤B88102', '浙F99812', '浙F66521', '粤A11029',
|
|
];
|
|
|
|
const extPlates = [
|
|
'粤A77661', '浙F33211', '川A55432', '沪B98765', '粤B66554',
|
|
'浙A22334', '粤A99102', '川B88761', '无车牌(散车)',
|
|
];
|
|
|
|
const customers = [
|
|
{ id: 'c-ln', name: '羚牛自营', type: 'internal', deptId: 'd-ops', deptName: '运维中心' },
|
|
{ id: 'c-bao', name: '包氢专线项目', type: 'internal', deptId: 'd-lease', deptName: '租赁业务一部' },
|
|
{ id: 'c-lease-a', name: '嘉兴智奇供应链', type: 'internal', deptId: 'd-lease', deptName: '租赁业务一部' },
|
|
{ id: 'c-log', name: '嘉兴益顺冷链', type: 'internal', deptId: 'd-log', deptName: '物流中心' },
|
|
{ id: 'c-log2', name: '四川群彬物流', type: 'internal', deptId: 'd-log', deptName: '物流中心' },
|
|
{ id: 'c-lease-b', name: '无锡铭康物流', type: 'internal', deptId: 'd-lease', deptName: '租赁业务二部' },
|
|
{ id: 'c-ops', name: '运维调拨车辆', type: 'internal', deptId: 'd-ops', deptName: '运维中心' },
|
|
{ id: 'c-pend', name: '待归属样本', type: 'internal', deptId: 'd-lease', deptName: '租赁业务一部' },
|
|
{ id: 'c-ext-a', name: '广东氢动力', type: 'external', deptId: 'd-sales', deptName: '能源销售' },
|
|
{ id: 'c-ext-b', name: '广东清运专线', type: 'external', deptId: 'd-sales', deptName: '能源销售' },
|
|
{ id: 'c-ext-c', name: '东展供应链', type: 'external', deptId: 'd-sales', deptName: '能源销售' },
|
|
{ id: 'c-ext-d', name: '顺丰冷运专线', type: 'external', deptId: 'd-sales', deptName: '能源销售' },
|
|
{ id: 'c-ext-e', name: '极兔速递冷链', type: 'external', deptId: 'd-sales', deptName: '能源销售' },
|
|
];
|
|
|
|
const list: H2OrderRow[] = [];
|
|
|
|
// 生成 200 条记录
|
|
for (let i = 1; i <= 200; i++) {
|
|
const padId = String(i).padStart(3, '0');
|
|
|
|
// 年份分配: 1~145 (2026年), 146~185 (2025年), 186~200 (2024年)
|
|
let year = 2026;
|
|
let month = Math.floor((i % 8)) + 1; // 1~8月
|
|
if (i > 145 && i <= 185) {
|
|
year = 2025;
|
|
month = Math.floor((i % 12)) + 1;
|
|
} else if (i > 185) {
|
|
year = 2024;
|
|
month = Math.floor((i % 12)) + 1;
|
|
}
|
|
|
|
const day = (i * 7 % 28) + 1;
|
|
const hour = (i * 3 % 14) + 7;
|
|
const minute = (i * 11 % 50) + 5;
|
|
|
|
const mm = month < 10 ? `0${month}` : `${month}`;
|
|
const dd = day < 10 ? `0${day}` : `${day}`;
|
|
const hh = hour < 10 ? `0${hour}` : `${hour}`;
|
|
const min = minute < 10 ? `0${minute}` : `${minute}`;
|
|
|
|
const occurredAt = `${year}-${mm}-${dd} ${hh}:${min}`;
|
|
const station = stations[i % stations.length];
|
|
const customer = customers[i % customers.length];
|
|
|
|
const isOwn = customer.type === 'internal';
|
|
const fleet = isOwn ? 'own' : 'external';
|
|
const plateNo = isOwn
|
|
? ownPlates[i % ownPlates.length]
|
|
: extPlates[i % extPlates.length];
|
|
|
|
// 单价 & 加氢量
|
|
const unitPrice = [28, 30, 32, 35][i % 4];
|
|
const quantityKg = Math.round((18 + (i * 3.7 % 85)) * 100) / 100;
|
|
const amount = Math.round(quantityKg * unitPrice);
|
|
|
|
// 成本维度与费用承担
|
|
let borneBy: 'company' | 'customer' = 'company';
|
|
let costDim: 'lease' | 'logistics' | 'ops' | 'pending' = 'lease';
|
|
let leaseKind: 'company_borne' | 'package_h2' | undefined = undefined;
|
|
let opsKind: 'abnormal' | 'transfer' | undefined = undefined;
|
|
|
|
if (customer.id === 'c-ext-a' || customer.id === 'c-ext-d') {
|
|
borneBy = 'customer';
|
|
}
|
|
|
|
const dimType = i % 5;
|
|
if (dimType === 0) {
|
|
costDim = 'lease';
|
|
leaseKind = 'company_borne';
|
|
} else if (dimType === 1) {
|
|
costDim = 'lease';
|
|
leaseKind = 'package_h2';
|
|
} else if (dimType === 2) {
|
|
costDim = 'logistics';
|
|
} else if (dimType === 3) {
|
|
costDim = 'ops';
|
|
opsKind = i % 2 === 0 ? 'abnormal' : 'transfer';
|
|
} else {
|
|
costDim = 'pending';
|
|
}
|
|
|
|
// 核对状态与数据来源
|
|
const verifyStatus = isOwn ? (i % 4 === 0 ? 'unverified' : 'verified') : 'unverified';
|
|
const source = isOwn
|
|
? (i % 3 === 0 ? 'manual' : i % 3 === 1 ? 'fence' : 'api')
|
|
: (i % 2 === 0 ? 'api' : 'manual');
|
|
|
|
list.push({
|
|
id: `HO-${String(year).slice(2)}${mm}-${padId}`,
|
|
occurredAt,
|
|
stationId: station.id,
|
|
stationName: station.name,
|
|
plateNo,
|
|
customerId: customer.id,
|
|
customerName: customer.name,
|
|
deptId: customer.deptId,
|
|
deptName: customer.deptName,
|
|
amount,
|
|
quantityKg,
|
|
unitPrice,
|
|
borneBy,
|
|
costDim,
|
|
leaseKind,
|
|
opsKind,
|
|
verifyStatus,
|
|
source,
|
|
fleet,
|
|
});
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
/** 假数:200 条订单明细(三维度成本拆分) */
|
|
export const MOCK_ORDERS: H2OrderRow[] = generate200MockOrders();
|
|
|
|
export const MOCK_PREPAID: StationPrepaid[] = [
|
|
{
|
|
stationId: 'st-jx',
|
|
stationName: '嘉兴中石化滨海加氢站',
|
|
openingBalance: 120000,
|
|
openingAnchorLabel: '2025 年末财务期末',
|
|
recharge: 80000,
|
|
consume: 95000,
|
|
},
|
|
{
|
|
stationId: 'st-jj',
|
|
stationName: '嘉兴嘉锦加氢站',
|
|
openingBalance: null,
|
|
openingAnchorLabel: null,
|
|
recharge: 40000,
|
|
consume: 28000,
|
|
},
|
|
];
|
|
|
|
/** 宿主总览 KPI(与 zip content 同量级示意,只读壳) */
|
|
export const HOST_KPI = {
|
|
totalKgT: 697.16,
|
|
companyKgT: 468.28,
|
|
customerKgT: 228.88,
|
|
totalFeeWan: 2093.71,
|
|
companyFeeWan: 1362.85,
|
|
customerFeeWan: 730.87,
|
|
profitWan: 13.01,
|
|
incomeWan: 743.88,
|
|
costWan: 2093.71,
|
|
monthKgT: 16.67,
|
|
monthFeeWan: 50.36,
|
|
monthYearPct: 2.4,
|
|
dayKg: 181.78,
|
|
dayFee: 6533,
|
|
dayMonthPct: 1.1,
|
|
};
|
|
|
|
export const DEFAULT_YEAR = 2026;
|