| | |
| | | |
| | | package-lock.json |
| | | yarn.lock |
| | | pnpm-lock.yaml |
| | |
| | | "axios": "0.28.1", |
| | | "clipboard": "2.0.11", |
| | | "default-passive-events": "^4.0.0", |
| | | "echarts": "5.5.1", |
| | | "echarts": "^5.6.0", |
| | | "element-china-area-data": "^6.1.0", |
| | | "element-plus": "2.7.6", |
| | | "file-saver": "2.0.5", |
| | |
| | | "nprogress": "0.2.0", |
| | | "pinia": "2.1.7", |
| | | "print-js": "^1.6.0", |
| | | "qr-scanner": "^1.4.2", |
| | | "qrcode": "^1.5.4", |
| | | "splitpanes": "3.1.5", |
| | | "vue": "3.4.31", |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // å·¡æ£ä¸ä¼ |
| | | import request from '@/utils/request' |
| | | |
| | | // äºç»´ç 管ç表æ¥è¯¢ |
| | | export function qrCodeList(query) { |
| | | return request({ |
| | | url: '/qrCode/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | // äºç»´ç æ«ç è®°å½è¡¨æ¥è¯¢ |
| | | export function qrCodeScanRecordList(query) { |
| | | return request({ |
| | | url: '/qrCodeScanRecord/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | // äºç»´ç 管ç表æ°å¢ä¿®æ¹ |
| | | export function addOrEditQrCode(query) { |
| | | return request({ |
| | | url: '/qrCode/addOrEditQrCode', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // äºç»´ç æ«ç è®°å½è¡¨æ°å¢ä¿®æ¹ |
| | | export function addOrEditQrCodeRecord(query) { |
| | | return request({ |
| | | url: '/qrCodeScanRecord/addOrEditQrCodeRecord', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // äºç»´ç æ«ç è®°å½è¡¨æ°å¢ä¿®æ¹ |
| | | export function delQrCode(query) { |
| | | return request({ |
| | | url: '/qrCode/delQrCode', |
| | | method: 'delete', |
| | | data: query |
| | | }) |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <div ref="chartRef" :style="chartStyle"></div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, onMounted, onBeforeUnmount, watchEffect } from 'vue' |
| | | import * as echarts from 'echarts' |
| | | |
| | | // Props |
| | | const props = defineProps({ |
| | | options: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | chartStyle: { |
| | | type: Object, |
| | | default: () => ({ |
| | | height: '80%', |
| | | width: '100%' |
| | | }) |
| | | }, |
| | | dataset: { |
| | | type: Object, |
| | | default: () => {} |
| | | }, |
| | | xAxis: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | yAxis: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | series: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | grid: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | legend: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | tooltip: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | lineColors: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | barColors: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | pieColors: { |
| | | type: Array, |
| | | default: () => [] |
| | | }, |
| | | loadingOption: { |
| | | type: Object, |
| | | default: () => ({ |
| | | text: 'æ°æ®å è½½ä¸...', |
| | | color: '#00BAFF', |
| | | textColor: '#000', |
| | | maskColor: 'rgba(255, 255, 255, 0.8)', |
| | | zlevel: 0 |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | import { watch } from 'vue' |
| | | |
| | | // Refs |
| | | const chartRef = ref(null) |
| | | let chartInstance = null |
| | | |
| | | // Methods |
| | | function generateChart(option) { |
| | | const copiedOption = JSON.parse(JSON.stringify(option)) // â
æ·±æ·è´ |
| | | |
| | | // if (copiedOption.series && copiedOption.series.length > 0) { |
| | | // copiedOption.series.forEach((s, index) => { |
| | | // if (s.type === 'line') { |
| | | // s.itemStyle = { |
| | | // color: props.lineColors[index] || props.lineColors[0] |
| | | // } |
| | | // s.lineStyle = { |
| | | // color: props.lineColors[index] || props.lineColors[0] |
| | | // } |
| | | // } else if (s.type === 'bar') { |
| | | // s.itemStyle = { |
| | | // color: props.barColors[index] || props.barColors[0] |
| | | // } |
| | | // } |
| | | // }) |
| | | // } |
| | | |
| | | chartInstance.setOption(copiedOption) |
| | | } |
| | | |
| | | function renderChart() { |
| | | const option = { |
| | | backgroundColor: props.options.backgroundColor || '#fff', |
| | | xAxis: props.xAxis, |
| | | yAxis: props.yAxis, |
| | | dataset: props.dataset, |
| | | series: props.series, |
| | | grid: props.grid, |
| | | legend: props.legend, |
| | | tooltip: props.tooltip |
| | | } |
| | | |
| | | chartInstance.clear() |
| | | generateChart(option) |
| | | } |
| | | |
| | | function windowResizeListener() { |
| | | if (!chartInstance) return |
| | | chartInstance.resize() |
| | | } |
| | | |
| | | // Lifecycle hooks |
| | | onMounted(() => { |
| | | chartInstance = echarts.init(chartRef.value) |
| | | renderChart() |
| | | window.addEventListener('resize', windowResizeListener) |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | | if (chartInstance) { |
| | | window.removeEventListener('resize', windowResizeListener) |
| | | chartInstance.dispose() |
| | | chartInstance = null |
| | | } |
| | | }) |
| | | |
| | | // Watch all reactive props that affect the chart |
| | | watch( |
| | | () => [props.xAxis, props.series], |
| | | () => { |
| | | if (chartInstance) { |
| | | renderChart() |
| | | } |
| | | }, |
| | | { deep: true, immediate: true } |
| | | ) |
| | | </script> |
| | |
| | | } |
| | | // æ¡é¢ç«¯ä¸è½½ |
| | | const link = document.createElement("a"); |
| | | link.href = url; |
| | | link.href = file.downloadUrl; |
| | | link.download = file.bucketFilename || file.key; |
| | | link.click(); |
| | | }; |
| | | |
| | | // ä¸ä¼ åæ ¡éª |
| | | const handleBeforeUpload = (file) => { |
| | | // æ ¡éªæä»¶åç¹æ®å符 |
| | |
| | | type="index" |
| | | width="60" |
| | | align="center" |
| | | /> |
| | | <template v-for="col in columns" :key="col.prop"> |
| | | /> <template v-for="col in columns" :key="col.prop"> |
| | | <el-table-column |
| | | v-bind="col" |
| | | :show-overflow-tooltip="false" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <template v-if="col.slot"> |
| | | <slot></slot> |
| | | </template> |
| | | <template v-else> |
| | | <slot |
| | | :name="col.prop" |
| | | :row="scope.row" |
| | | :column="scope.column" |
| | | :index="scope.$index" |
| | | ></slot> |
| | | </template> <template v-else> |
| | | <div |
| | | class="cell-edit" |
| | | @dblclick="handleCellEdit(scope.row, col.prop)" |
| | | :class="{ editable: isColumnEditable(col.prop) }" |
| | | > |
| | | <!-- æ¾ç¤ºç¶æï¼ä½¿ç¨æ ¼å¼åçå¼ --> |
| | | <span |
| | | v-if="!scope.row.editing || !scope.row.editing[col.prop]" |
| | | class="cell-text" |
| | | > |
| | | {{ |
| | | scope.row[col.prop] == null || scope.row[col.prop] === "" |
| | | ? "--" |
| | | : scope.row[col.prop] |
| | | formatCellValue(scope.row, scope.column, scope.row[col.prop], col) |
| | | }} |
| | | </span> |
| | | <!-- ç¼è¾ç¶æï¼ä½¿ç¨åå§å¼ï¼ä¸ç»è¿æ ¼å¼å --> |
| | | <el-input |
| | | v-else |
| | | v-model="scope.row[col.prop]" |
| | |
| | | </template> |
| | | </el-table-column> |
| | | </template> |
| | | <!-- æä½å --> |
| | | <el-table-column |
| | | v-if="showOperations" |
| | | :label="operationsLabel" |
| | | :width="operationsWidth" |
| | | fixed="right" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
| | | <slot name="operations" :row="scope.row"> |
| | | <el-button |
| | | v-if="operations.includes('edit')" |
| | | link |
| | | type="primary" |
| | | size="small" |
| | | @click="handleEdit(scope.row)" |
| | | >ç¼è¾</el-button |
| | | > |
| | | <!-- <el-button--> |
| | | <!-- v-if="operations.includes('delete')"--> |
| | | <!-- link--> |
| | | <!-- type="danger"--> |
| | | <!-- size="small"--> |
| | | <!-- @click="handleDelete(scope.row)"--> |
| | | <!-- >å é¤</el-button>--> |
| | | </slot> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </template> |
| | | |
| | |
| | | // æ£æ¥è¯¥åå¨æææ°æ®ä¸æ¯å¦æéç©ºå¼ |
| | | return data.some((row) => row[col.prop] != null && row[col.prop] !== ""); |
| | | }; |
| | | // é»è®¤çæ ¼å¼å彿° |
| | | const defaultFormatter = (row, column, cellValue) => { |
| | | return cellValue == null || cellValue === "" || cellValue === 0 |
| | | ? "0" |
| | | : cellValue; |
| | | }; |
| | | |
| | | // æ ¼å¼ååå
æ ¼å¼ |
| | | const formatCellValue = (row, column, cellValue, col) => { |
| | | // 妿åæèªå®ä¹æ ¼å¼åå¨ï¼ä½¿ç¨èªå®ä¹æ ¼å¼åå¨ |
| | | if (col.formatter && typeof col.formatter === 'function') { |
| | | return col.formatter(row, column, cellValue); |
| | | } |
| | | // å¦å使ç¨é»è®¤æ ¼å¼åå¨ |
| | | return defaultFormatter(row, column, cellValue); |
| | | }; |
| | | // å¤çåå
æ ¼ç¼è¾ |
| | | const handleCellEdit = (row, prop) => { |
| | | // 妿ä¸å
许ç¼è¾åå
æ ¼ï¼ç´æ¥è¿å |
| | |
| | | <div class="left-content"> |
| | | <div class="tree-header"> |
| | | <h3>ææ¡£ç®¡ç</h3> |
| | | <el-button type="primary" size="small" @click="append('')" icon="Plus" |
| | | >æ°å¢</el-button |
| | | <el-button icon="Plus" size="small" type="primary" @click="append('')" |
| | | >æ°å¢ |
| | | </el-button |
| | | > |
| | | </div> |
| | | |
| | | <!-- æç´¢æ¡ --> |
| | | <div class="search-box"> |
| | | <el-input |
| | | v-model="filterText" |
| | | placeholder="è¾å
¥å
³é®åè¿è¡æç´¢" |
| | | size="small" |
| | | clearable |
| | | @input="handleFilter" |
| | | v-model="filterText" |
| | | clearable |
| | | placeholder="è¾å
¥å
³é®åè¿è¡æç´¢" |
| | | size="small" |
| | | @input="handleFilter" |
| | | > |
| | | <template #prefix> |
| | | <el-icon><Search /></el-icon> |
| | | <el-icon> |
| | | <Search/> |
| | | </el-icon> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | | |
| | | <div class="tree-container"> |
| | | <el-tree |
| | | ref="treeRef" |
| | | :data="treeData" |
| | | :props="props" |
| | | :filter-node-method="filterNode" |
| | | :expand-on-click-node="false" |
| | | :default-expand-all="false" |
| | | node-key="id" |
| | | @node-click="handleNodeClick" |
| | | class="custom-tree" |
| | | ref="treeRef" |
| | | :data="treeData" |
| | | :default-expand-all="false" |
| | | :expand-on-click-node="false" |
| | | :filter-node-method="filterNode" |
| | | :props="props" |
| | | class="custom-tree" |
| | | node-key="id" |
| | | @node-click="handleNodeClick" |
| | | > |
| | | <template #default="{ node, data }"> |
| | | <div class="tree-node-content" @dblclick="headerDbClick(data)"> |
| | | <div class="node-icon"> |
| | | <el-icon |
| | | v-if="!node.isLeaf" |
| | | :class="{ expanded: node.expanded }" |
| | | v-if="!node.isLeaf" |
| | | :class="{ expanded: node.expanded }" |
| | | > |
| | | <Folder /> |
| | | <Folder/> |
| | | </el-icon> |
| | | <el-icon v-else> |
| | | <Document /> |
| | | <Document/> |
| | | </el-icon> |
| | | </div> |
| | | |
| | | <div class="node-label"> |
| | | <span v-if="!data.isEdit" class="label-text">{{ |
| | | node.label |
| | | }}</span> |
| | | node.label |
| | | }}</span> |
| | | <el-input |
| | | v-else |
| | | :ref="(el) => setInputRef(el, data)" |
| | | placeholder="请è¾å
¥èç¹åç§°" |
| | | v-model="newName" |
| | | @blur="($event) => handleInputBlur($event, data, node)" |
| | | @keyup.enter=" |
| | | ($event) => handleInputBlur($event, data, node) |
| | | v-else |
| | | :ref="(el) => setInputRef(el, data)" |
| | | v-model="newName" |
| | | autofocus |
| | | class="tree-input" |
| | | placeholder="请è¾å
¥èç¹åç§°" |
| | | size="small" |
| | | @blur="(event) => handleInputBlur(event, data, node)" |
| | | @keyup.enter=" |
| | | (event) => handleInputBlur(event, data, node) |
| | | " |
| | | size="small" |
| | | class="tree-input" |
| | | autofocus |
| | | /> |
| | | </div> |
| | | <div class="node-actions" v-show="!data.isEdit"> |
| | | <div v-show="!data.isEdit" class="node-actions"> |
| | | <el-button |
| | | link |
| | | size="small" |
| | | @click.stop="append(data)" |
| | | icon="Plus" |
| | | title="æ°å¢åèç¹" |
| | | icon="Plus" |
| | | link |
| | | size="small" |
| | | title="æ°å¢åèç¹" |
| | | @click.stop="append(data)" |
| | | ></el-button> |
| | | <el-button |
| | | link |
| | | size="small" |
| | | @click.stop="remove(node, data)" |
| | | icon="Delete" |
| | | title="å é¤" |
| | | icon="Delete" |
| | | link |
| | | size="small" |
| | | title="å é¤" |
| | | @click.stop="remove(node, data)" |
| | | ></el-button> |
| | | </div> |
| | | </div> |
| | |
| | | </div> |
| | | <div class="right"> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="2" :offset="20" |
| | | ><el-button :icon="Delete" type="danger" @click="delHandler">å é¤</el-button></el-col |
| | | <el-col :offset="20" :span="2" |
| | | > |
| | | <el-button :icon="Delete" type="danger" @click="delHandler">å é¤</el-button> |
| | | </el-col |
| | | > |
| | | <el-col :span="2" |
| | | ><el-button |
| | | :icon="Plus" |
| | | type="primary" |
| | | @click="add" |
| | | :disabled="!tableData.length" |
| | | >æ°å¢</el-button |
| | | ></el-col |
| | | > |
| | | <el-button |
| | | :disabled="!tableSwitch" |
| | | :icon="Plus" |
| | | type="primary" |
| | | @click="add" |
| | | >æ°å¢ |
| | | </el-button |
| | | > |
| | | </el-col |
| | | > |
| | | </el-row> |
| | | <ETable |
| | | :maxHeight="1200" |
| | | :loading="loading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="handleEdit" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :border="true" |
| | | :columns="columns" |
| | | :loading="loading" |
| | | :maxHeight="1200" |
| | | :show-selection="true" |
| | | :table-data="tableData" |
| | | @edit="handleEdit" |
| | | @selection-change="handleSelectionChange" |
| | | > |
| | | </ETable> |
| | | <Pagination |
| | | :total="total" |
| | | :page="queryParams.current" |
| | | :limit="queryParams.pageSize" |
| | | :show-total="true" |
| | | @pagination="handlePageChange" |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | :limit="queryParams.pageSize" |
| | | :page="queryParams.current" |
| | | :show-total="true" |
| | | :total="total" |
| | | @pagination="handlePageChange" |
| | | ></Pagination> |
| | | </div> |
| | | <archiveDialog |
| | | v-model:centerDialogVisible="dialogVisible" |
| | | @centerDialogVisible="centerDialogVisible" |
| | | :row="row" |
| | | @submitForm="submitForm" |
| | | ref="archiveDialogs" |
| | | ref="archiveDialogs" |
| | | v-model:centerDialogVisible="dialogVisible" |
| | | :row="row" |
| | | @centerDialogVisible="centerDialogVisible" |
| | | @submitForm="submitForm" |
| | | |
| | | > |
| | | </archiveDialog> |
| | | </el-card> |
| | | </template> |
| | | <script setup> |
| | | import { onMounted, ref, nextTick, reactive } from "vue"; |
| | | import {nextTick, onMounted, reactive, ref} from "vue"; |
| | | import ETable from "@/components/Table/ETable.vue"; |
| | | import { ElButton, ElInput, ElIcon, ElMessage } from "element-plus"; |
| | | import {ElButton, ElIcon, ElInput, ElMessage} from "element-plus"; |
| | | import archiveDialog from "./mould/archiveDialog.vue"; |
| | | import Pagination from "@/components/Pagination/index.vue"; |
| | | import { |
| | | Plus, |
| | | Search, |
| | | Folder, |
| | | Document, |
| | | Delete, |
| | | } from "@element-plus/icons-vue"; |
| | | import { |
| | | getTree, |
| | | addOrEditTree, |
| | | delTree, |
| | | getArchiveList, |
| | | addOrEditArchive, |
| | | delArchive, |
| | | } from "@/api/archiveManagement"; |
| | | import {Delete, Document, Folder, Plus, Search,} from "@element-plus/icons-vue"; |
| | | import {addOrEditTree, delArchive, delTree, getArchiveList, getTree,} from "@/api/archiveManagement"; |
| | | |
| | | const dialogVisible = ref(false); // æ§å¶å½æ¡£å¯¹è¯æ¡æ¾ç¤º |
| | | const loading = ref(false); |
| | | const tableData = ref([]); |
| | |
| | | const treeRef = ref(); // æ ç»ä»¶å¼ç¨ |
| | | const total = ref(0); // æ»è®°å½æ° |
| | | const columns = [ |
| | | { prop: "name", label: "åç§°", minWidth: 180 }, |
| | | { prop: "type", label: "ç±»å", minWidth: 120 }, |
| | | { prop: "status", label: "ç¶æ", minWidth: 100 }, |
| | | {prop: "name", label: "åç§°", minWidth: 180}, |
| | | {prop: "type", label: "ç±»å", minWidth: 120}, |
| | | {prop: "status", label: "ç¶æ", minWidth: 100}, |
| | | ]; |
| | | const selectedRows = reactive([]); // åå¨éä¸è¡æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | |
| | | }; |
| | | const submitForm = async (res) => { |
| | | if (res && res.code === 200) { |
| | | ElMessage.success("æä½æå"); |
| | | // å·æ°åè¡¨æ°æ® |
| | | await getArchiveListData(); |
| | | } else { |
| | |
| | | } |
| | | const centerDialogVisible = (val) => { |
| | | }; |
| | | const tableSwitch = ref(false); |
| | | // å¤çèç¹ç¹å» |
| | | const handleNodeClick = async (data) => { |
| | | const handleNodeClick = (data) => { |
| | | tableSwitch.value = true; |
| | | // 忢èç¹æ¶éç½®å°ç¬¬ä¸é¡µ |
| | | queryParams.current = 1; |
| | | queryParams.treeId = data.id; |
| | |
| | | archiveDialogs.value.initForm(); // é置表å |
| | | }; |
| | | // å¤çå页åå |
| | | const handlePageChange = ({ page }) => { |
| | | const handlePageChange = ({page}) => { |
| | | queryParams.current = page; |
| | | // pageSize åºå®ä¸º20ï¼ä¸åä»åæ°ä¸è·å |
| | | getArchiveListData(); |
| | |
| | | total.value = 0; |
| | | return; |
| | | } |
| | | |
| | | tableData.value = res.data?.records || res.data || []; |
| | | total.value = res.data?.total || 0; |
| | | // ç¡®ä¿å页忰æ£ç¡®æ´æ° |
| | |
| | | } |
| | | try { |
| | | const ids = selectedRows.map((row) => row.id); |
| | | const { code, msg } = await delArchive(ids); |
| | | const {code, msg} = await delArchive(ids); |
| | | if (code !== 200) { |
| | | ElMessage.warning("å é¤å¤±è´¥: " + msg); |
| | | } else { |
| | |
| | | // å¤çè¾å
¥æ¡å¤±ç¦ |
| | | const handleInputBlur = async (event, comeTreeData, node) => { |
| | | if (!comeTreeData.isEdit) return; // 妿䏿¯ç¼è¾ç¶æï¼ç´æ¥è¿å |
| | | console.log("handleInputBlur", event, comeTreeData, node); |
| | | if (event.relatedTarget && event.relatedTarget.tagName === "BUTTON") { |
| | | return; |
| | | } |
| | |
| | | if (!data || !data.id) { |
| | | return; |
| | | } |
| | | let { code, msg } = await delTree([data.id]); |
| | | let {code, msg} = await delTree([data.id]); |
| | | if (code !== 200) { |
| | | ElMessage.warning("å é¤å¤±è´¥, " + msg); |
| | | } else { |
| | |
| | | const isExpanded = node?.expanded; // 妿æåçº§ä¸æªå±å¼ï¼å
å±å¼èç¹ |
| | | if (hasChildren && !isExpanded) { |
| | | if ( |
| | | treeRef.value && |
| | | treeRef.value.store && |
| | | treeRef.value.store.nodesMap[nodeKey] |
| | | treeRef.value && |
| | | treeRef.value.store && |
| | | treeRef.value.store.nodesMap[nodeKey] |
| | | ) { |
| | | treeRef.value.store.nodesMap[nodeKey].expanded = true; |
| | | } |
| | |
| | | } |
| | | }; |
| | | </script> |
| | | <style scoped lang="scss"> |
| | | <style lang="scss" scoped> |
| | | .custom-tree-node { |
| | | flex: 1; |
| | | display: flex; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .el-card { |
| | | width: calc(100% - 40px); |
| | | height: calc(100vh - 130px); |
| | | margin: 20px; |
| | | box-sizing: border-box; |
| | | |
| | | .left { |
| | | width: 30%; |
| | | height: calc(100vh - 160px); |
| | |
| | | flex-direction: column; |
| | | } |
| | | } |
| | | |
| | | .right { |
| | | width: 70%; |
| | | height: calc(100vh - 160px); |
| | | padding: 0px 10px; |
| | | padding: 0 10px; |
| | | float: left; |
| | | } |
| | | } |
| | | |
| | | .archive-management-card { |
| | | margin: 0; |
| | | } |
| | |
| | | <template> |
| | | <el-dialog v-model="centerDialogVisible" title="ææ¡£ç®¡ç" width="500" center> |
| | | <el-form |
| | | ref="ruleFormRef" |
| | | style="max-width: 600px" |
| | | :model="ruleForm" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | ref="ruleFormRef" |
| | | style="max-width: 600px" |
| | | :model="ruleForm" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | > |
| | | <el-form-item label="åç§°" prop="name"> |
| | | <el-input v-model="ruleForm.name" placeholder="请è¾å
¥ææ¡£åç§°" /> |
| | | <el-input v-model="ruleForm.name" placeholder="请è¾å
¥ææ¡£åç§°"/> |
| | | </el-form-item> |
| | | <el-form-item label="请è¾å
¥ææ¡£ç±»å" prop="type"> |
| | | <el-select v-model="ruleForm.type" placeholder="请è¾å
¥ææ¡£ç±»å"> |
| | | <el-option label="åå" value="åå" /> |
| | | <el-option label="æ¥å" value="æ¥å" /> |
| | | <el-option label="åå" value="åå"/> |
| | | <el-option label="æ¥å" value="æ¥å"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="请è¾å
¥ææ¡£ç¶æ" prop="status"> |
| | | <el-select v-model="ruleForm.status" placeholder="请è¾å
¥ææ¡£ç¶æ"> |
| | | <el-option |
| | | v-for="option in options" |
| | | :key="option.value" |
| | | :label="option.label" |
| | | :value="option.value" |
| | | v-for="option in options" |
| | | :key="option.value" |
| | | :label="option.label" |
| | | :value="option.value" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <el-row> |
| | | <el-col :span="24" style="text-align: right"> |
| | | <el-button @click="centerDialogVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="submit"> ç¡® å® </el-button> |
| | | <el-button type="primary" @click="submit"> ç¡® å®</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | </template> |
| | | <fileUpload |
| | | ref="fileUploadRef" |
| | | :fileSize="1024" |
| | | :fileType="['pdf', 'docx', 'txt', 'xlsx', 'pptx....']" |
| | | :limit="10" |
| | | :drag="false" |
| | | v-model:modelValue="modelValue" |
| | | ref="fileUploadRef" |
| | | :fileSize="1024" |
| | | :fileType="['pdf', 'docx', 'txt', 'xlsx', 'pptx....']" |
| | | :limit="10" |
| | | :drag="false" |
| | | v-model:modelValue="modelValue" |
| | | /> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch } from "vue"; |
| | | import { addOrEditArchive } from "@/api/archiveManagement"; |
| | | import {ref, watch, nextTick} from "vue"; |
| | | import {addOrEditArchive} from "@/api/archiveManagement"; |
| | | import fileUpload from "@/components/FileUpload/index.vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import {ElMessage} from "element-plus"; |
| | | |
| | | const centerDialogVisible = defineModel("centerDialogVisible", { |
| | | type: Boolean, |
| | |
| | | const copyForm = ref(); |
| | | // çå¬ row çååï¼æ´æ° ruleForm |
| | | watch( |
| | | () => props.row, |
| | | (newRow) => { |
| | | copyForm.value = initFormData(newRow); |
| | | ruleForm.value = JSON.parse(JSON.stringify(copyForm.value)); |
| | | }, |
| | | { deep: true } |
| | | () => props.row, |
| | | (newRow) => { |
| | | copyForm.value = initFormData(newRow); |
| | | ruleForm.value = JSON.parse(JSON.stringify(copyForm.value)); |
| | | }, |
| | | {deep: true} |
| | | ); |
| | | const rules = { |
| | | name: [{ required: true, message: "请è¾å
¥ææ¡£åç§°", trigger: "blur" }], |
| | | type: [{ required: true, message: "è¯·éæ©ææ¡£ç±»å", trigger: "blur" }], |
| | | status: [{ required: true, message: "è¯·éæ©ææ¡£ç¶æ", trigger: "blur" }], |
| | | name: [{required: true, message: "请è¾å
¥ææ¡£åç§°", trigger: "blur"}], |
| | | type: [{required: true, message: "è¯·éæ©ææ¡£ç±»å", trigger: "blur"}], |
| | | status: [{required: true, message: "è¯·éæ©ææ¡£ç¶æ", trigger: "blur"}], |
| | | }; |
| | | const fileUploadRef = ref(null); |
| | | const initForm = () => { |
| | | ruleForm.value = {}; |
| | | fileUploadRef.value.init(); |
| | | nextTick(() => { |
| | | fileUploadRef.value.init(); |
| | | }); |
| | | }; |
| | | const editForm = (val) => { |
| | | ruleForm.value = copyForm.value; |
| | |
| | | editForm, |
| | | }); |
| | | const options = [ |
| | | { value: "ææ", label: "ææ" }, |
| | | { value: "æ æ", label: "æ æ" }, |
| | | { value: "ä½åº", label: "ä½åº" }, |
| | | {value: "ææ", label: "ææ"}, |
| | | {value: "æ æ", label: "æ æ"}, |
| | | {value: "ä½åº", label: "ä½åº"}, |
| | | ]; |
| | | const emit = defineEmits(["submitForm", "update:modelValue"]); |
| | | const modelValue = ref([]); |
| | |
| | | // è°ç¨ API |
| | | try { |
| | | const res = await addOrEditArchive(ruleForm.value); |
| | | ElMessage({ |
| | | type: "success", |
| | | message: res.msg || "æä½æå", |
| | | }); |
| | | emit("submitForm", res); |
| | | } catch (error) { |
| | | ElMessage({ |
| | |
| | | // åé emit äºä»¶ |
| | | |
| | | // å
³éå¯¹è¯æ¡ |
| | | ElMessage.success("æä½æå"); |
| | | centerDialogVisible.value = false; |
| | | } catch (error) { |
| | | ElMessage({ |
| | |
| | | <template> |
| | | <div> <el-form :inline="true" :model="queryParams" class="search-form"> |
| | | <el-form-item label="æç´¢" v-if="shouldShowSearch"> |
| | | <el-input v-model="queryParams.searchAll" :placeholder="searchPlaceholder" clearable /> |
| | | <div> |
| | | <el-form :inline="true" :model="queryParams" class="search-form"> |
| | | <el-form-item v-if="shouldShowSearch" label="æç´¢"> |
| | | <el-input v-model="queryParams.searchAll" :placeholder="searchPlaceholder" clearable/> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="search">æ¥è¯¢</el-button> |
| | |
| | | <el-card> |
| | | <!-- æ ç¾é¡µ --> |
| | | <el-tabs v-model="activeTab" class="info-tabs" @tab-click="handleTabClick"> |
| | | <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name" /> |
| | | <el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.label" :name="tab.name"/> |
| | | </el-tabs> |
| | | |
| | | <!-- æä½æé®åº --> |
| | | <el-row :gutter="24" class="table-toolbar"> |
| | | <el-button type="primary" :icon="Plus" @click="handleAdd">æ°å»º</el-button> |
| | | <el-button type="danger" :icon="Delete" @click="handleDelete">å é¤</el-button> |
| | | <el-button type="info" :icon="Download" @click="handleExport" v-show="canExport">导åº</el-button> |
| | | <el-button :icon="Plus" type="primary" @click="handleAdd">æ°å»º</el-button> |
| | | <el-button :icon="Delete" type="danger" @click="handleDelete">å é¤</el-button> |
| | | <el-button @click="jump">admins</el-button> |
| | | <el-button v-show="canExport" :icon="Download" type="info" @click="handleExport">导åº</el-button> |
| | | </el-row> <!-- è¡¨æ ¼ç»ä»¶ --> |
| | | <div> |
| | | <data-table :loading="loading" :table-data="tableData" :columns="columns" |
| | | @selection-change="handleSelectionChange" @edit="handleEdit" :show-selection="true" :border="true"> <!-- åæ®µåç§°åçèªå®ä¹ææ§½ - æ¾ç¤ºä¸ºæ ç¾ --> |
| | | <data-table :border="true" :columns="columns" :loading="loading" |
| | | :show-selection="true" :table-data="tableData" @edit="handleEdit" @selection-change="handleSelectionChange"> |
| | | <!-- åæ®µåç§°åçèªå®ä¹ææ§½ - æ¾ç¤ºä¸ºæ ç¾ --> |
| | | <template v-if="tabName === 'coalQualityMaintenance'" #fieldIds="{ row }"> |
| | | <template v-if="typeof row.fieldIds === 'string' && row.fieldIds.includes(',')"> |
| | | <el-tag v-for="(field, index) in row.fieldIds.split(',')" :key="index" type="primary" size="small" |
| | | style="margin-right: 4px; margin-bottom: 2px;"> |
| | | <el-tag v-for="(field, index) in row.fieldIds.split(',')" :key="index" size="small" style="margin-right: 4px; margin-bottom: 2px;" |
| | | type="primary"> |
| | | {{ getFieldDisplayName(field.trim()) }} |
| | | </el-tag> |
| | | </template> |
| | | <template v-else> |
| | | <el-tag type="primary" size="small"> |
| | | <el-tag size="small" type="primary"> |
| | | {{ getFieldDisplayName(row.fieldIds) || '--' }} |
| | | </el-tag> |
| | | </template> |
| | | </template> |
| | | </data-table> |
| | | </div> |
| | | <pagination v-if="total > 0" :page="pageNum" :limit="pageSizes" :total="total" @pagination="handPagination" |
| | | :layout="'total, prev, pager, next, jumper'" /> |
| | | <pagination v-if="total > 0" :layout="'total, prev, pager, next, jumper'" :limit="pageSizes" :page="pageNum" :total="total" |
| | | @pagination="handPagination"/> |
| | | <Supplier v-if="tabName === 'supplier'" v-model:copyForm="copyForm" |
| | | v-model:supplierDialogFormVisible="dialogFormVisible" :form="form" :title="title" @submit="handleSubmit" |
| | | @beforeClose="handleBeforeClose" @update:dialogFormVisible="handleDialogFormVisible" :addOrEdit="addOrEdit" /> |
| | | v-model:supplierDialogFormVisible="dialogFormVisible" :addOrEdit="addOrEdit" :form="form" :title="title" |
| | | @beforeClose="handleBeforeClose" @submit="handleSubmit" |
| | | @update:dialogFormVisible="handleDialogFormVisible"/> |
| | | <Customer v-if="tabName === 'customer'" v-model:copyForm="copyForm" |
| | | v-model:customerDialogFormVisible="dialogFormVisible" :form="form" :title="title" @submit="handleSubmit" |
| | | :addOrEdit="addOrEdit" @beforeClose="handleBeforeClose" /> |
| | | <Coal v-if="tabName === 'coal'" v-model:copyForm="copyForm" v-model:coalDialogFormVisible="dialogFormVisible" |
| | | :form="form" :title="title" :addOrEdit="addOrEdit" @submit="handleSubmit" /> |
| | | <coalQualityMaintenance v-if="tabName === 'coalQualityMaintenance'" v-model:copyForm="copyForm" |
| | | v-model:coalQualityMaintenanceDialogFormVisible="dialogFormVisible" :form="form" :title="title" |
| | | :addOrEdit="addOrEdit" @submit="handleSubmit" /> |
| | | <coalMeiZhiZiDuanWeiHu v-if="tabName === 'coalMeiZhiZiDuanWeiHu'" v-model:copyForm="copyForm" |
| | | v-model:coalMaintenanceFieldDialogVisible="dialogFormVisible" :form="form" :title="title" :addOrEdit="addOrEdit" |
| | | @submit="handleSubmit" /> |
| | | v-model:customerDialogFormVisible="dialogFormVisible" :addOrEdit="addOrEdit" :form="form" :title="title" |
| | | @beforeClose="handleBeforeClose" @submit="handleSubmit"/> |
| | | <Coal v-if="tabName === 'coal'" v-model:coalDialogFormVisible="dialogFormVisible" v-model:copyForm="copyForm" |
| | | :addOrEdit="addOrEdit" :form="form" :title="title" @submit="handleSubmit"/> |
| | | <coalQualityMaintenance v-if="tabName === 'coalQualityMaintenance'" v-model:coalQualityMaintenanceDialogFormVisible="dialogFormVisible" |
| | | v-model:copyForm="copyForm" :addOrEdit="addOrEdit" |
| | | :form="form" |
| | | :title="title" @submit="handleSubmit"/> |
| | | <coalMeiZhiZiDuanWeiHu v-if="tabName === 'coalMeiZhiZiDuanWeiHu'" v-model:coalMaintenanceFieldDialogVisible="dialogFormVisible" |
| | | v-model:copyForm="copyForm" :addOrEdit="addOrEdit" :form="form" |
| | | :title="title" |
| | | @submit="handleSubmit"/> |
| | | </el-card> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // ===== æ ¸å¿ä¾èµå¯¼å
¥ ===== |
| | | import { ref, reactive, onMounted, computed, getCurrentInstance } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { Plus, Edit, Delete, Download } from "@element-plus/icons-vue"; |
| | | import {computed, getCurrentInstance, onMounted, reactive, ref, nextTick} from "vue"; |
| | | import {ElMessage, ElMessageBox} from "element-plus"; |
| | | import {Delete, Download, Plus} from "@element-plus/icons-vue"; |
| | | |
| | | // ===== ç»ä»¶å¯¼å
¥ ===== |
| | | import DataTable from "@/components/Table/ETable.vue"; |
| | |
| | | import coalMeiZhiZiDuanWeiHu from "./mould/coalMeiZhiZiDuanWeiHu.vue"; |
| | | |
| | | // ===== API æå¡å¯¼å
¥ ===== |
| | | import { getSupply, delSupply } from "@/api/basicInformation/supplier.js"; |
| | | import { getCoalInfo, delCoalInfo } from "@/api/basicInformation/coal.js"; |
| | | import { testUserList } from "@/api/tool/publicInterface.js"; |
| | | import { getAreaOptions } from "@/api/system/area.js"; |
| | | import { getCustomerList, delCustomer } from "@/api/basicInformation/customer.js"; |
| | | import { coalField, deleteCoalField } from "@/api/basicInformation/coalFieldMaintenance.js"; |
| | | import { getCoalFieldList, getCoalPlanList } from "@/api/basicInformation/coalQualityMaintenance"; |
| | | import {delSupply, getSupply} from "@/api/basicInformation/supplier.js"; |
| | | import {delCoalInfo, getCoalInfo} from "@/api/basicInformation/coal.js"; |
| | | import {testUserList} from "@/api/tool/publicInterface.js"; |
| | | import {getAreaOptions} from "@/api/system/area.js"; |
| | | import {delCustomer, getCustomerList} from "@/api/basicInformation/customer.js"; |
| | | import {coalField, deleteCoalField} from "@/api/basicInformation/coalFieldMaintenance.js"; |
| | | import {getCoalFieldList, getCoalPlanList} from "@/api/basicInformation/coalQualityMaintenance"; |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | const {proxy} = getCurrentInstance(); |
| | | import router from "@/router"; |
| | | |
| | | // ===== ååºå¼ç¶æç®¡ç ===== |
| | | |
| | | const jump = () => { |
| | | }; |
| | | // å¼¹çªæ§å¶ç¶æ |
| | | const dialogFormVisible = ref(false); |
| | | const form = ref({}); |
| | |
| | | |
| | | // æ ç¾é¡µé
ç½® |
| | | const tabs = reactive([ |
| | | { name: "supplier", label: "ä¾åºåä¿¡æ¯" }, |
| | | { name: "customer", label: "客æ·ä¿¡æ¯" }, |
| | | { name: "coal", label: "ç
¤ç§ä¿¡æ¯" }, |
| | | { name: "coalQualityMaintenance", label: "ç
¤è´¨æ¹æ¡" }, |
| | | { name: "coalMeiZhiZiDuanWeiHu", label: "ç
¤è´¨å段" } |
| | | {name: "supplier", label: "ä¾åºåä¿¡æ¯"}, |
| | | {name: "customer", label: "客æ·ä¿¡æ¯"}, |
| | | {name: "coal", label: "ç
¤ç§ä¿¡æ¯"}, |
| | | {name: "coalQualityMaintenance", label: "ç
¤è´¨æ¹æ¡"}, |
| | | {name: "coalMeiZhiZiDuanWeiHu", label: "ç
¤è´¨å段"} |
| | | ]); |
| | | |
| | | // ===== å·¥å
·å½æ° ===== |
| | |
| | | * @description å°å°åIDæ°ç»è½¬æ¢ä¸ºå¯è¯»çå°åå符串 |
| | | */ |
| | | const formatAddressArray = (addressIds) => { |
| | | if (!addressMap.value || Object.keys(addressMap.value).length === 0 || |
| | | !addressIds || !Array.isArray(addressIds) || addressIds.length === 0 || |
| | | if (!addressMap.value || Object.keys(addressMap.value).length === 0 || |
| | | !addressIds || !Array.isArray(addressIds) || addressIds.length === 0 || |
| | | addressIds.every(id => !id)) { |
| | | return '--'; |
| | | } |
| | | |
| | | |
| | | const addressNames = addressIds.map(id => addressMap.value[id]?.name || '--'); |
| | | |
| | | |
| | | if (addressNames.every(name => name === '--')) { |
| | | return '--'; |
| | | } |
| | | |
| | | |
| | | return addressNames.filter(name => name !== '--').join(' / '); |
| | | }; |
| | | |
| | |
| | | */ |
| | | const coalFieldData = async () => { |
| | | try { |
| | | const { data, code } = await getCoalFieldList(); |
| | | const {data, code} = await getCoalFieldList(); |
| | | if (code === 200) { |
| | | coalFieldList.value = data; |
| | | } |
| | |
| | | */ |
| | | const getFieldDisplayName = (fieldId) => { |
| | | if (!fieldId) return '--'; |
| | | |
| | | |
| | | const numId = parseInt(fieldId); |
| | | const matchedField = coalFieldList.value.find(item => item.id === numId); |
| | | |
| | | |
| | | return matchedField ? matchedField.fieldName : numId; |
| | | }; |
| | | |
| | |
| | | const searchPlaceholder = computed(() => { |
| | | const placeholderMap = { |
| | | supplier: "ä¾åºå/è¯å«ç /详ç»å°å", |
| | | customer: "ä¾åºå/è¯å«ç /详ç»å°å", |
| | | customer: "ä¾åºå/è¯å«ç /详ç»å°å", |
| | | coal: "请è¾å
¥æç´¢ä¿¡æ¯", |
| | | coalQualityMaintenance: "请è¾å
¥æç´¢ä¿¡æ¯", |
| | | coalMeiZhiZiDuanWeiHu: "请è¾å
¥æç´¢ä¿¡æ¯" |
| | |
| | | * æ¯å¦æ¾ç¤ºæç´¢æ¡ |
| | | */ |
| | | const shouldShowSearch = computed(() => { |
| | | return ['supplier', 'customer', 'coal', 'coalQualityMaintenance','coalMeiZhiZiDuanWeiHu'].includes(tabName.value); |
| | | return ['supplier', 'customer', 'coal', 'coalQualityMaintenance', 'coalMeiZhiZiDuanWeiHu'].includes(tabName.value); |
| | | }); |
| | | |
| | | /** |
| | |
| | | * ä¾åºåè¡¨æ ¼åé
ç½® |
| | | */ |
| | | const supplierColumns = ref([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minWidth: 100 }, |
| | | { prop: "taxpayerId", label: "ç»ä¸äººè¯å«å·", minWidth: 170 }, |
| | | {prop: "supplierName", label: "ä¾åºååç§°", minWidth: 100}, |
| | | {prop: "taxpayerId", label: "ç»ä¸äººè¯å«å·", minWidth: 170}, |
| | | { |
| | | prop: "bids", |
| | | label: "ç»è¥å°å", |
| | |
| | | return formatAddressArray(addressIds); |
| | | } |
| | | }, |
| | | { prop: "businessAddress", label: "ç»è¥è¯¦ç»å°å", minWidth: 150 }, |
| | | { prop: "bankAccount", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankName", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contactPerson", label: "è系人", minWidth: 100 }, |
| | | {prop: "businessAddress", label: "ç»è¥è¯¦ç»å°å", minWidth: 150}, |
| | | {prop: "bankAccount", label: "弿·è¡", minWidth: 120}, |
| | | {prop: "bankName", label: "é¶è¡è´¦å·", minWidth: 150}, |
| | | {prop: "contactPerson", label: "è系人", minWidth: 100}, |
| | | { |
| | | prop: "cids", |
| | | label: "è系人å°å", |
| | |
| | | return formatAddressArray(addressIds); |
| | | } |
| | | }, |
| | | { prop: "contactAddress", label: "è系人详ç»å°å", minWidth: 120 }, |
| | | { prop: "updateTime", label: "ç»´æ¤æ¥æ", minWidth: 120 }, |
| | | {prop: "contactAddress", label: "è系人详ç»å°å", minWidth: 120}, |
| | | {prop: "updateTime", label: "ç»´æ¤æ¥æ", minWidth: 120}, |
| | | ]); |
| | | |
| | | /** |
| | | * 客æ·è¡¨æ ¼åé
ç½® |
| | | */ |
| | | const customerColumns = ref([ |
| | | { prop: "customerName", label: "客æ·åç§°", minWidth: 100 }, |
| | | { prop: "taxpayerId", label: "ç»ä¸äººè¯å«å·", minWidth: 120 }, |
| | | {prop: "customerName", label: "客æ·åç§°", minWidth: 100}, |
| | | {prop: "taxpayerId", label: "ç»ä¸äººè¯å«å·", minWidth: 120}, |
| | | { |
| | | prop: "bids", |
| | | label: "ç»è¥å°å", |
| | |
| | | return formatAddressArray(addressIds); |
| | | } |
| | | }, |
| | | { prop: "businessAddress", label: "详ç»å°å", minWidth: 150 }, |
| | | { prop: "bankName", label: "弿·è¡", minWidth: 120 }, |
| | | { prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150 }, |
| | | { prop: "contactPerson", label: "è系人", minWidth: 100 }, |
| | | { prop: "contactPhone", label: "è系人çµè¯", minWidth: 100 }, |
| | | {prop: "businessAddress", label: "详ç»å°å", minWidth: 150}, |
| | | {prop: "bankName", label: "弿·è¡", minWidth: 120}, |
| | | {prop: "bankAccount", label: "é¶è¡è´¦å·", minWidth: 150}, |
| | | {prop: "contactPerson", label: "è系人", minWidth: 100}, |
| | | {prop: "contactPhone", label: "è系人çµè¯", minWidth: 100}, |
| | | { |
| | | prop: "cids", |
| | | label: "è系人å°å", |
| | |
| | | return formatAddressArray(addressIds); |
| | | } |
| | | }, |
| | | { prop: "contactAddress", label: "è系人详ç»å°å", minWidth: 150 }, |
| | | { prop: "updateTime", label: "ç»´æ¤æ¥æ", minWidth: 100 }, |
| | | {prop: "contactAddress", label: "è系人详ç»å°å", minWidth: 150}, |
| | | {prop: "updateTime", label: "ç»´æ¤æ¥æ", minWidth: 100}, |
| | | ]); |
| | | |
| | | /** |
| | | * ç
¤ç§è¡¨æ ¼åé
ç½® |
| | | */ |
| | | const coalColumns = ref([ |
| | | { prop: "coal", label: "ç
¤ç§åç§°", minWidth: 200 }, |
| | | {prop: "coal", label: "ç
¤ç§åç§°", minWidth: 200}, |
| | | { |
| | | prop: "maintainerId", |
| | | label: "ç»´æ¤äºº", |
| | |
| | | return userMap.value[cellValue] || '--'; |
| | | } |
| | | }, |
| | | { prop: "maintenanceDate", label: "ç»´æ¤æ¥æ", minWidth: 150 }, |
| | | {prop: "maintenanceDate", label: "ç»´æ¤æ¥æ", minWidth: 150}, |
| | | ]); |
| | | |
| | | /** |
| | | * ç
¤è´¨æ¹æ¡è¡¨æ ¼åé
ç½® |
| | | */ |
| | | const coalQualityMaintenanceColumns = ref([ |
| | | { prop: "plan", label: "æ¹æ¡åç§°", minWidth: 100 }, |
| | | {prop: "plan", label: "æ¹æ¡åç§°", minWidth: 100}, |
| | | { |
| | | prop: "fieldIds", |
| | | label: "åæ®µåç§°", |
| | |
| | | return cellValue || '--'; |
| | | } |
| | | }, |
| | | { prop: "schemeDesc", label: "åæ®µæè¿°", minWidth: 100 }, |
| | | {prop: "schemeDesc", label: "åæ®µæè¿°", minWidth: 100}, |
| | | ]); |
| | | |
| | | /** |
| | | * ç
¤è´¨åæ®µè¡¨æ ¼åé
ç½® |
| | | */ |
| | | const coalMeiZhiZiDuanWeiHuColumns = ref([ |
| | | { prop: "fieldName", label: "åæ®µåç§°", minWidth: 200 }, |
| | | { prop: "fieldDescription", label: "åæ®µæè¿°", minWidth: 200 }, |
| | | {prop: "fieldName", label: "åæ®µåç§°", minWidth: 200}, |
| | | {prop: "fieldDescription", label: "åæ®µæè¿°", minWidth: 200}, |
| | | ]); |
| | | // ===== äºä»¶å¤ç彿° ===== |
| | | |
| | |
| | | */ |
| | | const handleAddEdit = (currentTabName) => { |
| | | const actionText = addOrEdit.value === "add" ? "æ°å¢" : "ç¼è¾"; |
| | | |
| | | |
| | | const tabTitleMap = { |
| | | supplier: "ä¾åºåä¿¡æ¯", |
| | | customer: "客æ·ä¿¡æ¯", |
| | | customer: "客æ·ä¿¡æ¯", |
| | | coal: "ç
¤ç§ä¿¡æ¯", |
| | | coalQualityMaintenance: "ç
¤è´¨æ¹æ¡ç»´æ¤", |
| | | coalMeiZhiZiDuanWeiHu: "ç
¤è´¨å段维æ¤" |
| | |
| | | */ |
| | | const handleEdit = (row) => { |
| | | form.value = JSON.parse(JSON.stringify(row)); |
| | | |
| | | |
| | | // æå»ºä¾åºåä¸å¡å°åæ°ç» |
| | | if (form.value.bprovinceId && form.value.bdistrictId && form.value.bcityId) { |
| | | form.value.bids = [row.bprovinceId, row.bcityId, row.bdistrictId]; |
| | | } |
| | | |
| | | |
| | | // æå»ºä¾åºåèç³»å°åæ°ç» |
| | | if (form.value.cprovinceId && form.value.cdistrictId && form.value.ccityId) { |
| | | form.value.cids = [row.cprovinceId, row.ccityId, row.cdistrictId]; |
| | | } |
| | | |
| | | |
| | | // æå»ºå®¢æ·ä¸å¡å°åæ°ç» |
| | | if (form.value.businessCityId && form.value.businessDistrictId && form.value.businessProvinceId) { |
| | | form.value.bids = [row.businessProvinceId, row.businessCityId, row.businessDistrictId]; |
| | | } |
| | | |
| | | |
| | | // æå»ºå®¢æ·èç³»å°åæ°ç» |
| | | if (form.value.cityId && form.value.districtId && form.value.provinceId) { |
| | | form.value.cids = [row.provinceId, row.cityId, row.districtId]; |
| | | } |
| | | |
| | | |
| | | addOrEdit.value = "edit"; |
| | | handleAddEdit(tabName.value); |
| | | }; |
| | |
| | | } |
| | | |
| | | const deleteIds = selectedRows.value.map(item => item.id); |
| | | |
| | | |
| | | try { |
| | | await ElMessageBox.confirm("ç¡®å®å é¤éä¸çæ°æ®åï¼", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | |
| | | const deleteApiMap = { |
| | | supplier: delSupply, |
| | | coal: delCoalInfo, |
| | | coalQualityMaintenance: () => { throw new Error('delCoalQuality API not imported'); }, |
| | | coalQualityMaintenance: () => { |
| | | throw new Error('delCoalQuality API not imported'); |
| | | }, |
| | | customer: delCustomer, |
| | | coalMeiZhiZiDuanWeiHu: deleteCoalField |
| | | }; |
| | |
| | | } |
| | | console.log(deleteIds) |
| | | const res = await deleteApi(deleteIds); |
| | | |
| | | |
| | | if (res.code !== 200 && res.msg !== "æä½æå") { |
| | | ElMessage.error("å é¤å¤±è´¥ï¼" + res.msg); |
| | | return; |
| | | } |
| | | |
| | | |
| | | ElMessage.success("å 餿å"); |
| | | await getList(); |
| | | } catch (error) { |
| | |
| | | */ |
| | | const handleExport = () => { |
| | | const exportConfig = { |
| | | supplier: { api: "/supply/export", name: "ä¾åºåä¿¡æ¯" }, |
| | | customer: { api: "/customer/export", name: "客æ·ä¿¡æ¯" }, |
| | | coal: { api: "/supply/export", name: "ç
¤ç§ä¿¡æ¯" }, |
| | | coalQualityMaintenance: { api: "/supply/export", name: "ç
¤è´¨ç»´æ¤ä¿¡æ¯" } |
| | | supplier: {api: "/supply/export", name: "ä¾åºåä¿¡æ¯"}, |
| | | customer: {api: "/customer/export", name: "客æ·ä¿¡æ¯"}, |
| | | coal: {api: "/supply/export", name: "ç
¤ç§ä¿¡æ¯"}, |
| | | coalQualityMaintenance: {api: "/supply/export", name: "ç
¤è´¨ç»´æ¤ä¿¡æ¯"} |
| | | }; |
| | | |
| | | const config = exportConfig[tabName.value]; |
| | |
| | | * @param {string} name - å¯¼åºæä»¶ååç¼ |
| | | */ |
| | | const exportData = (api, name) => { |
| | | proxy.download(api, { ...queryParams }, `${name}${new Date().getTime()}.xlsx`); |
| | | proxy.download(api, {...queryParams}, `${name}${new Date().getTime()}.xlsx`); |
| | | ElMessage.success("å¯¼åºæ°æ®ï¼" + name); |
| | | }; |
| | | // ===== æ°æ®è·å彿° ===== |
| | |
| | | const getList = async () => { |
| | | try { |
| | | loading.value = true; |
| | | const { data, code } = await selectInterface(); |
| | | |
| | | const {data, code} = await selectInterface(); |
| | | |
| | | if (code !== 200) { |
| | | ElMessage.error("è·åæ°æ®å¤±è´¥ï¼" + (data?.msg || 'æªç¥é误')); |
| | | return; |
| | | } |
| | | |
| | | |
| | | tableData.value = data.records || []; |
| | | total.value = data.total || 0; |
| | | } catch (error) { |
| | |
| | | try { |
| | | // å¹¶è¡æ§è¡åå§åæä½ |
| | | await Promise.all([ |
| | | handleTabClick({ props: { name: "supplier" } }), |
| | | handleTabClick({props: {name: "supplier"}}), |
| | | fetchAreaOptions(), |
| | | getUserList() |
| | | ]); |
| | |
| | | |
| | | /* è¡¨æ ¼å·¥å
·æ */ |
| | | .table-toolbar, |
| | | .table-toolbar>* { |
| | | .table-toolbar > * { |
| | | margin: 0 0 0 0 !important; |
| | | } |
| | | |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="500" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | > <el-form |
| | | ref="formRef" |
| | | style="max-width: 600px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="120px" |
| | | > |
| | | <el-form-item label="ç
¤ç§åç§°" prop="coal"> |
| | | <el-input |
| | | v-model="formData.coal" |
| | | placeholder="请è¾å
¥ç
¤ç§åç§°" |
| | | /> |
| | | </el-form-item> <el-form-item label="ç»´æ¤äººå§å" prop="maintainerId"> |
| | | <el-input |
| | | :value="userStore.name || ''" |
| | | placeholder="ç»´æ¤äººå§å" |
| | | disabled |
| | | /> |
| | | </el-form-item> <el-form-item label="ç»´æ¤æ¥æ" prop="maintenanceDate"> |
| | | <el-input |
| | | :value="getCurrentDate()" |
| | | placeholder="ç»´æ¤æ¥æ" |
| | | disabled |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item class="dialog-footer"> |
| | | <el-button v-if="addOrEdit === 'edit'" @click="resetForm">éç½®</el-button> |
| | | <el-button v-if="addOrEdit === 'add'" @click="cancelForm">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm"> |
| | | ç¡®å® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | | </div> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="500" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | style="max-width: 600px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="120px" |
| | | > |
| | | <el-form-item label="ç
¤ç§åç§°" prop="coal"> |
| | | <el-input |
| | | v-model="formData.coal" |
| | | placeholder="请è¾å
¥ç
¤ç§åç§°" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»´æ¤äººå§å" prop="maintainerId"> |
| | | <el-input |
| | | :value="userStore.name || ''" |
| | | placeholder="ç»´æ¤äººå§å" |
| | | disabled |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="ç»´æ¤æ¥æ" prop="maintenanceDate"> |
| | | <el-input |
| | | :value="getCurrentDate()" |
| | | placeholder="ç»´æ¤æ¥æ" |
| | | disabled |
| | | /> |
| | | </el-form-item> |
| | | |
| | | <el-form-item class="dialog-footer"> |
| | | <el-button v-if="addOrEdit === 'edit'" @click="resetForm">éç½®</el-button> |
| | | <el-button v-if="addOrEdit === 'add'" @click="cancelForm">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm"> |
| | | ç¡®å® |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch, defineProps, reactive, onMounted } from 'vue' |
| | | import { addOrEditCoalInfo } from '@/api/basicInformation/coal' |
| | | import {ref, watch, defineProps, reactive, onMounted} from 'vue' |
| | | import {addOrEditCoalInfo} from '@/api/basicInformation/coal' |
| | | import useUserStore from '@/store/modules/user' |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | | const props = defineProps({ |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => {} |
| | | }, |
| | | form: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | addOrEdit: { |
| | | type: String, |
| | | default: 'add' |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => { |
| | | } |
| | | }, |
| | | form: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | addOrEdit: { |
| | | type: String, |
| | | default: 'add' |
| | | }, |
| | | title: { |
| | | type: String, |
| | | default: '' |
| | | }, |
| | | }) |
| | | const copyForm = defineModel("copyForm", { |
| | | required: true, |
| | |
| | | }); |
| | | // å¨ç»ä»¶æè½½æ¶è·åç¨æ·ä¿¡æ¯ |
| | | onMounted(async () => { |
| | | // 妿store䏿²¡æç¨æ·ä¿¡æ¯ï¼åè·åç¨æ·ä¿¡æ¯ |
| | | if (!userStore.name) { |
| | | try { |
| | | await userStore.getInfo() |
| | | // èªå¨å¡«å
ç»´æ¤äººID |
| | | if (props.addOrEdit === 'add') { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | } catch (error) { |
| | | console.error('è·åç¨æ·ä¿¡æ¯å¤±è´¥:', error) |
| | | } |
| | | } else { |
| | | // èªå¨å¡«å
ç»´æ¤äººID |
| | | if (props.addOrEdit === 'add') { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | // 妿store䏿²¡æç¨æ·ä¿¡æ¯ï¼åè·åç¨æ·ä¿¡æ¯ |
| | | if (!userStore.name) { |
| | | try { |
| | | await userStore.getInfo() |
| | | // èªå¨å¡«å
ç»´æ¤äººID |
| | | if (props.addOrEdit === 'add') { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | } catch (error) { |
| | | console.error('è·åç¨æ·ä¿¡æ¯å¤±è´¥:', error) |
| | | } |
| | | } else { |
| | | // èªå¨å¡«å
ç»´æ¤äººID |
| | | if (props.addOrEdit === 'add') { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | } |
| | | }) |
| | | |
| | | const emit = defineEmits(['submit', 'handleBeforeClose','update:coalDialogFormVisible']) |
| | | const emit = defineEmits(['submit', 'handleBeforeClose', 'update:coalDialogFormVisible']) |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null) |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }) |
| | | const formData = ref({...props.form}) |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("coalDialogFormVisible",{required:true,type:Boolean}) |
| | | const dialogVisible = defineModel("coalDialogFormVisible", {required: true, type: Boolean}) |
| | | |
| | | // çå¬å¤é¨ä¼ å
¥çè¡¨åæ°æ®åå |
| | | watch(() => props.form, (newVal) => { |
| | | formData.value = { ...newVal } |
| | | // å¦ææ¯æ°å¢æ¨¡å¼ï¼è®¾ç½®ç»´æ¤äºº |
| | | if (props.addOrEdit === 'add' && userStore.id) { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | }, { deep: true }) |
| | | formData.value = {...newVal} |
| | | // å¦ææ¯æ°å¢æ¨¡å¼ï¼è®¾ç½®ç»´æ¤äºº |
| | | if (props.addOrEdit === 'add' && userStore.id) { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | }, {deep: true}) |
| | | |
| | | // çå¬å
é¨å¼¹çªç¶æåå |
| | | watch(() => dialogVisible.value, (newVal) => { |
| | | emit('update:coalDialogFormVisible', newVal) |
| | | emit('update:coalDialogFormVisible', newVal) |
| | | }) |
| | | |
| | | // æäº¤è¡¨å |
| | | const submitForm = async () => { |
| | | if (!formRef.value) return |
| | | await formRef.value.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | delete formData.value.maintainerName // å 餿¾ç¤ºç¨çåæ®µï¼åªä¿çID |
| | | |
| | | // ç¡®ä¿maintainerIdæå¼ |
| | | if (!formData.value.maintainerId) { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | |
| | | // è®¾ç½®ç»´æ¤æ¥æ |
| | | formData.value.maintenanceDate = getCurrentDate() |
| | | |
| | | let result = await addOrEditCoalInfo({ |
| | | ...formData.value, |
| | | }) |
| | | let obj = { |
| | | title: props.title, |
| | | result, |
| | | } |
| | | emit('submit', obj) |
| | | } |
| | | }) |
| | | if (!formRef.value) return |
| | | await formRef.value.validate(async (valid, fields) => { |
| | | if (valid) { |
| | | delete formData.value.maintainerName // å 餿¾ç¤ºç¨çåæ®µï¼åªä¿çID |
| | | |
| | | // ç¡®ä¿maintainerIdæå¼ |
| | | if (!formData.value.maintainerId) { |
| | | formData.value.maintainerId = userStore.id |
| | | } |
| | | |
| | | // è®¾ç½®ç»´æ¤æ¥æ |
| | | formData.value.maintenanceDate = getCurrentDate() |
| | | |
| | | let result = await addOrEditCoalInfo({ |
| | | ...formData.value, |
| | | }) |
| | | let obj = { |
| | | title: props.title, |
| | | result, |
| | | } |
| | | emit('submit', obj) |
| | | } |
| | | }) |
| | | } |
| | | // åæ¶è¡¨å |
| | | const cancelForm = () => { |
| | | emit('update:coalDialogFormVisible', false) |
| | | formData.value = {} |
| | | emit('update:coalDialogFormVisible', false) |
| | | formData.value = {} |
| | | } |
| | | // é置表å |
| | | const resetForm = () => { |
| | | if (!formRef.value) return |
| | | if (!formRef.value) return |
| | | formData.value = JSON.parse(JSON.stringify(copyForm.value)); |
| | | // formRef.value.resetFields() |
| | | // formRef.value.resetFields() |
| | | } |
| | | // å
³éå¼¹çª |
| | | const handleClose = () => { |
| | | // 触åç¶ç»ä»¶çå
³é彿° |
| | | emit("handleBeforeClose") |
| | | emit('update:coalDialogFormVisible', false) |
| | | // 触åç¶ç»ä»¶çå
³é彿° |
| | | emit("handleBeforeClose") |
| | | emit('update:coalDialogFormVisible', false) |
| | | } |
| | | const rules = reactive({ |
| | | supplierName: [ |
| | | { required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur"}, |
| | | ], |
| | | identifyNumber: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | { min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | {required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur"}, |
| | | {min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur"}, |
| | | ], |
| | | }); |
| | | |
| | | // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD |
| | | function getCurrentDate() { |
| | | const today = new Date(); |
| | |
| | | |
| | | <style lang="scss" scoped> |
| | | .dialog-footer { |
| | | display: flex; |
| | | margin-top: 20px; |
| | | flex-direction: column; |
| | | align-items: flex-end; |
| | | display: flex; |
| | | margin-top: 20px; |
| | | flex-direction: column; |
| | | align-items: flex-end; |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="600" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="600" |
| | | :close-on-click-modal="false" |
| | | :before-close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | style="max-width: 400px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | ref="formRef" |
| | | style="max-width: 400px; margin: 0 auto" |
| | | :model="formData" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | > |
| | | <el-form-item label="åæ®µåç§°" prop="fieldName"> |
| | | <el-input |
| | | v-model="formData.fieldName" |
| | | placeholder="请è¾å
¥å段åç§°" |
| | | v-model="formData.fieldName" |
| | | placeholder="请è¾å
¥å段åç§°" |
| | | /> |
| | | </el-form-item> <el-form-item label="åæ®µæè¿°" prop="fieldDescription"> |
| | | <el-input v-model="formData.fieldDescription" type="textarea" placeholder="请è¾å
¥å段æè¿°" /> |
| | | </el-form-item> |
| | | <el-form-item label="åæ®µæè¿°" prop="fieldDescription"> |
| | | <el-input v-model="formData.fieldDescription" type="textarea" placeholder="请è¾å
¥å段æè¿°"/> |
| | | </el-form-item> |
| | | <el-form-item class="dialog-footer"> |
| | | <el-button v-if="addOrEdit === 'edit'" @click="resetForm" |
| | | >éç½®</el-button |
| | | >éç½® |
| | | </el-button |
| | | > |
| | | <el-button v-if="addOrEdit === 'add'" @click="cancelForm" |
| | | >åæ¶</el-button |
| | | >åæ¶ |
| | | </el-button |
| | | > |
| | | <el-button type="primary" @click="submitForm"> ç¡®å® </el-button> |
| | | <el-button type="primary" @click="submitForm"> ç¡®å®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </el-dialog> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, watch, defineProps } from "vue"; |
| | | import { addOrEditCoalField } from "@/api/basicInformation/coalFieldMaintenance.js"; |
| | | import {ref, reactive, watch, defineProps} from "vue"; |
| | | import {addOrEditCoalField} from "@/api/basicInformation/coalFieldMaintenance.js"; |
| | | |
| | | const props = defineProps({ |
| | | form: { |
| | | type: Object, |
| | |
| | | const formRef = ref(); |
| | | const emit = defineEmits(["submit", "handleBeforeClose"]); |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }); |
| | | const formData = ref({...props.form}); |
| | | |
| | | // çå¬props.formçååï¼æ´æ°formData |
| | | watch(() => props.form, (newForm) => { |
| | | formData.value = { ...newForm }; |
| | | }, { deep: true, immediate: true }); |
| | | formData.value = {...newForm}; |
| | | }, {deep: true, immediate: true}); |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("coalMaintenanceFieldDialogVisible", { |
| | | required: true, |
| | |
| | | console.log("æäº¤è¡¨å", formData.value); |
| | | if (props.title.includes('æ°å¢')) { |
| | | let result = await addOrEditCoalField( |
| | | {...formData.value} |
| | | ,) |
| | | {...formData.value} |
| | | ,) |
| | | console.log(result); |
| | | obj.value = { |
| | | title: "æ°å¢", |
| | |
| | | }; |
| | | // é置表å |
| | | const resetForm = () => { |
| | | if (!formRef.value) return |
| | | if (!formRef.value) return |
| | | formData.value = JSON.parse(JSON.stringify(copyForm.value)); |
| | | } |
| | | // å
³éå¼¹çª |
| | |
| | | }; |
| | | const rules = reactive({ |
| | | fieldName: [ |
| | | { required: true, message: "请è¾å
¥ç
¤ç§åç§°", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥ç
¤ç§åç§°", trigger: "blur"}, |
| | | ], |
| | | }); |
| | | </script> |
| | |
| | | <!-- ç
¤è´¨æ¹æ¡ç»´æ¤å¼¹çªç»ä»¶ --> |
| | | <template> |
| | | <el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false" |
| | | :before-close="handleClose"> |
| | | :before-close="handleClose"> |
| | | <!-- 表ååºå --> |
| | | <el-form ref="formRef" :model="formData" :rules="formRules" label-width="120px" |
| | | style="max-width: 400px; margin: 0 auto"> |
| | | style="max-width: 400px; margin: 0 auto"> |
| | | <!-- æ¹æ¡åç§°è¾å
¥æ¡ --> |
| | | <el-form-item label="ç
¤è´¨æ¹æ¡åç§°" prop="plan"> |
| | | <el-input v-model="formData.plan" placeholder="请è¾å
¥ç
¤è´¨æ¹æ¡åç§°" clearable /> |
| | | <el-input v-model="formData.plan" placeholder="请è¾å
¥ç
¤è´¨æ¹æ¡åç§°" clearable/> |
| | | </el-form-item> |
| | | |
| | | <!-- ç
¤è´¨å段å¤éä¸ææ¡ --> |
| | | <el-form-item label="ç
¤è´¨æ¹æ¡ç±»å" prop="coalFieldList"> |
| | | <el-select v-model="formData.coalFieldList" placeholder="è¯·éæ©ç
¤è´¨æ¹æ¡ç±»å" style="width: 100%" clearable multiple> |
| | | <el-option v-for="item in fieldOptions" :key="item.id" :label="item.label" :value="item" /> |
| | | <el-select v-model="formData.coalFieldList" placeholder="è¯·éæ©ç
¤è´¨æ¹æ¡ç±»å" style="width: 100%" clearable |
| | | multiple> |
| | | <el-option v-for="item in fieldOptions" :key="item.id" :label="item.label" :value="item"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- æ¹æ¡æè¿°ææ¬å --> |
| | | <el-form-item label="ç
¤è´¨æ¹æ¡æè¿°" prop="schemeDesc"> |
| | | <el-input v-model="formData.schemeDesc" type="textarea" placeholder="请è¾å
¥ç
¤è´¨æ¹æ¡æè¿°" :rows="3" /> |
| | | <el-input v-model="formData.schemeDesc" type="textarea" placeholder="请è¾å
¥ç
¤è´¨æ¹æ¡æè¿°" :rows="3"/> |
| | | </el-form-item> |
| | | |
| | | <!-- æä½æé®åºå --> |
| | |
| | | </el-dialog> |
| | | </template> |
| | | <script setup> |
| | | import { ref, reactive, watch, computed, onMounted } from "vue"; |
| | | import { getCoalFieldList, addOrEditCoalPlan } from "@/api/basicInformation/coalQualityMaintenance"; |
| | | import {ref, reactive, watch, computed, onMounted} from "vue"; |
| | | import {getCoalFieldList, addOrEditCoalPlan} from "@/api/basicInformation/coalQualityMaintenance"; |
| | | |
| | | // ===== ç»ä»¶å±æ§å®ä¹ ===== |
| | | const props = defineProps({ |
| | | /** å
³éå¼¹çªåçåè°å½æ° */ |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => { }, |
| | | default: () => { |
| | | }, |
| | | }, |
| | | /** è¡¨åæ°æ® */ |
| | | form: { |
| | |
| | | default: "", |
| | | }, |
| | | }); |
| | | |
| | | const copyForm = defineModel("copyForm", { |
| | | required: true, |
| | | type: Object, |
| | | }); |
| | | // ===== äºä»¶å®ä¹ ===== |
| | | const emit = defineEmits(["submit", "handleBeforeClose"]); |
| | | |
| | |
| | | // ===== 表åéªè¯è§å ===== |
| | | const formRules = reactive({ |
| | | plan: [ |
| | | { required: true, message: "请è¾å
¥æ¹æ¡åç§°", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥æ¹æ¡åç§°", trigger: "blur"}, |
| | | ], |
| | | coalFieldList: [ |
| | | { required: true, message: "è¯·éæ©æ¹æ¡ç±»å", trigger: "blur" }, |
| | | {required: true, message: "è¯·éæ©æ¹æ¡ç±»å", trigger: "blur"}, |
| | | ], |
| | | }); |
| | | |
| | |
| | | const parseCoalFields = (coalFieldsStr) => { |
| | | if (!coalFieldsStr || typeof coalFieldsStr !== 'string') return []; |
| | | return coalFieldsStr |
| | | .split(',') |
| | | .map(id => parseInt(id.trim())) |
| | | .filter(id => !isNaN(id)); |
| | | .split(',') |
| | | .map(id => parseInt(id.trim())) |
| | | .filter(id => !isNaN(id)); |
| | | }; |
| | | |
| | | /** |
| | |
| | | * @param {Object} newForm - æ°çè¡¨åæ°æ® |
| | | */ |
| | | const initFormData = (newForm) => { |
| | | formData.value = { ...newForm }; |
| | | formData.value = {...newForm}; |
| | | // å¤ç coalFieldList åæ®µï¼ç¼è¾æ¶éè¦å°å符串转æ¢ä¸ºæ°ç»ä¾å¤éç»ä»¶ä½¿ç¨ |
| | | if (newForm.fieldIds) { |
| | | if (typeof newForm.fieldIds === 'string') { |
| | |
| | | const ids = parseCoalFields(newForm.fieldIds); |
| | | formData.value.coalFieldList = ids.map(id => { |
| | | const option = fieldOptions.find(opt => opt.value === id); |
| | | return option || { fields: `åæ®µ${id}`, value: id }; |
| | | return option || {fields: `åæ®µ${id}`, value: id}; |
| | | }); |
| | | } else if (Array.isArray(newForm.coalFieldList)) { |
| | | // ç¡®ä¿æ°ç»ä¸çå¼é½æ¯æ£ç¡®çå¯¹è±¡æ ¼å¼ |
| | |
| | | // 妿æ¯çº¯IDï¼éè¦å¹é
对åºçé项 |
| | | const id = parseInt(item); |
| | | const option = fieldOptions.find(opt => opt.value === id); |
| | | return option || { fields: `åæ®µ${id}`, value: id }; |
| | | return option || {fields: `åæ®µ${id}`, value: id}; |
| | | } |
| | | }); |
| | | } |
| | |
| | | */ |
| | | onMounted(async () => { |
| | | try { |
| | | const { data, code } = await getCoalFieldList(); |
| | | const {data, code} = await getCoalFieldList(); |
| | | if (code === 200) { |
| | | // æå»ºéé¡¹æ°æ®ï¼æ ¼å¼å为{ label, value } |
| | | fieldOptions.push(...data.map(item => ({ |
| | | label: item.fieldName, |
| | | value: item.id, |
| | | fields:item.fields |
| | | fields: item.fields |
| | | }))); |
| | | } else { |
| | | console.error("è·åç
¤è´¨å段å表失败", data); |
| | |
| | | * é置表å |
| | | */ |
| | | const resetForm = () => { |
| | | if (!formRef.value) return; |
| | | formRef.value.resetFields(); |
| | | formData.value = JSON.parse(JSON.stringify(copyForm.value)); |
| | | initFormData(formData.value); |
| | | }; |
| | | |
| | | /** |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false" |
| | | :before-close="handleClose"> |
| | | <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" label-width="auto"> |
| | | :before-close="handleClose"> |
| | | <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" |
| | | label-width="auto"> |
| | | <el-form-item label="客æ·åç§°" prop="customerName"> |
| | | <el-input v-model="formData.customerName" placeholder="请è¾å
¥å®¢æ·åç§°" /> |
| | | <el-input v-model="formData.customerName" placeholder="请è¾å
¥å®¢æ·åç§°"/> |
| | | </el-form-item> |
| | | <el-form-item label="纳ç¨äººè¯å«å·" prop="taxpayerId"> |
| | | <el-input v-model="formData.taxpayerId" placeholder="请è¾å
¥çº³ç¨äººè¯å«å·" /> |
| | | <el-input v-model="formData.taxpayerId" placeholder="请è¾å
¥çº³ç¨äººè¯å«å·"/> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å" prop="bids"> |
| | | <el-cascader placeholder="è¯·éæ©ç»è¥å°å" size="default" :options="addressSelectOptions" v-model="formData.bids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | <el-cascader placeholder="è¯·éæ©ç»è¥å°å" size="default" :options="addressSelectOptions" |
| | | v-model="formData.bids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | </el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥è¯¦ç»å°å" prop="businessAddress"> |
| | | <el-input v-model="formData.businessAddress" placeholder="请è¾å
¥ç»è¥è¯¦ç»å°å" /> |
| | | <el-input v-model="formData.businessAddress" placeholder="请è¾å
¥ç»è¥è¯¦ç»å°å"/> |
| | | </el-form-item> |
| | | <el-form-item label="弿·è¡" prop="bankName"> |
| | | <el-input v-model="formData.bankName" placeholder="请è¾å
¥å¼æ·è¡" /> |
| | | <el-input v-model="formData.bankName" placeholder="请è¾å
¥å¼æ·è¡"/> |
| | | </el-form-item> |
| | | <el-form-item label="é¶è¡è´¦æ·" prop="bankAccount"> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥é¶è¡è´¦æ·" /> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥é¶è¡è´¦æ·"/> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contactPerson"> |
| | | <el-input v-model="formData.contactPerson" placeholder="请è¾å
¥è系人" /> |
| | | <el-input v-model="formData.contactPerson" placeholder="请è¾å
¥è系人"/> |
| | | </el-form-item> |
| | | <el-form-item label="èç³»çµè¯" prop="contactPhone"> |
| | | <el-input v-model="formData.contactPhone" placeholder="请è¾å
¥èç³»çµè¯" /> |
| | | <el-input v-model="formData.contactPhone" placeholder="请è¾å
¥èç³»çµè¯"/> |
| | | </el-form-item> |
| | | |
| | | |
| | | <el-form-item label="è系人å°å" prop="cids"> |
| | | <el-cascader placeholder="è¯·éæ©è系人å°å" size="default" :options="addressSelectOptions" v-model="formData.cids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | <el-cascader placeholder="è¯·éæ©è系人å°å" size="default" :options="addressSelectOptions" |
| | | v-model="formData.cids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | </el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="è系人详ç»" prop="contactAddress"> |
| | | <el-input v-model="formData.contactAddress" placeholder="请è¾å
¥è系人详ç»å°å" /> |
| | | <el-input v-model="formData.contactAddress" placeholder="请è¾å
¥è系人详ç»å°å"/> |
| | | </el-form-item> |
| | | <el-form-item class="dialog-footer"> |
| | | <el-form-item class="dialog-footer"> |
| | | <el-button v-if="addOrEdit === 'edit'" @click="resetForm">éç½®</el-button> |
| | | <el-button v-if="addOrEdit === 'add'" @click="cancelForm">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm"> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch, onMounted } from "vue"; |
| | | import { getAreaOptions } from "@/api/system/area.js"; |
| | | import {ref, watch, onMounted} from "vue"; |
| | | import {getAreaOptions} from "@/api/system/area.js"; |
| | | import addressList from "@/api/jsonApi/areaList.json"; |
| | | import { addOrEditCustomer } from "@/api/basicInformation/customer"; |
| | | import {addOrEditCustomer} from "@/api/basicInformation/customer"; |
| | | |
| | | const props = defineProps({ |
| | | beforeClose: { |
| | | type: Function, |
| | | default: () => { }, |
| | | default: () => { |
| | | }, |
| | | }, |
| | | form: { |
| | | type: Object, |
| | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null); |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }); |
| | | const formData = ref({...props.form}); |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("customerDialogFormVisible", { |
| | | required: true, |
| | |
| | | |
| | | // çå¬å¤é¨ä¼ å
¥çè¡¨åæ°æ®åå |
| | | watch( |
| | | () => props.form, |
| | | (newVal) => { |
| | | formData.value = { ...newVal }; |
| | | }, |
| | | { deep: true } |
| | | () => props.form, |
| | | (newVal) => { |
| | | formData.value = {...newVal}; |
| | | }, |
| | | {deep: true} |
| | | ); |
| | | watch( |
| | | () => props.form, |
| | | (newVal) => { |
| | | formData.value = { ...newVal }; |
| | | }, |
| | | { deep: true } |
| | | () => props.form, |
| | | (newVal) => { |
| | | formData.value = {...newVal}; |
| | | }, |
| | | {deep: true} |
| | | ); |
| | | |
| | | // çå¬å
é¨å¼¹çªç¶æåå |
| | | watch( |
| | | () => dialogVisible.value, |
| | | (newVal) => { |
| | | emit("update:customerDialogFormVisible", newVal); |
| | | } |
| | | () => dialogVisible.value, |
| | | (newVal) => { |
| | | emit("update:customerDialogFormVisible", newVal); |
| | | } |
| | | ); |
| | | |
| | | // æäº¤è¡¨å |
| | |
| | | }; |
| | | const rules = reactive({ |
| | | customerName: [ |
| | | { required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur"}, |
| | | ], |
| | | taxpayerId: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | { min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | {required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur"}, |
| | | {min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur"}, |
| | | ], |
| | | address: [ |
| | | { |
| | |
| | | trigger: "change", |
| | | }, |
| | | ], |
| | | bankAccount: [{ required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur" }], |
| | | bankName: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contactPerson: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | cids: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | bids: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | bankAccount: [{required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur"}], |
| | | bankName: [{required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur"}], |
| | | contactPerson: [{required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur"}], |
| | | cids: [{required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur"}], |
| | | bids: [{required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur"}], |
| | | contactPhone: [ |
| | | { required: true, message: "请è¾å
¥è系人", trigger: "blur" }, |
| | | { min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥è系人", trigger: "blur"}, |
| | | {min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur"}, |
| | | ], |
| | | }); |
| | | </script> |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog v-model="dialogVisible" :title="title" width="600" :close-on-click-modal="false" |
| | | :before-close="handleClose"> |
| | | <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" label-width="auto"> |
| | | :before-close="handleClose"> |
| | | <el-form ref="formRef" style="max-width: 400px; margin: 0 auto" :model="formData" :rules="rules" |
| | | label-width="auto"> |
| | | <el-form-item label="ä¾åºååç§°" prop="supplierName"> |
| | | <el-input v-model="formData.supplierName" placeholder="请è¾å
¥ä¾è´§ååç§°" /> |
| | | <el-input v-model="formData.supplierName" placeholder="请è¾å
¥ä¾è´§ååç§°"/> |
| | | </el-form-item> |
| | | <el-form-item label="纳ç¨äººè¯å«å·" prop="taxpayerId"> |
| | | <el-input v-model="formData.taxpayerId" placeholder="请è¾å
¥çº³ç¨äººè¯å«å·" /> |
| | | <el-input v-model="formData.taxpayerId" placeholder="请è¾å
¥çº³ç¨äººè¯å«å·"/> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è¥å°å" prop="bids"> |
| | | <el-cascader placeholder="è¯·éæ©ç»è¥å°å" size="default" :options="addressSelectOptions" v-model="formData.bids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | <el-cascader placeholder="è¯·éæ©ç»è¥å°å" size="default" :options="addressSelectOptions" |
| | | v-model="formData.bids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | </el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="详ç»å°å" prop="businessAddress"> |
| | | <el-input v-model="formData.businessAddress" placeholder="请è¾å
¥å®¢æ·è¯¦ç»å°å" /> |
| | | <el-input v-model="formData.businessAddress" placeholder="请è¾å
¥å®¢æ·è¯¦ç»å°å"/> |
| | | </el-form-item> |
| | | <el-form-item label="弿·è¡" prop="bankAccount"> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥å¼æ·è¡" /> |
| | | <el-input v-model="formData.bankAccount" placeholder="请è¾å
¥å¼æ·è¡"/> |
| | | </el-form-item> |
| | | <el-form-item label="é¶è¡è´¦æ·" prop="bankName"> |
| | | <el-input v-model="formData.bankName" placeholder="请è¾å
¥é¶è¡è´¦æ·" /> |
| | | <el-input v-model="formData.bankName" placeholder="请è¾å
¥é¶è¡è´¦æ·"/> |
| | | </el-form-item> |
| | | <el-form-item label="è系人" prop="contactPerson"> |
| | | <el-input v-model="formData.contactPerson" placeholder="请è¾å
¥è系人" /> |
| | | <el-input v-model="formData.contactPerson" placeholder="请è¾å
¥è系人"/> |
| | | </el-form-item> |
| | | <el-form-item label="è系人çµè¯" prop="contactPhone"> |
| | | <el-input v-model="formData.contactPhone" placeholder="请è¾å
¥è系人çµè¯" /> |
| | | <el-input v-model="formData.contactPhone" placeholder="请è¾å
¥è系人çµè¯"/> |
| | | </el-form-item> |
| | | <el-form-item label="è系人å°å" prop="cids"> |
| | | <el-cascader placeholder="è¯·éæ©è系人å°å" size="default" :options="addressSelectOptions" v-model="formData.cids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | <el-cascader placeholder="è¯·éæ©è系人å°å" size="default" :options="addressSelectOptions" |
| | | v-model="formData.cids" |
| | | :props="cascaderProps" @change="handleChange"> |
| | | </el-cascader> |
| | | </el-form-item> |
| | | <el-form-item label="è系人详ç»å°å" prop="contactAddress"> |
| | | <el-input v-model="formData.contactAddress" placeholder="请è¾å
¥è系人å°å" /> |
| | | <el-input v-model="formData.contactAddress" placeholder="请è¾å
¥è系人å°å"/> |
| | | </el-form-item> |
| | | <el-form-item class="dialog-footer"> |
| | | <el-button v-if="addOrEdit === 'edit'" @click="resetForm">éç½®</el-button> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, watch, defineProps, onMounted } from "vue"; |
| | | import { addOrEditSupply } from "@/api/basicInformation/supplier"; |
| | | import { getAreaOptions } from "@/api/system/area.js"; |
| | | import {ref, watch, defineProps, onMounted} from "vue"; |
| | | import {addOrEditSupply} from "@/api/basicInformation/supplier"; |
| | | import {getAreaOptions} from "@/api/system/area.js"; |
| | | |
| | | const props = defineProps({ |
| | | beforeClose: { |
| | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(null); |
| | | // è¡¨åæ°æ® |
| | | const formData = ref({ ...props.form }); |
| | | const formData = ref({...props.form}); |
| | | // å¼¹çªå¯è§æ§ |
| | | const dialogVisible = defineModel("supplierDialogFormVisible", { |
| | | required: true, |
| | |
| | | }); |
| | | // çå¬å¤é¨ä¼ å
¥çè¡¨åæ°æ®åå |
| | | watch( |
| | | () => props.form, |
| | | (newVal) => { |
| | | formData.value = { ...newVal }; |
| | | }, |
| | | { deep: true } |
| | | () => props.form, |
| | | (newVal) => { |
| | | formData.value = {...newVal}; |
| | | }, |
| | | {deep: true} |
| | | ); |
| | | |
| | | // çå¬å
é¨å¼¹çªç¶æåå |
| | | watch( |
| | | () => dialogVisible.value, |
| | | (newVal) => { |
| | | emit("update:supplierDialogFormVisible", newVal); |
| | | } |
| | | () => dialogVisible.value, |
| | | (newVal) => { |
| | | emit("update:supplierDialogFormVisible", newVal); |
| | | } |
| | | ); |
| | | // å¤çå°åéæ©åå |
| | | const handleChange = (value) => { |
| | |
| | | const resetForm = () => { |
| | | if (!formRef.value) return; |
| | | formData.value = JSON.parse(JSON.stringify(copyForm.value)); |
| | | // formRef.value.resetFields(); |
| | | }; |
| | | // å
³éå¼¹çª |
| | | const handleClose = () => { |
| | |
| | | }; |
| | | const rules = reactive({ |
| | | supplierName: [ |
| | | { required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥ä¾è´§ååç§°", trigger: "blur"}, |
| | | ], |
| | | taxpayerId: [ |
| | | { required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | { min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur" }, |
| | | {required: true, message: "请æ£ç¡®è¾å
¥çº³ç¨äººè¯å«å·", trigger: "blur"}, |
| | | {min: 17, max: 20, message: "请è¾å
¥17-20ä½çº³ç¨äººè¯å«å·", trigger: "blur"}, |
| | | ], |
| | | // bids: [ |
| | | // { |
| | |
| | | // trigger: "change", |
| | | // }, |
| | | // ], |
| | | bankName: [{ required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur" }], |
| | | bankAccount: [{ required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur" }], |
| | | contactPerson: [{ required: true, message: "è系人", trigger: "blur" }], |
| | | bankName: [{required: true, message: "请è¾å
¥é¶è¡è´¦æ·", trigger: "blur"}], |
| | | bankAccount: [{required: true, message: "请è¾å
¥å¼æ·è¡", trigger: "blur"}], |
| | | contactPerson: [{required: true, message: "è系人", trigger: "blur"}], |
| | | contactPhone: [ |
| | | { required: true, message: "请è¾å
¥è系人", trigger: "blur" }, |
| | | { min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥è系人", trigger: "blur"}, |
| | | {min: 11, max: 11, message: "请è¾å
¥11ä½è系人çµè¯", trigger: "blur"}, |
| | | ], |
| | | }); |
| | | </script> |
| | |
| | | <template> |
| | | <div class="app-container home"> |
| | | <el-row :gutter="20"> |
| | | <el-col :sm="24" :lg="12" style="padding-left: 20px"> |
| | | <h2>è¥ä¾åå°ç®¡çæ¡æ¶</h2> |
| | | <p> |
| | | ä¸ç´æ³å䏿¬¾åå°ç®¡çç³»ç»ï¼çäºå¾å¤ä¼ç§ç弿ºé¡¹ç®ä½æ¯åç°æ²¡æåéèªå·±çãäºæ¯å©ç¨ç©ºé²ä¼æ¯æ¶é´å¼å§èªå·±åä¸å¥åå°ç³»ç»ã妿¤æäºè¥ä¾ç®¡çç³»ç»ï¼å¥¹å¯ä»¥ç¨äºææçWebåºç¨ç¨åºï¼å¦ç½ç«ç®¡çåå°ï¼ç½ç«ä¼åä¸å¿ï¼CMSï¼CRMï¼OAççï¼å½ç¶ï¼æ¨ä¹å¯ä»¥å¯¹å¥¹è¿è¡æ·±åº¦å®å¶ï¼ä»¥ååºæ´å¼ºç³»ç»ãææå端åå°ä»£ç å°è£
è¿åååç²¾ç®æä¸æï¼åºéæ¦çä½ãåæ¶æ¯æç§»å¨å®¢æ·ç«¯è®¿é®ãç³»ç»ä¼éç»æ´æ°ä¸äºå®ç¨åè½ã |
| | | </p> |
| | | <p> |
| | | <b>å½åçæ¬:</b> <span>v{{ version }}</span> |
| | | </p> |
| | | <p> |
| | | <el-tag type="danger">¥å
è´¹å¼æº</el-tag> |
| | | </p> |
| | | <p> |
| | | <el-button |
| | | type="primary" |
| | | icon="Cloudy" |
| | | plain |
| | | @click="goTarget('https://gitee.com/y_project/RuoYi-Vue')" |
| | | >访é®ç äº</el-button |
| | | > |
| | | <el-button |
| | | icon="HomeFilled" |
| | | plain |
| | | @click="goTarget('http://ruoyi.vip')" |
| | | >访é®ä¸»é¡µ</el-button |
| | | > |
| | | </p> |
| | | </el-col> |
| | | |
| | | <el-col :sm="24" :lg="12" style="padding-left: 50px"> |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <h2>ææ¯éå</h2> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="6"> |
| | | <h4>åç«¯ææ¯</h4> |
| | | <ul> |
| | | <li>SpringBoot</li> |
| | | <li>Spring Security</li> |
| | | <li>JWT</li> |
| | | <li>MyBatis</li> |
| | | <li>Druid</li> |
| | | <li>Fastjson</li> |
| | | <li>...</li> |
| | | </ul> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <h4>åç«¯ææ¯</h4> |
| | | <ul> |
| | | <li>Vue</li> |
| | | <li>Vuex</li> |
| | | <li>Element-ui</li> |
| | | <li>Axios</li> |
| | | <li>Sass</li> |
| | | <li>Quill</li> |
| | | <li>...</li> |
| | | </ul> |
| | | </el-col> |
| | | </el-row> |
| | | </el-col> |
| | | </el-row> |
| | | <el-divider /> |
| | | <el-row :gutter="20"> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="8"> |
| | | <el-card class="update-log"> |
| | | <template v-slot:header> |
| | | <div class="clearfix"> |
| | | <span>è系信æ¯</span> |
| | | </div> |
| | | </template> |
| | | <div class="body"> |
| | | <p> |
| | | <i class="el-icon-s-promotion"></i> å®ç½ï¼<el-link |
| | | href="http://www.ruoyi.vip" |
| | | target="_blank" |
| | | >http://www.ruoyi.vip</el-link |
| | | > |
| | | </p> |
| | | <p> |
| | | <i class="el-icon-user-solid"></i> QQ群ï¼<s> 满937441 </s> <s> 满887144332 </s> |
| | | <s> 满180251782 </s> <s> 满104180207 </s> <s> 满186866453 </s> <s> 满201396349 </s> |
| | | <s> 满101456076 </s> <s> 满101539465 </s> <s> 满264312783 </s> <s> 满167385320 </s> |
| | | <s> 满104748341 </s> <s> 满160110482 </s> <s> 满170801498 </s> <s> 满108482800 </s> |
| | | <s> 满101046199 </s> <s> 满136919097 </s> <s> 满143961921 </s> <s> 满174951577 </s> |
| | | <s> 满161281055 </s> <s> 满138988063 </s> <s> 满151450850 </s> <s> 满224622315 </s> |
| | | <s> 满287842588 </s> <s> 满187944233 </s> <a href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329" target="_blank">228578329</a> |
| | | </p> |
| | | <p> |
| | | <i class="el-icon-chat-dot-round"></i> 微信ï¼<a |
| | | href="javascript:;" |
| | | >/ *è¥ä¾</a |
| | | > |
| | | </p> |
| | | <p> |
| | | <i class="el-icon-money"></i> æ¯ä»å®ï¼<a |
| | | href="javascript:;" |
| | | class="æ¯ä»å®ä¿¡æ¯" |
| | | >/ *è¥ä¾</a |
| | | > |
| | | </p> |
| | | <div class="dashboard"> |
| | | <!-- é¡¶é¨ç»è®¡å¡ç --> |
| | | <div class="top-cards"> |
| | | <div class="stat-card revenue"> |
| | | <div class="card-icon"> |
| | | <i class="el-icon-money"></i> |
| | | </div> |
| | | <div class="card-content"> |
| | | <div class="card-title">è¥æ¶éé¢</div> |
| | | <div class="card-value">Â¥1,234,567</div> |
| | | <div class="card-trend"> |
| | | <span class="trend-label">è¾æ¨æ¥</span> |
| | | <span class="trend-value up">+12.5%</span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="8"> |
| | | <el-card class="update-log"> |
| | | <template v-slot:header> |
| | | <div class="clearfix"> |
| | | <span>æ´æ°æ¥å¿</span> |
| | | </div> |
| | | </template> |
| | | <el-collapse accordion> |
| | | <el-collapse-item title="v3.8.9 - 2024-12-30"> |
| | | <ol> |
| | | <li>ç¨æ·ç®¡çæ¯æåæ æå¨</li> |
| | | <li>ä¿®æ¹ä¸»é¢æ ·å¼æ¬å°è¯»å</li> |
| | | <li>ç¨æ·å¤´åhttp(s)龿¥æ¯æ</li> |
| | | <li>ç¨æ·ç®¡çè¿æ»¤æå·²ç¦ç¨é¨é¨</li> |
| | | <li>æ¯æèªå®ä¹æ¾ç¤ºExcel屿§å</li> |
| | | <li>æä½æ¥å¿è®°å½DELETE请æ±åæ°</li> |
| | | <li>ç½å忝æå¯¹éé
符路å¾å¹é
</li> |
| | | <li>æ ¡æ£æä»¶åæ¯å¦å
å«ç¹æ®å符</li> |
| | | <li>代ç çæå建表å±è½è¿è§çå符</li> |
| | | <li>èåé¢å
å±å¯¼èªæ¯æå¤å±çº§æ¾ç¤º</li> |
| | | <li>Excelæ³¨è§£æ¯æwrapTextæ¯å¦å
许å
容æ¢è¡</li> |
| | | <li>代ç çææ°å¢é
ç½®æ¯å¦å
许æä»¶è¦çå°æ¬å°</li> |
| | | <li>ä¿®å¤è§è²ç¦ç¨æéä¸å¤±æé®é¢</li> |
| | | <li>ä¿®å¤ä»£ç çæä¸çº§èåæ¾ç¤ºé®é¢</li> |
| | | <li>ä¿®å¤å¯¼åºåå表对象åªè½å¨æåçé®é¢</li> |
| | | <li>ä¿®å¤TopNavæ æ³æ£ç¡®è·åactiveçé®é¢</li> |
| | | <li>ä¿®å¤é»è®¤å
³éTags-Viewså
é¾é¡µé¢æä¸å¼</li> |
| | | <li>å级oshiå°ææ°çæ¬6.6.5</li> |
| | | <li>å级tomcatå°ææ°çæ¬9.0.96</li> |
| | | <li>å级fastjsonå°ææ°ç2.0.53</li> |
| | | <li>å级logbackå°ææ°çæ¬1.2.13</li> |
| | | <li>å级spring-frameworkå°ææ°çæ¬5.3.39</li> |
| | | <li>å级quillå°ææ°çæ¬2.0.2</li> |
| | | <li>å级axioså°ææ°çæ¬0.28.1</li> |
| | | <li>ä¼å身份è¯è±ææ£å</li> |
| | | <li>ä¼åæéæ´æ°å忥ç¼å</li> |
| | | <li>ä¼åæ¥è¯¢æ¶é´èå´æ¥ææ ¼å¼</li> |
| | | <li>ä¼ååæ°é®å¼æ´æ¢ä¸ºå¤è¡ææ¬</li> |
| | | <li>ä¼å导å
¥å¸¦æ 颿件å
³éæ¸
ç</li> |
| | | <li>ä¼åä¸ä¼ å¾ç带ååä¸å¢å åç¼</li> |
| | | <li>ä¼åç¹æ®å符å¯ç ä¿®æ¹å¤±è´¥é®é¢</li> |
| | | <li>ä¼åæ ç¨æ·ç¼å·ä¸æ ¡éªæ°æ®æé</li> |
| | | <li>ä¼åTopNavå
é¾èåç¹å»æ²¡æé«äº®</li> |
| | | <li>ä¼åèå管ç忢Miniå¸å±éä¹±é®é¢</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.8 - 2024-06-30"> |
| | | <ol> |
| | | <li>èåç®¡çæ°å¢è·¯ç±åç§°</li> |
| | | <li>æ°å¢æ°æ®è±æè¿æ»¤æ³¨è§£</li> |
| | | <li>ç¨æ·å¯ç æ°å¢éæ³å符éªè¯</li> |
| | | <li>éå¶ç¨æ·æä½æ°æ®æéèå´</li> |
| | | <li>代ç çææ°å¢åå»ºè¡¨ç»æåè½</li> |
| | | <li>宿¶ä»»å¡ç½ååé
ç½®èå´ç¼©å°</li> |
| | | <li>ä¼å代ç çæä¸»å表å
³èæ¥è¯¢æ¹å¼</li> |
| | | <li>Excel注解æ°å¢å±æ§comboReadDict</li> |
| | | <li>Excel注解ColumnTypeç±»åæ°å¢ææ¬</li> |
| | | <li>æ°å¢å½é
åèµæºæä»¶é
ç½®</li> |
| | | <li>å级oshiå°ææ°çæ¬6.6.1</li> |
| | | <li>å级druidå°ææ°çæ¬1.2.23</li> |
| | | <li>å级core-jså°ææ°çæ¬3.37.1</li> |
| | | <li>æ´æ°HttpUtilsä¸çUser-Agent</li> |
| | | <li>æ´æ°compressionPluginå°6.1.2以å
¼å®¹node18+</li> |
| | | <li>å级spring-securityå°å®å
¨çæ¬ï¼é²æ¢æ¼æ´é£é©</li> |
| | | <li>å级spring-frameworkå°å®å
¨çæ¬ï¼é²æ¢æ¼æ´é£é©</li> |
| | | <li>ä¼åèªå®ä¹XSS注解å¹é
æ¹å¼</li> |
| | | <li>ä¼åç¼åçæ§é®åå表æåºæ¾ç¤º</li> |
| | | <li>ä¼å宿¶ä»»å¡æ¥å¿é»è®¤ææ¶é´æåº</li> |
| | | <li>ä¼åé»è®¤æä»¶å¤§å°è¶
è¿2Gæ æçé®é¢</li> |
| | | <li>ä¼åæ¥è¡¨ç¹æ®å符使ç¨åææ è¿è¡è½¬ä¹</li> |
| | | <li>ä¼å宿¶ä»»å¡cron表达å¼å°æ¶é
ç½®æ¾ç¤ºé误é®é¢</li> |
| | | <li>ä¼åå¤ä¸ªèªå®æ°æ®æé使ç¨inæ¥è¯¢,é¿å
夿¬¡æ¼æ¥</li> |
| | | <li>ä¼å导å
¥Excelæ¶è®¾ç½®dictType屿§é夿¥ç¼åé®é¢</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.7 - 2023-12-08"> |
| | | <ol> |
| | | <li>æä½æ¥å¿è®°å½é¨é¨åç§°</li> |
| | | <li>å
¨å±æ°æ®åå¨ç¨æ·ç¼å·</li> |
| | | <li>æ°å¢ç¼ç¨å¼å¤æèµæºè®¿é®æé</li> |
| | | <li>æä½æ¥å¿å表æ°å¢IPå°åæ¥è¯¢</li> |
| | | <li>宿¶ä»»å¡æ°å¢é¡µå»é¤ç¶æé项</li> |
| | | <li>代ç çææ¯æéæ©å端模æ¿ç±»å</li> |
| | | <li>æ¾éåç»ä»¶æ¯æå¤éæ¡å¼¹åºç±»å</li> |
| | | <li>éç¨æåºå±æ§orderByåæ°éå¶é¿åº¦</li> |
| | | <li>Excelèªå®ä¹æ°æ®å¤çå¨å¢å åå
æ ¼/å·¥ä½ç°¿å¯¹è±¡</li> |
| | | <li>å级oshiå°ææ°çæ¬6.4.8</li> |
| | | <li>å级druidå°ææ°çæ¬1.2.20</li> |
| | | <li>å级fastjsonå°ææ°ç2.0.43</li> |
| | | <li>å级pagehelperå°ææ°ç1.4.7</li> |
| | | <li>å级commons.ioå°ææ°çæ¬2.13.0</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.14</li> |
| | | <li>ä¿®å¤äºçº§è·¯ç±ç¼åæ æé®é¢</li> |
| | | <li>ä¿®å¤å¤é¾å¸¦ç«¯å£åºç°çå¼å¸¸</li> |
| | | <li>ä¿®å¤æ 模æ¿ç¶çº§ç¼ç åéé误</li> |
| | | <li>ä¿®å¤åå
¸è¡¨è¯¦æ
é¡µé¢æç´¢é®é¢</li> |
| | | <li>ä¿®å¤å
é¾iframe没æä¼ éåæ°é®é¢</li> |
| | | <li>ä¿®å¤èªå®ä¹åå
¸æ ·å¼ä¸çæçé®é¢</li> |
| | | <li>ä¿®å¤åå
¸ç¼åå 餿¹æ³åæ°é误é®é¢</li> |
| | | <li>ä¿®å¤Excel导å
¥æ°æ®ä¸´æ¶æä»¶æ æ³å é¤é®é¢</li> |
| | | <li>ä¿®å¤æªç»å½å¸¦åæ°è®¿é®æåå忰䏢失é®é¢</li> |
| | | <li>ä¿®å¤HeaderSearchç»ä»¶è·³è½¬query忰䏢失é®é¢</li> |
| | | <li>ä¿®å¤ä»£ç çæå¯¼å
¥åå¿
填项䏿°æ®åºä¸å¹é
é®é¢</li> |
| | | <li>ä¿®å¤Excels导å
¥æ¶æ æ³è·åå°dictTypeåå
¸å¼é®é¢</li> |
| | | <li>ä¼åä¸è½½zipæ¹æ³æ°å¢é®ç½©å±</li> |
| | | <li>ä¼å头åä¸ä¼ åæ°æ°å¢æä»¶åç§°</li> |
| | | <li>ä¼ååå
¸æ ç¾æ¯æèªå®ä¹åé符</li> |
| | | <li>ä¼åèå管çç±»å为æé®ç¶æå¯é</li> |
| | | <li>ä¼åå端é²éå¤æäº¤æ°æ®å¤§å°éå¶</li> |
| | | <li>ä¼åTopNavèåæ²¡æå¾æ svg䏿¾ç¤º</li> |
| | | <li>ä¼åæ°åéé¢å¤§å转æ¢ç²¾åº¦ä¸¢å¤±é®é¢</li> |
| | | <li>ä¼å坿æ¬Editorç»ä»¶æ£éªå¾çæ ¼å¼</li> |
| | | <li>ä¼å页ç¾å¨Firefoxæµè§å¨è¢«é®æ¡çé®é¢</li> |
| | | <li>ä¼å个人ä¸å¿/åºæ¬èµæä¿®æ¹æ¶æ°æ®æ¾ç¤ºé®é¢</li> |
| | | <li>ä¼åç¼åçæ§å¾è¡¨æ¯æè·éå±å¹å¤§å°èªéåºè°æ´</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.6 - 2023-06-30"> |
| | | <ol> |
| | | <li>æ¯æç»å½IPé»ååéå¶</li> |
| | | <li>æ°å¢çæ§é¡µé¢å¾æ æ¾ç¤º</li> |
| | | <li>æä½æ¥å¿æ°å¢æ¶èæ¶é´å±æ§</li> |
| | | <li>å±è½å®æ¶ä»»å¡beanè¿è§çå符</li> |
| | | <li>æ¥å¿ç®¡ç使ç¨ç´¢å¼æåæ¥è¯¢æ§è½</li> |
| | | <li>æ¥å¿æ³¨è§£æ¯ææé¤æå®ç请æ±åæ°</li> |
| | | <li>æ¯æèªå®ä¹éè屿§åè¿æ»¤å对象</li> |
| | | <li>å级oshiå°ææ°çæ¬6.4.3</li> |
| | | <li>å级druidå°ææ°çæ¬1.2.16</li> |
| | | <li>å级fastjsonå°ææ°ç2.0.34</li> |
| | | <li>å级spring-bootå°ææ°çæ¬2.5.15</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.13</li> |
| | | <li>ç§»é¤apache/commons-fileuploadä¾èµ</li> |
| | | <li>ä¿®å¤é¡µé¢åæ¢æ¶å¸å±éä¹±çé®é¢</li> |
| | | <li>ä¿®å¤å¿å注解Anonymous空æéé®é¢</li> |
| | | <li>ä¿®å¤è·¯ç±è·³è½¬è¢«é»æ¢æ¶å
é¨äº§çæ¥éä¿¡æ¯é®é¢</li> |
| | | <li>ä¿®å¤isMatchedIpçåæ°å¤æäº§ç空æéçé®é¢</li> |
| | | <li>ä¿®å¤ç¨æ·å¤è§è²æ°æ®æéå¯è½åºç°æéæ¬åçæ
åµ</li> |
| | | <li>ä¿®å¤å¼å¯TopNavåä¸çº§èåè·¯ç±åæ°è®¾ç½®æ æé®é¢</li> |
| | | <li>ä¿®å¤DictTagç»ä»¶value没æå¹é
ç弿¶åå±ç¤ºvalue</li> |
| | | <li>ä¼åæä»¶ä¸è½½åºç°çå¼å¸¸</li> |
| | | <li>ä¼å鿩徿 ç»ä»¶é«äº®åæ¾</li> |
| | | <li>ä¼åå¼¹çªåå¯¼èªæ åç§»çé®é¢</li> |
| | | <li>ä¼åä¿®æ¹å¯ç æ¥å¿å卿æé®é¢</li> |
| | | <li>ä¼åé¡µç¾æ å
³éå
¶ä»åºç°çå¼å¸¸é®é¢</li> |
| | | <li>ä¼å页ç¾å
³é左侧é项æé¤é¦é¡µé项</li> |
| | | <li>ä¼åå
³éå½åtab页跳转æå³ä¾§tab页</li> |
| | | <li>ä¼åç¼åå表æ¸
é¤æä½æç¤ºä¸åçé®é¢</li> |
| | | <li>ä¼åå符æªä½¿ç¨ä¸å线ä¸è¿è¡é©¼å³°å¼å¤ç</li> |
| | | <li>ä¼åç¨æ·å¯¼å
¥æ´æ°æ¶éè·åç¨æ·ç¼å·é®é¢</li> |
| | | <li>ä¼åä¾§è¾¹æ ç平尿 é¢ä¸VUE_APP_TITLEä¿æåæ¥</li> |
| | | <li>ä¼å导åºExcelæ¶è®¾ç½®dictType屿§é夿¥ç¼åé®é¢</li> |
| | | <li>è¿æ¥æ± Druidæ¯ææ°çé
ç½®connectTimeoutåsocketTimeout</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.5 - 2023-01-01"> |
| | | <ol> |
| | | <li>宿¶ä»»å¡è¿è§çå符</li> |
| | | <li>éç½®æ¶åæ¶é¨é¨éä¸</li> |
| | | <li>æ°å¢è¿åè¦åæ¶æ¯æç¤º</li> |
| | | <li>忽ç¥ä¸å¿
è¦ç屿§æ°æ®è¿å</li> |
| | | <li>ä¿®æ¹åæ°é®åæ¶ç§»é¤åç¼åé
ç½®</li> |
| | | <li>导å
¥æ´æ°ç¨æ·æ°æ®åæ ¡éªæ°æ®æé</li> |
| | | <li>å
¼å®¹Excel䏿æ¡å
容è¿å¤æ æ³æ¾ç¤ºçé®é¢</li> |
| | | <li>å级echartså°ææ°çæ¬5.4.0</li> |
| | | <li>å级core-jså°ææ°çæ¬3.25.3</li> |
| | | <li>å级oshiå°ææ°çæ¬6.4.0</li> |
| | | <li>å级kaptchaå°ææ°ç2.3.3</li> |
| | | <li>å级druidå°ææ°çæ¬1.2.15</li> |
| | | <li>å级fastjsonå°ææ°ç2.0.20</li> |
| | | <li>å级pagehelperå°ææ°ç1.4.6</li> |
| | | <li>ä¼åå¼¹çªå
容è¿å¤å±ç¤ºä¸å
¨é®é¢</li> |
| | | <li>ä¼åswagger-uiéæèµæºä½¿ç¨ç¼å</li> |
| | | <li>å¼å¯TopNav没æåèåéèä¾§è¾¹æ </li> |
| | | <li>å é¤fuseæ æé项maxPatternLength</li> |
| | | <li>ä¼å导åºå¯¹è±¡çåå表为空ä¼åºç°[]é®é¢</li> |
| | | <li>ä¼åç¼è¾å¤´åæ¶éæé¨åä¼åæé»è²é®é¢</li> |
| | | <li>ä¼åå°å±å¹ä¸ä¿®æ¹å¤´åçé¢å¸å±éä½çé®é¢</li> |
| | | <li>ä¿®å¤ä»£ç çæå¾é屿§æ æé®é¢</li> |
| | | <li>ä¿®å¤æä»¶ä¸ä¼ ç»ä»¶æ ¼å¼éªè¯é®é¢</li> |
| | | <li>ä¿®å¤åæ¾æ°æ®åå
¸æ°ç»å¼å¸¸é®é¢</li> |
| | | <li>ä¿®å¤sheetè¶
åºæå¤§è¡æ°å¼å¸¸é®é¢</li> |
| | | <li>ä¿®å¤Log注解GET请æ±è®°å½ä¸å°åæ°é®é¢</li> |
| | | <li>ä¿®å¤è°åº¦æ¥å¿ç¹å»å¤æ¬¡æ°æ®ä¸ååçé®é¢</li> |
| | | <li>ä¿®å¤ä¸»é¢é¢è²å¨Drawerç»ä»¶ä¸ä¼å è½½é®é¢</li> |
| | | <li>ä¿®å¤æä»¶åå
å«ç¹æ®å符çæä»¶æ æ³ä¸è½½é®é¢</li> |
| | | <li>ä¿®å¤table䏿´å¤æé®åæ¢ä¸»é¢è²æªçæä¿®å¤é®é¢</li> |
| | | <li>ä¿®å¤æäºç¹æ§çç¯å¢çæä»£ç åä¹±ç TXTæä»¶é®é¢</li> |
| | | <li>ä¿®å¤ä»£ç çæå¾ç/æä»¶/åéæ¶éæ©å¿
å¡«æ æ³æ ¡éªé®é¢</li> |
| | | <li>ä¿®å¤æäºç¹æ§çæ
åµç¨æ·ç¼è¾å¯¹è¯æ¡ä¸è§è²åé¨é¨æ æ³ä¿®æ¹é®é¢</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.4 - 2022-09-26"> |
| | | <ol> |
| | | <li>æ°æ®é»è¾å é¤ä¸è¿è¡å¯ä¸éªè¯</li> |
| | | <li>Excelæ³¨è§£æ¯æå¯¼åºå¯¹è±¡çååè¡¨æ¹æ³</li> |
| | | <li>Excelæ³¨è§£æ¯æèªå®ä¹éè屿§å</li> |
| | | <li>Excelæ³¨è§£æ¯æbackgroundColor屿§è®¾ç½®èæ¯è²</li> |
| | | <li>æ¯æé
ç½®å¯ç æå¤§é误次æ°/é宿¶é´</li> |
| | | <li>ç»å½æ¥å¿æ°å¢è§£éè´¦æ·åè½</li> |
| | | <li>éç¨ä¸è½½æ¹æ³æ°å¢configé
ç½®é项</li> |
| | | <li>æ¯æå¤æéå符å¹é
è§è²æ°æ®æé</li> |
| | | <li>页é¢å
åµiframe忢tabä¸å·æ°æ°æ®</li> |
| | | <li>æä½æ¥å¿è®°å½æ¯ææé¤ææå±æ§å段</li> |
| | | <li>ä¿®å¤å¤æä»¶ä¸ä¼ æ¥éåºç°çå¼å¸¸é®é¢</li> |
| | | <li>ä¿®å¤å¾çé¢è§ç»ä»¶src屿§ä¸ºnull弿§å¶å°æ¥éé®é¢</li> |
| | | <li>å级oshiå°ææ°çæ¬6.2.2</li> |
| | | <li>å级fastjsonå°ææ°ç2.0.14</li> |
| | | <li>å级pagehelperå°ææ°ç1.4.3</li> |
| | | <li>å级core-jså°ææ°çæ¬3.25.2</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.10</li> |
| | | <li>ä¼åä»»å¡è¿æä¸æ§è¡è°åº¦</li> |
| | | <li>ä¼ååå
¸æ°æ®ä½¿ç¨storeåå</li> |
| | | <li>ä¼åä¿®æ¹èµæå¤´å被è¦ççé®é¢</li> |
| | | <li>ä¼åä¿®æ¹ç¨æ·ç»å½è´¦å·éå¤éªè¯</li> |
| | | <li>ä¼å代ç çæåæ¥åå¼NULLé®é¢</li> |
| | | <li>ä¼å宿¶ä»»å¡æ¯ææ§è¡ç¶ç±»æ¹æ³</li> |
| | | <li>ä¼åç¨æ·ä¸ªäººä¿¡æ¯æ¥å£é²æ¢ä¿®æ¹é¨é¨</li> |
| | | <li>ä¼åå¸å±è®¾ç½®ä½¿ç¨el-draweræ½å±æ¾ç¤º</li> |
| | | <li>ä¼å没ææéçç¨æ·ç¼è¾é¨é¨ç¼ºå°æ°æ®</li> |
| | | <li>ä¼åæ¥å¿æ³¨è§£è®°å½éå¶è¯·æ±å°åçé¿åº¦</li> |
| | | <li>ä¼åexcel/scale屿§å¯¼åºåå
æ ¼æ°å¼ç±»å</li> |
| | | <li>ä¼åæ¥å¿æä½ä¸éç½®æé®æ¶é夿¥è¯¢çé®é¢</li> |
| | | <li>ä¼åå¤ä¸ªç¸åè§è²æ°æ®å¯¼è´æéSQLéå¤é®é¢</li> |
| | | <li>ä¼åè¡¨æ ¼ä¸å³ä¾§å·¥å
·æ¡ï¼æç´¢æé®æ¾é&å³ä¾§æ ·å¼å¸åºï¼</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.3 - 2022-06-27"> |
| | | <ol> |
| | | <li>æ°å¢ç¼åå表èååè½</li> |
| | | <li>代ç çææ 表æ°å¢(å±å¼/æå )</li> |
| | | <li>Excelæ³¨è§£æ¯æcoloråä½é¢è²</li> |
| | | <li>æ°å¢Anonymouså¿å访é®ä¸é´ææ³¨è§£</li> |
| | | <li>ç¨æ·å¤´åä¸ä¼ éå¶åªè½ä¸ºå¾çæ ¼å¼</li> |
| | | <li>æ¥å£ä½¿ç¨æ³å使å
¶çå°ååºå±æ§å段</li> |
| | | <li>æ£æ¥å®æ¶ä»»å¡beanæå¨å
忝å¦ä¸ºç½ååé
ç½®</li> |
| | | <li>æ·»å 页ç¾openPageæ¯æä¼ éåæ°</li> |
| | | <li>ç¨æ·ç¼åä¿¡æ¯æ·»å é¨é¨ancestorsç¥çº§å表</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.8</li> |
| | | <li>å级oshiå°ææ°çæ¬6.1.6</li> |
| | | <li>å级druidå°ææ°çæ¬1.2.11</li> |
| | | <li>å级fastjsonå°ææ°ç2.0.8</li> |
| | | <li>å级spring-bootå°ææ°çæ¬2.5.14</li> |
| | | <li>é级jsencryptçæ¬å
¼å®¹IEæµè§å¨</li> |
| | | <li>å é¤å¤ä½çsaltåæ®µ</li> |
| | | <li>æ°å¢è·åä¸å¸¦åç¼æä»¶åç§°æ¹æ³</li> |
| | | <li>æ°å¢è·åé
ç½®æä»¶ä¸ç屿§å¼æ¹æ³</li> |
| | | <li>æ°å¢å
容ç¼ç /è§£ç æ¹ä¾¿æä»¶éæä½¿ç¨</li> |
| | | <li>åå
¸ç±»åå¿
须以忝å¼å¤´ï¼ä¸åªè½ä¸ºï¼å°ååæ¯ï¼æ°åï¼ä¸æ»çº¿ï¼</li> |
| | | <li>ä¼å设置å页忰é»è®¤å¼</li> |
| | | <li>ä¼å对空åç¬¦ä¸²åæ°å¤ççè¿æ»¤</li> |
| | | <li>ä¼åæ¾ç¤ºé¡ºåºorderNumç±»å为æ´å</li> |
| | | <li>ä¼å表åæå»ºæé®ä¸æ¾ç¤ºæ£åæ ¡éª</li> |
| | | <li>ä¼ååå
¸æ°æ®åæ¾æ ·å¼ä¸ææ¡æ¾ç¤ºå¼</li> |
| | | <li>ä¼åRååºæåç¶æç ä¸å
¨å±ä¿æä¸è´</li> |
| | | <li>ä¼ådruidå¼å¯wallè¿æ»¤å¨åºç°çå¼å¸¸é®é¢</li> |
| | | <li>ä¼åç¨æ·ç®¡ç左侧æ åç»ä»¶å¢å éä¸é«äº®ä¿æ</li> |
| | | <li>ä¼åæ°å¢ç¨æ·ä¸è§è²ä¿¡æ¯&ç¨æ·ä¸å²ä½ä¿¡æ¯é»è¾</li> |
| | | <li>ä¼åé»è®¤ä¸å¯ç¨å缩æä»¶ç¼å鲿¢node_modulesè¿å¤§</li> |
| | | <li>ä¿®å¤åå
¸æ°æ®æ¾ç¤ºä¸å
¨é®é¢</li> |
| | | <li>ä¿®å¤æä½æ¥å¿æ¥è¯¢ç±»åæ¡ä»¶ä¸º0æ¶ä¼æ¥å°æææ°æ®</li> |
| | | <li>ä¿®å¤Excel注解prompt/comboåæ¶ä½¿ç¨ä¸çæé®é¢</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.2 - 2022-04-01"> |
| | | <ol> |
| | | <li>åç«¯æ¯æè®¾ç½®æ¯å¦éè¦é²æ¢æ°æ®éå¤æäº¤</li> |
| | | <li>å¼å¯TopNav没æåèåæ
åµéèä¾§è¾¹æ </li> |
| | | <li>ä¾§è¾¹æ èååç§°è¿é¿æ¬åæ¾ç¤ºæ é¢</li> |
| | | <li>ç¨æ·è®¿é®æ§å¶æ¶æ ¡éªæ°æ®æéï¼é²æ¢è¶æ</li> |
| | | <li>导åºExcelæ¶å±è½å
¬å¼ï¼é²æ¢CSV注å
¥é£é©</li> |
| | | <li>ç»ä»¶ImagePreviewæ¯æå¤å¾é¢è§æ¾ç¤º</li> |
| | | <li>ç»ä»¶ImageUploadæ¯æå¤å¾åæ¶éæ©ä¸ä¼ </li> |
| | | <li>ç»ä»¶FileUploadæ¯æå¤æä»¶åæ¶éæ©ä¸ä¼ </li> |
| | | <li>æå¡çæ§æ°å¢è¿è¡åæ°ä¿¡æ¯æ¾ç¤º</li> |
| | | <li>宿¶ä»»å¡ç®æ åç¬¦ä¸²è¿æ»¤ç¹æ®å符</li> |
| | | <li>宿¶ä»»å¡ç®æ å符串éªè¯å
åç½åå</li> |
| | | <li>代ç çæå表å¾çæ¯æé¢è§</li> |
| | | <li>代ç çæç¼è¾ä¿®æ¹æå¼æ°é¡µç¾</li> |
| | | <li>代ç çææ°å¢Javaç±»åBoolean</li> |
| | | <li>代ç çæåè¡¨æ¯ææ¥æ/åå
¸é
ç½®</li> |
| | | <li>代ç çæåæ¥ä¿çå¿
å¡«/ç±»åé项</li> |
| | | <li>å级oshiå°ææ°çæ¬6.1.2</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.80</li> |
| | | <li>å级pagehelperå°ææ°ç1.4.1</li> |
| | | <li>å级spring-bootå°ææ°çæ¬2.5.11</li> |
| | | <li>å级spring-boot-mybatiså°ææ°ç2.2.2</li> |
| | | <li>æ·»å éæ¼çå页忰åçå屿§</li> |
| | | <li>ä¿®æ¹npmå³å°è¿æçæ³¨åæºå°å</li> |
| | | <li>ä¿®å¤å页ç»ä»¶è¯·æ±ä¸¤æ¬¡é®é¢</li> |
| | | <li>ä¿®å¤éç¨æä»¶ä¸è½½æ¥å£è·¨åé®é¢</li> |
| | | <li>ä¿®å¤Xssæ³¨è§£åæ®µå¼ä¸ºç©ºæ¶çå¼å¸¸é®é¢</li> |
| | | <li>ä¿®å¤é项å¡ç¹å»å³é®å·æ°ä¸¢å¤±åæ°é®é¢</li> |
| | | <li>ä¿®å¤è¡¨åæ¸
é¤å
ç´ ä½ç½®æªåç´å±
ä¸é®é¢</li> |
| | | <li>ä¿®å¤æå¡çæ§ä¸è¿è¡åæ°æ¾ç¤ºæ¡ä»¶é误</li> |
| | | <li>ä¿®å¤å¯¼å
¥Excelæ¶åå
¸å段类å为Long转ä¹ä¸ºç©ºé®é¢</li> |
| | | <li>ä¿®å¤ç»å½è¶
æ¶å·æ°é¡µé¢è·³è½¬ç»å½é¡µé¢è¿æç¤ºéæ°ç»å½é®é¢</li> |
| | | <li>ä¼åå è½½åå
¸ç¼åæ°æ®</li> |
| | | <li>ä¼åIPå°åè·åå°å¤ä¸ªçé®é¢</li> |
| | | <li>ä¼åä»»å¡éåæ»¡æ¶ä»»å¡æç»çç¥</li> |
| | | <li>ä¼åæä»¶ä¸ä¼ å
¼å®¹Weblogicç¯å¢</li> |
| | | <li>ä¼å宿¶ä»»å¡é»è®¤ä¿åå°å
å䏿§è¡</li> |
| | | <li>ä¼åé¨é¨ä¿®æ¹ç¼©æ¾ååºç°çéä½é®é¢</li> |
| | | <li>ä¼åExcelæ ¼å¼åä¸åç±»åçæ¥æå¯¹è±¡</li> |
| | | <li>ä¼åèå表å
³é®å导è´çæä»¶æ¥éé®é¢</li> |
| | | <li>ä¼åOracleç¨æ·å¤´åå为空æ¶ä¸æ¾ç¤ºé®é¢</li> |
| | | <li>ä¼å页é¢è¥æªå¹é
å°åå
¸æ ç¾åè¿åååå
¸å¼</li> |
| | | <li>ä¼åä¿®å¤ç»å½å¤±æå夿¬¡è¯·æ±æç¤ºå¤æ¬¡å¼¹çªé®é¢</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.1 - 2022-01-01"> |
| | | <ol> |
| | | <li>æ°å¢Vue3å端代ç çææ¨¡æ¿</li> |
| | | <li>æ°å¢å¾çé¢è§ç»ä»¶</li> |
| | | <li>æ°å¢å缩æä»¶å®ç°æå
Gzip</li> |
| | | <li>èªå®ä¹xssæ ¡éªæ³¨è§£å®ç°</li> |
| | | <li>èªå®ä¹æåå¤å¶åªè´´æä»¤</li> |
| | | <li>代ç çæé¢è§æ¯æå¤å¶å
容</li> |
| | | <li>è·¯ç±æ¯æåç¬é
ç½®èåæè§è²æé</li> |
| | | <li>ç¨æ·ç®¡çé¨é¨æ¥è¯¢éæ©èç¹åå页忰åå§</li> |
| | | <li>ä¿®å¤ç¨æ·åé
è§è²å±æ§é误</li> |
| | | <li>ä¿®å¤æå
ååä½å¾æ å¶ç°çä¹±ç é®é¢</li> |
| | | <li>ä¿®å¤èå管çé置表ååºç°çé误</li> |
| | | <li>ä¿®å¤çæ¬å·®å¼å¯¼è´çæå è½½æ¥éé®é¢</li> |
| | | <li>ä¿®å¤Cronç»ä»¶ä¸å¨åæ¾é®é¢</li> |
| | | <li>ä¿®å¤å®æ¶ä»»å¡å¤åæ°éå·åéçé®é¢</li> |
| | | <li>ä¿®å¤æ ¹æ®IDæ¥è¯¢å表å¯è½åºç°ç䏻鮿º¢åºé®é¢</li> |
| | | <li>ä¿®å¤tomcaté
ç½®åæ°å·²è¿æé®é¢</li> |
| | | <li>å级clipboardå°ææ°çæ¬2.0.8</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.8.6</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.79</li> |
| | | <li>å级spring-bootå°ææ°çæ¬2.5.8</li> |
| | | <li>å级log4j2å°2.17.1ï¼é²æ¢æ¼æ´é£é©</li> |
| | | <li>ä¼åä¸è½½è§£æblobå¼å¸¸æç¤º</li> |
| | | <li>ä¼å代ç çæåå
¸ç»éå¤é®é¢</li> |
| | | <li>ä¼åæ¥è¯¢ç¨æ·çè§è²ç»&å²ä½ç»ä»£ç </li> |
| | | <li>ä¼å宿¶ä»»å¡cron表达å¼å°æ¶è®¾ç½®24</li> |
| | | <li>ä¼åç¨æ·å¯¼å
¥æç¤ºæº¢åºåæ¾ç¤ºæ»å¨æ¡</li> |
| | | <li>ä¼åé²éå¤æäº¤æ è¯ç»å为(key+url+header)</li> |
| | | <li>ä¼ååé¡µæ¹æ³è®¾ç½®æéç¨æ¹ä¾¿çµæ´»è°ç¨</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.8.0 - 2021-12-01"> |
| | | <ol> |
| | | <li>æ°å¢é
å¥å¹¶åæ¥çVue3åç«¯çæ¬</li> |
| | | <li>æ°å¢éç¨æ¹æ³ç®å模æ/ç¼å/ä¸è½½/æé/页ç¾ä½¿ç¨</li> |
| | | <li>ä¼åå¯¼åºæ°æ®/使ç¨éç¨ä¸è½½æ¹æ³</li> |
| | | <li>Excelæ³¨è§£æ¯æèªå®ä¹æ°æ®å¤çå¨</li> |
| | | <li>Excelæ³¨è§£æ¯æå¯¼å
¥å¯¼åºæ é¢ä¿¡æ¯</li> |
| | | <li>Excel导å
¥æ¯æ@Excels注解</li> |
| | | <li>æ°å¢ç»ä»¶data-dictï¼ç®åæ°æ®åå
¸ä½¿ç¨</li> |
| | | <li>æ°å¢Jaxbä¾èµï¼é²æ¢jdk8以ä¸åºç°çå
¼å®¹é误</li> |
| | | <li>ç产ç¯å¢ä½¿ç¨è·¯ç±æå è½½æå页é¢ååºé度</li> |
| | | <li>ä¿®å¤äºçº§ä»¥ä¸èååºç°ç404é®é¢</li> |
| | | <li>é²éæäº¤æ³¨è§£æ¯æé
ç½®é´éæ¶é´/æç¤ºæ¶æ¯</li> |
| | | <li>æ¥å¿æ³¨è§£æ°å¢æ¯å¦ä¿åååºåæ°</li> |
| | | <li>ä»»å¡å±è½è¿è§å符&åæ°å¿½ç¥åå¼å·ä¸çéå·</li> |
| | | <li>å级SpringBootå°ææ°çæ¬2.5.6</li> |
| | | <li>å级pagehelperå°ææ°ç1.4.0</li> |
| | | <li>å级spring-boot-mybatiså°ææ°ç2.2.0</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.8.2</li> |
| | | <li>å级druidå°ææ°ç1.2.8</li> |
| | | <li>å级velocityå°ææ°çæ¬2.3</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.78</li> |
| | | <li>å级axioså°ææ°çæ¬0.24.0</li> |
| | | <li>å级dart-sasså°çæ¬1.32.13</li> |
| | | <li>å级core-jså°ææ°çæ¬3.19.1</li> |
| | | <li>å级jsencryptå°ææ°çæ¬3.2.1</li> |
| | | <li>å级js-cookieå°ææ°çæ¬3.0.1</li> |
| | | <li>å级file-saverå°ææ°çæ¬2.0.5</li> |
| | | <li>å级sass-loaderå°ææ°çæ¬10.1.1</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.6</li> |
| | | <li>æ°å¢sendGetæ åè¯·æ±æ¹æ³</li> |
| | | <li>ç¦ç¨el-tagç»ä»¶çæ¸åå¨ç»</li> |
| | | <li>代ç çæç¹å»é¢è§éç½®æ¿æ´»tab</li> |
| | | <li>AjaxResultéåputæ¹æ³ï¼ä»¥æ¹ä¾¿é¾å¼è°ç¨</li> |
| | | <li>ä¼åç»å½/éªè¯ç 请æ±headersä¸è®¾ç½®token</li> |
| | | <li>ä¼åç¨æ·ä¸ªäººä¿¡æ¯æ¥å£é²æ¢ä¿®æ¹ç¨æ·å</li> |
| | | <li>ä¼åCron表达å¼çæå¨å
³éæ¶éæ¯é¿å
ç¼å</li> |
| | | <li>ä¼å注åæåæç¤ºæ¶æ¯ç±»åsuccess</li> |
| | | <li>ä¼åaopè¯æ³ï¼ä½¿ç¨springèªå¨æ³¨å
¥æ³¨è§£</li> |
| | | <li>ä¼åè®°å½ç»å½ä¿¡æ¯ï¼ç§»é¤ä¸å¿
è¦çä¿®æ¹</li> |
| | | <li>ä¼åmybatiså
¨å±é»è®¤çæ§è¡å¨</li> |
| | | <li>ä¼åExcel导å
¥å¾çå¯è½åºç°çå¼å¸¸</li> |
| | | <li>ä¿®å¤ä»£ç çææ¨¡æ¿ä¸»å表å é¤ç¼ºå°äºå¡</li> |
| | | <li>ä¿®å¤æ¥å¿è®°å½å¯è½åºç°ç转æ¢å¼å¸¸</li> |
| | | <li>ä¿®å¤ä»£ç çæå¤éæ¡åå
¸éæ¼é®é¢</li> |
| | | <li>ä¿®å¤å
³éxssåè½å¯¼è´å¯éå¤è¯»RepeatableFilter失æ</li> |
| | | <li>ä¿®å¤åç¬¦ä¸²æ æ³è¢«å转ä¹é®é¢</li> |
| | | <li>ä¿®å¤å端主åè¡¨ä»£ç æ¨¡æ¿æ¹æ³åçæé误é®é¢</li> |
| | | <li>ä¿®å¤xssè¿æ»¤åæ ¼å¼åºç°çå¼å¸¸</li> |
| | | <li>ä¿®å¤swagger没ææå®dataTypeClass导è´å¯å¨åºç°warnæ¥å¿</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.7.0 - 2021-09-13"> |
| | | <ol> |
| | | <li>åæ°ç®¡çæ¯æé
ç½®éªè¯ç å¼å
³</li> |
| | | <li>æ°å¢æ¯å¦å¼å¯ç¨æ·æ³¨ååè½</li> |
| | | <li>宿¶ä»»å¡æ¯æå¨çº¿çæcron表达å¼</li> |
| | | <li>èåç®¡çæ¯æé
置路ç±åæ°</li> |
| | | <li>æ¯æèªå®ä¹æ³¨è§£å®ç°æ¥å£éæµ</li> |
| | | <li>Excelæ³¨è§£æ¯æImageå¾ç导å
¥</li> |
| | | <li>èªå®ä¹å¼¹å±æº¢åºæ»å¨æ ·å¼</li> |
| | | <li>èªå®ä¹å¯æå¨å¼¹çªå®½åº¦æä»¤</li> |
| | | <li>èªå®ä¹å¯æå¨å¼¹çªé«åº¦æä»¤</li> |
| | | <li>ä¿®å¤ä»»æè´¦æ·è¶æé®é¢</li> |
| | | <li>ä¿®æ¹æ¶æ£æ¥ç¨æ·æ°æ®æéèå´</li> |
| | | <li>ä¿®å¤ä¿åé
置主é¢é¢è²å¤±æé®é¢</li> |
| | | <li>æ°å¢æè²èå飿 ¼ä¸»é¢</li> |
| | | <li>èå&é¨é¨æ°å¢å±å¼/æå åè½</li> |
| | | <li>é¡µç¾æ°å¢å
³é左侧&æ·»å 徿 </li> |
| | | <li>é¡¶é¨èåæé¤éèçé»è®¤è·¯ç±</li> |
| | | <li>é¡¶é¨èååæ¥ç³»ç»ä¸»é¢æ ·å¼</li> |
| | | <li>跳转路ç±é«äº®ç¸å¯¹åºçèåæ </li> |
| | | <li>代ç çæä¸»å表å¤éè¡æ°æ®</li> |
| | | <li>æ¥æèå´æ¯ææ·»å å¤ç»</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.5</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.8.0</li> |
| | | <li>å级commons.ioå°ææ°çæ¬v2.11.0</li> |
| | | <li>宿¶ä»»å¡å±è½ldapè¿ç¨è°ç¨</li> |
| | | <li>宿¶ä»»å¡å±è½http(s)è¿ç¨è°ç¨</li> |
| | | <li>è¡¥å
宿¶ä»»å¡è¡¨å段注é</li> |
| | | <li>宿¶ä»»å¡å¯¹æ£æ¥å¼å¸¸è¿è¡äºå¡åæ»</li> |
| | | <li>å¯ç¨ç¶é¨é¨ç¶ææé¤é¡¶çº§èç¹</li> |
| | | <li>å¯ææ¬æ°å¢ä¸ä¼ æä»¶å¤§å°éå¶</li> |
| | | <li>é»è®¤é¦é¡µä½¿ç¨keep-aliveç¼å</li> |
| | | <li>ä¿®æ¹ä»£ç çæåå
¸åæ¾æ ·å¼</li> |
| | | <li>èªå®ä¹å页åçåä¼ å
¥åæ°</li> |
| | | <li>ä¿®å¤åå
¸ç»ä»¶å¼ä¸ºæ´å½¢ä¸æ¾ç¤ºé®é¢</li> |
| | | <li>ä¿®å¤å®æ¶ä»»å¡æ¥å¿æ§è¡ç¶ææ¾ç¤º</li> |
| | | <li>è§è²&èåæ°å¢åæ®µå±æ§æç¤ºä¿¡æ¯</li> |
| | | <li>ä¿®å¤è§è²åé
ç¨æ·é¡µé¢åæ°ç±»åé误æé</li> |
| | | <li>ä¼åå¸å±è®¾ç½®å¨ç»ç¹æ</li> |
| | | <li>ä¼åå¼å¸¸å¤çä¿¡æ¯</li> |
| | | <li>ä¼åé误token导è´çè§£æå¼å¸¸</li> |
| | | <li>å¯ç æ¡æ°å¢æ¾ç¤ºåæ¢å¯ç 徿 </li> |
| | | <li>宿¶ä»»å¡æ°å¢æ´å¤æä½</li> |
| | | <li>æ´å¤æä½æé®æ·»å æéæ§å¶</li> |
| | | <li>导å
¥ç¨æ·æ ·å¼ä¼å</li> |
| | | <li>æåéç¨æ¹æ³å°åºç±»æ§å¶å¨</li> |
| | | <li>ä¼åä½¿ç¨æéå·¥å
·è·åç¨æ·ä¿¡æ¯</li> |
| | | <li>ä¼åç¨æ·ä¸è½å é¤èªå·±</li> |
| | | <li>ä¼åXSSè·¨ç«èæ¬è¿æ»¤</li> |
| | | <li>ä¼å代ç çææ¨¡æ¿</li> |
| | | <li>éªè¯ç é»è®¤20sè¶
æ¶</li> |
| | | <li>BLOBä¸è½½æ¶æ¸
é¤URL对象å¼ç¨</li> |
| | | <li>代ç çæå¯¼å
¥è¡¨æå建æ¶é´æåº</li> |
| | | <li>ä¿®å¤ä»£ç çæé¡µé¢æ°æ®ç¼è¾ä¿åä¹åæ»æ¯è·³è½¬ç¬¬ä¸é¡µçé®é¢</li> |
| | | <li>ä¿®å¤å¸¦safariæµè§å¨æ æ³æ ¼å¼åutcæ¥ææ ¼å¼yyyy-MM-dd'T'HH:mm:ss.SSSé®é¢</li> |
| | | <li>å¤å¾ä¸ä¼ ç»ä»¶ç§»é¤å¤ä½çapiå°å&éªè¯å¤±è´¥å¯¼è´å¾çå é¤é®é¢&æ æ³å é¤ç¸åºå¾çä¿®å¤</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.6.0 - 2021-07-12"> |
| | | <ol> |
| | | <li>è§è²ç®¡çæ°å¢åé
ç¨æ·åè½</li> |
| | | <li>ç¨æ·ç®¡çæ°å¢åé
è§è²åè½</li> |
| | | <li>æ¥å¿åè¡¨æ¯ææåºæä½</li> |
| | | <li>ä¼ååæ°&åå
¸ç¼åæä½</li> |
| | | <li>ç³»ç»å¸å±é
ç½®æ¯æå¨ææ é¢å¼å
³</li> |
| | | <li>èåè·¯ç±é
ç½®æ¯æå
é¾è®¿é®</li> |
| | | <li>é»è®¤è®¿é®å端é¦é¡µæ°å¢æç¤ºè¯</li> |
| | | <li>坿æ¬é»è®¤ä¸ä¼ è¿åurlç±»å</li> |
| | | <li>æ°å¢èªå®ä¹å¼¹çªææ½æä»¤</li> |
| | | <li>å
¨å±æ³¨å常ç¨éç¨ç»ä»¶</li> |
| | | <li>å
¨å±æè½½åå
¸æ ç¾ç»ä»¶</li> |
| | | <li>ImageUploadç»ä»¶æ¯æå¤å¾çä¸ä¼ </li> |
| | | <li>FileUploadç»ä»¶æ¯æå¤æä»¶ä¸ä¼ </li> |
| | | <li>æä»¶ä¸ä¼ ç»ä»¶æ·»å æ°ééå¶å±æ§</li> |
| | | <li>坿æ¬ç¼è¾ç»ä»¶æ·»å ç±»å屿§</li> |
| | | <li>坿æ¬ç»ä»¶å·¥å
·æ é
ç½®è§é¢</li> |
| | | <li>å°è£
éç¨iframeç»ä»¶</li> |
| | | <li>éå¶è¶
级管çåä¸å
许æä½</li> |
| | | <li>ç¨æ·ä¿¡æ¯é¿åº¦æ ¡éªéå¶</li> |
| | | <li>å页ç»ä»¶æ°å¢pagerCount屿§</li> |
| | | <li>æ·»å batèæ¬æ§è¡åºç¨</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.7.4</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.2</li> |
| | | <li>å级pagehelperå°ææ°ç1.3.1</li> |
| | | <li>å级commons.ioå°ææ°çæ¬v2.10.0</li> |
| | | <li>å级commons.fileuploadå°ææ°çæ¬v1.4</li> |
| | | <li>å级swaggerå°ææ°çæ¬v3.0.0</li> |
| | | <li>ä¿®å¤å
³éconfirmæç¤ºæ¡æ§å¶å°æ¥éé®é¢</li> |
| | | <li>ä¿®å¤åå¨çSQL注å
¥æ¼æ´é®é¢</li> |
| | | <li>宿¶ä»»å¡å±è½rmiè¿ç¨è°ç¨</li> |
| | | <li>ä¿®å¤ç¨æ·æç´¢å页åéé误</li> |
| | | <li>ä¿®å¤å¯¼åºè§è²æ°æ®èå´ç¿»è¯ç¼ºå°ä»
æ¬äºº</li> |
| | | <li>ä¿®å¤è¡¨åæå»ºéæ©ä¸æéæ©æ§å¶å°æ¥éé®é¢</li> |
| | | <li>ä¼åå¾çå·¥å
·ç±»è¯»åæä»¶</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.5.0 - 2021-05-25"> |
| | | <ol> |
| | | <li>æ°å¢èåå¯¼èªæ¾ç¤ºé£æ ¼TopNavï¼false为左侧导èªèåï¼true为顶é¨å¯¼èªèåï¼</li> |
| | | <li>å¸å±è®¾ç½®æ¯æä¿å&éç½®é
ç½®</li> |
| | | <li>ä¿®å¤æ è¡¨æ°æ®æ¾ç¤ºä¸å
¨&å è½½æ
¢é®é¢</li> |
| | | <li>æ°å¢IEæµè§å¨çæ¬è¿ä½æç¤ºé¡µé¢</li> |
| | | <li>ç¨æ·ç»å½åè®°å½æåç»å½IP&æ¶é´</li> |
| | | <li>页é¢å¯¼åºæé®ç¹å»ä¹åæ·»å é®ç½©</li> |
| | | <li>坿æ¬ç¼è¾å¨æ¯æèªå®ä¹ä¸ä¼ å°å</li> |
| | | <li>坿æ¬ç¼è¾ç»ä»¶æ°å¢readOnly屿§</li> |
| | | <li>页ç¾TagsViewæ°å¢å
³éå³ä¾§åè½</li> |
| | | <li>æ¾éåç»ä»¶å è½½åå§é»è®¤éèå</li> |
| | | <li>å
³é头åä¸ä¼ çªå£è¿åé»è®¤å¾ç</li> |
| | | <li>ä¸ªäººä¿¡æ¯æ·»å ææº&é®ç®±éå¤éªè¯</li> |
| | | <li>代ç çææ¨¡æ¿å¯¼åºæé®ç¹å»åæ·»å é®ç½©</li> |
| | | <li>代ç çææ¨¡æ¿æ 表æä½åæ·»å æ°å¢æé®</li> |
| | | <li>代ç çææ¨¡æ¿ä¿®å¤ä¸»åè¡¨åæ®µéåé®é¢</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.76</li> |
| | | <li>å级druidå°ææ°çæ¬v1.2.6</li> |
| | | <li>å级mybatiså°ææ°ç3.5.6 黿¢è¿ç¨ä»£ç æ§è¡æ¼æ´</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.6.0</li> |
| | | <li>velocityåé¤commons-collectionsçæ¬ï¼é²æ¢3.2.1çæ¬çååºååæ¼æ´</li> |
| | | <li>æ°æ®çæ§é¡µé»è®¤è´¦æ·å¯ç 鲿¢è¶æè®¿é®</li> |
| | | <li>ä¿®å¤firefoxä¸è¡¨åæå»ºææ½ä¼æ°æå¡ä¸ä¸ªé项å¡</li> |
| | | <li>ä¿®æ£å端导å
¥è¡¨æéæ è¯</li> |
| | | <li>ä¿®æ£å端æä½æ¥å¿&ç»å½æ¥å¿æéæ è¯</li> |
| | | <li>设置Redisé
ç½®HashKeyåºåå</li> |
| | | <li>å 餿使¥å¿è®°å½ä¿¡æ¯</li> |
| | | <li>ä¸ä¼ åªä½ç±»åæ·»å è§é¢æ ¼å¼</li> |
| | | <li>ä¿®å¤è¯·æ±å½¢åæªä¼ å¼è®°å½æ¥å¿å¼å¸¸é®é¢</li> |
| | | <li>ä¼åxssæ ¡éªjsonè¯·æ±æ¡ä»¶</li> |
| | | <li>æ çº§ç»ææ´æ°åèç¹ä½¿ç¨replaceFirst</li> |
| | | <li>ä¼åExcelUtil空å¼å¤ç</li> |
| | | <li>æ¥å¿è®°å½è¿æ»¤BindingResult对象ï¼é²æ¢å¼å¸¸</li> |
| | | <li>ä¿®æ¹ä¸»é¢åminiç±»åæé®æ æé®é¢</li> |
| | | <li>ä¼åéç¨ä¸è½½å®æåå é¤èç¹</li> |
| | | <li>éç¨Controlleræ·»å ååºè¿åæ¶æ¯</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.4.0 - 2021-02-22"> |
| | | <ol> |
| | | <li>代ç çææ¨¡æ¿æ¯æä¸»å表</li> |
| | | <li>è¡¨æ ¼å³ä¾§å·¥å
·æ ç»ä»¶æ¯ææ¾éå</li> |
| | | <li>å¾çç»ä»¶æ·»å é¢è§&ç§»é¤åè½</li> |
| | | <li>Excelæ³¨è§£æ¯æImageå¾ç导åº</li> |
| | | <li>æä½æé®ç»è°æ´ä¸ºæ´ç´ æé®æ ·å¼</li> |
| | | <li>代ç çææ¯ææä»¶ä¸ä¼ ç»ä»¶</li> |
| | | <li>代ç çææ¥ææ§ä»¶åºåèå´</li> |
| | | <li>代ç çææ°æ®åºææ¬ç±»åçæè¡¨åææ¬å</li> |
| | | <li>ç¨æ·ææºé®ç®±&èåç»ä»¶ä¿®æ¹å
许空å符串</li> |
| | | <li>å级SpringBootå°ææ°çæ¬2.2.13 æåå¯å¨é度</li> |
| | | <li>å级druidå°ææ°çæ¬v1.2.4</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.75</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.15.0</li> |
| | | <li>ä¿®å¤IE11æµè§å¨æ¥éé®é¢</li> |
| | | <li>ä¼åå¤çº§èåä¹é´åæ¢æ æ³ç¼åçé®é¢</li> |
| | | <li>ä¿®å¤å级èåæ æ³æ¾ç¤ºé®é¢</li> |
| | | <li>ä¿®æ£ä¾§è¾¹æ éæè·¯ç±ä¸¢å¤±é®é¢</li> |
| | | <li>ä¿®å¤è§è²ç®¡ç-ç¼è¾è§è²-åè½æéæ¾ç¤ºå¼å¸¸</li> |
| | | <li>é
ç½®æä»¶æ°å¢redisæ°æ®åºç´¢å¼å±æ§</li> |
| | | <li>æéå·¥å
·ç±»å¢å admin夿</li> |
| | | <li>è§è²éèªå®ä¹æéèå´æ¸
ç©ºéæ©å¼</li> |
| | | <li>ä¿®å¤å¯¼å
¥æ°æ®ä¸ºè´æµ®ç¹æ°æ¶ä¸¢å¤±ç²¾åº¦é®é¢</li> |
| | | <li>ç§»é¤path-to-regexpæ£åå¹é
æä»¶</li> |
| | | <li>ä¿®å¤çææ è¡¨ä»£ç å¼å¸¸</li> |
| | | <li>ä¿®æ¹ipåæ®µé¿åº¦é²æ¢ipv6å°åé¿åº¦ä¸å¤</li> |
| | | <li>鲿¢get请æ±åæ°å¼ä¸ºfalseæ0çç¹æ®å¼ä¼å¯¼è´æ æ³æ£ç¡®çä¼ å</li> |
| | | <li>ç»å½åpushæ·»å catch鲿¢åºç°æ£æ¥é误</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.3.0 - 2020-12-14"> |
| | | <ol> |
| | | <li>æ°å¢ç¼åçæ§åè½</li> |
| | | <li>æ¯æä¸»é¢é£æ ¼é
ç½®</li> |
| | | <li>ä¿®å¤å¤çº§èåä¹é´åæ¢æ æ³ç¼åçé®é¢</li> |
| | | <li>å¤çº§èåèªå¨é
ç½®ç»ä»¶</li> |
| | | <li>代ç çæé¢è§æ¯æé«äº®æ¾ç¤º</li> |
| | | <li>æ¯æGetè¯·æ±æ å°Paramsåæ°</li> |
| | | <li>å é¤ç¨æ·åè§è²è§£ç»å
³è</li> |
| | | <li>å»é¤ç¨æ·ææºé®ç®±é¨é¨å¿
å¡«éªè¯</li> |
| | | <li>Excelæ¯ææ³¨è§£align坹齿¹å¼</li> |
| | | <li>Excelæ¯æå¯¼å
¥Booleanåæ°æ®</li> |
| | | <li>ä¼åå¤´åæ ·å¼ï¼é¼ æ ç§»å
¥æ¬åé®ç½©</li> |
| | | <li>代ç çæé¢è§æä¾æ»å¨æºå¶</li> |
| | | <li>代ç çæå é¤å¤ä½çæ°åfloatç±»å</li> |
| | | <li>ä¿®æ£è½¬æ¢å符串çç®æ å符é屿§</li> |
| | | <li>åæ¾æ°æ®åå
¸é²æ¢ç©ºå¼æ¥é</li> |
| | | <li>æ¥å¿è®°å½å¢å è¿æ»¤å¤æä»¶åºæ¯</li> |
| | | <li>ä¿®æ¹ç¼åSetæ¹æ³å¯è½å¯¼è´åµå¥çé®é¢</li> |
| | | <li>ç§»é¤å端ä¸äºå¤ä½çä¾èµ</li> |
| | | <li>鲿¢å®å
¨æ«æYUIåºç°çé£é©æç¤º</li> |
| | | <li>ä¿®æ¹node-sass为dart-sass</li> |
| | | <li>å级SpringBootå°ææ°çæ¬2.1.18</li> |
| | | <li>å级poiå°ææ°çæ¬4.1.2</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.3.6</li> |
| | | <li>å级bitwalkerå°ææ°çæ¬1.21</li> |
| | | <li>å级axioså°ææ°çæ¬0.21.0</li> |
| | | <li>å级element-uiå°ææ°çæ¬2.14.1</li> |
| | | <li>å级vueå°ææ°çæ¬2.6.12</li> |
| | | <li>å级vuexå°ææ°çæ¬3.6.0</li> |
| | | <li>å级vue-cliå°çæ¬4.5.9</li> |
| | | <li>å级vue-routerå°ææ°çæ¬3.4.9</li> |
| | | <li>å级vue-cliå°ææ°çæ¬4.4.6</li> |
| | | <li>å级vue-cropperå°ææ°çæ¬0.5.5</li> |
| | | <li>å级clipboardå°ææ°çæ¬2.0.6</li> |
| | | <li>å级core-jså°ææ°çæ¬3.8.1</li> |
| | | <li>å级echartså°ææ°çæ¬4.9.0</li> |
| | | <li>å级file-saverå°ææ°çæ¬2.0.4</li> |
| | | <li>å级fuse.jså°ææ°çæ¬6.4.3</li> |
| | | <li>å级js-beautifyå°ææ°çæ¬1.13.0</li> |
| | | <li>å级js-cookieå°ææ°çæ¬2.2.1</li> |
| | | <li>å级path-to-regexpå°ææ°çæ¬6.2.0</li> |
| | | <li>å级quillå°ææ°çæ¬1.3.7</li> |
| | | <li>å级screenfullå°ææ°çæ¬5.0.2</li> |
| | | <li>å级sortablejså°ææ°çæ¬1.10.2</li> |
| | | <li>å级vuedraggableå°ææ°çæ¬2.24.3</li> |
| | | <li>å级chalkå°ææ°çæ¬4.1.0</li> |
| | | <li>å级eslintå°ææ°çæ¬7.15.0</li> |
| | | <li>å级eslint-plugin-vueå°ææ°çæ¬7.2.0</li> |
| | | <li>å级lint-stagedå°ææ°çæ¬10.5.3</li> |
| | | <li>å级runjså°ææ°çæ¬4.4.2</li> |
| | | <li>å级sass-loaderå°ææ°çæ¬10.1.0</li> |
| | | <li>å级script-ext-html-webpack-pluginå°ææ°çæ¬2.1.5</li> |
| | | <li>å级svg-sprite-loaderå°ææ°çæ¬5.1.1</li> |
| | | <li>å级vue-template-compilerå°ææ°çæ¬2.6.12</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.2.1 - 2020-11-18"> |
| | | <ol> |
| | | <li>黿¢ä»»ææä»¶ä¸è½½æ¼æ´</li> |
| | | <li>代ç çææ¯æä¸ä¼ æ§ä»¶</li> |
| | | <li>æ°å¢å¾çä¸ä¼ ç»ä»¶</li> |
| | | <li>è°æ´é»è®¤é¦é¡µ</li> |
| | | <li>å级druidå°ææ°çæ¬v1.2.2</li> |
| | | <li>mapperLocationsé
ç½®æ¯æåé符</li> |
| | | <li>æéä¿¡æ¯è°æ´</li> |
| | | <li>è°æ´sqlé»è®¤æ¶é´</li> |
| | | <li>è§£å³ä»£ç çææ²¡æbitç±»åçé®é¢</li> |
| | | <li>å级pagehelperå°ææ°ç1.3.0</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v3.2.0 - 2020-10-10"> |
| | | <ol> |
| | | <li>å级springbootçæ¬å°2.1.17 æåå®å
¨æ§</li> |
| | | <li>å级oshiå°ææ°çæ¬v5.2.5</li> |
| | | <li>å级druidå°ææ°çæ¬v1.2.1</li> |
| | | <li>å级jjwtå°çæ¬0.9.1</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.74</li> |
| | | <li>ä¿®æ¹sass为node-sassï¼é¿å
el-icon徿 ä¹±ç </li> |
| | | <li>代ç çææ¯æåæ¥æ°æ®åº</li> |
| | | <li>代ç çææ¯æå¯ææ¬æ§ä»¶</li> |
| | | <li>代ç çæé¡µé¢æ¶ä¸å¿½ç¥remark屿§</li> |
| | | <li>代ç çææ·»å selectå¿
å¡«é项</li> |
| | | <li>Excel导åºç±»åNUMERICæ¯æç²¾åº¦æµ®ç¹ç±»å</li> |
| | | <li>Excel导åºtargetAtträ¼åè·åå¼ï¼é²æ¢getæ¹æ³ä¸è§è</li> |
| | | <li>Excelæ³¨è§£æ¯æèªå¨ç»è®¡æ°æ®æ»å</li> |
| | | <li>Excelæ³¨è§£æ¯æè®¾ç½®BigDecimal精度&èå
¥è§å</li> |
| | | <li>èå&æ°æ®æéæ°å¢ï¼å±å¼/æå å
¨é/å
¨ä¸é ç¶åèå¨ï¼</li> |
| | | <li>å
è®¸ç¨æ·åé
å°é¨é¨ç¶èç¹</li> |
| | | <li>è忰墿¯å¦ç¼åkeep-alive</li> |
| | | <li>è¡¨æ ¼æä½åé´è·è°æ´</li> |
| | | <li>éå¶ç³»ç»å
ç½®åæ°ä¸å
许å é¤</li> |
| | | <li>坿æ¬ç»ä»¶ä¼åï¼æ¯æèªå®ä¹é«åº¦&å¾çå²çªé®é¢</li> |
| | | <li>坿æ¬å·¥å
·æ æ ·å¼å¯¹é½</li> |
| | | <li>导å
¥excelæ´å½¢å¼æ ¡éªä¼å</li> |
| | | <li>ä¿®å¤é¡µç¾å
³éæææ¶åºå®æ ç¾è·¯ç±ä¸å·æ°é®é¢</li> |
| | | <li>表åæå»ºå¸å±åç»ä»¶æ°å¢æé®</li> |
| | | <li>左侧èåæåè¿é¿æ¾ç¤ºçç¥å·</li> |
| | | <li>ä¿®æ£æ ¹èç¹ä¸ºåé¨é¨æ¶ï¼æ ç¶ç»ææ¾ç¤ºé®é¢</li> |
| | | <li>ä¿®æ£è°ç¨ç®æ å符串æå¤§é¿åº¦</li> |
| | | <li>ä¿®æ£èåæç¤ºä¿¡æ¯é误</li> |
| | | <li>ä¿®æ£å®æ¶ä»»å¡æ§è¡ä¸æ¬¡æéæ è¯</li> |
| | | <li>ä¿®æ£æ°æ®åºå符串类ånvarchar</li> |
| | | <li>ä¼åéå½åèç¹</li> |
| | | <li>ä¼åæ°æ®æé夿</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="v3.1.0 - 2020-08-13"> |
| | | <ol> |
| | | <li>è¡¨æ ¼å·¥å
·æ å³ä¾§æ·»å å·æ°&æ¾éæ¥è¯¢ç»ä»¶</li> |
| | | <li>åç«¯æ¯æCORSè·¨å请æ±</li> |
| | | <li>代ç çææ¯æéæ©ä¸çº§èå</li> |
| | | <li>代ç çææ¯æèªå®ä¹è·¯å¾</li> |
| | | <li>代ç çææ¯æå¤éæ¡</li> |
| | | <li>Excel导åºå¯¼å
¥æ¯ædictTypeåå
¸ç±»å</li> |
| | | <li>Excelæ¯æåå²å符串ç»å
容</li> |
| | | <li>éªè¯ç ç±»åæ¯æï¼æ°ç»è®¡ç®ãå符éªè¯ï¼</li> |
| | | <li>å级vue-cliçæ¬å°4.4.4</li> |
| | | <li>ä¿®æ¹ node-sass 为 dart-sass</li> |
| | | <li>表åç±»å为Integer/Long设置æ´å½¢é»è®¤å¼</li> |
| | | <li>代ç çæå¨é»è®¤mapperè·¯å¾ä¸é»è®¤mapperScanè·¯å¾ä¸ä¸è´</li> |
| | | <li>ä¼åé²éå¤æäº¤æ¦æªå¨</li> |
| | | <li>ä¼åä¸çº§èåä¸è½éæ©èªå·±</li> |
| | | <li>ä¿®å¤è§è²çæéåé
åï¼æªå®æ¶çæé®é¢</li> |
| | | <li>ä¿®å¤å¨çº¿ç¨æ·æ¥å¿è®°å½ç±»å</li> |
| | | <li>ä¿®å¤å¯ææ¬ç©ºæ ¼å缩è¿ä¿ååä¸çæé®é¢</li> |
| | | <li>ä¿®å¤å¨çº¿ç¨æ·å¤æé»è¾</li> |
| | | <li>å¯ä¸éå¶æ¡ä»¶åªè¿ååæ¡æ°æ®</li> |
| | | <li>æ·»å è·åå½åçç¯å¢é
ç½®æ¹æ³</li> |
| | | <li>è¶
æ¶ç»å½å页é¢è·³è½¬å°é¦é¡µ</li> |
| | | <li>å
¨å±å¼å¸¸ç¶ææ±åæ¦æªå¤ç</li> |
| | | <li>HTMLè¿æ»¤å¨æ¹ä¸ºå°html转ä¹</li> |
| | | <li>æ£æ¥åç¬¦æ¯æå°æ°ç¹&éçº§æ¹æå¼å¸¸æé</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="v3.0.0 - 2020-07-20"> |
| | | <ol> |
| | | <li>ååºç¨è°æ´ä¸ºå¤æ¨¡å项ç®</li> |
| | | <li>å级element-uiçæ¬å°2.13.2</li> |
| | | <li>å é¤babelï¼æé«ç¼è¯é度ã</li> |
| | | <li>æ°å¢èåé»è®¤ä¸»ç±»ç®</li> |
| | | <li>ç¼ç æä»¶åä¿®æ¹ä¸ºuuidæ¹å¼</li> |
| | | <li>宿¶ä»»å¡cron表达å¼éªè¯</li> |
| | | <li>è§è²æéä¿®æ¹æ¶å·²ææéæªèªå¨å¾éå¼å¸¸ä¿®å¤</li> |
| | | <li>鲿¢åæ¢æéç¨æ·åç»å½åºç°404</li> |
| | | <li>Excelæ¯æsortå¯¼åºæåº</li> |
| | | <li>åå»ºç¨æ·ä¸å
è®¸éæ©è¶
级管çåè§è²</li> |
| | | <li>ä¿®å¤ä»£ç çæå¯¼å
¥è¡¨ç»æåºç°å¼å¸¸é¡µé¢ä¸æéé®é¢</li> |
| | | <li>ä¿®å¤ä»£ç çæç¹å»å¤æ¬¡è¡¨ä¿®æ¹æ°æ®ä¸ååçé®é¢</li> |
| | | <li>ä¿®å¤å¤´åä¸ä¼ æåäºæ¬¡æå¼æ æ³æ¹åè£åªæ¡å¤§å°åä½ç½®é®é¢</li> |
| | | <li>ä¿®å¤å¸å±ä¸ºsmallè
miniç¨æ·è¡¨åæ¾ç¤ºéä½é®é¢</li> |
| | | <li>ä¿®å¤çé¨ç½²å¯¼è´ç强æ¢å¼å¸¸é®é¢</li> |
| | | <li>ä¿®æ¹ç¨æ·ç®¡çå¤éæ¡å®½åº¦ï¼é²æ¢é¨åæµè§å¨åºç°çç¥å·</li> |
| | | <li>IpUtilså·¥å
·ï¼æ¸
é¤Xssç¹æ®å符ï¼é²æ¢Xff注å
¥æ»å»</li> |
| | | <li>çædomain å¦ææ¯æµ®ç¹å ç»ä¸ç¨BigDecimal</li> |
| | | <li>宿¶ä»»å¡è°æ´label-widthï¼é²æ¢é¨ç½²åºç°éä½</li> |
| | | <li>è°æ´è¡¨å¤´åºå®åé»è®¤æ ·å¼</li> |
| | | <li>代ç çææ¨¡æ¿è°æ´ï¼å段为Stringå¹¶ä¸å¿
å¡«åå 空串æ¡ä»¶</li> |
| | | <li>代ç çæåå
¸Integer/Long使ç¨parseInt</li> |
| | | <li> |
| | | ä¿®å¤dict_sortä¸å¯update为0çé®é¢&æ¥è¯¢è¿åå¢å dict_sortååºæåº |
| | | </li> |
| | | <li>ä¿®æ£å²ä½å¯¼åºæé注解</li> |
| | | <li>ç¦æ¢å å¯å¯æè¿åå端</li> |
| | | <li>ä¿®å¤ä»£ç çæé¡µé¢ä¸çæ¥è¯¢æ¡ä»¶å建æ¶é´æªçæçé®é¢</li> |
| | | <li>ä¿®å¤é¦é¡µæç´¢èåå¤é¾æ æ³ç¹å»è·³è½¬é®é¢</li> |
| | | <li>ä¿®å¤èå管ç鿩徿 ï¼backspaceå 餿¶ä¸è¿æ»¤æ°æ®</li> |
| | | <li>ç¨æ·ç®¡çé¨é¨åæ¯èç¹ä¸å¯æ£æ¥&æ¾ç¤ºè®¡æ°</li> |
| | | <li>æ°æ®èå´è¿æ»¤å±æ§è°æ´</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="v2.3.0 - 2020-06-01"> |
| | | <ol> |
| | | <li>å级fastjsonå°ææ°ç1.2.70 ä¿®å¤é«å±å®å
¨æ¼æ´</li> |
| | | <li>devå¯å¨é»è®¤æå¼æµè§å¨</li> |
| | | <li>vue-cli使ç¨é»è®¤source-map</li> |
| | | <li>slidebar eslintæ¥éä¼å</li> |
| | | <li>å½tags-viewæ»å¨å
³éå³é®èå</li> |
| | | <li>åå
¸ç®¡çæ·»å ç¼å读å</li> |
| | | <li>åæ°ç®¡çæ¯æç¼åæä½</li> |
| | | <li>æ¯æä¸çº§èåï¼å主页å级ï¼å¨mainåºåæ¾ç¤º</li> |
| | | <li>éå¶å¤é¾å°åå¿
须以http(s)å¼å¤´</li> |
| | | <li>tagview & sidebar 主é¢é¢è²ä¸element ui(å
¨å±)忥</li> |
| | | <li>ä¿®æ¹æ°æ®æºç±»åä¼å
级ï¼å
æ ¹æ®æ¹æ³ï¼åæ ¹æ®ç±»</li> |
| | | <li>æ¯ææ¯å¦éè¦è®¾ç½®token屿§ï¼èªå®ä¹è¿åç æ¶æ¯ã</li> |
| | | <li>swagger请æ±åç¼å å
¥é
ç½®ã</li> |
| | | <li>ç»å½å°ç¹è®¾ç½®å
容è¿é¿åéèæ¾ç¤º</li> |
| | | <li>ä¿®å¤å®æ¶ä»»å¡æ§è¡ä¸æ¬¡æé®åä¸æç¤ºæ¶æ¯é®é¢</li> |
| | | <li>ä¿®æ¹ä¸çº§é¨é¨ï¼éæ©é¡¹æé¤æ¬èº«åä¸çº§ï¼</li> |
| | | <li>éç¨httpåéæ¹æ³å¢å åæ° contentType ç¼ç ç±»å</li> |
| | | <li>æ´æ¢IPå°åæ¥è¯¢æ¥å£</li> |
| | | <li>ä¿®å¤é¡µç¾åéundefined</li> |
| | | <li>æ·»å æ ¡éªé¨é¨å
嫿ªåç¨çåé¨é¨</li> |
| | | <li>ä¿®æ¹å®æ¶ä»»å¡è¯¦æ
䏿¬¡æ§è¡æ¶é´æ¥ææ¾ç¤ºé误</li> |
| | | <li>è§è²ç®¡çæ¥è¯¢è®¾ç½®é»è®¤æåºå段</li> |
| | | <li>swaggeræ·»å enableåæ°æ§å¶æ¯å¦å¯ç¨</li> |
| | | <li>åªå¯¹jsonç±»åè¯·æ±æå»ºå¯éå¤è¯»åinputStreamçrequest</li> |
| | | <li>ä¿®æ¹ä»£ç çæåå
¸å段intç±»åæ²¡æèªå¨éä¸é®é¢</li> |
| | | <li>vuexç¨æ·ååå¼ä¿®æ£</li> |
| | | <li>è¡¨æ ¼æ æ¨¡æ¿å»æå¤ä½ç)</li> |
| | | <li>代ç çæåºå·ä¿®æ£</li> |
| | | <li>å
¨å±æ
åµä¸ä¸è°æ´ä¸å¤è¾¹è·</li> |
| | | <li>代ç çæDateåæ®µæ·»å é»è®¤æ ¼å¼</li> |
| | | <li>ç¨æ·ç®¡çè§è²éæ©æéæ§å¶</li> |
| | | <li>ä¿®å¤è·¯ç±æå è½½æ¥éé®é¢</li> |
| | | <li>模æ¿sql.vmæ·»å èåç¶æ</li> |
| | | <li>è®¾ç½®ç¨æ·åç§°ä¸è½ä¿®æ¹</li> |
| | | <li>dialogæ·»å append-to-body屿§ï¼é²æ¢ieé®ç½©</li> |
| | | <li>èååºåç¶æåæ¾ç¤ºéèåè½</li> |
| | | <li>å级fastjsonå°ææ°ç1.2.68 ä¿®å¤å®å
¨å åº</li> |
| | | <li>ä¿®å¤ä»£ç çæå¦æéæ©åå
¸ç±»å缺失éå·é®é¢</li> |
| | | <li>ç»å½è¯·æ±paramsæ´æ¢ä¸ºdataï¼é²æ¢æ´é²url</li> |
| | | <li>æ¥å¿è¿åæ¶é´æ ¼å¼å¤ç</li> |
| | | <li>æ·»å handleæ§å¶å
许æå¨çå
ç´ </li> |
| | | <li>å¸å±è®¾ç½®ç¹å»æ©å¤§èå´</li> |
| | | <li>代ç çæå屿§æåºæ¥è¯¢</li> |
| | | <li>代ç çæåæ¯ææå¨æåº</li> |
| | | <li>ä¿®å¤æ¶é´æ ¼å¼ä¸æ¯æiosé®é¢</li> |
| | | <li>表åæå»ºæ·»å ç¶çº§classï¼é²æ¢å²çª</li> |
| | | <li>宿¶ä»»å¡å¹¶å屿§ä¿®æ£</li> |
| | | <li>è§è²ç¦ç¨&èåéè䏿¥è¯¢æé</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="v2.2.0 - 2020-03-18"> |
| | | <ol> |
| | | <li>ç³»ç»çæ§æ°å¢å®æ¶ä»»å¡åè½</li> |
| | | <li>æ·»å ä¸ä¸ªæå
Webå·¥ç¨bat</li> |
| | | <li>ä¿®å¤é¡µç¾é¼ æ æ»è½®æä¸çæ¶åï¼å¯ä»¥å
³éä¸å¯å
³éçtag</li> |
| | | <li>ä¿®å¤ç¹å»éåºç»å½ææ¶ä¼æ æç¤ºé®é¢</li> |
| | | <li>ä¿®å¤é²éå¤æäº¤æ³¨è§£æ æé®é¢</li> |
| | | <li>ä¿®å¤éç¥å
¬åæ¹éå é¤å¼å¸¸é®é¢</li> |
| | | <li>æ·»å èåæ¶è·¯ç±å°åå¿
å¡«éå¶</li> |
| | | <li>代ç çæå段æè¿°å¯ç¼è¾</li> |
| | | <li>ä¿®å¤ç¨æ·ä¿®æ¹ä¸ªäººä¿¡æ¯å¯¼è´ç¼åä¸è¿æé®é¢</li> |
| | | <li>个人信æ¯å建æ¶é´è·åæ£ç¡®å±æ§å¼</li> |
| | | <li>æä½æ¥å¿è¯¦ç»æ¾ç¤ºæ£ç¡®ç±»å</li> |
| | | <li>导å
¥è¡¨åå»è¡æ°æ®æ¶éä¸å¯¹åºçå¤éæ¡</li> |
| | | <li>æ¹éæ¿æ¢è¡¨åç¼é»è¾è°æ´</li> |
| | | <li>åºå®éå®åè·¯å¾è¡¨è¾¾å¼</li> |
| | | <li>å级element-uiçæ¬å°2.13.0</li> |
| | | <li>æä½æ¥å¿æåºè°æ´</li> |
| | | <li>ä¿®å¤chartsåæ¢ä¾§è¾¹æ æè
缩æ¾çªå£æ¾ç¤ºbug</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="v2.1.0 - 2020-02-24"> |
| | | <ol> |
| | | <li>æ°å¢è¡¨åæå»º</li> |
| | | <li>代ç çææ¯ææ è¡¨ç»æ</li> |
| | | <li>æ°å¢ç¨æ·å¯¼å
¥</li> |
| | | <li>ä¿®å¤å¨æå 载路ç±é¡µé¢å·æ°é®é¢</li> |
| | | <li>ä¿®å¤å°åå¼å
³æ æé®é¢</li> |
| | | <li>æ±åé误æç¤ºé¡µé¢</li> |
| | | <li>代ç çæå·²ç¥é®é¢ä¿®æ¹</li> |
| | | <li>ä¿®å¤å¤æ°æ®æºä¸é
ç½®å
³éåºç°å¼å¸¸å¤ç</li> |
| | | <li>æ·»å HTMLè¿æ»¤å¨ï¼ç¨äºå»é¤XSSæ¼æ´éæ£</li> |
| | | <li>ä¿®å¤ä¸ä¼ 头忧å¶å°åºç°å¼å¸¸</li> |
| | | <li>ä¿®æ¹ç¨æ·ç®¡çå页䏿£ç¡®çé®é¢</li> |
| | | <li>ä¿®å¤éªè¯ç è®°å½æç¤ºé误</li> |
| | | <li>ä¿®å¤request.js缺å°Messageå¼ç¨</li> |
| | | <li>ä¿®å¤è¡¨æ ¼æ¶é´ä¸ºç©ºåºç°çå¼å¸¸</li> |
| | | <li>æ·»å Jacksonæ¥æååºååæ¶åºé
ç½®</li> |
| | | <li>è°æ´æ ¹æ®ç¨æ·æéå è½½èåæ°æ®æ å½¢ç»æ</li> |
| | | <li>è°æ´æåç»å½ä¸æ¢å¤æé®ï¼é²æ¢å¤æ¬¡ç¹å»</li> |
| | | <li>ä¿®æ¹ç¨æ·ä¸ªäººèµæåæ¥ç¼åä¿¡æ¯</li> |
| | | <li>ä¿®å¤é¡µé¢åæ¶åºç°el-uploadåEditor䏿¾ç¤ºå¤ç</li> |
| | | <li>ä¿®å¤å¨è§è²ç®¡ç页修æ¹èåæéå¶å°æªéä¸é®é¢</li> |
| | | <li>é
ç½®æä»¶æ°å¢rediså¯ç 屿§</li> |
| | | <li>设置mybatiså
¨å±çé
ç½®æä»¶</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | |
| | | <el-collapse-item title="v2.0.0 - 2019-12-02"> |
| | | <ol> |
| | | <li>æ°å¢ä»£ç çæ</li> |
| | | <li>æ°å¢@RepeatSubmit注解ï¼é²æ¢éå¤æäº¤</li> |
| | | <li>æ°å¢èå主ç®å½æ·»å /å 餿ä½</li> |
| | | <li>æ¥å¿è®°å½è¿æ»¤ç¹æ®å¯¹è±¡ï¼é²æ¢è½¬æ¢å¼å¸¸</li> |
| | | <li>ä¿®æ¹ä»£ç çæè·¯ç±èæ¬é误</li> |
| | | <li>ç¨æ·ä¸ä¼ 头å宿¶åæ¥ç¼åï¼æ ééæ°ç»å½</li> |
| | | <li>è°æ´åæ¢é¡µç¾åä¸éæ°å è½½æ°æ®</li> |
| | | <li>æ·»å jsencryptå®ç°åæ°çå端å å¯</li> |
| | | <li>ç³»ç»éåºå é¤ç¨æ·ç¼åè®°å½</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v1.1.0 - 2019-11-11"> |
| | | <ol> |
| | | <li>æ°å¢å¨çº¿ç¨æ·ç®¡ç</li> |
| | | <li>æ°å¢æé®ç»åè½å®ç°ï¼æ¹éå é¤ã导åºãæ¸
空ï¼</li> |
| | | <li>æ°å¢æ¥è¯¢æ¡ä»¶éç½®æé®</li> |
| | | <li>æ°å¢Swaggerå
¨å±Tokené
ç½®</li> |
| | | <li>æ°å¢åç«¯åæ°æ ¡éª</li> |
| | | <li>ä¿®å¤åå
¸ç®¡ç页é¢çæ¥ææ¥è¯¢å¼å¸¸</li> |
| | | <li>ä¿®æ¹æ¶é´å½æ°å½å鲿¢å²çª</li> |
| | | <li>å»é¤èåä¸çº§æ ¡éªï¼é»è®¤ä¸ºé¡¶çº§</li> |
| | | <li>ä¿®å¤ç¨æ·å¯ç æ æ³ä¿®æ¹é®é¢</li> |
| | | <li>ä¿®å¤èåç±»å为æé®æ¶ä¸æ¾ç¤ºæéæ è¯</li> |
| | | <li>å
¶ä»ç»èä¼å</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | <el-collapse-item title="v1.0.0 - 2019-10-08"> |
| | | <ol> |
| | | <li>è¥ä¾åå端åç¦»ç³»ç»æ£å¼åå¸</li> |
| | | </ol> |
| | | </el-collapse-item> |
| | | </el-collapse> |
| | | </el-card> |
| | | </el-col> |
| | | <el-col :xs="24" :sm="24" :md="12" :lg="8"> |
| | | <el-card class="update-log"> |
| | | <template v-slot:header> |
| | | <div class="clearfix"> |
| | | <span>æèµ æ¯æ</span> |
| | | </div> |
| | | </template> |
| | | <div class="body"> |
| | | <img |
| | | src="@/assets/images/pay.png" |
| | | alt="donate" |
| | | style="width:100%" |
| | | /> |
| | | <span style="display: inline-block; height: 30px; line-height: 30px" |
| | | >ä½ å¯ä»¥è¯·ä½è
忝åå¡è¡¨ç¤ºé¼å±</span |
| | | > |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="stat-card supply"> |
| | | <div class="card-icon"> |
| | | <i class="el-icon-truck"></i> |
| | | </div> |
| | | <div class="card-content"> |
| | | <div class="card-title">ä¾åºé</div> |
| | | <div class="card-value">8,965 å¨</div> |
| | | <div class="card-trend"> |
| | | <span class="trend-label">è¾æ¨æ¥</span> |
| | | <span class="trend-value up">+8.2%</span> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- ä¸é´å¾è¡¨åºå --> |
| | | <div class="chart-section"> |
| | | <div class="chart-container"> |
| | | <div class="chart-title">è¥æ¶åå¸</div> |
| | | <div ref="pieChart" class="chart-content pie-chart"></div> |
| | | </div> |
| | | |
| | | <div class="chart-container"> |
| | | <div class="chart-title">ä¾åºéè¶å¿</div> |
| | | <div ref="areaChart" class="chart-content area-chart"></div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- åºé¨ä¸æ å¸å± --> |
| | | <div class="bottom-section"> |
| | | <!-- åºåç»è®¡ --> |
| | | <div class="bottom-card inventory"> |
| | | <div class="card-header"> |
| | | <h3>åºåç»è®¡</h3> |
| | | </div> |
| | | <div class="inventory-items"> |
| | | <div class="inventory-item"> |
| | | <div class="item-name">åç
¤</div> |
| | | <div class="item-value">15,432 å¨</div> |
| | | <div class="item-status normal">æ£å¸¸</div> |
| | | </div> |
| | | <div class="inventory-item"> |
| | | <div class="item-name">ç²¾ç
¤</div> |
| | | <div class="item-value">8,765 å¨</div> |
| | | <div class="item-status normal">æ£å¸¸</div> |
| | | </div> |
| | | <div class="inventory-item"> |
| | | <div class="item-name">ç¦ç
¤</div> |
| | | <div class="item-value">3,241 å¨</div> |
| | | <div class="item-status low">åä½</div> |
| | | </div> |
| | | <div class="inventory-item"> |
| | | <div class="item-name">åç
¤</div> |
| | | <div class="item-value">6,789 å¨</div> |
| | | <div class="item-status normal">æ£å¸¸</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- æ±ç¶å¾ --> |
| | | <div class="bottom-card chart"> |
| | | <div class="card-header"> |
| | | <h3>æåº¦å¯¹æ¯</h3> |
| | | </div> |
| | | <div ref="barChart" class="chart-content bar-chart"></div> |
| | | </div> |
| | | |
| | | <!-- é宿°æ®è¡¨æ ¼ --> |
| | | <div class="bottom-card table"> |
| | | <div class="card-header"> |
| | | <h3>é宿°æ®</h3> |
| | | </div> |
| | | <el-table |
| | | :data="salesData" |
| | | style="width: 100%" |
| | | :header-cell-style="tableHeaderStyle" |
| | | > |
| | | <el-table-column prop="product" label="产å" width="80"></el-table-column> |
| | | <el-table-column prop="quantity" label="æ°é" width="80"></el-table-column> |
| | | <el-table-column prop="amount" label="éé¢" width="90"></el-table-column> |
| | | <el-table-column prop="status" label="ç¶æ" width="70"> |
| | | <template #default="scope"> |
| | | <el-tag |
| | | :type="scope.row.status === '已宿' ? 'success' : 'warning'" |
| | | size="small" |
| | | > |
| | | {{ scope.row.status }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup name="Index"> |
| | | const version = ref('3.8.9') |
| | | <script> |
| | | import * as echarts from 'echarts' |
| | | |
| | | function goTarget(url) { |
| | | window.open(url, '__blank') |
| | | export default { |
| | | name: 'Dashboard', |
| | | data() { |
| | | return { |
| | | salesData: [ |
| | | { product: 'åç
¤', quantity: '1,234å¨', amount: 'Â¥456,789', status: '已宿' }, |
| | | { product: 'ç²¾ç
¤', quantity: '567å¨', amount: 'Â¥234,567', status: '已宿' }, |
| | | { product: 'ç¦ç
¤', quantity: '890å¨', amount: 'Â¥345,678', status: 'è¿è¡ä¸' }, |
| | | { product: 'åç
¤', quantity: '432å¨', amount: 'Â¥123,456', status: '已宿' }, |
| | | { product: 'ç
¤æ³¥', quantity: '678å¨', amount: 'Â¥234,567', status: 'è¿è¡ä¸' } |
| | | ], |
| | | tableHeaderStyle: { |
| | | backgroundColor: '#f5f7fa', |
| | | color: '#606266', |
| | | fontSize: '12px' |
| | | } |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.$nextTick(() => { |
| | | this.initCharts() |
| | | }) |
| | | }, |
| | | methods: { |
| | | initCharts() { |
| | | this.initPieChart() |
| | | this.initAreaChart() |
| | | this.initBarChart() |
| | | }, |
| | | |
| | | initPieChart() { |
| | | const chart = echarts.init(this.$refs.pieChart) |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'item', |
| | | formatter: '{a} <br/>{b}: {c} ({d}%)' |
| | | }, |
| | | legend: { |
| | | orient: 'vertical', |
| | | left: 'right', |
| | | top: 'center', |
| | | textStyle: { |
| | | fontSize: 12 |
| | | } |
| | | }, |
| | | series: [ |
| | | { |
| | | name: 'è¥æ¶åå¸', |
| | | type: 'pie', |
| | | radius: ['30%', '70%'], |
| | | center: ['40%', '50%'], |
| | | avoidLabelOverlap: false, |
| | | label: { |
| | | show: false, |
| | | position: 'center' |
| | | }, |
| | | emphasis: { |
| | | label: { |
| | | show: true, |
| | | fontSize: '16', |
| | | fontWeight: 'bold' |
| | | } |
| | | }, |
| | | labelLine: { |
| | | show: false |
| | | }, |
| | | data: [ |
| | | { value: 335, name: 'åç
¤', itemStyle: { color: '#409EFF' } }, |
| | | { value: 310, name: 'ç²¾ç
¤', itemStyle: { color: '#67C23A' } }, |
| | | { value: 234, name: 'ç¦ç
¤', itemStyle: { color: '#E6A23C' } }, |
| | | { value: 135, name: 'åç
¤', itemStyle: { color: '#F56C6C' } }, |
| | | { value: 155, name: 'å
¶ä»', itemStyle: { color: '#909399' } } |
| | | ] |
| | | } |
| | | ] |
| | | } |
| | | chart.setOption(option) |
| | | |
| | | // ååºå¼ |
| | | window.addEventListener('resize', () => { |
| | | chart.resize() |
| | | }) |
| | | }, |
| | | |
| | | initAreaChart() { |
| | | const chart = echarts.init(this.$refs.areaChart) |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'cross', |
| | | label: { |
| | | backgroundColor: '#6a7985' |
| | | } |
| | | } |
| | | }, |
| | | legend: { |
| | | data: ['ä¾åºé'], |
| | | top: 10 |
| | | }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: [ |
| | | { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | data: ['1æ', '2æ', '3æ', '4æ', '5æ', '6æ', '7æ'], |
| | | axisLabel: { |
| | | fontSize: 12 |
| | | } |
| | | } |
| | | ], |
| | | yAxis: [ |
| | | { |
| | | type: 'value', |
| | | axisLabel: { |
| | | fontSize: 12 |
| | | } |
| | | } |
| | | ], |
| | | series: [ |
| | | { |
| | | name: 'ä¾åºé', |
| | | type: 'line', |
| | | stack: 'Total', |
| | | areaStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: 'rgba(64, 158, 255, 0.3)' }, |
| | | { offset: 1, color: 'rgba(64, 158, 255, 0.1)' } |
| | | ]) |
| | | }, |
| | | emphasis: { |
| | | focus: 'series' |
| | | }, |
| | | data: [1200, 1320, 1010, 1340, 900, 1230, 1100], |
| | | lineStyle: { |
| | | color: '#409EFF' |
| | | }, |
| | | itemStyle: { |
| | | color: '#409EFF' |
| | | } |
| | | } |
| | | ] |
| | | } |
| | | chart.setOption(option) |
| | | |
| | | // ååºå¼ |
| | | window.addEventListener('resize', () => { |
| | | chart.resize() |
| | | }) |
| | | }, |
| | | |
| | | initBarChart() { |
| | | const chart = echarts.init(this.$refs.barChart) |
| | | const option = { |
| | | tooltip: { |
| | | trigger: 'axis', |
| | | axisPointer: { |
| | | type: 'shadow' |
| | | } |
| | | }, |
| | | grid: { |
| | | left: '3%', |
| | | right: '4%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | data: ['åç
¤', 'ç²¾ç
¤', 'ç¦ç
¤', 'åç
¤', 'ç
¤æ³¥'], |
| | | axisLabel: { |
| | | fontSize: 11 |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | axisLabel: { |
| | | fontSize: 11 |
| | | } |
| | | }, |
| | | series: [ |
| | | { |
| | | name: 'éé', |
| | | type: 'bar', |
| | | data: [320, 302, 301, 334, 290], |
| | | itemStyle: { |
| | | color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ |
| | | { offset: 0, color: '#409EFF' }, |
| | | { offset: 1, color: '#79bbff' } |
| | | ]) |
| | | }, |
| | | barWidth: '60%' |
| | | } |
| | | ] |
| | | } |
| | | chart.setOption(option) |
| | | |
| | | // ååºå¼ |
| | | window.addEventListener('resize', () => { |
| | | chart.resize() |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .home { |
| | | blockquote { |
| | | padding: 10px 20px; |
| | | margin: 0 0 20px; |
| | | font-size: 17.5px; |
| | | border-left: 5px solid #eee; |
| | | } |
| | | hr { |
| | | margin-top: 20px; |
| | | margin-bottom: 20px; |
| | | border: 0; |
| | | border-top: 1px solid #eee; |
| | | } |
| | | .col-item { |
| | | margin-bottom: 20px; |
| | | } |
| | | <style scoped> |
| | | .dashboard { |
| | | padding: 20px; |
| | | background-color: #f5f7fa; |
| | | min-height: 100vh; |
| | | } |
| | | |
| | | ul { |
| | | padding: 0; |
| | | margin: 0; |
| | | /* é¡¶é¨ç»è®¡å¡ç */ |
| | | .top-cards { |
| | | display: flex; |
| | | gap: 20px; |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .stat-card { |
| | | flex: 1; |
| | | background: white; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | display: flex; |
| | | align-items: center; |
| | | gap: 15px; |
| | | } |
| | | |
| | | .card-icon { |
| | | width: 60px; |
| | | height: 60px; |
| | | border-radius: 50%; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | font-size: 24px; |
| | | color: white; |
| | | } |
| | | |
| | | .revenue .card-icon { |
| | | background: linear-gradient(135deg, #409EFF, #79bbff); |
| | | } |
| | | |
| | | .supply .card-icon { |
| | | background: linear-gradient(135deg, #67C23A, #95d475); |
| | | } |
| | | |
| | | .card-content { |
| | | flex: 1; |
| | | } |
| | | |
| | | .card-title { |
| | | font-size: 14px; |
| | | color: #909399; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .card-value { |
| | | font-size: 24px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 5px; |
| | | } |
| | | |
| | | .card-trend { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .trend-label { |
| | | color: #909399; |
| | | margin-right: 5px; |
| | | } |
| | | |
| | | .trend-value.up { |
| | | color: #67C23A; |
| | | } |
| | | |
| | | /* ä¸é´å¾è¡¨åºå */ |
| | | .chart-section { |
| | | display: flex; |
| | | gap: 20px; |
| | | margin-bottom: 20px; |
| | | } |
| | | .el-scrollbar__view{ |
| | | width: 100%; |
| | | } |
| | | .chart-container { |
| | | flex: 1; |
| | | background: white; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .chart-title { |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | margin-bottom: 15px; |
| | | padding-bottom: 10px; |
| | | border-bottom: 2px solid #f0f0f0; |
| | | } |
| | | |
| | | .chart-content { |
| | | height: 280px; |
| | | } |
| | | |
| | | /* åºé¨ä¸æ å¸å± */ |
| | | .bottom-section { |
| | | display: flex; |
| | | gap: 20px; |
| | | } |
| | | |
| | | .bottom-card { |
| | | flex: 1; |
| | | background: white; |
| | | border-radius: 8px; |
| | | padding: 20px; |
| | | box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); |
| | | } |
| | | |
| | | .card-header { |
| | | margin-bottom: 15px; |
| | | padding-bottom: 10px; |
| | | border-bottom: 2px solid #f0f0f0; |
| | | } |
| | | |
| | | .card-header h3 { |
| | | margin: 0; |
| | | font-size: 16px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | } |
| | | |
| | | /* åºåç»è®¡æ ·å¼ */ |
| | | .inventory-items { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | } |
| | | |
| | | .inventory-item { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding: 12px; |
| | | background: #f8f9fa; |
| | | border-radius: 6px; |
| | | border-left: 3px solid #409EFF; |
| | | } |
| | | |
| | | .item-name { |
| | | font-weight: bold; |
| | | color: #303133; |
| | | } |
| | | |
| | | .item-value { |
| | | color: #606266; |
| | | font-size: 14px; |
| | | } |
| | | |
| | | .item-status { |
| | | padding: 2px 8px; |
| | | border-radius: 12px; |
| | | font-size: 12px; |
| | | font-weight: bold; |
| | | } |
| | | |
| | | .item-status.normal { |
| | | background: #f0f9ff; |
| | | color: #67C23A; |
| | | } |
| | | |
| | | .item-status.low { |
| | | background: #fef0e6; |
| | | color: #E6A23C; |
| | | } |
| | | |
| | | /* æ±ç¶å¾å®¹å¨ */ |
| | | .bar-chart { |
| | | height: 200px; |
| | | } |
| | | |
| | | /* è¡¨æ ¼æ ·å¼è°æ´ */ |
| | | .bottom-card.table { |
| | | min-width: 320px; |
| | | } |
| | | |
| | | .bottom-card.table .el-table { |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .bottom-card.table .el-table td, |
| | | .bottom-card.table .el-table th { |
| | | padding: 8px 0; |
| | | } |
| | | |
| | | /* ååºå¼è®¾è®¡ */ |
| | | @media (max-width: 1200px) { |
| | | .bottom-section { |
| | | flex-direction: column; |
| | | } |
| | | |
| | | font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; |
| | | font-size: 13px; |
| | | color: #676a6c; |
| | | overflow-x: hidden; |
| | | |
| | | ul { |
| | | list-style-type: none; |
| | | |
| | | .chart-section { |
| | | flex-direction: column; |
| | | } |
| | | } |
| | | |
| | | h4 { |
| | | margin-top: 0px; |
| | | @media (max-width: 768px) { |
| | | .top-cards { |
| | | flex-direction: column; |
| | | } |
| | | |
| | | h2 { |
| | | margin-top: 10px; |
| | | font-size: 26px; |
| | | font-weight: 100; |
| | | |
| | | .dashboard { |
| | | padding: 10px; |
| | | } |
| | | |
| | | p { |
| | | margin-top: 10px; |
| | | |
| | | b { |
| | | font-weight: 700; |
| | | } |
| | | |
| | | .stat-card { |
| | | padding: 15px; |
| | | } |
| | | |
| | | .update-log { |
| | | ol { |
| | | display: block; |
| | | list-style-type: decimal; |
| | | margin-block-start: 1em; |
| | | margin-block-end: 1em; |
| | | margin-inline-start: 0; |
| | | margin-inline-end: 0; |
| | | padding-inline-start: 40px; |
| | | } |
| | | |
| | | .card-value { |
| | | font-size: 20px; |
| | | } |
| | | } |
| | | </style> |
| | | |
| | |
| | | <el-form :model="form" :rules="rules" ref="formRef" label-width="120px"> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="设å¤åç§°" prop="name"> |
| | | <el-input v-model="form.name" placeholder="请è¾å
¥è®¾å¤åç§°" maxlength="30" /> |
| | | <el-form-item label="设å¤åç§°" prop="deviceName"> |
| | | <el-input v-model="form.deviceName" placeholder="请è¾å
¥è®¾å¤åç§°" maxlength="30" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="å°ç¹" prop="taxTrans"> |
| | | <el-input v-model="form.taxTrans" placeholder="请è¾å
¥å°ç¹" maxlength="30"/> |
| | | <el-form-item label="æå¨ä½ç½®æè¿°" prop="location"> |
| | | <el-input v-model="form.location" placeholder="请è¾å
¥æå¨ä½ç½®æè¿°" maxlength="30"/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <script setup> |
| | | import useUserStore from "@/store/modules/user.js"; |
| | | import {reactive, ref} from "vue"; |
| | | import printJS from 'print-js'; // å¼å
¥ print.js |
| | | import printJS from 'print-js'; |
| | | import {addOrEditQrCode} from "@/api/inspectionUpload/index.js"; |
| | | |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits() |
| | |
| | | const isShowQrCode = ref(false); |
| | | const operationType = ref('add'); |
| | | |
| | | const qrCodeValue = ref('https://example.com'); |
| | | const qrCodeValue = ref(''); |
| | | const qrCodeSize = ref(100); |
| | | const data = reactive({ |
| | | form: { |
| | | name: '', |
| | | taxTrans: '', |
| | | deviceName: '', |
| | | location: '', |
| | | qrCodeId: '', |
| | | id: '' |
| | | }, |
| | | rules: { |
| | | name: [{ required: true, message: '请è¾å
¥è®¾å¤åç§°', trigger: 'blur' }], |
| | | taxTrans: [{ required: true, message: '请è¾å
¥å°ç¹', trigger: 'blur' }] |
| | | deviceName: [{ required: true, message: '请è¾å
¥è®¾å¤åç§°', trigger: 'blur' }], |
| | | location: [{ required: true, message: '请è¾å
¥å°ç¹', trigger: 'blur' }] |
| | | } |
| | | }) |
| | | const { form, rules } = toRefs(data) |
| | |
| | | // æå¼å¼¹æ¡ |
| | | const openDialog = async (type, row) => { |
| | | dialogVisitable.value = true |
| | | qrCodeValue.value = '' |
| | | isShowQrCode.value = false; |
| | | if (type === 'edit') { |
| | | form.value.id = row.id |
| | | form.value.qrCodeId = row.id |
| | | form.value.deviceName = row.deviceName |
| | | form.value.location = row.location |
| | | // å°è¡¨åæ°æ®è½¬ä¸º JSON å符串ä½ä¸ºäºç»´ç å
容 |
| | | qrCodeValue.value = JSON.stringify(form.value); |
| | | isShowQrCode.value = true; |
| | | } |
| | | } |
| | | // æäº¤å并表å |
| | | const submitForm = () => { |
| | | proxy.$refs["formRef"].validate(valid => { |
| | | if (valid) { |
| | | addOrEditQrCode(form.value).then((res) => { |
| | | form.value.qrCodeId = res.data |
| | | }) |
| | | // å°è¡¨åæ°æ®è½¬ä¸º JSON å符串ä½ä¸ºäºç»´ç å
容 |
| | | qrCodeValue.value = JSON.stringify(form.value); |
| | | isShowQrCode.value = true; |
| | | |
| | | // å»¶è¿æ§è¡æå°ï¼é¿å
DOM æ´æ°åå°±è°ç¨æå° |
| | | setTimeout(() => { |
| | | printJS({ |
| | | printable: 'qrCodeContainer',//é¡µé¢ |
| | | type: "html",//ææ¡£ç±»å |
| | | maxWidth: 360, |
| | | style: `@page { |
| | | showQrCode() |
| | | } |
| | | }) |
| | | } |
| | | const showQrCode = () => { |
| | | // å»¶è¿æ§è¡æå°ï¼é¿å
DOM æ´æ°åå°±è°ç¨æå° |
| | | setTimeout(() => { |
| | | printJS({ |
| | | printable: 'qrCodeContainer',//é¡µé¢ |
| | | type: "html",//ææ¡£ç±»å |
| | | maxWidth: 360, |
| | | style: `@page { |
| | | margin:0; |
| | | size: 400px 75px collapse; |
| | | margin-top:3px; |
| | |
| | | height: 75px; |
| | | margin:0; |
| | | }`, |
| | | targetStyles: ["*"], // 使ç¨domçæææ ·å¼ï¼å¾éè¦ |
| | | font_size: '0.20cm', |
| | | }); |
| | | }, 300); |
| | | } |
| | | }) |
| | | targetStyles: ["*"], // 使ç¨domçæææ ·å¼ï¼å¾éè¦ |
| | | font_size: '0.20cm', |
| | | }); |
| | | }, 300); |
| | | } |
| | | // å
³éå并表å |
| | | const cancel = () => { |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog title="æ¥çéä»¶" |
| | | v-model="dialogVisitable" width="800px" @close="cancel"> |
| | | <div class="upload-container"> |
| | | <div class="form-container"> |
| | | <div class="title">å·¡æ£éä»¶</div> |
| | | <!-- å¾çå表 --> |
| | | <div style="display: flex; flex-wrap: wrap;"> |
| | | <img v-for="(item, index) in beforeProductionImgs" :key="index" |
| | | @click="showMedia(beforeProductionImgs, index, 'image')" |
| | | :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt=""> |
| | | </div> |
| | | |
| | | <!-- è§é¢å表 --> |
| | | <div style="display: flex; flex-wrap: wrap;"> |
| | | <div |
| | | v-for="(videoUrl, index) in beforeProductionVideos" |
| | | :key="index" |
| | | @click="showMedia(beforeProductionVideos, index, 'video')" |
| | | style="position: relative; margin: 10px; cursor: pointer;" |
| | | > |
| | | <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;"> |
| | | <img src="@/assets/images/video.png" alt="ææ¾" style="width: 30px; height: 30px; opacity: 0.8;" /> |
| | | </div> |
| | | <div style="text-align: center; font-size: 12px; color: #666;">ç¹å»ææ¾</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | <!-- ç»ä¸åªä½æ¥çå¨ --> |
| | | <div v-if="isMediaViewerVisible" class="media-viewer-overlay" @click.self="closeMediaViewer"> |
| | | <div class="media-viewer-content" @click.stop> |
| | | <!-- å¾ç --> |
| | | <vue-easy-lightbox |
| | | v-if="mediaType === 'image'" |
| | | :visible="isMediaViewerVisible" |
| | | :imgs="mediaList" |
| | | :index="currentMediaIndex" |
| | | @hide="closeMediaViewer" |
| | | ></vue-easy-lightbox> |
| | | |
| | | <!-- è§é¢ --> |
| | | <div v-else-if="mediaType === 'video'" style="position: relative;"> |
| | | <Video |
| | | :src="mediaList[currentMediaIndex]" |
| | | autoplay |
| | | controls |
| | | style="max-width: 90vw; max-height: 80vh;" |
| | | /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | // æ§å¶å¼¹çªæ¾ç¤º |
| | | import VueEasyLightbox from "vue-easy-lightbox"; |
| | | |
| | | const dialogVisitable = ref(false); |
| | | // å¾çæ°ç» |
| | | const beforeProductionImgs = ref([]); |
| | | // è§é¢æ°ç» |
| | | const beforeProductionVideos = ref([]); |
| | | // åªä½æ¥çå¨ç¶æ |
| | | const isMediaViewerVisible = ref(false); |
| | | const currentMediaIndex = ref(0); |
| | | const mediaList = ref([]); // åå¨å½åè¦æ¥ççåªä½å表ï¼å«å¾çåè§é¢å¯¹è±¡ï¼ |
| | | const mediaType = ref('image'); // image | video |
| | | |
| | | // æå¼å¼¹çªå¹¶å è½½æ°æ® |
| | | const openDialog = async (row) => { |
| | | const { images: beforeImgs, videos: beforeVids } = processItems(row.storageBlobDTO); |
| | | |
| | | beforeProductionImgs.value = beforeImgs; |
| | | beforeProductionVideos.value = beforeVids; |
| | | dialogVisitable.value = true; |
| | | }; |
| | | // æ¾ç¤ºåªä½ï¼å¾ç or è§é¢ï¼ |
| | | function showMedia(mediaArray, index, type) { |
| | | mediaList.value = mediaArray; |
| | | currentMediaIndex.value = index; |
| | | mediaType.value = type; |
| | | isMediaViewerVisible.value = true; |
| | | } |
| | | // å
³éåªä½æ¥çå¨ |
| | | function closeMediaViewer() { |
| | | isMediaViewerVisible.value = false; |
| | | mediaList.value = []; |
| | | mediaType.value = 'image'; |
| | | } |
| | | // 表åå
³éæ¹æ³ |
| | | const cancel = () => { |
| | | dialogVisitable.value = false; |
| | | }; |
| | | // å¤çæ¯ä¸ç±»æ°æ®ï¼å离å¾çåè§é¢ |
| | | function processItems(items) { |
| | | const images = []; |
| | | const videos = []; |
| | | items.forEach(item => { |
| | | if (item.contentType?.startsWith('image/')) { |
| | | images.push(item.url); |
| | | } else if (item.contentType?.startsWith('video/')) { |
| | | videos.push(item.url); |
| | | } |
| | | }); |
| | | return { images, videos }; |
| | | } |
| | | defineExpose({ openDialog }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .upload-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | padding: 20px; |
| | | border: 1px solid #dcdfe6; |
| | | box-sizing: border-box; |
| | | |
| | | .form-container { |
| | | flex: 1; |
| | | width: 100%; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | |
| | | .title { |
| | | font-size: 14px; |
| | | color: #165dff; |
| | | line-height: 20px; |
| | | font-weight: 600; |
| | | padding-left: 10px; |
| | | position: relative; |
| | | margin: 6px 0; |
| | | |
| | | &::before { |
| | | content: ""; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 3px; |
| | | width: 4px; |
| | | height: 14px; |
| | | background-color: #165dff; |
| | | } |
| | | } |
| | | |
| | | .media-viewer-overlay { |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | background-color: rgba(0, 0, 0, 0.8); |
| | | z-index: 9999; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .media-viewer-content { |
| | | position: relative; |
| | | max-width: 90vw; |
| | | max-height: 90vh; |
| | | overflow: hidden; |
| | | } |
| | | </style> |
| | |
| | | /> |
| | | </el-tabs> |
| | | <!-- æä½æé®åº --> |
| | | <el-space> |
| | | <el-space v-if="tabName !== 'qrCodeScanRecord'"> |
| | | <el-button type="primary" :icon="Plus" @click="handleAdd">æ°å»º</el-button> |
| | | <el-button type="danger" :icon="Delete" @click="handleDelete">å é¤</el-button> |
| | | <el-button type="info" plain :icon="Download">导åº</el-button> |
| | |
| | | <div> |
| | | <ETable :loading="tableLoading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | :columns="tableColumns" |
| | | @selection-change="handleSelectionChange" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :maxHeight="480" |
| | | operationsWidth="130" |
| | | :operations="['edit', 'viewFile']" |
| | | :operations="operationsArr" |
| | | @edit="handleAdd" |
| | | @viewFile="viewFile" |
| | | v-if="tabName !== 'qrCodeScanRecord'" |
| | | ></ETable> |
| | | <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading" v-else> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column prop="deviceName" label="设å¤åç§°" :show-overflow-tooltip="true"> |
| | | <template #default="scope"> |
| | | {{scope.row.qrCode.deviceName}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="location" label="æå¨ä½ç½®æè¿°" :show-overflow-tooltip="true"> |
| | | <template #default="scope"> |
| | | {{scope.row.qrCode.location}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="scanner" label="å·¡æ£äºº"></el-table-column> |
| | | <el-table-column prop="scanTime" label="å·¡æ£æ¶é´"></el-table-column> |
| | | <el-table-column fixed="right" label="æä½"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="handleAdd(scope.row)">æ¥çéä»¶</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | </div> |
| | | <pagination |
| | | v-if="total>0" |
| | |
| | | <form-dia ref="formDia" @closeDia="handleQuery"></form-dia> |
| | | <qr-code-dia ref="qrCodeDia" @closeDia="handleQuery"></qr-code-dia> |
| | | <view-files ref="viewFiles"></view-files> |
| | | <view-qr-code-files ref="viewQrCodeFiles"></view-qr-code-files> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import QrCodeDia from "@/views/inspectionManagement/components/qrCodeDia.vue"; |
| | | import {delInspectionTask, inspectionTaskList} from "@/api/inspectionManagement/index.js"; |
| | | import ViewFiles from "@/views/inspectionManagement/components/viewFiles.vue"; |
| | | import {delQrCode, qrCodeList, qrCodeScanRecordList} from "@/api/inspectionUpload/index.js"; |
| | | import ViewQrCodeFiles from "@/views/inspectionManagement/components/viewQrCodeFiles.vue"; |
| | | |
| | | const formDia = ref() |
| | | const qrCodeDia = ref() |
| | | const viewFiles = ref() |
| | | const viewQrCodeFiles = ref() |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | supplierName: "", |
| | |
| | | const tabs = reactive([ |
| | | { name: "task", label: "ä»»å¡ä¸å" }, |
| | | { name: "qrCode", label: "äºç»´ç 管ç" }, |
| | | { name: "qrCodeScanRecord", label: "ç°åºå·¡æ£è®°å½" }, |
| | | ]); |
| | | // è¡¨æ ¼ |
| | | const selectedRows = ref([]); |
| | | const tableData = ref([]); |
| | | const operationsArr = ref([]); |
| | | const tableColumns = ref([]); |
| | | const tableLoading = ref(false); |
| | | const total = ref(0); |
| | | const pageNum = ref(1); |
| | |
| | | { prop: "registrant", label: "ç»è®°äºº", minWidth: 100 }, |
| | | { prop: "createTime", label: "ç»è®°æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | const columns1 = ref([ |
| | | { prop: "deviceName", label: "设å¤åç§°", minWidth: 160 }, |
| | | { prop: "location", label: "æå¨ä½ç½®æè¿°", minWidth: 120 }, |
| | | { prop: "createBy", label: "å建è
", minWidth: 100 }, |
| | | { prop: "createTime", label: "å建æ¶é´", minWidth: 100 }, |
| | | ]); |
| | | |
| | | onMounted(() => { |
| | | handleTabClick({ props: { name: "task" } }); |
| | |
| | | const handleTabClick = (tab) => { |
| | | tabName.value = tab.props.name; |
| | | tableData.value = []; |
| | | if (tabName.value === "task") { |
| | | tableColumns.value = columns.value; |
| | | operationsArr.value = ['edit', 'viewFile'] |
| | | } else { |
| | | tableColumns.value = columns1.value; |
| | | operationsArr.value = ['edit'] |
| | | } |
| | | getList(); |
| | | }; |
| | | // ç¹å»æ¥è¯¢ |
| | |
| | | } |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | inspectionTaskList({...queryParams, size: pageSize.value, current: pageNum.value}).then(res => { |
| | | console.log(res) |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | if (tabName.value === "task") { |
| | | inspectionTaskList({...queryParams, size: pageSize.value, current: pageNum.value}).then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | } else if (tabName.value === "qrCode") { |
| | | qrCodeList({...queryParams, size: pageSize.value, current: pageNum.value}).then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | } else { |
| | | qrCodeScanRecordList({size: pageSize.value, current: pageNum.value}).then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | } |
| | | |
| | | }; |
| | | // éç½®æ¥è¯¢ |
| | | const resetQuery = () => { |
| | |
| | | nextTick(() => { |
| | | if (tabName.value === "task") { |
| | | formDia.value?.openDialog(type, row) |
| | | } else { |
| | | } else if (tabName.value === "qrCode") { |
| | | qrCodeDia.value?.openDialog(type, row) |
| | | } else { |
| | | viewQrCodeFiles.value?.openDialog(row) |
| | | } |
| | | }) |
| | | }; |
| | |
| | | } |
| | | const deleteIds = selectedRows.value.map(item => item.id); |
| | | proxy.$modal.confirm('æ¯å¦ç¡®è®¤å 餿鿰æ®é¡¹ï¼').then(function() { |
| | | return delInspectionTask(deleteIds) |
| | | return delQrCode(deleteIds) |
| | | }).then(() => { |
| | | handleQuery() |
| | | proxy.$modal.msgSuccess("å 餿å") |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | title="å·¡æ£" |
| | | v-model="dialogVisitable" |
| | | width="400px" |
| | | @close="cancel" |
| | | > |
| | | <el-form :model="form" :rules="rules" ref="formRef" label-width="120px"> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="设å¤åç§°" prop="deviceName"> |
| | | <el-input v-model="form.deviceName" placeholder="请è¾å
¥è®¾å¤åç§°" maxlength="30" disabled/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="å°ç¹" prop="location"> |
| | | <el-input v-model="form.location" placeholder="请è¾å
¥å°ç¹" maxlength="30" disabled/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="éä»¶" prop="taxTrans"> |
| | | <fileUpload |
| | | :statusType="0" |
| | | ref="beforeProductionRef" |
| | | :fileSize="1024" |
| | | :fileType="['mp3', 'mp4', 'avi', 'mov', 'mkv']" |
| | | :limit="10" |
| | | :drag="false" |
| | | v-model:modelValue="form.storageBlobDTO" |
| | | > |
| | | </fileUpload> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="å·¡æ£äºº" prop="scannerName"> |
| | | <el-input v-model="form.scannerName" disabled placeholder="请è¾å
¥" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="å·¡æ£æ¶é´" prop="scanTime"> |
| | | <el-input v-model="form.scanTime" disabled placeholder="请è¾å
¥" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="cancel">åæ¶</el-button> |
| | | <el-button type="primary" @click="submitForm">ä¿å</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { reactive, ref } from "vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import fileUpload from "@/components/FileUpload/index.vue"; |
| | | import {uploadInspectionTask} from "@/api/inspectionManagement/index.js"; |
| | | import useUserStore from "@/store/modules/user.js"; |
| | | import {addOrEditQrCodeRecord} from "@/api/inspectionUpload/index.js"; |
| | | |
| | | const emit = defineEmits(['closeDia']); |
| | | const dialogVisitable = ref(false); |
| | | const { proxy } = getCurrentInstance() |
| | | const storageBlobDTO = ref([]); |
| | | const beforeProductionRef = ref(null); |
| | | const userStore = useUserStore(); |
| | | const userInfo = ref({}); |
| | | |
| | | function getCurrentDateTime() { |
| | | 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'); |
| | | return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; |
| | | } |
| | | const data = reactive({ |
| | | form: { |
| | | deviceName: '', |
| | | location: '', |
| | | scannerName: '', |
| | | scannerId: '', |
| | | scanTime: '', |
| | | qrCode: { |
| | | id: '' |
| | | } |
| | | }, |
| | | rules: { |
| | | deviceName: [{ required: true, message: '请è¾å
¥è®¾å¤åç§°', trigger: 'blur' }], |
| | | location: [{ required: true, message: '请è¾å
¥å°ç¹', trigger: 'blur' }] |
| | | } |
| | | }) |
| | | const { form, rules } = toRefs(data) |
| | | |
| | | // è°ç¨å½æ° |
| | | const currentDateTime = getCurrentDateTime(); |
| | | |
| | | // è·åç¨æ·ä¿¡æ¯ |
| | | onMounted(async () => { |
| | | let res = await userStore.getInfo(); |
| | | userInfo.value = res.user; |
| | | form.value.scannerName = userInfo.value.nickName |
| | | form.value.scannerId = userInfo.value.userId |
| | | form.value.scanTime = currentDateTime |
| | | }); |
| | | |
| | | // æå¼å¼¹æ¡ |
| | | const openDialog = async (row) => { |
| | | dialogVisitable.value = true; |
| | | form.value.deviceName = row.deviceName |
| | | form.value.location = row.location |
| | | form.value.qrCodeId = row.qrCodeId |
| | | }; |
| | | const submitForm = async () => { |
| | | form.value.qrCode.id = form.value.qrCodeId |
| | | await addOrEditQrCodeRecord({...form.value}); |
| | | cancel() |
| | | ElMessage.success("æäº¤æå"); |
| | | }; |
| | | // å
³éå并表å |
| | | const cancel = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogVisitable.value = false; |
| | | emit("closeDia"); |
| | | }; |
| | | defineExpose({ openDialog }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |
| | | .upload-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | padding: 20px; |
| | | border: 1px solid #dcdfe6; |
| | | box-sizing: border-box; |
| | | .form-container { |
| | | flex: 1; |
| | | width: 100%; |
| | | margin-bottom: 20px; |
| | | } |
| | | } |
| | | .title { |
| | | font-size: 14px; |
| | | color: #165dff; |
| | | line-height: 20px; |
| | | font-weight: 600; |
| | | padding-left: 10px; |
| | | position: relative; |
| | | margin: 6px 0; |
| | | } |
| | | .title::before { |
| | | content: ""; |
| | | position: absolute; |
| | | left: 0; |
| | | top: 3px; /* è°æ´åç´ä½ç½® */ |
| | | width: 4px; /* å°æ°æ¡å®½åº¦ */ |
| | | height: 14px; /* å°æ°æ¡é«åº¦ */ |
| | | background-color: #165dff; /* èè² */ |
| | | } |
| | | </style> |
| | |
| | | /> |
| | | </el-tabs> |
| | | <div> |
| | | <!-- æ«ç 模å --> |
| | | <div v-if="activeTab === 'qrCode'" class="scan-section"> |
| | | <div class="scan-controls"> |
| | | <el-button |
| | | type="primary" |
| | | :loading="scanLoading" |
| | | @click="toggleScan" |
| | | > |
| | | {{ scanButtonText }} |
| | | </el-button> |
| | | </div> |
| | | |
| | | <!-- æ«ç è§é¢å®¹å¨ --> |
| | | <div v-show="isScanning" class="qr-video-container"> |
| | | <video |
| | | ref="qrVideo" |
| | | class="qr-video" |
| | | playsinline |
| | | webkit-playsinline |
| | | ></video> |
| | | <div class="scan-overlay"></div> |
| | | </div> |
| | | |
| | | <!-- ç¶ææç¤º --> |
| | | <div class="status-info"> |
| | | <el-alert |
| | | v-if="cameraError" |
| | | :title="cameraError" |
| | | type="error" |
| | | show-icon |
| | | closable |
| | | /> |
| | | <div v-if="isScanning" class="scanning-text"> |
| | | <el-icon :color="statusColor"><Loading /></el-icon> |
| | | æ£å¨æ«æäºç»´ç ... |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div> |
| | | <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading"> |
| | | <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading" v-if="activeTab !== 'qrCode'"> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column prop="taskName" label="å·¡æ£ä»»å¡åç§°" :show-overflow-tooltip="true"></el-table-column> |
| | | <el-table-column prop="port" label="å°ç¹" :show-overflow-tooltip="true"></el-table-column> |
| | |
| | | <el-table-column fixed="right" label="æä½"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="handleAdd(scope.row)">ä¸ä¼ </el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <el-table ref="table" :data="tableData" height="480" v-loading="tableLoading" v-if="activeTab === 'qrCode'"> |
| | | <el-table-column label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column prop="deviceName" label="设å¤åç§°" :show-overflow-tooltip="true"> |
| | | <template #default="scope"> |
| | | {{scope.row.qrCode.deviceName}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="location" label="æå¨ä½ç½®æè¿°" :show-overflow-tooltip="true"> |
| | | <template #default="scope"> |
| | | {{scope.row.qrCode.location}} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="scanner" label="å·¡æ£äºº"></el-table-column> |
| | | <el-table-column prop="scanTime" label="å·¡æ£æ¶é´"></el-table-column> |
| | | <el-table-column fixed="right" label="æä½"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="viewFile(scope.row)">æ¥çéä»¶</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | </div> |
| | | </el-card> |
| | | <form-dia ref="formDia" @closeDia="handleQuery"></form-dia> |
| | | <qr-code-form-dia ref="qrCodeFormDia" @closeDia="handleQuery"></qr-code-form-dia> |
| | | <view-qr-code-files ref="viewQrCodeFiles"></view-qr-code-files> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import Pagination from "@/components/Pagination/index.vue"; |
| | | import {inspectionTaskList} from "@/api/inspectionManagement/index.js"; |
| | | import {onMounted, ref} from "vue"; |
| | | import FormDia from "@/views/inspectionUpload/components/formDia.vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import QrScanner from 'qr-scanner' |
| | | import QrCodeFormDia from "@/views/inspectionUpload/components/qrCodeFormDia.vue"; |
| | | import {qrCodeList, qrCodeScanRecordList} from "@/api/inspectionUpload/index.js"; |
| | | import {inspectionTaskList} from "@/api/inspectionManagement/index.js"; |
| | | import ViewQrCodeFiles from "@/views/inspectionManagement/components/viewQrCodeFiles.vue"; |
| | | const formDia = ref() |
| | | const qrCodeFormDia = ref() |
| | | const viewQrCodeFiles = ref() |
| | | // å½åæ ç¾ |
| | | const activeTab = ref("task"); |
| | | const tabName = ref("task"); |
| | | // æ ç¾é¡µæ°æ® |
| | | const tabs = reactive([ |
| | | { name: "task", label: "ä»»å¡ä¸å" }, |
| | | { name: "qrCode", label: "äºç»´ç 管ç" }, |
| | | { name: "task", label: "ç产巡æ£" }, |
| | | { name: "qrCode", label: "ç°åºå·¡æ£" }, |
| | | ]); |
| | | // è¡¨æ ¼ |
| | | const tableData = ref([]); |
| | |
| | | const total = ref(0); |
| | | const pageNum = ref(1); |
| | | const pageSize = ref(10); |
| | | // æ«ç ç¸å
³ç¶æ |
| | | const qrVideo = ref(null) |
| | | const isScanning = ref(false) |
| | | const scanLoading = ref(false) |
| | | const cameraError = ref(null) |
| | | const scanner = ref(null) |
| | | const hasInit = ref(false) |
| | | |
| | | onMounted(() => { |
| | | const statusColor = computed(() => { |
| | | return isScanning.value ? '#67C23A' : '#F56C6C' |
| | | }) |
| | | // çå½å¨æç®¡çä¼å |
| | | onMounted(async () => { |
| | | handleTabClick({ props: { name: "task" } }); |
| | | }); |
| | | if (!import.meta.env.SSR && QrScanner) { // [!code focus] |
| | | await initScanner() |
| | | } |
| | | }) |
| | | |
| | | onBeforeUnmount(async () => { |
| | | if (scanner.value) { |
| | | await scanner.value.destroy() |
| | | scanner.value = null |
| | | } |
| | | hasInit.value = false |
| | | }) |
| | | // æ ç¾é¡µç¹å» |
| | | const handleTabClick = (tab) => { |
| | | tabName.value = tab.props.name; |
| | |
| | | } |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | inspectionTaskList({size: pageSize.value, current: pageNum.value}).then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | if (tabName.value === "task") { |
| | | inspectionTaskList({size: pageSize.value, current: pageNum.value}).then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | } else { |
| | | qrCodeScanRecordList({size: pageSize.value, current: pageNum.value}).then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | | }) |
| | | } |
| | | }; |
| | | // ä¸ä¼ |
| | | const handleAdd = (row) => { |
| | |
| | | formDia.value?.openDialog(row) |
| | | }) |
| | | } |
| | | // æ¥çéä»¶ |
| | | const viewFile = (row) => { |
| | | nextTick(() => { |
| | | viewQrCodeFiles.value?.openDialog(row) |
| | | }) |
| | | } |
| | | // æ«ç æé®ææ¬ |
| | | const scanButtonText = computed(() => { |
| | | if (scanLoading.value) return 'æ£å¨åå§å...' |
| | | return isScanning.value ? '忢æ«ç ' : 'å¼å§æ«ç ' |
| | | }) |
| | | |
| | | // å¢å¼ºååå§å |
| | | const initScanner = async () => { |
| | | try { |
| | | await nextTick() // ç¡®ä¿DOMæ´æ° |
| | | // æ°å¢å¤éç©ºå¼æ ¡éª |
| | | if (!qrVideo.value || !QrScanner) { |
| | | throw new Error('ä¾èµæªæ£ç¡®åå§å') |
| | | } |
| | | // å¢å æå头æé颿£æ¥ |
| | | const hasCamera = await QrScanner.hasCamera() |
| | | if (!hasCamera) { |
| | | throw new Error('æªæ£æµå°å¯ç¨æå头') |
| | | } |
| | | // æ¾å¼éæ¯æ§å®ä¾ |
| | | if (scanner.value) { |
| | | await scanner.value.destroy() |
| | | } |
| | | // å建æ°å®ä¾ |
| | | scanner.value = new QrScanner( |
| | | qrVideo.value, |
| | | result => { |
| | | handleScanSuccess(result) |
| | | // stopScan() |
| | | }, |
| | | { |
| | | preferredCamera: 'environment', |
| | | maxScansPerSecond: 5, |
| | | returnDetailedScanResult: true |
| | | } |
| | | ) |
| | | // æ°å¢ç¡¬ä»¶å éæ£æµ |
| | | if (!scanner.value._qrWorker) { |
| | | throw new Error('硬件å éä¸å¯ç¨') |
| | | } |
| | | hasInit.value = true |
| | | } catch (e) { |
| | | // handleInitError(e) |
| | | } |
| | | } |
| | | // æ«ææåå¤ç |
| | | const handleScanSuccess = async (result) => { |
| | | try { |
| | | // æ·»å æ°æ®æ ¡éª |
| | | ElMessage.success('è¯å«æå') |
| | | callBackendAPI(JSON.parse(result.data)) |
| | | await stopScan() |
| | | } catch (error) { |
| | | ElMessage.warning(error.message) |
| | | await startScan() // æ°æ®æ ææ¶ç»§ç»æ«æ |
| | | } |
| | | } |
| | | const callBackendAPI = (result) => { |
| | | nextTick(() => { |
| | | qrCodeFormDia.value?.openDialog(result) |
| | | }) |
| | | } |
| | | // 忢æ«ç ç¶æ |
| | | const toggleScan = async () => { |
| | | if (isScanning.value) { |
| | | await stopScan() |
| | | } else { |
| | | await startScan() |
| | | } |
| | | } |
| | | |
| | | // å¢å¼ºå¯å¨æ¹æ³ |
| | | const startScan = async () => { |
| | | if (!scanner.value || !hasInit.value) { // æ°å¢ç¶ææ£æ¥ |
| | | await initScanner() |
| | | } |
| | | |
| | | try { |
| | | await scanner.value.start() |
| | | isScanning.value = true |
| | | } catch (e) { |
| | | ElMessage.error(`å¯å¨å¤±è´¥: ${e.message}`) |
| | | hasInit.value = false |
| | | } |
| | | } |
| | | |
| | | // 忢æ«ç |
| | | const stopScan = async () => { |
| | | try { |
| | | await scanner.value.stop() |
| | | isScanning.value = false |
| | | } catch (err) { |
| | | console.error('忢æå头失败:', err) |
| | | } |
| | | } |
| | | |
| | | |
| | | // é误å¤çå¢å¼º |
| | | const handleInitError = (error) => { |
| | | console.error('åå§å失败:', error) |
| | | const msg = { |
| | | 'NotAllowedError': '请å
许æå头æé', |
| | | 'NotFoundError': 'æªæ¾å°æå头设å¤', |
| | | 'NotSupportedError': 'æµè§å¨ä¸æ¯ææ«ç åè½' |
| | | }[error.name] || error.message |
| | | |
| | | ElMessage.error(`åå§å失败: ${msg}`) |
| | | } |
| | | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .qr-video-container { |
| | | position: relative; |
| | | width: 100%; |
| | | max-width: 500px; |
| | | margin: 0 auto; |
| | | background: #000; |
| | | border-radius: 8px; |
| | | overflow: hidden; |
| | | } |
| | | |
| | | .qr-video { |
| | | width: 100%; |
| | | height: auto; |
| | | object-fit: cover; |
| | | } |
| | | |
| | | .scan-overlay { |
| | | position: absolute; |
| | | top: 50%; |
| | | left: 50%; |
| | | transform: translate(-50%, -50%); |
| | | width: 70%; |
| | | height: 70%; |
| | | border: 3px solid #409eff; |
| | | border-radius: 8px; |
| | | box-shadow: 0 0 20px rgba(64, 158, 255, 0.3); |
| | | animation: pulse 2s infinite; |
| | | } |
| | | |
| | | @keyframes pulse { |
| | | 0% { opacity: 0.8; } |
| | | 50% { opacity: 0.4; } |
| | | 100% { opacity: 0.8; } |
| | | } |
| | | |
| | | .status-info { |
| | | margin-top: 16px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .scanning-text { |
| | | color: #409eff; |
| | | margin-top: 8px; |
| | | } |
| | | |
| | | .table-section { |
| | | margin-top: 24px; |
| | | } |
| | | |
| | | /* ç§»å¨ç«¯ä¼å */ |
| | | @media (max-width: 768px) { |
| | | .qr-video-container { |
| | | height: 60vh; |
| | | } |
| | | |
| | | .el-table { |
| | | font-size: 12px; |
| | | } |
| | | } |
| | | </style> |
| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | :title="title" |
| | | width="600" |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | v-model="dialogFormVisible" |
| | | :title="title" |
| | | width="600" |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | > |
| | | <el-form |
| | | ref="formRef" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | class="production-form" |
| | | label-position="right" |
| | | style="max-width: 400px; margin: 0 auto" |
| | | ref="formRef" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="auto" |
| | | class="production-form" |
| | | label-position="right" |
| | | style="max-width: 400px; margin: 0 auto" |
| | | > |
| | | <el-form-item label="ä¾åºååç§°" prop="supplierId"> |
| | | <el-select v-model="form.supplierId" placeholder="è¯·éæ©ä¾åºå"> |
| | | <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value" /> |
| | | <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="ç
¤ç§" prop="coalId"> |
| | | <el-select v-model="form.coalId" placeholder="è¯·éæ©ç
¤ç§"> |
| | | <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åä½" prop="unit"> |
| | | <el-select |
| | | v-model="form.unit" |
| | | placeholder="è¯·éæ©åä½" |
| | | clearable |
| | | style="width: 100%" |
| | | > |
| | | <el-option label="å¨" value="å¨" /> |
| | | <el-option label="åå
" value="åå
" /> |
| | | <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="éè´æ°é" prop="purchaseQuantity"> |
| | | <el-input |
| | | v-model.number="form.purchaseQuantity" |
| | | placeholder="请è¾å
¥" |
| | | @blur="handleQuantityBlur" |
| | | v-model.number="form.purchaseQuantity" |
| | | placeholder="请è¾å
¥" |
| | | @blur="handleQuantityBlur" |
| | | > |
| | | <template v-slot:suffix> |
| | | <i style="font-style: normal">{{ form.unit ? form.unit : "" }}</i> |
| | | <i style="font-style: normal">å¨</i> |
| | | </template> |
| | | </el-input> </el-form-item |
| | | ><el-form-item label="ç¨ç" prop="taxRate"> |
| | | </el-input> |
| | | </el-form-item |
| | | > |
| | | <el-form-item label="ç¨ç" prop="taxRate"> |
| | | <el-input |
| | | v-model.number="form.taxRate" |
| | | placeholder="请è¾å
¥ç¨ç" |
| | | @blur="handleTaxRateBlur" |
| | | v-model.number="form.taxRate" |
| | | placeholder="请è¾å
¥ç¨ç" |
| | | @blur="handleTaxRateBlur" |
| | | > |
| | | <template v-slot:suffix> |
| | | <i style="font-style: normal">%</i> |
| | |
| | | </el-form-item> |
| | | <el-form-item label="åä»·(ä¸å«ç¨)" prop="priceExcludingTax"> |
| | | <el-input |
| | | v-model.number="form.priceExcludingTax" |
| | | placeholder="请è¾å
¥" |
| | | @blur="handlePriceBlur" |
| | | v-model.number="form.priceExcludingTax" |
| | | placeholder="请è¾å
¥" |
| | | @blur="handlePriceBlur" |
| | | > |
| | | <template v-slot:suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | </el-form-item> |
| | | <el-form-item label="åä»·(å«ç¨)" prop="priceIncludingTax"> |
| | | <el-input |
| | | v-model.number="form.priceIncludingTax" |
| | | placeholder="èªå¨è®¡ç®" |
| | | v-model.number="form.priceIncludingTax" |
| | | placeholder="èªå¨è®¡ç®" |
| | | > |
| | | <template v-slot:suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | </el-form-item> |
| | | <el-form-item label="æ»ä»·(ä¸å«ç¨)" prop="totalPriceExcludingTax"> |
| | | <el-input |
| | | v-model.number="form.totalPriceExcludingTax" |
| | | placeholder="èªå¨è®¡ç®" |
| | | v-model.number="form.totalPriceExcludingTax" |
| | | placeholder="èªå¨è®¡ç®" |
| | | > |
| | | <template v-slot:suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | </el-form-item> |
| | | <el-form-item label="æ»ä»·(å«ç¨)" prop="totalPriceIncludingTax"> |
| | | <el-input |
| | | v-model.number="form.totalPriceIncludingTax" |
| | | placeholder="èªå¨è®¡ç®" |
| | | v-model.number="form.totalPriceIncludingTax" |
| | | placeholder="èªå¨è®¡ç®" |
| | | > |
| | | <template v-slot:suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | </el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è®°äºº" prop="registrantId"> |
| | | <el-input v-model="form.registrantId" disabled placeholder="请è¾å
¥" /> |
| | | <el-input v-model="form.registrantId" disabled placeholder="请è¾å
¥"/> |
| | | </el-form-item> |
| | | <el-form-item label="ç»è®°æ¥æ" prop="registrationDate"> |
| | | <el-date-picker |
| | | disabled |
| | | v-model="form.registrationDate" |
| | | type="date" |
| | | placeholder="YYYY-MM-DD" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD" |
| | | disabled |
| | | v-model="form.registrationDate" |
| | | type="date" |
| | | placeholder="YYYY-MM-DD" |
| | | style="width: 100%" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | </el-form> |
| | |
| | | <div class="dialog-footer"> |
| | | <!-- éç½®ååæ¶ --> |
| | | <el-button @click="handleClose" v-if="title.includes('æ°å¢')" |
| | | >åæ¶</el-button |
| | | >åæ¶ |
| | | </el-button |
| | | > |
| | | <el-button @click="handleReset" v-if="title.includes('ç¼è¾')" |
| | | >éç½®</el-button |
| | | >éç½® |
| | | </el-button |
| | | > |
| | | <el-button type="primary" @click="handleSubmit">确认</el-button> |
| | | </div> |
| | |
| | | </template> |
| | | |
| | | <script setup name="ProductionDialog"> |
| | | import { ref, defineProps, watch, onMounted, nextTick, computed } from "vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import {ref, defineProps, watch, onMounted, nextTick, computed} from "vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { addOrEditPR,getSupplyList, getCoalInfoList } from "@/api/procureMent"; |
| | | import { getSupply } from "@/api/basicInformation/supplier"; |
| | | import { getCoalInfo } from "@/api/basicInformation/coal"; |
| | | import {addOrEditPR, getSupplyList, getCoalInfoList} from "@/api/procureMent"; |
| | | |
| | | const props = defineProps({ |
| | | title: { |
| | | type: String, |
| | |
| | | getSupplyList(), |
| | | getCoalInfoList(), |
| | | ]); |
| | | console.log(supplyRes, coalRes); |
| | | let supplyData = supplyRes.data; |
| | | let coalData = coalRes.data; |
| | | supplyList.value = supplyData.map((item) => ({ |
| | |
| | | return 0; |
| | | } |
| | | return ( |
| | | Math.floor(parseFloat(num) * Math.pow(10, precision)) / |
| | | Math.pow(10, precision) |
| | | Math.floor(parseFloat(num) * Math.pow(10, precision)) / |
| | | Math.pow(10, precision) |
| | | ); |
| | | }; |
| | | // å«ç¨åä»·è®¡ç® |
| | |
| | | // å¤çç¨çè¾å
¥æ¡å¤±ç¦ï¼ç¡®ä¿ç²¾åº¦ |
| | | const handleTaxRateBlur = () => { |
| | | if ( |
| | | form.value.taxRate !== null && |
| | | form.value.taxRate !== undefined && |
| | | form.value.taxRate !== "" |
| | | form.value.taxRate !== null && |
| | | form.value.taxRate !== undefined && |
| | | form.value.taxRate !== "" |
| | | ) { |
| | | form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2); |
| | | } |
| | |
| | | // å¤çä¸å«ç¨åä»·è¾å
¥æ¡å¤±ç¦ï¼ç¡®ä¿ç²¾åº¦ |
| | | const handlePriceBlur = () => { |
| | | if ( |
| | | form.value.priceExcludingTax !== null && |
| | | form.value.priceExcludingTax !== undefined && |
| | | form.value.priceExcludingTax !== "" |
| | | form.value.priceExcludingTax !== null && |
| | | form.value.priceExcludingTax !== undefined && |
| | | form.value.priceExcludingTax !== "" |
| | | ) { |
| | | form.value.priceExcludingTax = toFixed( |
| | | parseFloat(form.value.priceExcludingTax), |
| | | 2 |
| | | parseFloat(form.value.priceExcludingTax), |
| | | 2 |
| | | ); |
| | | } |
| | | }; |
| | |
| | | // å¤çéè´æ°éè¾å
¥æ¡å¤±ç¦ï¼ç¡®ä¿ç²¾åº¦ |
| | | const handleQuantityBlur = () => { |
| | | if ( |
| | | form.value.purchaseQuantity !== null && |
| | | form.value.purchaseQuantity !== undefined && |
| | | form.value.purchaseQuantity !== "" |
| | | form.value.purchaseQuantity !== null && |
| | | form.value.purchaseQuantity !== undefined && |
| | | form.value.purchaseQuantity !== "" |
| | | ) { |
| | | form.value.purchaseQuantity = toFixed( |
| | | parseFloat(form.value.purchaseQuantity), |
| | | 3 |
| | | parseFloat(form.value.purchaseQuantity), |
| | | 3 |
| | | ); // æ°éä¿ç3ä½å°æ° |
| | | } |
| | | }; |
| | |
| | | }); |
| | | const rules = { |
| | | supplierName: [ |
| | | { required: true, message: "请è¾å
¥ä¾åºååç§°", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥ä¾åºååç§°", trigger: "blur"}, |
| | | ], |
| | | coal: [{ required: true, message: "请è¾å
¥ç
¤ç§", trigger: "blur" }], |
| | | unit: [{ required: true, message: "请è¾å
¥åä½", trigger: "blur" }], |
| | | coal: [{required: true, message: "请è¾å
¥ç
¤ç§", trigger: "blur"}], |
| | | purchaseQuantity: [ |
| | | { required: true, message: "请è¾å
¥éè´æ°é", trigger: "blur" }, |
| | | { type: "number", message: "éè´æ°éå¿
须为æ°å", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥éè´æ°é", trigger: "blur"}, |
| | | {type: "number", message: "éè´æ°éå¿
须为æ°å", trigger: "blur"}, |
| | | ], |
| | | priceExcludingTax: [ |
| | | { required: true, message: "请è¾å
¥åä»·", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥åä»·", trigger: "blur"}, |
| | | ], |
| | | totalPriceExcludingTax: [ |
| | | { required: true, message: "请è¾å
¥æ»ä»·", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥æ»ä»·", trigger: "blur"}, |
| | | ], |
| | | priceIncludingTax: [ |
| | | { required: true, message: "请è¾å
¥å«ç¨åä»·", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥å«ç¨åä»·", trigger: "blur"}, |
| | | ], |
| | | totalPriceIncludingTax: [ |
| | | { required: true, message: "请è¾å
¥å«ç¨æ»ä»·", trigger: "blur" }, |
| | | {required: true, message: "请è¾å
¥å«ç¨æ»ä»·", trigger: "blur"}, |
| | | ], |
| | | taxRate: [{ required: true, message: "请è¾å
¥ç¨ç", trigger: "blur" }], |
| | | registrantId: [{ required: true, message: "请è¾å
¥ç»è®°äºº", trigger: "blur" }], |
| | | taxRate: [{required: true, message: "请è¾å
¥ç¨ç", trigger: "blur"}], |
| | | registrantId: [{required: true, message: "请è¾å
¥ç»è®°äºº", trigger: "blur"}], |
| | | registrationDate: [ |
| | | { required: true, message: "è¯·éæ©ç»è®°æ¥æ", trigger: "change" }, |
| | | {required: true, message: "è¯·éæ©ç»è®°æ¥æ", trigger: "change"}, |
| | | ], |
| | | }; |
| | | // å
³éå¼¹çª |
| | |
| | | <!-- æä½æé®åº --> |
| | | <el-row :gutter="24" class="table-toolbar"> |
| | | <el-button type="primary" :icon="Plus" @click="handleAdd" |
| | | >æ°å»º</el-button |
| | | > |
| | | >æ°å»º |
| | | </el-button> |
| | | <el-button type="danger" :icon="Delete" @click="handleDelete" |
| | | >å é¤</el-button |
| | | > |
| | | <!-- <el-button type="info" :icon="Download" @click="handleExport">导åº</el-button> --> |
| | | >å é¤ |
| | | </el-button> |
| | | </el-row> |
| | | <!-- è¡¨æ ¼ç»ä»¶ --> |
| | | <data-table |
| | |
| | | import DataTable from "@/components/Table/ETable.vue"; |
| | | import Pagination from "@/components/Pagination"; |
| | | import ProductionDialog from "./components/ProductionDialog.vue"; |
| | | import { purchaseRegistration } from "@/api/procureMent"; |
| | | import { |
| | | purchaseRegistration, |
| | | getSupplyList, |
| | | getCoalInfoList, |
| | | } from "@/api/procureMent"; |
| | | |
| | | import useUserStore from "@/store/modules/user"; |
| | | // å¼å
¥åå
¸æ°æ® |
| | | const { proxy } = getCurrentInstance(); |
| | |
| | | |
| | | // supplier ä¾åºåæ°æ® |
| | | const columns = ref([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minWidth: 200 }, |
| | | { prop: "coal", label: "ç
¤ç§ç±»å", minWidth: 120 }, |
| | | { prop: "unit", label: "åä½", minWidth: 150 }, |
| | | { |
| | | prop: "supplierId", |
| | | label: "ä¾åºååç§°", |
| | | minWidth: 200, |
| | | formatter: (row) => { |
| | | return MatchQuery(row.supplierId, "supplyRes") || "æªç¥ä¾åºå"; |
| | | }, |
| | | }, |
| | | { |
| | | prop: "coalId", |
| | | label: "ç
¤ç§ç±»å", |
| | | minWidth: 120, |
| | | formatter: (row) => { |
| | | return MatchQuery(row.coalId, "coalRes") || "æªç¥ç
¤ç§"; |
| | | }, |
| | | }, |
| | | { prop: "purchaseQuantity", label: "éè´æ°é", minWidth: 100 }, |
| | | { prop: "priceIncludingTax", label: "åä»·ï¼å«ç¨ï¼", minWidth: 150 }, |
| | | { prop: "totalPriceIncludingTax", label: "æ»ä»·ï¼å«ç¨ï¼", minWidth: 100 }, |
| | |
| | | { prop: "registrantId", label: "ç»è®°äºº", minWidth: 100 }, |
| | | { prop: "registrationDate", label: "ç»è®°æ¥æ", minWidth: 100 }, |
| | | ]); |
| | | |
| | | // å¹é
æ¥è¯¢å段 |
| | | const MatchQuery = (data, name) => { |
| | | const list = name === "supplyRes" ? supplyRes.value.data : coalRes.value.data; |
| | | const item = list.find((items) => items.id == data); |
| | | return item ? item.coal || item.supplierName : ""; |
| | | }; |
| | | // è·åä¾åºåå表 |
| | | const supplyRes = ref([]); |
| | | const coalRes = ref([]); |
| | | |
| | | // éç½®æ¥è¯¢ |
| | | const resetQuery = () => { |
| | |
| | | form.value = { |
| | | supplierName: "", |
| | | coal: "", |
| | | unit: "", |
| | | unit: "å¨", |
| | | purchaseQuantity: "", |
| | | priceExcludingTax: "", |
| | | totalPriceExcludingTax: "", |
| | |
| | | const handleDeleteSuccess = (row) => { |
| | | ElMessage.success("å 餿åï¼" + row.supplierName); |
| | | }; |
| | | // å¯¼åº |
| | | const handleExport = (row) => { |
| | | proxy.download( |
| | | "system/post/export", |
| | | { |
| | | ...queryParams.value, |
| | | }, |
| | | `post_${new Date().getTime()}.xlsx` |
| | | ); |
| | | ElMessage.success("å¯¼åºæ°æ®ï¼" + row.supplierName); |
| | | }; |
| | | // æå |
| | | const handleSuccess = (val) => { |
| | | tableData.value.push(val); |
| | |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | try { |
| | | [supplyRes.value, coalRes.value] = await Promise.all([ |
| | | getSupplyList(), |
| | | getCoalInfoList(), |
| | | ]); |
| | | // ä¼ éå页忰 |
| | | let res = await purchaseRegistration({ |
| | | current: current.value, |
| | |
| | | .app-container { |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .search-form { |
| | | background-color: #fff; |
| | | padding: 20px 20px 0 20px; |
| | |
| | | border-radius: 4px; |
| | | box-shadow: var(--el-box-shadow-light); |
| | | } |
| | | |
| | | .search-form :deep(.el-form-item) { |
| | | margin-bottom: 16px; |
| | | width: 100%; |
| | |
| | | width: 50%; |
| | | } |
| | | } |
| | | |
| | | @media screen and (min-width: 1200px) { |
| | | .search-form :deep(.el-form-item) { |
| | | width: 18%; |
| | | } |
| | | } |
| | | |
| | | .table-toolbar { |
| | | margin-bottom: 20px; |
| | | display: flex; |
| | |
| | | .table-toolbar { |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .table-toolbar .el-button { |
| | | width: 100%; |
| | | } |
| | | } |
| | | |
| | | /* è¡¨æ ¼å·¥å
·æ */ |
| | | .table-toolbar, |
| | | .table-toolbar > * { |
| | | margin: 0 0 0 0 !important; |
| | | } |
| | | |
| | | .table-toolbar { |
| | | margin-bottom: 20px !important; |
| | | } |
| | |
| | | <template> |
| | | <el-table :data="tableData" :border="border" style="width: 100%"> |
| | | <el-table :data="tableData" :border="border" style="width: 100%"> |
| | | <el-table-column label="ç
¤ç§" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-select |
| | | clearable |
| | | :model-value="getCoalNameById(row.coalId) || row.coalId" |
| | | placeholder="è¯·éæ©ç
¤ç§" |
| | | @change="(value) => handleCoalSelectChange(row, value)" |
| | | filterable |
| | | :key="`coalId-select-${$index}-${weekList.length}`" |
| | | <el-select |
| | | clearable |
| | | :model-value="getCoalNameById(row.coalId) || row.coalId" |
| | | placeholder="è¯·éæ©ç
¤ç§" |
| | | @change="(value) => handleCoalSelectChange(row, value)" |
| | | filterable |
| | | :key="`coalId-select-${$index}-${weekList.length}`" |
| | | > |
| | | <el-option |
| | | v-for="(item, index) of weekList" |
| | | :key="`option-${index}-${item.key}`" |
| | | :label="item.value" |
| | | :value="item.value" |
| | | v-for="(item, index) of weekList" |
| | | :key="`option-${index}-${item.key}`" |
| | | :label="item.value" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | |
| | | <el-table-column label="ç产æ°é" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | v-model="row.productionQuantity" |
| | | placeholder="请è¾å
¥ç产æ°é" |
| | | type="number" |
| | | @input="handleInput('productionQuantity', $index, $event)" |
| | | v-model="row.productionQuantity" |
| | | placeholder="请è¾å
¥ç产æ°é" |
| | | type="number" |
| | | @input="handleInput('productionQuantity', $index, $event)" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="äººå·¥ææ¬" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | v-model="row.laborCost" |
| | | placeholder="请è¾å
¥äººå·¥ææ¬" |
| | | type="number" |
| | | @input="handleInput('laborCost', $index, $event)" |
| | | v-model="row.laborCost" |
| | | placeholder="请è¾å
¥äººå·¥ææ¬" |
| | | type="number" |
| | | @input="handleInput('laborCost', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | <el-table-column label="è½èææ¬" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | v-model="row.energyConsumptionCost" |
| | | placeholder="请è¾å
¥è½èææ¬" |
| | | type="number" |
| | | @input="handleInput('energyConsumptionCost', $index, $event)" |
| | | v-model="row.energyConsumptionCost" |
| | | placeholder="请è¾å
¥è½èææ¬" |
| | | type="number" |
| | | @input="handleInput('energyConsumptionCost', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | <el-table-column label="è®¾å¤ææ§" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | v-model="row.equipmentDepreciation" |
| | | placeholder="请è¾å
¥è®¾å¤ææ§" |
| | | type="number" |
| | | @input="handleInput('equipmentDepreciation', $index, $event)" |
| | | v-model="row.equipmentDepreciation" |
| | | placeholder="请è¾å
¥è®¾å¤ææ§" |
| | | type="number" |
| | | @input="handleInput('equipmentDepreciation', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | <el-table-column label="éè´åä»·" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | v-model="row.purchasePrice" |
| | | placeholder="请è¾å
¥éè´åä»·" |
| | | type="number" |
| | | @input="handleInput('purchasePrice', $index, $event)" |
| | | v-model="row.purchasePrice" |
| | | placeholder="请è¾å
¥éè´åä»·" |
| | | type="number" |
| | | @input="handleInput('purchasePrice', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | <el-table-column label="æ»ææ¬" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | disabled |
| | | v-model="row.totalCost" |
| | | placeholder="æ»ææ¬" |
| | | type="number" |
| | | :readonly="autoCalculate" |
| | | @input="handleInput('totalCost', $index, $event)" |
| | | disabled |
| | | v-model="row.totalCost" |
| | | placeholder="æ»ææ¬" |
| | | type="number" |
| | | :readonly="autoCalculate" |
| | | @input="handleInput('totalCost', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style: normal">å
</i> |
| | |
| | | <el-table-column label="ç产人" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-select |
| | | clearable |
| | | :model-value="getUserNameById(row.producer) || row.producer" |
| | | placeholder="è¯·éæ©ç产人" |
| | | @change="(value) => handleUserSelectChange(row, value)" |
| | | filterable |
| | | :key="`producer-select-${$index}-${userList.length}`" |
| | | clearable |
| | | :model-value="getUserNameById(row.producer) || row.producer" |
| | | placeholder="è¯·éæ©ç产人" |
| | | @change="(value) => handleUserSelectChange(row, value)" |
| | | filterable |
| | | :key="`producer-select-${$index}-${userList.length}`" |
| | | > |
| | | <el-option |
| | | v-for="(item, index) of userList" |
| | | :key="`option-${index}-${item.key}`" |
| | | :label="item.value" |
| | | :value="item.value" |
| | | v-for="(item, index) of userList" |
| | | :key="`option-${index}-${item.key}`" |
| | | :label="item.value" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column |
| | | v-if="showOperations" |
| | | label="æä½" |
| | | width="120" |
| | | fixed="right" |
| | | v-if="showOperations" |
| | | label="æä½" |
| | | width="120" |
| | | fixed="right" |
| | | > |
| | | <template #default="{ $index }"> |
| | | <el-button |
| | | type="danger" |
| | | size="small" |
| | | @click="handleDelete($index)" |
| | | :icon="Delete" |
| | | type="danger" |
| | | size="small" |
| | | @click="handleDelete($index)" |
| | | :icon="Delete" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | |
| | | </template> |
| | | |
| | | <script setup name="ProductionDetailsTable"> |
| | | import { ref, computed, watch, onMounted, nextTick } from "vue"; |
| | | import { Delete } from "@element-plus/icons-vue"; |
| | | import { getCoalFieldList } from "@/api/basicInformation/coalQualityMaintenance"; |
| | | import { getCoalInfoList } from "@/api/production"; |
| | | import { userListAll } from "@/api/publicApi"; |
| | | import {ref, computed, watch, onMounted, nextTick} from "vue"; |
| | | import {Delete} from "@element-plus/icons-vue"; |
| | | import {getCoalFieldList} from "@/api/basicInformation/coalQualityMaintenance"; |
| | | import {getCoalInfoList} from "@/api/production"; |
| | | import {userListAll} from "@/api/publicApi"; |
| | | |
| | | const props = defineProps({ |
| | | modelValue: { |
| | | type: Array, |
| | |
| | | |
| | | // 妿å¼å¯èªå¨è®¡ç®æ»ææ¬ |
| | | if ( |
| | | props.autoCalculate && |
| | | [ |
| | | "laborCost", |
| | | "energyCost", |
| | | "equipmentDepreciation", |
| | | "purchasePrice", |
| | | ].includes(field) |
| | | props.autoCalculate && |
| | | [ |
| | | "laborCost", |
| | | "energyCost", |
| | | "equipmentDepreciation", |
| | | "purchasePrice", |
| | | ].includes(field) |
| | | ) { |
| | | calculateTotalCost(newData[index]); |
| | | } |
| | | |
| | | tableData.value = newData; |
| | | emit("input-change", { field, index, value, row: newData[index] }); |
| | | emit("input-change", {field, index, value, row: newData[index]}); |
| | | }; |
| | | |
| | | // è®¡ç®æ»ææ¬ |
| | |
| | | const purchasePrice = parseFloat(row.purchasePrice) || 0; |
| | | |
| | | row.totalCost = ( |
| | | laborCost + |
| | | energyCost + |
| | | equipmentDepreciation + |
| | | purchasePrice |
| | | laborCost + |
| | | energyCost + |
| | | equipmentDepreciation + |
| | | purchasePrice |
| | | ).toFixed(2); |
| | | }; |
| | | |
| | |
| | | if (newValue && weekList.value.length > 0) { |
| | | // 彿°æ®å è½½å®æä¸weekListå·²è·åæ¶ï¼ç¡®ä¿æ¾ç¤ºæ£ç¡® |
| | | } |
| | | }, { deep: true }); |
| | | }, {deep: true}); |
| | | |
| | | // çå¬weekListååï¼å½ä¸ææ°æ®å è½½å®æåå¤çæ¾ç¤º |
| | | watch(weekList, (newList) => { |
| | |
| | | tableData.value = tempData; |
| | | }); |
| | | } |
| | | }, { deep: true }); |
| | | }, {deep: true}); |
| | | |
| | | onMounted(async()=>{ |
| | | onMounted(async () => { |
| | | let res = await getCoalInfoList() |
| | | console.log(res); |
| | | res.data.forEach(item => { |
| | | let obj = {}; |
| | | obj.value = item.coal; |
| | | obj.key = item.id; |
| | | weekList.value.push(obj); |
| | | weekList.value.push(obj); |
| | | }); |
| | | let ress = await userListAll(); |
| | | ress.data.forEach(item => { |
| | | let obj = {}; |
| | | obj.value = item.nickName; |
| | | obj.key = item.userId; |
| | | userList.value.push(obj); |
| | | userList.value.push(obj); |
| | | }); |
| | | // éç¥ç¶ç»ä»¶weekListå·²å è½½å®æ |
| | | nextTick(() => { |
| | |
| | | } |
| | | }; |
| | | const userList = ref([]); |
| | | const getUserList = (async()=>{ |
| | | const getUserList = (async () => { |
| | | let res = await userListAll(); |
| | | if (res.code === 200) { |
| | | userList.value = res.data.map((item) => ({ |
| | |
| | | if (newValue && userList.value.length > 0) { |
| | | // 彿°æ®å è½½å®æä¸weekListå·²è·åæ¶ï¼ç¡®ä¿æ¾ç¤ºæ£ç¡® |
| | | } |
| | | }, { deep: true }); |
| | | }, {deep: true}); |
| | | |
| | | // çå¬userListååï¼å½ä¸ææ°æ®å è½½å®æåå¤çæ¾ç¤º |
| | | watch(userList, (newList) => { |
| | |
| | | tableData.value = tempData; |
| | | }); |
| | | } |
| | | }, { deep: true }); |
| | | }, {deep: true}); |
| | | |
| | | const getUserNameById = (id) => { |
| | | const producer = userList.value.find(item => item.key == id); |
| | |
| | | <template> |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="dialogType === 'add' ? 'æ°å¢ç产å å·¥' : 'ç¼è¾ç产å å·¥'" |
| | | width="1200px" |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | v-model="dialogVisible" |
| | | :title="dialogType === 'add' ? 'æ°å¢ç产å å·¥' : 'ç¼è¾ç产å å·¥'" |
| | | width="1200px" |
| | | :close-on-click-modal="false" |
| | | @close="handleClose" |
| | | > |
| | | <el-row :gutter="10" style="margin-bottom: 10px"> |
| | | <el-col :span="3"> |
| | | <el-button type="primary" @click="handlData" |
| | | ><el-icon> <Plus /> </el-icon>éæ©æ°æ®</el-button |
| | | > |
| | | <el-icon> |
| | | <Plus/> |
| | | </el-icon> |
| | | éæ©æ°æ® |
| | | </el-button |
| | | > |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <el-button |
| | | type="danger" |
| | | @click="removeSelectedData" |
| | | :disabled="tableData.length === 0" |
| | | type="danger" |
| | | @click="removeSelectedData" |
| | | :disabled="tableData.length === 0" |
| | | > |
| | | <el-icon> |
| | | <Delete /> |
| | | <Delete/> |
| | | </el-icon> |
| | | æ¸
空已é |
| | | </el-button> |
| | |
| | | </el-col> |
| | | </el-row> |
| | | <ETableModify |
| | | :columns="columns" |
| | | :showOperations="false" |
| | | height="200" |
| | | @cell-edit="handleCellEdit" |
| | | :tableData="tableData" |
| | | :showOverflowTooltip="false" |
| | | @row-click="handleRowClick" |
| | | :editableColumns="['usedQuantity']" |
| | | @delete="handleRemoveItem" |
| | | :columns="columns" |
| | | :showOperations="false" |
| | | height="200" |
| | | @cell-edit="handleCellEdit" |
| | | :tableData="tableData" |
| | | :showOverflowTooltip="false" |
| | | @row-click="handleRowClick" |
| | | :editableColumns="['usedQuantity']" |
| | | @delete="handleRemoveItem" |
| | | /> |
| | | <div class="empty-table"> |
| | | <h1>ç产æç»</h1> |
| | |
| | | <el-col :span="2"> |
| | | <el-button type="primary" @click="addNewRow"> |
| | | <el-icon> |
| | | <Plus /> |
| | | <Plus/> |
| | | </el-icon> |
| | | æ°å¢ |
| | | </el-button> |
| | |
| | | </el-col> --> |
| | | </el-row> |
| | | <ProductionDetailsTable |
| | | v-model="detailsTableData" |
| | | :border="false" |
| | | :show-operations="true" |
| | | :auto-calculate="true" |
| | | @input-change="handleDetailsChange" |
| | | @delete-row="handleDeleteRow" |
| | | v-model="detailsTableData" |
| | | :border="false" |
| | | :show-operations="true" |
| | | :auto-calculate="true" |
| | | @input-change="handleDetailsChange" |
| | | @delete-row="handleDeleteRow" |
| | | /> |
| | | </div> |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button |
| | | @click="handleClose" |
| | | v-if="dialogType === 'add' || dialogType === 'edit'" |
| | | >å æ¶</el-button |
| | | @click="handleClose" |
| | | v-if="dialogType === 'add' || dialogType === 'edit'" |
| | | >å æ¶ |
| | | </el-button |
| | | > |
| | | <!-- <el-button @click="handleReset" v-if="dialogType === 'edit'" |
| | | >é ç½®</el-button |
| | | > --> |
| | | <el-button type="primary" :loading="loading" @click="handleSubmit" |
| | | >ç¡® å®</el-button |
| | | >ç¡® å® |
| | | </el-button |
| | | > |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <el-dialog |
| | | v-model="innerVisible" |
| | | width="1000" |
| | | title="éæ©é
ç½®æ°æ®" |
| | | center |
| | | append-to-body |
| | | v-model="innerVisible" |
| | | width="1000" |
| | | title="éæ©é
ç½®æ°æ®" |
| | | center |
| | | append-to-body |
| | | > |
| | | <div style="margin-bottom: 10px"> |
| | | <el-alert |
| | | v-if="tableData.length > 0" |
| | | :title="`å½å已鿩 ${tableData.length} æ¡æ°æ®`" |
| | | type="info" |
| | | :closable="false" |
| | | show-icon |
| | | v-if="tableData.length > 0" |
| | | :title="`å½å已鿩 ${tableData.length} æ¡æ°æ®`" |
| | | type="info" |
| | | :closable="false" |
| | | show-icon |
| | | /> |
| | | </div> |
| | | <ETable |
| | | :showIndex="false" |
| | | :showOverflowTooltip="false" |
| | | @selection-change="handleSelectionChange" |
| | | :showOperations="false" |
| | | ref="etableRef" |
| | | :columns="formalDatabaseColumns" |
| | | :tableData="formalDatabaseData" |
| | | :defaultSelectedIds="selectedIds" |
| | | :rowKey="'id'" |
| | | height="400" |
| | | @cell-edit="handleCellEdit" |
| | | :show-selection="true" |
| | | :showIndex="false" |
| | | :showOverflowTooltip="false" |
| | | @selection-change="handleSelectionChange" |
| | | :showOperations="false" |
| | | ref="etableRef" |
| | | :columns="formalDatabaseColumns" |
| | | :tableData="formalDatabaseData" |
| | | :defaultSelectedIds="selectedIds" |
| | | :rowKey="'id'" |
| | | height="400" |
| | | @cell-edit="handleCellEdit" |
| | | :show-selection="true" |
| | | /> |
| | | <el-row :gutter="24" style="margin-top: 15px"> |
| | | <el-col :span="12"> |
| | |
| | | <el-col :span="12" style="text-align: right"> |
| | | <el-button @click="innerVisible = false">åæ¶</el-button> |
| | | <el-button |
| | | type="primary" |
| | | @click="handleSelectData" |
| | | :disabled="formalDatabaseSelectedData.length === 0" |
| | | type="primary" |
| | | @click="handleSelectData" |
| | | :disabled="formalDatabaseSelectedData.length === 0" |
| | | > |
| | | ç¡®å®æ·»å |
| | | </el-button> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, watch, onMounted, nextTick, computed } from "vue"; |
| | | import {ref, reactive, watch, onMounted, nextTick, computed} from "vue"; |
| | | import ETable from "@/components/Table/ETable.vue"; |
| | | import ETableModify from "@/components/Table/EtableModify.vue"; |
| | | import ProductionDetailsTable from "./ProductionDetailsTable.vue"; |
| | | import { ElMessage, ElMessageBox, ElAlert, ElText } from "element-plus"; |
| | | import { Delete, Warning, Plus } from "@element-plus/icons-vue"; |
| | | import {ElMessage, ElMessageBox, ElAlert, ElText} from "element-plus"; |
| | | import {Delete, Warning, Plus} from "@element-plus/icons-vue"; |
| | | import { |
| | | getOfficialAll, |
| | | addOrEditPM, |
| | | getCoalInfoList, |
| | | deleteProductionInventory, |
| | | } from "@/api/production/index.js"; |
| | | import { validateFormData, validateNumber, deepClone, createDefaultProductionRow } from "@/utils/production"; |
| | | import { useCoalData } from "./useCoalData"; |
| | | import {validateFormData, validateNumber, deepClone, createDefaultProductionRow} from "@/utils/production"; |
| | | import {useCoalData} from "./useCoalData"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | |
| | | // Props å Emits |
| | | const props = defineProps({ |
| | | visible: { type: Boolean, default: false }, |
| | | type: { type: String, default: "add" }, |
| | | rowData: { type: Object, default: () => ({}) }, |
| | | visible: {type: Boolean, default: false}, |
| | | type: {type: String, default: "add"}, |
| | | rowData: {type: Object, default: () => ({})}, |
| | | }); |
| | | |
| | | const dialogVisible = defineModel("visible", { type: Boolean, default: false }); |
| | | const dialogVisible = defineModel("visible", {type: Boolean, default: false}); |
| | | const emit = defineEmits(["update:visible", "success", "update:productionAndProcessing"]); |
| | | |
| | | // ç¨æ·ä¿¡æ¯åç
¤ç§æ°æ® |
| | | const userStore = useUserStore(); |
| | | const { getCoalNameById } = useCoalData(); |
| | | const {getCoalNameById} = useCoalData(); |
| | | let userInfo; |
| | | |
| | | // å¯¹è¯æ¡ç¶æ |
| | |
| | | const selectedIds = ref([]); |
| | | const currentRow = ref(null); |
| | | const copyForm = ref(null); |
| | | const coalList = ref([]) |
| | | const supplierList = ref({}); |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | { label: "ç
¤ç§", prop: "coal", minwidth: 120 }, |
| | | { label: "åºåæ°é", prop: "inventoryQuantity", minwidth: 100 }, |
| | | {prop: "coalId", label: "ç
¤ç§", minwidth: 60,slot:false, |
| | | formatter: (row) => { |
| | | return coalList.value.find(coal => coal.id === row.coalId)?.coal || "--"; |
| | | } |
| | | }, |
| | | {label: "åºåæ°é", prop: "inventoryQuantity", minwidth: 100}, |
| | | { |
| | | label: "ä½¿ç¨æ°é", |
| | | prop: "usedQuantity", |
| | |
| | | ]; |
| | | |
| | | const formalDatabaseColumns = ref([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minwidth: 150 }, |
| | | { prop: "coal", label: "ç
¤ç§ç±»å", minwidth: 60 }, |
| | | { prop: "inventoryQuantity", label: "åºåæ°é", minwidth: 80 }, |
| | | { prop: "unit", label: "åä½", minwidth: 20 }, |
| | | { prop: "priceExcludingTax", label: "åä»·ï¼ä¸å«ç¨ï¼", minwidth: 80 }, |
| | | { prop: "createTime", label: "ç»è®°æ¥æ", width: 200 }, |
| | | {prop: "supplierName", label: "ä¾åºååç§°", minwidth: 150 |
| | | // ,formatter: (row) => { |
| | | // console.log(row); |
| | | // return supplierList.value[row.supplierId] || "--"; |
| | | // } |
| | | }, |
| | | {prop: "coalId", label: "ç
¤ç§", minwidth: 60, |
| | | formatter: (row) => { |
| | | // return coalList.value[row.coalId].coal || "--"; |
| | | return coalList.value.find(coal => coal.id === row.coalId)?.coal || "--"; |
| | | } |
| | | }, |
| | | {prop: "inventoryQuantity", label: "åºåæ°é", minwidth: 80}, |
| | | {prop: "unit", label: "åä½", minwidth: 20}, |
| | | {prop: "priceExcludingTax", label: "åä»·ï¼ä¸å«ç¨ï¼", minwidth: 80}, |
| | | {prop: "createTime", label: "ç»è®°æ¥æ", width: 200}, |
| | | ]); |
| | | // å·¥å
·å½æ° |
| | | const debugIdMatching = () => { |
| | | if (formalDatabaseData.value.length > 0 && selectedIds.value.length > 0) { |
| | | const matchedRows = formalDatabaseData.value.filter((row) => |
| | | selectedIds.value.includes(row.id) |
| | | selectedIds.value.includes(row.id) |
| | | ); |
| | | } |
| | | }; |
| | |
| | | // è·åé
ç½®æ°æ® |
| | | const handlData = async () => { |
| | | innerVisible.value = true; |
| | | let res = await getOfficialAll(); |
| | | if (res.code === 200) { |
| | | formalDatabaseData.value = res.data; |
| | | let getSupplier = await getOfficialAll(); |
| | | let getCoalName = await getCoalInfoList(); |
| | | coalList.value = getCoalName.data || []; |
| | | supplierList.value = getSupplier.data || []; |
| | | if (getSupplier.code === 200) { |
| | | formalDatabaseData.value = getSupplier.data; |
| | | const existingOfficialIds = tableData.value |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | selectedIds.value = existingOfficialIds; |
| | | debugIdMatching(); |
| | | nextTick(() => { |
| | |
| | | try { |
| | | etableRef.value.clearSelection(); |
| | | const rowsToSelect = formalDatabaseData.value.filter((row) => |
| | | ids.includes(row.id) |
| | | ids.includes(row.id) |
| | | ); |
| | | if (rowsToSelect.length > 0) { |
| | | etableRef.value.setRowsSelection(rowsToSelect, true); |
| | |
| | | detailsTableData.value = data.productionList || []; |
| | | dialogType.value = "edit"; |
| | | const existingOfficialIds = tableData.value |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | selectedIds.value = existingOfficialIds; |
| | | }; |
| | | // çå¬å¯¹è¯æ¡ç¶æï¼å¨æå¼æ¶è®¾ç½®éä¸ç¶æ |
| | |
| | | |
| | | // æ´æ°selectedIdsï¼ç¡®ä¿å
嫿æå½åtableDataä¸çofficialId |
| | | const allOfficialIds = tableData.value |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | selectedIds.value = allOfficialIds; |
| | | |
| | | // å
³ééæ©å¯¹è¯æ¡ |
| | |
| | | // éªè¯ç产æç»æ°æ® |
| | | const detailsValidation = validateFormData(detailsTableData.value, [ |
| | | "coalId", |
| | | "productionQuantity", |
| | | "productionQuantity", |
| | | "laborCost", |
| | | "energyConsumptionCost", |
| | | "equipmentDepreciation", |
| | | "purchasePrice" |
| | | ]); |
| | | |
| | | |
| | | if (!detailsValidation.isValid) { |
| | | ElMessage.warning(detailsValidation.message); |
| | | return; |
| | |
| | | const handleCellEdit = (row, prop, value) => { |
| | | if (prop === "usedQuantity") { |
| | | const validation = validateNumber(value, 0, Number(row.inventoryQuantity)); |
| | | |
| | | |
| | | if (!validation.isValid) { |
| | | ElMessage.warning(validation.message); |
| | | row.usedQuantity = validation.value; |
| | | return; |
| | | } |
| | | |
| | | |
| | | row.usedQuantity = validation.value; |
| | | } |
| | | }; |
| | |
| | | // å é¤åä¸ªå·²éæ°æ®é¡¹ |
| | | const handleRemoveItem = (row) => { |
| | | const index = tableData.value.findIndex( |
| | | (item) => item.officialId === row.officialId |
| | | (item) => item.officialId === row.officialId |
| | | ); |
| | | if (index > -1) { |
| | | tableData.value.splice(index, 1); |
| | | |
| | | // æ´æ°selectedIds |
| | | const updatedOfficialIds = tableData.value |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | selectedIds.value = updatedOfficialIds; |
| | | ElMessage.success("å·²å é¤éä¸é¡¹"); |
| | | } |
| | |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(async () => { |
| | | if (dialogType.value === "edit") { |
| | | let res = await deleteProductionInventory({ |
| | | productionInventoryList: tableData.value, |
| | | }); |
| | | emit("update:productionAndProcessing", tableData.value, copyForm.value); |
| | | } |
| | | // [Vue warn]: Component emitted event "update:productionAndProcessing" but it is neither declared in the emits option nor as an "onUpdate:productionAndProcessing" prop. |
| | | .then(async () => { |
| | | if (dialogType.value === "edit") { |
| | | let res = await deleteProductionInventory({ |
| | | productionInventoryList: tableData.value, |
| | | }); |
| | | emit("update:productionAndProcessing", tableData.value, copyForm.value); |
| | | } |
| | | // [Vue warn]: Component emitted event "update:productionAndProcessing" but it is neither declared in the emits option nor as an "onUpdate:productionAndProcessing" prop. |
| | | |
| | | formalDatabaseSelectedData.value = []; |
| | | tableData.value = []; |
| | | selectedIds.value = []; |
| | | ElMessage.success("å·²æ¸
ç©ºæææ°æ®"); |
| | | }) |
| | | .catch(() => {}); |
| | | formalDatabaseSelectedData.value = []; |
| | | tableData.value = []; |
| | | selectedIds.value = []; |
| | | ElMessage.success("å·²æ¸
ç©ºæææ°æ®"); |
| | | }) |
| | | .catch(() => { |
| | | }); |
| | | }; |
| | | |
| | | // è®¡ç®æ»ä½¿ç¨é |
| | |
| | | .el-row > .el-col > h1 { |
| | | font-weight: bolder; |
| | | } |
| | | |
| | | .empty-table > .el-row { |
| | | margin-bottom: 12px; |
| | | } |
| | |
| | | * ç
¤ç§æ°æ®ç®¡çç»åå¼å½æ° |
| | | * æä¾ç
¤ç§æ°æ®çè·åãç¼åã转æ¢çåè½ |
| | | */ |
| | | import { ref, computed, watch } from 'vue'; |
| | | import { getCoalInfoList } from "@/api/production"; |
| | | import { ElMessage } from 'element-plus'; |
| | | import {ref, computed, watch} from 'vue'; |
| | | import {getCoalInfoList} from "@/api/production"; |
| | | import {ElMessage} from 'element-plus'; |
| | | |
| | | // å
¨å±ç
¤ç§æ°æ®ç¼å |
| | | const coalData = ref([]); |
| | |
| | | const isLoaded = ref(false); |
| | | |
| | | export function useCoalData() { |
| | | |
| | | // è·åç
¤ç§æ°æ® |
| | | const getCoalData = async (forceRefresh = false) => { |
| | | if (isLoaded.value && !forceRefresh) { |
| | | return coalData.value; |
| | | } |
| | | |
| | | if (isLoading.value) { |
| | | // 妿æ£å¨å è½½ï¼çå¾
å è½½å®æ |
| | | return new Promise((resolve) => { |
| | | const unwatch = watch(isLoading, (loading) => { |
| | | if (!loading) { |
| | | unwatch(); |
| | | resolve(coalData.value); |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | // è·åç
¤ç§æ°æ® |
| | | const getCoalData = async (forceRefresh = false) => { |
| | | if (isLoaded.value && !forceRefresh) { |
| | | return coalData.value; |
| | | } |
| | | |
| | | isLoading.value = true; |
| | | try { |
| | | const res = await getCoalInfoList(); |
| | | if (res.code === 200) { |
| | | coalData.value = res.data; |
| | | isLoaded.value = true; |
| | | return coalData.value; |
| | | } else { |
| | | ElMessage.error('è·åç
¤ç§æ°æ®å¤±è´¥'); |
| | | return []; |
| | | } |
| | | } catch (error) { |
| | | ElMessage.error('è·åç
¤ç§æ°æ®å¤±è´¥'); |
| | | console.error('ç
¤ç§æ°æ®è·åé误:', error); |
| | | return []; |
| | | } finally { |
| | | isLoading.value = false; |
| | | } |
| | | }; |
| | | if (isLoading.value) { |
| | | // 妿æ£å¨å è½½ï¼çå¾
å è½½å®æ |
| | | return new Promise((resolve) => { |
| | | const unwatch = watch(isLoading, (loading) => { |
| | | if (!loading) { |
| | | unwatch(); |
| | | resolve(coalData.value); |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | // æ ¹æ®IDè·åç
¤ç§åç§° |
| | | const getCoalNameById = (id) => { |
| | | if (!id || coalData.value.length === 0) return id; |
| | | const coal = coalData.value.find(item => item.id == id); |
| | | return coal ? coal.coal : id; |
| | | }; |
| | | isLoading.value = true; |
| | | try { |
| | | const res = await getCoalInfoList(); |
| | | if (res.code === 200) { |
| | | coalData.value = res.data; |
| | | isLoaded.value = true; |
| | | return coalData.value; |
| | | } else { |
| | | ElMessage.error('è·åç
¤ç§æ°æ®å¤±è´¥'); |
| | | return []; |
| | | } |
| | | } catch (error) { |
| | | ElMessage.error('è·åç
¤ç§æ°æ®å¤±è´¥'); |
| | | console.error('ç
¤ç§æ°æ®è·åé误:', error); |
| | | return []; |
| | | } finally { |
| | | isLoading.value = false; |
| | | } |
| | | }; |
| | | |
| | | // æ ¹æ®åç§°è·åç
¤ç§ID |
| | | const getCoalIdByName = (name) => { |
| | | if (!name || coalData.value.length === 0) return ''; |
| | | const coal = coalData.value.find(item => item.coal === name); |
| | | return coal ? coal.id : ''; |
| | | }; |
| | | // æ ¹æ®IDè·åç
¤ç§åç§° |
| | | const getCoalNameById = (id) => { |
| | | if (!id || coalData.value.length === 0) return id; |
| | | const coal = coalData.value.find(item => item.id == id); |
| | | return coal ? coal.coal : id; |
| | | }; |
| | | |
| | | // çæä¸æé项 |
| | | const coalOptions = computed(() => { |
| | | return coalData.value.map(item => ({ |
| | | label: item.coal, |
| | | value: item.coal, |
| | | key: item.id |
| | | })); |
| | | }); |
| | | // æ ¹æ®åç§°è·åç
¤ç§ID |
| | | const getCoalIdByName = (name) => { |
| | | if (!name || coalData.value.length === 0) return ''; |
| | | const coal = coalData.value.find(item => item.coal === name); |
| | | return coal ? coal.id : ''; |
| | | }; |
| | | |
| | | // çækey-valueæ å° |
| | | const coalMap = computed(() => { |
| | | const map = {}; |
| | | coalData.value.forEach(item => { |
| | | map[item.id] = item.coal; |
| | | // çæä¸æé项 |
| | | const coalOptions = computed(() => { |
| | | return coalData.value.map(item => ({ |
| | | label: item.coal, |
| | | value: item.coal, |
| | | key: item.id |
| | | })); |
| | | }); |
| | | return map; |
| | | }); |
| | | |
| | | return { |
| | | coalData: computed(() => coalData.value), |
| | | coalOptions, |
| | | coalMap, |
| | | isLoading: computed(() => isLoading.value), |
| | | isLoaded: computed(() => isLoaded.value), |
| | | getCoalData, |
| | | getCoalNameById, |
| | | getCoalIdByName |
| | | }; |
| | | // çækey-valueæ å° |
| | | const coalMap = computed(() => { |
| | | const map = {}; |
| | | coalData.value.forEach(item => { |
| | | map[item.id] = item.coal; |
| | | }); |
| | | return map; |
| | | }); |
| | | |
| | | return { |
| | | coalData: computed(() => coalData.value), |
| | | coalOptions, |
| | | coalMap, |
| | | isLoading: computed(() => isLoading.value), |
| | | isLoaded: computed(() => isLoaded.value), |
| | | getCoalData, |
| | | getCoalNameById, |
| | | getCoalIdByName |
| | | }; |
| | | } |
| | |
| | | * å¯¹è¯æ¡ç®¡çç»åå¼å½æ° |
| | | * æä¾å¯¹è¯æ¡çæå¼ãå
³éãæ°æ®å¤ççåè½ |
| | | */ |
| | | import { ref } from 'vue'; |
| | | import {ref} from 'vue'; |
| | | |
| | | export function useDialog() { |
| | | const dialogVisible = ref(false); |
| | | const dialogType = ref('add'); |
| | | const dialogRef = ref(null); |
| | | const currentRowData = ref(null); |
| | | const dialogVisible = ref(false); |
| | | const dialogType = ref('add'); |
| | | const dialogRef = ref(null); |
| | | const currentRowData = ref(null); |
| | | |
| | | // æå¼å¯¹è¯æ¡ |
| | | const openDialog = (type = 'add', rowData = null) => { |
| | | dialogType.value = type; |
| | | currentRowData.value = rowData; |
| | | dialogVisible.value = true; |
| | | |
| | | // è°ç¨å¯¹è¯æ¡ç»ä»¶çåå§åæ¹æ³ |
| | | if (dialogRef.value) { |
| | | if (type === 'add') { |
| | | dialogRef.value.Initialization?.(); |
| | | } else if (type === 'edit' && rowData) { |
| | | dialogRef.value.editInitialization?.(rowData); |
| | | } |
| | | } |
| | | }; |
| | | // æå¼å¯¹è¯æ¡ |
| | | const openDialog = (type = 'add', rowData = null) => { |
| | | dialogType.value = type; |
| | | currentRowData.value = rowData; |
| | | dialogVisible.value = true; |
| | | |
| | | // å
³éå¯¹è¯æ¡ |
| | | const closeDialog = () => { |
| | | dialogVisible.value = false; |
| | | dialogType.value = 'add'; |
| | | currentRowData.value = null; |
| | | }; |
| | | // è°ç¨å¯¹è¯æ¡ç»ä»¶çåå§åæ¹æ³ |
| | | if (dialogRef.value) { |
| | | if (type === 'add') { |
| | | dialogRef.value.Initialization?.(); |
| | | } else if (type === 'edit' && rowData) { |
| | | dialogRef.value.editInitialization?.(rowData); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // å¯¹è¯æ¡æååè° |
| | | const handleDialogSuccess = (callback) => { |
| | | closeDialog(); |
| | | if (typeof callback === 'function') { |
| | | callback(); |
| | | } |
| | | }; |
| | | // å
³éå¯¹è¯æ¡ |
| | | const closeDialog = () => { |
| | | dialogVisible.value = false; |
| | | dialogType.value = 'add'; |
| | | currentRowData.value = null; |
| | | }; |
| | | |
| | | return { |
| | | // ç¶æ |
| | | dialogVisible, |
| | | dialogType, |
| | | dialogRef, |
| | | currentRowData, |
| | | |
| | | // æ¹æ³ |
| | | openDialog, |
| | | closeDialog, |
| | | handleDialogSuccess |
| | | }; |
| | | // å¯¹è¯æ¡æååè° |
| | | const handleDialogSuccess = (callback) => { |
| | | closeDialog(); |
| | | if (typeof callback === 'function') { |
| | | callback(); |
| | | } |
| | | }; |
| | | |
| | | return { |
| | | // ç¶æ |
| | | dialogVisible, |
| | | dialogType, |
| | | dialogRef, |
| | | currentRowData, |
| | | |
| | | // æ¹æ³ |
| | | openDialog, |
| | | closeDialog, |
| | | handleDialogSuccess |
| | | }; |
| | | } |
| | |
| | | * è¡¨æ ¼æ°æ®ç®¡çç»åå¼å½æ° |
| | | * æä¾å页ãæç´¢ãéæ©çéç¨åè½ |
| | | */ |
| | | import { ref, reactive } from 'vue'; |
| | | import { ElMessage, ElMessageBox } from 'element-plus'; |
| | | import {ref, reactive} from 'vue'; |
| | | import {ElMessage, ElMessageBox} from 'element-plus'; |
| | | |
| | | export function useTableData(apiFunction, options = {}) { |
| | | const { |
| | | pageSize = 10, |
| | | searchField = 'searchAll' |
| | | } = options; |
| | | const { |
| | | pageSize = 10, |
| | | searchField = 'searchAll' |
| | | } = options; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const tableData = ref([]); |
| | | const loading = ref(false); |
| | | const total = ref(0); |
| | | const selectedRows = ref([]); |
| | | // ååºå¼æ°æ® |
| | | const tableData = ref([]); |
| | | const loading = ref(false); |
| | | const total = ref(0); |
| | | const selectedRows = ref([]); |
| | | |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | [searchField]: '', |
| | | current: 1, |
| | | size: pageSize, |
| | | }); |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | [searchField]: '', |
| | | current: 1, |
| | | size: pageSize, |
| | | }); |
| | | |
| | | // è·ååè¡¨æ°æ® |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | try { |
| | | const params = { |
| | | [searchField]: queryParams[searchField], |
| | | current: queryParams.current, |
| | | size: queryParams.size, |
| | | }; |
| | | console.log('æ¥è¯¢åæ°:', params); |
| | | const res = await apiFunction(params); |
| | | tableData.value = res.data.records || []; |
| | | total.value = res.data.total || 0; |
| | | } catch (error) { |
| | | ElMessage.error('è·åæ°æ®å¤±è´¥'); |
| | | console.error('APIé误:', error); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | }; |
| | | |
| | | // æç´¢ |
| | | const handleSearch = () => { |
| | | queryParams.current = 1; |
| | | getList(); |
| | | }; |
| | | |
| | | // éç½®æç´¢ |
| | | const handleReset = () => { |
| | | queryParams[searchField] = ''; |
| | | console.log('éç½®æç´¢åæ°:', queryParams); |
| | | handleSearch(); |
| | | }; |
| | | |
| | | // å页å¤ç |
| | | const handlePageChange = ({ page, limit }) => { |
| | | if (page && page !== queryParams.current) { |
| | | queryParams.current = page; |
| | | } |
| | | if (limit && limit !== queryParams.size) { |
| | | queryParams.size = limit; |
| | | queryParams.current = 1; // æ¹åæ¯é¡µå¤§å°æ¶åå°ç¬¬ä¸é¡µ |
| | | } |
| | | getList(); |
| | | }; |
| | | |
| | | // è¡¨æ ¼éæ©å¤ç |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | |
| | | // æ¹éå é¤ |
| | | const deleteSelected = async (deleteFunction) => { |
| | | if (selectedRows.value.length === 0) { |
| | | ElMessage.warning('è¯·éæ©è¦å é¤çæ°æ®'); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `确认å é¤éä¸ç ${selectedRows.value.length} æ¡æ°æ®åï¼`, |
| | | 'å é¤ç¡®è®¤', |
| | | { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | // è·ååè¡¨æ°æ® |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | try { |
| | | const params = { |
| | | [searchField]: queryParams[searchField], |
| | | current: queryParams.current, |
| | | size: queryParams.size, |
| | | }; |
| | | console.log('æ¥è¯¢åæ°:', params); |
| | | const res = await apiFunction(params); |
| | | tableData.value = res.data.records || []; |
| | | total.value = res.data.total || 0; |
| | | } catch (error) { |
| | | ElMessage.error('è·åæ°æ®å¤±è´¥'); |
| | | console.error('APIé误:', error); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | ); |
| | | }; |
| | | |
| | | const ids = selectedRows.value.map(row => row.id); |
| | | await deleteFunction(ids); |
| | | |
| | | ElMessage.success('å 餿å'); |
| | | selectedRows.value = []; |
| | | getList(); |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | ElMessage.error('å é¤å¤±è´¥'); |
| | | console.error('å é¤é误:', error); |
| | | } |
| | | } |
| | | }; |
| | | // æç´¢ |
| | | const handleSearch = () => { |
| | | queryParams.current = 1; |
| | | getList(); |
| | | }; |
| | | |
| | | // å·æ°æ°æ® |
| | | const refresh = () => { |
| | | getList(); |
| | | }; |
| | | // éç½®æç´¢ |
| | | const handleReset = () => { |
| | | queryParams[searchField] = ''; |
| | | console.log('éç½®æç´¢åæ°:', queryParams); |
| | | handleSearch(); |
| | | }; |
| | | |
| | | return { |
| | | // æ°æ® |
| | | tableData, |
| | | loading, |
| | | total, |
| | | selectedRows, |
| | | queryParams, |
| | | |
| | | // æ¹æ³ |
| | | getList, |
| | | handleSearch, |
| | | handleReset, |
| | | handlePageChange, |
| | | handleSelectionChange, |
| | | deleteSelected, |
| | | refresh |
| | | }; |
| | | // å页å¤ç |
| | | const handlePageChange = ({page, limit}) => { |
| | | if (page && page !== queryParams.current) { |
| | | queryParams.current = page; |
| | | } |
| | | if (limit && limit !== queryParams.size) { |
| | | queryParams.size = limit; |
| | | queryParams.current = 1; // æ¹åæ¯é¡µå¤§å°æ¶åå°ç¬¬ä¸é¡µ |
| | | } |
| | | getList(); |
| | | }; |
| | | |
| | | // è¡¨æ ¼éæ©å¤ç |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | |
| | | // æ¹éå é¤ |
| | | const deleteSelected = async (deleteFunction) => { |
| | | if (selectedRows.value.length === 0) { |
| | | ElMessage.warning('è¯·éæ©è¦å é¤çæ°æ®'); |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | await ElMessageBox.confirm( |
| | | `确认å é¤éä¸ç ${selectedRows.value.length} æ¡æ°æ®åï¼`, |
| | | 'å é¤ç¡®è®¤', |
| | | { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | } |
| | | ); |
| | | |
| | | const ids = selectedRows.value.map(row => row.id); |
| | | await deleteFunction(ids); |
| | | |
| | | ElMessage.success('å 餿å'); |
| | | selectedRows.value = []; |
| | | getList(); |
| | | } catch (error) { |
| | | if (error !== 'cancel') { |
| | | ElMessage.error('å é¤å¤±è´¥'); |
| | | console.error('å é¤é误:', error); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | // å·æ°æ°æ® |
| | | const refresh = () => { |
| | | getList(); |
| | | }; |
| | | |
| | | return { |
| | | // æ°æ® |
| | | tableData, |
| | | loading, |
| | | total, |
| | | selectedRows, |
| | | queryParams, |
| | | |
| | | // æ¹æ³ |
| | | getList, |
| | | handleSearch, |
| | | handleReset, |
| | | handlePageChange, |
| | | handleSelectionChange, |
| | | deleteSelected, |
| | | refresh |
| | | }; |
| | | } |
| | |
| | | <el-form :inline="true" :model="queryParams" class="search-form"> |
| | | <el-form-item label="æç´¢"> |
| | | <el-input |
| | | v-model="queryParams.searchAll" |
| | | placeholder="请è¾å
¥å
³é®è¯" |
| | | clearable |
| | | v-model="queryParams.searchAll" |
| | | placeholder="请è¾å
¥å
³é®è¯" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | |
| | | </el-button> |
| | | </div> <!-- æ°æ®è¡¨æ ¼ --> |
| | | <ETable |
| | | :showOverflowTooltip="false" |
| | | :loading="loading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | :current-page="queryParams.current" |
| | | :page-size="queryParams.size" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="row => openDialog('edit', row)" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :maxHeight="480" |
| | | > <template #coal="{ row }"> |
| | | :showOverflowTooltip="false" |
| | | :loading="loading" |
| | | :table-data="tableData" |
| | | :columns="columns" |
| | | :current-page="queryParams.current" |
| | | :page-size="queryParams.size" |
| | | @selection-change="handleSelectionChange" |
| | | @edit="row => openDialog('edit', row)" |
| | | :show-selection="true" |
| | | :border="true" |
| | | :maxHeight="480" |
| | | > |
| | | <template #coal="{ row }"> |
| | | <div class="coal-tags"> |
| | | <el-tag v-for="coal in parseCoalArray(row.coal)" :key="coal" size="small"> |
| | | {{ getCoalNameById(coal) }} |
| | |
| | | </template> |
| | | </ETable> <!-- å页ç»ä»¶ --> |
| | | <Pagination |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | :total="total" |
| | | v-model:page="queryParams.current" |
| | | :limit="queryParams.size" |
| | | @pagination="handlePageChange" |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | :total="total" |
| | | v-model:page="queryParams.current" |
| | | :limit="queryParams.size" |
| | | @pagination="handlePageChange" |
| | | /> |
| | | </el-card> |
| | | |
| | | <!-- çäº§å¯¹è¯æ¡ --> |
| | | <!-- handleProductionAndProcessing --> |
| | | <ProductionDialog |
| | | v-model:visible="dialogVisible" |
| | | ref="dialogRef" |
| | | :type="dialogType" |
| | | @update:productionAndProcessing="handleProductionAndProcessing" |
| | | @success="handleDialogSuccess" |
| | | v-model:visible="dialogVisible" |
| | | ref="dialogRef" |
| | | :type="dialogType" |
| | | @update:productionAndProcessing="handleProductionAndProcessing" |
| | | @success="handleDialogSuccess" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { onMounted } from "vue"; |
| | | import { ElMessage } from "element-plus"; |
| | | import { Plus, Delete } from "@element-plus/icons-vue"; |
| | | import {onMounted} from "vue"; |
| | | import {ElMessage} from "element-plus"; |
| | | import {Plus, Delete} from "@element-plus/icons-vue"; |
| | | import ProductionDialog from "./components/ProductionDialog.vue"; |
| | | import ETable from "@/components/Table/ETable.vue"; |
| | | import Pagination from "@/components/Pagination/index.vue"; |
| | | import { getProductionMasterList, delPM } from "@/api/production"; |
| | | import { parseCoalArray } from "@/utils/production"; |
| | | import { useTableData } from "./components/useTableData.js"; |
| | | import { useDialog } from "./components/useDialog.js"; |
| | | import { useCoalData } from "./components/useCoalData.js"; |
| | | import {getProductionMasterList, delPM} from "@/api/production"; |
| | | import {parseCoalArray} from "@/utils/production"; |
| | | import {useTableData} from "./components/useTableData.js"; |
| | | import {useDialog} from "./components/useDialog.js"; |
| | | import {useCoalData} from "./components/useCoalData.js"; |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | { prop: "coal", label: "ç
¤ç§", minWidth: 150, slot: 'coal' }, |
| | | { prop: "productionQuantity", label: "ç产æ°é", minWidth: 120 }, |
| | | { prop: "laborCost", label: "äººå·¥ææ¬", minWidth: 150 }, |
| | | { prop: "energyConsumptionCost", label: "è½èææ¬", minWidth: 120 }, |
| | | { prop: "equipmentDepreciation", label: "è®¾å¤ææ§", minWidth: 143 }, |
| | | { prop: "totalCost", label: "æ»ææ¬", minWidth: 150 }, |
| | | {prop: "coal", label: "ç
¤ç§", minWidth: 150, slot: 'coal'}, |
| | | {prop: "productionQuantity", label: "ç产æ°é", minWidth: 120}, |
| | | {prop: "laborCost", label: "äººå·¥ææ¬", minWidth: 150}, |
| | | {prop: "energyConsumptionCost", label: "è½èææ¬", minWidth: 120}, |
| | | {prop: "equipmentDepreciation", label: "è®¾å¤ææ§", minWidth: 143}, |
| | | {prop: "totalCost", label: "æ»ææ¬", minWidth: 150}, |
| | | ]; |
| | | |
| | | // 使ç¨è¡¨æ ¼æ°æ®ç»åå¼å½æ° |
| | |
| | | handlePageChange, |
| | | handleSelectionChange, |
| | | deleteSelected |
| | | } = useTableData(getProductionMasterList, { pageSize: 10 }); |
| | | } = useTableData(getProductionMasterList, {pageSize: 10}); |
| | | |
| | | // 使ç¨å¯¹è¯æ¡ç»åå¼å½æ° |
| | | const { |
| | |
| | | } = useDialog(); |
| | | |
| | | // 使ç¨ç
¤ç§æ°æ®ç»åå¼å½æ° |
| | | const { getCoalNameById, getCoalData } = useCoalData(); |
| | | const {getCoalNameById, getCoalData} = useCoalData(); |
| | | |
| | | // å¤ççäº§æ°æ®æ´æ° |
| | | const handleProductionAndProcessing = (row, rows) => { |
| | | const index = tableData.value.findIndex(item => item.id === rows.id); |
| | | if (index !== -1) { |
| | | tableData.value[index] = { ...tableData.value[index], ...row }; |
| | | tableData.value[index] = {...tableData.value[index], ...row}; |
| | | } |
| | | }; |
| | | |
| | |
| | | width: 20%; |
| | | } |
| | | } |
| | | |
| | | .search-form { |
| | | display: flex; |
| | | justify-content: space-between; |
| | |
| | | margin-left: 10px; |
| | | } |
| | | } |
| | | |
| | | .coal-tags { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 4px; |
| | | |
| | | |
| | | .el-tag { |
| | | margin-right: 4px; |
| | | margin-bottom: 4px; |
| | | |
| | | |
| | | &:last-child { |
| | | margin-right: 0; |
| | | } |