| ¶Ô±ÈÐÂÎļþ |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | /** |
| | | * æ¯æ¥è¿ç£
ç»è®¡æ¥è¡¨ï¼è½¦æ¬¡ãè´§éãåå·®ç |
| | | * @param {Object} params - { startDate, endDate } |
| | | */ |
| | | export function getDailyWeighbridgeReport(params) { |
| | | return request({ |
| | | url: "/environmentAccess/weighbridgeDailyReport", |
| | | method: "get", |
| | | params, |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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 }, |
| | | }); |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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> |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <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> |