From 594912d2b896c8038f7de810a8d3df26e31df918 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Fri, 13 Mar 2026 10:27:46 +0800 Subject: [PATCH] feat(frontend): add inspection/replacement APIs and shared InspectionForm component - Create inspection.ts with template CRUD and record APIs - Create vehicle-replacement.ts with full CRUD + BPM approval APIs - Update return-order.ts with new fields and 5 new endpoints - Create shared InspectionForm.vue component with category grouping, multi-input-type rendering, auto-save, and image upload - Update barrel exports in index.ts Co-Authored-By: Claude Opus 4.6 --- apps/web-antd/src/api/asset/index.ts | 13 + apps/web-antd/src/api/asset/inspection.ts | 100 ++++++ apps/web-antd/src/api/asset/return-order.ts | 121 ++++++++ .../src/api/asset/vehicle-replacement.ts | 82 +++++ .../views/asset/components/InspectionForm.vue | 290 ++++++++++++++++++ .../src/views/asset/return-order/index.vue | 183 +++++++++++ 6 files changed, 789 insertions(+) create mode 100644 apps/web-antd/src/api/asset/index.ts create mode 100644 apps/web-antd/src/api/asset/inspection.ts create mode 100644 apps/web-antd/src/api/asset/return-order.ts create mode 100644 apps/web-antd/src/api/asset/vehicle-replacement.ts create mode 100644 apps/web-antd/src/views/asset/components/InspectionForm.vue create mode 100644 apps/web-antd/src/views/asset/return-order/index.vue diff --git a/apps/web-antd/src/api/asset/index.ts b/apps/web-antd/src/api/asset/index.ts new file mode 100644 index 0000000..1062b9a --- /dev/null +++ b/apps/web-antd/src/api/asset/index.ts @@ -0,0 +1,13 @@ +export * from './parking'; +export * from './customer'; +export * from './supplier'; +export * from './vehicle-model'; +export * from './vehicle-registration'; +export * from './contract'; +export * from './vehicle-prepare'; +export * from './delivery-task'; +export * from './delivery-order'; +export * from './return-order'; +export * from './vehicle'; +export * from './inspection'; +export * from './vehicle-replacement'; diff --git a/apps/web-antd/src/api/asset/inspection.ts b/apps/web-antd/src/api/asset/inspection.ts new file mode 100644 index 0000000..0fd0c40 --- /dev/null +++ b/apps/web-antd/src/api/asset/inspection.ts @@ -0,0 +1,100 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace InspectionApi { + export interface Template { + id?: number; + code: string; + name: string; + bizType: number; + vehicleType?: string; + status: number; + remark?: string; + items?: TemplateItem[]; + } + + export interface TemplateItem { + id?: number; + category: string; + itemName: string; + itemCode: string; + inputType: string; + sort: number; + required: number; + } + + export interface RecordDetail { + id: number; + recordCode: string; + templateId: number; + sourceType: number; + sourceId: number; + vehicleId: number; + inspectorName?: string; + inspectionTime?: string; + status: number; + overallResult?: number; + remark?: string; + items: RecordItem[]; + } + + export interface RecordItem { + id: number; + itemCode: string; + category: string; + itemName: string; + inputType: string; + result?: number; + value?: string; + remark?: string; + imageUrls?: string; + } +} + +export function getInspectionTemplatePage(params: PageParam) { + return requestClient.get>( + '/asset/inspection-template/page', + { params }, + ); +} + +export function getInspectionTemplate(id: number) { + return requestClient.get( + `/asset/inspection-template/get?id=${id}`, + ); +} + +export function createInspectionTemplate(data: InspectionApi.Template) { + return requestClient.post('/asset/inspection-template/create', data); +} + +export function updateInspectionTemplate(data: InspectionApi.Template) { + return requestClient.put('/asset/inspection-template/update', data); +} + +export function deleteInspectionTemplate(id: number) { + return requestClient.delete(`/asset/inspection-template/delete?id=${id}`); +} + +export function getInspectionRecord(id: number) { + return requestClient.get( + `/asset/inspection-record/get?id=${id}`, + ); +} + +export function updateInspectionRecordItem(data: { + id: number; + result?: number; + value?: string; + remark?: string; + imageUrls?: string; +}) { + return requestClient.put('/asset/inspection-record/update-item', data); +} + +export function completeInspection(id: number, inspectorName: string) { + return requestClient.post( + `/asset/inspection-record/complete?id=${id}&inspectorName=${inspectorName}`, + ); +} diff --git a/apps/web-antd/src/api/asset/return-order.ts b/apps/web-antd/src/api/asset/return-order.ts new file mode 100644 index 0000000..7bfd5dc --- /dev/null +++ b/apps/web-antd/src/api/asset/return-order.ts @@ -0,0 +1,121 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace AssetReturnOrderApi { + export interface ReturnOrderVehicle { + id?: number; + vehicleId?: number; + plateNo?: string; + vin?: string; + brand?: string; + model?: string; + returnMileage?: number; + returnHydrogenLevel?: number; + deliveryHydrogenLevel?: number; + hydrogenDiff?: number; + hydrogenUnitPrice?: number; + hydrogenRefundAmount?: number; + checkList?: string; + defectPhotos?: string; + vehicleDamageFee?: number; + toolDamageFee?: number; + unpaidMaintenanceFee?: number; + unpaidRepairFee?: number; + otherFee?: number; + inspectionRecordId?: number; + } + + export interface ReturnOrder { + id?: number; + orderCode?: string; + contractId: number; + contractCode?: string; + projectName?: string; + customerId?: number; + customerName?: string; + returnDate: string; + returnPerson: string; + returnLocation?: string; + returnReason?: string; + returnReasonDesc?: string; + totalRefundAmount?: number; + depositRefund?: number; + hydrogenRefund?: number; + otherCharges?: number; + returnPhotos?: string; + sourceType?: number; + sourceId?: number; + deliveryOrderId?: number; + status?: number; + approvalStatus?: number; + vehicles?: ReturnOrderVehicle[]; + createTime?: Date; + } +} + +export function getReturnOrderPage(params: PageParam) { + return requestClient.get>( + '/asset/return-order/page', + { params }, + ); +} + +export function getReturnOrder(id: number) { + return requestClient.get( + `/asset/return-order/get?id=${id}`, + ); +} + +export function createReturnOrder(data: AssetReturnOrderApi.ReturnOrder) { + return requestClient.post('/asset/return-order/create', data); +} + +export function updateReturnOrder(data: AssetReturnOrderApi.ReturnOrder) { + return requestClient.put('/asset/return-order/update', data); +} + +export function deleteReturnOrder(id: number) { + return requestClient.delete(`/asset/return-order/delete?id=${id}`); +} + +export function completeReturnOrderInspection(id: number) { + return requestClient.put(`/asset/return-order/complete-inspection?id=${id}`); +} + +export function settleReturnOrder(id: number) { + return requestClient.put(`/asset/return-order/settle?id=${id}`); +} + +export function createReturnOrderFromDelivery( + deliveryOrderId: number, + vehicleIds: number[], +) { + return requestClient.post('/asset/return-order/create-from-delivery', { + deliveryOrderId, + vehicleIds, + }); +} + +export function startVehicleInspection(returnOrderVehicleId: number) { + return requestClient.post( + `/asset/return-order/start-vehicle-inspection?returnOrderVehicleId=${returnOrderVehicleId}`, + ); +} + +export function completeVehicleInspection(returnOrderVehicleId: number) { + return requestClient.post( + `/asset/return-order/complete-vehicle-inspection?returnOrderVehicleId=${returnOrderVehicleId}`, + ); +} + +export function submitReturnOrderApproval(id: number) { + return requestClient.post(`/asset/return-order/submit-approval?id=${id}`, {}); +} + +export function withdrawReturnOrderApproval(id: number) { + return requestClient.post( + `/asset/return-order/withdraw-approval?id=${id}`, + {}, + ); +} diff --git a/apps/web-antd/src/api/asset/vehicle-replacement.ts b/apps/web-antd/src/api/asset/vehicle-replacement.ts new file mode 100644 index 0000000..2ad4754 --- /dev/null +++ b/apps/web-antd/src/api/asset/vehicle-replacement.ts @@ -0,0 +1,82 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace AssetVehicleReplacementApi { + export interface VehicleReplacement { + id?: number; + replacementCode?: string; + replacementType: number; + contractId?: number; + contractCode?: string; + projectName?: string; + customerId?: number; + customerName?: string; + originalVehicleId?: number; + originalPlateNo?: string; + originalVin?: string; + newVehicleId?: number; + newPlateNo?: string; + newVin?: string; + deliveryOrderId?: number; + replacementReason?: string; + expectedDate?: string; + actualDate?: string; + returnDate?: string; + status?: number; + approvalStatus?: number; + bpmInstanceId?: string; + remark?: string; + creator?: string; + createTime?: Date; + } +} + +export function getVehicleReplacementPage(params: PageParam) { + return requestClient.get< + PageResult + >('/asset/vehicle-replacement/page', { params }); +} + +export function getVehicleReplacement(id: number) { + return requestClient.get( + `/asset/vehicle-replacement/get?id=${id}`, + ); +} + +export function createVehicleReplacement( + data: AssetVehicleReplacementApi.VehicleReplacement, +) { + return requestClient.post('/asset/vehicle-replacement/create', data); +} + +export function updateVehicleReplacement( + data: AssetVehicleReplacementApi.VehicleReplacement, +) { + return requestClient.put('/asset/vehicle-replacement/update', data); +} + +export function deleteVehicleReplacement(id: number) { + return requestClient.delete(`/asset/vehicle-replacement/delete?id=${id}`); +} + +export function submitVehicleReplacementApproval(id: number) { + return requestClient.post( + `/asset/vehicle-replacement/submit-approval?id=${id}`, + {}, + ); +} + +export function withdrawVehicleReplacementApproval(id: number) { + return requestClient.post( + `/asset/vehicle-replacement/withdraw-approval?id=${id}`, + {}, + ); +} + +export function confirmVehicleReplacementReturn(id: number) { + return requestClient.post( + `/asset/vehicle-replacement/confirm-return?id=${id}`, + {}, + ); +} diff --git a/apps/web-antd/src/views/asset/components/InspectionForm.vue b/apps/web-antd/src/views/asset/components/InspectionForm.vue new file mode 100644 index 0000000..35ad1de --- /dev/null +++ b/apps/web-antd/src/views/asset/components/InspectionForm.vue @@ -0,0 +1,290 @@ + + + diff --git a/apps/web-antd/src/views/asset/return-order/index.vue b/apps/web-antd/src/views/asset/return-order/index.vue new file mode 100644 index 0000000..be4fc69 --- /dev/null +++ b/apps/web-antd/src/views/asset/return-order/index.vue @@ -0,0 +1,183 @@ + + +