From 185c800fa17b97c01462ebcb1f89d71979100ff6 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期二, 20 一月 2026 17:14:03 +0800
Subject: [PATCH] fix: 完成无人值守地磅管理、报表中心功能开发

---
 src/api/environmentAccess/reportCenter.js                         |   13 
 src/views/environmentAccess/reportCenter/index.vue                |  240 ++++++++++++++++
 src/api/environmentAccess/unattendedWeighbridgeSystem.js          |   46 +++
 src/views/environmentAccess/unattendedWeighbridgeSystem/index.vue |  579 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 878 insertions(+), 0 deletions(-)

diff --git a/src/api/environmentAccess/reportCenter.js b/src/api/environmentAccess/reportCenter.js
new file mode 100644
index 0000000..ffcb738
--- /dev/null
+++ b/src/api/environmentAccess/reportCenter.js
@@ -0,0 +1,13 @@
+import request from "@/utils/request";
+
+/**
+ * 姣忔棩杩囩缁熻鎶ヨ〃锛氳溅娆°�佽揣閲忋�佸亸宸巼
+ * @param {Object} params - { startDate, endDate }
+ */
+export function getDailyWeighbridgeReport(params) {
+  return request({
+    url: "/environmentAccess/weighbridgeDailyReport",
+    method: "get",
+    params,
+  });
+}
diff --git a/src/api/environmentAccess/unattendedWeighbridgeSystem.js b/src/api/environmentAccess/unattendedWeighbridgeSystem.js
new file mode 100644
index 0000000..b9ca1bb
--- /dev/null
+++ b/src/api/environmentAccess/unattendedWeighbridgeSystem.js
@@ -0,0 +1,46 @@
+import request from "@/utils/request";
+
+// 鏌ヨ鏃犱汉鍊煎畧鍦扮绯荤粺鍒嗛〉鍒楄〃
+export function listWeighbridgeSystem(query) {
+  return request({
+    url: "/environmentAccess/weighbridgeSystemPage",
+    method: "get",
+    params: query,
+  });
+}
+
+// 鏂板鏃犱汉鍊煎畧鍦扮绯荤粺
+export function addWeighbridgeSystem(data) {
+  return request({
+    url: "/environmentAccess/weighbridgeSystemAdd",
+    method: "post",
+    data,
+  });
+}
+
+// 淇敼鏃犱汉鍊煎畧鍦扮绯荤粺
+export function updateWeighbridgeSystem(data) {
+  return request({
+    url: "/environmentAccess/weighbridgeSystemUpdate",
+    method: "put",
+    data,
+  });
+}
+
+// 鍒犻櫎鏃犱汉鍊煎畧鍦扮绯荤粺锛堟敮鎸佹壒閲忥級
+export function delWeighbridgeSystem(ids) {
+  return request({
+    url: "/environmentAccess/weighbridgeSystemDelete",
+    method: "delete",
+    data: ids,
+  });
+}
+
+// 鏌ヨ鍗曟潯璁板綍璇︽儏
+export function getWeighbridgeSystem(id) {
+  return request({
+    url: "/environmentAccess/weighbridgeSystemInfo",
+    method: "get",
+    params: { id },
+  });
+}
diff --git a/src/views/environmentAccess/reportCenter/index.vue b/src/views/environmentAccess/reportCenter/index.vue
new file mode 100644
index 0000000..c3492d1
--- /dev/null
+++ b/src/views/environmentAccess/reportCenter/index.vue
@@ -0,0 +1,240 @@
+<template>
+  <div class="app-container report-center">
+    <!-- 绛涢�夊尯 -->
+    <div class="report-header">
+      <div class="header-left">
+        <span class="search_title">缁熻鏃ユ湡锛�</span>
+        <el-date-picker
+          v-model="dateRange"
+          type="datetimerange"
+          range-separator="鑷�"
+          start-placeholder="寮�濮嬫棩鏈熸椂闂�"
+          end-placeholder="缁撴潫鏃ユ湡鏃堕棿"
+          value-format="YYYY-MM-DD HH:mm:ss"
+          format="YYYY-MM-DD HH:mm:ss"
+          :shortcuts="dateShortcuts"
+          style="width: 360px"
+        />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px">鏌ヨ</el-button>
+        <el-button @click="handleReset">閲嶇疆</el-button>
+      </div>
+    </div>
+
+    <!-- 涓�銆佹瘡鏃ヨ繃纾呯粺璁℃姤琛細杞︽/璐ч噺/鍋忓樊鐜� -->
+    <el-card class="report-card" shadow="hover">
+      <template #header>
+        <div class="card-header">
+          <span>姣忔棩杩囩缁熻鎶ヨ〃</span>
+          <span class="card-desc">杞︽銆佽揣閲忋�佸亸宸巼</span>
+        </div>
+      </template>
+      <div class="chart-row">
+        <div class="chart-wrap" style="flex: 1; min-width: 0;">
+          <Echarts
+            :chartStyle="dailyChartStyle"
+            :grid="dailyGrid"
+            :xAxis="dailyXAxis"
+            :yAxis="dailyYAxis"
+            :series="dailySeries"
+            :tooltip="dailyTooltip"
+            :legend="dailyLegend"
+            style="height: 320px"
+          />
+        </div>
+      </div>
+      <div class="table-wrap">
+        <el-table
+          :data="dailyTableData"
+          border
+          stripe
+          v-loading="dailyLoading"
+          style="width: 100%"
+          max-height="360"
+        >
+          <el-table-column type="index" label="搴忓彿" width="60" align="center" />
+          <el-table-column prop="date" label="鏃ユ湡" width="120" align="center" />
+          <el-table-column prop="tripCount" label="杞︽" align="center" />
+          <el-table-column prop="cargoVolume" label="璐ч噺(鍚�)" align="center" />
+          <el-table-column prop="deviationRate" label="鍋忓樊鐜�(%)" align="center">
+            <template #default="{ row }">
+              <span :class="getDeviationClass(row.deviationRate)">{{ row.deviationRate }}%</span>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    </el-card>
+  </div>
+</template>
+
+<script setup>
+import { ref, onMounted, getCurrentInstance } from "vue";
+import Echarts from "@/components/Echarts/echarts.vue";
+import { getDailyWeighbridgeReport } from "@/api/environmentAccess/reportCenter.js";
+
+const { proxy } = getCurrentInstance();
+
+// 鏃ユ湡鑼冨洿
+const dateRange = ref([]);
+const dateShortcuts = [
+  { text: "鏈�杩�7澶�", value: () => {
+    const end = new Date();
+    const start = new Date();
+    start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+    return [start, end];
+  }},
+  { text: "鏈�杩�30澶�", value: () => {
+    const end = new Date();
+    const start = new Date();
+    start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+    return [start, end];
+  }},
+  { text: "鏈湀", value: () => {
+    const d = new Date();
+    return [new Date(d.getFullYear(), d.getMonth(), 1, 0, 0, 0), d];
+  }},
+];
+
+// 榛樿鏈�杩�30澶�
+function getDefaultDateRange() {
+  const end = new Date();
+  const start = new Date();
+  start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+  return [formatDateTime(start), formatDateTime(end)];
+}
+function formatDateTime(d) {
+  const y = d.getFullYear(),
+    m = String(d.getMonth() + 1).padStart(2, "0"),
+    day = String(d.getDate()).padStart(2, "0"),
+    hh = String(d.getHours()).padStart(2, "0"),
+    mm = String(d.getMinutes()).padStart(2, "0"),
+    ss = String(d.getSeconds()).padStart(2, "0");
+  return `${y}-${m}-${day} ${hh}:${mm}:${ss}`;
+}
+
+// 涓�銆佹瘡鏃ヨ繃纾呯粺璁�
+const dailyLoading = ref(false);
+const dailyTableData = ref([]);
+const dailyChartStyle = { width: "100%", height: "100%" };
+const dailyGrid = { left: "3%", right: "4%", bottom: "12%", top: "10%", containLabel: true };
+const dailyLegend = { show: true, bottom: 0, data: ["杞︽", "璐ч噺(鍚�)", "鍋忓樊鐜�(%)"] };
+const dailyTooltip = {
+  trigger: "axis",
+  axisPointer: { type: "shadow" },
+};
+const dailyXAxis = ref([{ type: "category", data: [], axisLabel: { rotate: 35 } }]);
+const dailyYAxis = ref([
+  { type: "value", name: "杞︽/璐ч噺", position: "left", min: 0 },
+  { type: "value", name: "鍋忓樊鐜�%", position: "right", min: 0, max: 100, axisLabel: { formatter: "{value}%" } },
+]);
+const dailySeries = ref([]);
+
+// mock锛氭瘡鏃ヨ繃纾�
+function getMockDailyData() {
+  const arr = [];
+  for (let i = 6; i >= 0; i--) {
+    const d = new Date();
+    d.setDate(d.getDate() - i);
+    const dateStr = formatDate(d);
+    const trip = 20 + Math.floor(Math.random() * 30);
+    const vol = (Math.random() * 200 + 100).toFixed(1);
+    const dev = (Math.random() * 5).toFixed(2);
+    arr.push({ date: dateStr, tripCount: trip, cargoVolume: vol, deviationRate: dev });
+  }
+  return arr;
+}
+
+function getDeviationClass(rate) {
+  const v = parseFloat(rate);
+  if (v <= 1) return "text-success";
+  if (v <= 3) return "text-warning";
+  return "text-danger";
+}
+
+function buildDailyChart(arr) {
+  if (!arr || !arr.length) return;
+  dailyXAxis.value[0].data = arr.map((r) => r.date);
+  dailySeries.value = [
+    { name: "杞︽", type: "bar", data: arr.map((r) => r.tripCount), itemStyle: { color: "#409EFF" } },
+    { name: "璐ч噺(鍚�)", type: "bar", data: arr.map((r) => Number(r.cargoVolume)), itemStyle: { color: "#67C23A" } },
+    { name: "鍋忓樊鐜�(%)", type: "line", yAxisIndex: 1, data: arr.map((r) => Number(r.deviationRate)), itemStyle: { color: "#E6A23C" }, symbol: "circle", symbolSize: 8 },
+  ];
+}
+
+function loadDailyReport() {
+  dailyLoading.value = true;
+  const [start, end] = dateRange.value && dateRange.value.length === 2 ? dateRange.value : getDefaultDateRange();
+  getDailyWeighbridgeReport({ startDate: start, endDate: end })
+    .then((res) => {
+      const list = res?.data?.list ?? res?.data ?? res?.records ?? res;
+      dailyTableData.value = Array.isArray(list) ? list : getMockDailyData();
+      buildDailyChart(dailyTableData.value);
+    })
+    .catch(() => {
+      dailyTableData.value = getMockDailyData();
+      buildDailyChart(dailyTableData.value);
+    })
+    .finally(() => { dailyLoading.value = false; });
+}
+
+function handleQuery() {
+  if (!dateRange.value || dateRange.value.length !== 2) {
+    dateRange.value = getDefaultDateRange();
+  }
+  loadDailyReport();
+}
+
+function handleReset() {
+  dateRange.value = getDefaultDateRange();
+  handleQuery();
+}
+
+onMounted(() => {
+  dateRange.value = getDefaultDateRange();
+  handleQuery();
+});
+</script>
+
+<style scoped lang="scss">
+.report-center {
+  .report-header {
+    display: flex;
+    align-items: center;
+    margin-bottom: 16px;
+    .header-left {
+      display: flex;
+      align-items: center;
+    }
+    .search_title {
+      margin-right: 8px;
+      white-space: nowrap;
+    }
+  }
+  .report-card {
+    margin-bottom: 20px;
+    .card-header {
+      display: flex;
+      align-items: center;
+      gap: 12px;
+      .card-desc {
+        color: #909399;
+        font-size: 13px;
+      }
+    }
+    .chart-row {
+      display: flex;
+      gap: 16px;
+      margin-bottom: 16px;
+      .chart-wrap {
+        flex: 1;
+        min-width: 0;
+      }
+    }
+    .table-wrap {
+      margin-top: 12px;
+    }
+  }
+  .text-success { color: #67c23a; }
+  .text-warning { color: #e6a23c; }
+  .text-danger { color: #f56c6c; }
+}
+</style>
diff --git a/src/views/environmentAccess/unattendedWeighbridgeSystem/index.vue b/src/views/environmentAccess/unattendedWeighbridgeSystem/index.vue
new file mode 100644
index 0000000..f0cdb1f
--- /dev/null
+++ b/src/views/environmentAccess/unattendedWeighbridgeSystem/index.vue
@@ -0,0 +1,579 @@
+<template>
+  <div class="app-container">
+    <div class="search_form">
+      <div>
+        <span class="search_title">杞︾墝鍙凤細</span>
+        <el-input
+            v-model="searchForm.plateNumber"
+            style="width: 240px"
+            placeholder="璇疯緭鍏ヨ溅鐗屽彿"
+            @change="handleQuery"
+            clearable
+            :prefix-icon="Search"
+        />
+        <el-button type="primary" @click="handleQuery" style="margin-left: 10px"
+        >鎼滅储</el-button
+        >
+      </div>
+      <div>
+        <el-button type="primary" @click="openForm('add')">鏂板</el-button>
+        <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>
+      </div>
+    </div>
+    <div class="table_list">
+      <PIMTable
+          rowKey="id"
+          :column="tableColumn"
+          :tableData="tableData"
+          :page="page"
+          :isSelection="true"
+          @selection-change="handleSelectionChange"
+          :tableLoading="tableLoading"
+          @pagination="pagination"
+      ></PIMTable>
+    </div>
+    <el-dialog
+        v-model="dialogFormVisible"
+        :title="operationType === 'add' ? '鏂板鍦扮璁板綍' : '缂栬緫鍦扮璁板綍'"
+        width="70%"
+        @close="closeDia"
+    >
+      <el-form
+          :model="form"
+          label-width="140px"
+          label-position="top"
+          :rules="rules"
+          ref="formRef"
+      >
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="杞︾墝鍙凤細" prop="plateNumber">
+              <el-input
+                  v-model="form.plateNumber"
+                  placeholder="璇疯緭鍏ヨ溅鐗屽彿"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="绉伴噸鏃堕棿锛�" prop="weightTime">
+              <el-date-picker
+                  style="width: 100%"
+                  v-model="form.weightTime"
+                  value-format="YYYY-MM-DD HH:mm:ss"
+                  format="YYYY-MM-DD HH:mm:ss"
+                  type="datetime"
+                  placeholder="璇烽�夋嫨绉伴噸鏃堕棿"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鐨噸(kg)锛�" prop="tareWeight">
+              <el-input-number
+                  v-model="form.tareWeight"
+                  :min="0"
+                  :precision="2"
+                  :step="0.01"
+                  placeholder="璇疯緭鍏ョ毊閲�"
+                  style="width: 100%"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="姣涢噸(kg)锛�" prop="grossWeight">
+              <el-input-number
+                  v-model="form.grossWeight"
+                  :min="0"
+                  :precision="2"
+                  :step="0.01"
+                  placeholder="璇疯緭鍏ユ瘺閲�"
+                  style="width: 100%"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col v-if="operationType !== 'add'" :span="12">
+            <el-form-item label="鍑�閲�(kg)锛�" prop="netWeight">
+              <el-input-number
+                  v-model="form.netWeight"
+                  :min="0"
+                  :precision="2"
+                  :step="0.01"
+                  placeholder="鑷姩璁$畻锛堟瘺閲�-鐨噸锛�"
+                  style="width: 100%"
+                  disabled
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍋忕搴︼細" prop="positionOffset">
+              <el-input-number
+                  v-model="form.positionOffset"
+                  :min="1"
+                  :max="100"
+                  :precision="0"
+                  placeholder="1-100"
+                  controls-position="right"
+                  style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="鍙告満濮撳悕锛�" prop="driverName">
+              <el-input
+                  v-model="form.driverName"
+                  placeholder="璇疯緭鍏ュ徃鏈哄鍚�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鑱旂郴鐢佃瘽锛�" prop="contactPhone">
+              <el-input
+                  v-model="form.contactPhone"
+                  placeholder="璇疯緭鍏ヨ仈绯荤數璇�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="12">
+            <el-form-item label="璐х墿鍚嶇О锛�" prop="cargoName">
+              <el-input
+                  v-model="form.cargoName"
+                  placeholder="璇疯緭鍏ヨ揣鐗╁悕绉�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍦扮缂栧彿锛�" prop="weighbridgeNumber">
+              <el-input
+                  v-model="form.weighbridgeNumber"
+                  placeholder="璇疯緭鍏ュ湴纾呯紪鍙�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="30">
+          <el-col :span="24">
+            <el-form-item label="澶囨敞锛�" prop="remark">
+              <el-input
+                  v-model="form.remark"
+                  type="textarea"
+                  :rows="3"
+                  placeholder="璇疯緭鍏ュ娉�"
+                  clearable
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {onMounted, ref, reactive, toRefs, getCurrentInstance, watch} from "vue";
+import { Search } from "@element-plus/icons-vue";
+import {
+  addWeighbridgeSystem,
+  delWeighbridgeSystem,
+  getWeighbridgeSystem,
+  listWeighbridgeSystem,
+  updateWeighbridgeSystem,
+} from "@/api/environmentAccess/unattendedWeighbridgeSystem.js";
+import { ElMessageBox } from "element-plus";
+
+const { proxy } = getCurrentInstance();
+
+const formatDateTime = (val) => {
+  if (!val) return "";
+  const d = new Date(val);
+  if (Number.isNaN(d.getTime())) return val;
+  const pad = (n) => String(n).padStart(2, "0");
+  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
+};
+
+const tableColumn = ref([
+  {
+    label: "杞︾墝鍙�",
+    prop: "plateNumber",
+    width: 150,
+  },
+  {
+    label: "绉伴噸鏃堕棿",
+    prop: "weightTime",
+    width: 180,
+    formatData: (val) => formatDateTime(val),
+  },
+  {
+    label: "鐨噸(kg)",
+    prop: "tareWeight",
+    width: 120,
+  },
+  {
+    label: "姣涢噸(kg)",
+    prop: "grossWeight",
+    width: 120,
+  },
+  // {
+  //   label: "鍑�閲�(kg)",
+  //   prop: "netWeight",
+  //   width: 120,
+  // },
+  {
+    label: "鍋忕搴�",
+    prop: "positionOffset",
+    width: 100,
+  },
+  {
+    label: "鍙告満濮撳悕",
+    prop: "driverName",
+    width: 120,
+  },
+  {
+    label: "鑱旂郴鐢佃瘽",
+    prop: "contactPhone",
+    width: 150,
+  },
+  {
+    label: "璐х墿鍚嶇О",
+    prop: "cargoName",
+    width: 150,
+  },
+  {
+    label: "鍦扮缂栧彿",
+    prop: "weighbridgeNumber",
+    width: 120,
+  },
+  {
+    label: "澶囨敞",
+    prop: "remark",
+    minWidth: 200,
+  },
+  {
+    dataType: "action",
+    label: "鎿嶄綔",
+    align: "center",
+    fixed: 'right',
+    width: 120,
+    operation: [
+      {
+        name: "缂栬緫",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
+      {
+        name: "鍒犻櫎",
+        type: "text",
+        clickFun: (row) => {
+          handleSingleDelete(row);
+        },
+      },
+    ],
+  },
+]);
+
+const tableData = ref([]);
+const selectedRows = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+  total: 0,
+});
+
+// 琛ㄥ崟寮规鏁版嵁
+const operationType = ref("");
+const dialogFormVisible = ref(false);
+const data = reactive({
+  searchForm: {
+    plateNumber: "",
+  },
+  form: {
+    plateNumber: "",
+    weightTime: "",
+    tareWeight: null,
+    grossWeight: null,
+    netWeight: null,
+    positionOffset: null,
+    driverName: "",
+    contactPhone: "",
+    cargoName: "",
+    weighbridgeNumber: "",
+    remark: "",
+  },
+  rules: {
+    plateNumber: [{ required: true, message: "璇疯緭鍏ヨ溅鐗屽彿", trigger: "blur" }],
+    weightTime: [{ required: true, message: "璇烽�夋嫨绉伴噸鏃堕棿", trigger: "change" }],
+    tareWeight: [{ required: true, message: "璇疯緭鍏ョ毊閲�", trigger: "blur" }],
+    grossWeight: [{ required: true, message: "璇疯緭鍏ユ瘺閲�", trigger: "blur" }],
+    positionOffset: [
+      { validator: (_r, v, cb) => {
+        if (v == null || v === "" || v === undefined) return cb();
+        const n = Number(v);
+        if (isNaN(n) || n < 1 || n > 100) return cb(new Error("鍋忕搴﹀彧鑳戒负1-100鐨勬暣鏁�"));
+        cb();
+      }, trigger: "blur" }
+    ],
+    driverName: [{ required: false, message: "璇疯緭鍏ュ徃鏈哄鍚�", trigger: "blur" }],
+    contactPhone: [{ required: false, message: "璇疯緭鍏ヨ仈绯荤數璇�", trigger: "blur" }],
+    cargoName: [{ required: false, message: "璇疯緭鍏ヨ揣鐗╁悕绉�", trigger: "blur" }],
+    weighbridgeNumber: [{ required: false, message: "璇疯緭鍏ュ湴纾呯紪鍙�", trigger: "blur" }],
+    remark: [{ required: false, message: "璇疯緭鍏ュ娉�", trigger: "blur" }],
+  },
+});
+
+const { searchForm, form, rules } = toRefs(data);
+
+// 鐩戝惉鐨噸鍜屾瘺閲嶅彉鍖栵紝鑷姩璁$畻鍑�閲�
+watch(
+    [() => form.value.tareWeight, () => form.value.grossWeight],
+    ([tareWeight, grossWeight]) => {
+      if (tareWeight !== null && tareWeight !== undefined && 
+          grossWeight !== null && grossWeight !== undefined) {
+        form.value.netWeight = Number((grossWeight - tareWeight).toFixed(2));
+      } else {
+        form.value.netWeight = null;
+      }
+    },
+    { immediate: true }
+);
+
+// 鏌ヨ鍒楄〃
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+
+const pagination = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+
+const getList = () => {
+  tableLoading.value = true;
+  listWeighbridgeSystem({ ...searchForm.value, ...page }).then((res) => {
+    tableLoading.value = false;
+    if (res.code === 200) {
+      tableData.value = res.data?.records || res.records || [];
+      page.total = res.data?.total || res.total || 0;
+    } else {
+      proxy.$modal.msgError(res.msg || "鏌ヨ澶辫触");
+    }
+  }).catch((error) => {
+    tableLoading.value = false;
+    console.error("鏌ヨ澶辫触:", error);
+    proxy.$modal.msgError("鏌ヨ澶辫触");
+  });
+};
+
+// 琛ㄦ牸閫夋嫨鏁版嵁
+const handleSelectionChange = (selection) => {
+  selectedRows.value = selection;
+};
+
+// 鎵撳紑寮规
+const openForm = (type, row) => {
+  operationType.value = type;
+  form.value = {
+    plateNumber: "",
+    weightTime: "",
+    tareWeight: null,
+    grossWeight: null,
+    netWeight: null,
+    positionOffset: null,
+    driverName: "",
+    contactPhone: "",
+    cargoName: "",
+    weighbridgeNumber: "",
+    remark: "",
+  };
+  
+  if (type === "edit" && row) {
+    getWeighbridgeSystem(row.id).then((res) => {
+      if (res.code === 200) {
+        form.value = { ...res.data };
+        // 纭繚鍑�閲嶆纭绠�
+        if (form.value.tareWeight !== null && form.value.grossWeight !== null) {
+          form.value.netWeight = Number((form.value.grossWeight - form.value.tareWeight).toFixed(2));
+        }
+      } else {
+        proxy.$modal.msgError(res.msg || "鑾峰彇鏁版嵁澶辫触");
+      }
+    }).catch((error) => {
+      console.error("鑾峰彇鏁版嵁澶辫触:", error);
+      proxy.$modal.msgError("鑾峰彇鏁版嵁澶辫触");
+    });
+  } else {
+    // 鏂板鏃堕粯璁よ缃綋鍓嶆椂闂�
+    const now = new Date();
+    const year = now.getFullYear();
+    const month = String(now.getMonth() + 1).padStart(2, "0");
+    const day = String(now.getDate()).padStart(2, "0");
+    const hours = String(now.getHours()).padStart(2, "0");
+    const minutes = String(now.getMinutes()).padStart(2, "0");
+    const seconds = String(now.getSeconds()).padStart(2, "0");
+    form.value.weightTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+  }
+  
+  dialogFormVisible.value = true;
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+  proxy.$refs["formRef"].validate((valid) => {
+    if (valid) {
+      // 楠岃瘉姣涢噸蹇呴』澶т簬鐨噸
+      if (form.value.grossWeight <= form.value.tareWeight) {
+        proxy.$modal.msgError("姣涢噸蹇呴』澶т簬鐨噸");
+        return;
+      }
+      
+      // 纭繚鍑�閲嶆纭绠�
+      if (form.value.tareWeight !== null && form.value.grossWeight !== null) {
+        form.value.netWeight = Number((form.value.grossWeight - form.value.tareWeight).toFixed(2));
+      }
+      
+      if (operationType.value === "edit") {
+        submitEdit();
+      } else {
+        submitAdd();
+      }
+    }
+  });
+};
+
+// 鎻愪氦鏂板
+const submitAdd = () => {
+  addWeighbridgeSystem(form.value).then((res) => {
+    if (res.code === 200) {
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+      closeDia();
+      getList();
+    } else {
+      proxy.$modal.msgError(res.msg || "鎻愪氦澶辫触");
+    }
+  }).catch((error) => {
+    console.error("鎻愪氦澶辫触:", error);
+    proxy.$modal.msgError("鎻愪氦澶辫触");
+  });
+};
+
+// 鎻愪氦淇敼
+const submitEdit = () => {
+  updateWeighbridgeSystem(form.value).then((res) => {
+    if (res.code === 200) {
+      proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+      closeDia();
+      getList();
+    } else {
+      proxy.$modal.msgError(res.msg || "鎻愪氦澶辫触");
+    }
+  }).catch((error) => {
+    console.error("鎻愪氦澶辫触:", error);
+    proxy.$modal.msgError("鎻愪氦澶辫触");
+  });
+};
+
+// 鍏抽棴寮规
+const closeDia = () => {
+  proxy.resetForm("formRef");
+  dialogFormVisible.value = false;
+};
+
+// 鎵归噺鍒犻櫎
+const handleDelete = () => {
+  let ids = [];
+  if (selectedRows.value.length > 0) {
+    ids = selectedRows.value.map((item) => item.id);
+  } else {
+    proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
+    return;
+  }
+  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚垹闄わ紝鏄惁纭鍒犻櫎锛�", "鍒犻櫎鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        tableLoading.value = true;
+        delWeighbridgeSystem(ids)
+            .then((res) => {
+              if (res.code === 200) {
+                proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+                getList();
+              } else {
+                proxy.$modal.msgError(res.msg || "鍒犻櫎澶辫触");
+              }
+            })
+            .catch((error) => {
+              console.error("鍒犻櫎澶辫触:", error);
+              proxy.$modal.msgError("鍒犻櫎澶辫触");
+            })
+            .finally(() => {
+              tableLoading.value = false;
+            });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+
+// 鍗曟潯鍒犻櫎
+const handleSingleDelete = (row) => {
+  ElMessageBox.confirm("纭畾瑕佸垹闄よ繖鏉¤褰曞悧锛�", "鍒犻櫎鎻愮ず", {
+    confirmButtonText: "纭",
+    cancelButtonText: "鍙栨秷",
+    type: "warning",
+  })
+      .then(() => {
+        tableLoading.value = true;
+        delWeighbridgeSystem([row.id])
+            .then((res) => {
+              if (res.code === 200) {
+                proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+                getList();
+              } else {
+                proxy.$modal.msgError(res.msg || "鍒犻櫎澶辫触");
+              }
+            })
+            .catch((error) => {
+              console.error("鍒犻櫎澶辫触:", error);
+              proxy.$modal.msgError("鍒犻櫎澶辫触");
+            })
+            .finally(() => {
+              tableLoading.value = false;
+            });
+      })
+      .catch(() => {
+        proxy.$modal.msg("宸插彇娑�");
+      });
+};
+
+onMounted(() => {
+  getList();
+});
+</script>
+
+<style scoped lang="scss"></style>

--
Gitblit v1.9.3