diff --git a/apps/web-antd/src/api/energy/account.ts b/apps/web-antd/src/api/energy/account.ts new file mode 100644 index 0000000..99442bc --- /dev/null +++ b/apps/web-antd/src/api/energy/account.ts @@ -0,0 +1,111 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace EnergyAccountApi { + export interface Account { + id?: number; + customerId?: number; + customerName?: string; + balance?: number; + initBalance?: number; + accumulatedRecharge?: number; + accumulatedConsume?: number; + reminderThreshold?: number; + accountStatus?: number; + lastRechargeDate?: string; + version?: number; + createTime?: string; + } + + export interface AccountSimple { + id: number; + customerId: number; + customerName: string; + } + + export interface Summary { + totalCount: number; + totalBalance: number; + totalRecharge: number; + warningCount: number; + } + + export interface ProjectAccount { + id?: number; + accountId?: number; + contractId?: number; + projectName?: string; + contractCode?: string; + balance?: number; + accumulatedRecharge?: number; + accumulatedConsume?: number; + } + + export interface Flow { + id?: number; + accountId?: number; + flowType?: number; + bizType?: number; + amount?: number; + balanceBefore?: number; + balanceAfter?: number; + bizId?: number; + bizCode?: string; + remark?: string; + operatorId?: number; + createTime?: string; + } +} + +export function getAccountPage(params: PageParam) { + return requestClient.get>( + '/energy/account/page', + { params }, + ); +} + +export function getAccount(id: number) { + return requestClient.get( + '/energy/account/get', + { params: { id } }, + ); +} + +export function getAccountSummary() { + return requestClient.get('/energy/account/summary'); +} + +export function getAccountSimpleList() { + return requestClient.get('/energy/account/simple-list'); +} + +export function rechargeAccount(customerId: number, amount: number, remark?: string) { + return requestClient.post('/energy/account/recharge', null, { + params: { customerId, amount, remark }, + }); +} + +export function updateThreshold(id: number, threshold: number) { + return requestClient.put('/energy/account/update-threshold', null, { + params: { id, threshold }, + }); +} + +export function getProjectAccountList(accountId: number) { + return requestClient.get( + '/energy/account/project/list', + { params: { accountId } }, + ); +} + +export function getFlowPage(params: PageParam) { + return requestClient.get>( + '/energy/account/flow/page', + { params }, + ); +} + +export function exportAccount(params: any) { + return requestClient.download('/energy/account/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/energy/bill.ts b/apps/web-antd/src/api/energy/bill.ts new file mode 100644 index 0000000..790d33d --- /dev/null +++ b/apps/web-antd/src/api/energy/bill.ts @@ -0,0 +1,124 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import type { EnergyHydrogenDetailApi } from './hydrogen-detail'; + +import { requestClient } from '#/api/request'; + +export namespace EnergyBillApi { + export interface Bill { + id?: number; + billCode?: string; + energyType?: number; + customerId?: number; + customerName?: string; + contractId?: number; + stationId?: number; + stationName?: string; + cooperationType?: number; + billPeriodStart?: string; + billPeriodEnd?: string; + receivableAmount?: number; + actualAmount?: number; + adjustmentAmount?: number; + paidAmount?: number; + totalQuantity?: number; + detailCount?: number; + status?: number; + auditStatus?: number; + submitStatus?: number; + paymentStatus?: number; + auditRemark?: string; + auditTime?: string; + generateTime?: string; + createTime?: string; + } + + export interface GenerateReq { + customerId: number; + contractId: number; + stationId: number; + billPeriodStart: string; + billPeriodEnd: string; + energyType?: number; + } + + export interface Adjustment { + id?: number; + billId?: number; + detailId?: number; + adjustmentType?: number; + amount?: number; + reason?: string; + attachmentUrls?: string; + operatorId?: number; + operatorName?: string; + operateTime?: string; + createTime?: string; + } +} + +export function getBillPage(params: PageParam) { + return requestClient.get>( + '/energy/bill/page', + { params }, + ); +} + +export function getBill(id: number) { + return requestClient.get( + '/energy/bill/get', + { params: { id } }, + ); +} + +export function generateBill(data: EnergyBillApi.GenerateReq) { + return requestClient.post('/energy/bill/generate', data); +} + +export function batchGenerateByPeriod(billPeriod: string) { + return requestClient.post>( + '/energy/bill/batch-generate-by-period', + null, + { params: { billPeriod } }, + ); +} + +export function updateBill(data: any) { + return requestClient.put('/energy/bill/update', data); +} + +export function auditBill(id: number, approved: boolean, remark?: string) { + return requestClient.post('/energy/bill/audit', null, { + params: { id, approved, remark }, + }); +} + +export function deleteBill(id: number) { + return requestClient.delete('/energy/bill/delete', { params: { id } }); +} + +export function exportBill(params: any) { + return requestClient.download('/energy/bill/export-excel', { params }); +} + +export function getBillDetailList(billId: number) { + return requestClient.get( + '/energy/bill/detail-list', + { params: { billId } }, + ); +} + +export function getAdjustmentList(billId: number) { + return requestClient.get( + '/energy/bill/adjustment/list', + { params: { billId } }, + ); +} + +export function createAdjustment(data: EnergyBillApi.Adjustment) { + return requestClient.post('/energy/bill/adjustment/create', data); +} + +export function deleteAdjustment(id: number) { + return requestClient.delete('/energy/bill/adjustment/delete', { params: { id } }); +} diff --git a/apps/web-antd/src/api/energy/hydrogen-detail.ts b/apps/web-antd/src/api/energy/hydrogen-detail.ts new file mode 100644 index 0000000..1a8d477 --- /dev/null +++ b/apps/web-antd/src/api/energy/hydrogen-detail.ts @@ -0,0 +1,62 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace EnergyHydrogenDetailApi { + export interface Detail { + id?: number; + stationId?: number; + stationName?: string; + customerId?: number; + customerName?: string; + contractId?: number; + vehicleId?: number; + plateNumber?: string; + hydrogenDate?: string; + hydrogenQuantity?: number; + costPrice?: number; + costAmount?: number; + customerPrice?: number; + customerAmount?: number; + auditStatus?: number; + deductionStatus?: number; + settlementStatus?: number; + billId?: number; + remark?: string; + createTime?: string; + } +} + +export function getHydrogenDetailPage(params: PageParam) { + return requestClient.get>( + '/energy/hydrogen-detail/page', + { params }, + ); +} + +export function getHydrogenDetail(id: number) { + return requestClient.get( + '/energy/hydrogen-detail/get', + { params: { id } }, + ); +} + +export function updateHydrogenDetail(data: EnergyHydrogenDetailApi.Detail) { + return requestClient.put('/energy/hydrogen-detail/update', data); +} + +export function auditHydrogenDetail(id: number, approved: boolean, remark?: string) { + return requestClient.post('/energy/hydrogen-detail/audit', null, { + params: { id, approved, remark }, + }); +} + +export function batchAuditHydrogenDetail(ids: number[], approved: boolean, remark?: string) { + return requestClient.post('/energy/hydrogen-detail/batch-audit', null, { + params: { ids: ids.join(','), approved, remark }, + }); +} + +export function exportHydrogenDetail(params: any) { + return requestClient.download('/energy/hydrogen-detail/export-excel', { params }); +} diff --git a/apps/web-antd/src/api/energy/hydrogen-record.ts b/apps/web-antd/src/api/energy/hydrogen-record.ts new file mode 100644 index 0000000..f975953 --- /dev/null +++ b/apps/web-antd/src/api/energy/hydrogen-record.ts @@ -0,0 +1,115 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace EnergyHydrogenRecordApi { + export interface Record { + id?: number; + stationId?: number; + stationName?: string; + plateNumber?: string; + hydrogenDate?: string; + hydrogenQuantity?: number; + unitPrice?: number; + amount?: number; + mileage?: number; + sourceType?: number; + matchStatus?: number; + vehicleId?: number; + customerId?: number; + uploadBatchNo?: string; + createTime?: string; + } + + export interface ImportPreview { + batchNo: string; + totalCount: number; + validCount: number; + duplicateCount: number; + errorCount: number; + records: RecordPreviewItem[]; + duplicates: RecordPreviewItem[]; + errors: ImportErrorItem[]; + } + + export interface RecordPreviewItem { + rowNum: number; + plateNumber: string; + hydrogenDate: string; + hydrogenQuantity: number; + unitPrice: number; + amount: number; + mileage: number; + isDuplicate: boolean; + } + + export interface ImportErrorItem { + rowNum: number; + reason: string; + } + + export interface ImportProgress { + current: number; + total: number; + status: string; + } +} + +export function getHydrogenRecordPage(params: PageParam) { + return requestClient.get>( + '/energy/hydrogen-record/page', + { params }, + ); +} + +export function getHydrogenRecord(id: number) { + return requestClient.get( + '/energy/hydrogen-record/get', + { params: { id } }, + ); +} + +export function createHydrogenRecord(data: EnergyHydrogenRecordApi.Record) { + return requestClient.post('/energy/hydrogen-record/create', data); +} + +export function updateHydrogenRecord(data: EnergyHydrogenRecordApi.Record) { + return requestClient.put('/energy/hydrogen-record/update', data); +} + +export function deleteHydrogenRecord(id: number) { + return requestClient.delete('/energy/hydrogen-record/delete', { params: { id } }); +} + +export function exportHydrogenRecord(params: any) { + return requestClient.download('/energy/hydrogen-record/export-excel', { params }); +} + +export function importPreview(stationId: number, file: File) { + const formData = new FormData(); + formData.append('file', file); + formData.append('stationId', String(stationId)); + return requestClient.post( + '/energy/hydrogen-record/import-preview', + formData, + ); +} + +export function importConfirm(batchNo: string, duplicateStrategy: string) { + return requestClient.post>( + '/energy/hydrogen-record/import-confirm', + null, + { params: { batchNo, duplicateStrategy } }, + ); +} + +export function getImportProgress(batchNo: string) { + return requestClient.get( + '/energy/hydrogen-record/import-progress', + { params: { batchNo } }, + ); +} + +export function batchMatch() { + return requestClient.post>('/energy/hydrogen-record/batch-match'); +} diff --git a/apps/web-antd/src/api/energy/station-config.ts b/apps/web-antd/src/api/energy/station-config.ts new file mode 100644 index 0000000..5cf318a --- /dev/null +++ b/apps/web-antd/src/api/energy/station-config.ts @@ -0,0 +1,43 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace EnergyStationConfigApi { + export interface Config { + id?: number; + stationId?: number; + stationName?: string; + autoDeduct?: boolean; + autoMatch?: boolean; + cooperationType?: number; + remark?: string; + createTime?: string; + } + + export interface ConfigSimple { + id: number; + stationId: number; + stationName: string; + } +} + +export function getStationConfigPage(params: PageParam) { + return requestClient.get>( + '/energy/station-config/page', + { params }, + ); +} + +export function getStationConfigSimpleList() { + return requestClient.get( + '/energy/station-config/simple-list', + ); +} + +export function createStationConfig(data: EnergyStationConfigApi.Config) { + return requestClient.post('/energy/station-config/create', data); +} + +export function updateStationConfig(data: EnergyStationConfigApi.Config) { + return requestClient.put('/energy/station-config/update', data); +} diff --git a/apps/web-antd/src/api/energy/station-price.ts b/apps/web-antd/src/api/energy/station-price.ts new file mode 100644 index 0000000..880a1e1 --- /dev/null +++ b/apps/web-antd/src/api/energy/station-price.ts @@ -0,0 +1,38 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace EnergyStationPriceApi { + export interface Price { + id?: number; + stationId?: number; + stationName?: string; + customerId?: number; + customerName?: string; + costPrice?: number; + customerPrice?: number; + effectiveDate?: string; + expiryDate?: string; + status?: number; + createTime?: string; + } +} + +export function getStationPricePage(params: PageParam) { + return requestClient.get>( + '/energy/station-price/page', + { params }, + ); +} + +export function createStationPrice(data: EnergyStationPriceApi.Price) { + return requestClient.post('/energy/station-price/create', data); +} + +export function updateStationPrice(data: EnergyStationPriceApi.Price) { + return requestClient.put('/energy/station-price/update', data); +} + +export function deleteStationPrice(id: number) { + return requestClient.delete('/energy/station-price/delete', { params: { id } }); +} diff --git a/apps/web-antd/src/router/routes/modules/energy.ts b/apps/web-antd/src/router/routes/modules/energy.ts new file mode 100644 index 0000000..38f62bb --- /dev/null +++ b/apps/web-antd/src/router/routes/modules/energy.ts @@ -0,0 +1,54 @@ +import type { RouteRecordRaw } from 'vue-router'; + +const routes: RouteRecordRaw[] = [ + { + path: '/energy', + name: 'EnergyCenter', + meta: { + title: '能源管理', + icon: 'lucide:zap', + keepAlive: true, + hideInMenu: true, + }, + children: [ + { + path: 'hydrogen-record', + name: 'EnergyHydrogenRecord', + component: () => import('#/views/energy/hydrogen-record/index.vue'), + }, + { + path: 'hydrogen-detail', + name: 'EnergyHydrogenDetail', + component: () => import('#/views/energy/hydrogen-detail/index.vue'), + }, + { + path: 'bill', + name: 'EnergyBill', + component: () => import('#/views/energy/bill/index.vue'), + }, + { + path: String.raw`bill/detail/:id(\d+)`, + name: 'EnergyBillDetail', + meta: { title: '账单详情', activePath: '/energy/bill' }, + component: () => import('#/views/energy/bill/detail.vue'), + }, + { + path: 'account', + name: 'EnergyAccount', + component: () => import('#/views/energy/account/index.vue'), + }, + { + path: 'station-price', + name: 'EnergyStationPrice', + component: () => import('#/views/energy/station-price/index.vue'), + }, + { + path: 'station-config', + name: 'EnergyStationConfig', + component: () => import('#/views/energy/station-config/index.vue'), + }, + ], + }, +]; + +export default routes;