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("保存支出记录失败");
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" }]
};