| | |
| | | }) |
| | | } |
| | | |
| | | // /productionMaster/deleteProductionInventory |
| | | // å é¤ä¸»è¡¨ |
| | | export function deleteProductionInventory(data) { |
| | | return request({ |
| | | url: '/productionMaster/deleteProductionInventory', |
| | | method: 'delete', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | // /productionMaster/delPM |
| | | // å é¤ä¸»è¡¨ |
| | | export function delPM(data) { |
| | | return request({ |
| | | url: '/productionMaster/delPM', |
| | | method: 'delete', |
| | | data: data |
| | | }) |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | // ææ¡£ç®¡ç |
| | | import request from '@/utils/request' |
| | | |
| | | |
| | | // /system/user/listAll |
| | | // æ¥è¯¢ææç¨æ·å表 |
| | | export function userListAll() { |
| | | return request({ |
| | | url: '/system/user/listAll', |
| | | method: 'get' |
| | | }) |
| | | } |
| | |
| | | number.value = 0; |
| | | } |
| | | const editInit = (val) => { |
| | | console.log("editInit", val); |
| | | fileList.value = []; |
| | | val.storageBlobDTO.forEach(element => { |
| | | console.log("ç¼è¾åå§å", element); |
| | | fileList.value.push(element); |
| | | uploadedSuccessfully(); |
| | | }); |
| | | // uploadList.value.push |
| | | }; |
| | | defineExpose({ |
| | | init, |
| | |
| | | }) |
| | | .then((response) => { |
| | | if (response.data.code === 200) { |
| | | console.log("ä¸ä¼ æå", response.data); |
| | | handleUploadSuccess(response.data, param.file); |
| | | // æ´æ°ç¶ç»ä»¶ |
| | | emit("update:modelValue", fileList.value); |
| | |
| | | } |
| | | }) |
| | | |
| | | const emit = defineEmits() |
| | | const emit = defineEmits(['update:page', 'update:limit', 'pagination']) |
| | | const currentPage = computed({ |
| | | get() { |
| | | return props.page |
| | |
| | | style="width: 100%" |
| | | > |
| | | <el-table-column v-if="showSelection" type="selection" width="55" align="center" /> |
| | | <el-table-column v-if="showIndex" label="åºå·" type="index" width="60" align="center" /> |
| | | <el-table-column v-if="showIndex" label="åºå·" width="60" align="center" fixed="left"> |
| | | <template #default="scope"> |
| | | {{ getRowIndex(scope.$index) }} |
| | | </template> |
| | | </el-table-column> |
| | | <template v-for="col in columns" :key="col.prop"> |
| | | <el-table-column v-bind="col" :show-overflow-tooltip="shouldShowTooltip(col, tableData)" |
| | | <el-table-column v-bind="col" |
| | | :formatter="col.formatter || defaultFormatter" align="center"> |
| | | <template v-if="col.slot" #default="scope"> |
| | | <slot :name="col.prop" :row="scope.row" :column="scope.column" :index="scope.$index"></slot> |
| | |
| | | rowKey: { |
| | | type: String, |
| | | default: 'id' |
| | | }, |
| | | showOverflowTooltip: { |
| | | }, showOverflowTooltip: { |
| | | type: Boolean, |
| | | default: true |
| | | }, |
| | | // å½å页ç |
| | | currentPage: { |
| | | type: Number, |
| | | default: 1 |
| | | }, |
| | | // æ¯é¡µå¤§å° |
| | | pageSize: { |
| | | type: Number, |
| | | default: 10 |
| | | } |
| | | }) |
| | | const tableRef = ref(null) |
| | | // æ£æ¥åæ¯å¦éè¦æ¾ç¤ºtooltip |
| | | const shouldShowTooltip = (col, data) => { |
| | | // 妿åé
ç½®ä¸æç¡®è®¾ç½®äºshowOverflowTooltipï¼ä½¿ç¨è¯¥è®¾ç½® |
| | | if (col.hasOwnProperty('showOverflowTooltip')) { |
| | | return col.showOverflowTooltip; |
| | | } |
| | | // å¦ææ²¡æpropï¼ç´æ¥è¿åfalse |
| | | if (!col.prop) return false; |
| | | // æ£æ¥è¯¥åå¨æææ°æ®ä¸æ¯å¦æé空å¼ï¼é»è®¤æ¾ç¤ºtooltip |
| | | return data.some(row => row[col.prop] != null && row[col.prop] !== ''); |
| | | }; |
| | | |
| | | // é»è®¤çæ ¼å¼å彿° |
| | | const defaultFormatter = (row, column, cellValue) => { |
| | |
| | | const handleExport = (row) => { |
| | | emit('export', row) |
| | | } |
| | | |
| | | // 计ç®å页åºå· |
| | | const getRowIndex = (index) => { |
| | | return (props.currentPage - 1) * props.pageSize + index + 1; |
| | | }; |
| | | |
| | | // æ£ç¡®ç toggleRowSelection æ¹æ³ï¼é对åè¡ |
| | | const toggleRowSelection = (row, selected) => { |
| | |
| | | </script> |
| | | |
| | | <style scoped> |
| | | :deep(.el-tooltip) { |
| | | justify-content: center !important; |
| | | } |
| | | .el-table { |
| | | margin: 20px 0 !important; |
| | | } |
| | |
| | | <template v-for="col in columns" :key="col.prop"> |
| | | <el-table-column |
| | | v-bind="col" |
| | | :show-overflow-tooltip="shouldShowTooltip(col, tableData)" |
| | | :show-overflow-tooltip="false" |
| | | align="center" |
| | | > |
| | | <template #default="scope"> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * ç产模åå·¥å
·å½æ° |
| | | * æä¾æ°æ®å¤çãéªè¯ã转æ¢çéç¨æ¹æ³ |
| | | */ |
| | | |
| | | /** |
| | | * è§£æç
¤ç§æ°ç»å符串 |
| | | * @param {string|array} coalString - ç
¤ç§åç¬¦ä¸²ææ°ç» |
| | | * @returns {array} è§£æåçç
¤ç§æ°ç» |
| | | */ |
| | | export function parseCoalArray(coalString) { |
| | | if (!coalString) return []; |
| | | |
| | | if (Array.isArray(coalString)) return coalString; |
| | | |
| | | return String(coalString) |
| | | .replace(/^\[|\]$/g, '') |
| | | .split(',') |
| | | .map(item => item.trim()) |
| | | .filter(Boolean); |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®IDå¹é
å表ä¸çé¡¹ç® |
| | | * @param {array} list - æ°æ®å表 |
| | | * @param {string|number} value - è¦å¹é
çå¼ |
| | | * @param {string} keyField - é®å段åï¼é»è®¤ä¸º'id' |
| | | * @param {string} valueField - å¼å段åï¼é»è®¤ä¸º'fieldName' |
| | | * @returns {string} å¹é
å°ç弿åå¼ |
| | | */ |
| | | export function matchItemById(list, value, keyField = 'id', valueField = 'fieldName') { |
| | | if (!Array.isArray(list) || !value) return value; |
| | | |
| | | const found = list.find(item => item[keyField] == value); |
| | | return found ? found[valueField] : value; |
| | | } |
| | | |
| | | /** |
| | | * è®¡ç®æ»ææ¬ |
| | | * @param {object} row - æ°æ®è¡ |
| | | * @param {array} fields - éè¦è®¡ç®çåæ®µæ°ç» |
| | | * @returns {string} æ ¼å¼ååçæ»ææ¬ |
| | | */ |
| | | export function calculateTotalCost(row, fields = ['laborCost', 'energyConsumptionCost', 'equipmentDepreciation', 'purchasePrice']) { |
| | | const total = fields.reduce((sum, field) => { |
| | | return sum + (parseFloat(row[field]) || 0); |
| | | }, 0); |
| | | |
| | | return total.toFixed(2); |
| | | } |
| | | |
| | | /** |
| | | * éªè¯è¡¨åæ°æ® |
| | | * @param {array} data - è¡¨åæ°æ®æ°ç» |
| | | * @param {array} requiredFields - å¿
å¡«åæ®µ |
| | | * @returns {object} éªè¯ç»æ { isValid, message } |
| | | */ |
| | | export function validateFormData(data, requiredFields) { |
| | | if (!data || data.length === 0) { |
| | | return { isValid: false, message: 'è¯·æ·»å æ°æ®' }; |
| | | } |
| | | |
| | | for (let i = 0; i < data.length; i++) { |
| | | const item = data[i]; |
| | | for (const field of requiredFields) { |
| | | if (item[field] === '' || item[field] === null || item[field] === undefined) { |
| | | return { |
| | | isValid: false, |
| | | message: `第${i + 1}è¡ç${field}åæ®µä¸è½ä¸ºç©º` |
| | | }; |
| | | } |
| | | } |
| | | } |
| | | |
| | | return { isValid: true, message: 'éªè¯éè¿' }; |
| | | } |
| | | |
| | | /** |
| | | * æ°å¼éªè¯ |
| | | * @param {any} value - è¦éªè¯çå¼ |
| | | * @param {number} min - æå°å¼ |
| | | * @param {number} max - æå¤§å¼ |
| | | * @returns {object} éªè¯ç»æ { isValid, message, value } |
| | | */ |
| | | export function validateNumber(value, min = 0, max = Infinity) { |
| | | const numValue = Number(value); |
| | | |
| | | if (isNaN(numValue)) { |
| | | return { isValid: false, message: '请è¾å
¥æææ°å', value: 0 }; |
| | | } |
| | | |
| | | if (numValue < min) { |
| | | return { isValid: false, message: `æ°å¼ä¸è½å°äº${min}`, value: min }; |
| | | } |
| | | |
| | | if (numValue > max) { |
| | | return { isValid: false, message: `æ°å¼ä¸è½å¤§äº${max}`, value: max }; |
| | | } |
| | | |
| | | return { isValid: true, message: 'éªè¯éè¿', value: numValue }; |
| | | } |
| | | |
| | | /** |
| | | * æ·±æ·è´å¯¹è±¡ |
| | | * @param {any} obj - è¦æ·è´ç对象 |
| | | * @returns {any} æ·è´åç对象 |
| | | */ |
| | | export function deepClone(obj) { |
| | | if (obj === null || typeof obj !== 'object') return obj; |
| | | if (obj instanceof Date) return new Date(obj.getTime()); |
| | | if (obj instanceof Array) return obj.map(item => deepClone(item)); |
| | | if (typeof obj === 'object') { |
| | | const clonedObj = {}; |
| | | for (const key in obj) { |
| | | if (obj.hasOwnProperty(key)) { |
| | | clonedObj[key] = deepClone(obj[key]); |
| | | } |
| | | } |
| | | return clonedObj; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çæé»è®¤çç产æç»è¡æ°æ® |
| | | * @param {object} userData - ç¨æ·æ°æ® |
| | | * @param {object} extraData - é¢å¤æ°æ® |
| | | * @returns {object} é»è®¤è¡æ°æ® |
| | | */ |
| | | export function createDefaultProductionRow(userData = {}, extraData = {}) { |
| | | return { |
| | | coal: "", |
| | | productionQuantity: "", |
| | | laborCost: "", |
| | | energyConsumptionCost: "", |
| | | equipmentDepreciation: "", |
| | | purchasePrice: "", |
| | | totalCost: "0.00", |
| | | producer: userData?.user?.nickName || "", |
| | | ...extraData |
| | | }; |
| | | } |
| | |
| | | return data.name?.toLowerCase().includes(value.toLowerCase()); |
| | | }; |
| | | const submitForm = async (res) => { |
| | | console.log("æäº¤è¡¨ååè°:", res); |
| | | |
| | | if (res && res.code === 200) { |
| | | ElMessage.success("æä½æå"); |
| | | // å·æ°åè¡¨æ°æ® |
| | |
| | | } |
| | | } |
| | | const centerDialogVisible = (val) => { |
| | | console.log(val); |
| | | }; |
| | | // å¤çèç¹ç¹å» |
| | | const handleNodeClick = async (data) => { |
| | | console.log("ç¹å»èç¹:", data); |
| | | // 忢èç¹æ¶éç½®å°ç¬¬ä¸é¡µ |
| | | queryParams.current = 1; |
| | | queryParams.treeId = data.id; |
| | |
| | | }; |
| | | // å¤çå页åå |
| | | const handlePageChange = ({ page }) => { |
| | | console.log("å页åå:", { page }); |
| | | queryParams.current = page; |
| | | // pageSize åºå®ä¸º20ï¼ä¸åä»åæ°ä¸è·å |
| | | getArchiveListData(); |
| | |
| | | const getArchiveListData = async () => { |
| | | try { |
| | | loading.value = true; |
| | | console.log("è·å彿¡£åè¡¨æ°æ®", { |
| | | treeId: queryParams.treeId, |
| | | current: queryParams.current, |
| | | pageSize: queryParams.pageSize, |
| | | }); |
| | | |
| | | let res = await getArchiveList({ |
| | | treeId: queryParams.treeId, |
| | | current: queryParams.current, |
| | |
| | | } |
| | | // pageSize åºå®ä¸º20ï¼ä¸ä»å端è·å |
| | | |
| | | console.log("æ°æ®æ´æ°å®æ:", { |
| | | total: total.value, |
| | | current: queryParams.current, |
| | | pageSize: queryParams.pageSize, |
| | | records: tableData.value.length, |
| | | }); |
| | | } catch (error) { |
| | | console.error("è·å彿¡£å表失败:", error); |
| | | ElMessage.error("è·åæ°æ®å¤±è´¥"); |
| | | tableData.value = []; |
| | | total.value = 0; |
| | |
| | | } |
| | | try { |
| | | const ids = selectedRows.map((row) => row.id); |
| | | console.log(ids) |
| | | const { code, msg } = await delArchive(ids); |
| | | if (code !== 200) { |
| | | ElMessage.warning("å é¤å¤±è´¥: " + msg); |
| | |
| | | await getArchiveListData(); |
| | | } |
| | | } catch (error) { |
| | | console.error("å é¤å½æ¡£å¤±è´¥:", error); |
| | | ElMessage.error("å é¤å½æ¡£å¤±è´¥"); |
| | | } |
| | | }; |
| | |
| | | comeTreeData.isEdit = false; |
| | | const newValue = newName.value.trim(); |
| | | if (comeTreeData.name === newValue) { |
| | | console.log("没æä¿®æ¹å
容"); |
| | | return; |
| | | } |
| | | if (newValue === "") { |
| | | console.warn("è¾å
¥ä¸è½ä¸ºç©º"); |
| | | newName.value = comeTreeData.name || "æ°èç¹"; |
| | | return; |
| | | } |
| | |
| | | parentId: parentId || null, // å¦ææ²¡æç¶èç¹ï¼å为 null |
| | | }); |
| | | } catch (error) { |
| | | console.error("åå¨å¤±è´¥", error); |
| | | comeTreeData.name = comeTreeData.name || "æ°èç¹"; |
| | | } |
| | | console.log("ä¿åæå:", newValue); |
| | | }; |
| | | |
| | | onMounted(async () => { |
| | |
| | | }; |
| | | |
| | | const remove = async (node, data) => { |
| | | console.log("å é¤èç¹:", data); |
| | | if (!data || !data.id) { |
| | | console.warn("æ æ³å 餿ªå®ä¹ææ æçèç¹"); |
| | | return; |
| | | } |
| | | console.log("å é¤èç¹ ID:", data.id); |
| | | let { code, msg } = await delTree([data.id]); |
| | | if (code !== 200) { |
| | | ElMessage.warning("å é¤å¤±è´¥, " + msg); |
| | |
| | | const append = async (data) => { |
| | | if (data === "") { |
| | | // æ°å¢æ ¹èç¹ |
| | | console.log("æ°å¢æ ¹èç¹"); |
| | | const newNode = { |
| | | id: Date.now(), |
| | | name: "æ°èç¹", |
| | |
| | | const node = treeRef.value?.getNode(nodeKey); |
| | | const isExpanded = node?.expanded; // 妿æåçº§ä¸æªå±å¼ï¼å
å±å¼èç¹ |
| | | if (hasChildren && !isExpanded) { |
| | | console.log(treeRef.value, "å±å¼èç¹", nodeKey); |
| | | if ( |
| | | treeRef.value && |
| | | treeRef.value.store && |
| | |
| | | treeRef.value.store.nodesMap[nodeKey].expanded = true; |
| | | } |
| | | } |
| | | |
| | | const newNode = { |
| | | id: Date.now(), |
| | | name: "æ°åèç¹", |
| | |
| | | row.value = rows; |
| | | dialogVisible.value = true; |
| | | archiveDialogs.value.editForm(rows); // è°ç¨ç¼è¾æ¹æ³ |
| | | // console.log("ç¼è¾è¡æ°æ®:", archiveDialogs.value); |
| | | }; |
| | | |
| | | // ç§»é¤æå è½½ï¼ç´æ¥è·åæ°æ® |
| | |
| | | if (res.code === 200) { |
| | | treeData.value = res.data?.records || res.data || []; |
| | | } else { |
| | | console.error("Failed to fetch tree data:", res.message); |
| | | treeData.value = []; |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åæ å½¢æ°æ®å¤±è´¥:", error); |
| | | treeData.value = []; |
| | | } |
| | | }; |
| | |
| | | }; |
| | | const editForm = (val) => { |
| | | ruleForm.value = copyForm.value; |
| | | // fileUploadRef.value.editInit(ruleForm.value); |
| | | nextTick(() => { |
| | | // console.log("ç¼è¾è¡¨åæ°æ®:", fileUploadRef.value); |
| | | fileUploadRef.value.editInit(val); |
| | | |
| | | }); |
| | |
| | | type: "error", |
| | | message: error.msg || "æä½å¤±è´¥", |
| | | }); |
| | | console.error("API è°ç¨å¤±è´¥:", error); |
| | | return; |
| | | } |
| | | // åé emit äºä»¶ |
| | |
| | | // å
³éå¯¹è¯æ¡ |
| | | centerDialogVisible.value = false; |
| | | } catch (error) { |
| | | console.error("表åéªè¯å¤±è´¥æAPIè°ç¨å¤±è´¥:", error); |
| | | ElMessage({ |
| | | type: "error", |
| | | message: error.msg || "æä½å¤±è´¥", |
| | | }); |
| | | } |
| | | }; |
| | | </script> |
| | |
| | | value: item.id, |
| | | label: item.coal, |
| | | })); |
| | | console.log(supplyList.value, coalList.value); |
| | | } catch (error) { |
| | | console.error("è·åä¸ææ°æ®å¤±è´¥:", error); |
| | | ElMessage.error("è·åä¸ææ°æ®å¤±è´¥ï¼è¯·ç¨åéè¯"); |
| | | } |
| | | }; |
| | | |
| | |
| | | const formRef = ref(null); |
| | | // æäº¤è¡¨å |
| | | const handleSubmit = async () => { |
| | | console.log("æäº¤è¡¨å", form.value); |
| | | if (!formRef.value) return; |
| | | await formRef.value.validate(async (valid) => { |
| | | if (valid) { |
| | |
| | | const handleAddEdit = () => { |
| | | addOrEdit.value == "add" ? (title.value = "æ°å¢") : (title.value = "ç¼è¾"); |
| | | title.value = title.value + "éè´ä¿¡æ¯"; |
| | | |
| | | // æ£ç¡®ä½¿ç¨åç»ä»¶ref |
| | | if (productionDialogs.value) { |
| | | // è¿éå¯ä»¥è°ç¨åç»ä»¶çæ¹æ³ |
| | | console.log("åç»ä»¶å®ä¾:", productionDialogs.value.getDropdownData()); |
| | | } |
| | | |
| | | openDialog(); |
| | | }; |
| | | // æå¼å¼¹çª |
| | |
| | | <el-table :data="tableData" :border="border" style="width: 100%"> |
| | | <el-table-column label="ç
¤ç§" min-width="120" > |
| | | <template #default="{ row, $index }" > |
| | | <el-input |
| | | v-model="row.coal" |
| | | placeholder="请è¾å
¥ç
¤ç§" |
| | | @input="handleInput('coal', $index, $event)" |
| | | <el-select |
| | | clearable |
| | | :model-value="getCoalNameById(row.coal) || row.coal" |
| | | placeholder="è¯·éæ©ç
¤ç§" |
| | | @change="(value) => handleCoalSelectChange(row, value)" |
| | | filterable |
| | | :key="`coal-select-${$index}-${weekList.length}`" |
| | | > |
| | | <el-option |
| | | v-for="(item, index) of weekList" |
| | | :key="`option-${index}-${item.key}`" |
| | | :label="item.value" |
| | | :value="item.value" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç产æ°é" min-width="120"> |
| | |
| | | @input="handleInput('laborCost', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style:normal;">å
</i> |
| | | <i style="font-style: normal">å
</i> |
| | | </template> |
| | | </el-input> |
| | | </template> |
| | |
| | | @input="handleInput('energyConsumptionCost', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style:normal;">å
</i> |
| | | <i style="font-style: normal">å
</i> |
| | | </template> |
| | | </el-input> |
| | | </template> |
| | |
| | | @input="handleInput('equipmentDepreciation', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style:normal;">å
</i> |
| | | <i style="font-style: normal">å
</i> |
| | | </template> |
| | | </el-input> |
| | | </template> |
| | |
| | | @input="handleInput('purchasePrice', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style:normal;">å
</i> |
| | | <i style="font-style: normal">å
</i> |
| | | </template> |
| | | </el-input> |
| | | </template> |
| | |
| | | <el-table-column label="æ»ææ¬" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | disabled |
| | | v-model="row.totalCost" |
| | | placeholder="æ»ææ¬" |
| | | type="number" |
| | |
| | | @input="handleInput('totalCost', $index, $event)" |
| | | > |
| | | <template #suffix> |
| | | <i style="font-style:normal;">å
</i> |
| | | <i style="font-style: normal">å
</i> |
| | | </template> |
| | | </el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç产人" min-width="120"> |
| | | <template #default="{ row, $index }"> |
| | | <el-input |
| | | v-model="row.producer" |
| | | placeholder="ç产人" |
| | | @input="handleInput('producer', $index, $event)" |
| | | <el-select |
| | | 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" |
| | | /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column v-if="showOperations" label="æä½" width="120" fixed="right"> |
| | | <el-table-column |
| | | v-if="showOperations" |
| | | label="æä½" |
| | | width="120" |
| | | fixed="right" |
| | | > |
| | | <template #default="{ $index }"> |
| | | <el-button |
| | | type="danger" |
| | |
| | | </template> |
| | | |
| | | <script setup name="ProductionDetailsTable"> |
| | | import { ref, computed, watch } from 'vue' |
| | | import { Delete } from '@element-plus/icons-vue' |
| | | |
| | | import { ref, computed, watch, onMounted, nextTick } from "vue"; |
| | | import { Delete } from "@element-plus/icons-vue"; |
| | | import { getCoalFieldList } from "@/api/basicInformation/coalQualityMaintenance"; |
| | | import { userListAll } from "@/api/publicApi"; |
| | | const props = defineProps({ |
| | | modelValue: { |
| | | type: Array, |
| | | default: () => [] |
| | | default: () => [], |
| | | }, |
| | | border: { |
| | | type: Boolean, |
| | | default: false |
| | | default: false, |
| | | }, |
| | | showOperations: { |
| | | type: Boolean, |
| | | default: true |
| | | default: true, |
| | | }, |
| | | autoCalculate: { |
| | | type: Boolean, |
| | | default: true |
| | | } |
| | | }) |
| | | default: true, |
| | | }, |
| | | }); |
| | | |
| | | const emit = defineEmits(['update:modelValue', 'input-change', 'delete-row']) |
| | | const emit = defineEmits(["update:modelValue", "input-change", "delete-row"]); |
| | | |
| | | // ä½¿ç¨ v-model è¿è¡ååç»å® |
| | | const tableData = computed({ |
| | | get() { |
| | | return props.modelValue |
| | | return props.modelValue; |
| | | }, |
| | | set(value) { |
| | | emit('update:modelValue', value) |
| | | } |
| | | }) |
| | | emit("update:modelValue", value); |
| | | }, |
| | | }); |
| | | |
| | | // å¤çè¾å
¥åå |
| | | const handleInput = (field, index, value) => { |
| | | const newData = [...tableData.value] |
| | | newData[index][field] = value |
| | | const newData = [...tableData.value]; |
| | | newData[index][field] = value; |
| | | |
| | | // 妿å¼å¯èªå¨è®¡ç®æ»ææ¬ |
| | | if (props.autoCalculate && ['laborCost', 'energyCost', 'equipmentDepreciation', 'purchasePrice'].includes(field)) { |
| | | calculateTotalCost(newData[index]) |
| | | if ( |
| | | props.autoCalculate && |
| | | [ |
| | | "laborCost", |
| | | "energyCost", |
| | | "equipmentDepreciation", |
| | | "purchasePrice", |
| | | ].includes(field) |
| | | ) { |
| | | calculateTotalCost(newData[index]); |
| | | } |
| | | |
| | | tableData.value = newData |
| | | emit('input-change', { field, index, value, row: newData[index] }) |
| | | } |
| | | tableData.value = newData; |
| | | emit("input-change", { field, index, value, row: newData[index] }); |
| | | }; |
| | | |
| | | // è®¡ç®æ»ææ¬ |
| | | const calculateTotalCost = (row) => { |
| | | const laborCost = parseFloat(row.laborCost) || 0 |
| | | const energyCost = parseFloat(row.energyCost) || 0 |
| | | const equipmentDepreciation = parseFloat(row.equipmentDepreciation) || 0 |
| | | const purchasePrice = parseFloat(row.purchasePrice) || 0 |
| | | const laborCost = parseFloat(row.laborCost) || 0; |
| | | const energyCost = parseFloat(row.energyCost) || 0; |
| | | const equipmentDepreciation = parseFloat(row.equipmentDepreciation) || 0; |
| | | const purchasePrice = parseFloat(row.purchasePrice) || 0; |
| | | |
| | | row.totalCost = (laborCost + energyCost + equipmentDepreciation + purchasePrice).toFixed(2) |
| | | } |
| | | row.totalCost = ( |
| | | laborCost + |
| | | energyCost + |
| | | equipmentDepreciation + |
| | | purchasePrice |
| | | ).toFixed(2); |
| | | }; |
| | | |
| | | // å é¤è¡ |
| | | const handleDelete = (index) => { |
| | | const newData = [...tableData.value] |
| | | newData.splice(index, 1) |
| | | tableData.value = newData |
| | | emit('delete-row', index) |
| | | } |
| | | const newData = [...tableData.value]; |
| | | newData.splice(index, 1); |
| | | tableData.value = newData; |
| | | emit("delete-row", index); |
| | | }; |
| | | |
| | | // å¤çç
¤ç§éæ©åå |
| | | |
| | | // å¤çç
¤ç§éæ©ååï¼æ°æ¹æ³ï¼åç§°éæ©è½¬IDï¼ |
| | | const handleCoalSelectChange = (row, selectedName) => { |
| | | // æ ¹æ®éæ©çåç§°æ¾å°å¯¹åºçID |
| | | const coalItem = weekList.value.find(item => item.value === selectedName); |
| | | if (coalItem) { |
| | | row.coal = coalItem.key; // 设置为ID |
| | | } else { |
| | | row.coal = ''; // å¦ææ²¡æ¾å°ï¼æ¸
空 |
| | | } |
| | | }; |
| | | |
| | | // æ ¹æ®IDè·åç
¤ç§åç§°ï¼ç¨äºæ¾ç¤ºï¼ |
| | | const getCoalNameById = (id) => { |
| | | const coal = weekList.value.find(item => item.key == id); |
| | | return coal ? coal.value : id; |
| | | }; |
| | | |
| | | const weekList = ref([]); |
| | | |
| | | |
| | | // çå¬è¡¨æ ¼æ°æ®ååï¼ç¡®ä¿æ¾ç¤ºæ£ç¡® |
| | | watch(() => props.modelValue, (newValue) => { |
| | | if (newValue && weekList.value.length > 0) { |
| | | // 彿°æ®å è½½å®æä¸weekListå·²è·åæ¶ï¼ç¡®ä¿æ¾ç¤ºæ£ç¡® |
| | | } |
| | | }, { deep: true }); |
| | | |
| | | // çå¬weekListååï¼å½ä¸ææ°æ®å è½½å®æåå¤çæ¾ç¤º |
| | | watch(weekList, (newList) => { |
| | | if (newList.length > 0 && tableData.value.length > 0) { |
| | | // 强å¶è§¦åè¡¨æ ¼éæ°æ¸²æä»¥ç¡®ä¿el-selectæ£ç¡®æ¾ç¤º |
| | | nextTick(() => { |
| | | // 触åä¸ä¸ªå¾®å°çæ°æ®ååæ¥å¼ºå¶éæ°æ¸²æ |
| | | const tempData = [...tableData.value]; |
| | | tableData.value = tempData; |
| | | }); |
| | | } |
| | | }, { deep: true }); |
| | | |
| | | onMounted(async()=>{ |
| | | let res = await getCoalFieldList() |
| | | res.data.forEach(item => { |
| | | let obj = {}; |
| | | obj.value = item.fieldName; |
| | | obj.key = item.id; |
| | | 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); |
| | | }); |
| | | // éç¥ç¶ç»ä»¶weekListå·²å è½½å®æ |
| | | nextTick(() => { |
| | | }); |
| | | }) |
| | | const dropdownList = ref([]); |
| | | // è·åä¸ææ°æ® |
| | | const getDropdownData = async () => { |
| | | let res = await getCoalFieldList(); |
| | | if (res.code === 200) { |
| | | dropdownList.value = res.data.map((item) => ({ |
| | | value: item.fieldName, |
| | | key: item.id, |
| | | })); |
| | | } else { |
| | | ElMessage.error("è·åä¸ææ°æ®å¤±è´¥"); |
| | | } |
| | | }; |
| | | const userList = ref([]); |
| | | const getUserList = (async()=>{ |
| | | let res = await userListAll(); |
| | | if (res.code === 200) { |
| | | userList.value = res.data.map((item) => ({ |
| | | value: item.nickName, |
| | | key: item.userId, |
| | | })); |
| | | } else { |
| | | ElMessage.error("è·åç¨æ·å表失败"); |
| | | } |
| | | }) |
| | | // çå¬è¡¨æ ¼æ°æ®ååï¼ç¡®ä¿æ¾ç¤ºæ£ç¡® |
| | | watch(() => props.modelValue, (newValue) => { |
| | | if (newValue && userList.value.length > 0) { |
| | | // 彿°æ®å è½½å®æä¸weekListå·²è·åæ¶ï¼ç¡®ä¿æ¾ç¤ºæ£ç¡® |
| | | } |
| | | }, { deep: true }); |
| | | |
| | | // çå¬userListååï¼å½ä¸ææ°æ®å è½½å®æåå¤çæ¾ç¤º |
| | | watch(userList, (newList) => { |
| | | if (newList.length > 0 && tableData.value.length > 0) { |
| | | // 强å¶è§¦åè¡¨æ ¼éæ°æ¸²æä»¥ç¡®ä¿el-selectæ£ç¡®æ¾ç¤º |
| | | nextTick(() => { |
| | | // 触åä¸ä¸ªå¾®å°çæ°æ®ååæ¥å¼ºå¶éæ°æ¸²æ |
| | | const tempData = [...tableData.value]; |
| | | tableData.value = tempData; |
| | | }); |
| | | } |
| | | }, { deep: true }); |
| | | |
| | | const getUserNameById = (id) => { |
| | | const producer = userList.value.find(item => item.key == id); |
| | | return producer ? producer.value : id; |
| | | }; |
| | | // å¤çç¨æ·éæ©ååï¼æ°æ¹æ³ï¼åç§°éæ©è½¬IDï¼ |
| | | const handleUserSelectChange = (row, selectedName) => { |
| | | // æ ¹æ®éæ©çåç§°æ¾å°å¯¹åºçID |
| | | const userItem = userList.value.find(item => item.value === selectedName); |
| | | if (userItem) { |
| | | row.producer = userItem.key; // 设置为ID |
| | | } else { |
| | | row.producer = ''; // å¦ææ²¡æ¾å°ï¼æ¸
空 |
| | | } |
| | | }; |
| | | // æ´é²æ¹æ³ç»ç¶ç»ä»¶ä½¿ç¨ |
| | | defineExpose({ |
| | | calculateTotalCost, |
| | | getDropdownData, |
| | | getCoalNameById, // æ´é²è·åç
¤ç§åç§°çæ¹æ³ |
| | | weekList, // æ´é²weekList让ç¶ç»ä»¶å¯ä»¥è®¿é® |
| | | addRow: (rowData = {}) => { |
| | | const defaultRow = { |
| | | coal: '', |
| | | calorificValue: '', |
| | | productionQuantity: '', |
| | | laborCost: '', |
| | | energyCost: '', |
| | | equipmentDepreciation: '', |
| | | purchasePrice: '', |
| | | totalCost: '', |
| | | ...rowData |
| | | } |
| | | tableData.value = [...tableData.value, defaultRow] |
| | | coal: "", |
| | | calorificValue: "", |
| | | productionQuantity: "", |
| | | laborCost: "", |
| | | energyCost: "", |
| | | equipmentDepreciation: "", |
| | | purchasePrice: "", |
| | | totalCost: "", |
| | | producer: "", |
| | | ...rowData, |
| | | }; |
| | | tableData.value = [...tableData.value, defaultRow]; |
| | | }, |
| | | clearData: () => { |
| | | tableData.value = [] |
| | | tableData.value = []; |
| | | }, |
| | | // æ·»å ä¸ä¸ªæ¹æ³æ¥çå¾
weekListå è½½å®æ |
| | | waitForWeekList: () => { |
| | | return new Promise((resolve) => { |
| | | if (weekList.value.length > 0) { |
| | | resolve(); |
| | | } else { |
| | | const unwatch = watch(weekList, (newList) => { |
| | | if (newList.length > 0) { |
| | | unwatch(); |
| | | resolve(); |
| | | } |
| | | }) |
| | | }); |
| | | } |
| | | }); |
| | | }, |
| | | // 强å¶å·æ°è¡¨æ ¼æ¾ç¤º |
| | | forceRefresh: () => { |
| | | nextTick(() => { |
| | | const tempData = [...tableData.value]; |
| | | tableData.value = tempData; |
| | | }); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | |
| | | <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> |
| | | </el-col> |
| | | <el-col :span="2"> |
| | | <!-- <el-col :span="2"> |
| | | <el-button type="danger" @click="clearAllRows"> |
| | | <el-icon> |
| | | <Delete /> |
| | | </el-icon> |
| | | æ¸
空 |
| | | </el-button> |
| | | </el-col> |
| | | <!-- <el-col :span="2"> |
| | | <el-button type="warning" @click="calculateAllCosts"> |
| | | <el-icon> |
| | | <Warning /> |
| | | </el-icon> éæ°è®¡ç® |
| | | </el-button> |
| | | </el-col> --> |
| | | </el-row> |
| | |
| | | |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button @click="handleClose" v-if="dialogType === 'add'" |
| | | <el-button |
| | | @click="handleClose" |
| | | v-if="dialogType === 'add' || dialogType === 'edit'" |
| | | >å æ¶</el-button |
| | | > |
| | | <el-button @click="handleReset" v-if="dialogType === 'edit'" |
| | | <!-- <el-button @click="handleReset" v-if="dialogType === 'edit'" |
| | | >é ç½®</el-button |
| | | > |
| | | > --> |
| | | <el-button type="primary" :loading="loading" @click="handleSubmit" |
| | | >ç¡® å®</el-button |
| | | > |
| | |
| | | /> |
| | | </div> |
| | | <ETable |
| | | :showIndex="false" |
| | | :showOverflowTooltip="false" |
| | | @selection-change="handleSelectionChange" |
| | | :showOperations="false" |
| | | ref="etableRef" |
| | |
| | | import ProductionDetailsTable from "./ProductionDetailsTable.vue"; |
| | | import { ElMessage, ElMessageBox, ElAlert, ElText } from "element-plus"; |
| | | import { Delete, Warning, Plus } from "@element-plus/icons-vue"; |
| | | import { getOfficialAll, addOrEditPM } from "@/api/production/index.js"; |
| | | import { getCurrentInstance } from "vue"; |
| | | import { |
| | | getOfficialAll, |
| | | addOrEditPM, |
| | | deleteProductionInventory, |
| | | } from "@/api/production/index.js"; |
| | | 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", // 'add' æ 'edit' |
| | | }, |
| | | 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 emit = defineEmits(["update:visible", "success"]); |
| | | |
| | | const dialogVisible = defineModel("visible", { type: Boolean, default: false }); |
| | | const emit = defineEmits(["update:visible", "success", "update:productionAndProcessing"]); |
| | | |
| | | // ç¨æ·ä¿¡æ¯åç
¤ç§æ°æ® |
| | | const userStore = useUserStore(); |
| | | const { getCoalNameById } = useCoalData(); |
| | | let userInfo; |
| | | |
| | | // å¯¹è¯æ¡ç¶æ |
| | | const innerVisible = ref(false); |
| | | const dialogType = ref("add"); |
| | | const loading = ref(false); |
| | | const formRef = ref(null); |
| | | const etableRef = ref(null); |
| | | |
| | | // æ°æ®ç¶æ |
| | | const tableData = ref([]); |
| | | const detailsTableData = ref([]); |
| | | const formalDatabaseData = ref([]); |
| | | const formalDatabaseSelectedData = ref([]); |
| | | const selectedIds = ref([]); |
| | | const currentRow = ref(null); |
| | | const copyForm = ref(null); |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | { label: "ç
¤ç§", prop: "coal", minwidth: 120 }, |
| | | { label: "åºåæ°é", prop: "inventoryQuantity", minwidth: 100 }, |
| | |
| | | editType: "number", |
| | | }, |
| | | ]; |
| | | const etableRef = ref(null); |
| | | const selectedIds = ref([]); // é»è®¤éä¸çIDæ°ç» |
| | | // è°è¯å½æ°ï¼éªè¯IDå¹é
é»è¾ |
| | | |
| | | 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 }, |
| | | ]); |
| | | // å·¥å
·å½æ° |
| | | const debugIdMatching = () => { |
| | | if (formalDatabaseData.value.length > 0 && selectedIds.value.length > 0) { |
| | | const matchedRows = formalDatabaseData.value.filter((row) => |
| | |
| | | ); |
| | | } |
| | | }; |
| | | const detailsTableData = ref([]); |
| | | |
| | | const handleRowClick = (row) => { |
| | | currentRow.value = row; |
| | | }; |
| | | const formalDatabaseColumns = ref([ |
| | | { prop: "supplierName", label: "ä¾åºååç§°", minwidth: 150 }, |
| | | { prop: "coal", label: "ç
¤ç§ç±»å", minwidth: 60 }, |
| | | { prop: "inventoryQuantity", label: "åºåæ°é", minwidth: 80 }, |
| | | { prop: "unit", label: "åä½", minwidth: 100 }, |
| | | { prop: "priceExcludingTax", label: "åä»·ï¼ä¸å«ç¨ï¼", minwidth: 80 }, |
| | | { prop: "createTime", label: "ç»è®°æ¥æ", minwidth: 400 }, |
| | | ]); |
| | | // è¡¨åæ°æ® |
| | | const formData = reactive({ |
| | | category: "", |
| | | unit: "", |
| | | productionVolume: 0, |
| | | laborCost: 0, |
| | | materialCost: 0, |
| | | equipmentCost: 0, |
| | | totalCost: 0, |
| | | totalPrice: 0, |
| | | profit: 0, |
| | | reviewer: "", |
| | | date: "", |
| | | }); |
| | | |
| | | // è·åé
ç½®æ°æ® |
| | | const handlData = async () => { |
| | | innerVisible.value = true; |
| | | let res = await getOfficialAll(); |
| | |
| | | nextTick(() => { |
| | | setTimeout(() => { |
| | | try { |
| | | // å
æ¸
餿æéä¸ |
| | | etableRef.value.clearSelection(); |
| | | |
| | | // æ¾å°éè¦éä¸çè¡å¹¶è®¾ç½®éä¸ç¶æ |
| | | // 注æï¼ids䏿¯officialIdï¼éè¦å¹é
formalDatabaseDataä¸çidåæ®µ |
| | | const rowsToSelect = formalDatabaseData.value.filter((row) => |
| | | ids.includes(row.id) |
| | | ); |
| | | if (rowsToSelect.length > 0) { |
| | | etableRef.value.setRowsSelection(rowsToSelect, true); |
| | | console.log("éä¸ç¶æè®¾ç½®å®æ"); |
| | | } else { |
| | | } |
| | | } catch (error) { |
| | | console.error("设置éä¸ç¶æå¤±è´¥:", error); |
| | | } |
| | | }, 150); |
| | | }); |
| | | }; |
| | | |
| | | const formalDatabaseData = ref([]); |
| | | const formalDatabaseSelectedData = ref([]); |
| | | formalDatabaseData.value = []; |
| | | // åå§å |
| | | // åå§ååç¼è¾åå§å |
| | | const Initialization = () => { |
| | | tableData.value = []; |
| | | detailsTableData.value = []; |
| | | copyForm.value = null; |
| | | dialogType.value = "add"; |
| | | }; |
| | | const copyForm = ref(null); |
| | | |
| | | const editInitialization = (data) => { |
| | | copyForm.value = { ...data }; // æ·±æ·è´æ°æ® |
| | | copyForm.value = deepClone(data); |
| | | tableData.value = data.productionInventoryList || []; |
| | | detailsTableData.value = data.productionList || []; |
| | | dialogType.value = "edit"; |
| | | |
| | | // 设置é»è®¤éä¸çIDï¼ä½¿ç¨officialIdæ¥å¹é
|
| | | const existingOfficialIds = tableData.value |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | |
| | | // çå¬å¯¹è¯æ¡ç¶æï¼å¨æå¼æ¶è®¾ç½®éä¸ç¶æ |
| | | watch(innerVisible, (newVal) => { |
| | | if (newVal && selectedIds.value.length > 0) { |
| | | console.log("å¯¹è¯æ¡æå¼ï¼è®¾ç½®éä¸ç¶æ"); |
| | | setTimeout(() => setTableSelection(selectedIds.value), 200); |
| | | } |
| | | // å¯¹è¯æ¡å
³éæ¶æ¸
ç©ºéæ©ç¶æ |
| | |
| | | .filter((id) => id); |
| | | selectedIds.value = allOfficialIds; |
| | | |
| | | console.log("æ´æ°åçè¡¨æ ¼æ°æ®:", tableData.value); |
| | | console.log("æ´æ°åçéä¸ID:", selectedIds.value); |
| | | |
| | | // å
³ééæ©å¯¹è¯æ¡ |
| | | innerVisible.value = false; |
| | | |
| | |
| | | const handleSelectionChange = (selection) => { |
| | | formalDatabaseSelectedData.value = selection; |
| | | }; |
| | | const handleReset = () => { |
| | | console.log(copyForm.value); |
| | | tableData.value = |
| | | JSON.parse(JSON.stringify(copyForm.value.productionInventoryList)) || []; |
| | | detailsTableData.value = |
| | | JSON.parse(JSON.stringify(copyForm.value.productionList)) || []; |
| | | }; |
| | | // æäº¤è¡¨å |
| | | // æäº¤è¡¨å - 使ç¨å·¥å
·å½æ°éªè¯ |
| | | const handleSubmit = async () => { |
| | | let data = { |
| | | // éªè¯ç产æç»æ°æ® |
| | | const detailsValidation = validateFormData(detailsTableData.value, [ |
| | | "coal", |
| | | "productionQuantity", |
| | | "laborCost", |
| | | "energyConsumptionCost", |
| | | "equipmentDepreciation", |
| | | "purchasePrice" |
| | | ]); |
| | | |
| | | if (!detailsValidation.isValid) { |
| | | ElMessage.warning(detailsValidation.message); |
| | | return; |
| | | } |
| | | |
| | | // éªè¯åºåä½¿ç¨æ°æ® |
| | | if (tableData.value.length === 0) { |
| | | ElMessage.warning("请添å ç产å å·¥æ°æ®"); |
| | | return; |
| | | } |
| | | |
| | | for (let i = 0; i < tableData.value.length; i++) { |
| | | const element = tableData.value[i]; |
| | | if (element.usedQuantity == 0 || element.usedQuantity === null) { |
| | | ElMessage.warning(`请填åä½¿ç¨æ°é: ${element.coal}`); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | try { |
| | | const data = { |
| | | ...copyForm.value, |
| | | productionList: detailsTableData.value, |
| | | productionInventoryList: tableData.value, |
| | | ...copyForm.value, |
| | | }; |
| | | let res = await addOrEditPM(data); |
| | | const res = await addOrEditPM(data); |
| | | if (res.code === 200) { |
| | | dialogVisible.value = false; |
| | | emit("success"); |
| | | } else { |
| | | ElMessage.error("æäº¤å¤±è´¥"); |
| | | } |
| | | } catch (error) { |
| | | ElMessage.error("æäº¤å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }; |
| | | |
| | | // å
³éå¼¹çª |
| | | const handleClose = () => { |
| | | dialogVisible.value = false; |
| | | formRef.value?.resetFields(); |
| | | Object.assign(formData, { |
| | | category: "", |
| | | unit: "", |
| | | productionVolume: 0, |
| | | laborCost: 0, |
| | | materialCost: 0, |
| | | equipmentCost: 0, |
| | | totalCost: 0, |
| | | totalPrice: 0, |
| | | profit: 0, |
| | | reviewer: "", |
| | | date: "", |
| | | }); |
| | | }; |
| | | |
| | | // æ·»å åå
æ ¼ç¼è¾å¤ç彿° |
| | | // ä½¿ç¨æ°ééªè¯ - 使ç¨å·¥å
·å½æ° |
| | | const handleCellEdit = (row, prop, value) => { |
| | | if (prop === "usedQuantity") { |
| | | const numValue = Number(value); |
| | | const inventory = Number(row.inventoryQuantity); |
| | | const validation = validateNumber(value, 0, Number(row.inventoryQuantity)); |
| | | |
| | | // éªè¯è¾å
¥å¼ |
| | | if (isNaN(numValue) || numValue < 0) { |
| | | ElMessage.warning("ä½¿ç¨æ°éå¿
é¡»æ¯éè´æ°ï¼"); |
| | | row.usedQuantity = 0; |
| | | if (!validation.isValid) { |
| | | ElMessage.warning(validation.message); |
| | | row.usedQuantity = validation.value; |
| | | return; |
| | | } |
| | | |
| | | if (numValue > inventory) { |
| | | ElMessage.warning(`ä½¿ç¨æ°éä¸è½å¤§äºåºåæ°éï¼${inventory}ï¼ï¼`); |
| | | row.usedQuantity = inventory; |
| | | return; |
| | | } |
| | | |
| | | // æ´æ°å¼ |
| | | row.usedQuantity = numValue; |
| | | console.log(`æ´æ° ${row.coal} çä½¿ç¨æ°é为: ${numValue}`); |
| | | row.usedQuantity = validation.value; |
| | | } |
| | | }; |
| | | |
| | | // å¤çç产æç»è¡¨æ ¼çæä½ |
| | | // å¤çç产æç»è¡¨æ ¼çæä½ - 使ç¨å·¥å
·å½æ° |
| | | const addNewRow = () => { |
| | | detailsTableData.value.push({ |
| | | coal: "", |
| | | productionQuantity: "", |
| | | laborCost: "", |
| | | energyConsumptionCost: "", |
| | | equipmentDepreciation: "", |
| | | purchasePrice: "", |
| | | autoCalculate: "0.00", |
| | | producer: "", |
| | | const newRow = createDefaultProductionRow(userInfo); |
| | | detailsTableData.value.push(newRow); |
| | | }; |
| | | |
| | | // éç½®æ°æ® - ä½¿ç¨æ·±æ·è´ |
| | | const handleReset = () => { |
| | | if (copyForm.value) { |
| | | tableData.value = deepClone(copyForm.value.productionInventoryList) || []; |
| | | detailsTableData.value = deepClone(copyForm.value.productionList) || []; |
| | | } |
| | | }; |
| | | |
| | | // è·åç¨æ·ä¿¡æ¯ |
| | | onMounted(async () => { |
| | | try { |
| | | userInfo = await userStore.getInfo(); |
| | | } catch (error) { |
| | | ElMessage.error("è·åç¨æ·ä¿¡æ¯å¤±è´¥ï¼è¯·éè¯"); |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | const clearAllRows = () => { |
| | | detailsTableData.value = []; |
| | | ElMessage.success("å·²æ¸
ç©ºæææ°æ®"); |
| | | }; |
| | | |
| | | // ç®åçäºä»¶å¤ç彿° |
| | | const handleDetailsChange = (data) => { |
| | | console.log("ç产æç»æ°æ®åå:", data); |
| | | }; |
| | | |
| | | const handleDeleteRow = (index) => { |
| | |
| | | |
| | | // å é¤åä¸ªå·²éæ°æ®é¡¹ |
| | | const handleRemoveItem = (row) => { |
| | | console.log("å é¤é¡¹:", row); |
| | | const index = tableData.value.findIndex( |
| | | (item) => item.officialId === row.officialId |
| | | ); |
| | |
| | | .map((item) => item.officialId) |
| | | .filter((id) => id); |
| | | selectedIds.value = updatedOfficialIds; |
| | | |
| | | console.log("å é¤åçè¡¨æ ¼æ°æ®:", tableData.value); |
| | | console.log("æ´æ°åçéä¸ID:", selectedIds.value); |
| | | |
| | | ElMessage.success("å·²å é¤éä¸é¡¹"); |
| | | } |
| | | }; |
| | |
| | | ElMessage.warning("没æå¯æ¸
ç©ºçæ°æ®"); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm("确认æ¸
空ææå·²éæ©çæ°æ®åï¼", "è¦å", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | .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 = []; |
| | | console.log("å·²æ¸
空ææå·²éæ°æ®"); |
| | | ElMessage.success("å·²æ¸
ç©ºæææ°æ®"); |
| | | }) |
| | | .catch(() => { |
| | | console.log("åæ¶æ¸
空æä½"); |
| | | }); |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | // è®¡ç®æ»ä½¿ç¨é |
¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * ç
¤ç§æ°æ®ç®¡çç»åå¼å½æ° |
| | | * æä¾ç
¤ç§æ°æ®çè·åãç¼åã转æ¢çåè½ |
| | | */ |
| | | import { ref, computed, watch } from 'vue'; |
| | | import { getCoalFieldList } from '@/api/basicInformation/coalQualityMaintenance'; |
| | | import { ElMessage } from 'element-plus'; |
| | | |
| | | // å
¨å±ç
¤ç§æ°æ®ç¼å |
| | | const coalData = ref([]); |
| | | const isLoading = ref(false); |
| | | 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); |
| | | } |
| | | }); |
| | | }); |
| | | } |
| | | |
| | | isLoading.value = true; |
| | | try { |
| | | const res = await getCoalFieldList(); |
| | | 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 getCoalNameById = (id) => { |
| | | if (!id || coalData.value.length === 0) return id; |
| | | const coal = coalData.value.find(item => item.id == id); |
| | | return coal ? coal.fieldName : id; |
| | | }; |
| | | |
| | | // æ ¹æ®åç§°è·åç
¤ç§ID |
| | | const getCoalIdByName = (name) => { |
| | | if (!name || coalData.value.length === 0) return ''; |
| | | const coal = coalData.value.find(item => item.fieldName === name); |
| | | return coal ? coal.id : ''; |
| | | }; |
| | | |
| | | // çæä¸æé项 |
| | | const coalOptions = computed(() => { |
| | | return coalData.value.map(item => ({ |
| | | label: item.fieldName, |
| | | value: item.fieldName, |
| | | key: item.id |
| | | })); |
| | | }); |
| | | |
| | | // çækey-valueæ å° |
| | | const coalMap = computed(() => { |
| | | const map = {}; |
| | | coalData.value.forEach(item => { |
| | | map[item.id] = item.fieldName; |
| | | }); |
| | | return map; |
| | | }); |
| | | |
| | | return { |
| | | coalData: computed(() => coalData.value), |
| | | coalOptions, |
| | | coalMap, |
| | | isLoading: computed(() => isLoading.value), |
| | | isLoaded: computed(() => isLoaded.value), |
| | | getCoalData, |
| | | getCoalNameById, |
| | | getCoalIdByName |
| | | }; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * å¯¹è¯æ¡ç®¡çç»åå¼å½æ° |
| | | * æä¾å¯¹è¯æ¡çæå¼ãå
³éãæ°æ®å¤ççåè½ |
| | | */ |
| | | import { ref } from 'vue'; |
| | | |
| | | export function useDialog() { |
| | | 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 closeDialog = () => { |
| | | dialogVisible.value = false; |
| | | dialogType.value = 'add'; |
| | | currentRowData.value = null; |
| | | }; |
| | | |
| | | // å¯¹è¯æ¡æååè° |
| | | 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'; |
| | | |
| | | export function useTableData(apiFunction, options = {}) { |
| | | const { |
| | | pageSize = 10, |
| | | searchField = 'searchAll' |
| | | } = options; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const tableData = ref([]); |
| | | const loading = ref(false); |
| | | const total = ref(0); |
| | | const selectedRows = ref([]); |
| | | |
| | | // æ¥è¯¢åæ° |
| | | 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, |
| | | page: queryParams.current, |
| | | pageSize: queryParams.size, |
| | | pageNum: queryParams.current, |
| | | limit: queryParams.size, |
| | | offset: (queryParams.current - 1) * queryParams.size |
| | | }; |
| | | |
| | | 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] = ''; |
| | | 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 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-button type="success" :icon="Plus" @click="openDialog('add')"> |
| | | æ°å¢å å·¥ |
| | | </el-button> |
| | | <el-button type="danger" :icon="Delete" :disabled="!selectedRows.length"> |
| | | <el-button type="danger" :icon="Delete" :disabled="!selectedRows.length" @click="() => deleteSelected(delPM)"> |
| | | å é¤ |
| | | </el-button> |
| | | </div> |
| | | |
| | | <!-- æ°æ®è¡¨æ ¼ --> |
| | | </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 }"> |
| | | > <template #coal="{ row }"> |
| | | <div class="coal-tags"> |
| | | <el-tag v-for="coal in parseCoalArray(row.coal)" :key="coal" size="small"> |
| | | {{ coal }} |
| | | {{ getCoalNameById(coal) }} |
| | | </el-tag> |
| | | <span v-if="!row.coal">--</span> |
| | | </div> |
| | | </template> |
| | | </ETable> |
| | | |
| | | <!-- å页ç»ä»¶ --> |
| | | </ETable> <!-- å页ç»ä»¶ --> |
| | | <Pagination |
| | | :layout="'total, prev, pager, next, jumper'" |
| | | :total="total" |
| | | :page="queryParams.current" |
| | | 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" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | 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 } from "@/api/production"; |
| | | 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: "producer", label: "ç产人", minWidth: 150 }, |
| | | ]; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const tableData = ref([]); |
| | | const loading = ref(false); |
| | | const total = ref(0); |
| | | const selectedRows = ref([]); |
| | | const dialogVisible = ref(false); |
| | | const dialogType = ref("add"); |
| | | const dialogRef = ref(null); |
| | | // 使ç¨è¡¨æ ¼æ°æ®ç»åå¼å½æ° |
| | | const { |
| | | tableData, |
| | | loading, |
| | | total, |
| | | selectedRows, |
| | | queryParams, |
| | | getList, |
| | | handleSearch, |
| | | handleReset, |
| | | handlePageChange, |
| | | handleSelectionChange, |
| | | deleteSelected |
| | | } = useTableData(getProductionMasterList, { pageSize: 10 }); |
| | | |
| | | // æ¥è¯¢åæ° |
| | | const queryParams = reactive({ |
| | | searchAll: "", |
| | | current: 1, |
| | | size: 10, |
| | | }); |
| | | // 使ç¨å¯¹è¯æ¡ç»åå¼å½æ° |
| | | const { |
| | | dialogVisible, |
| | | dialogType, |
| | | dialogRef, |
| | | openDialog, |
| | | handleDialogSuccess: onDialogSuccess |
| | | } = useDialog(); |
| | | |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | const getList = async () => { |
| | | loading.value = true; |
| | | try { |
| | | // æå»ºæ£ç¡®çå页忰 |
| | | const params = { |
| | | searchAll: queryParams.searchAll, |
| | | // å°è¯å¤ç§å¸¸è§çåé¡µåæ°æ ¼å¼ |
| | | current: queryParams.current, |
| | | size: queryParams.size, |
| | | page: queryParams.current, |
| | | pageSize: queryParams.size, |
| | | pageNum: queryParams.current, |
| | | limit: queryParams.size, |
| | | offset: (queryParams.current - 1) * queryParams.size |
| | | }; |
| | | // 使ç¨ç
¤ç§æ°æ®ç»åå¼å½æ° |
| | | const { getCoalNameById, getCoalData } = useCoalData(); |
| | | |
| | | console.log('åéå页忰:', params); |
| | | console.log(`第${queryParams.current}页åºè¯¥æ¾ç¤ºç¬¬${(queryParams.current - 1) * queryParams.size + 1}-${queryParams.current * queryParams.size}æ¡æ°æ®`); |
| | | |
| | | const res = await getProductionMasterList(params); |
| | | tableData.value = res.data.records || []; |
| | | total.value = res.data.total || 0; |
| | | |
| | | console.log('æ¥æ¶å°çæ°æ®:', { |
| | | å½å页: queryParams.current, |
| | | è¿åæ¡æ°: tableData.value.length, |
| | | æ»æ¡æ°: total.value |
| | | }); |
| | | } catch (error) { |
| | | ElMessage.error("è·åæ°æ®å¤±è´¥"); |
| | | console.error('APIé误:', error); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | }; |
| | | |
| | | // æç´¢åéç½® |
| | | const handleSearch = () => { |
| | | queryParams.current = 1; |
| | | getList(); |
| | | }; |
| | | |
| | | const handleReset = () => { |
| | | queryParams.searchAll = ""; |
| | | handleSearch(); |
| | | }; |
| | | |
| | | // å页å¤ç |
| | | const handlePageChange = ({ page }) => { |
| | | queryParams.current = page; |
| | | getList(); |
| | | }; |
| | | |
| | | // è¡¨æ ¼éæ©å¤ç |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | |
| | | // æå¼å¯¹è¯æ¡ - ç»ä¸å¤çæ°å¢åç¼è¾ |
| | | const openDialog = (type, row = null) => { |
| | | dialogType.value = type; |
| | | dialogVisible.value = true; |
| | | |
| | | if (type === 'add') { |
| | | dialogRef.value?.Initialization(); |
| | | } else if (type === 'edit' && row) { |
| | | dialogRef.value?.editInitialization({ ...row }); |
| | | // å¤ççäº§æ°æ®æ´æ° |
| | | const handleProductionAndProcessing = (row, rows) => { |
| | | const index = tableData.value.findIndex(item => item.id === rows.id); |
| | | if (index !== -1) { |
| | | tableData.value[index] = { ...tableData.value[index], ...row }; |
| | | } |
| | | }; |
| | | |
| | | // å¯¹è¯æ¡æååè° |
| | | const handleDialogSuccess = () => { |
| | | onDialogSuccess(() => { |
| | | getList(); |
| | | ElMessage.success("æä½æå"); |
| | | }); |
| | | }; |
| | | |
| | | // è§£æç
¤ç§æ°ç» - ç®åé»è¾ |
| | | const parseCoalArray = (coalString) => { |
| | | if (!coalString) return []; |
| | | |
| | | if (Array.isArray(coalString)) return coalString; |
| | | |
| | | return String(coalString) |
| | | .replace(/^\[|\]$/g, '') |
| | | .split(',') |
| | | .map(item => item.trim()) |
| | | .filter(Boolean); |
| | | }; |
| | | |
| | | // ç»ä»¶æè½½æ¶å è½½æ°æ® |
| | | onMounted(getList); |
| | | onMounted(async () => { |
| | | await getCoalData(); // é¢å è½½ç
¤ç§æ°æ® |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped lang="scss"> |