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