feat: 羚牛 BI 报表服务初始版本
All checks were successful
ci/woodpecker/manual/woodpecker Pipeline was successful

- Hono + TypeScript 后端,连接 MySQL 数据库
- React + Vite + Tailwind 前端
- 车辆资产实时汇总(按车型/品牌型号分组)
- 本周交车/还车/替换统计(关联业务单据)
- 车牌号详情弹窗
- Dockerfile + Woodpecker CI 流水线

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
kkfluous
2026-03-26 14:02:49 +08:00
commit 0cc5024132
23 changed files with 5783 additions and 0 deletions

147
src/server/types.ts Normal file
View File

@@ -0,0 +1,147 @@
export interface VehicleRow {
id: number;
车牌号: string;
vin: string;
车辆品牌: string;
车辆型号: string;
车辆颜色: string;
租赁公司: string;
车辆归属状态Label: string | null;
车辆型号Label: string | null;
库存区域: string | null;
车辆租赁状态: string | null;
车辆租赁状态Label: string | null;
是否营运: number;
: string | null;
: string | null;
纬度: number | null;
经度: number | null;
车辆品牌Label: string | null;
合同ID: number | null;
合同编码: string | null;
客户名称: string | null;
合同归属公司: string | null;
合同归属部门: string | null;
主体: string | null;
项目名称: string | null;
客户经理: string | null;
}
export interface Vehicle {
id: number;
plateNumber: string;
vin: string;
type: string;
model: string;
color: string;
location: string;
region: string;
status: 'Operating' | 'Inventory' | 'Abnormal';
ownership: string;
rentCompany: string;
contractNo: string | null;
customerName: string | null;
orgName: string | null;
departmentName: string | null;
subjectOrg: string | null;
projectName: string | null;
customerManager: string | null;
brandLabel: string | null;
}
export interface SummaryData {
totalAssets: number;
operating: {
total: number;
self: number;
leased: number;
public: number;
hanging: number;
};
inventory: {
total: number;
inStock: number;
abnormal: number;
};
pendingDelivery: number;
weeklyNew: number;
weeklyRemoved: number;
weeklyDelivered: number;
weeklyReturned: number;
weeklyReplaced: number;
}
export interface TypeSummary {
type: string;
totalAssets: number;
totalInventory: number;
totalOperating: number;
inventoryRegions: Record<string, number>;
pending: number;
weeklyDelivered: number;
weeklyReturned: number;
weeklyReplaced: number;
models: ModelSummary[];
}
export interface ModelSummary {
model: string;
total: number;
inventory: number;
inventoryRegions: Record<string, number>;
pending: number;
operating: number;
weeklyDelivered: number;
weeklyReturned: number;
weeklyReplaced: number;
batches: BatchSummary[];
}
export interface BatchSummary {
batch: string;
total: number;
inventory: number;
inventoryRegions: Record<string, number>;
pending: number;
operating: number;
weeklyDelivered: number;
weeklyReturned: number;
weeklyReplaced: number;
}
export interface BatchGroup {
batch: string;
total: number;
inventory: number;
inventoryRegions: Record<string, number>;
pending: number;
operating: number;
weeklyDelivered: number;
weeklyReturned: number;
weeklyReplaced: number;
models: {
model: string;
type: string;
total: number;
inventory: number;
inventoryRegions: Record<string, number>;
pending: number;
operating: number;
weeklyDelivered: number;
weeklyReturned: number;
weeklyReplaced: number;
}[];
}
export interface InventoryTypeSummary {
type: string;
totalAssets: number;
totalInventory: number;
models: {
model: string;
totalAssets: number;
totalInventory: number;
regions: Record<string, number>;
}[];
regionSubtotals: Record<string, number>;
}