20 Commits

Author SHA1 Message Date
kkfluous
f1cb71efa4 fix: 修复 Asset 模块枚举类编译错误
- 为 ReturnOrderStatusEnum 和 ReturnReasonEnum 添加 @AllArgsConstructor 注解
- 移除手写构造函数,使用 Lombok 自动生成
- 修复 getStatus() 和 getCode() 方法找不到的编译错误
2026-03-16 14:20:44 +08:00
kkfluous
042e14a9d3 fix: Asset API 模块添加 RPC 依赖(支持 Feign) 2026-03-16 14:17:28 +08:00
kkfluous
40ea8e9065 fix: 修复 Asset 模块所有枚举类(添加构造函数和 getter) 2026-03-16 14:15:19 +08:00
kkfluous
02a6c2e5cb fix: 修复 Energy 模块 Feign 客户端配置 2026-03-16 14:05:09 +08:00
kkfluous
b40f521c03 feat(energy): Energy 模块优化完成
后端优化:
- 创建加氢站表,删除 energy_station_config
- 简化事件驱动(7个→3个)
- 合并导入流程(自动匹配+生成明细)
- 优化审核流程(审核+扣款合并+批量审核)
- 修复跨模块依赖(创建 Asset API 接口层)

前端优化:
- 简化导入交互(3步→1步)
- 批量审核功能
- 快速生成账单(本月/上月)
- 批量价格配置(前端完成)

技术改进:
- 微服务架构规范(API 优先)
- 事务一致性保证
- 用户体验优化
2026-03-16 13:22:25 +08:00
kkfluous
2f38a703f9 refactor(energy): 简化事件驱动系统(7个→3个)
- 删除旧事件:BillApprovedEvent, BillCreatedEvent, DeductionCompletedEvent, DetailAuditedEvent, DetailCreatedEvent, RecordMatchedEvent
- 新增事件:BillAuditPassedEvent, DetailAuditPassedEvent
- 保留事件:RecordImportedEvent
- 更新监听器:AccountEventListener, BillEventListener, DetailEventListener
- 清理代码中的旧事件引用和注释

优化原则:前端简单,后端健壮
事件流程:导入→匹配→生成明细→审核→扣款→生成账单→结算
2026-03-16 12:53:14 +08:00
kkfluous
f5062cec22 fix(energy): 改进导入确认接口质量
- 移除 importConfirm 上无效的 @Transactional(best-effort 逐行导入)
- 添加 duplicateStrategy 参数校验(仅接受 skip/overwrite)
- getImportProgress 对缺失 key 返回 not_found 而非 completed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 01:03:36 +08:00
kkfluous
7b51cf282d feat(energy): 添加三步导入接口(预览/确认/进度)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16 01:00:21 +08:00
kkfluous
06101aac02 fix(energy): 修复 batchGenerateByPeriod 中 energyType 错误值和 batchMatch 中使用魔法数字
- HYDROGEN 枚举值为 0 而非 1,使用 EnergyTypeEnum.HYDROGEN.getType()
- batchMatch 使用 MatchStatusEnum.UNMATCHABLE.getStatus() 替代硬编码 2

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:56:48 +08:00
kkfluous
7486a1e6cf feat(energy): 添加批量匹配和按月批量生成账单接口
- EnergyHydrogenDetailMapper: 新增 selectUnbilledByPeriod 按时间段查询未出账明细
- HydrogenRecordService/Impl: 新增 batchMatch 批量重新匹配失败记录
- EnergyBillService/Impl: 新增 batchGenerateByPeriod 按月自动分组生成账单
- HydrogenRecordController: 新增 POST /batch-match 接口
- EnergyBillController: 新增 POST /batch-generate-by-period 接口

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16 00:51:02 +08:00
kkfluous
33879942d7 feat(energy): 添加 simple-list/summary/detail-list/adjustment-list 接口
新增5个端点跨3个Controller:站点配置simple-list、账户simple-list和summary汇总统计、账单detail-list和adjustment/list调整记录列表。新增3个VO类及对应Service方法、Convert映射方法。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:47:47 +08:00
kkfluous
842a81d7e4 feat(energy): 添加 4 个导出 Excel 接口
为 HydrogenRecord、HydrogenDetail、EnergyBill、EnergyAccount 各添加 /export-excel 端点,创建对应 ExcelVO 类,并在 MapStruct Convert 接口中新增 convertExcelList 方法。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-16 00:42:13 +08:00
kkfluous
7792c5157f feat(energy): 新增 cooperation_type 和 auto_match 字段,标记旧导入接口废弃
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-16 00:37:09 +08:00
kkfluous
57ecce2649 chore(sql): add full-chain setup script for tables and menus
Creates 5 tables in oneos_asset:
- asset_inspection_template, asset_inspection_template_item
- asset_inspection_record, asset_inspection_record_item
- asset_vehicle_replacement

Inserts 12 menu entries in oneos_system (5161-5174):
- 验车模板 page + 6 permission buttons (template CRUD + record query/update)
- 替换车管理 page + 4 permission buttons (CRUD)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:46:08 +08:00
kkfluous
04f0599efa feat(asset): enhance return order with inspection, BPM approval, and event-driven cross-module linkage
- Add sourceType/sourceId/deliveryOrderId to return order table and DO
- Add inspectionRecordId to return order vehicle table and DO
- Add createFromDelivery/createFromReplacement methods to auto-create return orders
- Add startVehicleInspection/completeVehicleInspection for per-vehicle inspection flow
- Add submitApproval/withdrawApproval/updateApprovalStatus for BPM workflow
- Create ReturnApprovedEvent and ReturnOrderBpmListener
- Create DeliveryCompletedEvent for future vehicle status tracking
- Create VehicleStatusEventListener (TODO stubs for vehicle status updates)
- Create ReturnOrderEventListener to auto-create return order on permanent replacement approval
- Add BPM process definitions for replacement (with GM escalation) and return order approval

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:20:25 +08:00
kkfluous
b93ea71174 feat(asset): add vehicle replacement module with BPM approval workflow
Implement complete replacement vehicle management (替换车) supporting
temporary and permanent vehicle replacements under rental contracts,
with BPM-based approval flow, event-driven architecture, and CRUD APIs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:11:50 +08:00
kkfluous
46485289a2 feat(asset): integrate inspection records with prepare and delivery order
- Add inspection_record_id column to asset_vehicle_prepare and asset_delivery_order tables
- Add inspectionRecordId field to VehiclePrepareDO, DeliveryOrderDO, and their RespVOs
- Auto-create inspection record from matched template when creating a prepare record
- Auto-complete inspection record when completing a prepare record
- Clone prepare inspection record to delivery order on delivery order creation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:06:55 +08:00
kkfluous
1dca703caa feat(asset): add inspection template and record system for vehicle checks
Implement the shared inspection template system backend (Chunk 1) including:
- 4 database tables: template, template_item, record, record_item
- 3 enums: InspectionSourceType, InspectionStatus, InspectionResult
- 4 DO classes, 4 Mapper classes with query methods
- 6 VO classes for request/response
- MapStruct converter for DO/VO conversions
- Template service: CRUD, match by bizType+vehicleType
- Record service: create from template, clone, update items, complete
- 2 REST controllers with permission annotations
- Error codes for inspection and replacement modules

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 10:02:19 +08:00
kkfluous
d5c3ed373f docs: add rental full-chain implementation plan
27 tasks across 6 chunks: inspection template system, prepare simplification,
delivery enhancement, replacement vehicle module, return order improvements,
BPM flows, event-driven linkage, and frontend changes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:53:59 +08:00
kkfluous
072196aad4 docs: add rental full-chain design spec
Covers shared inspection template system, vehicle prepare simplification,
delivery enhancement, replacement vehicle module (new), return order
improvements, BPM approval flows, and event-driven cross-module linkage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-13 09:42:06 +08:00
319 changed files with 21746 additions and 302 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,587 @@
# 租赁业务全链路设计规格
## 概述
实现租赁业务全链路(合同 → 备车 → 交车 → 替换车 → 还车生产可用包括模块功能补全、跨模块状态联动、BPM 审批流程部署、共享验车模板系统。
## 架构决策
- **方案选择**:方案 C — 轻量模板表 + 记录表,模块内引用
- **验车模板**:共享表(`asset_inspection_template` + `asset_inspection_record`),放在 asset 模块
- **流转机制**:克隆 + 预填,各业务持有独立 `inspection_record_id`
- **事件驱动**Spring Event 解耦跨模块状态变更
- **BPM 集成**:继承现有 `BpmProcessInstanceStatusEventListener` 模式
- **表名前缀**:统一使用 `asset_` 前缀,与现有 `asset_return_order``asset_delivery_order` 等保持一致
- **BPM 字段名**:统一使用 `bpm_instance_id`,与现有 `ContractDO``ReturnOrderDO` 保持一致
---
## 第一部分:共享验车模板系统
### 数据库表
#### `asset_inspection_template`(模板定义)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 主键 |
| code | varchar(50) | 模板编码,如 `TPL-BC-001` |
| name | varchar(100) | 模板名称,如"氢能车备车检查模板" |
| biz_type | tinyint | 适用业务1=备车 2=交车 3=还车(一个模板可适用多种业务) |
| vehicle_type | varchar(50) | 适用车辆类型(如"氢能车"、"电动车"nullable 表示通用) |
| status | tinyint | 0=禁用 1=启用 |
| remark | varchar(500) | 备注 |
| + BaseDO 字段 | | creator, create_time, updater, update_time, deleted, tenant_id |
**模板匹配规则**:创建验车记录时,先按 `biz_type` + `vehicle_type` 精确匹配,无结果则按 `biz_type` + `vehicle_type IS NULL` 匹配通用模板。
#### `asset_inspection_template_item`(模板检查项)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 主键 |
| template_id | bigint | 关联模板 |
| category | varchar(50) | 分类,如"制动系统"、"外观检查" |
| item_name | varchar(100) | 检查项名称 |
| item_code | varchar(50) | 检查项编码,如 `BRAKE-001` |
| input_type | varchar(20) | 输入类型:`checkbox`(合格/不合格)、`number`(数值)、`text`(文本) |
| sort | int | 排序 |
| required | tinyint | 是否必填0=否 1=是 |
| + BaseDO | | |
#### `asset_inspection_record`(验车记录实例)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 主键 |
| record_code | varchar(50) | 记录编码,如 `BC-V001-20260313-001` |
| template_id | bigint | 使用的模板 |
| source_type | tinyint | 来源1=备车 2=交车 3=还车 |
| source_id | bigint | 来源业务ID |
| vehicle_id | bigint | 车辆ID |
| inspector_name | varchar(50) | 检查人 |
| inspection_time | datetime | 检查时间 |
| status | tinyint | 0=待检查 1=检查中 2=已完成 |
| overall_result | tinyint | 总结果1=合格 2=不合格 |
| remark | varchar(500) | 总备注 |
| cloned_from_id | bigint | 克隆来源记录IDnullable |
| + BaseDO | | |
#### `asset_inspection_record_item`(逐项检查结果)
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 主键 |
| record_id | bigint | 关联记录 |
| item_code | varchar(50) | 检查项编码(与模板 item 对应) |
| category | varchar(50) | 分类(冗余,便于展示) |
| item_name | varchar(100) | 检查项名称(冗余) |
| input_type | varchar(20) | 输入类型(冗余,便于前端渲染) |
| result | tinyint | 1=合格 2=不合格 3=不适用 |
| value | varchar(200) | 数值/文本类型的输入值 |
| remark | varchar(500) | 该项备注 |
| image_urls | varchar(2000) | 图片URLJSON数组 |
| + BaseDO | | |
### 克隆流转机制
```
备车完成record status=已完成)
↓ 交车时,查找该 vehicleId 最近的备车 record
↓ InspectionRecordService.cloneRecord(sourceRecordId, DELIVERY, newSourceId)
↓ 生成新 record + 复制所有 itemresult/value 保留,可修改)
↓ cloned_from_id = 源 record.id
交车完成
↓ 还车时同理克隆交车 record
```
### 后端结构
```
asset-server/
├── dal/dataobject/inspection/
│ ├── InspectionTemplateDO.java
│ ├── InspectionTemplateItemDO.java
│ ├── InspectionRecordDO.java
│ └── InspectionRecordItemDO.java
├── dal/mysql/inspection/
│ ├── InspectionTemplateMapper.java
│ ├── InspectionTemplateItemMapper.java
│ ├── InspectionRecordMapper.java
│ └── InspectionRecordItemMapper.java
├── service/inspection/
│ ├── InspectionTemplateService.java
│ ├── InspectionTemplateServiceImpl.java
│ ├── InspectionRecordService.java
│ └── InspectionRecordServiceImpl.java
├── controller/admin/inspection/
│ ├── InspectionTemplateController.java (模板 CRUD)
│ └── InspectionRecordController.java (记录查询)
└── convert/inspection/
└── InspectionConvert.java
```
### 核心 Service 方法
```java
public interface InspectionRecordService {
// 根据模板创建空白验车记录
Long createRecord(Long templateId, Integer sourceType, Long sourceId, Long vehicleId);
// 克隆已有记录(跨模块流转)
Long cloneRecord(Long sourceRecordId, Integer newSourceType, Long newSourceId);
// 更新检查项结果
void updateRecordItem(Long recordItemId, Integer result, String value, String remark, String imageUrls);
// 完成验车
void completeRecord(Long recordId, String inspectorName);
// 查询记录详情(含所有 item
InspectionRecordDetailVO getRecordDetail(Long recordId);
// 查找车辆最近的某类型验车记录
InspectionRecordDO getLatestRecord(Long vehicleId, Integer sourceType);
}
```
---
## 第二部分:备车模块精简
### 现状
`VehiclePrepareDO` 有 ~30 个字段,其中 `checkList`(JSON) 存储检查数据。需精简为纯业务字段 + `inspection_record_id` 关联。
### 精简后 `asset_vehicle_prepare` 字段
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 主键 |
| vehicle_id | bigint | 车辆ID |
| plate_no | varchar(20) | 车牌号(冗余) |
| vin | varchar(50) | VIN码冗余 |
| vehicle_model_id | bigint | 车型ID |
| brand | varchar(50) | 品牌(冗余) |
| model | varchar(50) | 型号(冗余) |
| vehicle_type | varchar(50) | 车辆类型(冗余) |
| parking_lot | varchar(100) | 停车场 |
| preparation_type | varchar(50) | 备车类型 |
| mileage | int | 里程数 |
| hydrogen_remaining | decimal(10,2) | 剩余氢量 |
| hydrogen_unit | varchar(10) | 氢量单位 |
| battery_remaining | decimal(10,2) | 剩余电量 |
| has_body_ad | tinyint | 是否有车身广告 |
| body_ad_photos | varchar(2000) | 车身广告照片JSON |
| has_tail_lift | tinyint | 是否有尾板 |
| spare_tire_depth | decimal(5,2) | 备胎深度 |
| spare_tire_photo | varchar(500) | 备胎照片 |
| trailer_plate_no | varchar(20) | 挂车车牌 |
| defect_photos | varchar(2000) | 缺陷照片JSON |
| inspection_record_id | bigint | **新增:关联验车记录** |
| remark | varchar(500) | 备注 |
| status | tinyint | 0=待检查 1=已完成 |
| complete_time | datetime | 完成时间 |
| + BaseDO | | |
**移除字段**`check_list`(JSON)、`contract_id``contract_code``enlarged_text_photo`
**关键变更**
- 移除 `contract_id` / `contract_code` — 备车与合同解耦,备车是运维常态
- 移除 `check_list` JSON — 验车数据统一走 `inspection_record`
- 新增 `inspection_record_id` — 关联共享验车记录
**数据迁移**:现有 `asset_vehicle_prepare` 表中 `contract_id``contract_code``check_list``enlarged_text_photo` 字段标记为废弃ALTER TABLE DROP COLUMN现有数据通过脚本迁移 `check_list` JSON 到 `asset_inspection_record` + `asset_inspection_record_item`。若现有数据量小或尚未投产,可直接删除旧列无需迁移。
### 备车创建流程
1. 用户选择车辆 → 创建备车单
2. 系统根据 `biz_type=1(备车)` + 车辆的 `vehicleType` 匹配验车模板 → 调用 `InspectionRecordService.createRecord()` 生成记录
3. 备车人员逐项检查填写(前端动态渲染 inspection_record_item按 category 分组,根据 input_type 渲染不同输入控件)
4. 提交 → 调用 `InspectionRecordService.completeRecord()` → 备车单 status=已完成
---
## 第三部分:交车模块增强
### 数据库变更
`asset_delivery_order` 表变更:
| 操作 | 字段 | 说明 |
|------|------|------|
| 新增 | inspection_record_id (bigint) | 关联验车记录 |
| 保留 | cost_list (JSON) | 费用列表保持原样,不做改动 |
**关于 `inspection_data`**:现有 JSON 字段标记为废弃,新数据不再写入。验车数据统一通过 `inspection_record_id` 关联。待确认无历史依赖后可 DROP COLUMN。
### 交车验车流程
1. 创建交车单时,查找该车最近的备车 `inspection_record`
2. 调用 `InspectionRecordService.cloneRecord()` 克隆为交车记录
3. 预填备车检查结果,交车人员逐项确认/修改
4. 提交验车 → 记录状态=已完成
### 操作列扩展
交车管理页面已完成的交车单,操作列新增:
| 按钮 | 条件 | 行为 |
|------|------|------|
| 还车 | status=已完成 | 弹窗选择该交车单关联的车辆(可多选),调用 `POST /return-order/create-from-delivery`,跳转还车单详情 |
| 替换车 | status=已完成 | 弹窗选择该交车单关联的某辆车,路由跳转替换车新建页,携带 `contractId`, `vehicleId`, `deliveryOrderId` |
---
## 第四部分:替换车模块(从零构建)
### 数据库表
#### `asset_vehicle_replacement`
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint | 主键 |
| replacement_code | varchar(50) | 替换单编码,如 `TH-20260313-001` |
| replacement_type | tinyint | 1=临时替换 2=永久替换 |
| contract_id | bigint | 合同ID |
| contract_code | varchar(50) | 合同编号(冗余) |
| customer_id | bigint | 客户ID |
| customer_name | varchar(100) | 客户名称(冗余) |
| delivery_order_id | bigint | 来源交车单ID从交车页面触发时记录 |
| original_vehicle_id | bigint | 原车ID |
| original_plate_no | varchar(20) | 原车车牌号(冗余) |
| original_vin | varchar(50) | 原车VIN冗余 |
| new_vehicle_id | bigint | 新车ID |
| new_plate_no | varchar(20) | 新车车牌号(冗余) |
| new_vin | varchar(50) | 新车VIN冗余 |
| replacement_reason | varchar(500) | 替换原因 |
| expected_date | date | 预计替换日期 |
| actual_date | date | 实际替换日期 |
| return_date | date | 临时替换预计归还日期 |
| actual_return_date | date | 临时替换实际归还日期 |
| status | tinyint | 业务状态(见状态流转) |
| approval_status | tinyint | 审批状态 |
| bpm_instance_id | varchar(64) | BPM流程实例ID |
| remark | varchar(500) | 备注 |
| + BaseDO | | |
**说明**:冗余字段使用 `plate_no`(车牌号)而非 `vehicleCode`,因为现有 DO 中车辆标识统一使用 `plateNo` + `vin`
### 状态流转
```
草稿(0) → 审批中(1) → 审批通过(2) → 执行中(3) → 已完成(4)
→ 审批驳回(5)
→ 已撤回(6)
```
- 审批通过 + 永久替换 → 自动创建原车还车单壳子,状态进入"执行中"
- 审批通过 + 临时替换 → 状态进入"执行中"
- 执行中 + 临时替换 → 确认换回 → "已完成"
- 执行中 + 永久替换 → 原车还车单完成后 → "已完成"
### 从交车页面快捷触发
交车管理操作列"替换车"按钮 → 路由跳转:
```
/asset/vehicle-replacement/create?contractId=xx&vehicleId=xx&deliveryOrderId=xx
```
替换车表单自动填充合同信息、原车信息(只读),用户只需选择新车、填写原因。
### 后端结构
```
asset-server/
├── dal/dataobject/replacement/
│ └── VehicleReplacementDO.java
├── dal/mysql/replacement/
│ └── VehicleReplacementMapper.java
├── service/replacement/
│ ├── VehicleReplacementService.java
│ ├── VehicleReplacementServiceImpl.java
│ └── listener/
│ └── ReplacementBpmListener.java
├── controller/admin/replacement/
│ ├── VehicleReplacementController.java
│ └── vo/
│ ├── VehicleReplacementSaveReqVO.java
│ ├── VehicleReplacementRespVO.java
│ └── VehicleReplacementPageReqVO.java
└── convert/replacement/
└── VehicleReplacementConvert.java
```
### 接口设计
| 端点 | 方法 | 说明 |
|------|------|------|
| POST /asset/vehicle-replacement/create | create | 创建替换申请 |
| PUT /asset/vehicle-replacement/update | update | 更新(草稿/驳回) |
| DELETE /asset/vehicle-replacement/delete | delete | 删除(草稿) |
| GET /asset/vehicle-replacement/get | get | 获取详情 |
| GET /asset/vehicle-replacement/page | page | 分页查询 |
| POST /asset/vehicle-replacement/submit | submit | 提交BPM审批 |
| POST /asset/vehicle-replacement/withdraw | withdraw | 撤回审批 |
| POST /asset/vehicle-replacement/confirm-return | confirmReturn | 临时替换确认换回 |
---
## 第五部分:还车模块完善
### 现有架构
还车模块采用主子表结构:
- **`asset_return_order`**(主表):还车单基本信息、合同/客户关联、审批状态
- **`asset_return_order_vehicle`**(子表):每辆车的还车详情,含里程、氢量差、各项费用、`checkList`(JSON)
### 数据库变更
#### `asset_return_order`(主表)新增字段
| 字段 | 操作 | 类型 | 说明 |
|------|------|------|------|
| source_type | 新增 | tinyint | 来源1=手动(从交车触发) 2=替换车触发 |
| source_id | 新增 | bigint | 来源业务ID替换车申请ID 或 交车单ID |
| delivery_order_id | 新增 | bigint | 关联交车单ID追溯来源 |
#### `asset_return_order_vehicle`(子表)变更
| 字段 | 操作 | 类型 | 说明 |
|------|------|------|------|
| inspection_record_id | 新增 | bigint | 关联验车记录(每辆车独立验车记录) |
| check_list | 废弃 | JSON | 不再写入新数据,验车统一走 inspection_record |
**关键设计**`inspection_record_id` 放在子表 `asset_return_order_vehicle` 上(而非主表),因为一个还车单可包含多辆车,每辆车有独立的验车记录。
### 状态流转
还车单状态(`status` 字段)保持现有值域不变:
```
待验车(0) → 验车完成(1) → 已结算(2)
```
审批通过 `approval_status` 字段(已有)独立管理:
```
待审批(0) → 审批中(1) → 审批通过(2) → 审批驳回(3) → 已撤回(4)
```
**完整流程**:待验车 → 逐车验车 → 全部验车完成(status=1) → 提交审批(approvalStatus=1) → 审批通过(approvalStatus=2)
费用结算status=2暂不纳入本期。
### 触发方式
1. **从交车管理操作列触发**:用户在交车单操作列点"还车"→ 弹窗选择车辆 → `POST /return-order/create-from-delivery` → 创建还车单壳子(含选中的车辆子记录)→ 跳转还车单详情页
2. **永久替换审批通过自动创建**事件监听器创建source_type=2自动创建一条主记录 + 一条车辆子记录
### 验车流程
1. 用户进入还车单详情 → 选择某辆车 → 点击"开始验车"
2. 系统查找该车最近的交车 inspection_record → 克隆为还车 record
3. 预填交车检查结果,用户逐项确认/修改
4. 提交单车验车 → 该车辆子记录的 `inspection_record_id` 更新
5. 所有车辆验车完成 → 还车单 status=1(验车完成) → 可提交审批
### 接口设计
| 端点 | 方法 | 说明 |
|------|------|------|
| POST /asset/return-order/create | create | 手动创建 |
| POST /asset/return-order/create-from-delivery | createFromDelivery | 从交车记录创建壳子参数deliveryOrderId + vehicleIds[] |
| PUT /asset/return-order/update | update | 更新 |
| DELETE /asset/return-order/delete | delete | 删除(待验车) |
| GET /asset/return-order/get | get | 获取详情(含车辆子表) |
| GET /asset/return-order/page | page | 分页查询 |
| POST /asset/return-order/start-inspection | startInspection | 开始单车验车参数returnOrderVehicleId克隆交车record |
| POST /asset/return-order/complete-inspection | completeInspection | 完成单车验车 |
| POST /asset/return-order/submit | submit | 提交BPM审批验车完成后 |
| POST /asset/return-order/withdraw | withdraw | 撤回审批 |
---
## 第六部分BPM 审批流程
### 需要审批的业务
| 业务 | 流程Key | 触发时机 | 审批通过后动作 |
|------|---------|---------|---------------|
| 租赁合同 | `asset_contract` | 已有,无需新建 | 合同状态→已审批 |
| 替换车申请 | `asset_vehicle_replacement` | 替换申请提交 | 临时→执行中;永久→执行中+创建还车单壳子 |
| 还车 | `asset_return_order` | 验车完成后提交 | 还车单 approvalStatus→审批通过 |
### BPM 集成模式
继承现有 `BpmProcessInstanceStatusEventListener`
```java
// 替换车审批监听
@Component
public class ReplacementBpmListener extends BpmProcessInstanceStatusEventListener {
public static final String PROCESS_KEY = "asset_vehicle_replacement";
@Override
protected String getProcessDefinitionKey() { return PROCESS_KEY; }
@Override
protected void onEvent(BpmProcessInstanceStatusEvent event) {
replacementService.updateApprovalStatus(
Long.parseLong(event.getBusinessKey()), event.getStatus());
}
}
// 还车审批监听
@Component
public class ReturnOrderBpmListener extends BpmProcessInstanceStatusEventListener {
public static final String PROCESS_KEY = "asset_return_order";
@Override
protected String getProcessDefinitionKey() { return PROCESS_KEY; }
@Override
protected void onEvent(BpmProcessInstanceStatusEvent event) {
returnOrderService.updateApprovalStatus(
Long.parseLong(event.getBusinessKey()), event.getStatus());
}
}
```
### BPMN XML 文件
新增两个流程定义,放在 `resources/processes/`
**`asset_vehicle_replacement.bpmn20.xml`** — 带网关:发起 → 部门主管 → (永久替换? → 总经理审批 → 完成
**`asset_return_order.bpmn20.xml`** — 简单串行:发起 → 部门主管审批 → 完成
命名规则与现有 `asset_contract.bpmn20.xml` 一致。
---
## 第七部分:事件驱动 & 跨模块联动
### 事件清单
| 事件类 | 发布者 | 监听者 | 动作 |
|--------|--------|--------|------|
| `DeliveryCompletedEvent` | DeliveryOrderService | VehicleStatusListener | 车辆状态→已交付 |
| `ReplacementApprovedEvent` | ReplacementBpmListener | ReturnOrderEventListener | 永久替换→创建还车单壳子 |
| `ReplacementReturnConfirmedEvent` | ReplacementService | VehicleStatusListener | 临时替换换回→恢复原车状态 |
| `ReturnApprovedEvent` | ReturnOrderBpmListener | VehicleStatusListener | 还车审批通过→车辆状态→可用 |
### 事件监听实现
```java
@Component
public class VehicleStatusEventListener {
@TransactionalEventListener
public void onDeliveryCompleted(DeliveryCompletedEvent event) {
vehicleService.updateStatus(event.getVehicleId(), VehicleStatus.DELIVERED);
}
@TransactionalEventListener
public void onReturnApproved(ReturnApprovedEvent event) {
// 还车单有多辆车,逐辆更新
for (Long vehicleId : event.getVehicleIds()) {
vehicleService.updateStatus(vehicleId, VehicleStatus.AVAILABLE);
}
}
@TransactionalEventListener
public void onReplacementReturnConfirmed(ReplacementReturnConfirmedEvent event) {
vehicleService.updateStatus(event.getOriginalVehicleId(), VehicleStatus.AVAILABLE);
}
}
@Component
public class ReturnOrderEventListener {
// 使用 @EventListener 而非 @TransactionalEventListener
// 确保还车单创建在同一事务中,避免审批已提交但还车单创建失败的不一致
@EventListener
public void onReplacementApproved(ReplacementApprovedEvent event) {
if (event.getReplacementType() == ReplacementType.PERMANENT) {
returnOrderService.createFromReplacement(
event.getReplacementId(),
event.getContractId(),
event.getOriginalVehicleId()
);
}
}
}
```
**关于事务安全**`ReturnOrderEventListener.onReplacementApproved()` 使用 `@EventListener`(非 `@TransactionalEventListener`),确保还车单创建与替换车状态更新在同一事务内完成。`@TransactionalEventListener` 默认 `AFTER_COMMIT`,会导致还车单创建在事务外执行,失败时无法回滚。
---
## 前端变更概要
### 共享验车组件
创建通用验车表单组件 `InspectionForm.vue`
- 按 category 分组展示检查项
- 根据 `input_type` 渲染不同控件:`checkbox` → Radio(合格/不合格/不适用)`number` → InputNumber`text` → Input
- 每项支持:备注 + 图片上传
- 只读模式(查看历史记录)和编辑模式
- 被备车/交车/还车表单复用
### 替换车前端
新建 `views/asset/vehicle-replacement/`
- `index.vue` — 列表页(分页、筛选、操作列)
- `modules/form.vue` — 表单create/edit/view 三模式)
- `data.ts` — 搜索/列/常量定义
### 备车前端改造
- 移除硬编码 `checkList` 表单
- 改用 `InspectionForm.vue` 组件动态渲染
### 交车/还车前端改造
- 交车表单中验车区域改用 `InspectionForm.vue`
- 交车列表操作列增加"还车"和"替换车"按钮
- 还车表单中每辆车增加"开始验车"按钮 + `InspectionForm.vue`
### 新增 API
```typescript
// inspection.ts
export function getInspectionRecord(id: number)
export function updateInspectionRecordItem(data: {...})
export function completeInspection(recordId: number, inspectorName: string)
// vehicle-replacement.ts
export function createReplacement(data: VehicleReplacementSaveReqVO)
export function updateReplacement(data: VehicleReplacementSaveReqVO)
export function deleteReplacement(id: number)
export function getReplacement(id: number)
export function getReplacementPage(params: VehicleReplacementPageReqVO)
export function submitReplacement(id: number)
export function withdrawReplacement(id: number)
export function confirmReplacementReturn(id: number)
// return-order.ts (补充)
export function createFromDelivery(deliveryOrderId: number, vehicleIds: number[])
export function startVehicleInspection(returnOrderVehicleId: number)
export function completeVehicleInspection(returnOrderVehicleId: number)
export function submitReturnOrder(id: number)
export function withdrawReturnOrder(id: number)
```
---
## 实施顺序
1. **共享验车模板** — SQL建表 → DO/Mapper → Service → Controller → 前端组件
2. **备车精简** — 移除旧字段 → 对接 inspection_record → 前端改造
3. **交车增强** — 新增 inspection_record_id → 废弃 inspection_data → 操作列扩展 → 前端改造
4. **替换车模块** — 全套新建DO → VO → Mapper → Service → BPM listener → Controller → 前端)
5. **还车完善** — 新增字段 → 对接验车模板(子表级别) → 从交车/替换车触发 → BPM listener → 前端改造
6. **BPM 部署** — 创建 BPMN XML → 部署到引擎
7. **事件驱动** — 事件类 → 监听器 → 车辆状态同步
8. **端到端验证**`mvn compile` + `pnpm run build:antd` + 全链路测试

View File

@@ -19,6 +19,7 @@
<module>yudao-module-bpm</module>
<module>yudao-module-asset</module>
<module>yudao-module-ocr</module>
<module>yudao-module-energy</module>
</modules>
<name>${project.artifactId}</name>

View File

@@ -0,0 +1,3 @@
-- 交车单表增加验车记录关联字段
ALTER TABLE asset_delivery_order
ADD COLUMN inspection_record_id bigint DEFAULT NULL COMMENT '关联验车记录';

View File

@@ -0,0 +1,156 @@
-- ============================================================
-- 租赁全链路建表 + 菜单权限
-- 执行顺序:先在 oneos_asset 执行建表,再在 oneos_system 执行菜单插入
-- ============================================================
-- ==================== Part 1: oneos_asset 建表 ====================
-- 1. 验车模板定义
CREATE TABLE IF NOT EXISTS `asset_inspection_template` (
`id` bigint NOT NULL AUTO_INCREMENT,
`code` varchar(50) NOT NULL COMMENT '模板编码',
`name` varchar(100) NOT NULL COMMENT '模板名称',
`biz_type` tinyint NOT NULL COMMENT '适用业务1=备车 2=交车 3=还车',
`vehicle_type` varchar(50) DEFAULT NULL COMMENT '适用车辆类型nullable=通用)',
`status` tinyint NOT NULL DEFAULT 1 COMMENT '0=禁用 1=启用',
`remark` varchar(500) DEFAULT NULL,
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='验车模板定义';
-- 2. 验车模板检查项
CREATE TABLE IF NOT EXISTS `asset_inspection_template_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`template_id` bigint NOT NULL COMMENT '关联模板',
`category` varchar(50) NOT NULL COMMENT '分类',
`item_name` varchar(100) NOT NULL COMMENT '检查项名称',
`item_code` varchar(50) NOT NULL COMMENT '检查项编码',
`input_type` varchar(20) NOT NULL DEFAULT 'checkbox' COMMENT '输入类型checkbox/number/text',
`sort` int NOT NULL DEFAULT 0,
`required` tinyint NOT NULL DEFAULT 1 COMMENT '0=否 1=是',
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_template_id` (`template_id`)
) ENGINE=InnoDB COMMENT='验车模板检查项';
-- 3. 验车记录
CREATE TABLE IF NOT EXISTS `asset_inspection_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`record_code` varchar(50) NOT NULL COMMENT '记录编码',
`template_id` bigint NOT NULL COMMENT '使用的模板',
`source_type` tinyint NOT NULL COMMENT '来源1=备车 2=交车 3=还车',
`source_id` bigint NOT NULL COMMENT '来源业务ID',
`vehicle_id` bigint NOT NULL COMMENT '车辆ID',
`inspector_name` varchar(50) DEFAULT NULL COMMENT '检查人',
`inspection_time` datetime DEFAULT NULL COMMENT '检查时间',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0=待检查 1=检查中 2=已完成',
`overall_result` tinyint DEFAULT NULL COMMENT '1=合格 2=不合格',
`remark` varchar(500) DEFAULT NULL,
`cloned_from_id` bigint DEFAULT NULL COMMENT '克隆来源记录ID',
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_vehicle_source` (`vehicle_id`, `source_type`)
) ENGINE=InnoDB COMMENT='验车记录';
-- 4. 验车记录检查项结果
CREATE TABLE IF NOT EXISTS `asset_inspection_record_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`record_id` bigint NOT NULL COMMENT '关联记录',
`item_code` varchar(50) NOT NULL COMMENT '检查项编码',
`category` varchar(50) NOT NULL COMMENT '分类',
`item_name` varchar(100) NOT NULL COMMENT '检查项名称',
`input_type` varchar(20) NOT NULL DEFAULT 'checkbox' COMMENT '输入类型',
`result` tinyint DEFAULT NULL COMMENT '1=合格 2=不合格 3=不适用',
`value` varchar(200) DEFAULT NULL COMMENT '数值/文本输入值',
`remark` varchar(500) DEFAULT NULL,
`image_urls` varchar(2000) DEFAULT NULL COMMENT '图片URL逗号分隔',
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`),
KEY `idx_record_id` (`record_id`)
) ENGINE=InnoDB COMMENT='验车记录检查项结果';
-- 5. 替换车申请
CREATE TABLE IF NOT EXISTS `asset_vehicle_replacement` (
`id` bigint NOT NULL AUTO_INCREMENT,
`replacement_code` varchar(50) NOT NULL COMMENT '替换单编码',
`replacement_type` tinyint NOT NULL COMMENT '1=临时 2=永久',
`contract_id` bigint NOT NULL,
`contract_code` varchar(50) DEFAULT NULL,
`project_name` varchar(200) DEFAULT NULL,
`customer_id` bigint DEFAULT NULL,
`customer_name` varchar(100) DEFAULT NULL,
`delivery_order_id` bigint DEFAULT NULL COMMENT '来源交车单ID',
`original_vehicle_id` bigint NOT NULL,
`original_plate_no` varchar(20) DEFAULT NULL,
`original_vin` varchar(50) DEFAULT NULL,
`new_vehicle_id` bigint DEFAULT NULL,
`new_plate_no` varchar(20) DEFAULT NULL,
`new_vin` varchar(50) DEFAULT NULL,
`replacement_reason` varchar(500) DEFAULT NULL,
`expected_date` date DEFAULT NULL,
`actual_date` date DEFAULT NULL,
`return_date` date DEFAULT NULL COMMENT '临时替换预计归还日期',
`actual_return_date` date DEFAULT NULL,
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0=草稿 1=审批中 2=审批通过 3=执行中 4=已完成 5=审批驳回 6=已撤回',
`approval_status` tinyint NOT NULL DEFAULT 0,
`bpm_instance_id` varchar(64) DEFAULT NULL,
`remark` varchar(500) DEFAULT NULL,
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='替换车申请';
-- ==================== Part 2: oneos_system 菜单权限 ====================
-- parent_id=5055 为"资产管理"一级菜单,从 id=5161 开始
-- 验车模板管理 - 页面菜单 (type=2)
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(5161, '验车模板', '', 2, 15, 5055, 'inspection-template', '', 'asset/inspection-template/index', 'InspectionTemplate', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 验车模板 - 权限按钮 (type=3)
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(5162, '验车模板查询', 'asset:inspection-template:query', 3, 1, 5161, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5163, '验车模板创建', 'asset:inspection-template:create', 3, 2, 5161, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5164, '验车模板更新', 'asset:inspection-template:update', 3, 3, 5161, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5165, '验车模板删除', 'asset:inspection-template:delete', 3, 4, 5161, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 验车记录 - 权限按钮 (挂在验车模板下,无独立页面)
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(5166, '验车记录查询', 'asset:inspection-record:query', 3, 5, 5161, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5167, '验车记录更新', 'asset:inspection-record:update', 3, 6, 5161, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 替换车管理 - 页面菜单 (type=2)
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(5170, '替换车管理', '', 2, 16, 5055, 'vehicle-replacement', '', 'asset/vehicle-replacement/index', 'VehicleReplacement', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 替换车管理 - 权限按钮 (type=3)
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(5171, '替换车查询', 'asset:vehicle-replacement:query', 3, 1, 5170, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5172, '替换车创建', 'asset:vehicle-replacement:create', 3, 2, 5170, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5173, '替换车更新', 'asset:vehicle-replacement:update', 3, 3, 5170, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0'),
(5174, '替换车删除', 'asset:vehicle-replacement:delete', 3, 4, 5170, '', '', '', '', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');

View File

@@ -0,0 +1,3 @@
-- 备车表增加验车记录关联字段
ALTER TABLE asset_vehicle_prepare
ADD COLUMN inspection_record_id bigint DEFAULT NULL COMMENT '关联验车记录' AFTER defect_photos;

View File

@@ -0,0 +1,9 @@
-- 还车单增强添加来源类型、来源ID、关联交车单ID
ALTER TABLE asset_return_order
ADD COLUMN source_type tinyint DEFAULT NULL COMMENT '来源1=手动 2=替换车触发',
ADD COLUMN source_id bigint DEFAULT NULL COMMENT '来源业务ID',
ADD COLUMN delivery_order_id bigint DEFAULT NULL COMMENT '关联交车单ID';
-- 还车车辆增强:添加验车记录关联
ALTER TABLE asset_return_order_vehicle
ADD COLUMN inspection_record_id bigint DEFAULT NULL COMMENT '关联验车记录';

View File

@@ -0,0 +1,32 @@
CREATE TABLE IF NOT EXISTS `asset_vehicle_replacement` (
`id` bigint NOT NULL AUTO_INCREMENT,
`replacement_code` varchar(50) NOT NULL COMMENT '替换单编码',
`replacement_type` tinyint NOT NULL COMMENT '1=临时 2=永久',
`contract_id` bigint NOT NULL,
`contract_code` varchar(50) DEFAULT NULL,
`customer_id` bigint DEFAULT NULL,
`customer_name` varchar(100) DEFAULT NULL,
`delivery_order_id` bigint DEFAULT NULL COMMENT '来源交车单ID',
`original_vehicle_id` bigint NOT NULL,
`original_plate_no` varchar(20) DEFAULT NULL,
`original_vin` varchar(50) DEFAULT NULL,
`new_vehicle_id` bigint DEFAULT NULL,
`new_plate_no` varchar(20) DEFAULT NULL,
`new_vin` varchar(50) DEFAULT NULL,
`replacement_reason` varchar(500) DEFAULT NULL,
`expected_date` date DEFAULT NULL,
`actual_date` date DEFAULT NULL,
`return_date` date DEFAULT NULL COMMENT '临时替换预计归还日期',
`actual_return_date` date DEFAULT NULL,
`status` tinyint NOT NULL DEFAULT 0 COMMENT '0=草稿 1=审批中 2=审批通过 3=执行中 4=已完成 5=审批驳回 6=已撤回',
`approval_status` tinyint NOT NULL DEFAULT 0,
`bpm_instance_id` varchar(64) DEFAULT NULL,
`remark` varchar(500) DEFAULT NULL,
`creator` varchar(64) DEFAULT '',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updater` varchar(64) DEFAULT '',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` bit(1) NOT NULL DEFAULT b'0',
`tenant_id` bigint NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='替换车申请';

View File

@@ -0,0 +1,62 @@
-- ==========================================
-- 2026-03-16 Energy 模块优化
-- 新增加氢站基础信息表asset 模块)
-- 去掉 energy_station_config 表
-- ==========================================
-- ----------------------------
-- 1. 在 asset 模块创建加氢站表
-- ----------------------------
DROP TABLE IF EXISTS `asset_hydrogen_station`;
CREATE TABLE `asset_hydrogen_station` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`name` varchar(100) NOT NULL COMMENT '站点名称',
`short_name` varchar(50) DEFAULT NULL COMMENT '简称',
`station_no` varchar(50) DEFAULT NULL COMMENT '站点编码',
`city` varchar(50) DEFAULT NULL COMMENT '所属城市',
`address` varchar(255) DEFAULT NULL COMMENT '站点地址',
`longitude` varchar(50) DEFAULT NULL COMMENT '经度',
`latitude` varchar(50) DEFAULT NULL COMMENT '纬度',
`contact` varchar(50) DEFAULT NULL COMMENT '联系人',
`phone` varchar(20) DEFAULT NULL COMMENT '联系电话',
`station_type` tinyint DEFAULT NULL COMMENT '站点类型(字典)',
`cooperation_type` tinyint NOT NULL DEFAULT 0 COMMENT '合作类型0=合作 1=非合作)',
`auto_deduct` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否自动扣款1=是 0=否)',
`booking_required` tinyint(1) DEFAULT 0 COMMENT '是否需要预约1=是 0=否)',
`station_status` tinyint NOT NULL DEFAULT 1 COMMENT '站点状态0=停用 1=启用)',
`start_business` time DEFAULT NULL COMMENT '开始营业时间',
`end_business` time DEFAULT NULL COMMENT '结束营业时间',
`billing_method` tinyint DEFAULT NULL COMMENT '结算方式(字典)',
`cooperation_term` date DEFAULT NULL COMMENT '合作期限',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_station_no` (`station_no`),
KEY `idx_name` (`name`),
KEY `idx_city` (`city`),
KEY `idx_station_status` (`station_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢站基础信息';
-- ----------------------------
-- 2. 删除 energy_station_config 表
-- ----------------------------
DROP TABLE IF EXISTS `energy_station_config`;
-- ----------------------------
-- 3. 插入测试数据
-- ----------------------------
INSERT INTO `asset_hydrogen_station`
(`id`, `name`, `short_name`, `station_no`, `city`, `address`, `contact`, `phone`,
`cooperation_type`, `auto_deduct`, `station_status`, `start_business`, `end_business`, `remark`)
VALUES
(1, '嘉兴嘉燃经开站', '经开站', 'JX001', '嘉兴', '浙江省嘉兴市经济开发区岗山路', '张三', '13800138000',
0, 1, 1, '08:00:00', '18:00:00', '合作站点,自动扣款'),
(2, '上海临港加氢站', '临港站', 'SH001', '上海', '上海市浦东新区临港新城', '李四', '13900139000',
0, 1, 1, '07:00:00', '19:00:00', '合作站点,自动扣款'),
(3, '杭州萧山加氢站', '萧山站', 'HZ001', '杭州', '浙江省杭州市萧山区', '王五', '13700137000',
1, 0, 1, '08:30:00', '17:30:00', '非合作站点,审核后扣款');

View File

@@ -0,0 +1,64 @@
#!/usr/bin/env python3
"""
检查数据库表结构
"""
import pymysql
def check_tables(host, port, user, password, database):
"""检查表是否存在及字段"""
try:
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database=database,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor
)
print(f"✓ 连接数据库成功: {database}")
tables = [
'asset_parking',
'asset_customer',
'asset_vehicle_base',
'asset_vehicle_business',
'asset_contract'
]
with connection.cursor() as cursor:
for table in tables:
# 检查表是否存在
cursor.execute(f"SHOW TABLES LIKE '{table}'")
result = cursor.fetchone()
if result:
print(f"\n✓ 表 {table} 存在")
# 显示字段
cursor.execute(f"DESCRIBE {table}")
columns = cursor.fetchall()
print(f" 字段: {', '.join([col['Field'] for col in columns[:10]])}")
if len(columns) > 10:
print(f" ... 共 {len(columns)} 个字段")
else:
print(f"\n✗ 表 {table} 不存在")
connection.close()
except Exception as e:
print(f"✗ 错误: {e}")
if __name__ == '__main__':
DB_HOST = '47.103.115.36'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = 'Passw0rd2026'
print("检查 oneos_asset 数据库:")
check_tables(DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, 'oneos_asset')
print("\n" + "="*60)
print("检查 oneos_energy 数据库:")
check_tables(DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, 'oneos_energy')

View File

@@ -0,0 +1,3 @@
-- energy_alter_frontend.sql
ALTER TABLE energy_bill ADD COLUMN cooperation_type TINYINT DEFAULT NULL COMMENT '合作模式1=预充值 2=月结算)' AFTER station_name;
ALTER TABLE energy_station_config ADD COLUMN auto_match TINYINT DEFAULT 1 COMMENT '自动匹配开关0=关闭 1=开启)' AFTER cooperation_type;

View File

@@ -0,0 +1,282 @@
-- ==========================================
-- 能源账单模块建表 SQL331 一期9 张表)
-- ==========================================
-- ----------------------------
-- 1. energy_hydrogen_record — 加氢原始记录
-- ----------------------------
DROP TABLE IF EXISTS `energy_hydrogen_record`;
CREATE TABLE `energy_hydrogen_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`station_id` bigint NOT NULL COMMENT '加氢站 ID关联 asset 模块)',
`plate_number` varchar(20) NOT NULL COMMENT '车牌号',
`hydrogen_date` date NOT NULL COMMENT '加氢日期',
`hydrogen_quantity` decimal(10,2) NOT NULL COMMENT '加氢量KG',
`unit_price` decimal(10,2) NOT NULL COMMENT '单价(元/KG',
`amount` decimal(12,2) NOT NULL COMMENT '金额(以数据源原始值为准,不重新计算)',
`mileage` decimal(12,2) DEFAULT NULL COMMENT '里程数',
`source_type` tinyint NOT NULL COMMENT '数据来源1=Excel 2=Web 3=API 4=OCR',
`match_status` tinyint NOT NULL DEFAULT 0 COMMENT '匹配状态0=未匹配 1=已匹配 2=无法匹配)',
`vehicle_id` bigint DEFAULT NULL COMMENT '匹配到的车辆 ID匹配后填充',
`customer_id` bigint DEFAULT NULL COMMENT '匹配到的客户 ID匹配后填充',
`upload_batch_no` varchar(64) DEFAULT NULL COMMENT '导入批次号(幂等去重)',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_station_id` (`station_id`),
KEY `idx_plate_number` (`plate_number`),
KEY `idx_hydrogen_date` (`hydrogen_date`),
KEY `idx_match_status` (`match_status`),
KEY `idx_upload_batch_no` (`upload_batch_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢原始记录';
-- ----------------------------
-- 2. energy_hydrogen_detail — 加氢明细
-- ----------------------------
DROP TABLE IF EXISTS `energy_hydrogen_detail`;
CREATE TABLE `energy_hydrogen_detail` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`record_id` bigint NOT NULL COMMENT '关联原始记录 ID',
`station_id` bigint NOT NULL COMMENT '加氢站 ID',
`vehicle_id` bigint NOT NULL COMMENT '车辆 ID',
`plate_number` varchar(20) NOT NULL COMMENT '车牌号(冗余)',
`hydrogen_date` date NOT NULL COMMENT '加氢日期',
`hydrogen_quantity` decimal(10,2) NOT NULL COMMENT '加氢量KG',
`cost_price` decimal(10,2) NOT NULL COMMENT '成本单价(元/KG',
`cost_amount` decimal(12,2) NOT NULL COMMENT '成本金额',
`customer_price` decimal(10,2) NOT NULL COMMENT '对客单价(元/KG',
`customer_amount` decimal(12,2) NOT NULL COMMENT '对客金额',
`contract_id` bigint NOT NULL COMMENT '合同 ID',
`customer_id` bigint NOT NULL COMMENT '客户 ID',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称(冗余)',
`cost_bearer` tinyint NOT NULL COMMENT '费用承担方1=客户承担 2=羚牛承担 3=自行结算)',
`pay_method` tinyint NOT NULL COMMENT '支付方式1=预充值 2=月结算)',
`audit_status` tinyint NOT NULL DEFAULT 0 COMMENT '审核状态0=待审核 1=已审核 2=已驳回)',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`deduction_status` tinyint NOT NULL DEFAULT 0 COMMENT '扣款状态0=未扣款 1=已扣款)',
`settlement_status` tinyint NOT NULL DEFAULT 0 COMMENT '结算状态0=未结算 1=已结算)',
`bill_id` bigint DEFAULT NULL COMMENT '关联账单 ID',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_record_id` (`record_id`),
KEY `idx_station_id` (`station_id`),
KEY `idx_vehicle_id` (`vehicle_id`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_contract_id` (`contract_id`),
KEY `idx_bill_id` (`bill_id`),
KEY `idx_audit_status` (`audit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢明细';
-- ----------------------------
-- 3. energy_bill — 能源账单
-- ----------------------------
DROP TABLE IF EXISTS `energy_bill`;
CREATE TABLE `energy_bill` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`bill_code` varchar(32) NOT NULL COMMENT '账单编号(唯一)',
`energy_type` tinyint NOT NULL COMMENT '能源类型1=氢 2=电 3=ETC',
`customer_id` bigint NOT NULL COMMENT '客户 ID',
`customer_name` varchar(100) DEFAULT NULL COMMENT '客户名称(冗余)',
`contract_id` bigint NOT NULL COMMENT '合同 ID',
`station_id` bigint DEFAULT NULL COMMENT '加氢站 ID',
`station_name` varchar(100) DEFAULT NULL COMMENT '站点名称(冗余)',
`bill_period_start` date NOT NULL COMMENT '账单周期开始日期',
`bill_period_end` date NOT NULL COMMENT '账单周期结束日期',
`receivable_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '应收总额',
`actual_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '实收总额receivable_amount + adjustment_amount',
`adjustment_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '调整总额(可正可负)',
`paid_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '已收金额',
`total_quantity` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '总加氢量/总度数',
`detail_count` int NOT NULL DEFAULT 0 COMMENT '明细条数',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '账单状态0=草稿 1=已生成 2=已作废)',
`audit_status` tinyint NOT NULL DEFAULT 0 COMMENT '审核状态0=待审核 1=已审核 2=已驳回)',
`submit_status` tinyint NOT NULL DEFAULT 0 COMMENT '提交状态0=未提交 1=已提交 2=已驳回)',
`payment_status` tinyint NOT NULL DEFAULT 0 COMMENT '支付状态0=未支付 1=部分支付 2=已结清)',
`auditor_id` bigint DEFAULT NULL COMMENT '审核人 ID',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`generate_time` datetime DEFAULT NULL COMMENT '账单生成时间',
`yos_bill_code` varchar(64) DEFAULT NULL COMMENT 'YOS 账单编号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bill_code` (`bill_code`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_contract_id` (`contract_id`),
KEY `idx_station_id` (`station_id`),
KEY `idx_bill_period` (`bill_period_start`, `bill_period_end`),
KEY `idx_status` (`status`),
KEY `idx_audit_status` (`audit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能源账单';
-- ----------------------------
-- 4. energy_bill_adjustment — 账单调整记录
-- ----------------------------
DROP TABLE IF EXISTS `energy_bill_adjustment`;
CREATE TABLE `energy_bill_adjustment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`bill_id` bigint NOT NULL COMMENT '关联账单 ID',
`detail_id` bigint DEFAULT NULL COMMENT '关联明细 ID可选',
`adjustment_type` tinyint NOT NULL COMMENT '调整类型1=增加 2=减少)',
`amount` decimal(12,2) NOT NULL COMMENT '调整金额(正数)',
`reason` varchar(500) DEFAULT NULL COMMENT '调整原因',
`attachment_urls` varchar(1000) DEFAULT NULL COMMENT '附件 URLJSON 数组)',
`operator_id` bigint DEFAULT NULL COMMENT '操作人 ID',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_bill_id` (`bill_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单调整记录';
-- ----------------------------
-- 5. energy_account — 客户能源总账户
-- ----------------------------
DROP TABLE IF EXISTS `energy_account`;
CREATE TABLE `energy_account` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`customer_id` bigint NOT NULL COMMENT '客户 ID唯一',
`balance` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '当前余额(可为负数)',
`init_balance` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '初始余额',
`accumulated_recharge` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计充值',
`accumulated_hydrogen` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计氢费',
`accumulated_electric` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计电费',
`accumulated_consume` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计消费(所有能源类型合计)',
`reminder_threshold` decimal(14,2) DEFAULT NULL COMMENT '提醒阈值(低于此值触发预警)',
`account_status` tinyint NOT NULL DEFAULT 0 COMMENT '账户状态0=正常 1=预警 2=欠费)',
`last_recharge_date` date DEFAULT NULL COMMENT '最后充值日期',
`version` int NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_customer_id` (`customer_id`),
KEY `idx_account_status` (`account_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户能源总账户';
-- ----------------------------
-- 6. energy_project_account — 项目账户
-- ----------------------------
DROP TABLE IF EXISTS `energy_project_account`;
CREATE TABLE `energy_project_account` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`account_id` bigint NOT NULL COMMENT '关联总账户 ID',
`contract_id` bigint NOT NULL COMMENT '合同 ID唯一',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称',
`project_balance` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '项目余额',
`project_remit_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计划账金额',
`project_hydrogen_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计氢费',
`project_electric_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计电费',
`project_consume_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计消费',
`reminder_threshold` decimal(14,2) DEFAULT NULL COMMENT '提醒阈值',
`account_status` tinyint NOT NULL DEFAULT 0 COMMENT '账户状态0=正常 1=预警 2=欠费)',
`version` int NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_id` (`contract_id`),
KEY `idx_account_id` (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目账户';
-- ----------------------------
-- 7. energy_account_flow — 统一余额变更流水
-- ----------------------------
DROP TABLE IF EXISTS `energy_account_flow`;
CREATE TABLE `energy_account_flow` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`account_id` bigint NOT NULL COMMENT '关联总账户 ID',
`project_account_id` bigint DEFAULT NULL COMMENT '关联项目账户 ID可选',
`flow_type` tinyint NOT NULL COMMENT '流水类型1=充值 2=扣款 3=冲正 4=划账 5=退款)',
`amount` decimal(14,2) NOT NULL COMMENT '变动金额',
`balance_before` decimal(14,2) NOT NULL COMMENT '变动前余额(总账户级别)',
`balance_after` decimal(14,2) NOT NULL COMMENT '变动后余额(总账户级别)',
`project_balance_before` decimal(14,2) DEFAULT NULL COMMENT '变动前项目余额(仅项目账户操作时填写)',
`project_balance_after` decimal(14,2) DEFAULT NULL COMMENT '变动后项目余额(仅项目账户操作时填写)',
`biz_type` tinyint NOT NULL COMMENT '业务类型1=加氢扣款 2=账单结算 3=手动调整 ...',
`biz_id` bigint DEFAULT NULL COMMENT '关联单据 ID',
`biz_code` varchar(64) DEFAULT NULL COMMENT '关联单据编号',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint DEFAULT NULL COMMENT '操作人 ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_project_account_id` (`project_account_id`),
KEY `idx_biz_type_biz_id` (`biz_type`, `biz_id`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='统一余额变更流水';
-- ----------------------------
-- 8. energy_station_price — 加氢站客户价格
-- ----------------------------
DROP TABLE IF EXISTS `energy_station_price`;
CREATE TABLE `energy_station_price` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`station_id` bigint NOT NULL COMMENT '加氢站 ID',
`customer_id` bigint NOT NULL COMMENT '客户 ID',
`cost_price` decimal(10,2) NOT NULL COMMENT '成本价(元/KG',
`customer_price` decimal(10,2) NOT NULL COMMENT '对客价(元/KG',
`effective_date` date NOT NULL COMMENT '生效日期',
`expiry_date` date DEFAULT NULL COMMENT '失效日期(可空,空=永久生效)',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态0=生效中 1=已失效)',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_station_customer_date` (`station_id`, `customer_id`, `effective_date`),
KEY `idx_station_id` (`station_id`),
KEY `idx_customer_id` (`customer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢站客户价格';
-- ----------------------------
-- 9. energy_station_config — 加氢站扣款配置
-- ----------------------------
DROP TABLE IF EXISTS `energy_station_config`;
CREATE TABLE `energy_station_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`station_id` bigint NOT NULL COMMENT '加氢站 ID唯一每站一条记录',
`auto_deduct` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否自动扣款1=是 0=否)',
`cooperation_type` tinyint NOT NULL DEFAULT 0 COMMENT '合作类型0=合作 1=非合作)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_station_id` (`station_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢站扣款配置';

View File

@@ -0,0 +1,432 @@
-- ==========================================
-- Energy 模块一键初始化脚本
-- 使用方式:
-- 1. 用数据库工具连接 47.103.115.36:3306 (root/Passw0rd2026)
-- 2. 直接执行本脚本(脚本内部会切换数据库)
-- ==========================================
-- ==========================================
-- 第一部分: 创建 oneos_energy 数据库 + 建表
-- ==========================================
CREATE DATABASE IF NOT EXISTS `oneos_energy` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE `oneos_energy`;
-- ----------------------------
-- 1. energy_hydrogen_record — 加氢原始记录
-- ----------------------------
DROP TABLE IF EXISTS `energy_hydrogen_record`;
CREATE TABLE `energy_hydrogen_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`station_id` bigint NOT NULL COMMENT '加氢站 ID关联 asset 模块)',
`plate_number` varchar(20) NOT NULL COMMENT '车牌号',
`hydrogen_date` date NOT NULL COMMENT '加氢日期',
`hydrogen_quantity` decimal(10,2) NOT NULL COMMENT '加氢量KG',
`unit_price` decimal(10,2) NOT NULL COMMENT '单价(元/KG',
`amount` decimal(12,2) NOT NULL COMMENT '金额(以数据源原始值为准,不重新计算)',
`mileage` decimal(12,2) DEFAULT NULL COMMENT '里程数',
`source_type` tinyint NOT NULL COMMENT '数据来源1=Excel 2=Web 3=API 4=OCR',
`match_status` tinyint NOT NULL DEFAULT 0 COMMENT '匹配状态0=未匹配 1=已匹配 2=无法匹配)',
`vehicle_id` bigint DEFAULT NULL COMMENT '匹配到的车辆 ID匹配后填充',
`customer_id` bigint DEFAULT NULL COMMENT '匹配到的客户 ID匹配后填充',
`upload_batch_no` varchar(64) DEFAULT NULL COMMENT '导入批次号(幂等去重)',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_station_id` (`station_id`),
KEY `idx_plate_number` (`plate_number`),
KEY `idx_hydrogen_date` (`hydrogen_date`),
KEY `idx_match_status` (`match_status`),
KEY `idx_upload_batch_no` (`upload_batch_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢原始记录';
-- ----------------------------
-- 2. energy_hydrogen_detail — 加氢明细
-- ----------------------------
DROP TABLE IF EXISTS `energy_hydrogen_detail`;
CREATE TABLE `energy_hydrogen_detail` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`record_id` bigint NOT NULL COMMENT '关联原始记录 ID',
`station_id` bigint NOT NULL COMMENT '加氢站 ID',
`vehicle_id` bigint NOT NULL COMMENT '车辆 ID',
`plate_number` varchar(20) NOT NULL COMMENT '车牌号(冗余)',
`hydrogen_date` date NOT NULL COMMENT '加氢日期',
`hydrogen_quantity` decimal(10,2) NOT NULL COMMENT '加氢量KG',
`cost_price` decimal(10,2) NOT NULL COMMENT '成本单价(元/KG',
`cost_amount` decimal(12,2) NOT NULL COMMENT '成本金额',
`customer_price` decimal(10,2) NOT NULL COMMENT '对客单价(元/KG',
`customer_amount` decimal(12,2) NOT NULL COMMENT '对客金额',
`contract_id` bigint NOT NULL COMMENT '合同 ID',
`customer_id` bigint NOT NULL COMMENT '客户 ID',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称(冗余)',
`cost_bearer` tinyint NOT NULL COMMENT '费用承担方1=客户承担 2=羚牛承担 3=自行结算)',
`pay_method` tinyint NOT NULL COMMENT '支付方式1=预充值 2=月结算)',
`audit_status` tinyint NOT NULL DEFAULT 0 COMMENT '审核状态0=待审核 1=已审核 2=已驳回)',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`deduction_status` tinyint NOT NULL DEFAULT 0 COMMENT '扣款状态0=未扣款 1=已扣款)',
`settlement_status` tinyint NOT NULL DEFAULT 0 COMMENT '结算状态0=未结算 1=已结算)',
`bill_id` bigint DEFAULT NULL COMMENT '关联账单 ID',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_record_id` (`record_id`),
KEY `idx_station_id` (`station_id`),
KEY `idx_vehicle_id` (`vehicle_id`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_contract_id` (`contract_id`),
KEY `idx_bill_id` (`bill_id`),
KEY `idx_audit_status` (`audit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢明细';
-- ----------------------------
-- 3. energy_bill — 能源账单
-- ----------------------------
DROP TABLE IF EXISTS `energy_bill`;
CREATE TABLE `energy_bill` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`bill_code` varchar(32) NOT NULL COMMENT '账单编号(唯一)',
`energy_type` tinyint NOT NULL COMMENT '能源类型1=氢 2=电 3=ETC',
`customer_id` bigint NOT NULL COMMENT '客户 ID',
`customer_name` varchar(100) DEFAULT NULL COMMENT '客户名称(冗余)',
`contract_id` bigint NOT NULL COMMENT '合同 ID',
`station_id` bigint DEFAULT NULL COMMENT '加氢站 ID',
`station_name` varchar(100) DEFAULT NULL COMMENT '站点名称(冗余)',
`cooperation_type` tinyint DEFAULT NULL COMMENT '合作模式1=预充值 2=月结算)',
`bill_period_start` date NOT NULL COMMENT '账单周期开始日期',
`bill_period_end` date NOT NULL COMMENT '账单周期结束日期',
`receivable_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '应收总额',
`actual_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '实收总额receivable_amount + adjustment_amount',
`adjustment_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '调整总额(可正可负)',
`paid_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '已收金额',
`total_quantity` decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '总加氢量/总度数',
`detail_count` int NOT NULL DEFAULT 0 COMMENT '明细条数',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '账单状态0=草稿 1=已生成 2=已作废)',
`audit_status` tinyint NOT NULL DEFAULT 0 COMMENT '审核状态0=待审核 1=已审核 2=已驳回)',
`submit_status` tinyint NOT NULL DEFAULT 0 COMMENT '提交状态0=未提交 1=已提交 2=已驳回)',
`payment_status` tinyint NOT NULL DEFAULT 0 COMMENT '支付状态0=未支付 1=部分支付 2=已结清)',
`auditor_id` bigint DEFAULT NULL COMMENT '审核人 ID',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`generate_time` datetime DEFAULT NULL COMMENT '账单生成时间',
`yos_bill_code` varchar(64) DEFAULT NULL COMMENT 'YOS 账单编号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_bill_code` (`bill_code`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_contract_id` (`contract_id`),
KEY `idx_station_id` (`station_id`),
KEY `idx_bill_period` (`bill_period_start`, `bill_period_end`),
KEY `idx_status` (`status`),
KEY `idx_audit_status` (`audit_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能源账单';
-- ----------------------------
-- 4. energy_bill_adjustment — 账单调整记录
-- ----------------------------
DROP TABLE IF EXISTS `energy_bill_adjustment`;
CREATE TABLE `energy_bill_adjustment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`bill_id` bigint NOT NULL COMMENT '关联账单 ID',
`detail_id` bigint DEFAULT NULL COMMENT '关联明细 ID可选',
`adjustment_type` tinyint NOT NULL COMMENT '调整类型1=增加 2=减少)',
`amount` decimal(12,2) NOT NULL COMMENT '调整金额(正数)',
`reason` varchar(500) DEFAULT NULL COMMENT '调整原因',
`attachment_urls` varchar(1000) DEFAULT NULL COMMENT '附件 URLJSON 数组)',
`operator_id` bigint DEFAULT NULL COMMENT '操作人 ID',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_bill_id` (`bill_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单调整记录';
-- ----------------------------
-- 5. energy_account — 客户能源总账户
-- ----------------------------
DROP TABLE IF EXISTS `energy_account`;
CREATE TABLE `energy_account` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`customer_id` bigint NOT NULL COMMENT '客户 ID唯一',
`balance` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '当前余额(可为负数)',
`init_balance` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '初始余额',
`accumulated_recharge` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计充值',
`accumulated_hydrogen` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计氢费',
`accumulated_electric` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计电费',
`accumulated_consume` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计消费(所有能源类型合计)',
`reminder_threshold` decimal(14,2) DEFAULT NULL COMMENT '提醒阈值(低于此值触发预警)',
`account_status` tinyint NOT NULL DEFAULT 0 COMMENT '账户状态0=正常 1=预警 2=欠费)',
`last_recharge_date` date DEFAULT NULL COMMENT '最后充值日期',
`version` int NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_customer_id` (`customer_id`),
KEY `idx_account_status` (`account_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户能源总账户';
-- ----------------------------
-- 6. energy_project_account — 项目账户
-- ----------------------------
DROP TABLE IF EXISTS `energy_project_account`;
CREATE TABLE `energy_project_account` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`account_id` bigint NOT NULL COMMENT '关联总账户 ID',
`contract_id` bigint NOT NULL COMMENT '合同 ID唯一',
`project_name` varchar(100) DEFAULT NULL COMMENT '项目名称',
`project_balance` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '项目余额',
`project_remit_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计划账金额',
`project_hydrogen_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计氢费',
`project_electric_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计电费',
`project_consume_amount` decimal(14,2) NOT NULL DEFAULT 0.00 COMMENT '累计消费',
`reminder_threshold` decimal(14,2) DEFAULT NULL COMMENT '提醒阈值',
`account_status` tinyint NOT NULL DEFAULT 0 COMMENT '账户状态0=正常 1=预警 2=欠费)',
`version` int NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_id` (`contract_id`),
KEY `idx_account_id` (`account_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目账户';
-- ----------------------------
-- 7. energy_account_flow — 统一余额变更流水
-- ----------------------------
DROP TABLE IF EXISTS `energy_account_flow`;
CREATE TABLE `energy_account_flow` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`account_id` bigint NOT NULL COMMENT '关联总账户 ID',
`project_account_id` bigint DEFAULT NULL COMMENT '关联项目账户 ID可选',
`flow_type` tinyint NOT NULL COMMENT '流水类型1=充值 2=扣款 3=冲正 4=划账 5=退款)',
`amount` decimal(14,2) NOT NULL COMMENT '变动金额',
`balance_before` decimal(14,2) NOT NULL COMMENT '变动前余额(总账户级别)',
`balance_after` decimal(14,2) NOT NULL COMMENT '变动后余额(总账户级别)',
`project_balance_before` decimal(14,2) DEFAULT NULL COMMENT '变动前项目余额(仅项目账户操作时填写)',
`project_balance_after` decimal(14,2) DEFAULT NULL COMMENT '变动后项目余额(仅项目账户操作时填写)',
`biz_type` tinyint NOT NULL COMMENT '业务类型1=加氢扣款 2=账单结算 3=手动调整 ...',
`biz_id` bigint DEFAULT NULL COMMENT '关联单据 ID',
`biz_code` varchar(64) DEFAULT NULL COMMENT '关联单据编号',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint DEFAULT NULL COMMENT '操作人 ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_project_account_id` (`project_account_id`),
KEY `idx_biz_type_biz_id` (`biz_type`, `biz_id`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='统一余额变更流水';
-- ----------------------------
-- 8. energy_station_price — 加氢站客户价格
-- ----------------------------
DROP TABLE IF EXISTS `energy_station_price`;
CREATE TABLE `energy_station_price` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`station_id` bigint NOT NULL COMMENT '加氢站 ID',
`customer_id` bigint NOT NULL COMMENT '客户 ID',
`cost_price` decimal(10,2) NOT NULL COMMENT '成本价(元/KG',
`customer_price` decimal(10,2) NOT NULL COMMENT '对客价(元/KG',
`effective_date` date NOT NULL COMMENT '生效日期',
`expiry_date` date DEFAULT NULL COMMENT '失效日期(可空,空=永久生效)',
`status` tinyint NOT NULL DEFAULT 0 COMMENT '状态0=生效中 1=已失效)',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_station_customer_date` (`station_id`, `customer_id`, `effective_date`),
KEY `idx_station_id` (`station_id`),
KEY `idx_customer_id` (`customer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢站客户价格';
-- ----------------------------
-- 9. energy_station_config — 加氢站扣款配置
-- ----------------------------
DROP TABLE IF EXISTS `energy_station_config`;
CREATE TABLE `energy_station_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`station_id` bigint NOT NULL COMMENT '加氢站 ID唯一每站一条记录',
`auto_deduct` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否自动扣款1=是 0=否)',
`cooperation_type` tinyint NOT NULL DEFAULT 0 COMMENT '合作类型0=合作 1=非合作)',
`auto_match` tinyint DEFAULT 1 COMMENT '自动匹配开关0=关闭 1=开启)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_station_id` (`station_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢站扣款配置';
-- ==========================================
-- 第二部分: 菜单权限(在 oneos_system 数据库执行)
-- ==========================================
USE `oneos_system`;
-- 一级菜单: 能源管理目录type=1
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5200, '能源管理', '', 1, 50, 0, '/energy', 'ep:lightning', NULL, NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 二级菜单type=2
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5201, '加氢记录管理', 'energy:hydrogen-record:query', 2, 1, 5200, 'hydrogen-record', 'ep:document', 'energy/hydrogen-record/index', 'EnergyHydrogenRecord', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5202, '加氢明细管理', 'energy:hydrogen-detail:query', 2, 2, 5200, 'hydrogen-detail', 'ep:list', 'energy/hydrogen-detail/index', 'EnergyHydrogenDetail', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5203, '能源账单管理', 'energy:bill:query', 2, 3, 5200, 'bill', 'ep:tickets', 'energy/bill/index', 'EnergyBill', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5204, '能源账户管理', 'energy:account:query', 2, 4, 5200, 'account', 'ep:wallet', 'energy/account/index', 'EnergyAccount', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5205, '价格管理', 'energy:station-price:query', 2, 5, 5200, 'station-price', 'ep:price-tag', 'energy/station-price/index', 'EnergyStationPrice', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5206, '加氢站配置', 'energy:station-config:query', 2, 6, 5200, 'station-config', 'ep:setting', 'energy/station-config/index', 'EnergyStationConfig', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 三级按钮/权限type=3
-- 加氢记录管理parent=5201
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5210, '加氢记录查询', 'energy:hydrogen-record:query', 3, 1, 5201, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5211, '加氢记录创建', 'energy:hydrogen-record:create', 3, 2, 5201, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5212, '加氢记录更新', 'energy:hydrogen-record:update', 3, 3, 5201, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5213, '加氢记录删除', 'energy:hydrogen-record:delete', 3, 4, 5201, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5214, '加氢记录导出', 'energy:hydrogen-record:export', 3, 5, 5201, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5215, '加氢记录导入', 'energy:hydrogen-record:import', 3, 6, 5201, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 加氢明细管理parent=5202
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5220, '加氢明细查询', 'energy:hydrogen-detail:query', 3, 1, 5202, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5221, '加氢明细创建', 'energy:hydrogen-detail:create', 3, 2, 5202, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5222, '加氢明细更新', 'energy:hydrogen-detail:update', 3, 3, 5202, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5223, '加氢明细删除', 'energy:hydrogen-detail:delete', 3, 4, 5202, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5224, '加氢明细导出', 'energy:hydrogen-detail:export', 3, 5, 5202, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5225, '加氢明细审核', 'energy:hydrogen-detail:audit', 3, 6, 5202, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 能源账单管理parent=5203
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5230, '能源账单查询', 'energy:bill:query', 3, 1, 5203, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5231, '能源账单创建', 'energy:bill:create', 3, 2, 5203, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5232, '能源账单更新', 'energy:bill:update', 3, 3, 5203, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5233, '能源账单删除', 'energy:bill:delete', 3, 4, 5203, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5234, '能源账单导出', 'energy:bill:export', 3, 5, 5203, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5235, '能源账单审核', 'energy:bill:audit', 3, 6, 5203, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 能源账户管理parent=5204
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5240, '能源账户查询', 'energy:account:query', 3, 1, 5204, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5241, '能源账户创建', 'energy:account:create', 3, 2, 5204, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5242, '能源账户更新', 'energy:account:update', 3, 3, 5204, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5243, '能源账户删除', 'energy:account:delete', 3, 4, 5204, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5244, '能源账户导出', 'energy:account:export', 3, 5, 5204, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5245, '能源账户充值', 'energy:account:recharge', 3, 6, 5204, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 价格管理parent=5205
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5250, '价格查询', 'energy:station-price:query', 3, 1, 5205, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5251, '价格创建', 'energy:station-price:create', 3, 2, 5205, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5252, '价格更新', 'energy:station-price:update', 3, 3, 5205, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5253, '价格删除', 'energy:station-price:delete', 3, 4, 5205, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5254, '价格导出', 'energy:station-price:export', 3, 5, 5205, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 加氢站配置parent=5206
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5260, '加氢站配置查询', 'energy:station-config:query', 3, 1, 5206, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5261, '加氢站配置创建', 'energy:station-config:create', 3, 2, 5206, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5262, '加氢站配置更新', 'energy:station-config:update', 3, 3, 5206, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5263, '加氢站配置删除', 'energy:station-config:delete', 3, 4, 5206, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5264, '加氢站配置导出', 'energy:station-config:export', 3, 5, 5206, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');

153
sql/energy/energy_menu.sql Normal file
View File

@@ -0,0 +1,153 @@
-- ==========================================
-- 能源管理模块菜单权限 SQL
-- 生成日期: 2026-03-15
-- 说明: ID 从 5100 起步,避免与现有菜单冲突
-- parent_id=0 表示顶级目录
-- type: 1=目录, 2=菜单, 3=按钮
-- status: 0=开启
-- ==========================================
-- ----------------------------
-- 一级菜单: 能源管理目录type=1
-- ----------------------------
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5100, '能源管理', '', 1, 50, 0, '/energy', 'ep:lightning', NULL, NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- ----------------------------
-- 二级菜单type=2
-- 5101: 加氢记录管理
-- 5102: 加氢明细管理
-- 5103: 能源账单管理
-- 5104: 能源账户管理
-- 5105: 价格管理
-- 5106: 加氢站配置
-- ----------------------------
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5101, '加氢记录管理', 'energy:hydrogen-record:query', 2, 1, 5100, 'hydrogen-record', 'ep:document', 'energy/hydrogen-record/index', 'EnergyHydrogenRecord', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5102, '加氢明细管理', 'energy:hydrogen-detail:query', 2, 2, 5100, 'hydrogen-detail', 'ep:list', 'energy/hydrogen-detail/index', 'EnergyHydrogenDetail', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5103, '能源账单管理', 'energy:bill:query', 2, 3, 5100, 'bill', 'ep:tickets', 'energy/bill/index', 'EnergyBill', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5104, '能源账户管理', 'energy:account:query', 2, 4, 5100, 'account', 'ep:wallet', 'energy/account/index', 'EnergyAccount', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5105, '价格管理', 'energy:station-price:query', 2, 5, 5100, 'station-price', 'ep:price-tag', 'energy/station-price/index', 'EnergyStationPrice', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5106, '加氢站配置', 'energy:station-config:query', 2, 6, 5100, 'station-config', 'ep:setting', 'energy/station-config/index', 'EnergyStationConfig', 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- ----------------------------
-- 三级按钮/权限type=3
-- ----------------------------
-- 加氢记录管理parent=5101: 查询、创建、更新、删除、导出、导入
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5110, '加氢记录查询', 'energy:hydrogen-record:query', 3, 1, 5101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5111, '加氢记录创建', 'energy:hydrogen-record:create', 3, 2, 5101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5112, '加氢记录更新', 'energy:hydrogen-record:update', 3, 3, 5101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5113, '加氢记录删除', 'energy:hydrogen-record:delete', 3, 4, 5101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5114, '加氢记录导出', 'energy:hydrogen-record:export', 3, 5, 5101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5115, '加氢记录导入', 'energy:hydrogen-record:import', 3, 6, 5101, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 加氢明细管理parent=5102: 查询、创建、更新、删除、导出、审核
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5120, '加氢明细查询', 'energy:hydrogen-detail:query', 3, 1, 5102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5121, '加氢明细创建', 'energy:hydrogen-detail:create', 3, 2, 5102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5122, '加氢明细更新', 'energy:hydrogen-detail:update', 3, 3, 5102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5123, '加氢明细删除', 'energy:hydrogen-detail:delete', 3, 4, 5102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5124, '加氢明细导出', 'energy:hydrogen-detail:export', 3, 5, 5102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5125, '加氢明细审核', 'energy:hydrogen-detail:audit', 3, 6, 5102, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 能源账单管理parent=5103: 查询、创建、更新、删除、导出、审核
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5130, '能源账单查询', 'energy:bill:query', 3, 1, 5103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5131, '能源账单创建', 'energy:bill:create', 3, 2, 5103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5132, '能源账单更新', 'energy:bill:update', 3, 3, 5103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5133, '能源账单删除', 'energy:bill:delete', 3, 4, 5103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5134, '能源账单导出', 'energy:bill:export', 3, 5, 5103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5135, '能源账单审核', 'energy:bill:audit', 3, 6, 5103, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 能源账户管理parent=5104: 查询、创建、更新、删除、导出、充值
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5140, '能源账户查询', 'energy:account:query', 3, 1, 5104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5141, '能源账户创建', 'energy:account:create', 3, 2, 5104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5142, '能源账户更新', 'energy:account:update', 3, 3, 5104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5143, '能源账户删除', 'energy:account:delete', 3, 4, 5104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5144, '能源账户导出', 'energy:account:export', 3, 5, 5104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5145, '能源账户充值', 'energy:account:recharge', 3, 6, 5104, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 价格管理parent=5105: 查询、创建、更新、删除、导出
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5150, '价格查询', 'energy:station-price:query', 3, 1, 5105, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5151, '价格创建', 'energy:station-price:create', 3, 2, 5105, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5152, '价格更新', 'energy:station-price:update', 3, 3, 5105, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5153, '价格删除', 'energy:station-price:delete', 3, 4, 5105, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5154, '价格导出', 'energy:station-price:export', 3, 5, 5105, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
-- 加氢站配置parent=5106: 查询、创建、更新、删除、导出
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5160, '加氢站配置查询', 'energy:station-config:query', 3, 1, 5106, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5161, '加氢站配置创建', 'energy:station-config:create', 3, 2, 5106, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5162, '加氢站配置更新', 'energy:station-config:update', 3, 3, 5106, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5163, '加氢站配置删除', 'energy:station-config:delete', 3, 4, 5106, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');
INSERT INTO `system_menu` (`id`, `name`, `permission`, `type`, `sort`, `parent_id`, `path`, `icon`, `component`, `component_name`, `status`, `visible`, `keep_alive`, `always_show`, `creator`, `create_time`, `updater`, `update_time`, `deleted`)
VALUES (5164, '加氢站配置导出', 'energy:station-config:export', 3, 5, 5106, '', '#', '', NULL, 0, b'1', b'1', b'1', 'admin', NOW(), 'admin', NOW(), b'0');

View File

@@ -0,0 +1,230 @@
-- ==========================================
-- Energy 模块 Mock 数据
-- 执行方式: 用数据库工具连接 47.103.115.36:3306 直接执行
-- 脚本会自动切换数据库
-- ==========================================
-- ==========================================
-- 第一部分: 在 oneos_asset 中插入关联 mock 数据
-- (如果已有真实数据,请跳过此部分,并修改下方 energy 数据中的 ID
-- ==========================================
USE `oneos_asset`;
-- 3 个加氢站(停车场)
INSERT INTO `asset_parking` (`id`, `name`, `address`, `capacity`, `parked_amount`, `tenant_id`, `deleted`, `creator`, `create_time`, `updater`, `update_time`)
VALUES
(1001, '上海松江加氢站', '上海市松江区新桥镇莘砖公路368号', 50, 0, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(1002, '上海嘉定加氢站', '上海市嘉定区安亭镇墨玉南路888号', 30, 0, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(1003, '江苏昆山加氢站', '江苏省昆山市千灯镇石浦路199号', 40, 0, 0, b'0', 'admin', NOW(), 'admin', NOW())
ON DUPLICATE KEY UPDATE `name` = VALUES(`name`);
-- 3 个客户
INSERT INTO `asset_customer` (`id`, `customer_name`, `customer_code`, `coop_status`, `province`, `city`, `contact`, `contact_mobile`, `tenant_id`, `deleted`, `creator`, `create_time`, `updater`, `update_time`)
VALUES
(2001, '上海绿能物流有限公司', 'CUST-2026-001', '合作中', '上海', '上海', '张经理', '13800001001', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(2002, '江苏氢动力运输有限公司', 'CUST-2026-002', '合作中', '江苏', '苏州', '李经理', '13800001002', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(2003, '浙江新能源科技有限公司', 'CUST-2026-003', '合作中', '浙江', '杭州', '王经理', '13800001003', 0, b'0', 'admin', NOW(), 'admin', NOW())
ON DUPLICATE KEY UPDATE `customer_name` = VALUES(`customer_name`);
-- 6 辆车
INSERT INTO `asset_vehicle_base` (`id`, `vin`, `plate_no`, `vehicle_no`, `color`, `year`, `tenant_id`, `deleted`, `creator`, `create_time`, `updater`, `update_time`)
VALUES
(3001, 'LVBV1234567890001', '沪A12345', 'VH-001', '白色', '2025', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3002, 'LVBV1234567890002', '沪B67890', 'VH-002', '蓝色', '2025', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3003, 'LVBV1234567890003', '苏A11111', 'VH-003', '白色', '2024', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3004, 'LVBV1234567890004', '苏B22222', 'VH-004', '绿色', '2024', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3005, 'LVBV1234567890005', '浙A33333', 'VH-005', '白色', '2025', 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3006, 'LVBV1234567890006', '浙B44444', 'VH-006', '银色', '2025', 0, b'0', 'admin', NOW(), 'admin', NOW())
ON DUPLICATE KEY UPDATE `plate_no` = VALUES(`plate_no`);
-- 车辆业务关联
INSERT INTO `asset_vehicle_business` (`id`, `vehicle_id`, `customer_id`, `tenant_id`, `deleted`, `creator`, `create_time`, `updater`, `update_time`)
VALUES
(3001, 3001, 2001, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3002, 3002, 2001, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3003, 3003, 2002, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3004, 3004, 2002, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3005, 3005, 2003, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(3006, 3006, 2003, 0, b'0', 'admin', NOW(), 'admin', NOW())
ON DUPLICATE KEY UPDATE `customer_id` = VALUES(`customer_id`);
-- 3 个合同
INSERT INTO `asset_contract` (`id`, `contract_code`, `contract_type`, `project_name`, `start_date`, `end_date`, `payment_method`, `payment_cycle`, `signing_company`, `delivery_province`, `delivery_city`, `delivery_location`, `customer_id`, `customer_name`, `approval_status`, `contract_status`, `tenant_id`, `deleted`, `creator`, `create_time`, `updater`, `update_time`)
VALUES
(4001, 'HT-2026-001', 2, '绿能物流氢能车辆租赁项目', '2026-01-01', '2026-12-31', '预充值', '按次', '上海氢能科技有限公司', '上海', '上海', '上海市松江区', 2001, '上海绿能物流有限公司', 2, 2, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(4002, 'HT-2026-002', 2, '氢动力城配物流项目', '2026-01-01', '2026-12-31', '月结算', '月结', '上海氢能科技有限公司', '江苏', '苏州', '江苏省苏州市昆山市', 2002, '江苏氢动力运输有限公司', 2, 2, 0, b'0', 'admin', NOW(), 'admin', NOW()),
(4003, 'HT-2026-003', 2, '新能源冷链运输项目', '2026-02-01', '2027-01-31', '预充值', '按次', '上海氢能科技有限公司', '浙江', '杭州', '浙江省杭州市西湖区', 2003, '浙江新能源科技有限公司', 2, 2, 0, b'0', 'admin', NOW(), 'admin', NOW())
ON DUPLICATE KEY UPDATE `project_name` = VALUES(`project_name`);
-- ==========================================
-- 第二部分: Energy 模块 mock 数据
-- ==========================================
USE `oneos_energy`;
-- ----------------------------
-- 1. 加氢站配置3 站)
-- ----------------------------
INSERT INTO `energy_station_config` (`id`, `station_id`, `auto_deduct`, `cooperation_type`, `auto_match`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
(1, 1001, 1, 0, 1, '松江站,自动扣款+自动匹配', 'admin', NOW(), 'admin', NOW(), b'0', 0),
(2, 1002, 1, 0, 1, '嘉定站,自动扣款+自动匹配', 'admin', NOW(), 'admin', NOW(), b'0', 0),
(3, 1003, 0, 1, 0, '昆山站,非合作站,手动匹配', 'admin', NOW(), 'admin', NOW(), b'0', 0);
-- ----------------------------
-- 2. 加氢站客户价格6 条)
-- ----------------------------
INSERT INTO `energy_station_price` (`id`, `station_id`, `customer_id`, `cost_price`, `customer_price`, `effective_date`, `expiry_date`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
-- 松江站价格
(1, 1001, 2001, 28.00, 35.00, '2026-01-01', NULL, 0, 'admin', NOW(), 'admin', NOW(), b'0', 0),
(2, 1001, 2002, 28.00, 34.00, '2026-01-01', NULL, 0, 'admin', NOW(), 'admin', NOW(), b'0', 0),
-- 嘉定站价格
(3, 1002, 2001, 27.50, 35.00, '2026-01-01', NULL, 0, 'admin', NOW(), 'admin', NOW(), b'0', 0),
(4, 1002, 2002, 27.50, 33.50, '2026-01-01', NULL, 0, 'admin', NOW(), 'admin', NOW(), b'0', 0),
-- 昆山站价格
(5, 1003, 2003, 29.00, 36.00, '2026-02-01', NULL, 0, 'admin', NOW(), 'admin', NOW(), b'0', 0),
-- 已失效的旧价格
(6, 1001, 2001, 26.00, 33.00, '2025-06-01', '2025-12-31', 1, 'admin', NOW(), 'admin', NOW(), b'0', 0);
-- ----------------------------
-- 3. 加氢原始记录20 条,覆盖多种状态)
-- ----------------------------
INSERT INTO `energy_hydrogen_record` (`id`, `station_id`, `plate_number`, `hydrogen_date`, `hydrogen_quantity`, `unit_price`, `amount`, `mileage`, `source_type`, `match_status`, `vehicle_id`, `customer_id`, `upload_batch_no`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
-- 已匹配记录松江站客户2001
( 1, 1001, '沪A12345', '2026-03-01', 12.50, 35.00, 437.50, 15230.00, 1, 1, 3001, 2001, 'IMP20260305001A', 'admin', '2026-03-05 10:00:00', 'admin', '2026-03-05 10:00:00', b'0', 0),
( 2, 1001, '沪A12345', '2026-03-03', 15.00, 35.00, 525.00, 15580.00, 1, 1, 3001, 2001, 'IMP20260305001A', 'admin', '2026-03-05 10:00:00', 'admin', '2026-03-05 10:00:00', b'0', 0),
( 3, 1001, '沪B67890', '2026-03-02', 10.80, 35.00, 378.00, 8920.00, 1, 1, 3002, 2001, 'IMP20260305001A', 'admin', '2026-03-05 10:00:00', 'admin', '2026-03-05 10:00:00', b'0', 0),
( 4, 1001, '沪B67890', '2026-03-05', 13.20, 35.00, 462.00, 9200.00, 1, 1, 3002, 2001, 'IMP20260305001A', 'admin', '2026-03-05 10:00:00', 'admin', '2026-03-05 10:00:00', b'0', 0),
-- 已匹配记录嘉定站客户2002
( 5, 1002, '苏A11111', '2026-03-01', 18.00, 33.50, 603.00, 22100.00, 1, 1, 3003, 2002, 'IMP20260306002B', 'admin', '2026-03-06 09:00:00', 'admin', '2026-03-06 09:00:00', b'0', 0),
( 6, 1002, '苏A11111', '2026-03-04', 16.50, 33.50, 552.75, 22450.00, 1, 1, 3003, 2002, 'IMP20260306002B', 'admin', '2026-03-06 09:00:00', 'admin', '2026-03-06 09:00:00', b'0', 0),
( 7, 1002, '苏B22222', '2026-03-02', 20.00, 33.50, 670.00, 18600.00, 1, 1, 3004, 2002, 'IMP20260306002B', 'admin', '2026-03-06 09:00:00', 'admin', '2026-03-06 09:00:00', b'0', 0),
( 8, 1002, '苏B22222', '2026-03-06', 14.80, 33.50, 495.80, 19010.00, 1, 1, 3004, 2002, 'IMP20260306002B', 'admin', '2026-03-06 09:00:00', 'admin', '2026-03-06 09:00:00', b'0', 0),
-- 已匹配记录昆山站客户2003
( 9, 1003, '浙A33333', '2026-03-03', 22.00, 36.00, 792.00, 31200.00, 1, 1, 3005, 2003, 'IMP20260307003C', 'admin', '2026-03-07 14:00:00', 'admin', '2026-03-07 14:00:00', b'0', 0),
(10, 1003, '浙A33333', '2026-03-07', 19.50, 36.00, 702.00, 31800.00, 1, 1, 3005, 2003, 'IMP20260307003C', 'admin', '2026-03-07 14:00:00', 'admin', '2026-03-07 14:00:00', b'0', 0),
(11, 1003, '浙B44444', '2026-03-05', 17.00, 36.00, 612.00, 27500.00, 1, 1, 3006, 2003, 'IMP20260307003C', 'admin', '2026-03-07 14:00:00', 'admin', '2026-03-07 14:00:00', b'0', 0),
-- 未匹配记录(车牌在系统中不存在)
(12, 1001, '沪C99999', '2026-03-08', 11.00, 35.00, 385.00, NULL, 1, 0, NULL, NULL, 'IMP20260310004D', 'admin', '2026-03-10 11:00:00', 'admin', '2026-03-10 11:00:00', b'0', 0),
(13, 1001, '沪D88888', '2026-03-08', 9.50, 35.00, 332.50, NULL, 1, 0, NULL, NULL, 'IMP20260310004D', 'admin', '2026-03-10 11:00:00', 'admin', '2026-03-10 11:00:00', b'0', 0),
(14, 1002, '苏C77777', '2026-03-09', 14.00, 33.50, 469.00, NULL, 1, 0, NULL, NULL, 'IMP20260310004D', 'admin', '2026-03-10 11:00:00', 'admin', '2026-03-10 11:00:00', b'0', 0),
-- 无法匹配记录
(15, 1003, '京A00001', '2026-03-10', 8.00, 36.00, 288.00, NULL, 1, 2, NULL, NULL, 'IMP20260311005E', 'admin', '2026-03-11 09:00:00', 'admin', '2026-03-11 09:00:00', b'0', 0),
-- 手动录入source_type=2
(16, 1001, '沪A12345', '2026-03-10', 14.00, 35.00, 490.00, 16100.00, 2, 1, 3001, 2001, NULL, 'admin', '2026-03-10 16:00:00', 'admin', '2026-03-10 16:00:00', b'0', 0),
(17, 1002, '苏A11111', '2026-03-10', 17.50, 33.50, 586.25, 23100.00, 2, 1, 3003, 2002, NULL, 'admin', '2026-03-10 16:30:00', 'admin', '2026-03-10 16:30:00', b'0', 0),
-- 最新批次(未处理)
(18, 1001, '沪A12345', '2026-03-12', 11.80, 35.00, 413.00, 16500.00, 1, 1, 3001, 2001, 'IMP20260313006F', 'admin', '2026-03-13 10:00:00', 'admin', '2026-03-13 10:00:00', b'0', 0),
(19, 1001, '沪B67890', '2026-03-13', 16.00, 35.00, 560.00, 9800.00, 1, 1, 3002, 2001, 'IMP20260313006F', 'admin', '2026-03-13 10:00:00', 'admin', '2026-03-13 10:00:00', b'0', 0),
(20, 1002, '苏B22222', '2026-03-14', 13.00, 33.50, 435.50, 19500.00, 1, 1, 3004, 2002, 'IMP20260314007G', 'admin', '2026-03-14 08:00:00', 'admin', '2026-03-14 08:00:00', b'0', 0);
-- ----------------------------
-- 4. 加氢明细15 条,对应已匹配的记录,覆盖不同审核/扣款/结算状态)
-- ----------------------------
INSERT INTO `energy_hydrogen_detail` (`id`, `record_id`, `station_id`, `vehicle_id`, `plate_number`, `hydrogen_date`, `hydrogen_quantity`, `cost_price`, `cost_amount`, `customer_price`, `customer_amount`, `contract_id`, `customer_id`, `project_name`, `cost_bearer`, `pay_method`, `audit_status`, `audit_remark`, `deduction_status`, `settlement_status`, `bill_id`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
-- 客户2001 明细(预充值,已审核+已扣款+已结算关联账单1
(1, 1, 1001, 3001, '沪A12345', '2026-03-01', 12.50, 28.00, 350.00, 35.00, 437.50, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 1, 1, NULL, 'admin', '2026-03-05 10:30:00', 'admin', '2026-03-08 10:00:00', b'0', 0),
(2, 2, 1001, 3001, '沪A12345', '2026-03-03', 15.00, 28.00, 420.00, 35.00, 525.00, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 1, 1, NULL, 'admin', '2026-03-05 10:30:00', 'admin', '2026-03-08 10:00:00', b'0', 0),
(3, 3, 1001, 3002, '沪B67890', '2026-03-02', 10.80, 28.00, 302.40, 35.00, 378.00, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 1, 1, NULL, 'admin', '2026-03-05 10:30:00', 'admin', '2026-03-08 10:00:00', b'0', 0),
(4, 4, 1001, 3002, '沪B67890', '2026-03-05', 13.20, 28.00, 369.60, 35.00, 462.00, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 1, 1, NULL, 'admin', '2026-03-05 10:30:00', 'admin', '2026-03-08 10:00:00', b'0', 0),
-- 客户2002 明细(月结算,已审核+未扣款+未结算关联账单2
(5, 5, 1002, 3003, '苏A11111', '2026-03-01', 18.00, 27.50, 495.00, 33.50, 603.00, 4002, 2002, '氢动力城配物流项目', 1, 2, 1, '审核通过', 0, 0, 2, NULL, 'admin', '2026-03-06 09:30:00', 'admin', '2026-03-09 09:00:00', b'0', 0),
(6, 6, 1002, 3003, '苏A11111', '2026-03-04', 16.50, 27.50, 453.75, 33.50, 552.75, 4002, 2002, '氢动力城配物流项目', 1, 2, 1, '审核通过', 0, 0, 2, NULL, 'admin', '2026-03-06 09:30:00', 'admin', '2026-03-09 09:00:00', b'0', 0),
(7, 7, 1002, 3004, '苏B22222', '2026-03-02', 20.00, 27.50, 550.00, 33.50, 670.00, 4002, 2002, '氢动力城配物流项目', 1, 2, 1, '审核通过', 0, 0, 2, NULL, 'admin', '2026-03-06 09:30:00', 'admin', '2026-03-09 09:00:00', b'0', 0),
(8, 8, 1002, 3004, '苏B22222', '2026-03-06', 14.80, 27.50, 407.00, 33.50, 495.80, 4002, 2002, '氢动力城配物流项目', 1, 2, 1, '审核通过', 0, 0, 2, NULL, 'admin', '2026-03-06 09:30:00', 'admin', '2026-03-09 09:00:00', b'0', 0),
-- 客户2003 明细(预充值,待审核,无账单)
( 9, 9, 1003, 3005, '浙A33333', '2026-03-03', 22.00, 29.00, 638.00, 36.00, 792.00, 4003, 2003, '新能源冷链运输项目', 1, 1, 0, NULL, 0, 0, NULL, NULL, 'admin', '2026-03-07 14:30:00', 'admin', '2026-03-07 14:30:00', b'0', 0),
(10, 10, 1003, 3005, '浙A33333', '2026-03-07', 19.50, 29.00, 565.50, 36.00, 702.00, 4003, 2003, '新能源冷链运输项目', 1, 1, 0, NULL, 0, 0, NULL, NULL, 'admin', '2026-03-07 14:30:00', 'admin', '2026-03-07 14:30:00', b'0', 0),
(11, 11, 1003, 3006, '浙B44444', '2026-03-05', 17.00, 29.00, 493.00, 36.00, 612.00, 4003, 2003, '新能源冷链运输项目', 1, 1, 0, NULL, 0, 0, NULL, NULL, 'admin', '2026-03-07 14:30:00', 'admin', '2026-03-07 14:30:00', b'0', 0),
-- 客户2001 最新明细(已审核,未结算,无账单 — 可用于生成新账单测试)
(12, 16, 1001, 3001, '沪A12345', '2026-03-10', 14.00, 28.00, 392.00, 35.00, 490.00, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 0, NULL, NULL, 'admin', '2026-03-10 16:30:00', 'admin', '2026-03-11 10:00:00', b'0', 0),
(13, 18, 1001, 3001, '沪A12345', '2026-03-12', 11.80, 28.00, 330.40, 35.00, 413.00, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 0, NULL, NULL, 'admin', '2026-03-13 10:30:00', 'admin', '2026-03-14 10:00:00', b'0', 0),
(14, 19, 1001, 3002, '沪B67890', '2026-03-13', 16.00, 28.00, 448.00, 35.00, 560.00, 4001, 2001, '绿能物流氢能车辆租赁项目', 1, 1, 1, '审核通过', 1, 0, NULL, NULL, 'admin', '2026-03-13 10:30:00', 'admin', '2026-03-14 10:00:00', b'0', 0),
-- 客户2002 已审核驳回明细
(15, 17, 1002, 3003, '苏A11111', '2026-03-10', 17.50, 27.50, 481.25, 33.50, 586.25, 4002, 2002, '氢动力城配物流项目', 1, 2, 2, '金额异常,请核实', 0, 0, NULL, '驳回后待重新审核', 'admin', '2026-03-10 17:00:00', 'admin', '2026-03-11 15:00:00', b'0', 0);
-- ----------------------------
-- 5. 能源账单3 条,覆盖不同状态)
-- ----------------------------
INSERT INTO `energy_bill` (`id`, `bill_code`, `energy_type`, `customer_id`, `customer_name`, `contract_id`, `station_id`, `station_name`, `cooperation_type`, `bill_period_start`, `bill_period_end`, `receivable_amount`, `actual_amount`, `adjustment_amount`, `paid_amount`, `total_quantity`, `detail_count`, `status`, `audit_status`, `submit_status`, `payment_status`, `auditor_id`, `audit_time`, `audit_remark`, `generate_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
-- 账单1: 客户2001已生成+已审核+已支付(完结状态)
(1, 'EB20260308140000A1B2', 0, 2001, '上海绿能物流有限公司', 4001, 1001, '上海松江加氢站', 1,
'2026-03-01', '2026-03-07', 1802.50, 1802.50, 0.00, 1802.50, 51.50, 4, 1, 1, 1, 2,
1, '2026-03-09 10:00:00', '审核通过,金额核对无误', '2026-03-08 14:00:00',
'admin', '2026-03-08 14:00:00', 'admin', '2026-03-10 10:00:00', b'0', 0),
-- 账单2: 客户2002已生成+待审核(月结算)
(2, 'EB20260309100000C3D4', 0, 2002, '江苏氢动力运输有限公司', 4002, 1002, '上海嘉定加氢站', 2,
'2026-03-01', '2026-03-07', 2321.55, 2221.55, -100.00, 0.00, 69.30, 4, 1, 0, 0, 0,
NULL, NULL, NULL, '2026-03-09 10:00:00',
'admin', '2026-03-09 10:00:00', 'admin', '2026-03-09 10:00:00', b'0', 0),
-- 账单3: 客户2001 草稿(还没提交审核)
(3, 'EB20260314120000E5F6', 0, 2001, '上海绿能物流有限公司', 4001, 1001, '上海松江加氢站', 1,
'2026-03-08', '2026-03-14', 1463.00, 1463.00, 0.00, 0.00, 41.80, 3, 0, 0, 0, 0,
NULL, NULL, NULL, '2026-03-14 12:00:00',
'admin', '2026-03-14 12:00:00', 'admin', '2026-03-14 12:00:00', b'0', 0);
-- ----------------------------
-- 6. 账单调整记录2 条关联账单2
-- ----------------------------
INSERT INTO `energy_bill_adjustment` (`id`, `bill_id`, `detail_id`, `adjustment_type`, `amount`, `reason`, `attachment_urls`, `operator_id`, `operate_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
(1, 2, 8, 2, 80.00, '3月6日苏B22222加氢量数据偏高与站点核对后减少80元', NULL, 1, '2026-03-10 11:00:00', 'admin', '2026-03-10 11:00:00', 'admin', '2026-03-10 11:00:00', b'0', 0),
(2, 2, NULL, 2, 20.00, '整单优惠减免20元', NULL, 1, '2026-03-10 11:30:00', 'admin', '2026-03-10 11:30:00', 'admin', '2026-03-10 11:30:00', b'0', 0);
-- ----------------------------
-- 7. 客户能源账户3 个客户)
-- ----------------------------
INSERT INTO `energy_account` (`id`, `customer_id`, `balance`, `init_balance`, `accumulated_recharge`, `accumulated_hydrogen`, `accumulated_electric`, `accumulated_consume`, `reminder_threshold`, `account_status`, `last_recharge_date`, `version`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
-- 客户2001: 预充值模式,余额正常
(1, 2001, 47197.50, 0.00, 50000.00, 2802.50, 0.00, 2802.50, 5000.00, 0, '2026-03-01', 5,
'admin', '2026-01-15 10:00:00', 'admin', '2026-03-14 12:00:00', b'0', 0),
-- 客户2002: 月结算模式,余额为零(月结不需要预充)
(2, 2002, 0.00, 0.00, 0.00, 2321.55, 0.00, 2321.55, NULL, 0, NULL, 2,
'admin', '2026-01-15 10:00:00', 'admin', '2026-03-09 10:00:00', b'0', 0),
-- 客户2003: 预充值模式,余额预警
(3, 2003, 3894.00, 0.00, 6000.00, 2106.00, 0.00, 2106.00, 5000.00, 1, '2026-02-20', 3,
'admin', '2026-02-01 10:00:00', 'admin', '2026-03-07 15:00:00', b'0', 0);
-- ----------------------------
-- 8. 项目账户3 个项目对应3个合同
-- ----------------------------
INSERT INTO `energy_project_account` (`id`, `account_id`, `contract_id`, `project_name`, `project_balance`, `project_remit_amount`, `project_hydrogen_amount`, `project_electric_amount`, `project_consume_amount`, `reminder_threshold`, `account_status`, `version`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
(1, 1, 4001, '绿能物流氢能车辆租赁项目', 47197.50, 50000.00, 2802.50, 0.00, 2802.50, 5000.00, 0, 5,
'admin', '2026-01-15 10:00:00', 'admin', '2026-03-14 12:00:00', b'0', 0),
(2, 2, 4002, '氢动力城配物流项目', 0.00, 0.00, 2321.55, 0.00, 2321.55, NULL, 0, 2,
'admin', '2026-01-15 10:00:00', 'admin', '2026-03-09 10:00:00', b'0', 0),
(3, 3, 4003, '新能源冷链运输项目', 3894.00, 6000.00, 2106.00, 0.00, 2106.00, 5000.00, 1, 3,
'admin', '2026-02-01 10:00:00', 'admin', '2026-03-07 15:00:00', b'0', 0);
-- ----------------------------
-- 9. 账户流水12 条,覆盖充值/扣款场景)
-- ----------------------------
INSERT INTO `energy_account_flow` (`id`, `account_id`, `project_account_id`, `flow_type`, `amount`, `balance_before`, `balance_after`, `project_balance_before`, `project_balance_after`, `biz_type`, `biz_id`, `biz_code`, `remark`, `operator_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id`)
VALUES
-- 客户2001 流水
(1, 1, 1, 1, 50000.00, 0.00, 50000.00, 0.00, 50000.00, 3, NULL, NULL, '首次充值', 1, 'admin', '2026-03-01 10:00:00', 'admin', '2026-03-01 10:00:00', b'0', 0),
(2, 1, 1, 2, -437.50, 50000.00, 49562.50, 50000.00, 49562.50, 1, 1, NULL, '沪A12345 2026-03-01 加氢扣款', NULL, 'admin', '2026-03-05 11:00:00', 'admin', '2026-03-05 11:00:00', b'0', 0),
(3, 1, 1, 2, -525.00, 49562.50, 49037.50, 49562.50, 49037.50, 1, 2, NULL, '沪A12345 2026-03-03 加氢扣款', NULL, 'admin', '2026-03-05 11:01:00', 'admin', '2026-03-05 11:01:00', b'0', 0),
(4, 1, 1, 2, -378.00, 49037.50, 48659.50, 49037.50, 48659.50, 1, 3, NULL, '沪B67890 2026-03-02 加氢扣款', NULL, 'admin', '2026-03-05 11:02:00', 'admin', '2026-03-05 11:02:00', b'0', 0),
(5, 1, 1, 2, -462.00, 48659.50, 48197.50, 48659.50, 48197.50, 1, 4, NULL, '沪B67890 2026-03-05 加氢扣款', NULL, 'admin', '2026-03-05 11:03:00', 'admin', '2026-03-05 11:03:00', b'0', 0),
(6, 1, 1, 2, -490.00, 48197.50, 47707.50, 48197.50, 47707.50, 1, 12, NULL, '沪A12345 2026-03-10 加氢扣款', NULL, 'admin', '2026-03-11 10:00:00', 'admin', '2026-03-11 10:00:00', b'0', 0),
(7, 1, 1, 2, -413.00, 47707.50, 47294.50, 47707.50, 47294.50, 1, 13, NULL, '沪A12345 2026-03-12 加氢扣款', NULL, 'admin', '2026-03-14 10:00:00', 'admin', '2026-03-14 10:00:00', b'0', 0),
(8, 1, 1, 2, -97.00, 47294.50, 47197.50, 47294.50, 47197.50, 1, 14, NULL, '沪B67890 2026-03-13 加氢扣款(部分)', NULL, 'admin', '2026-03-14 10:01:00', 'admin', '2026-03-14 10:01:00', b'0', 0),
-- 客户2003 流水
( 9, 3, 3, 1, 6000.00, 0.00, 6000.00, 0.00, 6000.00, 3, NULL, NULL, '首次充值', 1, 'admin', '2026-02-20 10:00:00', 'admin', '2026-02-20 10:00:00', b'0', 0),
(10, 3, 3, 2, -792.00, 6000.00, 5208.00, 6000.00, 5208.00, 1, 9, NULL, '浙A33333 2026-03-03 加氢扣款', NULL, 'admin', '2026-03-07 15:00:00', 'admin', '2026-03-07 15:00:00', b'0', 0),
(11, 3, 3, 2, -702.00, 5208.00, 4506.00, 5208.00, 4506.00, 1, 10, NULL, '浙A33333 2026-03-07 加氢扣款', NULL, 'admin', '2026-03-07 15:01:00', 'admin', '2026-03-07 15:01:00', b'0', 0),
(12, 3, 3, 2, -612.00, 4506.00, 3894.00, 4506.00, 3894.00, 1, 11, NULL, '浙B44444 2026-03-05 加氢扣款', NULL, 'admin', '2026-03-07 15:02:00', 'admin', '2026-03-07 15:02:00', b'0', 0);

110
sql/energy/import_sql.py Normal file
View File

@@ -0,0 +1,110 @@
#!/usr/bin/env python3
"""
SQL 导入工具
"""
import pymysql
import sys
def execute_sql_file(host, port, user, password, sql_file):
"""执行 SQL 文件"""
try:
# 读取 SQL 文件
with open(sql_file, 'r', encoding='utf-8') as f:
sql_content = f.read()
# 连接数据库(不指定数据库,让 SQL 中的 USE 语句生效)
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
charset='utf8mb4',
cursorclass=pymysql.cursors.DictCursor,
autocommit=False
)
print(f"✓ 连接数据库成功: {host}:{port}")
# 分割 SQL 语句(按分号分割,但要处理存储过程等特殊情况)
statements = []
current_statement = []
in_delimiter = False
for line in sql_content.split('\n'):
line = line.strip()
# 跳过注释和空行
if not line or line.startswith('--') or line.startswith('#'):
continue
# 处理 DELIMITER
if line.upper().startswith('DELIMITER'):
in_delimiter = not in_delimiter
continue
current_statement.append(line)
# 判断语句结束
if not in_delimiter and line.endswith(';'):
statements.append(' '.join(current_statement))
current_statement = []
# 执行 SQL 语句
with connection.cursor() as cursor:
success_count = 0
error_count = 0
for i, statement in enumerate(statements, 1):
if not statement.strip():
continue
try:
cursor.execute(statement)
connection.commit()
success_count += 1
# 每 10 条打印一次进度
if success_count % 10 == 0:
print(f" 已执行 {success_count} 条语句...")
except Exception as e:
error_count += 1
print(f"✗ 语句 {i} 执行失败: {str(e)[:100]}")
# 继续执行下一条
print(f"\n✓ 执行完成: 成功 {success_count} 条, 失败 {error_count}")
connection.close()
return True
except Exception as e:
print(f"✗ 错误: {e}")
return False
if __name__ == '__main__':
# 数据库配置
DB_HOST = '47.103.115.36'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD = 'Passw0rd2026'
# SQL 文件列表
sql_files = [
'energy_init_all.sql',
'energy_mock_data.sql'
]
print("=" * 60)
print("OneOS Energy 模块数据导入")
print("=" * 60)
for sql_file in sql_files:
print(f"\n>>> 导入 {sql_file}")
success = execute_sql_file(DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, sql_file)
if not success:
print(f"{sql_file} 导入失败")
sys.exit(1)
print("\n" + "=" * 60)
print("✓ 所有数据导入完成")
print("=" * 60)

209
sql/execute-all-updates.sql Normal file
View File

@@ -0,0 +1,209 @@
-- ==================== 数据库更新脚本汇总 ====================
-- 执行日期2026-03-12
-- 说明:包含 parking、vehiclemodel、customer、vehicleregistration 模块的所有更新
--
-- 执行顺序:
-- 1. 车型参数表字段补全asset 库)
-- 2. 车辆类型字典数据system 库)
-- 3. 车辆上牌记录表创建asset 库)
-- 4. 菜单和权限配置system 库)
-- ==================== 使用说明 ====================
-- 各个模块是分库的,请按照以下顺序执行:
--
-- 1. 连接到 asset 库,执行第一部分和第三部分
-- 2. 连接到 system 库(或主库),执行第二部分和第四部分
-- ==================== 第一部分车型参数表字段补全asset 库)====================
USE `asset`;
-- 检查字段是否已存在
SELECT 'Checking asset_vehicle_model table...' AS status;
-- 添加车型字段
ALTER TABLE `asset_vehicle_model`
ADD COLUMN IF NOT EXISTS `vehicle_type` int DEFAULT NULL COMMENT '车辆类型(字典)' AFTER `model`,
ADD COLUMN IF NOT EXISTS `plate_color` varchar(50) DEFAULT NULL COMMENT '车牌颜色(如:绿牌、蓝牌、黄牌)' AFTER `notice_model`,
ADD COLUMN IF NOT EXISTS `battery_type` varchar(100) DEFAULT NULL COMMENT '电池类型(如:磷酸铁锂、三元锂)' AFTER `battery_factory`,
ADD COLUMN IF NOT EXISTS `hydrogen_factory` varchar(200) DEFAULT NULL COMMENT '供氢系统厂家' AFTER `refrigerator_factory`;
-- 添加索引(如果不存在)
ALTER TABLE `asset_vehicle_model`
ADD INDEX IF NOT EXISTS `idx_vehicle_type` (`vehicle_type`) COMMENT '车辆类型查询',
ADD INDEX IF NOT EXISTS `idx_brand_model` (`brand`, `model`) COMMENT '品牌型号组合查询';
SELECT 'Vehicle model fields updated successfully!' AS status;
-- ==================== 第二部分车辆类型字典数据system 库或主库)====================
-- 注意:如果 system_dict_type 和 system_dict_data 在主库,请切换到主库
-- USE `ruoyi-vue-pro`; -- 或者你的主库名称
-- 检查字典类型是否已存在
SELECT 'Checking vehicle type dictionary...' AS status;
-- 创建车辆类型字典类型(如果不存在)
INSERT INTO `system_dict_type` (
`name`,
`type`,
`status`,
`remark`,
`creator`,
`create_time`,
`updater`,
`update_time`,
`deleted`,
`deleted_time`
)
SELECT
'车辆类型',
'asset_vehicle_type',
0,
'车辆资产管理-车辆类型分类',
'admin',
NOW(),
'admin',
NOW(),
0,
NULL
FROM DUAL
WHERE NOT EXISTS (
SELECT 1 FROM `system_dict_type` WHERE `type` = 'asset_vehicle_type'
);
-- 创建车辆类型字典数据(如果不存在)
INSERT INTO `system_dict_data` (
`sort`,
`label`,
`value`,
`dict_type`,
`status`,
`color_type`,
`css_class`,
`remark`,
`creator`,
`create_time`,
`updater`,
`update_time`,
`deleted`
)
SELECT * FROM (
SELECT 1 AS sort, '小型轿车' AS label, '1' AS value, 'asset_vehicle_type' AS dict_type, 0 AS status, 'primary' AS color_type, '' AS css_class, '5座以下的小型乘用车' AS remark, 'admin' AS creator, NOW() AS create_time, 'admin' AS updater, NOW() AS update_time, 0 AS deleted UNION ALL
SELECT 2, 'SUV', '2', 'asset_vehicle_type', 0, 'success', '', '运动型多用途车', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 3, '厢式货车', '3', 'asset_vehicle_type', 0, 'info', '', '封闭式货运车辆', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 4, '18吨双飞翼货车', '4', 'asset_vehicle_type', 0, 'warning', '', '大型货运车辆', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 5, '轻型货车', '5', 'asset_vehicle_type', 0, 'default', '', '4.5吨以下货车', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 6, '中型货车', '6', 'asset_vehicle_type', 0, 'default', '', '4.5-12吨货车', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 7, '重型货车', '7', 'asset_vehicle_type', 0, 'danger', '', '12吨以上货车', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 8, '客车', '8', 'asset_vehicle_type', 0, 'primary', '', '大中型客运车辆', 'admin', NOW(), 'admin', NOW(), 0 UNION ALL
SELECT 9, '专用车', '9', 'asset_vehicle_type', 0, 'info', '', '特种用途车辆', 'admin', NOW(), 'admin', NOW(), 0
) AS tmp
WHERE NOT EXISTS (
SELECT 1 FROM `system_dict_data` WHERE `dict_type` = 'asset_vehicle_type' AND `value` = tmp.value
);
SELECT 'Vehicle type dictionary created successfully!' AS status;
-- ==================== 第三部分车辆上牌记录表创建asset 库)====================
USE `asset`;
-- 创建车辆上牌记录表
CREATE TABLE IF NOT EXISTS `asset_vehicle_registration` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`vehicle_id` BIGINT NOT NULL COMMENT '车辆ID',
`vin` VARCHAR(50) NOT NULL COMMENT '车辆识别代号VIN',
`plate_no` VARCHAR(20) NOT NULL COMMENT '车牌号',
`plate_date` DATE NOT NULL COMMENT '上牌日期',
`operator` VARCHAR(50) COMMENT '操作员',
-- OCR 识别信息
`recognized_brand` VARCHAR(100) COMMENT 'OCR识别的品牌型号',
`recognized_model` VARCHAR(100) COMMENT 'OCR识别的车型',
`vehicle_type` VARCHAR(50) COMMENT '车辆类型',
`owner` VARCHAR(100) COMMENT '所有人',
`use_character` VARCHAR(50) COMMENT '使用性质',
`engine_no` VARCHAR(50) COMMENT '发动机号码',
`register_date` DATE COMMENT '注册日期',
`issue_date` DATE COMMENT '发证日期',
`inspection_record` VARCHAR(50) COMMENT '检验记录',
`scrap_date` DATE COMMENT '强制报废期止',
`curb_weight` VARCHAR(20) COMMENT '整备质量kg',
`total_mass` VARCHAR(20) COMMENT '总质量kg',
`approved_passenger_capacity` VARCHAR(20) COMMENT '核定载人数',
-- 匹配信息
`vehicle_model_id` BIGINT COMMENT '匹配的车型ID',
`match_confidence` DECIMAL(5,2) COMMENT '匹配置信度0-100',
`match_method` VARCHAR(20) COMMENT '匹配方式exact/fuzzy/manual',
-- 照片信息
`photo_url` VARCHAR(500) COMMENT '行驶证照片URL',
`photo_size` INT COMMENT '照片大小(字节)',
-- OCR 信息
`ocr_provider` VARCHAR(50) COMMENT 'OCR厂商',
`ocr_cost_time` INT COMMENT 'OCR识别耗时毫秒',
`ocr_raw_result` TEXT COMMENT 'OCR原始结果JSON',
-- 状态信息
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0-待确认 1-已确认 2-已作废)',
`remark` VARCHAR(500) COMMENT '备注',
-- 审计字段
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_vehicle_plate` (`vehicle_id`, `plate_no`, `deleted`),
INDEX `idx_vin` (`vin`),
INDEX `idx_plate_no` (`plate_no`),
INDEX `idx_plate_date` (`plate_date`),
INDEX `idx_status` (`status`),
INDEX `idx_create_time` (`create_time`),
INDEX `idx_tenant_id` (`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆上牌记录表';
SELECT 'Vehicle registration table created successfully!' AS status;
-- ==================== 第四部分菜单和权限配置system 库或主库)====================
-- 注意:需要先找到"车辆管理"或"资产管理"的父菜单ID
-- 如果没有父菜单,请先创建或手动指定 parent_id
-- 查询可能的父菜单
SELECT id, name, parent_id, path
FROM system_menu
WHERE name LIKE '%车辆%' OR name LIKE '%资产%' OR path LIKE '%vehicle%' OR path LIKE '%asset%'
ORDER BY id;
-- 手动执行:将下面的 @parent_id 替换为实际的父菜单ID
-- SET @parent_id = YOUR_PARENT_MENU_ID;
-- 插入上牌管理菜单(请手动替换 @parent_id
-- INSERT INTO system_menu(
-- name, permission, type, sort, parent_id,
-- path, icon, component, status, component_name
-- )
-- VALUES (
-- '上牌管理', '', 2, 3, @parent_id,
-- 'registration', 'form', 'asset/vehicle/registration/index', 0, 'VehicleRegistration'
-- );
-- 获取刚插入的菜单ID
-- SET @menuId = LAST_INSERT_ID();
-- 上牌管理按钮权限
-- INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
-- VALUES
-- ('上牌记录查询', 'asset:vehicle-registration:query', 3, 1, @menuId, '', '', '', 0),
-- ('上牌记录创建', 'asset:vehicle-registration:create', 3, 2, @menuId, '', '', '', 0),
-- ('上牌记录更新', 'asset:vehicle-registration:update', 3, 3, @menuId, '', '', '', 0),
-- ('上牌记录删除', 'asset:vehicle-registration:delete', 3, 4, @menuId, '', '', '', 0),
-- ('行驶证识别', 'asset:vehicle-registration:recognize', 3, 5, @menuId, '', '', '', 0);
SELECT '========================================' AS '';
SELECT 'All updates completed!' AS status;
SELECT '========================================' AS '';
SELECT '注意菜单部分需要手动执行请先查询父菜单ID' AS note;

836
sql/rebuild/asset_ddl.sql Normal file
View File

@@ -0,0 +1,836 @@
-- ============================================================
-- Asset Module DDL - Generated from DO classes
-- Database: oneos_asset
-- Generated: 2026-03-16
-- ============================================================
-- 1. asset_parking (停车场)
DROP TABLE IF EXISTS `asset_parking`;
CREATE TABLE `asset_parking` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`name` varchar(255) DEFAULT NULL COMMENT '停车场名称',
`capacity` int DEFAULT NULL COMMENT '容量',
`manager_name` varchar(255) DEFAULT NULL COMMENT '管理员姓名',
`manager_phone` varchar(64) DEFAULT NULL COMMENT '管理员电话',
`contact_name` varchar(255) DEFAULT NULL COMMENT '联系人姓名',
`contact_phone` varchar(64) DEFAULT NULL COMMENT '联系人电话',
`parked_amount` int DEFAULT NULL COMMENT '已停数量',
`province` varchar(64) DEFAULT NULL COMMENT '省份',
`city` varchar(64) DEFAULT NULL COMMENT '城市',
`address` varchar(500) DEFAULT NULL COMMENT '详细地址',
`longitude` varchar(32) DEFAULT NULL COMMENT '经度',
`latitude` varchar(32) DEFAULT NULL COMMENT '纬度',
`lease_start_date` date DEFAULT NULL COMMENT '租赁开始日期',
`lease_end_date` date DEFAULT NULL COMMENT '租赁结束日期',
`rent_fee` decimal(18,2) DEFAULT NULL COMMENT '租金',
`contract_file_url` varchar(500) DEFAULT NULL COMMENT '合同文件URL',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='停车场';
-- 2. asset_vehicle_model (车型参数)
DROP TABLE IF EXISTS `asset_vehicle_model`;
CREATE TABLE `asset_vehicle_model` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`brand` varchar(128) DEFAULT NULL COMMENT '品牌',
`model` varchar(128) DEFAULT NULL COMMENT '型号',
`vehicle_type` varchar(64) DEFAULT NULL COMMENT '车辆类型',
`model_label` varchar(128) DEFAULT NULL COMMENT '车型标签',
`fuel_type` varchar(64) DEFAULT NULL COMMENT '燃料类型',
`plate_color` varchar(32) DEFAULT NULL COMMENT '车牌颜色',
`truck_size_x` varchar(32) DEFAULT NULL COMMENT '货箱尺寸X',
`truck_size_y` varchar(32) DEFAULT NULL COMMENT '货箱尺寸Y',
`truck_size_z` varchar(32) DEFAULT NULL COMMENT '货箱尺寸Z',
`tire_size` varchar(64) DEFAULT NULL COMMENT '轮胎尺寸',
`tire_number` int DEFAULT NULL COMMENT '轮胎数量',
`battery_type` varchar(64) DEFAULT NULL COMMENT '电池类型',
`battery_factory` varchar(128) DEFAULT NULL COMMENT '电池厂家',
`reserve_electricity` decimal(18,2) DEFAULT NULL COMMENT '储备电量',
`electricity_mileage` int DEFAULT NULL COMMENT '纯电续航里程',
`hydrogen_capacity` int DEFAULT NULL COMMENT '储氢容量',
`hydrogen_factory` varchar(128) DEFAULT NULL COMMENT '氢系统厂家',
`hydrogen_unit` varchar(32) DEFAULT NULL COMMENT '氢气单位',
`hydrogen_mileage` int DEFAULT NULL COMMENT '氢续航里程',
`refrigerator_factory` varchar(128) DEFAULT NULL COMMENT '冷机厂家',
`online_spread_enterprise` varchar(255) DEFAULT NULL COMMENT '线上传播企业',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车型参数';
-- 3. asset_vehicle_model_maintain_item (车型保养项目)
DROP TABLE IF EXISTS `asset_vehicle_model_maintain_item`;
CREATE TABLE `asset_vehicle_model_maintain_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vehicle_model_id` bigint DEFAULT NULL COMMENT '车型ID',
`maintain_item` varchar(255) DEFAULT NULL COMMENT '保养项目',
`kilometer_cycle` int DEFAULT NULL COMMENT '公里周期',
`time_cycle` int DEFAULT NULL COMMENT '时间周期(月)',
`hour_fee` decimal(18,2) DEFAULT NULL COMMENT '工时费',
`material_fee` decimal(18,2) DEFAULT NULL COMMENT '材料费',
`total_fee` decimal(18,2) DEFAULT NULL COMMENT '总费用',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车型保养项目';
-- 4. asset_vehicle_base (车辆基础信息)
DROP TABLE IF EXISTS `asset_vehicle_base`;
CREATE TABLE `asset_vehicle_base` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`vehicle_no` varchar(64) DEFAULT NULL COMMENT '车辆编号',
`vehicle_model_id` bigint DEFAULT NULL COMMENT '车型ID',
`region_province` varchar(64) DEFAULT NULL COMMENT '所属省份',
`region_city` varchar(64) DEFAULT NULL COMMENT '所属城市',
`engine_no` varchar(64) DEFAULT NULL COMMENT '发动机号',
`register_date` date DEFAULT NULL COMMENT '注册日期',
`purchase_date` date DEFAULT NULL COMMENT '购买日期',
`purchase_price` decimal(18,2) DEFAULT NULL COMMENT '购买价格',
`color` varchar(32) DEFAULT NULL COMMENT '颜色',
`year` varchar(16) DEFAULT NULL COMMENT '年款',
`mileage` int DEFAULT NULL COMMENT '里程数',
`inspect_expire` varchar(32) DEFAULT NULL COMMENT '年检到期',
`scrap_date` date DEFAULT NULL COMMENT '报废日期',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_vin` (`vin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆基础信息';
-- 5. asset_vehicle_location (车辆位置信息)
DROP TABLE IF EXISTS `asset_vehicle_location`;
CREATE TABLE `asset_vehicle_location` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`parking_id` bigint DEFAULT NULL COMMENT '停车场ID',
`parking_name` varchar(255) DEFAULT NULL COMMENT '停车场名称',
`parking_space` varchar(64) DEFAULT NULL COMMENT '车位号',
`location` varchar(500) DEFAULT NULL COMMENT '位置描述',
`latitude` decimal(18,8) DEFAULT NULL COMMENT '纬度',
`longitude` decimal(18,8) DEFAULT NULL COMMENT '经度',
`gps_time` datetime DEFAULT NULL COMMENT 'GPS时间',
`entry_time` datetime DEFAULT NULL COMMENT '进场时间',
`exit_time` datetime DEFAULT NULL COMMENT '出场时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_vehicle_id` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆位置信息';
-- 6. asset_vehicle_business (车辆业务信息)
DROP TABLE IF EXISTS `asset_vehicle_business`;
CREATE TABLE `asset_vehicle_business` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`department_id` bigint DEFAULT NULL COMMENT '部门ID',
`manager_id` bigint DEFAULT NULL COMMENT '管理人ID',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`ownership` varchar(64) DEFAULT NULL COMMENT '产权归属',
`delivery_date` date DEFAULT NULL COMMENT '交车日期',
`return_date` date DEFAULT NULL COMMENT '还车日期',
`monthly_rent` decimal(18,2) DEFAULT NULL COMMENT '月租金',
`deposit` decimal(18,2) DEFAULT NULL COMMENT '押金',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_vehicle_id` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆业务信息';
-- 7. asset_vehicle_status (车辆状态信息)
DROP TABLE IF EXISTS `asset_vehicle_status`;
CREATE TABLE `asset_vehicle_status` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`status` int DEFAULT NULL COMMENT '车辆状态',
`operate_status` int DEFAULT NULL COMMENT '运营状态',
`storage_status` int DEFAULT NULL COMMENT '仓储状态',
`out_status` int DEFAULT NULL COMMENT '出库状态',
`preempt_status` int DEFAULT NULL COMMENT '占用状态',
`prepare_status` int DEFAULT NULL COMMENT '备车状态',
`transfer_status` int DEFAULT NULL COMMENT '调拨状态',
`repair_status` int DEFAULT NULL COMMENT '维修状态',
`license_status` int DEFAULT NULL COMMENT '牌照状态',
`scrap_status` int DEFAULT NULL COMMENT '报废状态',
`online_status` int DEFAULT NULL COMMENT '在线状态',
`is_prepared` bit(1) DEFAULT NULL COMMENT '是否已备车',
`is_delivered` bit(1) DEFAULT NULL COMMENT '是否已交车',
`is_returned` bit(1) DEFAULT NULL COMMENT '是否已还车',
`last_maintain_date` date DEFAULT NULL COMMENT '上次保养日期',
`next_maintain_date` date DEFAULT NULL COMMENT '下次保养日期',
`last_inspect_date` date DEFAULT NULL COMMENT '上次年检日期',
`next_inspect_date` date DEFAULT NULL COMMENT '下次年检日期',
`insurance_expire_date` date DEFAULT NULL COMMENT '保险到期日期',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_vehicle_id` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆状态信息';
-- 8. asset_customer (客户)
DROP TABLE IF EXISTS `asset_customer`;
CREATE TABLE `asset_customer` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`customer_code` varchar(64) DEFAULT NULL COMMENT '客户编码',
`coop_status` varchar(32) DEFAULT NULL COMMENT '合作状态',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`province` varchar(64) DEFAULT NULL COMMENT '省份',
`city` varchar(64) DEFAULT NULL COMMENT '城市',
`address` varchar(500) DEFAULT NULL COMMENT '地址',
`region` varchar(64) DEFAULT NULL COMMENT '区域',
`contact` varchar(64) DEFAULT NULL COMMENT '联系人',
`contact_mobile` varchar(32) DEFAULT NULL COMMENT '联系手机',
`contact_phone` varchar(32) DEFAULT NULL COMMENT '联系电话',
`email` varchar(128) DEFAULT NULL COMMENT '邮箱',
`credit_code_or_id` varchar(64) DEFAULT NULL COMMENT '统一社会信用代码/身份证',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`tax_id` varchar(64) DEFAULT NULL COMMENT '税号',
`invoice_address` varchar(500) DEFAULT NULL COMMENT '开票地址',
`invoice_phone` varchar(32) DEFAULT NULL COMMENT '开票电话',
`account` varchar(64) DEFAULT NULL COMMENT '银行账号',
`opening_bank` varchar(255) DEFAULT NULL COMMENT '开户行',
`mailing_address` varchar(500) DEFAULT NULL COMMENT '邮寄地址',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户';
-- 9. asset_customer_business_manager (客户商务经理)
DROP TABLE IF EXISTS `asset_customer_business_manager`;
CREATE TABLE `asset_customer_business_manager` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`business_manager_name` varchar(64) DEFAULT NULL COMMENT '商务经理名称',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户商务经理';
-- 10. asset_supplier (供应商)
DROP TABLE IF EXISTS `asset_supplier`;
CREATE TABLE `asset_supplier` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`supplier_code` varchar(64) DEFAULT NULL COMMENT '供应商编码',
`coop_status` varchar(32) DEFAULT NULL COMMENT '合作状态',
`supplier_name` varchar(255) DEFAULT NULL COMMENT '供应商名称',
`type` varchar(64) DEFAULT NULL COMMENT '类型',
`province` varchar(64) DEFAULT NULL COMMENT '省份',
`city` varchar(64) DEFAULT NULL COMMENT '城市',
`address` varchar(500) DEFAULT NULL COMMENT '地址',
`region` varchar(64) DEFAULT NULL COMMENT '区域',
`contact` varchar(64) DEFAULT NULL COMMENT '联系人',
`contact_mobile` varchar(32) DEFAULT NULL COMMENT '联系手机',
`contact_phone` varchar(32) DEFAULT NULL COMMENT '联系电话',
`email` varchar(128) DEFAULT NULL COMMENT '邮箱',
`credit_code_or_id` varchar(64) DEFAULT NULL COMMENT '统一社会信用代码',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`tax_id` varchar(64) DEFAULT NULL COMMENT '税号',
`invoice_address` varchar(500) DEFAULT NULL COMMENT '开票地址',
`invoice_phone` varchar(32) DEFAULT NULL COMMENT '开票电话',
`account` varchar(64) DEFAULT NULL COMMENT '银行账号',
`opening_bank` varchar(255) DEFAULT NULL COMMENT '开户行',
`mailing_address` varchar(500) DEFAULT NULL COMMENT '邮寄地址',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='供应商';
-- 11. asset_vehicle_registration (车辆行驶证)
DROP TABLE IF EXISTS `asset_vehicle_registration`;
CREATE TABLE `asset_vehicle_registration` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`plate_date` date DEFAULT NULL COMMENT '上牌日期',
`operator` varchar(64) DEFAULT NULL COMMENT '经办人',
`recognized_brand` varchar(128) DEFAULT NULL COMMENT '识别品牌',
`recognized_model` varchar(128) DEFAULT NULL COMMENT '识别型号',
`vehicle_type` varchar(64) DEFAULT NULL COMMENT '车辆类型',
`owner` varchar(255) DEFAULT NULL COMMENT '所有人',
`use_character` varchar(64) DEFAULT NULL COMMENT '使用性质',
`engine_no` varchar(64) DEFAULT NULL COMMENT '发动机号',
`register_date` date DEFAULT NULL COMMENT '注册日期',
`issue_date` date DEFAULT NULL COMMENT '发证日期',
`inspection_record` varchar(500) DEFAULT NULL COMMENT '检验记录',
`scrap_date` date DEFAULT NULL COMMENT '报废日期',
`curb_weight` varchar(32) DEFAULT NULL COMMENT '整备质量',
`total_mass` varchar(32) DEFAULT NULL COMMENT '总质量',
`approved_passenger_capacity` varchar(32) DEFAULT NULL COMMENT '核定载客',
`vehicle_model_id` bigint DEFAULT NULL COMMENT '车型ID',
`match_confidence` decimal(5,2) DEFAULT NULL COMMENT '匹配置信度',
`match_method` varchar(32) DEFAULT NULL COMMENT '匹配方式',
`photo_url` varchar(500) DEFAULT NULL COMMENT '照片URL',
`photo_size` int DEFAULT NULL COMMENT '照片大小',
`ocr_provider` varchar(64) DEFAULT NULL COMMENT 'OCR提供商',
`ocr_cost_time` int DEFAULT NULL COMMENT 'OCR耗时(ms)',
`ocr_raw_result` text COMMENT 'OCR原始结果',
`status` int DEFAULT NULL COMMENT '状态',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆行驶证';
-- 12. asset_contract (合同)
DROP TABLE IF EXISTS `asset_contract`;
CREATE TABLE `asset_contract` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`contract_code` varchar(64) DEFAULT NULL COMMENT '合同编号',
`contract_type` int DEFAULT NULL COMMENT '合同类型',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`start_date` date DEFAULT NULL COMMENT '开始日期',
`end_date` date DEFAULT NULL COMMENT '结束日期',
`payment_method` varchar(64) DEFAULT NULL COMMENT '付款方式',
`payment_cycle` varchar(64) DEFAULT NULL COMMENT '付款周期',
`signing_company` varchar(255) DEFAULT NULL COMMENT '签约公司',
`delivery_province` varchar(64) DEFAULT NULL COMMENT '交付省份',
`delivery_city` varchar(64) DEFAULT NULL COMMENT '交付城市',
`delivery_location` varchar(500) DEFAULT NULL COMMENT '交付地点',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`third_party_enabled` bit(1) DEFAULT NULL COMMENT '是否启用第三方',
`third_party_customer_id` bigint DEFAULT NULL COMMENT '第三方客户ID',
`third_party_name` varchar(255) DEFAULT NULL COMMENT '第三方名称',
`business_dept_id` bigint DEFAULT NULL COMMENT '商务部门ID',
`business_manager_id` bigint DEFAULT NULL COMMENT '商务经理ID',
`approval_status` int DEFAULT NULL COMMENT '审批状态',
`bpm_instance_id` varchar(64) DEFAULT NULL COMMENT '流程实例ID',
`contract_status` int DEFAULT NULL COMMENT '合同状态',
`effective_time` datetime DEFAULT NULL COMMENT '生效时间',
`terminate_time` datetime DEFAULT NULL COMMENT '终止时间',
`terminate_reason` varchar(500) DEFAULT NULL COMMENT '终止原因',
`renewed_contract_id` bigint DEFAULT NULL COMMENT '续约合同ID',
`original_contract_id` bigint DEFAULT NULL COMMENT '原始合同ID',
`hydrogen_bearer` varchar(64) DEFAULT NULL COMMENT '氢费承担方',
`hydrogen_payment_method` varchar(64) DEFAULT NULL COMMENT '氢费支付方式',
`hydrogen_prepay` decimal(18,2) DEFAULT NULL COMMENT '氢费预付金额',
`hydrogen_return_price` decimal(18,2) DEFAULT NULL COMMENT '氢费返还单价',
`billing_method` varchar(64) DEFAULT NULL COMMENT '计费方式',
`main_vehicle_type` varchar(64) DEFAULT NULL COMMENT '主要车型',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同';
-- 13. asset_contract_vehicle (合同车辆)
DROP TABLE IF EXISTS `asset_contract_vehicle`;
CREATE TABLE `asset_contract_vehicle` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`brand` varchar(128) DEFAULT NULL COMMENT '品牌',
`model` varchar(128) DEFAULT NULL COMMENT '型号',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`month_rent` decimal(18,2) DEFAULT NULL COMMENT '月租金',
`deposit` decimal(18,2) DEFAULT NULL COMMENT '押金',
`vehicle_status` int DEFAULT NULL COMMENT '车辆状态',
`actual_delivery_time` datetime DEFAULT NULL COMMENT '实际交付时间',
`delivery_person` varchar(64) DEFAULT NULL COMMENT '交付人',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同车辆';
-- 14. asset_contract_vehicle_service (合同车辆服务)
DROP TABLE IF EXISTS `asset_contract_vehicle_service`;
CREATE TABLE `asset_contract_vehicle_service` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`contract_vehicle_id` bigint DEFAULT NULL COMMENT '合同车辆ID',
`service_name` varchar(255) DEFAULT NULL COMMENT '服务名称',
`service_fee` decimal(18,2) DEFAULT NULL COMMENT '服务费',
`effective_date` date DEFAULT NULL COMMENT '生效日期',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同车辆服务';
-- 15. asset_contract_authorized (合同授权人)
DROP TABLE IF EXISTS `asset_contract_authorized`;
CREATE TABLE `asset_contract_authorized` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`name` varchar(64) DEFAULT NULL COMMENT '姓名',
`phone` varchar(32) DEFAULT NULL COMMENT '电话',
`id_card` varchar(32) DEFAULT NULL COMMENT '身份证号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同授权人';
-- 16. asset_contract_attachment (合同附件)
DROP TABLE IF EXISTS `asset_contract_attachment`;
CREATE TABLE `asset_contract_attachment` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`attachment_type` int DEFAULT NULL COMMENT '附件类型',
`file_id` bigint DEFAULT NULL COMMENT '文件ID',
`file_name` varchar(255) DEFAULT NULL COMMENT '文件名',
`file_url` varchar(500) DEFAULT NULL COMMENT '文件URL',
`file_size` bigint DEFAULT NULL COMMENT '文件大小',
`upload_time` datetime DEFAULT NULL COMMENT '上传时间',
`uploader` varchar(64) DEFAULT NULL COMMENT '上传人',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同附件';
-- 17. asset_contract_change_history (合同变更历史)
DROP TABLE IF EXISTS `asset_contract_change_history`;
CREATE TABLE `asset_contract_change_history` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`change_type` varchar(64) DEFAULT NULL COMMENT '变更类型',
`change_content` text COMMENT '变更内容',
`operator` varchar(64) DEFAULT NULL COMMENT '操作人',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同变更历史';
-- 18. asset_inspection_template (验车模板)
DROP TABLE IF EXISTS `asset_inspection_template`;
CREATE TABLE `asset_inspection_template` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`code` varchar(64) DEFAULT NULL COMMENT '模板编码',
`name` varchar(255) DEFAULT NULL COMMENT '模板名称',
`biz_type` int DEFAULT NULL COMMENT '业务类型',
`vehicle_type` varchar(64) DEFAULT NULL COMMENT '车辆类型',
`status` int DEFAULT NULL COMMENT '状态',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车模板';
-- 19. asset_inspection_template_item (验车模板项)
DROP TABLE IF EXISTS `asset_inspection_template_item`;
CREATE TABLE `asset_inspection_template_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`template_id` bigint DEFAULT NULL COMMENT '模板ID',
`category` varchar(64) DEFAULT NULL COMMENT '分类',
`item_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`item_code` varchar(64) DEFAULT NULL COMMENT '项目编码',
`input_type` varchar(32) DEFAULT NULL COMMENT '输入类型',
`sort` int DEFAULT NULL COMMENT '排序',
`required` int DEFAULT NULL COMMENT '是否必填',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车模板项';
-- 20. asset_inspection_record (验车记录)
DROP TABLE IF EXISTS `asset_inspection_record`;
CREATE TABLE `asset_inspection_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`record_code` varchar(64) DEFAULT NULL COMMENT '记录编码',
`template_id` bigint DEFAULT NULL COMMENT '模板ID',
`source_type` int DEFAULT NULL COMMENT '来源类型',
`source_id` bigint DEFAULT NULL COMMENT '来源ID',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`inspector_name` varchar(64) DEFAULT NULL COMMENT '检查人',
`inspection_time` datetime DEFAULT NULL COMMENT '检查时间',
`status` int DEFAULT NULL COMMENT '状态',
`overall_result` int DEFAULT NULL COMMENT '总体结果',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`cloned_from_id` bigint DEFAULT NULL COMMENT '克隆自ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车记录';
-- 21. asset_inspection_record_item (验车记录项)
DROP TABLE IF EXISTS `asset_inspection_record_item`;
CREATE TABLE `asset_inspection_record_item` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`record_id` bigint DEFAULT NULL COMMENT '记录ID',
`item_code` varchar(64) DEFAULT NULL COMMENT '项目编码',
`category` varchar(64) DEFAULT NULL COMMENT '分类',
`item_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`input_type` varchar(32) DEFAULT NULL COMMENT '输入类型',
`result` int DEFAULT NULL COMMENT '结果',
`value` varchar(500) DEFAULT NULL COMMENT '',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`image_urls` varchar(2000) DEFAULT NULL COMMENT '图片URL列表',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车记录项';
-- 22. asset_vehicle_prepare (备车)
DROP TABLE IF EXISTS `asset_vehicle_prepare`;
CREATE TABLE `asset_vehicle_prepare` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`vehicle_model_id` bigint DEFAULT NULL COMMENT '车型ID',
`brand` varchar(128) DEFAULT NULL COMMENT '品牌',
`model` varchar(128) DEFAULT NULL COMMENT '型号',
`vehicle_type` varchar(64) DEFAULT NULL COMMENT '车辆类型',
`parking_lot` varchar(255) DEFAULT NULL COMMENT '停车场',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`contract_code` varchar(64) DEFAULT NULL COMMENT '合同编号',
`preparation_type` varchar(64) DEFAULT NULL COMMENT '备车类型',
`mileage` int DEFAULT NULL COMMENT '里程',
`hydrogen_remaining` decimal(18,2) DEFAULT NULL COMMENT '剩余氢量',
`hydrogen_unit` varchar(32) DEFAULT NULL COMMENT '氢气单位',
`battery_remaining` decimal(18,2) DEFAULT NULL COMMENT '剩余电量',
`has_body_ad` bit(1) DEFAULT NULL COMMENT '是否有车身广告',
`body_ad_photos` varchar(2000) DEFAULT NULL COMMENT '车身广告照片',
`enlarged_text_photo` varchar(500) DEFAULT NULL COMMENT '放大字照片',
`has_tail_lift` bit(1) DEFAULT NULL COMMENT '是否有尾板',
`spare_tire_depth` decimal(18,2) DEFAULT NULL COMMENT '备胎花纹深度',
`spare_tire_photo` varchar(500) DEFAULT NULL COMMENT '备胎照片',
`trailer_plate_no` varchar(32) DEFAULT NULL COMMENT '挂车牌号',
`defect_photos` varchar(2000) DEFAULT NULL COMMENT '缺陷照片',
`inspection_record_id` bigint DEFAULT NULL COMMENT '验车记录ID',
`check_list` text COMMENT '检查清单JSON',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`status` int DEFAULT NULL COMMENT '状态',
`complete_time` datetime DEFAULT NULL COMMENT '完成时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='备车';
-- 23. asset_delivery_task (交车任务)
DROP TABLE IF EXISTS `asset_delivery_task`;
CREATE TABLE `asset_delivery_task` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`task_code` varchar(64) DEFAULT NULL COMMENT '任务编码',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`contract_code` varchar(64) DEFAULT NULL COMMENT '合同编号',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`expected_delivery_date_start` date DEFAULT NULL COMMENT '预计交付开始日期',
`expected_delivery_date_end` date DEFAULT NULL COMMENT '预计交付结束日期',
`billing_start_date` date DEFAULT NULL COMMENT '计费开始日期',
`delivery_province` varchar(64) DEFAULT NULL COMMENT '交付省份',
`delivery_city` varchar(64) DEFAULT NULL COMMENT '交付城市',
`delivery_location` varchar(500) DEFAULT NULL COMMENT '交付地点',
`vehicle_count` int DEFAULT NULL COMMENT '车辆数量',
`task_status` int DEFAULT NULL COMMENT '任务状态',
`delivery_status` int DEFAULT NULL COMMENT '交付状态',
`need_return` bit(1) DEFAULT NULL COMMENT '是否需要还车',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车任务';
-- 24. asset_delivery_task_vehicle (交车任务车辆)
DROP TABLE IF EXISTS `asset_delivery_task_vehicle`;
CREATE TABLE `asset_delivery_task_vehicle` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`task_id` bigint DEFAULT NULL COMMENT '任务ID',
`contract_vehicle_id` bigint DEFAULT NULL COMMENT '合同车辆ID',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`brand` varchar(128) DEFAULT NULL COMMENT '品牌',
`model` varchar(128) DEFAULT NULL COMMENT '型号',
`month_rent` decimal(18,2) DEFAULT NULL COMMENT '月租金',
`deposit` decimal(18,2) DEFAULT NULL COMMENT '押金',
`actual_delivery_date` datetime DEFAULT NULL COMMENT '实际交付日期',
`delivery_person` varchar(64) DEFAULT NULL COMMENT '交付人',
`is_delivered` bit(1) DEFAULT NULL COMMENT '是否已交付',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车任务车辆';
-- 25. asset_delivery_order (交车单)
DROP TABLE IF EXISTS `asset_delivery_order`;
CREATE TABLE `asset_delivery_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`order_code` varchar(64) DEFAULT NULL COMMENT '交车单号',
`task_id` bigint DEFAULT NULL COMMENT '任务ID',
`task_code` varchar(64) DEFAULT NULL COMMENT '任务编码',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`contract_code` varchar(64) DEFAULT NULL COMMENT '合同编号',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`delivery_date` datetime DEFAULT NULL COMMENT '交车日期',
`delivery_person` varchar(64) DEFAULT NULL COMMENT '交车人',
`delivery_location` varchar(500) DEFAULT NULL COMMENT '交车地点',
`authorized_person_id` bigint DEFAULT NULL COMMENT '授权人ID',
`authorized_person_name` varchar(64) DEFAULT NULL COMMENT '授权人姓名',
`authorized_person_phone` varchar(32) DEFAULT NULL COMMENT '授权人电话',
`authorized_person_id_card` varchar(32) DEFAULT NULL COMMENT '授权人身份证',
`esign_flow_id` varchar(128) DEFAULT NULL COMMENT '电子签章流程ID',
`esign_status` int DEFAULT NULL COMMENT '电子签章状态',
`delivery_photos` varchar(2000) DEFAULT NULL COMMENT '交车照片',
`driver_name` varchar(64) DEFAULT NULL COMMENT '司机姓名',
`driver_id_card` varchar(32) DEFAULT NULL COMMENT '司机身份证',
`driver_phone` varchar(32) DEFAULT NULL COMMENT '司机电话',
`inspection_data` text COMMENT '验车数据JSON',
`cost_list` text COMMENT '费用清单JSON',
`inspection_record_id` bigint DEFAULT NULL COMMENT '验车记录ID',
`status` int DEFAULT NULL COMMENT '状态',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车单';
-- 26. asset_delivery_order_vehicle (交车单车辆)
DROP TABLE IF EXISTS `asset_delivery_order_vehicle`;
CREATE TABLE `asset_delivery_order_vehicle` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`order_id` bigint DEFAULT NULL COMMENT '交车单ID',
`task_vehicle_id` bigint DEFAULT NULL COMMENT '任务车辆ID',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`brand` varchar(128) DEFAULT NULL COMMENT '品牌',
`model` varchar(128) DEFAULT NULL COMMENT '型号',
`mileage` int DEFAULT NULL COMMENT '里程',
`hydrogen_level` decimal(18,2) DEFAULT NULL COMMENT '氢量',
`battery_level` decimal(18,2) DEFAULT NULL COMMENT '电量',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车单车辆';
-- 27. asset_vehicle_replacement (替换车)
DROP TABLE IF EXISTS `asset_vehicle_replacement`;
CREATE TABLE `asset_vehicle_replacement` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`replacement_code` varchar(64) DEFAULT NULL COMMENT '替换编号',
`replacement_type` int DEFAULT NULL COMMENT '替换类型',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`contract_code` varchar(64) DEFAULT NULL COMMENT '合同编号',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`delivery_order_id` bigint DEFAULT NULL COMMENT '交车单ID',
`original_vehicle_id` bigint DEFAULT NULL COMMENT '原车辆ID',
`original_plate_no` varchar(32) DEFAULT NULL COMMENT '原车牌号',
`original_vin` varchar(64) DEFAULT NULL COMMENT '原VIN码',
`new_vehicle_id` bigint DEFAULT NULL COMMENT '新车辆ID',
`new_plate_no` varchar(32) DEFAULT NULL COMMENT '新车牌号',
`new_vin` varchar(64) DEFAULT NULL COMMENT '新VIN码',
`replacement_reason` varchar(500) DEFAULT NULL COMMENT '替换原因',
`expected_date` date DEFAULT NULL COMMENT '预计替换日期',
`actual_date` date DEFAULT NULL COMMENT '实际替换日期',
`return_date` date DEFAULT NULL COMMENT '预计归还日期',
`actual_return_date` date DEFAULT NULL COMMENT '实际归还日期',
`status` int DEFAULT NULL COMMENT '状态',
`approval_status` int DEFAULT NULL COMMENT '审批状态',
`bpm_instance_id` varchar(64) DEFAULT NULL COMMENT '流程实例ID',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='替换车';
-- 28. asset_return_order (还车单)
DROP TABLE IF EXISTS `asset_return_order`;
CREATE TABLE `asset_return_order` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`order_code` varchar(64) DEFAULT NULL COMMENT '还车单号',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`contract_code` varchar(64) DEFAULT NULL COMMENT '合同编号',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`return_date` datetime DEFAULT NULL COMMENT '还车日期',
`return_person` varchar(64) DEFAULT NULL COMMENT '还车人',
`return_location` varchar(500) DEFAULT NULL COMMENT '还车地点',
`return_reason` varchar(64) DEFAULT NULL COMMENT '还车原因',
`return_reason_desc` varchar(500) DEFAULT NULL COMMENT '还车原因描述',
`total_refund_amount` decimal(18,2) DEFAULT NULL COMMENT '退款总额',
`deposit_refund` decimal(18,2) DEFAULT NULL COMMENT '押金退款',
`hydrogen_refund` decimal(18,2) DEFAULT NULL COMMENT '氢费退款',
`other_charges` decimal(18,2) DEFAULT NULL COMMENT '其他费用',
`return_photos` varchar(2000) DEFAULT NULL COMMENT '还车照片',
`status` int DEFAULT NULL COMMENT '状态',
`approval_status` int DEFAULT NULL COMMENT '审批状态',
`bpm_instance_id` varchar(64) DEFAULT NULL COMMENT '流程实例ID',
`source_type` int DEFAULT NULL COMMENT '来源类型',
`source_id` bigint DEFAULT NULL COMMENT '来源ID',
`delivery_order_id` bigint DEFAULT NULL COMMENT '交车单ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='还车单';
-- 29. asset_return_order_vehicle (还车单车辆)
DROP TABLE IF EXISTS `asset_return_order_vehicle`;
CREATE TABLE `asset_return_order_vehicle` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`return_order_id` bigint DEFAULT NULL COMMENT '还车单ID',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`plate_no` varchar(32) DEFAULT NULL COMMENT '车牌号',
`vin` varchar(64) DEFAULT NULL COMMENT 'VIN码',
`brand` varchar(128) DEFAULT NULL COMMENT '品牌',
`model` varchar(128) DEFAULT NULL COMMENT '型号',
`return_mileage` int DEFAULT NULL COMMENT '还车里程',
`return_hydrogen_level` decimal(18,2) DEFAULT NULL COMMENT '还车氢量',
`delivery_hydrogen_level` decimal(18,2) DEFAULT NULL COMMENT '交车氢量',
`hydrogen_diff` decimal(18,2) DEFAULT NULL COMMENT '氢量差值',
`hydrogen_unit_price` decimal(18,2) DEFAULT NULL COMMENT '氢单价',
`hydrogen_refund_amount` decimal(18,2) DEFAULT NULL COMMENT '氢费退款金额',
`check_list` text COMMENT '检查清单JSON',
`defect_photos` varchar(2000) DEFAULT NULL COMMENT '缺陷照片',
`vehicle_damage_fee` decimal(18,2) DEFAULT NULL COMMENT '车辆损坏费',
`tool_damage_fee` decimal(18,2) DEFAULT NULL COMMENT '工具损坏费',
`unpaid_maintenance_fee` decimal(18,2) DEFAULT NULL COMMENT '未付保养费',
`unpaid_repair_fee` decimal(18,2) DEFAULT NULL COMMENT '未付维修费',
`violation_fee` decimal(18,2) DEFAULT NULL COMMENT '违章费',
`other_fee` decimal(18,2) DEFAULT NULL COMMENT '其他费用',
`inspection_record_id` bigint DEFAULT NULL COMMENT '验车记录ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='还车单车辆';
-- ============================================================
-- 车辆全量视图 (view)
-- ============================================================
DROP VIEW IF EXISTS `v_asset_vehicle_full`;
CREATE VIEW `v_asset_vehicle_full` AS
SELECT
b.id, b.vin, b.plate_no, b.vehicle_no, b.vehicle_model_id,
b.region_province, b.region_city, b.engine_no, b.register_date,
b.purchase_date, b.purchase_price, b.color, b.year, b.mileage,
b.inspect_expire, b.scrap_date,
b.creator, b.create_time, b.updater, b.update_time, b.deleted,
l.parking_id, l.parking_name, l.parking_space, l.location,
l.latitude, l.longitude, l.gps_time, l.entry_time, l.exit_time,
biz.customer_id, biz.department_id, biz.manager_id, biz.contract_id,
biz.ownership, biz.delivery_date, biz.return_date, biz.monthly_rent, biz.deposit,
s.status, s.operate_status, s.storage_status, s.out_status,
s.preempt_status, s.prepare_status, s.transfer_status,
s.repair_status, s.license_status, s.scrap_status, s.online_status,
s.is_prepared, s.is_delivered, s.is_returned,
s.last_maintain_date, s.next_maintain_date,
s.last_inspect_date, s.next_inspect_date, s.insurance_expire_date
FROM asset_vehicle_base b
LEFT JOIN asset_vehicle_location l ON b.id = l.vehicle_id AND l.deleted = 0
LEFT JOIN asset_vehicle_business biz ON b.id = biz.vehicle_id AND biz.deleted = 0
LEFT JOIN asset_vehicle_status s ON b.id = s.vehicle_id AND s.deleted = 0
WHERE b.deleted = 0;

236
sql/rebuild/energy_ddl.sql Normal file
View File

@@ -0,0 +1,236 @@
-- ============================================================
-- Energy Module DDL - Generated from DO classes
-- Database: oneos_energy
-- Generated: 2026-03-16
-- ============================================================
-- 1. energy_hydrogen_record (加氢记录)
DROP TABLE IF EXISTS `energy_hydrogen_record`;
CREATE TABLE `energy_hydrogen_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT '租户编号',
`station_id` bigint DEFAULT NULL COMMENT '加氢站ID',
`plate_number` varchar(32) DEFAULT NULL COMMENT '车牌号',
`hydrogen_date` date DEFAULT NULL COMMENT '加氢日期',
`hydrogen_quantity` decimal(18,2) DEFAULT NULL COMMENT '加氢量(kg)',
`unit_price` decimal(18,2) DEFAULT NULL COMMENT '单价',
`amount` decimal(18,2) DEFAULT NULL COMMENT '金额',
`mileage` decimal(18,2) DEFAULT NULL COMMENT '里程(km)',
`source_type` int DEFAULT NULL COMMENT '来源类型',
`match_status` int DEFAULT NULL COMMENT '匹配状态',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`upload_batch_no` varchar(64) DEFAULT NULL COMMENT '上传批次号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢记录';
-- 2. energy_hydrogen_detail (加氢明细)
DROP TABLE IF EXISTS `energy_hydrogen_detail`;
CREATE TABLE `energy_hydrogen_detail` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`record_id` bigint DEFAULT NULL COMMENT '加氢记录ID',
`station_id` bigint DEFAULT NULL COMMENT '加氢站ID',
`vehicle_id` bigint DEFAULT NULL COMMENT '车辆ID',
`plate_number` varchar(32) DEFAULT NULL COMMENT '车牌号',
`hydrogen_date` date DEFAULT NULL COMMENT '加氢日期',
`hydrogen_quantity` decimal(18,2) DEFAULT NULL COMMENT '加氢量(kg)',
`cost_price` decimal(18,2) DEFAULT NULL COMMENT '成本价',
`cost_amount` decimal(18,2) DEFAULT NULL COMMENT '成本金额',
`customer_price` decimal(18,2) DEFAULT NULL COMMENT '客户价',
`customer_amount` decimal(18,2) DEFAULT NULL COMMENT '客户金额',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`cost_bearer` int DEFAULT NULL COMMENT '费用承担方',
`pay_method` int DEFAULT NULL COMMENT '支付方式',
`audit_status` int DEFAULT NULL COMMENT '审核状态',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`deduction_status` int DEFAULT NULL COMMENT '扣费状态',
`settlement_status` int DEFAULT NULL COMMENT '结算状态',
`bill_id` bigint DEFAULT NULL COMMENT '账单ID',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='加氢明细';
-- 3. energy_bill (能源账单)
DROP TABLE IF EXISTS `energy_bill`;
CREATE TABLE `energy_bill` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`bill_code` varchar(64) DEFAULT NULL COMMENT '账单编号',
`energy_type` int DEFAULT NULL COMMENT '能源类型',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`customer_name` varchar(255) DEFAULT NULL COMMENT '客户名称',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`station_id` bigint DEFAULT NULL COMMENT '站点ID',
`station_name` varchar(255) DEFAULT NULL COMMENT '站点名称',
`cooperation_type` int DEFAULT NULL COMMENT '合作模式(1=预充值 2=月结算)',
`bill_period_start` date DEFAULT NULL COMMENT '账单周期开始',
`bill_period_end` date DEFAULT NULL COMMENT '账单周期结束',
`receivable_amount` decimal(18,2) DEFAULT NULL COMMENT '应收金额',
`actual_amount` decimal(18,2) DEFAULT NULL COMMENT '实收金额',
`adjustment_amount` decimal(18,2) DEFAULT NULL COMMENT '调整金额',
`paid_amount` decimal(18,2) DEFAULT NULL COMMENT '已付金额',
`total_quantity` decimal(18,2) DEFAULT NULL COMMENT '总用量',
`detail_count` int DEFAULT NULL COMMENT '明细条数',
`status` int DEFAULT NULL COMMENT '账单状态',
`audit_status` int DEFAULT NULL COMMENT '审核状态',
`submit_status` int DEFAULT NULL COMMENT '提交状态',
`payment_status` int DEFAULT NULL COMMENT '付款状态',
`auditor_id` bigint DEFAULT NULL COMMENT '审核人ID',
`audit_time` datetime DEFAULT NULL COMMENT '审核时间',
`audit_remark` varchar(500) DEFAULT NULL COMMENT '审核备注',
`submit_time` datetime DEFAULT NULL COMMENT '提交时间',
`generate_time` datetime DEFAULT NULL COMMENT '生成时间',
`yos_bill_code` varchar(64) DEFAULT NULL COMMENT 'YOS账单编号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能源账单';
-- 4. energy_bill_adjustment (账单调整)
DROP TABLE IF EXISTS `energy_bill_adjustment`;
CREATE TABLE `energy_bill_adjustment` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`bill_id` bigint DEFAULT NULL COMMENT '账单ID',
`detail_id` bigint DEFAULT NULL COMMENT '明细ID',
`adjustment_type` int DEFAULT NULL COMMENT '调整类型',
`amount` decimal(18,2) DEFAULT NULL COMMENT '调整金额',
`reason` varchar(500) DEFAULT NULL COMMENT '调整原因',
`attachment_urls` varchar(2000) DEFAULT NULL COMMENT '附件URLs',
`operator_id` bigint DEFAULT NULL COMMENT '操作人ID',
`operate_time` datetime DEFAULT NULL COMMENT '操作时间',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账单调整';
-- 5. energy_station_config (站点配置)
DROP TABLE IF EXISTS `energy_station_config`;
CREATE TABLE `energy_station_config` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`station_id` bigint DEFAULT NULL COMMENT '站点ID',
`auto_deduct` bit(1) DEFAULT NULL COMMENT '是否自动扣费',
`cooperation_type` int DEFAULT NULL COMMENT '合作类型',
`auto_match` bit(1) DEFAULT NULL COMMENT '自动匹配开关',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='站点配置';
-- 6. energy_station_price (站点价格)
DROP TABLE IF EXISTS `energy_station_price`;
CREATE TABLE `energy_station_price` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`station_id` bigint DEFAULT NULL COMMENT '站点ID',
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`cost_price` decimal(18,2) DEFAULT NULL COMMENT '成本价',
`customer_price` decimal(18,2) DEFAULT NULL COMMENT '客户价',
`effective_date` date DEFAULT NULL COMMENT '生效日期',
`expiry_date` date DEFAULT NULL COMMENT '失效日期',
`status` int DEFAULT NULL COMMENT '状态',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='站点价格';
-- 7. energy_account (能源账户)
DROP TABLE IF EXISTS `energy_account`;
CREATE TABLE `energy_account` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`customer_id` bigint DEFAULT NULL COMMENT '客户ID',
`balance` decimal(18,2) DEFAULT NULL COMMENT '余额',
`init_balance` decimal(18,2) DEFAULT NULL COMMENT '初始余额',
`accumulated_recharge` decimal(18,2) DEFAULT NULL COMMENT '累计充值金额',
`accumulated_hydrogen` decimal(18,2) DEFAULT NULL COMMENT '累计加氢金额',
`accumulated_electric` decimal(18,2) DEFAULT NULL COMMENT '累计充电金额',
`accumulated_consume` decimal(18,2) DEFAULT NULL COMMENT '累计消费金额',
`reminder_threshold` decimal(18,2) DEFAULT NULL COMMENT '余额预警阈值',
`account_status` int DEFAULT NULL COMMENT '账户状态',
`last_recharge_date` date DEFAULT NULL COMMENT '最后充值日期',
`version` int DEFAULT 0 COMMENT '乐观锁版本号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='能源账户';
-- 8. energy_project_account (项目账户)
DROP TABLE IF EXISTS `energy_project_account`;
CREATE TABLE `energy_project_account` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`account_id` bigint DEFAULT NULL COMMENT '账户ID',
`contract_id` bigint DEFAULT NULL COMMENT '合同ID',
`project_name` varchar(255) DEFAULT NULL COMMENT '项目名称',
`project_balance` decimal(18,2) DEFAULT NULL COMMENT '项目余额',
`project_remit_amount` decimal(18,2) DEFAULT NULL COMMENT '项目汇款总额',
`project_hydrogen_amount` decimal(18,2) DEFAULT NULL COMMENT '项目加氢金额',
`project_electric_amount` decimal(18,2) DEFAULT NULL COMMENT '项目充电金额',
`project_consume_amount` decimal(18,2) DEFAULT NULL COMMENT '项目消费总额',
`reminder_threshold` decimal(18,2) DEFAULT NULL COMMENT '余额预警阈值',
`account_status` int DEFAULT NULL COMMENT '账户状态',
`version` int DEFAULT 0 COMMENT '乐观锁版本号',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='项目账户';
-- 9. energy_account_flow (账户流水)
DROP TABLE IF EXISTS `energy_account_flow`;
CREATE TABLE `energy_account_flow` (
`id` bigint NOT NULL AUTO_INCREMENT,
`tenant_id` bigint NOT NULL DEFAULT 1 COMMENT ,
`account_id` bigint DEFAULT NULL COMMENT '账户ID',
`project_account_id` bigint DEFAULT NULL COMMENT '项目账户ID',
`flow_type` int DEFAULT NULL COMMENT '流水类型',
`amount` decimal(18,2) DEFAULT NULL COMMENT '金额',
`balance_before` decimal(18,2) DEFAULT NULL COMMENT '变更前余额',
`balance_after` decimal(18,2) DEFAULT NULL COMMENT '变更后余额',
`project_balance_before` decimal(18,2) DEFAULT NULL COMMENT '变更前项目余额',
`project_balance_after` decimal(18,2) DEFAULT NULL COMMENT '变更后项目余额',
`biz_type` int DEFAULT NULL COMMENT '业务类型',
`biz_id` bigint DEFAULT NULL COMMENT '业务ID',
`biz_code` varchar(64) DEFAULT NULL COMMENT '业务编号',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`operator_id` bigint DEFAULT NULL COMMENT '操作人ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='账户流水';

197
sql/rebuild/mock_data.sql Normal file
View File

@@ -0,0 +1,197 @@
-- ============================================================
-- Mock Data for Asset & Energy Modules
-- Part 1: Asset data → oneos_asset
-- Part 2: Energy data → oneos_energy
-- Generated: 2026-03-16
-- ============================================================
-- ===================== PART 1: ASSET =====================
-- ---------- 停车场 ----------
INSERT INTO `asset_parking` (`id`, `name`, `capacity`, `manager_name`, `manager_phone`, `contact_name`, `contact_phone`, `parked_amount`, `province`, `city`, `address`, `longitude`, `latitude`, `lease_start_date`, `lease_end_date`, `rent_fee`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, '上海嘉定氢能停车场', 200, '张伟', '13800001001', '李敏', '13800001002', 45, '上海', '上海市', '嘉定区安亭镇曹安公路5555号', '121.1856', '31.3856', '2025-01-01', '2027-12-31', 50000.00, 'admin', NOW(), 'admin', NOW(), 0),
(2, '上海临港停车场', 150, '王强', '13800002001', '赵丽', '13800002002', 30, '上海', '上海市', '浦东新区临港大道888号', '121.9300', '30.8900', '2025-03-01', '2027-02-28', 40000.00, 'admin', NOW(), 'admin', NOW(), 0),
(3, '佛山南海停车场', 100, '陈刚', '13800003001', '周红', '13800003002', 20, '广东', '佛山市', '南海区桂城街道海五路28号', '113.1500', '23.0200', '2025-06-01', '2027-05-31', 30000.00, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 车型参数 ----------
INSERT INTO `asset_vehicle_model` (`id`, `brand`, `model`, `vehicle_type`, `model_label`, `fuel_type`, `plate_color`, `hydrogen_capacity`, `hydrogen_factory`, `hydrogen_unit`, `hydrogen_mileage`, `battery_type`, `battery_factory`, `reserve_electricity`, `electricity_mileage`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, '飞驰', 'FCEV-C1', '冷藏车', '18吨氢能冷藏车', '氢燃料', '黄色', 30, '国鸿氢能', 'kg', 350, '磷酸铁锂', '宁德时代', 100.00, 200, 'admin', NOW(), 'admin', NOW(), 0),
(2, '东风', 'EQ5180', '厢式货车', '18吨氢能厢式货车', '氢燃料', '黄色', 25, '亿华通', 'kg', 300, '磷酸铁锂', '比亚迪', 80.00, 150, 'admin', NOW(), 'admin', NOW(), 0),
(3, '福田', 'BJ5120', '冷藏车', '12吨氢能冷藏车', '氢燃料', '黄色', 20, '国鸿氢能', 'kg', 280, '三元锂', '国轩高科', 60.00, 120, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 车型保养项目 ----------
INSERT INTO `asset_vehicle_model_maintain_item` (`id`, `vehicle_model_id`, `maintain_item`, `kilometer_cycle`, `time_cycle`, `hour_fee`, `material_fee`, `total_fee`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, '燃料电池系统检查', 10000, 3, 200.00, 500.00, 700.00, 'admin', NOW(), 'admin', NOW(), 0),
(2, 1, '储氢瓶检测', 20000, 6, 300.00, 0.00, 300.00, 'admin', NOW(), 'admin', NOW(), 0),
(3, 2, '燃料电池系统检查', 10000, 3, 200.00, 500.00, 700.00, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 客户 ----------
INSERT INTO `asset_customer` (`id`, `customer_code`, `coop_status`, `customer_name`, `province`, `city`, `address`, `region`, `contact`, `contact_mobile`, `email`, `credit_code_or_id`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 'CUS-2025-001', '合作中', '上海鲜生冷链物流有限公司', '上海', '上海市', '浦东新区张江路100号', '华东', '刘总', '13900001001', 'liu@xiansheng.com', '91310000MA1FY3XY23', '大客户', 'admin', NOW(), 'admin', NOW(), 0),
(2, 'CUS-2025-002', '合作中', '广州顺达运输有限公司', '广东', '广州市', '天河区天河路200号', '华南', '黄经理', '13900002001', 'huang@shunda.com', '91440100MA5CXKQR0L', NULL, 'admin', NOW(), 'admin', NOW(), 0),
(3, 'CUS-2025-003', '合作中', '深圳绿能科技有限公司', '广东', '深圳市', '南山区科技园南路50号', '华南', '郑总', '13900003001', 'zheng@lvneng.com', '91440300MA5FKP4Y28', '氢能源客户', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 客户商务经理 ----------
INSERT INTO `asset_customer_business_manager` (`id`, `customer_id`, `business_manager_name`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, '张三', 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, '李四', 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, '王五', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 供应商 ----------
INSERT INTO `asset_supplier` (`id`, `supplier_code`, `coop_status`, `supplier_name`, `type`, `province`, `city`, `address`, `contact`, `contact_mobile`, `credit_code_or_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 'SUP-2025-001', '合作中', '飞驰科技有限公司', '车辆供应商', '广东', '佛山市', '南海区狮山镇科技路1号', '孙总', '13800010001', '91440600MA4W9F1M0K', 'admin', NOW(), 'admin', NOW(), 0),
(2, 'SUP-2025-002', '合作中', '国鸿氢能科技有限公司', '配件供应商', '广东', '云浮市', '云城区工业园8号', '钱经理', '13800010002', '91445300MA4WFPQY0T', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 车辆基础信息 (8辆) ----------
INSERT INTO `asset_vehicle_base` (`id`, `vin`, `plate_no`, `vehicle_no`, `vehicle_model_id`, `region_province`, `region_city`, `engine_no`, `register_date`, `purchase_date`, `purchase_price`, `color`, `year`, `mileage`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 'LFCEV001202500001', '沪A12345', 'VH-2025-001', 1, '上海', '上海市', 'ENG001', '2025-01-15', '2025-01-10', 680000.00, '白色', '2025', 12000, 'admin', NOW(), 'admin', NOW(), 0),
(2, 'LFCEV001202500002', '沪A12346', 'VH-2025-002', 1, '上海', '上海市', 'ENG002', '2025-01-20', '2025-01-15', 680000.00, '白色', '2025', 15000, 'admin', NOW(), 'admin', NOW(), 0),
(3, 'LFCEV001202500003', '沪A12347', 'VH-2025-003', 2, '上海', '上海市', 'ENG003', '2025-02-10', '2025-02-05', 550000.00, '蓝色', '2025', 8000, 'admin', NOW(), 'admin', NOW(), 0),
(4, 'LFCEV001202500004', '粤B88001', 'VH-2025-004', 2, '广东', '广州市', 'ENG004', '2025-03-01', '2025-02-25', 550000.00, '白色', '2025', 20000, 'admin', NOW(), 'admin', NOW(), 0),
(5, 'LFCEV001202500005', '粤B88002', 'VH-2025-005', 3, '广东', '广州市', 'ENG005', '2025-03-15', '2025-03-10', 450000.00, '蓝色', '2025', 5000, 'admin', NOW(), 'admin', NOW(), 0),
(6, 'LFCEV001202500006', '粤B88003', 'VH-2025-006', 1, '广东', '深圳市', 'ENG006', '2025-04-01', '2025-03-25', 680000.00, '白色', '2025', 3000, 'admin', NOW(), 'admin', NOW(), 0),
(7, 'LFCEV001202500007', '沪A12348', 'VH-2025-007', 3, '上海', '上海市', 'ENG007', '2025-04-15', '2025-04-10', 450000.00, '白色', '2025', 1000, 'admin', NOW(), 'admin', NOW(), 0),
(8, 'LFCEV001202500008', '沪A12349', 'VH-2025-008', 2, '上海', '上海市', 'ENG008', '2025-05-01', '2025-04-25', 550000.00, '蓝色', '2025', 500, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 车辆位置信息 ----------
INSERT INTO `asset_vehicle_location` (`id`, `vehicle_id`, `parking_id`, `parking_name`, `parking_space`, `location`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, '上海嘉定氢能停车场', 'A-001', '已交车-客户运营中', 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, 1, '上海嘉定氢能停车场', 'A-002', '已交车-客户运营中', 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, 1, '上海嘉定氢能停车场', 'B-001', '已交车-客户运营中', 'admin', NOW(), 'admin', NOW(), 0),
(4, 4, 3, '佛山南海停车场', 'C-001', '已交车-客户运营中', 'admin', NOW(), 'admin', NOW(), 0),
(5, 5, 3, '佛山南海停车场', 'C-002', '已交车-客户运营中', 'admin', NOW(), 'admin', NOW(), 0),
(6, 6, 2, '上海临港停车场', 'D-001', '待交车', 'admin', NOW(), 'admin', NOW(), 0),
(7, 7, 1, '上海嘉定氢能停车场', 'A-003', '库存待分配', 'admin', NOW(), 'admin', NOW(), 0),
(8, 8, 2, '上海临港停车场', 'D-002', '库存待分配', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 车辆业务信息 ----------
INSERT INTO `asset_vehicle_business` (`id`, `vehicle_id`, `customer_id`, `contract_id`, `ownership`, `delivery_date`, `monthly_rent`, `deposit`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, 1, '公司自有', '2025-02-01', 15000.00, 30000.00, 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, 1, 1, '公司自有', '2025-02-01', 15000.00, 30000.00, 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, 1, 1, '公司自有', '2025-03-01', 12000.00, 25000.00, 'admin', NOW(), 'admin', NOW(), 0),
(4, 4, 2, 2, '公司自有', '2025-04-01', 12000.00, 25000.00, 'admin', NOW(), 'admin', NOW(), 0),
(5, 5, 2, 2, '公司自有', '2025-04-15', 10000.00, 20000.00, 'admin', NOW(), 'admin', NOW(), 0),
(6, 6, 3, 3, '公司自有', NULL, NULL, NULL, 'admin', NOW(), 'admin', NOW(), 0),
(7, 7, NULL, NULL, '公司自有', NULL, NULL, NULL, 'admin', NOW(), 'admin', NOW(), 0),
(8, 8, NULL, NULL, '公司自有', NULL, NULL, NULL, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 车辆状态信息 ----------
INSERT INTO `asset_vehicle_status` (`id`, `vehicle_id`, `status`, `operate_status`, `storage_status`, `is_prepared`, `is_delivered`, `is_returned`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, 1, 2, 1, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, 1, 1, 2, 1, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, 1, 1, 2, 1, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(4, 4, 1, 1, 2, 1, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(5, 5, 1, 1, 2, 1, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(6, 6, 1, 0, 1, 1, 0, 0, 'admin', NOW(), 'admin', NOW(), 0),
(7, 7, 0, 0, 1, 0, 0, 0, 'admin', NOW(), 'admin', NOW(), 0),
(8, 8, 0, 0, 1, 0, 0, 0, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 合同 ----------
INSERT INTO `asset_contract` (`id`, `contract_code`, `contract_type`, `project_name`, `start_date`, `end_date`, `payment_method`, `payment_cycle`, `signing_company`, `delivery_province`, `delivery_city`, `delivery_location`, `customer_id`, `customer_name`, `approval_status`, `contract_status`, `effective_time`, `hydrogen_bearer`, `hydrogen_payment_method`, `hydrogen_prepay`, `billing_method`, `main_vehicle_type`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 'HT-2025-001', 1, '上海鲜生冷链配送项目', '2025-02-01', '2027-01-31', '月付', '', '辽宁新能源汽车有限公司', '上海', '上海市', '嘉定区安亭镇', 1, '上海鲜生冷链物流有限公司', 2, 1, '2025-02-01 00:00:00', '客户', '预充值', 100000.00, '按月计费', '冷藏车', 'admin', NOW(), 'admin', NOW(), 0),
(2, 'HT-2025-002', 1, '广州顺达城配项目', '2025-04-01', '2027-03-31', '月付', '', '辽宁新能源汽车有限公司', '广东', '广州市', '天河区天河路', 2, '广州顺达运输有限公司', 2, 1, '2025-04-01 00:00:00', '公司', '月结算', NULL, '按月计费', '厢式货车', 'admin', NOW(), 'admin', NOW(), 0),
(3, 'HT-2025-003', 1, '深圳绿能示范项目', '2025-06-01', '2027-05-31', '月付', '', '辽宁新能源汽车有限公司', '广东', '深圳市', '南山区科技园', 3, '深圳绿能科技有限公司', 1, 0, NULL, '客户', '预充值', 50000.00, '按月计费', '冷藏车', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 合同车辆 ----------
INSERT INTO `asset_contract_vehicle` (`id`, `contract_id`, `vehicle_id`, `brand`, `model`, `plate_no`, `vin`, `month_rent`, `deposit`, `vehicle_status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, '飞驰', 'FCEV-C1', '沪A12345', 'LFCEV001202500001', 15000.00, 30000.00, 1, 'admin', NOW(), 'admin', NOW(), 0),
(2, 1, 2, '飞驰', 'FCEV-C1', '沪A12346', 'LFCEV001202500002', 15000.00, 30000.00, 1, 'admin', NOW(), 'admin', NOW(), 0),
(3, 1, 3, '东风', 'EQ5180', '沪A12347', 'LFCEV001202500003', 12000.00, 25000.00, 1, 'admin', NOW(), 'admin', NOW(), 0),
(4, 2, 4, '东风', 'EQ5180', '粤B88001', 'LFCEV001202500004', 12000.00, 25000.00, 1, 'admin', NOW(), 'admin', NOW(), 0),
(5, 2, 5, '福田', 'BJ5120', '粤B88002', 'LFCEV001202500005', 10000.00, 20000.00, 1, 'admin', NOW(), 'admin', NOW(), 0),
(6, 3, 6, '飞驰', 'FCEV-C1', '粤B88003', 'LFCEV001202500006', 15000.00, 30000.00, 0, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 合同授权人 ----------
INSERT INTO `asset_contract_authorized` (`id`, `contract_id`, `name`, `phone`, `id_card`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, '刘志强', '13900001001', '310101199001011234', 'admin', NOW(), 'admin', NOW(), 0),
(2, 1, '王小明', '13900001002', '310101199205051234', 'admin', NOW(), 'admin', NOW(), 0),
(3, 2, '黄大成', '13900002001', '440103199501011234', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 验车模板 ----------
INSERT INTO `asset_inspection_template` (`id`, `code`, `name`, `biz_type`, `vehicle_type`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 'TPL-DELIVERY-001', '交车验车模板-冷藏车', 1, '冷藏车', 1, 'admin', NOW(), 'admin', NOW(), 0),
(2, 'TPL-RETURN-001', '还车验车模板-通用', 2, NULL, 1, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 验车模板项 ----------
INSERT INTO `asset_inspection_template_item` (`id`, `template_id`, `category`, `item_name`, `item_code`, `input_type`, `sort`, `required`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, '外观检查', '车身外观', 'BODY_APPEARANCE', 'radio', 1, 1, 'admin', NOW(), 'admin', NOW(), 0),
(2, 1, '外观检查', '车灯', 'LIGHTS', 'radio', 2, 1, 'admin', NOW(), 'admin', NOW(), 0),
(3, 1, '功能检查', '制动系统', 'BRAKE', 'radio', 3, 1, 'admin', NOW(), 'admin', NOW(), 0),
(4, 1, '功能检查', '氢系统', 'HYDROGEN_SYSTEM', 'radio', 4, 1, 'admin', NOW(), 'admin', NOW(), 0),
(5, 1, '功能检查', '冷机系统', 'REFRIGERATOR', 'radio', 5, 1, 'admin', NOW(), 'admin', NOW(), 0);
-- ===================== PART 2: ENERGY =====================
-- NOTE: This section runs against oneos_energy database
-- ---------- 站点配置 (加氢站) ----------
INSERT INTO `energy_station_config` (`id`, `station_id`, `auto_deduct`, `cooperation_type`, `auto_match`, `remark`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1001, 1, 1, 1, '上海嘉定加氢站', 'admin', NOW(), 'admin', NOW(), 0),
(2, 1002, 1, 1, 1, '上海临港加氢站', 'admin', NOW(), 'admin', NOW(), 0),
(3, 1003, 0, 2, 1, '佛山南海加氢站', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 站点价格 ----------
INSERT INTO `energy_station_price` (`id`, `station_id`, `customer_id`, `cost_price`, `customer_price`, `effective_date`, `expiry_date`, `status`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1001, 1, 25.00, 35.00, '2025-01-01', '2027-12-31', 1, 'admin', NOW(), 'admin', NOW(), 0),
(2, 1001, 2, 25.00, 38.00, '2025-01-01', '2027-12-31', 1, 'admin', NOW(), 'admin', NOW(), 0),
(3, 1002, 1, 28.00, 38.00, '2025-01-01', '2027-12-31', 1, 'admin', NOW(), 'admin', NOW(), 0),
(4, 1003, 2, 26.00, 36.00, '2025-04-01', '2027-03-31', 1, 'admin', NOW(), 'admin', NOW(), 0),
(5, 1003, 3, 26.00, 35.00, '2025-06-01', '2027-05-31', 1, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 能源账户 ----------
INSERT INTO `energy_account` (`id`, `customer_id`, `balance`, `init_balance`, `accumulated_recharge`, `accumulated_hydrogen`, `accumulated_electric`, `accumulated_consume`, `reminder_threshold`, `account_status`, `last_recharge_date`, `version`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 52350.00, 0.00, 200000.00, 147650.00, 0.00, 147650.00, 10000.00, 1, '2026-02-15', 0, 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, 0.00, 0.00, 0.00, 85600.00, 0.00, 85600.00, 5000.00, 1, NULL, 0, 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, 35000.00, 0.00, 50000.00, 15000.00, 0.00, 15000.00, 5000.00, 1, '2026-01-10', 0, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 项目账户 ----------
INSERT INTO `energy_project_account` (`id`, `account_id`, `contract_id`, `project_name`, `project_balance`, `project_remit_amount`, `project_hydrogen_amount`, `project_electric_amount`, `project_consume_amount`, `reminder_threshold`, `account_status`, `version`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, '上海鲜生冷链配送项目', 52350.00, 200000.00, 147650.00, 0.00, 147650.00, 10000.00, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, 2, '广州顺达城配项目', 0.00, 0.00, 85600.00, 0.00, 85600.00, 5000.00, 1, 0, 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, 3, '深圳绿能示范项目', 35000.00, 50000.00, 15000.00, 0.00, 15000.00, 5000.00, 1, 0, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 加氢记录 ----------
INSERT INTO `energy_hydrogen_record` (`id`, `station_id`, `plate_number`, `hydrogen_date`, `hydrogen_quantity`, `unit_price`, `amount`, `mileage`, `source_type`, `match_status`, `vehicle_id`, `customer_id`, `upload_batch_no`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1001, '沪A12345', '2026-03-01', 8.50, 35.00, 297.50, 12500, 1, 1, 1, 1, 'BATCH-20260301-001', 'admin', NOW(), 'admin', NOW(), 0),
(2, 1001, '沪A12346', '2026-03-01', 10.20, 35.00, 357.00, 15800, 1, 1, 2, 1, 'BATCH-20260301-001', 'admin', NOW(), 'admin', NOW(), 0),
(3, 1001, '沪A12347', '2026-03-02', 7.80, 35.00, 273.00, 8500, 1, 1, 3, 1, 'BATCH-20260302-001', 'admin', NOW(), 'admin', NOW(), 0),
(4, 1003, '粤B88001', '2026-03-02', 9.00, 36.00, 324.00, 20800, 1, 1, 4, 2, 'BATCH-20260302-002', 'admin', NOW(), 'admin', NOW(), 0),
(5, 1003, '粤B88002', '2026-03-03', 6.50, 36.00, 234.00, 5500, 1, 1, 5, 2, 'BATCH-20260303-001', 'admin', NOW(), 'admin', NOW(), 0),
(6, 1001, '沪A12345', '2026-03-05', 9.20, 35.00, 322.00, 12900, 1, 1, 1, 1, 'BATCH-20260305-001', 'admin', NOW(), 'admin', NOW(), 0),
(7, 1001, '沪A12346', '2026-03-06', 11.00, 35.00, 385.00, 16300, 1, 1, 2, 1, 'BATCH-20260306-001', 'admin', NOW(), 'admin', NOW(), 0),
(8, 1002, '沪A12345', '2026-03-08', 8.00, 38.00, 304.00, 13400, 1, 1, 1, 1, 'BATCH-20260308-001', 'admin', NOW(), 'admin', NOW(), 0),
(9, 1003, '粤B88001', '2026-03-08', 10.50, 36.00, 378.00, 21500, 1, 1, 4, 2, 'BATCH-20260308-002', 'admin', NOW(), 'admin', NOW(), 0),
(10, 1001, '沪A12347', '2026-03-10', 8.30, 35.00, 290.50, 9200, 1, 1, 3, 1, 'BATCH-20260310-001', 'admin', NOW(), 'admin', NOW(), 0),
-- 未匹配记录
(11, 1001, '沪C99999', '2026-03-10', 5.00, 35.00, 175.00, NULL, 1, 0, NULL, NULL, 'BATCH-20260310-001', 'admin', NOW(), 'admin', NOW(), 0),
(12, 1002, '粤Z11111', '2026-03-11', 7.00, 38.00, 266.00, NULL, 2, 0, NULL, NULL, 'BATCH-20260311-001', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 加氢明细 ----------
INSERT INTO `energy_hydrogen_detail` (`id`, `record_id`, `station_id`, `vehicle_id`, `plate_number`, `hydrogen_date`, `hydrogen_quantity`, `cost_price`, `cost_amount`, `customer_price`, `customer_amount`, `contract_id`, `customer_id`, `project_name`, `cost_bearer`, `pay_method`, `audit_status`, `deduction_status`, `settlement_status`, `bill_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1001, 1, '沪A12345', '2026-03-01', 8.50, 25.00, 212.50, 35.00, 297.50, 1, 1, '上海鲜生冷链配送项目', 1, 1, 1, 1, 1, 1, 'admin', NOW(), 'admin', NOW(), 0),
(2, 2, 1001, 2, '沪A12346', '2026-03-01', 10.20, 25.00, 255.00, 35.00, 357.00, 1, 1, '上海鲜生冷链配送项目', 1, 1, 1, 1, 1, 1, 'admin', NOW(), 'admin', NOW(), 0),
(3, 3, 1001, 3, '沪A12347', '2026-03-02', 7.80, 25.00, 195.00, 35.00, 273.00, 1, 1, '上海鲜生冷链配送项目', 1, 1, 1, 1, 1, 1, 'admin', NOW(), 'admin', NOW(), 0),
(4, 4, 1003, 4, '粤B88001', '2026-03-02', 9.00, 26.00, 234.00, 36.00, 324.00, 2, 2, '广州顺达城配项目', 2, 2, 1, 0, 0, NULL, 'admin', NOW(), 'admin', NOW(), 0),
(5, 5, 1003, 5, '粤B88002', '2026-03-03', 6.50, 26.00, 169.00, 36.00, 234.00, 2, 2, '广州顺达城配项目', 2, 2, 1, 0, 0, NULL, 'admin', NOW(), 'admin', NOW(), 0),
(6, 6, 1001, 1, '沪A12345', '2026-03-05', 9.20, 25.00, 230.00, 35.00, 322.00, 1, 1, '上海鲜生冷链配送项目', 1, 1, 1, 1, 1, 1, 'admin', NOW(), 'admin', NOW(), 0),
(7, 7, 1001, 2, '沪A12346', '2026-03-06', 11.00, 25.00, 275.00, 35.00, 385.00, 1, 1, '上海鲜生冷链配送项目', 1, 1, 1, 1, 1, 1, 'admin', NOW(), 'admin', NOW(), 0),
(8, 8, 1002, 1, '沪A12345', '2026-03-08', 8.00, 28.00, 224.00, 38.00, 304.00, 1, 1, '上海鲜生冷链配送项目', 1, 1, 0, 0, 0, NULL, 'admin', NOW(), 'admin', NOW(), 0),
(9, 9, 1003, 4, '粤B88001', '2026-03-08', 10.50, 26.00, 273.00, 36.00, 378.00, 2, 2, '广州顺达城配项目', 2, 2, 0, 0, 0, NULL, 'admin', NOW(), 'admin', NOW(), 0),
(10, 10, 1001, 3, '沪A12347', '2026-03-10', 8.30, 25.00, 207.50, 35.00, 290.50, 1, 1, '上海鲜生冷链配送项目', 1, 1, 0, 0, 0, NULL, 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 能源账单 ----------
INSERT INTO `energy_bill` (`id`, `bill_code`, `energy_type`, `customer_id`, `customer_name`, `contract_id`, `station_id`, `station_name`, `cooperation_type`, `bill_period_start`, `bill_period_end`, `receivable_amount`, `actual_amount`, `adjustment_amount`, `paid_amount`, `total_quantity`, `detail_count`, `status`, `audit_status`, `submit_status`, `payment_status`, `generate_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 'BILL-2026-03-001', 1, 1, '上海鲜生冷链物流有限公司', 1, 1001, '上海嘉定加氢站', 1, '2026-03-01', '2026-03-15', 1634.50, 1634.50, 0.00, 1634.50, 46.70, 5, 3, 1, 1, 1, '2026-03-16 00:00:00', 'admin', NOW(), 'admin', NOW(), 0),
(2, 'BILL-2026-03-002', 1, 2, '广州顺达运输有限公司', 2, 1003, '佛山南海加氢站', 2, '2026-03-01', '2026-03-15', 936.00, NULL, 0.00, 0.00, 26.00, 3, 1, 0, 0, 0, '2026-03-16 00:00:00', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 账单调整 ----------
INSERT INTO `energy_bill_adjustment` (`id`, `bill_id`, `detail_id`, `adjustment_type`, `amount`, `reason`, `operator_id`, `operate_time`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, 1, -10.00, '加氢站计量偏差修正', 1, '2026-03-15 10:00:00', 'admin', NOW(), 'admin', NOW(), 0);
-- ---------- 账户流水 ----------
INSERT INTO `energy_account_flow` (`id`, `account_id`, `project_account_id`, `flow_type`, `amount`, `balance_before`, `balance_after`, `project_balance_before`, `project_balance_after`, `biz_type`, `biz_id`, `biz_code`, `remark`, `operator_id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`) VALUES
(1, 1, 1, 1, 100000.00, 0.00, 100000.00, 0.00, 100000.00, 1, NULL, NULL, '首次充值', 1, 'admin', '2025-02-01 10:00:00', 'admin', '2025-02-01 10:00:00', 0),
(2, 1, 1, 1, 100000.00, 100000.00, 200000.00, 100000.00, 200000.00, 1, NULL, NULL, '二次充值', 1, 'admin', '2026-02-15 10:00:00', 'admin', '2026-02-15 10:00:00', 0),
(3, 1, 1, 2, -297.50, 200000.00, 199702.50, 200000.00, 199702.50, 2, 1, 'BILL-2026-03-001', '加氢扣费-沪A12345', NULL, 'admin', '2026-03-01 18:00:00', 'admin', '2026-03-01 18:00:00', 0),
(4, 1, 1, 2, -357.00, 199702.50, 199345.50, 199702.50, 199345.50, 2, 1, 'BILL-2026-03-001', '加氢扣费-沪A12346', NULL, 'admin', '2026-03-01 18:05:00', 'admin', '2026-03-01 18:05:00', 0),
(5, 3, 3, 1, 50000.00, 0.00, 50000.00, 0.00, 50000.00, 1, NULL, NULL, '首次充值', 1, 'admin', '2026-01-10 10:00:00', 'admin', '2026-01-10 10:00:00', 0);

221
sql/rebuild/rebuild_all.py Normal file
View File

@@ -0,0 +1,221 @@
#!/usr/bin/env python3
"""
重建 Asset 和 Energy 模块数据表并插入 Mock 数据
- Asset 表 → oneos_asset 数据库
- Energy 表 → oneos_energy 数据库
- 使用 pymysql 连接远程 MySQL规避本地 mysql 客户端 auth plugin 问题)
"""
import os
import sys
import re
try:
import pymysql
except ImportError:
print("pymysql 未安装,正在安装...")
os.system(f"{sys.executable} -m pip install pymysql")
import pymysql
# 数据库连接配置
DB_CONFIG = {
"host": "47.103.115.36",
"port": 3306,
"user": "root",
"password": "Passw0rd2026",
"charset": "utf8mb4",
}
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
def read_sql_file(filename):
"""读取 SQL 文件内容"""
filepath = os.path.join(SCRIPT_DIR, filename)
with open(filepath, "r", encoding="utf-8") as f:
return f.read()
def split_statements(sql_text):
"""
将 SQL 文本拆分为独立语句。
处理 CREATE VIEW 等多行语句,跳过注释和空行。
"""
statements = []
current = []
for line in sql_text.split("\n"):
stripped = line.strip()
# 跳过纯注释行和空行(但保留语句中间的注释)
if not stripped or stripped.startswith("--"):
if current:
# 如果当前语句已经开始,保留注释行(可能是语句内的注释)
pass
continue
current.append(line)
if stripped.endswith(";"):
stmt = "\n".join(current).strip()
if stmt:
statements.append(stmt)
current = []
# 处理没有分号结尾的最后一条语句
if current:
stmt = "\n".join(current).strip()
if stmt:
statements.append(stmt)
return statements
def execute_sql(cursor, sql_text, label=""):
"""执行一段 SQL可包含多条语句"""
statements = split_statements(sql_text)
success = 0
errors = 0
for i, stmt in enumerate(statements, 1):
# 提取语句摘要用于日志
first_line = stmt.split("\n")[0][:80]
try:
cursor.execute(stmt)
success += 1
except pymysql.err.OperationalError as e:
code = e.args[0]
# 1051: Unknown table (DROP 不存在的表) - 忽略
if code == 1051:
success += 1
else:
errors += 1
print(f" ❌ [{label}] 语句 {i} 失败: {e}")
print(f" SQL: {first_line}...")
except Exception as e:
errors += 1
print(f" ❌ [{label}] 语句 {i} 失败: {e}")
print(f" SQL: {first_line}...")
return success, errors
def main():
print("=" * 60)
print("ONE-OS 数据表重建工具")
print("=" * 60)
# 读取 SQL 文件
print("\n📄 读取 SQL 文件...")
asset_ddl = read_sql_file("asset_ddl.sql")
energy_ddl = read_sql_file("energy_ddl.sql")
mock_data = read_sql_file("mock_data.sql")
# 拆分 mock_data 为 asset 和 energy 部分
parts = mock_data.split("-- ===================== PART 2: ENERGY =====================")
if len(parts) != 2:
print("❌ mock_data.sql 格式错误:找不到 PART 2 分隔符")
sys.exit(1)
asset_mock = parts[0]
energy_mock = parts[1]
# 从 asset_mock 中去掉文件头注释和 PART 1 标记
# 保留实际的 INSERT 语句
total_success = 0
total_errors = 0
# ========== 1. 处理 Asset 数据库 ==========
print("\n" + "=" * 60)
print("🔧 [1/3] 重建 oneos_asset 数据库表...")
print("=" * 60)
conn_asset = pymysql.connect(**DB_CONFIG, database="oneos_asset")
conn_asset.autocommit(True)
cursor_asset = conn_asset.cursor()
# 创建 Asset 表
print("\n📋 执行 Asset DDL29张表 + 1个视图...")
s, e = execute_sql(cursor_asset, asset_ddl, "Asset DDL")
total_success += s
total_errors += e
print(f" ✅ Asset DDL: {s} 成功, {e} 失败")
# 插入 Asset Mock 数据
print("\n📋 插入 Asset Mock 数据...")
s, e = execute_sql(cursor_asset, asset_mock, "Asset Mock")
total_success += s
total_errors += e
print(f" ✅ Asset Mock: {s} 成功, {e} 失败")
cursor_asset.close()
conn_asset.close()
# ========== 2. 处理 Energy 数据库 ==========
print("\n" + "=" * 60)
print("🔧 [2/3] 重建 oneos_energy 数据库表...")
print("=" * 60)
# 先确保 oneos_energy 数据库存在
conn_init = pymysql.connect(**DB_CONFIG)
conn_init.autocommit(True)
cursor_init = conn_init.cursor()
cursor_init.execute("CREATE DATABASE IF NOT EXISTS `oneos_energy` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci")
cursor_init.close()
conn_init.close()
conn_energy = pymysql.connect(**DB_CONFIG, database="oneos_energy")
conn_energy.autocommit(True)
cursor_energy = conn_energy.cursor()
# 创建 Energy 表
print("\n📋 执行 Energy DDL9张表...")
s, e = execute_sql(cursor_energy, energy_ddl, "Energy DDL")
total_success += s
total_errors += e
print(f" ✅ Energy DDL: {s} 成功, {e} 失败")
# 插入 Energy Mock 数据
print("\n📋 插入 Energy Mock 数据...")
s, e = execute_sql(cursor_energy, energy_mock, "Energy Mock")
total_success += s
total_errors += e
print(f" ✅ Energy Mock: {s} 成功, {e} 失败")
cursor_energy.close()
conn_energy.close()
# ========== 3. 验证 ==========
print("\n" + "=" * 60)
print("🔍 [3/3] 验证表结构和数据...")
print("=" * 60)
# 验证 Asset
conn_v = pymysql.connect(**DB_CONFIG, database="oneos_asset")
cursor_v = conn_v.cursor()
cursor_v.execute("SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'oneos_asset' AND TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME")
asset_tables = cursor_v.fetchall()
print(f"\n📊 oneos_asset 数据库: {len(asset_tables)} 张表")
for table_name, row_count in asset_tables:
cursor_v.execute(f"SELECT COUNT(*) FROM `{table_name}`")
actual_count = cursor_v.fetchone()[0]
print(f" {table_name}: {actual_count}")
cursor_v.close()
conn_v.close()
# 验证 Energy
conn_v2 = pymysql.connect(**DB_CONFIG, database="oneos_energy")
cursor_v2 = conn_v2.cursor()
cursor_v2.execute("SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'oneos_energy' AND TABLE_TYPE = 'BASE TABLE' ORDER BY TABLE_NAME")
energy_tables = cursor_v2.fetchall()
print(f"\n📊 oneos_energy 数据库: {len(energy_tables)} 张表")
for table_name, row_count in energy_tables:
cursor_v2.execute(f"SELECT COUNT(*) FROM `{table_name}`")
actual_count = cursor_v2.fetchone()[0]
print(f" {table_name}: {actual_count}")
cursor_v2.close()
conn_v2.close()
# ========== 总结 ==========
print("\n" + "=" * 60)
print(f"🎉 完成! 总计: {total_success} 成功, {total_errors} 失败")
print("=" * 60)
if total_errors > 0:
sys.exit(1)
if __name__ == "__main__":
main()

View File

@@ -0,0 +1,8 @@
-- 合同表新增6个字段
ALTER TABLE asset_contract
ADD COLUMN hydrogen_bearer VARCHAR(20) COMMENT '氢费承担方',
ADD COLUMN hydrogen_payment_method VARCHAR(20) COMMENT '氢气付款方式',
ADD COLUMN hydrogen_prepay DECIMAL(12,2) COMMENT '氢气预付款',
ADD COLUMN hydrogen_return_price DECIMAL(12,2) COMMENT '退还车氢气单价',
ADD COLUMN billing_method VARCHAR(50) COMMENT '账单计算方式',
ADD COLUMN main_vehicle_type VARCHAR(50) COMMENT '主车型';

View File

@@ -0,0 +1,88 @@
-- =============================================
-- 验车模板与验车记录表
-- 创建时间: 2026-03-13
-- =============================================
-- 验车模板
CREATE TABLE IF NOT EXISTS `asset_inspection_template` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`code` varchar(50) NOT NULL COMMENT '模板编码',
`name` varchar(100) NOT NULL COMMENT '模板名称',
`biz_type` tinyint NOT NULL COMMENT '业务类型1=备车 2=交车 3=还车)',
`vehicle_type` varchar(50) DEFAULT NULL COMMENT '车辆类型',
`status` tinyint DEFAULT 1 COMMENT '状态0=禁用 1=启用)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车模板';
-- 验车模板检查项
CREATE TABLE IF NOT EXISTS `asset_inspection_template_item` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`template_id` bigint NOT NULL COMMENT '模板ID',
`category` varchar(50) NOT NULL COMMENT '分类',
`item_name` varchar(100) NOT NULL COMMENT '检查项名称',
`item_code` varchar(50) NOT NULL COMMENT '检查项编码',
`input_type` varchar(20) DEFAULT 'checkbox' COMMENT '输入类型',
`sort` int DEFAULT 0 COMMENT '排序',
`required` tinyint DEFAULT 1 COMMENT '是否必填0=否 1=是)',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_template_id` (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车模板检查项';
-- 验车记录
CREATE TABLE IF NOT EXISTS `asset_inspection_record` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`record_code` varchar(50) NOT NULL COMMENT '记录编码',
`template_id` bigint NOT NULL COMMENT '模板ID',
`source_type` tinyint NOT NULL COMMENT '来源类型1=备车 2=交车 3=还车)',
`source_id` bigint NOT NULL COMMENT '来源ID',
`vehicle_id` bigint NOT NULL COMMENT '车辆ID',
`inspector_name` varchar(50) DEFAULT NULL COMMENT '检查人',
`inspection_time` datetime DEFAULT NULL COMMENT '检查时间',
`status` tinyint DEFAULT 0 COMMENT '状态0=待检 1=检查中 2=已完成)',
`overall_result` tinyint DEFAULT NULL COMMENT '总体结果1=通过 2=不通过 3=不适用)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`cloned_from_id` bigint DEFAULT NULL COMMENT '克隆来源记录ID',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_vehicle_source` (`vehicle_id`, `source_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车记录';
-- 验车记录检查项
CREATE TABLE IF NOT EXISTS `asset_inspection_record_item` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`record_id` bigint NOT NULL COMMENT '记录ID',
`item_code` varchar(50) NOT NULL COMMENT '检查项编码',
`category` varchar(50) NOT NULL COMMENT '分类',
`item_name` varchar(100) NOT NULL COMMENT '检查项名称',
`input_type` varchar(20) DEFAULT 'checkbox' COMMENT '输入类型',
`result` tinyint DEFAULT NULL COMMENT '检查结果1=通过 2=不通过 3=不适用)',
`value` varchar(200) DEFAULT NULL COMMENT '检查值',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`image_urls` varchar(2000) DEFAULT NULL COMMENT '图片URL列表',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_record_id` (`record_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='验车记录检查项';

View File

@@ -0,0 +1,67 @@
-- 合同管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'合同管理', '', 2, 5, 5055,
'contract', 'documentation', 'asset/contract/index', 0, 'Contract'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 合同管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('合同查询', 'asset:contract:query', 3, 1, @menuId, '', '', '', 0),
('合同创建', 'asset:contract:create', 3, 2, @menuId, '', '', '', 0),
('合同更新', 'asset:contract:update', 3, 3, @menuId, '', '', '', 0),
('合同删除', 'asset:contract:delete', 3, 4, @menuId, '', '', '', 0),
('合同导出', 'asset:contract:export', 3, 5, @menuId, '', '', '', 0),
('提交审批', 'asset:contract:submit-approval', 3, 6, @menuId, '', '', '', 0),
('撤回审批', 'asset:contract:withdraw-approval', 3, 7, @menuId, '', '', '', 0),
('终止合同', 'asset:contract:terminate', 3, 8, @menuId, '', '', '', 0),
('续签合同', 'asset:contract:renew', 3, 9, @menuId, '', '', '', 0);
-- 2. 字典类型
INSERT INTO system_dict_type (name, type, status, remark, creator, create_time, updater, update_time, deleted)
VALUES
('合同类型', 'asset_contract_type', 0, '车辆租赁合同类型', 'admin', NOW(), 'admin', NOW(), b'0'),
('合同审批状态', 'asset_contract_approval_status', 0, '合同审批状态', 'admin', NOW(), 'admin', NOW(), b'0'),
('合同状态', 'asset_contract_status', 0, '合同业务状态', 'admin', NOW(), 'admin', NOW(), b'0'),
('车辆订单状态', 'asset_contract_vehicle_status', 0, '合同车辆订单状态', 'admin', NOW(), 'admin', NOW(), b'0');
-- 3. 字典数据 - 合同类型
INSERT INTO system_dict_data (dict_type, label, value, sort, status, remark, creator, create_time, updater, update_time, deleted)
VALUES
('asset_contract_type', '试用合同', '1', 1, 0, '试用期合同', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_type', '正式合同', '2', 2, 0, '正式租赁合同', 'admin', NOW(), 'admin', NOW(), b'0');
-- 4. 字典数据 - 合同审批状态
INSERT INTO system_dict_data (dict_type, label, value, sort, status, color_type, remark, creator, create_time, updater, update_time, deleted)
VALUES
('asset_contract_approval_status', '草稿', '0', 1, 0, 'info', '草稿状态', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_approval_status', '审批中', '1', 2, 0, 'warning', '审批中', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_approval_status', '审批通过', '2', 3, 0, 'success', '审批通过', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_approval_status', '审批拒绝', '3', 4, 0, 'danger', '审批拒绝', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_approval_status', '已撤回', '4', 5, 0, 'info', '已撤回', 'admin', NOW(), 'admin', NOW(), b'0');
-- 5. 字典数据 - 合同状态
INSERT INTO system_dict_data (dict_type, label, value, sort, status, color_type, remark, creator, create_time, updater, update_time, deleted)
VALUES
('asset_contract_status', '草稿', '0', 1, 0, 'info', '草稿状态', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_status', '待生效', '1', 2, 0, 'warning', '待生效', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_status', '进行中', '2', 3, 0, 'success', '进行中', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_status', '已到期', '3', 4, 0, 'info', '已到期', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_status', '已终止', '4', 5, 0, 'danger', '已终止', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_status', '已续签', '5', 6, 0, 'primary', '已续签', 'admin', NOW(), 'admin', NOW(), b'0');
-- 6. 字典数据 - 车辆订单状态
INSERT INTO system_dict_data (dict_type, label, value, sort, status, color_type, remark, creator, create_time, updater, update_time, deleted)
VALUES
('asset_contract_vehicle_status', '待交车', '0', 1, 0, 'warning', '待交车', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_vehicle_status', '已交车', '1', 2, 0, 'success', '已交车', 'admin', NOW(), 'admin', NOW(), b'0'),
('asset_contract_vehicle_status', '已退车', '2', 3, 0, 'info', '已退车', 'admin', NOW(), 'admin', NOW(), b'0');

View File

@@ -0,0 +1,74 @@
-- 合同管理补充表(合同被授权人、变更历史、附件、车辆服务项目)
-- 3. 合同被授权人表
CREATE TABLE IF NOT EXISTS `asset_contract_authorized` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`name` VARCHAR(100) NOT NULL COMMENT '姓名',
`phone` VARCHAR(20) COMMENT '电话',
`id_card` VARCHAR(30) COMMENT '身份证号',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_contract_id` (`contract_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同被授权人表';
-- 4. 合同变更历史表
CREATE TABLE IF NOT EXISTS `asset_contract_change_history` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`change_type` VARCHAR(50) NOT NULL COMMENT '变更类型',
`change_content` TEXT COMMENT '变更内容',
`operator` VARCHAR(64) COMMENT '操作人',
`operate_time` DATETIME COMMENT '操作时间',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_contract_id` (`contract_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同变更历史表';
-- 5. 合同附件表
CREATE TABLE IF NOT EXISTS `asset_contract_attachment` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`attachment_type` INT COMMENT '附件类型1=合同原件 2=盖章合同)',
`file_id` BIGINT COMMENT '文件ID',
`file_name` VARCHAR(255) COMMENT '文件名称',
`file_url` VARCHAR(500) COMMENT '文件URL',
`file_size` BIGINT COMMENT '文件大小(字节)',
`upload_time` DATETIME COMMENT '上传时间',
`uploader` VARCHAR(64) COMMENT '上传人',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_contract_id` (`contract_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同附件表';
-- 6. 合同车辆服务项目表
CREATE TABLE IF NOT EXISTS `asset_contract_vehicle_service` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contract_vehicle_id` BIGINT NOT NULL COMMENT '合同车辆ID',
`service_name` VARCHAR(200) NOT NULL COMMENT '服务项目名称',
`service_fee` DECIMAL(10,2) COMMENT '服务费用(元)',
`effective_date` DATE COMMENT '生效日期',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_contract_vehicle_id` (`contract_vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同车辆服务项目表';

View File

@@ -0,0 +1,73 @@
-- 合同管理表结构
-- 1. 车辆租赁合同表
CREATE TABLE IF NOT EXISTS `asset_contract` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contract_code` VARCHAR(50) NOT NULL COMMENT '合同编码',
`contract_type` TINYINT NOT NULL COMMENT '合同类型1=试用 2=正式)',
`project_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
`start_date` DATE NOT NULL COMMENT '生效日期',
`end_date` DATE NOT NULL COMMENT '结束日期',
`payment_method` VARCHAR(100) NOT NULL COMMENT '付款方式',
`payment_cycle` VARCHAR(100) NOT NULL COMMENT '付款周期',
`signing_company` VARCHAR(200) NOT NULL COMMENT '签约公司(乙方)',
`delivery_province` VARCHAR(50) NOT NULL COMMENT '交车省份',
`delivery_city` VARCHAR(50) NOT NULL COMMENT '交车城市',
`delivery_location` VARCHAR(255) NOT NULL COMMENT '交车地点',
`remark` VARCHAR(500) COMMENT '备注',
`customer_id` BIGINT NOT NULL COMMENT '客户ID',
`customer_name` VARCHAR(100) COMMENT '客户名称(冗余)',
`third_party_enabled` BIT(1) DEFAULT b'0' COMMENT '是否三方合同',
`third_party_customer_id` BIGINT COMMENT '丙方客户ID',
`third_party_name` VARCHAR(100) COMMENT '丙方名称',
`business_dept_id` BIGINT COMMENT '业务部门ID',
`business_manager_id` BIGINT COMMENT '业务负责人ID',
`approval_status` TINYINT NOT NULL DEFAULT 0 COMMENT '审批状态0=草稿 1=审批中 2=审批通过 3=审批拒绝 4=已撤回)',
`bpm_instance_id` VARCHAR(64) COMMENT 'BPM流程实例ID',
`contract_status` TINYINT NOT NULL DEFAULT 0 COMMENT '合同状态0=草稿 1=待生效 2=进行中 3=已到期 4=已终止 5=已续签)',
`effective_time` DATETIME COMMENT '实际生效时间',
`terminate_time` DATETIME COMMENT '终止时间',
`terminate_reason` VARCHAR(500) COMMENT '终止原因',
`renewed_contract_id` BIGINT COMMENT '续签后的新合同ID',
`original_contract_id` BIGINT COMMENT '原合同ID如果是续签合同',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_contract_code` (`contract_code`, `deleted`),
KEY `idx_customer_id` (`customer_id`),
KEY `idx_approval_status` (`approval_status`),
KEY `idx_contract_status` (`contract_status`),
KEY `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='车辆租赁合同表';
-- 2. 合同车辆租赁订单表
CREATE TABLE IF NOT EXISTS `asset_contract_vehicle` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`vehicle_id` BIGINT COMMENT '车辆ID关联 asset_vehicle_base',
`brand` VARCHAR(50) NOT NULL COMMENT '品牌',
`model` VARCHAR(100) NOT NULL COMMENT '型号',
`plate_no` VARCHAR(20) COMMENT '车牌号',
`vin` VARCHAR(50) COMMENT 'VIN码',
`month_rent` DECIMAL(10,2) NOT NULL COMMENT '月租金(元)',
`deposit` DECIMAL(10,2) NOT NULL COMMENT '保证金(元)',
`vehicle_status` TINYINT NOT NULL DEFAULT 0 COMMENT '车辆状态0=待交车 1=已交车 2=已退车)',
`actual_delivery_time` DATETIME COMMENT '实际交车时间',
`delivery_person` VARCHAR(50) COMMENT '交车人',
`remark` VARCHAR(500) COMMENT '备注',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
KEY `idx_contract_id` (`contract_id`),
KEY `idx_vehicle_id` (`vehicle_id`),
KEY `idx_plate_no` (`plate_no`),
KEY `idx_vin` (`vin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='合同车辆租赁订单表';

View File

@@ -0,0 +1,27 @@
-- 合同管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'合同管理', '', 2, 6, 5055,
'contract', 'file-text', 'asset/contract/index', 0, 'Contract'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 合同管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('合同查询', 'asset:contract:query', 3, 1, @menuId, '', '', '', 0),
('合同创建', 'asset:contract:create', 3, 2, @menuId, '', '', '', 0),
('合同更新', 'asset:contract:update', 3, 3, @menuId, '', '', '', 0),
('合同删除', 'asset:contract:delete', 3, 4, @menuId, '', '', '', 0),
('合同导出', 'asset:contract:export', 3, 5, @menuId, '', '', '', 0),
('提交审批', 'asset:contract:submit-approval', 3, 6, @menuId, '', '', '', 0),
('撤回审批', 'asset:contract:withdraw-approval', 3, 7, @menuId, '', '', '', 0),
('终止合同', 'asset:contract:terminate', 3, 8, @menuId, '', '', '', 0),
('续签合同', 'asset:contract:renew', 3, 9, @menuId, '', '', '', 0);

View File

@@ -0,0 +1,23 @@
-- 客户管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'客户管理', '', 2, 2, 5055,
'customer', 'user', 'asset/customer/index', 0, 'Customer'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 客户管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('客户查询', 'asset:customer:query', 3, 1, @menuId, '', '', '', 0),
('客户创建', 'asset:customer:create', 3, 2, @menuId, '', '', '', 0),
('客户更新', 'asset:customer:update', 3, 3, @menuId, '', '', '', 0),
('客户删除', 'asset:customer:delete', 3, 4, @menuId, '', '', '', 0),
('客户导出', 'asset:customer:export', 3, 5, @menuId, '', '', '', 0);

View File

@@ -0,0 +1,44 @@
-- ==================== 客户信息表重建脚本 ====================
-- 说明:原表列名与 Java DO 不匹配,重建以对齐
-- 日期2026-03-13
-- 注意:如果 asset_customer 已有数据,请先备份!
-- 1. 备份旧表(如果存在)
-- CREATE TABLE asset_customer_bak AS SELECT * FROM asset_customer;
-- 2. 删除旧表
DROP TABLE IF EXISTS asset_customer;
-- 3. 创建新表(与 CustomerDO 字段完全对齐)
CREATE TABLE `asset_customer` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`customer_code` varchar(50) DEFAULT NULL COMMENT '客户编号',
`coop_status` varchar(20) DEFAULT NULL COMMENT '合作状态',
`customer_name` varchar(100) NOT NULL COMMENT '客户名称',
`province` varchar(50) DEFAULT NULL COMMENT '省份',
`city` varchar(50) DEFAULT NULL COMMENT '城市',
`address` varchar(255) DEFAULT NULL COMMENT '地址',
`region` varchar(20) DEFAULT NULL COMMENT '区域',
`contact` varchar(50) DEFAULT NULL COMMENT '联系人',
`contact_mobile` varchar(20) DEFAULT NULL COMMENT '联系人手机',
`contact_phone` varchar(20) DEFAULT NULL COMMENT '联系人座机',
`email` varchar(100) DEFAULT NULL COMMENT '电子邮箱',
`credit_code_or_id` varchar(50) DEFAULT NULL COMMENT '统一社会信用代码/身份证',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`tax_id` varchar(50) DEFAULT NULL COMMENT '纳税人识别号',
`invoice_address` varchar(255) DEFAULT NULL COMMENT '发票地址',
`invoice_phone` varchar(20) DEFAULT NULL COMMENT '发票电话',
`account` varchar(50) DEFAULT NULL COMMENT '银行账号',
`opening_bank` varchar(100) DEFAULT NULL COMMENT '开户行',
`mailing_address` varchar(255) DEFAULT NULL COMMENT '邮寄地址',
`creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除0=未删除 1=已删除)',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_customer_code` (`customer_code`) USING BTREE COMMENT '客户编号查询',
KEY `idx_customer_name` (`customer_name`) USING BTREE COMMENT '客户名称查询',
KEY `idx_tenant_deleted` (`tenant_id`, `deleted`) USING BTREE COMMENT '租户隔离 + 逻辑删除'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='客户信息表';

View File

@@ -0,0 +1,23 @@
-- 停车场管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'停车场管理', '', 2, 1, 5055,
'parking', 'car', 'asset/parking/index', 0, 'Parking'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 停车场管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('停车场查询', 'asset:parking:query', 3, 1, @menuId, '', '', '', 0),
('停车场创建', 'asset:parking:create', 3, 2, @menuId, '', '', '', 0),
('停车场更新', 'asset:parking:update', 3, 3, @menuId, '', '', '', 0),
('停车场删除', 'asset:parking:delete', 3, 4, @menuId, '', '', '', 0),
('停车场导出', 'asset:parking:export', 3, 5, @menuId, '', '', '', 0);

View File

@@ -0,0 +1,23 @@
-- 供应商管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'供应商管理', '', 2, 3, 5055,
'supplier', 'user', 'asset/supplier/index', 0, 'Supplier'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 供应商管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('供应商查询', 'asset:supplier:query', 3, 1, @menuId, '', '', '', 0),
('供应商创建', 'asset:supplier:create', 3, 2, @menuId, '', '', '', 0),
('供应商更新', 'asset:supplier:update', 3, 3, @menuId, '', '', '', 0),
('供应商删除', 'asset:supplier:delete', 3, 4, @menuId, '', '', '', 0),
('供应商导出', 'asset:supplier:export', 3, 5, @menuId, '', '', '', 0);

View File

@@ -0,0 +1,23 @@
-- 车型参数管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'车型参数', '', 2, 4, 5055,
'vehicle-model', 'car', 'asset/vehicle-model/index', 0, 'VehicleModel'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 车型参数管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('车型参数查询', 'asset:vehicle-model:query', 3, 1, @menuId, '', '', '', 0),
('车型参数创建', 'asset:vehicle-model:create', 3, 2, @menuId, '', '', '', 0),
('车型参数更新', 'asset:vehicle-model:update', 3, 3, @menuId, '', '', '', 0),
('车型参数删除', 'asset:vehicle-model:delete', 3, 4, @menuId, '', '', '', 0),
('车型参数导出', 'asset:vehicle-model:export', 3, 5, @menuId, '', '', '', 0);

View File

@@ -0,0 +1,25 @@
-- 车辆上牌管理菜单和权限初始化脚本
-- 1. 菜单 SQL
INSERT INTO system_menu(
name, permission, type, sort, parent_id,
path, icon, component, status, component_name
)
VALUES (
'车辆上牌', '', 2, 5, 5055,
'vehicle-registration', 'file-text', 'asset/vehicle-registration/index', 0, 'VehicleRegistration'
);
-- 获取刚插入的菜单ID
SET @menuId = LAST_INSERT_ID();
-- 车辆上牌管理按钮权限
INSERT INTO system_menu(name, permission, type, sort, parent_id, path, icon, component, status)
VALUES
('车辆上牌查询', 'asset:vehicle-registration:query', 3, 1, @menuId, '', '', '', 0),
('车辆上牌创建', 'asset:vehicle-registration:create', 3, 2, @menuId, '', '', '', 0),
('车辆上牌更新', 'asset:vehicle-registration:update', 3, 3, @menuId, '', '', '', 0),
('车辆上牌删除', 'asset:vehicle-registration:delete', 3, 4, @menuId, '', '', '', 0),
('车辆上牌导出', 'asset:vehicle-registration:export', 3, 5, @menuId, '', '', '', 0),
('车辆上牌确认', 'asset:vehicle-registration:confirm', 3, 6, @menuId, '', '', '', 0),
('车辆上牌作废', 'asset:vehicle-registration:void', 3, 7, @menuId, '', '', '', 0);

View File

@@ -0,0 +1,35 @@
-- =============================================
-- 车辆租赁业务流程表结构增量变更
-- 对应前端新增字段
-- =============================================
-- 1. 备车记录表 - 新增字段
ALTER TABLE `asset_vehicle_prepare`
ADD COLUMN `vehicle_type` VARCHAR(50) COMMENT '车辆类型' AFTER `model`,
ADD COLUMN `parking_lot` VARCHAR(100) COMMENT '停车场' AFTER `vehicle_type`,
ADD COLUMN `preparation_type` VARCHAR(50) COMMENT '整备类型' AFTER `contract_code`,
ADD COLUMN `mileage` INT COMMENT '里程(km)' AFTER `preparation_type`,
ADD COLUMN `hydrogen_remaining` DECIMAL(10,2) COMMENT '剩余氢量' AFTER `mileage`,
ADD COLUMN `hydrogen_unit` VARCHAR(10) DEFAULT '%' COMMENT '氢量单位(%/MPa/kg)' AFTER `hydrogen_remaining`,
ADD COLUMN `battery_remaining` DECIMAL(10,2) COMMENT '剩余电量(%)' AFTER `hydrogen_unit`,
ADD COLUMN `enlarged_text_photo` VARCHAR(1000) COMMENT '放大字照片JSON数组' AFTER `body_ad_photos`,
ADD COLUMN `spare_tire_depth` DECIMAL(10,2) COMMENT '备胎胎纹深度(mm)' AFTER `has_tail_lift`,
ADD COLUMN `spare_tire_photo` VARCHAR(1000) COMMENT '备胎照片JSON数组' AFTER `spare_tire_depth`,
ADD COLUMN `remark` VARCHAR(500) COMMENT '备注' AFTER `check_list`,
ADD COLUMN `complete_time` DATETIME COMMENT '完成时间' AFTER `status`;
-- 2. 交车单表 - 新增司机信息、交检清单、费用信息
ALTER TABLE `asset_delivery_order`
ADD COLUMN `driver_name` VARCHAR(64) COMMENT '司机姓名' AFTER `delivery_photos`,
ADD COLUMN `driver_id_card` VARCHAR(18) COMMENT '司机身份证' AFTER `driver_name`,
ADD COLUMN `driver_phone` VARCHAR(20) COMMENT '司机手机号' AFTER `driver_id_card`,
ADD COLUMN `inspection_data` TEXT COMMENT '交检清单JSON' AFTER `driver_phone`,
ADD COLUMN `cost_list` TEXT COMMENT '费用信息JSON' AFTER `inspection_data`;
-- 3. 交车单车辆表 - 新增电量
ALTER TABLE `asset_delivery_order_vehicle`
ADD COLUMN `battery_level` DECIMAL(10,2) COMMENT '交车时电量(%)' AFTER `hydrogen_level`;
-- 4. 还车车辆表 - 新增违章费用
ALTER TABLE `asset_return_order_vehicle`
ADD COLUMN `violation_fee` DECIMAL(10,2) DEFAULT 0 COMMENT '违章费用' AFTER `unpaid_repair_fee`;

View File

@@ -0,0 +1,222 @@
-- =============================================
-- 车辆租赁业务流程表结构
-- 包含:备车、交车任务、交车单、还车单
-- =============================================
-- 1. 备车记录表
CREATE TABLE IF NOT EXISTS `asset_vehicle_prepare` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`vehicle_id` BIGINT NOT NULL COMMENT '车辆ID',
`plate_no` VARCHAR(20) COMMENT '车牌号',
`vin` VARCHAR(50) NOT NULL COMMENT '车辆识别代码',
`vehicle_model_id` BIGINT NOT NULL COMMENT '车型ID',
`brand` VARCHAR(100) COMMENT '品牌',
`model` VARCHAR(100) COMMENT '型号',
`contract_id` BIGINT COMMENT '关联合同ID',
`contract_code` VARCHAR(50) COMMENT '合同编码',
`has_body_ad` BIT(1) DEFAULT b'0' COMMENT '是否有车身广告',
`body_ad_photos` VARCHAR(1000) COMMENT '广告照片JSON数组',
`has_tail_lift` BIT(1) DEFAULT b'0' COMMENT '是否有尾板',
`trailer_plate_no` VARCHAR(20) COMMENT '挂车牌号',
`defect_photos` VARCHAR(1000) COMMENT '瑕疵照片JSON数组',
`check_list` TEXT COMMENT '备车检查清单JSON',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0=待提交 1=已完成)',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_vehicle_id` (`vehicle_id`),
INDEX `idx_contract_id` (`contract_id`),
INDEX `idx_status` (`status`),
INDEX `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='备车记录表';
-- 2. 交车任务表
CREATE TABLE IF NOT EXISTS `asset_delivery_task` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_code` VARCHAR(50) NOT NULL COMMENT '交车任务编码',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`contract_code` VARCHAR(50) NOT NULL COMMENT '合同编码',
`project_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
`customer_id` BIGINT NOT NULL COMMENT '客户ID',
`customer_name` VARCHAR(200) NOT NULL COMMENT '客户名称',
`expected_delivery_date_start` DATE COMMENT '预计交车开始日期',
`expected_delivery_date_end` DATE COMMENT '预计交车结束日期',
`billing_start_date` DATE NOT NULL COMMENT '开始计费日期',
`delivery_province` VARCHAR(50) COMMENT '交车省份',
`delivery_city` VARCHAR(50) COMMENT '交车城市',
`delivery_location` VARCHAR(255) COMMENT '交车地点',
`vehicle_count` INT NOT NULL DEFAULT 0 COMMENT '交车数量',
`task_status` TINYINT NOT NULL DEFAULT 0 COMMENT '任务状态0=激活 1=挂起)',
`delivery_status` TINYINT NOT NULL DEFAULT 0 COMMENT '交车状态0=未交车 1=已交车)',
`need_return` BIT(1) NOT NULL DEFAULT b'1' COMMENT '是否需要还车',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_code` (`task_code`, `deleted`),
INDEX `idx_contract_id` (`contract_id`),
INDEX `idx_customer_id` (`customer_id`),
INDEX `idx_task_status` (`task_status`),
INDEX `idx_delivery_status` (`delivery_status`),
INDEX `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车任务表';
-- 3. 交车任务车辆表
CREATE TABLE IF NOT EXISTS `asset_delivery_task_vehicle` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_id` BIGINT NOT NULL COMMENT '交车任务ID',
`contract_vehicle_id` BIGINT NOT NULL COMMENT '合同车辆ID',
`vehicle_id` BIGINT NOT NULL COMMENT '车辆ID',
`plate_no` VARCHAR(20) COMMENT '车牌号',
`vin` VARCHAR(50) NOT NULL COMMENT '车辆识别代码',
`brand` VARCHAR(100) NOT NULL COMMENT '品牌',
`model` VARCHAR(100) NOT NULL COMMENT '型号',
`month_rent` DECIMAL(10,2) NOT NULL COMMENT '月租金',
`deposit` DECIMAL(10,2) NOT NULL COMMENT '保证金',
`actual_delivery_date` DATETIME COMMENT '实际交车日期',
`delivery_person` VARCHAR(64) COMMENT '交车人',
`is_delivered` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否已交车',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_task_id` (`task_id`),
INDEX `idx_vehicle_id` (`vehicle_id`),
INDEX `idx_contract_vehicle_id` (`contract_vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车任务车辆表';
-- 4. 交车单表
CREATE TABLE IF NOT EXISTS `asset_delivery_order` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_code` VARCHAR(50) NOT NULL COMMENT '交车单编码',
`task_id` BIGINT NOT NULL COMMENT '交车任务ID',
`task_code` VARCHAR(50) NOT NULL COMMENT '交车任务编码',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`contract_code` VARCHAR(50) NOT NULL COMMENT '合同编码',
`project_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
`customer_id` BIGINT NOT NULL COMMENT '客户ID',
`customer_name` VARCHAR(200) NOT NULL COMMENT '客户名称',
`delivery_date` DATETIME NOT NULL COMMENT '交车日期',
`delivery_person` VARCHAR(64) NOT NULL COMMENT '交车人',
`delivery_location` VARCHAR(255) COMMENT '交车地点',
`authorized_person_id` BIGINT COMMENT '被授权人ID',
`authorized_person_name` VARCHAR(100) COMMENT '被授权人姓名',
`authorized_person_phone` VARCHAR(20) COMMENT '被授权人电话',
`authorized_person_id_card` VARCHAR(18) COMMENT '被授权人身份证',
`esign_flow_id` VARCHAR(100) COMMENT 'E签宝流程ID',
`esign_status` TINYINT DEFAULT 0 COMMENT 'E签宝状态0=未签 1=已签)',
`delivery_photos` VARCHAR(1000) COMMENT '交车照片JSON数组',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0=待完成 1=已完成)',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_code` (`order_code`, `deleted`),
INDEX `idx_task_id` (`task_id`),
INDEX `idx_contract_id` (`contract_id`),
INDEX `idx_status` (`status`),
INDEX `idx_delivery_date` (`delivery_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车单表';
-- 5. 交车单车辆表
CREATE TABLE IF NOT EXISTS `asset_delivery_order_vehicle` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_id` BIGINT NOT NULL COMMENT '交车单ID',
`task_vehicle_id` BIGINT NOT NULL COMMENT '交车任务车辆ID',
`vehicle_id` BIGINT NOT NULL COMMENT '车辆ID',
`plate_no` VARCHAR(20) COMMENT '车牌号',
`vin` VARCHAR(50) NOT NULL COMMENT '车辆识别代码',
`brand` VARCHAR(100) NOT NULL COMMENT '品牌',
`model` VARCHAR(100) NOT NULL COMMENT '型号',
`mileage` INT COMMENT '交车时里程',
`hydrogen_level` DECIMAL(10,2) COMMENT '交车时氢气量kg',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_order_id` (`order_id`),
INDEX `idx_vehicle_id` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='交车单车辆表';
-- 6. 还车单表
CREATE TABLE IF NOT EXISTS `asset_return_order` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_code` VARCHAR(50) NOT NULL COMMENT '还车单编码',
`contract_id` BIGINT NOT NULL COMMENT '合同ID',
`contract_code` VARCHAR(50) NOT NULL COMMENT '合同编码',
`project_name` VARCHAR(200) NOT NULL COMMENT '项目名称',
`customer_id` BIGINT NOT NULL COMMENT '客户ID',
`customer_name` VARCHAR(200) NOT NULL COMMENT '客户名称',
`return_date` DATETIME NOT NULL COMMENT '还车日期',
`return_person` VARCHAR(64) NOT NULL COMMENT '还车验收人',
`return_location` VARCHAR(255) COMMENT '还车地点',
`return_reason` VARCHAR(50) COMMENT '还车原因',
`return_reason_desc` VARCHAR(500) COMMENT '还车原因说明',
`total_refund_amount` DECIMAL(10,2) DEFAULT 0 COMMENT '退还总金额',
`deposit_refund` DECIMAL(10,2) DEFAULT 0 COMMENT '退还保证金',
`hydrogen_refund` DECIMAL(10,2) DEFAULT 0 COMMENT '氢气退款',
`other_charges` DECIMAL(10,2) DEFAULT 0 COMMENT '其他费用',
`return_photos` VARCHAR(1000) COMMENT '还车照片JSON数组',
`status` TINYINT NOT NULL DEFAULT 0 COMMENT '状态0=待验车 1=验车完成 2=已结算)',
`approval_status` TINYINT NOT NULL DEFAULT 0 COMMENT '审批状态0=草稿 1=审批中 2=审批通过 3=审批拒绝)',
`bpm_instance_id` VARCHAR(64) COMMENT 'BPM流程实例ID',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_code` (`order_code`, `deleted`),
INDEX `idx_contract_id` (`contract_id`),
INDEX `idx_status` (`status`),
INDEX `idx_approval_status` (`approval_status`),
INDEX `idx_return_date` (`return_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='还车单表';
-- 7. 还车车辆表
CREATE TABLE IF NOT EXISTS `asset_return_order_vehicle` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`return_order_id` BIGINT NOT NULL COMMENT '还车单ID',
`vehicle_id` BIGINT NOT NULL COMMENT '车辆ID',
`plate_no` VARCHAR(20) COMMENT '车牌号',
`vin` VARCHAR(50) NOT NULL COMMENT '车辆识别代码',
`brand` VARCHAR(100) NOT NULL COMMENT '品牌',
`model` VARCHAR(100) NOT NULL COMMENT '型号',
`return_mileage` INT COMMENT '还车时里程',
`return_hydrogen_level` DECIMAL(10,2) COMMENT '还车时氢气量kg',
`delivery_hydrogen_level` DECIMAL(10,2) COMMENT '交车时氢气量kg',
`hydrogen_diff` DECIMAL(10,2) COMMENT '氢气差值kg',
`hydrogen_unit_price` DECIMAL(10,2) COMMENT '氢气单价(元/kg',
`hydrogen_refund_amount` DECIMAL(10,2) COMMENT '氢气退款金额',
`check_list` TEXT COMMENT '还车检查清单JSON',
`defect_photos` VARCHAR(1000) COMMENT '瑕疵照片JSON数组',
`vehicle_damage_fee` DECIMAL(10,2) DEFAULT 0 COMMENT '车损费',
`tool_damage_fee` DECIMAL(10,2) DEFAULT 0 COMMENT '工具损坏费',
`unpaid_maintenance_fee` DECIMAL(10,2) DEFAULT 0 COMMENT '未结算保养费',
`unpaid_repair_fee` DECIMAL(10,2) DEFAULT 0 COMMENT '未结算维修费',
`other_fee` DECIMAL(10,2) DEFAULT 0 COMMENT '其他费用',
`creator` VARCHAR(64) DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` VARCHAR(64) DEFAULT '' COMMENT '更新者',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` BIGINT NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_return_order_id` (`return_order_id`),
INDEX `idx_vehicle_id` (`vehicle_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='还车车辆表';

View File

@@ -34,6 +34,13 @@
<artifactId>spring-boot-starter-validation</artifactId>
<optional>true</optional>
</dependency>
<!-- RPC 远程调用相关 -->
<dependency>
<groupId>cn.iocoder.cloud</groupId>
<artifactId>yudao-spring-boot-starter-rpc</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.asset.api.contract;
import cn.iocoder.yudao.module.asset.api.contract.dto.ContractRespDTO;
/**
* 合同 API 接口
*
* @author 芋道源码
*/
public interface ContractApi {
/**
* 查询客户的生效中合同
*
* @param customerId 客户ID
* @return 合同信息
*/
ContractRespDTO getActiveByCustomerId(Long customerId);
}

View File

@@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.asset.api.contract.dto;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 合同响应 DTO
*
* @author 芋道源码
*/
@Data
public class ContractRespDTO implements Serializable {
/**
* 合同ID
*/
private Long id;
/**
* 合同编号
*/
private String contractNo;
/**
* 客户ID
*/
private Long customerId;
/**
* 合同状态
*/
private Integer contractStatus;
/**
* 开始日期
*/
private LocalDateTime startDate;
/**
* 结束日期
*/
private LocalDateTime endDate;
}

View File

@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.asset.api.customer;
import cn.iocoder.yudao.module.asset.api.customer.dto.CustomerRespDTO;
/**
* 客户 API 接口
*
* @author 芋道源码
*/
public interface CustomerApi {
/**
* 通过名称模糊查询客户
*
* @param name 客户名称
* @return 客户信息
*/
CustomerRespDTO getByNameLike(String name);
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.asset.api.customer.dto;
import lombok.Data;
import java.io.Serializable;
/**
* 客户响应 DTO
*
* @author 芋道源码
*/
@Data
public class CustomerRespDTO implements Serializable {
/**
* 客户ID
*/
private Long id;
/**
* 客户名称
*/
private String customerName;
/**
* 客户编码
*/
private String customerCode;
/**
* 客户类型
*/
private Integer customerType;
/**
* 客户状态
*/
private Integer status;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.asset.api.station;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.asset.api.station.dto.HydrogenStationRespDTO;
import cn.iocoder.yudao.module.asset.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 加氢站 API 接口
*
* @author 芋道源码
*/
@FeignClient(name = ApiConstants.NAME)
@Tag(name = "RPC 服务 - 加氢站")
public interface HydrogenStationApi {
String PREFIX = ApiConstants.PREFIX + "/hydrogen-station";
/**
* 获取加氢站信息
*
* @param id 加氢站ID
* @return 加氢站信息
*/
@GetMapping(PREFIX + "/get")
@Operation(summary = "获取加氢站信息")
CommonResult<HydrogenStationRespDTO> getStation(@RequestParam("id") @Parameter(description = "加氢站ID") Long id);
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.asset.api.station.dto;
import lombok.Data;
import java.io.Serializable;
/**
* 加氢站响应 DTO
*
* @author 芋道源码
*/
@Data
public class HydrogenStationRespDTO implements Serializable {
/**
* 站点ID
*/
private Long id;
/**
* 站点名称
*/
private String name;
/**
* 是否自动扣款
*/
private Boolean autoDeduct;
/**
* 站点编码
*/
private String code;
/**
* 站点状态
*/
private Integer status;
}

View File

@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.asset.api.vehicle;
import cn.iocoder.yudao.module.asset.api.vehicle.dto.VehicleRespDTO;
/**
* 车辆 API 接口
*
* @author 芋道源码
*/
public interface VehicleApi {
/**
* 通过车牌号查询车辆
*
* @param vehicleNo 车牌号
* @return 车辆信息
*/
VehicleRespDTO getByVehicleNo(String vehicleNo);
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.asset.api.vehicle.dto;
import lombok.Data;
import java.io.Serializable;
/**
* 车辆响应 DTO
*
* @author 芋道源码
*/
@Data
public class VehicleRespDTO implements Serializable {
/**
* 车辆ID
*/
private Long id;
/**
* 车牌号
*/
private String plateNo;
/**
* 客户ID
*/
private Long customerId;
/**
* 车辆类型
*/
private Integer vehicleType;
/**
* 车辆状态
*/
private Integer status;
}

View File

@@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.asset.enums;
import cn.iocoder.yudao.framework.common.enums.RpcConstants;
/**
* API 相关的枚举
*
* @author 芋道源码
*/
public class ApiConstants {
/**
* 服务名
*
* 注意,需要保证和 spring.application.name 保持一致
*/
public static final String NAME = "asset-server";
public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/asset";
public static final String VERSION = "1.0.0";
}

View File

@@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.asset.enums.contract;
import java.util.Arrays;
/**
* 合同审批状态枚举
*
* @author 芋道源码
*/
public enum ContractApprovalStatusEnum {
DRAFT(0, "草稿"),
APPROVING(1, "审批中"),
APPROVED(2, "审批通过"),
REJECTED(3, "审批拒绝"),
WITHDRAWN(4, "已撤回");
/**
* 状态
*/
private final Integer status;
/**
* 名称
*/
private final String name;
ContractApprovalStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static ContractApprovalStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.asset.enums.contract;
import java.util.Arrays;
/**
* 合同状态枚举
*
* @author 芋道源码
*/
public enum ContractStatusEnum {
DRAFT(0, "草稿"),
PENDING(1, "待生效"),
IN_PROGRESS(2, "进行中"),
EXPIRED(3, "已到期"),
TERMINATED(4, "已终止"),
RENEWED(5, "已续签");
/**
* 状态
*/
private final Integer status;
/**
* 名称
*/
private final String name;
ContractStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static ContractStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.asset.enums.contract;
import java.util.Arrays;
/**
* 合同类型枚举
*
* @author 芋道源码
*/
public enum ContractTypeEnum {
TRIAL(1, "试用合同"),
FORMAL(2, "正式合同");
/**
* 类型
*/
private final Integer type;
/**
* 名称
*/
private final String name;
ContractTypeEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
public Integer getType() {
return type;
}
public String getName() {
return name;
}
public static ContractTypeEnum valueOf(Integer type) {
return Arrays.stream(values())
.filter(item -> item.getType().equals(type))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.asset.enums.delivery;
import java.util.Arrays;
/**
* 交车单状态枚举
*/
public enum DeliveryOrderStatusEnum {
PENDING(0, "待完成"),
COMPLETED(1, "已完成");
private final Integer status;
private final String name;
DeliveryOrderStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static DeliveryOrderStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.asset.enums.delivery;
import java.util.Arrays;
/**
* 交车状态枚举
*/
public enum DeliveryStatusEnum {
NOT_DELIVERED(0, "未交车"),
DELIVERED(1, "已交车");
private final Integer status;
private final String name;
DeliveryStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static DeliveryStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.asset.enums.delivery;
import java.util.Arrays;
/**
* 交车任务状态枚举
*/
public enum DeliveryTaskStatusEnum {
ACTIVE(0, "激活"),
SUSPENDED(1, "挂起");
private final Integer status;
private final String name;
DeliveryTaskStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static DeliveryTaskStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.asset.enums.inspection;
import java.util.Arrays;
/**
* 验车结果枚举
*
* @author 芋道源码
*/
public enum InspectionResultEnum {
PASS(1, "通过"),
FAIL(2, "不通过"),
NA(3, "不适用");
/**
* 结果
*/
private final Integer result;
/**
* 名称
*/
private final String name;
InspectionResultEnum(Integer result, String name) {
this.result = result;
this.name = name;
}
public Integer getResult() {
return result;
}
public String getName() {
return name;
}
public static InspectionResultEnum valueOf(Integer result) {
return Arrays.stream(values())
.filter(item -> item.getResult().equals(result))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.asset.enums.inspection;
import java.util.Arrays;
/**
* 验车来源类型枚举
*
* @author 芋道源码
*/
public enum InspectionSourceTypeEnum {
PREPARE(1, "备车"),
DELIVERY(2, "交车"),
RETURN(3, "还车");
/**
* 类型
*/
private final Integer type;
/**
* 名称
*/
private final String name;
InspectionSourceTypeEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
public Integer getType() {
return type;
}
public String getName() {
return name;
}
public static InspectionSourceTypeEnum valueOf(Integer type) {
return Arrays.stream(values())
.filter(item -> item.getType().equals(type))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,45 @@
package cn.iocoder.yudao.module.asset.enums.inspection;
import java.util.Arrays;
/**
* 验车状态枚举
*
* @author 芋道源码
*/
public enum InspectionStatusEnum {
PENDING(0, "待检"),
IN_PROGRESS(1, "检查中"),
COMPLETED(2, "已完成");
/**
* 状态
*/
private final Integer status;
/**
* 名称
*/
private final String name;
InspectionStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static InspectionStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.asset.enums.prepare;
import java.util.Arrays;
/**
* 备车状态枚举
*/
public enum VehiclePrepareStatusEnum {
DRAFT(0, "待提交"),
COMPLETED(1, "已完成");
private final Integer status;
private final String name;
VehiclePrepareStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static VehiclePrepareStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.asset.enums.replacement;
import java.util.Arrays;
/**
* 替换车状态枚举
*
* @author 芋道源码
*/
public enum ReplacementStatusEnum {
DRAFT(0, "草稿"),
APPROVING(1, "审批中"),
APPROVED(2, "审批通过"),
EXECUTING(3, "执行中"),
COMPLETED(4, "已完成"),
REJECTED(5, "审批驳回"),
WITHDRAWN(6, "已撤回");
/**
* 状态
*/
private final Integer status;
/**
* 名称
*/
private final String name;
ReplacementStatusEnum(Integer status, String name) {
this.status = status;
this.name = name;
}
public Integer getStatus() {
return status;
}
public String getName() {
return name;
}
public static ReplacementStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,44 @@
package cn.iocoder.yudao.module.asset.enums.replacement;
import java.util.Arrays;
/**
* 替换车类型枚举
*
* @author 芋道源码
*/
public enum ReplacementTypeEnum {
TEMPORARY(1, "临时替换"),
PERMANENT(2, "永久替换");
/**
* 类型
*/
private final Integer type;
/**
* 名称
*/
private final String name;
ReplacementTypeEnum(Integer type, String name) {
this.type = type;
this.name = name;
}
public Integer getType() {
return type;
}
public String getName() {
return name;
}
public static ReplacementTypeEnum valueOf(Integer type) {
return Arrays.stream(values())
.filter(item -> item.getType().equals(type))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.asset.enums.returnorder;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 还车单状态枚举
*/
@Getter
@AllArgsConstructor
public enum ReturnOrderStatusEnum {
PENDING_INSPECTION(0, "待验车"),
INSPECTION_COMPLETED(1, "验车完成"),
SETTLED(2, "已结算");
private final Integer status;
private final String name;
public static ReturnOrderStatusEnum valueOf(Integer status) {
return Arrays.stream(values())
.filter(item -> item.getStatus().equals(status))
.findFirst()
.orElse(null);
}
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.asset.enums.returnorder;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
/**
* 还车原因枚举
*/
@Getter
@AllArgsConstructor
public enum ReturnReasonEnum {
CONTRACT_EXPIRED("CONTRACT_EXPIRED", "合同到期"),
CUSTOMER_REQUEST("CUSTOMER_REQUEST", "客户申请"),
CONTRACT_TERMINATED("CONTRACT_TERMINATED", "合同终止");
private final String code;
private final String name;
public static ReturnReasonEnum valueOfCode(String code) {
return Arrays.stream(values())
.filter(item -> item.getCode().equals(code))
.findFirst()
.orElse(null);
}
}

View File

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.asset;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 资产管理模块 Application
@@ -9,6 +10,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
* @author 芋道源码
*/
@SpringBootApplication
@EnableFeignClients(basePackages = {
"cn.iocoder.yudao.module.system.api", // System 模块 API
"cn.iocoder.yudao.module.ocr.api", // OCR 模块 API
"cn.iocoder.yudao.module.infra.api", // Infra 模块 API
"cn.iocoder.yudao.module.bpm.api" // BPM 模块 API
})
public class AssetServerApplication {
public static void main(String[] args) {

View File

@@ -0,0 +1,37 @@
package cn.iocoder.yudao.module.asset.api;
import cn.iocoder.yudao.module.asset.api.contract.ContractApi;
import cn.iocoder.yudao.module.asset.api.contract.dto.ContractRespDTO;
import cn.iocoder.yudao.module.asset.convert.contract.ContractConvert;
import cn.iocoder.yudao.module.asset.dal.dataobject.contract.ContractDO;
import cn.iocoder.yudao.module.asset.dal.mysql.contract.ContractMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
/**
* 合同 API 实现类
*
* @author 芋道源码
*/
@Service
public class ContractApiImpl implements ContractApi {
@Resource
private ContractMapper contractMapper;
@Override
public ContractRespDTO getActiveByCustomerId(Long customerId) {
ContractDO contract = contractMapper.selectOne(
new LambdaQueryWrapper<ContractDO>()
.eq(ContractDO::getCustomerId, customerId)
.eq(ContractDO::getContractStatus, 2) // 2=进行中
.gt(ContractDO::getEndDate, LocalDateTime.now())
.orderByDesc(ContractDO::getStartDate)
.last("LIMIT 1")
);
return ContractConvert.INSTANCE.convertToApi(contract);
}
}

View File

@@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.asset.api;
import cn.iocoder.yudao.module.asset.api.customer.CustomerApi;
import cn.iocoder.yudao.module.asset.api.customer.dto.CustomerRespDTO;
import cn.iocoder.yudao.module.asset.convert.customer.CustomerConvert;
import cn.iocoder.yudao.module.asset.dal.dataobject.customer.CustomerDO;
import cn.iocoder.yudao.module.asset.dal.mysql.customer.CustomerMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* 客户 API 实现类
*
* @author 芋道源码
*/
@Service
public class CustomerApiImpl implements CustomerApi {
@Resource
private CustomerMapper customerMapper;
@Override
public CustomerRespDTO getByNameLike(String name) {
CustomerDO customer = customerMapper.selectOne(
new LambdaQueryWrapper<CustomerDO>()
.like(CustomerDO::getCustomerName, name)
.last("LIMIT 1")
);
return CustomerConvert.INSTANCE.convertToApi(customer);
}
}

View File

@@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.asset.api;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.asset.api.station.HydrogenStationApi;
import cn.iocoder.yudao.module.asset.api.station.dto.HydrogenStationRespDTO;
import cn.iocoder.yudao.module.asset.convert.station.HydrogenStationConvert;
import cn.iocoder.yudao.module.asset.dal.dataobject.station.HydrogenStationDO;
import cn.iocoder.yudao.module.asset.service.station.HydrogenStationService;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 加氢站 API 实现类
*
* @author 芋道源码
*/
@RestController
public class HydrogenStationApiImpl implements HydrogenStationApi {
@Resource
private HydrogenStationService hydrogenStationService;
@Override
public CommonResult<HydrogenStationRespDTO> getStation(Long id) {
HydrogenStationDO station = hydrogenStationService.getHydrogenStation(id);
return success(HydrogenStationConvert.INSTANCE.convertToApi(station));
}
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.asset.api;
import cn.iocoder.yudao.module.asset.api.vehicle.VehicleApi;
import cn.iocoder.yudao.module.asset.api.vehicle.dto.VehicleRespDTO;
import cn.iocoder.yudao.module.asset.convert.vehicle.VehicleConvert;
import cn.iocoder.yudao.module.asset.dal.dataobject.vehicle.VehicleBaseDO;
import cn.iocoder.yudao.module.asset.dal.mysql.vehicle.VehicleBaseMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* 车辆 API 实现类
*
* @author 芋道源码
*/
@Service
public class VehicleApiImpl implements VehicleApi {
@Resource
private VehicleBaseMapper vehicleBaseMapper;
@Override
public VehicleRespDTO getByVehicleNo(String vehicleNo) {
VehicleBaseDO vehicle = vehicleBaseMapper.selectOne(VehicleBaseDO::getPlateNo, vehicleNo);
return VehicleConvert.INSTANCE.convertToApi(vehicle);
}
}

View File

@@ -0,0 +1,212 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.asset.controller.admin.contract.vo.*;
import cn.iocoder.yudao.module.asset.convert.contract.ContractConvert;
import cn.iocoder.yudao.module.asset.dal.dataobject.contract.*;
import cn.iocoder.yudao.module.asset.dal.mysql.contract.*;
import cn.iocoder.yudao.module.asset.service.contract.ContractService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 车辆租赁合同 Controller
*
* @author 芋道源码
*/
@Tag(name = "管理后台 - 车辆租赁合同管理")
@RestController
@RequestMapping("/asset/contract")
@Validated
public class ContractController {
@Resource
private ContractService contractService;
@Resource
private ContractVehicleMapper contractVehicleMapper;
@Resource
private ContractVehicleServiceMapper contractVehicleServiceMapper;
@Resource
private ContractAuthorizedMapper contractAuthorizedMapper;
@Resource
private ContractChangeHistoryMapper contractChangeHistoryMapper;
@PostMapping("/create")
@Operation(summary = "创建合同")
@PreAuthorize("@ss.hasPermission('asset:contract:create')")
public CommonResult<Long> createContract(@Valid @RequestBody ContractSaveReqVO createReqVO) {
return success(contractService.createContract(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新合同")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Boolean> updateContract(@Valid @RequestBody ContractSaveReqVO updateReqVO) {
contractService.updateContract(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除合同")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:contract:delete')")
public CommonResult<Boolean> deleteContract(@RequestParam("id") Long id) {
contractService.deleteContract(id);
return success(true);
}
@DeleteMapping("/delete-list")
@Operation(summary = "批量删除合同")
@Parameter(name = "ids", description = "编号列表", required = true)
@PreAuthorize("@ss.hasPermission('asset:contract:delete')")
public CommonResult<Boolean> deleteContractList(@RequestParam("ids") List<Long> ids) {
for (Long id : ids) {
contractService.deleteContract(id);
}
return success(true);
}
@GetMapping("/export-excel")
@Operation(summary = "导出合同 Excel")
@PreAuthorize("@ss.hasPermission('asset:contract:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportContractExcel(HttpServletResponse response, @Valid ContractPageReqVO exportReqVO) throws IOException {
exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ContractDO> list = contractService.getContractPage(exportReqVO).getList();
// 输出
ExcelUtils.write(response, "车辆租赁合同.xls", "合同数据", ContractExcelVO.class,
BeanUtils.toBean(list, ContractExcelVO.class));
}
@GetMapping("/get")
@Operation(summary = "获得合同详情")
@Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('asset:contract:query')")
public CommonResult<ContractDetailRespVO> getContract(@RequestParam("id") Long id) {
return success(contractService.getContractDetail(id));
}
@GetMapping("/page")
@Operation(summary = "获得合同分页")
@PreAuthorize("@ss.hasPermission('asset:contract:query')")
public CommonResult<PageResult<ContractRespVO>> getContractPage(@Valid ContractPageReqVO pageReqVO) {
PageResult<ContractDO> pageResult = contractService.getContractPage(pageReqVO);
PageResult<ContractRespVO> voPage = ContractConvert.INSTANCE.convertPage(pageResult);
// 填充车辆数和已交车辆数
for (ContractRespVO vo : voPage.getList()) {
List<ContractVehicleDO> vehicles = contractVehicleMapper.selectListByContractId(vo.getId());
vo.setVehicleCount(vehicles.size());
vo.setDeliveredCount((int) vehicles.stream()
.filter(v -> Integer.valueOf(1).equals(v.getVehicleStatus()))
.count());
}
return success(voPage);
}
@GetMapping("/change-history")
@Operation(summary = "获得合同变更历史")
@Parameter(name = "contractId", description = "合同ID", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('asset:contract:query')")
public CommonResult<List<ContractChangeHistoryDO>> getChangeHistory(@RequestParam("contractId") Long contractId) {
return success(contractChangeHistoryMapper.selectListByContractId(contractId));
}
@PostMapping("/submit-approval")
@Operation(summary = "提交合同审批")
@Parameter(name = "id", description = "合同ID", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<String> submitApproval(@RequestParam("id") Long id) {
return success(contractService.submitContractApproval(id));
}
@PostMapping("/withdraw-approval")
@Operation(summary = "撤回合同审批")
@Parameter(name = "id", description = "合同ID", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Boolean> withdrawApproval(@RequestParam("id") Long id) {
contractService.withdrawContractApproval(id);
return success(true);
}
@PostMapping("/terminate")
@Operation(summary = "终止合同")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Boolean> terminateContract(@RequestParam("id") Long id,
@RequestParam("reason") String reason) {
contractService.terminateContract(id, reason);
return success(true);
}
@GetMapping("/simple-list")
@Operation(summary = "获得合同精简列表", description = "用于下拉选择")
public CommonResult<List<ContractSimpleRespVO>> getContractSimpleList() {
List<ContractDO> list = contractService.getContractSimpleList();
return success(BeanUtils.toBean(list, ContractSimpleRespVO.class));
}
@PostMapping("/renew")
@Operation(summary = "续签合同")
@PreAuthorize("@ss.hasPermission('asset:contract:create')")
public CommonResult<Long> renewContract(@RequestParam("id") Long id,
@Valid @RequestBody ContractSaveReqVO newContractReqVO) {
return success(contractService.renewContract(id, newContractReqVO));
}
@PostMapping("/convert-to-third-party")
@Operation(summary = "变更为三方合同")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Long> convertToThirdParty(@RequestParam("id") Long id,
@Valid @RequestBody ContractSaveReqVO newContractReqVO) {
return success(contractService.convertToThirdParty(id, newContractReqVO));
}
@PostMapping("/convert-to-formal")
@Operation(summary = "试用合同转正式")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Long> convertToFormal(@RequestParam("id") Long id,
@Valid @RequestBody ContractSaveReqVO newContractReqVO) {
return success(contractService.convertToFormal(id, newContractReqVO));
}
@PostMapping("/add-vehicle")
@Operation(summary = "往现有合同追加车辆")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Boolean> addVehicle(@RequestParam("id") Long id,
@Valid @RequestBody List<ContractSaveReqVO.ContractVehicleSaveVO> vehicles) {
contractService.addVehiclesToContract(id, vehicles);
return success(true);
}
@PostMapping("/upload-seal")
@Operation(summary = "上传盖章合同附件")
@PreAuthorize("@ss.hasPermission('asset:contract:update')")
public CommonResult<Boolean> uploadSeal(@RequestParam("id") Long id,
@RequestParam("fileUrl") String fileUrl,
@RequestParam("fileName") String fileName) {
contractService.uploadSealedContract(id, fileUrl, fileName);
return success(true);
}
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 合同附件 VO
*
* @author 芋道源码
*/
@Data
public class ContractAttachmentVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "附件类型1=合同原件 2=盖章合同)", example = "1")
private Integer attachmentType;
@Schema(description = "文件名称", example = "合同扫描件.pdf")
private String fileName;
@Schema(description = "文件URL", example = "https://xxx.com/contract.pdf")
private String fileUrl;
@Schema(description = "文件大小(字节)", example = "1024000")
private Long fileSize;
@Schema(description = "上传时间", example = "2026-01-01 00:00:00")
private LocalDateTime uploadTime;
}

View File

@@ -0,0 +1,26 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 合同被授权人 VO
*
* @author 芋道源码
*/
@Data
public class ContractAuthorizedVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
private String name;
@Schema(description = "电话", requiredMode = Schema.RequiredMode.REQUIRED, example = "13800138000")
private String phone;
@Schema(description = "身份证号", requiredMode = Schema.RequiredMode.REQUIRED, example = "310101199001011234")
private String idCard;
}

View File

@@ -0,0 +1,101 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 车辆租赁合同 Base VO
*
* @author 芋道源码
*/
@Data
public class ContractBaseVO {
@Schema(description = "合同编码(新增时自动生成)", example = "HT-2026-001")
private String contractCode;
@Schema(description = "合同类型1=试用 2=正式)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "合同类型不能为空")
private Integer contractType;
@Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张江高科技园区车辆租赁项目")
@NotBlank(message = "项目名称不能为空")
private String projectName;
@Schema(description = "生效日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-01-01")
@NotNull(message = "生效日期不能为空")
private LocalDate startDate;
@Schema(description = "结束日期", requiredMode = Schema.RequiredMode.REQUIRED, example = "2026-12-31")
@NotNull(message = "结束日期不能为空")
private LocalDate endDate;
@Schema(description = "付款方式", example = "月付")
private String paymentMethod;
@Schema(description = "付款周期", example = "每月1日")
private String paymentCycle;
@Schema(description = "签约公司(乙方)", example = "上海某某汽车租赁有限公司")
private String signingCompany;
@Schema(description = "交车省份", example = "上海市")
private String deliveryProvince;
@Schema(description = "交车城市", example = "浦东新区")
private String deliveryCity;
@Schema(description = "交车地点", example = "张江高科技园区")
private String deliveryLocation;
@Schema(description = "备注", example = "特殊要求说明")
private String remark;
@Schema(description = "客户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "客户ID不能为空")
private Long customerId;
@Schema(description = "客户名称由后端根据客户ID自动填充", example = "上海某某科技有限公司")
private String customerName;
@Schema(description = "是否三方合同", example = "false")
private Boolean thirdPartyEnabled;
@Schema(description = "丙方客户ID", example = "2")
private Long thirdPartyCustomerId;
@Schema(description = "丙方名称", example = "北京某某公司")
private String thirdPartyName;
@Schema(description = "业务部门ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "业务部门ID不能为空")
private Long businessDeptId;
@Schema(description = "业务负责人ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "业务负责人ID不能为空")
private Long businessManagerId;
@Schema(description = "氢费承担方", example = "客户")
private String hydrogenBearer;
@Schema(description = "氢气付款方式", example = "预付")
private String hydrogenPaymentMethod;
@Schema(description = "氢气预付款", example = "5000.00")
private BigDecimal hydrogenPrepay;
@Schema(description = "退还车氢气单价", example = "35.00")
private BigDecimal hydrogenReturnPrice;
@Schema(description = "账单计算方式", example = "按自然月结算")
private String billingMethod;
@Schema(description = "主车型", example = "氢能重卡")
private String mainVehicleType;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.util.List;
/**
* 车辆租赁合同详情 Response VO
*
* @author 芋道源码
*/
@Schema(description = "管理后台 - 车辆租赁合同详情 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractDetailRespVO extends ContractRespVO {
@Schema(description = "车辆订单列表")
private List<ContractVehicleDetailVO> vehicles;
@Schema(description = "被授权人列表")
private List<ContractAuthorizedVO> authorizedPersons;
@Schema(description = "附件列表")
private List<ContractAttachmentVO> attachments;
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public static class ContractVehicleDetailVO extends ContractVehicleVO {
@Schema(description = "服务项目列表")
private List<ContractVehicleServiceVO> services;
}
}

View File

@@ -0,0 +1,70 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 车辆租赁合同 Excel 导出 VO
*
* @author 芋道源码
*/
@Data
@ExcelIgnoreUnannotated
public class ContractExcelVO {
@ExcelProperty("合同编码")
private String contractCode;
@ExcelProperty("合同类型")
private Integer contractType;
@ExcelProperty("项目名称")
private String projectName;
@ExcelProperty("客户名称")
private String customerName;
@ExcelProperty("签约公司")
private String signingCompany;
@ExcelProperty("生效日期")
private LocalDate startDate;
@ExcelProperty("结束日期")
private LocalDate endDate;
@ExcelProperty("付款方式")
private String paymentMethod;
@ExcelProperty("付款周期")
private String paymentCycle;
@ExcelProperty("交车省份")
private String deliveryProvince;
@ExcelProperty("交车城市")
private String deliveryCity;
@ExcelProperty("交车地点")
private String deliveryLocation;
@ExcelProperty("主车型")
private String mainVehicleType;
@ExcelProperty("审批状态")
private Integer approvalStatus;
@ExcelProperty("合同状态")
private Integer contractStatus;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@ExcelProperty("备注")
private String remark;
}

View File

@@ -0,0 +1,66 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
/**
* 车辆租赁合同分页查询 Request VO
*
* @author 芋道源码
*/
@Schema(description = "管理后台 - 车辆租赁合同分页查询 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractPageReqVO extends PageParam {
@Schema(description = "合同编码", example = "HT-2026-001")
private String contractCode;
@Schema(description = "合同类型1=试用 2=正式)", example = "1")
private Integer contractType;
@Schema(description = "项目名称(模糊搜索)", example = "张江高科技园区")
private String projectName;
@Schema(description = "客户ID", example = "1")
private Long customerId;
@Schema(description = "客户名称(模糊搜索)", example = "上海某某科技")
private String customerName;
@Schema(description = "审批状态0=草稿 1=审批中 2=审批通过 3=审批拒绝 4=已撤回)", example = "0")
private Integer approvalStatus;
@Schema(description = "合同状态0=草稿 1=待生效 2=进行中 3=已到期 4=已终止 5=已续签)", example = "0")
private Integer contractStatus;
@Schema(description = "生效日期", example = "[2026-01-01, 2026-12-31]")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate[] startDate;
@Schema(description = "结束日期", example = "[2026-01-01, 2026-12-31]")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
private LocalDate[] endDate;
@Schema(description = "业务部门ID", example = "1")
private Long businessDeptId;
@Schema(description = "签约公司", example = "嘉兴羚牛")
private String signingCompany;
@Schema(description = "业务负责人ID", example = "1")
private Long businessManagerId;
@Schema(description = "创建人", example = "admin")
private String creator;
}

View File

@@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
/**
* 车辆租赁合同 Response VO
*
* @author 芋道源码
*/
@Schema(description = "管理后台 - 车辆租赁合同 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractRespVO extends ContractBaseVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "审批状态0=草稿 1=审批中 2=审批通过 3=审批拒绝 4=已撤回)", example = "0")
private Integer approvalStatus;
@Schema(description = "BPM流程实例ID", example = "123456")
private String bpmInstanceId;
@Schema(description = "合同状态0=草稿 1=待生效 2=进行中 3=已到期 4=已终止 5=已续签)", example = "0")
private Integer contractStatus;
@Schema(description = "实际生效时间", example = "2026-01-01 00:00:00")
private LocalDateTime effectiveTime;
@Schema(description = "终止时间", example = "2026-12-31 23:59:59")
private LocalDateTime terminateTime;
@Schema(description = "终止原因", example = "客户要求终止")
private String terminateReason;
@Schema(description = "续签后的新合同ID", example = "2")
private Long renewedContractId;
@Schema(description = "原合同ID如果是续签合同", example = "1")
private Long originalContractId;
@Schema(description = "创建时间", example = "2026-01-01 00:00:00")
private LocalDateTime createTime;
@Schema(description = "创建者", example = "admin")
private String creator;
@Schema(description = "租赁车辆数", example = "5")
private Integer vehicleCount;
@Schema(description = "已交车辆数", example = "3")
private Integer deliveredCount;
}

View File

@@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty;
import java.util.List;
/**
* 车辆租赁合同创建/更新 Request VO
*
* @author 芋道源码
*/
@Schema(description = "管理后台 - 车辆租赁合同创建/更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ContractSaveReqVO extends ContractBaseVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "车辆订单列表", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "车辆订单列表不能为空")
@Valid
private List<ContractVehicleSaveVO> vehicles;
@Schema(description = "被授权人列表")
@Valid
private List<ContractAuthorizedVO> authorizedPersons;
@Data
public static class ContractVehicleSaveVO extends ContractVehicleVO {
@Schema(description = "服务项目列表")
@Valid
private List<ContractVehicleServiceVO> services;
}
}

View File

@@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 合同精简 Response VO")
@Data
public class ContractSimpleRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "合同编码", example = "HT-2026-0001")
private String contractCode;
@Schema(description = "项目名称", example = "XX物流项目")
private String projectName;
@Schema(description = "客户名称", example = "XX公司")
private String customerName;
}

View File

@@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 合同车辆服务项目 VO
*
* @author 芋道源码
*/
@Data
public class ContractVehicleServiceVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "服务项目名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "保险")
private String serviceName;
@Schema(description = "服务费用(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "3000.00")
private BigDecimal serviceFee;
@Schema(description = "生效日期", example = "2026-01-01")
private LocalDate effectiveDate;
}

View File

@@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.asset.controller.admin.contract.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
* 合同车辆 VO
*
* @author 芋道源码
*/
@Data
public class ContractVehicleVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "车辆ID", example = "1")
private Long vehicleId;
@Schema(description = "品牌", requiredMode = Schema.RequiredMode.REQUIRED, example = "丰田")
private String brand;
@Schema(description = "型号", requiredMode = Schema.RequiredMode.REQUIRED, example = "凯美瑞")
private String model;
@Schema(description = "车牌号", example = "沪A12345")
private String plateNo;
@Schema(description = "VIN码", example = "LVSHCAMB1CE012345")
private String vin;
@Schema(description = "月租金(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "5000.00")
private BigDecimal monthRent;
@Schema(description = "保证金(元)", requiredMode = Schema.RequiredMode.REQUIRED, example = "10000.00")
private BigDecimal deposit;
@Schema(description = "车辆状态0=待交车 1=已交车 2=已退车)", example = "0")
private Integer vehicleStatus;
@Schema(description = "备注", example = "特殊要求")
private String remark;
}

View File

@@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -75,4 +76,11 @@ public class CustomerController {
return success(CustomerConvert.INSTANCE.convertPage(pageResult));
}
@GetMapping("/simple-list")
@Operation(summary = "获得客户精简列表", description = "用于下拉选择")
public CommonResult<List<CustomerRespVO>> getCustomerSimpleList() {
List<CustomerDO> list = customerService.getCustomerSimpleList();
return success(CustomerConvert.INSTANCE.convertList(list));
}
}

View File

@@ -0,0 +1,79 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.asset.controller.admin.delivery.vo.*;
import cn.iocoder.yudao.module.asset.dal.dataobject.delivery.DeliveryOrderDO;
import cn.iocoder.yudao.module.asset.service.delivery.DeliveryOrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 交车单")
@RestController
@RequestMapping("/asset/delivery-order")
@Validated
public class DeliveryOrderController {
@Resource
private DeliveryOrderService deliveryOrderService;
@PostMapping("/create")
@Operation(summary = "创建交车单")
@PreAuthorize("@ss.hasPermission('asset:delivery-order:create')")
public CommonResult<Long> createDeliveryOrder(@Valid @RequestBody DeliveryOrderSaveReqVO createReqVO) {
return success(deliveryOrderService.createDeliveryOrder(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新交车单")
@PreAuthorize("@ss.hasPermission('asset:delivery-order:update')")
public CommonResult<Boolean> updateDeliveryOrder(@Valid @RequestBody DeliveryOrderSaveReqVO updateReqVO) {
deliveryOrderService.updateDeliveryOrder(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除交车单")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:delivery-order:delete')")
public CommonResult<Boolean> deleteDeliveryOrder(@RequestParam("id") Long id) {
deliveryOrderService.deleteDeliveryOrder(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得交车单详情")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:delivery-order:query')")
public CommonResult<DeliveryOrderRespVO> getDeliveryOrder(@RequestParam("id") Long id) {
return success(deliveryOrderService.getDeliveryOrderDetail(id));
}
@GetMapping("/page")
@Operation(summary = "获得交车单分页")
@PreAuthorize("@ss.hasPermission('asset:delivery-order:query')")
public CommonResult<PageResult<DeliveryOrderRespVO>> getDeliveryOrderPage(@Valid DeliveryOrderPageReqVO pageReqVO) {
PageResult<DeliveryOrderDO> pageResult = deliveryOrderService.getDeliveryOrderPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, DeliveryOrderRespVO.class));
}
@PutMapping("/complete")
@Operation(summary = "完成交车")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:delivery-order:update')")
public CommonResult<Boolean> completeDeliveryOrder(@RequestParam("id") Long id) {
deliveryOrderService.completeDeliveryOrder(id);
return success(true);
}
}

View File

@@ -0,0 +1,102 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.asset.controller.admin.delivery.vo.*;
import cn.iocoder.yudao.module.asset.dal.dataobject.delivery.DeliveryTaskDO;
import cn.iocoder.yudao.module.asset.service.delivery.DeliveryTaskService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 交车任务")
@RestController
@RequestMapping("/asset/delivery-task")
@Validated
public class DeliveryTaskController {
@Resource
private DeliveryTaskService deliveryTaskService;
@PostMapping("/create")
@Operation(summary = "创建交车任务")
@PreAuthorize("@ss.hasPermission('asset:delivery-task:create')")
public CommonResult<Long> createDeliveryTask(@Valid @RequestBody DeliveryTaskSaveReqVO createReqVO) {
return success(deliveryTaskService.createDeliveryTask(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新交车任务")
@PreAuthorize("@ss.hasPermission('asset:delivery-task:update')")
public CommonResult<Boolean> updateDeliveryTask(@Valid @RequestBody DeliveryTaskSaveReqVO updateReqVO) {
deliveryTaskService.updateDeliveryTask(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除交车任务")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:delivery-task:delete')")
public CommonResult<Boolean> deleteDeliveryTask(@RequestParam("id") Long id) {
deliveryTaskService.deleteDeliveryTask(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得交车任务详情")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:delivery-task:query')")
public CommonResult<DeliveryTaskRespVO> getDeliveryTask(@RequestParam("id") Long id) {
return success(deliveryTaskService.getDeliveryTaskDetail(id));
}
@GetMapping("/page")
@Operation(summary = "获得交车任务分页")
@PreAuthorize("@ss.hasPermission('asset:delivery-task:query')")
public CommonResult<PageResult<DeliveryTaskRespVO>> getDeliveryTaskPage(@Valid DeliveryTaskPageReqVO pageReqVO) {
PageResult<DeliveryTaskDO> pageResult = deliveryTaskService.getDeliveryTaskPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, DeliveryTaskRespVO.class));
}
@GetMapping("/contract-page")
@Operation(summary = "获得交车任务按合同分组分页")
@PreAuthorize("@ss.hasPermission('asset:delivery-task:query')")
public CommonResult<PageResult<DeliveryTaskContractGroupRespVO>> getDeliveryTaskContractPage(
@Valid DeliveryTaskPageReqVO pageReqVO) {
return success(deliveryTaskService.getDeliveryTaskContractPage(pageReqVO));
}
@GetMapping("/simple-list")
@Operation(summary = "获得交车任务精简列表", description = "用于下拉选择")
public CommonResult<java.util.List<DeliveryTaskSimpleRespVO>> getDeliveryTaskSimpleList() {
java.util.List<DeliveryTaskDO> list = deliveryTaskService.getDeliveryTaskSimpleList();
return success(BeanUtils.toBean(list, DeliveryTaskSimpleRespVO.class));
}
@PutMapping("/suspend")
@Operation(summary = "挂起交车任务")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:delivery-task:update')")
public CommonResult<Boolean> suspendDeliveryTask(@RequestParam("id") Long id) {
deliveryTaskService.suspendDeliveryTask(id);
return success(true);
}
@PutMapping("/activate")
@Operation(summary = "激活交车任务")
@PreAuthorize("@ss.hasPermission('asset:delivery-task:update')")
public CommonResult<Boolean> activateDeliveryTask(@Valid @RequestBody DeliveryTaskActivateReqVO reqVO) {
deliveryTaskService.activateDeliveryTask(reqVO);
return success(true);
}
}

View File

@@ -0,0 +1,52 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 交车单分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class DeliveryOrderPageReqVO extends PageParam {
@Schema(description = "交车单编码")
private String orderCode;
@Schema(description = "任务编码")
private String taskCode;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "交车人")
private String deliveryPerson;
@Schema(description = "交车地区")
private String deliveryRegion;
@Schema(description = "状态")
private Integer status;
@Schema(description = "交车日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] deliveryDate;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,88 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 交车单 Response VO")
@Data
public class DeliveryOrderRespVO {
@Schema(description = "主键")
private Long id;
@Schema(description = "交车单编码")
private String orderCode;
@Schema(description = "交车任务ID")
private Long taskId;
@Schema(description = "任务编码")
private String taskCode;
@Schema(description = "合同ID")
private Long contractId;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "客户ID")
private Long customerId;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "交车日期")
private LocalDateTime deliveryDate;
@Schema(description = "交车人")
private String deliveryPerson;
@Schema(description = "交车地点")
private String deliveryLocation;
@Schema(description = "被授权人姓名")
private String authorizedPersonName;
@Schema(description = "被授权人电话")
private String authorizedPersonPhone;
@Schema(description = "E签宝状态")
private Integer esignStatus;
@Schema(description = "交车照片")
private String deliveryPhotos;
@Schema(description = "司机姓名")
private String driverName;
@Schema(description = "司机身份证")
private String driverIdCard;
@Schema(description = "司机手机号")
private String driverPhone;
@Schema(description = "交检清单JSON")
private String inspectionData;
@Schema(description = "费用信息JSON")
private String costList;
@Schema(description = "关联验车记录ID")
private Long inspectionRecordId;
@Schema(description = "状态")
private Integer status;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "车辆列表")
private List<DeliveryOrderVehicleVO> vehicles;
}

View File

@@ -0,0 +1,65 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 交车单创建/更新 Request VO")
@Data
public class DeliveryOrderSaveReqVO {
@Schema(description = "主键")
private Long id;
@Schema(description = "交车任务ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "交车任务ID不能为空")
private Long taskId;
@Schema(description = "交车日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "交车日期不能为空")
private LocalDateTime deliveryDate;
@Schema(description = "交车人", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "交车人不能为空")
private String deliveryPerson;
@Schema(description = "交车地点")
private String deliveryLocation;
@Schema(description = "被授权人ID")
private Long authorizedPersonId;
@Schema(description = "被授权人姓名")
private String authorizedPersonName;
@Schema(description = "被授权人电话")
private String authorizedPersonPhone;
@Schema(description = "被授权人身份证")
private String authorizedPersonIdCard;
@Schema(description = "交车照片")
private String deliveryPhotos;
@Schema(description = "司机姓名")
private String driverName;
@Schema(description = "司机身份证")
private String driverIdCard;
@Schema(description = "司机手机号")
private String driverPhone;
@Schema(description = "交检清单JSON")
private String inspectionData;
@Schema(description = "费用信息JSON")
private String costList;
@Schema(description = "车辆列表")
private List<DeliveryOrderVehicleVO> vehicles;
}

View File

@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "交车单车辆 VO")
@Data
public class DeliveryOrderVehicleVO {
@Schema(description = "主键")
private Long id;
@Schema(description = "交车任务车辆ID")
private Long taskVehicleId;
@Schema(description = "车辆ID")
private Long vehicleId;
@Schema(description = "车牌号")
private String plateNo;
@Schema(description = "VIN码")
private String vin;
@Schema(description = "品牌")
private String brand;
@Schema(description = "型号")
private String model;
@Schema(description = "交车时里程")
private Integer mileage;
@Schema(description = "交车时氢气量kg")
private BigDecimal hydrogenLevel;
@Schema(description = "交车时电量(%")
private BigDecimal batteryLevel;
}

View File

@@ -0,0 +1,27 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDate;
@Schema(description = "管理后台 - 交车任务激活 Request VO")
@Data
public class DeliveryTaskActivateReqVO {
@Schema(description = "任务ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "任务ID不能为空")
private Long id;
@Schema(description = "预计交车开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "预计交车开始日期不能为空")
private LocalDate expectedDeliveryDateStart;
@Schema(description = "预计交车结束日期")
private LocalDate expectedDeliveryDateEnd;
@Schema(description = "开始计费日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开始计费日期不能为空")
private LocalDate billingStartDate;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Schema(description = "管理后台 - 交车任务按合同分组 Response VO")
@Data
public class DeliveryTaskContractGroupRespVO {
@Schema(description = "合同ID")
private Long contractId;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "业务部门名称")
private String businessDeptName;
@Schema(description = "业务负责人名称")
private String businessManagerName;
@Schema(description = "合同生效日期")
private LocalDate startDate;
@Schema(description = "合同结束日期")
private LocalDate endDate;
@Schema(description = "交车任务列表")
private List<DeliveryTaskRespVO> tasks;
}

View File

@@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 交车任务分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class DeliveryTaskPageReqVO extends PageParam {
@Schema(description = "任务编码")
private String taskCode;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "任务状态")
private Integer taskStatus;
@Schema(description = "交车状态")
private Integer deliveryStatus;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,71 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 交车任务 Response VO")
@Data
public class DeliveryTaskRespVO {
@Schema(description = "主键")
private Long id;
@Schema(description = "任务编码")
private String taskCode;
@Schema(description = "合同ID")
private Long contractId;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "客户ID")
private Long customerId;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "预计交车开始日期")
private LocalDate expectedDeliveryDateStart;
@Schema(description = "预计交车结束日期")
private LocalDate expectedDeliveryDateEnd;
@Schema(description = "开始计费日期")
private LocalDate billingStartDate;
@Schema(description = "交车省份")
private String deliveryProvince;
@Schema(description = "交车城市")
private String deliveryCity;
@Schema(description = "交车地点")
private String deliveryLocation;
@Schema(description = "交车数量")
private Integer vehicleCount;
@Schema(description = "任务状态")
private Integer taskStatus;
@Schema(description = "交车状态")
private Integer deliveryStatus;
@Schema(description = "是否需要还车")
private Boolean needReturn;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "车辆列表")
private List<DeliveryTaskVehicleVO> vehicles;
}

View File

@@ -0,0 +1,58 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Schema(description = "管理后台 - 交车任务创建/更新 Request VO")
@Data
public class DeliveryTaskSaveReqVO {
@Schema(description = "主键")
private Long id;
@Schema(description = "合同ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "合同ID不能为空")
private Long contractId;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "项目名称")
private String projectName;
@Schema(description = "客户ID")
private Long customerId;
@Schema(description = "客户名称")
private String customerName;
@Schema(description = "预计交车开始日期")
private LocalDate expectedDeliveryDateStart;
@Schema(description = "预计交车结束日期")
private LocalDate expectedDeliveryDateEnd;
@Schema(description = "开始计费日期", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "开始计费日期不能为空")
private LocalDate billingStartDate;
@Schema(description = "交车省份")
private String deliveryProvince;
@Schema(description = "交车城市")
private String deliveryCity;
@Schema(description = "交车地点")
private String deliveryLocation;
@Schema(description = "是否需要还车")
private Boolean needReturn;
@Schema(description = "车辆列表")
private List<DeliveryTaskVehicleVO> vehicles;
}

View File

@@ -0,0 +1,25 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 交车任务精简 Response VO")
@Data
public class DeliveryTaskSimpleRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "任务编码", example = "HT-2026-0001JC0001")
private String taskCode;
@Schema(description = "合同编码", example = "HT-2026-0001")
private String contractCode;
@Schema(description = "项目名称", example = "XX物流项目")
private String projectName;
@Schema(description = "客户名称", example = "XX公司")
private String customerName;
}

View File

@@ -0,0 +1,48 @@
package cn.iocoder.yudao.module.asset.controller.admin.delivery.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Schema(description = "交车任务车辆 VO")
@Data
public class DeliveryTaskVehicleVO {
@Schema(description = "主键")
private Long id;
@Schema(description = "合同车辆ID")
private Long contractVehicleId;
@Schema(description = "车辆ID")
private Long vehicleId;
@Schema(description = "车牌号")
private String plateNo;
@Schema(description = "VIN码")
private String vin;
@Schema(description = "品牌")
private String brand;
@Schema(description = "型号")
private String model;
@Schema(description = "月租金")
private BigDecimal monthRent;
@Schema(description = "保证金")
private BigDecimal deposit;
@Schema(description = "是否已交车")
private Boolean isDelivered;
@Schema(description = "实际交车日期")
private java.time.LocalDateTime actualDeliveryDate;
@Schema(description = "交车人")
private String deliveryPerson;
}

View File

@@ -0,0 +1,60 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.asset.controller.admin.inspection.vo.InspectionRecordDetailVO;
import cn.iocoder.yudao.module.asset.controller.admin.inspection.vo.InspectionRecordItemUpdateReqVO;
import cn.iocoder.yudao.module.asset.service.inspection.InspectionRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 验车记录 Controller
*
* @author 芋道源码
*/
@Tag(name = "管理后台 - 验车记录管理")
@RestController
@RequestMapping("/asset/inspection-record")
@Validated
public class InspectionRecordController {
@Resource
private InspectionRecordService inspectionRecordService;
@GetMapping("/get")
@Operation(summary = "获得验车记录详情")
@Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('asset:inspection-record:query')")
public CommonResult<InspectionRecordDetailVO> getRecordDetail(@RequestParam("id") Long id) {
return success(inspectionRecordService.getRecordDetail(id));
}
@PutMapping("/update-item")
@Operation(summary = "更新验车记录检查项")
@PreAuthorize("@ss.hasPermission('asset:inspection-record:update')")
public CommonResult<Boolean> updateRecordItem(@Valid @RequestBody InspectionRecordItemUpdateReqVO updateReqVO) {
inspectionRecordService.updateRecordItem(updateReqVO);
return success(true);
}
@PostMapping("/complete")
@Operation(summary = "完成验车记录")
@Parameter(name = "id", description = "记录ID", required = true, example = "1")
@Parameter(name = "inspectorName", description = "检查人", required = true, example = "张三")
@PreAuthorize("@ss.hasPermission('asset:inspection-record:update')")
public CommonResult<Boolean> completeRecord(@RequestParam("id") Long id,
@RequestParam("inspectorName") String inspectorName) {
inspectionRecordService.completeRecord(id, inspectorName);
return success(true);
}
}

View File

@@ -0,0 +1,75 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.asset.controller.admin.inspection.vo.*;
import cn.iocoder.yudao.module.asset.convert.inspection.InspectionConvert;
import cn.iocoder.yudao.module.asset.dal.dataobject.inspection.InspectionTemplateDO;
import cn.iocoder.yudao.module.asset.service.inspection.InspectionTemplateService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 验车模板 Controller
*
* @author 芋道源码
*/
@Tag(name = "管理后台 - 验车模板管理")
@RestController
@RequestMapping("/asset/inspection-template")
@Validated
public class InspectionTemplateController {
@Resource
private InspectionTemplateService inspectionTemplateService;
@PostMapping("/create")
@Operation(summary = "创建验车模板")
@PreAuthorize("@ss.hasPermission('asset:inspection-template:create')")
public CommonResult<Long> createTemplate(@Valid @RequestBody InspectionTemplateSaveReqVO createReqVO) {
return success(inspectionTemplateService.createTemplate(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新验车模板")
@PreAuthorize("@ss.hasPermission('asset:inspection-template:update')")
public CommonResult<Boolean> updateTemplate(@Valid @RequestBody InspectionTemplateSaveReqVO updateReqVO) {
inspectionTemplateService.updateTemplate(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除验车模板")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:inspection-template:delete')")
public CommonResult<Boolean> deleteTemplate(@RequestParam("id") Long id) {
inspectionTemplateService.deleteTemplate(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得验车模板详情")
@Parameter(name = "id", description = "编号", required = true, example = "1")
@PreAuthorize("@ss.hasPermission('asset:inspection-template:query')")
public CommonResult<InspectionTemplateRespVO> getTemplate(@RequestParam("id") Long id) {
return success(inspectionTemplateService.getTemplate(id));
}
@GetMapping("/page")
@Operation(summary = "获得验车模板分页")
@PreAuthorize("@ss.hasPermission('asset:inspection-template:query')")
public CommonResult<PageResult<InspectionTemplateRespVO>> getTemplatePage(@Valid InspectionTemplatePageReqVO pageReqVO) {
PageResult<InspectionTemplateDO> pageResult = inspectionTemplateService.getTemplatePage(pageReqVO);
return success(InspectionConvert.INSTANCE.convertPage(pageResult));
}
}

View File

@@ -0,0 +1,94 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 验车记录详情 Response VO
*/
@Schema(description = "管理后台 - 验车记录详情 Response VO")
@Data
public class InspectionRecordDetailVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "记录编码", example = "BC-20260313-001")
private String recordCode;
@Schema(description = "模板ID", example = "1")
private Long templateId;
@Schema(description = "来源类型1=备车 2=交车 3=还车)", example = "1")
private Integer sourceType;
@Schema(description = "来源ID", example = "1")
private Long sourceId;
@Schema(description = "车辆ID", example = "1")
private Long vehicleId;
@Schema(description = "检查人", example = "张三")
private String inspectorName;
@Schema(description = "检查时间")
private LocalDateTime inspectionTime;
@Schema(description = "状态0=待检 1=检查中 2=已完成)", example = "0")
private Integer status;
@Schema(description = "总体结果1=通过 2=不通过 3=不适用)", example = "1")
private Integer overallResult;
@Schema(description = "备注")
private String remark;
@Schema(description = "克隆来源记录ID", example = "1")
private Long clonedFromId;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "检查项列表")
private List<InspectionRecordItemVO> items;
/**
* 验车记录检查项 VO
*/
@Schema(description = "验车记录检查项 VO")
@Data
public static class InspectionRecordItemVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "检查项编码", example = "BODY_PAINT")
private String itemCode;
@Schema(description = "分类", example = "外观检查")
private String category;
@Schema(description = "检查项名称", example = "车身漆面")
private String itemName;
@Schema(description = "输入类型", example = "checkbox")
private String inputType;
@Schema(description = "检查结果1=通过 2=不通过 3=不适用)", example = "1")
private Integer result;
@Schema(description = "检查值", example = "正常")
private String value;
@Schema(description = "备注")
private String remark;
@Schema(description = "图片URL列表")
private String imageUrls;
}
}

View File

@@ -0,0 +1,31 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import jakarta.validation.constraints.NotNull;
/**
* 验车记录检查项更新 Request VO
*/
@Schema(description = "管理后台 - 验车记录检查项更新 Request VO")
@Data
public class InspectionRecordItemUpdateReqVO {
@Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "主键ID不能为空")
private Long id;
@Schema(description = "检查结果1=通过 2=不通过 3=不适用)", example = "1")
private Integer result;
@Schema(description = "检查值", example = "正常")
private String value;
@Schema(description = "备注")
private String remark;
@Schema(description = "图片URL列表")
private String imageUrls;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
/**
* 验车模板检查项 VO
*/
@Schema(description = "管理后台 - 验车模板检查项 VO")
@Data
public class InspectionTemplateItemVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "外观检查")
@NotBlank(message = "分类不能为空")
private String category;
@Schema(description = "检查项名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "车身漆面")
@NotBlank(message = "检查项名称不能为空")
private String itemName;
@Schema(description = "检查项编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "BODY_PAINT")
@NotBlank(message = "检查项编码不能为空")
private String itemCode;
@Schema(description = "输入类型", example = "checkbox")
private String inputType;
@Schema(description = "排序", example = "0")
private Integer sort;
@Schema(description = "是否必填0=否 1=是)", example = "1")
private Integer required;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* 验车模板分页查询 Request VO
*/
@Schema(description = "管理后台 - 验车模板分页查询 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class InspectionTemplatePageReqVO extends PageParam {
@Schema(description = "模板编码", example = "TPL-BC-001")
private String code;
@Schema(description = "模板名称", example = "备车检查模板")
private String name;
@Schema(description = "业务类型1=备车 2=交车 3=还车)", example = "1")
private Integer bizType;
@Schema(description = "车辆类型", example = "重卡")
private String vehicleType;
@Schema(description = "状态0=禁用 1=启用)", example = "1")
private Integer status;
}

View File

@@ -0,0 +1,43 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 验车模板 Response VO
*/
@Schema(description = "管理后台 - 验车模板 Response VO")
@Data
public class InspectionTemplateRespVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "模板编码", example = "TPL-BC-001")
private String code;
@Schema(description = "模板名称", example = "备车检查模板")
private String name;
@Schema(description = "业务类型1=备车 2=交车 3=还车)", example = "1")
private Integer bizType;
@Schema(description = "车辆类型", example = "重卡")
private String vehicleType;
@Schema(description = "状态0=禁用 1=启用)", example = "1")
private Integer status;
@Schema(description = "备注", example = "备车检查模板")
private String remark;
@Schema(description = "创建时间")
private LocalDateTime createTime;
@Schema(description = "检查项列表")
private List<InspectionTemplateItemVO> items;
}

View File

@@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.asset.controller.admin.inspection.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import java.util.List;
/**
* 验车模板创建/更新 Request VO
*/
@Schema(description = "管理后台 - 验车模板创建/更新 Request VO")
@Data
public class InspectionTemplateSaveReqVO {
@Schema(description = "主键ID", example = "1")
private Long id;
@Schema(description = "模板编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "TPL-BC-001")
@NotBlank(message = "模板编码不能为空")
private String code;
@Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "备车检查模板")
@NotBlank(message = "模板名称不能为空")
private String name;
@Schema(description = "业务类型1=备车 2=交车 3=还车)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "业务类型不能为空")
private Integer bizType;
@Schema(description = "车辆类型", example = "重卡")
private String vehicleType;
@Schema(description = "状态0=禁用 1=启用)", example = "1")
private Integer status;
@Schema(description = "备注", example = "备车检查模板")
private String remark;
@Schema(description = "检查项列表")
@Valid
private List<InspectionTemplateItemVO> items;
}

View File

@@ -0,0 +1,80 @@
package cn.iocoder.yudao.module.asset.controller.admin.prepare;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.asset.controller.admin.prepare.vo.*;
import cn.iocoder.yudao.module.asset.dal.dataobject.prepare.VehiclePrepareDO;
import cn.iocoder.yudao.module.asset.service.prepare.VehiclePrepareService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 备车管理")
@RestController
@RequestMapping("/asset/vehicle-prepare")
@Validated
public class VehiclePrepareController {
@Resource
private VehiclePrepareService vehiclePrepareService;
@PostMapping("/create")
@Operation(summary = "创建备车记录")
@PreAuthorize("@ss.hasPermission('asset:vehicle-prepare:create')")
public CommonResult<Long> createVehiclePrepare(@Valid @RequestBody VehiclePrepareSaveReqVO createReqVO) {
return success(vehiclePrepareService.createVehiclePrepare(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新备车记录")
@PreAuthorize("@ss.hasPermission('asset:vehicle-prepare:update')")
public CommonResult<Boolean> updateVehiclePrepare(@Valid @RequestBody VehiclePrepareSaveReqVO updateReqVO) {
vehiclePrepareService.updateVehiclePrepare(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除备车记录")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:vehicle-prepare:delete')")
public CommonResult<Boolean> deleteVehiclePrepare(@RequestParam("id") Long id) {
vehiclePrepareService.deleteVehiclePrepare(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得备车记录")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:vehicle-prepare:query')")
public CommonResult<VehiclePrepareRespVO> getVehiclePrepare(@RequestParam("id") Long id) {
VehiclePrepareDO prepare = vehiclePrepareService.getVehiclePrepare(id);
return success(BeanUtils.toBean(prepare, VehiclePrepareRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得备车记录分页")
@PreAuthorize("@ss.hasPermission('asset:vehicle-prepare:query')")
public CommonResult<PageResult<VehiclePrepareRespVO>> getVehiclePreparePage(@Valid VehiclePreparePageReqVO pageReqVO) {
PageResult<VehiclePrepareDO> pageResult = vehiclePrepareService.getVehiclePreparePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, VehiclePrepareRespVO.class));
}
@PutMapping("/complete")
@Operation(summary = "完成备车")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('asset:vehicle-prepare:update')")
public CommonResult<Boolean> completeVehiclePrepare(@RequestParam("id") Long id) {
vehiclePrepareService.completeVehiclePrepare(id);
return success(true);
}
}

View File

@@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.asset.controller.admin.prepare.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 备车记录分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class VehiclePreparePageReqVO extends PageParam {
@Schema(description = "车牌号")
private String plateNo;
@Schema(description = "VIN码")
private String vin;
@Schema(description = "合同编码")
private String contractCode;
@Schema(description = "车辆类型")
private String vehicleType;
@Schema(description = "品牌")
private String brand;
@Schema(description = "停车场")
private String parkingLot;
@Schema(description = "状态")
private Integer status;
@Schema(description = "备车日期")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] completeTime;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

Some files were not shown because too many files have changed in this diff Show More