diff --git a/.env.dev b/.env.dev new file mode 100644 index 0000000..1eb217a --- /dev/null +++ b/.env.dev @@ -0,0 +1,38 @@ +# 开发环境:本地只启动前端项目,依赖开发环境(后端、APP) +NODE_ENV=production + +VITE_DEV=true + +# 请求路径 +VITE_BASE_URL='http://localhost:48080' +#VITE_BASE_URL='https://test.zmingzhikeji.cn' + +# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务 +VITE_UPLOAD_TYPE=client + +# 上传路径 +VITE_UPLOAD_URL='https://www.zmingzhikeji.cn/admin-api/infra/file/upload' + +# 接口地址 +VITE_API_URL=/admin-api + +# 是否删除debugger +VITE_DROP_DEBUGGER=false + +# 是否删除console.log +VITE_DROP_CONSOLE=false + +# 是否sourcemap +VITE_SOURCEMAP=true + +# 打包路径 +VITE_BASE_PATH=/ + +# 输出路径 +VITE_OUT_DIR=dist + +# 商城H5会员端域名 +VITE_MALL_H5_DOMAIN='http://mall.yudao.iocoder.cn' + +# 验证码的开关 +VITE_APP_CAPTCHA_ENABLE=true diff --git a/src/api/car/renewalorder/index.ts b/src/api/car/renewalorder/index.ts new file mode 100644 index 0000000..322d6c8 --- /dev/null +++ b/src/api/car/renewalorder/index.ts @@ -0,0 +1,68 @@ +import request from '@/config/axios' + +// 车辆续保订单 VO +export interface RenewalOrderVO { + id: number // 主键ID + carBrand: string // 汽车品牌 + carModel: string // 车型 + licensePlate: string // 车牌号 + factoryModel: string // 厂牌型号 + invoiceAmount: number // 发票金额 + purchaseMileage: number // 购买时公里数 + engineNo: string // 发动机号 + vin: string // 车架号 + invoiceDate: Date // 发票日期 + invoiceUrl: string // 发票图片地址 + serviceBuyer: string // 服务购买方 + carBuyer: string // 车辆购买方 + certType: string // 证件类型 + mobile: string // 联系电话 + certNo: string // 证件号码 + contactAddress: string // 联系地址 + memberEmail: string // 会员邮箱 + storeId: number // 门店ID(关联 tire_store.id) + storeName?: string // 门店名称 + productId: number // 续保产品ID(关联 car_renewal_product.id) + serviceProduct: string // 服务产品 + productValidity: string // 产品时效 + originalWarrantyYears: string // 原厂质保时长 + originalWarrantyMileage: string // 原厂质保里程 + productFee: number // 产品费用 + settlementMethod: string // 结算方式 + remark: string // 备注 + inputUser: string // 录单人 + contractRemark: string // 合同备注 +} + +// 车辆续保订单 API +export const RenewalOrderApi = { + // 查询车辆续保订单分页 + getRenewalOrderPage: async (params: any) => { + return await request.get({ url: `/car/renewal-order/page`, params }) + }, + + // 查询车辆续保订单详情 + getRenewalOrder: async (id: number) => { + return await request.get({ url: `/car/renewal-order/get?id=` + id }) + }, + + // 新增车辆续保订单 + createRenewalOrder: async (data: RenewalOrderVO) => { + return await request.post({ url: `/car/renewal-order/create`, data }) + }, + + // 修改车辆续保订单 + updateRenewalOrder: async (data: RenewalOrderVO) => { + return await request.put({ url: `/car/renewal-order/update`, data }) + }, + + // 删除车辆续保订单 + deleteRenewalOrder: async (id: number) => { + return await request.delete({ url: `/car/renewal-order/delete?id=` + id }) + }, + + // 导出车辆续保订单 Excel + exportRenewalOrder: async (params) => { + return await request.download({ url: `/car/renewal-order/export-excel`, params }) + } +} \ No newline at end of file diff --git a/src/api/car/renewalproduct/index.ts b/src/api/car/renewalproduct/index.ts new file mode 100644 index 0000000..1be942a --- /dev/null +++ b/src/api/car/renewalproduct/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +// 车辆续保产品信息 VO +export interface RenewalProductVO { + id: number // 主键ID + productName: string // 产品名称 + productContent: string // 产品内容 + productType: string // 产品类别(car_renewal_product_type:00 无忧,01 延保) + remark: string // 备注 +} + +// 车辆续保产品信息 API +export const RenewalProductApi = { + // 查询车辆续保产品信息分页 + getRenewalProductPage: async (params: any) => { + return await request.get({ url: `/car/renewal-product/page`, params }) + }, + + // 查询车辆续保产品信息详情 + getRenewalProduct: async (id: number) => { + return await request.get({ url: `/car/renewal-product/get?id=` + id }) + }, + + // 新增车辆续保产品信息 + createRenewalProduct: async (data: RenewalProductVO) => { + return await request.post({ url: `/car/renewal-product/create`, data }) + }, + + // 修改车辆续保产品信息 + updateRenewalProduct: async (data: RenewalProductVO) => { + return await request.put({ url: `/car/renewal-product/update`, data }) + }, + + // 删除车辆续保产品信息 + deleteRenewalProduct: async (id: number) => { + return await request.delete({ url: `/car/renewal-product/delete?id=` + id }) + }, + + // 导出车辆续保产品信息 Excel + exportRenewalProduct: async (params) => { + return await request.download({ url: `/car/renewal-product/export-excel`, params }) + } +} diff --git a/src/views/Home/Index2.vue b/src/views/Home/Index2.vue new file mode 100644 index 0000000..c34754c --- /dev/null +++ b/src/views/Home/Index2.vue @@ -0,0 +1,604 @@ + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + + + + + + + + + + + + + + 总订单金额 + + + + + + + + + + + + + + + + + + + + + + 总订单数 + + + + + + + + + + + + + + + + + + + + + + 平均订单金额 + + + + + + + + + + + + + + + + + + + + + + 活跃门店数 + + + + + + + + + + + + + + + + + + 门店销售统计 + + + + + + + + + + + + + 业务员销售排行 + + + + + + + + + + + + + 销售趋势分析 + + + + + + + + + + + + diff --git a/src/views/car/renewalorder/RenewalOrderForm.vue b/src/views/car/renewalorder/RenewalOrderForm.vue new file mode 100644 index 0000000..6474e49 --- /dev/null +++ b/src/views/car/renewalorder/RenewalOrderForm.vue @@ -0,0 +1,438 @@ + + + + 车辆信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 购买方信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 产品信息 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 其他信息 + + + + + + + + + + + + + + + + + 确 定 + 取 消 + + + + \ No newline at end of file diff --git a/src/views/car/renewalorder/components/SalesTrendChart.vue b/src/views/car/renewalorder/components/SalesTrendChart.vue new file mode 100644 index 0000000..54e7638 --- /dev/null +++ b/src/views/car/renewalorder/components/SalesTrendChart.vue @@ -0,0 +1,160 @@ + + + + + 销售趋势分析 + + + + + + + + + diff --git a/src/views/car/renewalorder/components/SalespersonOrderRateAnalysis.vue b/src/views/car/renewalorder/components/SalespersonOrderRateAnalysis.vue new file mode 100644 index 0000000..50b4d6b --- /dev/null +++ b/src/views/car/renewalorder/components/SalespersonOrderRateAnalysis.vue @@ -0,0 +1,85 @@ + + + + + 业务员开单率分析 + + + + + + + + + {{ scope.row.averageOrderDays ? scope.row.averageOrderDays + '天' : '-' }} + + + + + {{ scope.row.orderRate30Days ? (scope.row.orderRate30Days * 100).toFixed(2) + '%' : '-' }} + + + + + + + {{ scope.row.lastOrderDays !== null ? scope.row.lastOrderDays + '天' : '-' }} + + + + + + + + diff --git a/src/views/car/renewalorder/components/SalespersonRank.vue b/src/views/car/renewalorder/components/SalespersonRank.vue new file mode 100644 index 0000000..62846da --- /dev/null +++ b/src/views/car/renewalorder/components/SalespersonRank.vue @@ -0,0 +1,125 @@ + + + + + 业务员销售排行 + + + + + + + + + + + + + + + + + + diff --git a/src/views/car/renewalorder/components/StoreAnalysis.vue b/src/views/car/renewalorder/components/StoreAnalysis.vue new file mode 100644 index 0000000..d9a2732 --- /dev/null +++ b/src/views/car/renewalorder/components/StoreAnalysis.vue @@ -0,0 +1,84 @@ + + + + + 门店分析数据 + + + + + + + + {{ scope.row.averageOrderDays ? scope.row.averageOrderDays + '天' : '-' }} + + + + + {{ scope.row.orderRate30Days ? (scope.row.orderRate30Days * 100).toFixed(2) + '%' : '-' }} + + + + + + + {{ scope.row.lastOrderDays !== null ? scope.row.lastOrderDays + '天' : '-' }} + + + + + + + + diff --git a/src/views/car/renewalorder/components/StoreSalesStatistics.vue b/src/views/car/renewalorder/components/StoreSalesStatistics.vue new file mode 100644 index 0000000..8048fce --- /dev/null +++ b/src/views/car/renewalorder/components/StoreSalesStatistics.vue @@ -0,0 +1,138 @@ + + + + + 门店销售统计 + + + + + + + + + + + + + + {{ scope.row.averageOrderDays ? scope.row.averageOrderDays + '天' : '-' }} + + + + + {{ scope.row.orderRate30Days ? (scope.row.orderRate30Days * 100).toFixed(2) + '%' : '-' }} + + + + + {{ scope.row.lastOrderDays !== null ? scope.row.lastOrderDays + '天' : '-' }} + + + + + + + diff --git a/src/views/car/renewalorder/components/SummaryCard.vue b/src/views/car/renewalorder/components/SummaryCard.vue new file mode 100644 index 0000000..0cbe650 --- /dev/null +++ b/src/views/car/renewalorder/components/SummaryCard.vue @@ -0,0 +1,41 @@ + + + + + {{ title }} + + {{ formatValue(value) }} + + + + + + + + + + diff --git a/src/views/car/renewalorder/dashboard.vue b/src/views/car/renewalorder/dashboard.vue new file mode 100644 index 0000000..5894b67 --- /dev/null +++ b/src/views/car/renewalorder/dashboard.vue @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/views/car/renewalorder/index.vue b/src/views/car/renewalorder/index.vue new file mode 100644 index 0000000..20ee2ff --- /dev/null +++ b/src/views/car/renewalorder/index.vue @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + 新增 + + + 导出 + + + + + + + + + + + + + {{ scope.row.licensePlate }} + + - + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + 编辑 + + + 删除 + + + + + + + + + + + + + + + diff --git a/src/views/car/renewalproduct/RenewalProductForm.vue b/src/views/car/renewalproduct/RenewalProductForm.vue new file mode 100644 index 0000000..63b1e7e --- /dev/null +++ b/src/views/car/renewalproduct/RenewalProductForm.vue @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 确 定 + 取 消 + + + + diff --git a/src/views/car/renewalproduct/index.vue b/src/views/car/renewalproduct/index.vue new file mode 100644 index 0000000..afb7c1f --- /dev/null +++ b/src/views/car/renewalproduct/index.vue @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + 搜索 + 重置 + + 新增 + + + 导出 + + + + + + + + + + + + + + + + + + + + + + 编辑 + + + 删除 + + + + + + + + + + + + +