From 96bd3077e10ee37baecca5c7a0e474634db72993 Mon Sep 17 00:00:00 2001 From: df123 Date: Fri, 1 May 2026 01:35:44 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=85=81=E8=AE=B8=E5=85=85?= =?UTF-8?q?=E7=94=B5=E9=87=91=E9=A2=9D=E4=B8=BA0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/views/electric-vehicle/charging/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/views/electric-vehicle/charging/index.vue b/client/src/views/electric-vehicle/charging/index.vue index ca108055..63d17e98 100644 --- a/client/src/views/electric-vehicle/charging/index.vue +++ b/client/src/views/electric-vehicle/charging/index.vue @@ -204,7 +204,7 @@ const formRules: FormRules = { chargingDate: [{ required: true, message: "请选择日期", trigger: "change" }], amount: [ { required: true, message: "请输入金额", trigger: "blur" }, - { type: "number", min: 0.01, message: "金额必须大于0", trigger: "blur" } + { type: "number", min: 0, message: "金额不能为负数", trigger: "blur" } ], vehicleId: [{ required: true, message: "请选择车辆", trigger: "change" }] }; From c5578cd55927a655dd65add5d6ac8669cc82cb9e Mon Sep 17 00:00:00 2001 From: df123 Date: Mon, 4 May 2026 17:48:22 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=BD=A6?= =?UTF-8?q?=E6=88=90=E6=9C=AC=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AE=B0=E5=BD=95=E5=AF=BC=E5=85=A5=E5=92=8C?= =?UTF-8?q?=E8=A1=A8=E5=8D=95=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/bookkeeping/expenditure/index.vue | 212 +++++++++++++++++- 1 file changed, 211 insertions(+), 1 deletion(-) diff --git a/client/src/views/bookkeeping/expenditure/index.vue b/client/src/views/bookkeeping/expenditure/index.vue index 76c85ab6..b5dc7b15 100644 --- a/client/src/views/bookkeeping/expenditure/index.vue +++ b/client/src/views/bookkeeping/expenditure/index.vue @@ -342,6 +342,103 @@ + + + + + + + + + + + + + 个人 + 家庭 + + + + + + + + + + + + + + + + + + + + + + + @@ -358,10 +455,16 @@ import { useBookkeepingExpenditureApi, useBookkeepingCategoryApi } from "@/api/bookkeeping"; +import { + electricVehicleApi, + electricVehicleCostApi +} from "@/api/electric-vehicle"; import type { BookkeepingExpenditureDto, CreateUpdateBookkeepingExpenditureDto, - BookkeepingCategoryDto + BookkeepingCategoryDto, + ElectricVehicleDto, + CreateUpdateElectricVehicleCostDto } from "@/types/api"; // API 服务 @@ -422,6 +525,34 @@ const formData = ref({ // 当前编辑的ID const currentEditId = ref(null); +// 车成本导入相关 +const carCostDialogVisible = ref(false); +const carCostSubmitting = ref(false); +const carCostFormRef = ref(); +const carCostVehicles = ref([]); + +const carCostFormData = ref({ + costDate: null as string | null, + amount: 0, + isBelongToSelf: true, + costType: 3, // 默认"其他" + vehicleId: "", + remark: "" +}); + +const carCostFormRules: FormRules = { + costDate: [{ required: true, message: "请选择日期", trigger: "change" }], + amount: [ + { required: true, message: "请输入金额", trigger: "blur" }, + { type: "number", min: 0.01, message: "金额必须大于0", trigger: "blur" } + ], + isBelongToSelf: [ + { required: true, message: "请选择归属", trigger: "change" } + ], + costType: [{ required: true, message: "请选择类型", trigger: "change" }], + vehicleId: [{ required: true, message: "请选择车辆", trigger: "change" }] +}; + // 计算属性 const dialogTitle = computed(() => currentEditId.value ? "编辑支出" : "新增支出" @@ -621,6 +752,62 @@ const handleClose = () => { formRef.value?.clearValidate(); }; +// 加载车辆列表 +const loadCarCostVehicles = async () => { + try { + const result = await electricVehicleApi.getVehicles({ pageSize: 1000 }); + carCostVehicles.value = result.items; + } catch (error) { + console.error("加载车辆列表失败:", error); + } +}; + +// 打开车成本导入对话框 +const openCarCostDialog = async ( + expenditureData: CreateUpdateBookkeepingExpenditureDto +) => { + // 预填数据 + Object.assign(carCostFormData.value, { + costDate: expenditureData.expenditureDate, + amount: expenditureData.expenditure, + isBelongToSelf: expenditureData.isBelongToSelf, + costType: 3, // 默认"其他" + vehicleId: + carCostVehicles.value.length === 1 + ? carCostVehicles.value[0].id + : "", + remark: expenditureData.remark || "" + }); + + carCostDialogVisible.value = true; +}; + +// 关闭车成本对话框 +const handleCarCostClose = () => { + carCostDialogVisible.value = false; + carCostFormRef.value?.clearValidate(); +}; + +// 提交车成本记录 +const handleCarCostSubmit = async () => { + if (!carCostFormRef.value) return; + + const valid = await carCostFormRef.value.validate(); + if (!valid) return; + + carCostSubmitting.value = true; + try { + await electricVehicleCostApi.createCost(carCostFormData.value); + ElMessage.success("已导入到车成本记录"); + carCostDialogVisible.value = false; + } catch (error) { + console.error("导入车成本记录失败:", error); + ElMessage.error("导入车成本记录失败"); + } finally { + carCostSubmitting.value = false; + } +}; + const handleSubmit = async () => { if (!formRef.value) return; @@ -643,6 +830,29 @@ const handleSubmit = async () => { dialogVisible.value = false; loadTableData(); + + // 检查分类是否为"车",提示是否导入到车成本记录 + const selectedCategory = categories.value.find( + (c) => c.id === formData.value.categoryId + ); + if (selectedCategory && selectedCategory.category === "车") { + try { + await ElMessageBox.confirm( + "是否将该支出导入到车的成本记录?", + "导入提示", + { + confirmButtonText: "导入", + cancelButtonText: "不导入", + type: "info" + } + ); + // 用户确认导入 + await loadCarCostVehicles(); + openCarCostDialog(formData.value); + } catch { + // 用户取消,不做任何处理 + } + } } catch (error) { console.error("保存支出记录失败:", error); ElMessage.error("保存支出记录失败");