| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">å±é©æºåç§°ï¼</span> |
| | | <el-input v-model="searchForm.name" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥å±é©æºåç§°æç´¢" |
| | | @change="handleQuery" |
| | | clearable |
| | | :prefix-icon="Search" /> |
| | | <span class="search_title ml10">å±é©æºç±»åï¼</span> |
| | | <el-select v-model="searchForm.type" |
| | | clearable |
| | | @change="handleQuery" |
| | | style="width: 240px"> |
| | | <el-option v-for="item in knowledgeTypeOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" /> |
| | | </el-select> |
| | | <el-button type="primary" |
| | | @click="handleQuery" |
| | | style="margin-left: 10px"> |
| | | æç´¢ |
| | | </el-button> |
| | | </div> |
| | | <div> |
| | | <el-button type="primary" |
| | | @click="openForm('add')">å»é¢ç¨</el-button> |
| | | <el-button type="danger" |
| | | plain |
| | | @click="handleDelete">å é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <PIMTable rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :page="page" |
| | | :isSelection="true" |
| | | @selection-change="handleSelectionChange" |
| | | :tableLoading="tableLoading" |
| | | @pagination="pagination1" |
| | | :total="page.total"></PIMTable> |
| | | </div> |
| | | <!-- æ°å¢/ç¼è¾ç¥è¯å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" |
| | | :title="dialogTitle" |
| | | width="800px" |
| | | :close-on-click-modal="false"> |
| | | <el-form ref="formRef" |
| | | v-if="dialogType === 'add'" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å±é©æº" |
| | | prop="safeHazardId"> |
| | | <el-input v-model="valueItem.name" |
| | | readonly |
| | | @click="openSafeHazardSelect" |
| | | placeholder="è¯·éæ©å±é©æº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æå¨ä½ç½®" |
| | | prop="location"> |
| | | <el-input v-model="valueItem.location" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å±é©æºç±»å" |
| | | prop="type"> |
| | | <el-input v-model="valueItem.type" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é£é©ç级" |
| | | prop="riskLevel"> |
| | | <el-input v-model="valueItem.riskLevel" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºåæ°é" |
| | | prop="stockQty"> |
| | | <el-input v-model="valueItem.stockQty" |
| | | disabled |
| | | placeholder="èªå¨å¸¦åº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¢ç¨ç¨é" |
| | | prop="applyPurpose"> |
| | | <el-input v-model="form.applyPurpose" |
| | | placeholder="请è¾å
¥é¢ç¨ç¨é" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¢ç¨æ°é" |
| | | prop="applyQty"> |
| | | <el-input v-model="form.applyQty" |
| | | type="number" |
| | | min="0" |
| | | @input="handleApplyQtyChange" |
| | | placeholder="请è¾å
¥é¢ç¨æ°é" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¢ç¨äºº" |
| | | prop="applyUserId"> |
| | | <el-select v-model="form.applyUserId" |
| | | disabled |
| | | placeholder="è¯·éæ©" |
| | | clearable> |
| | | <el-option v-for="item in userList" |
| | | :key="item.userId" |
| | | :label="item.nickName" |
| | | :value="item.userId" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¢ç¨æ¶é´" |
| | | prop="applyTime"> |
| | | <el-date-picker style="width: 100%" |
| | | disabled |
| | | v-model="form.applyTime" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="è¯·éæ©" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <el-descriptions :column="2" |
| | | style="margin-bottom: 20px" |
| | | v-if="dialogType === 'edit' || dialogType === 'view'" |
| | | border> |
| | | <el-descriptions-item label="å±é©æºç¼ç "> |
| | | <span>{{ form.code }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å±é©æºåç§°"> |
| | | <span>{{ form.name }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="å±é©æºç±»å"> |
| | | <span>{{ getTypeLabel(form.type) }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="æå¨ä½ç½®"> |
| | | <span>{{ form.location }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é£é©ç级"> |
| | | <el-tag :type="getTypeTagType(form.riskLevel)"> |
| | | {{ form.riskLevel }} |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é¢ç¨ç¨é"> |
| | | <span>{{ form.applyPurpose }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é¢ç¨æ¶é´"> |
| | | <span>{{ form.applyTime }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é¢ç¨æ°é"> |
| | | <span>{{ form.applyQty }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="é¢ç¨äºº"> |
| | | <span>{{ form.applyUserName }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item v-if="dialogType === 'view' && form.returnUserId" |
| | | label="å½è¿äºº"> |
| | | <span>{{ form.returnUserName }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item v-if="dialogType === 'view' && form.returnTime" |
| | | label="å½è¿æ¶é´"> |
| | | <span>{{ form.returnTime }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item v-if="dialogType === 'view' && form.returnUserId" |
| | | label="å½è¿æ
åµè¯´æ"> |
| | | <span>{{ form.returnRemark }}</span> |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <el-form ref="formRef1" |
| | | v-if="dialogType === 'edit'" |
| | | :model="form" |
| | | :rules="rules1" |
| | | label-width="120px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½è¿äºº" |
| | | prop="returnUserId"> |
| | | <el-select v-model="form.returnUserId" |
| | | disabled |
| | | placeholder="è¯·éæ©" |
| | | clearable> |
| | | <el-option v-for="item in userList" |
| | | :key="item.userId" |
| | | :label="item.nickName" |
| | | :value="item.userId" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½è¿æ¶é´" |
| | | prop="returnTime"> |
| | | <el-date-picker style="width: 100%" |
| | | disabled |
| | | v-model="form.returnTime" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="è¯·éæ©" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="å½è¿æ
åµè¯´æ" |
| | | prop="applyPurpose"> |
| | | <el-input v-model="form.returnRemark" |
| | | type="textarea" |
| | | :rows="4" |
| | | placeholder="请è¾å
¥å½è¿æ
åµè¯´æ" /> |
| | | </el-form-item> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" |
| | | @click="submitForm">ç¡®å®</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- å±é©æºéæ©å¼¹çª --> |
| | | <el-dialog v-model="safeHazardSelectVisible" |
| | | title="éæ©å±é©æº" |
| | | width="800px" |
| | | :close-on-click-modal="false"> |
| | | <div> |
| | | <el-table :data="safeHazardList" |
| | | border |
| | | v-loading="safeHazardLoading" |
| | | style="width: 100%" |
| | | @row-click="handleSafeHazardSelect"> |
| | | <el-table-column prop="code" |
| | | label="å±é©æºç¼ç " |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column prop="name" |
| | | label="å±é©æºåç§°" |
| | | show-overflow-tooltip /> |
| | | <el-table-column prop="type" |
| | | label="å±é©æºç±»å" |
| | | width="120" |
| | | show-overflow-tooltip> |
| | | <template #default="scope"> |
| | | {{ getTypeLabel(scope.row.type) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="location" |
| | | label="æå¨ä½ç½®" |
| | | width="180" |
| | | show-overflow-tooltip /> |
| | | <el-table-column prop="riskLevel" |
| | | label="é£é©ç级" |
| | | width="100"> |
| | | <template #default="scope"> |
| | | <el-tag :type="getTypeTagType(scope.row.riskLevel)"> |
| | | {{ scope.row.riskLevel }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column prop="stockQty" |
| | | label="åºåæ°é" |
| | | width="100" /> |
| | | </el-table> |
| | | <pagination :total="safeHazardPage.total" |
| | | style="margin-top: 20px" |
| | | layout="total, sizes, prev, pager, next, jumper" |
| | | :page="safeHazardPage.current" |
| | | :limit="safeHazardPage.size" |
| | | @pagination="safeHazardPagination" /> |
| | | </div> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="safeHazardSelectVisible = false">åæ¶</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { Search } from "@element-plus/icons-vue"; |
| | | import { |
| | | onMounted, |
| | | ref, |
| | | reactive, |
| | | toRefs, |
| | | getCurrentInstance, |
| | | computed, |
| | | } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue"; |
| | | import pagination from "@/components/PIMTable/Pagination.vue"; |
| | | import { userListNoPage } from "@/api/system/user.js"; |
| | | import { safeHazardListPage } from "@/api/safeProduction/hazardSourceLedger.js"; |
| | | import { |
| | | safeHazardRecordListPage, |
| | | safeHazardRecordDel, |
| | | safeHazardRecordAdd, |
| | | safeHazardRecordUpdate, |
| | | } from "@/api/safeProduction/hazardousMaterialsControl.js"; |
| | | import dayjs from "dayjs"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | const userStore = useUserStore(); |
| | | // 表åéªè¯è§å |
| | | const rules = { |
| | | applyPurpose: [ |
| | | { required: true, message: "请è¾å
¥é¢ç¨ç¨é", trigger: "blur" }, |
| | | ], |
| | | applyQty: [{ required: true, message: "请è¾å
¥é¢ç¨æ°é", trigger: "blur" }], |
| | | safeHazardId: [ |
| | | { required: true, message: "è¯·éæ©å±é©æº", trigger: "change" }, |
| | | ], |
| | | }; |
| | | const rules1 = { |
| | | returnRemark: [ |
| | | { required: true, message: "请è¾å
¥å½è¿æ
åµè¯´æ", trigger: "blur" }, |
| | | ], |
| | | }; |
| | | // ååºå¼æ°æ® |
| | | const data = reactive({ |
| | | searchForm: { |
| | | name: "", |
| | | type: "", |
| | | }, |
| | | tableLoading: false, |
| | | page: { |
| | | current: 1, |
| | | size: 20, |
| | | total: 0, |
| | | }, |
| | | tableData: [], |
| | | selectedIds: [], |
| | | form: { |
| | | applyPurpose: "", // é¢ç¨ç¨é |
| | | applyTime: "", // é¢ç¨æ¶é´ |
| | | applyQty: "", // é¢ç¨æ°é |
| | | applyUserId: "", // é¢ç¨äººID |
| | | safeHazardId: "", // å±é©æºID |
| | | }, |
| | | dialogVisible: false, |
| | | dialogTitle: "", |
| | | dialogType: "add", |
| | | viewDialogVisible: false, |
| | | currentKnowledge: {}, |
| | | safeHazardSelectVisible: false, |
| | | safeHazardList: [], |
| | | safeHazardLoading: false, |
| | | safeHazardPage: { |
| | | current: 1, |
| | | size: 10, |
| | | total: 0, |
| | | }, |
| | | }); |
| | | |
| | | const { |
| | | searchForm, |
| | | tableLoading, |
| | | page, |
| | | tableData, |
| | | selectedIds, |
| | | form, |
| | | dialogVisible, |
| | | dialogTitle, |
| | | dialogType, |
| | | viewDialogVisible, |
| | | currentKnowledge, |
| | | safeHazardSelectVisible, |
| | | safeHazardList, |
| | | safeHazardLoading, |
| | | safeHazardPage, |
| | | } = toRefs(data); |
| | | const valueItem = ref({}); |
| | | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(); |
| | | const formRef1 = ref(); |
| | | const riskLevelOptions = ref([ |
| | | { value: "ä½é£é©", label: "ä½é£é©" }, |
| | | { value: "ä¸è¬é£é©", label: "ä¸è¬é£é©" }, |
| | | { value: "è¾å¤§é£é©", label: "è¾å¤§é£é©" }, |
| | | { value: "é大é£é©", label: "é大é£é©" }, |
| | | ]); |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const tableColumn = ref([ |
| | | { |
| | | label: "å±é©æºç¼ç ", |
| | | prop: "code", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å±é©æºåç§°", |
| | | prop: "name", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å±é©æºç±»å", |
| | | prop: "type", |
| | | showOverflowTooltip: true, |
| | | formatData: params => { |
| | | return getTypeLabel(params); |
| | | }, |
| | | }, |
| | | { |
| | | label: "é£é©ç级", |
| | | prop: "riskLevel", |
| | | showOverflowTooltip: true, |
| | | dataType: "tag", |
| | | formatType: params => { |
| | | const typeMap = { |
| | | ä½é£é©: "info", |
| | | ä¸è¬é£é©: "info", |
| | | è¾å¤§é£é©: "warning", |
| | | é大é£é©: "danger", |
| | | }; |
| | | return typeMap[params] || "info"; |
| | | }, |
| | | }, |
| | | { |
| | | label: "é¢ç¨ç¨é", |
| | | prop: "applyPurpose", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "é¢ç¨æ¶é´", |
| | | prop: "applyTime", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "é¢ç¨æ°é", |
| | | prop: "applyQty", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å½è¿æ¶é´", |
| | | prop: "returnTime", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å½è¿äºº", |
| | | prop: "returnUserName", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "å½è¿æ
åµè¯´æ", |
| | | prop: "returnRemark", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "æå¨ä½ç½®", |
| | | prop: "location", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "åå·", |
| | | prop: "materialRecordCode", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 200, |
| | | operation: [ |
| | | { |
| | | name: "å½è¿", |
| | | type: "text", |
| | | clickFun: row => { |
| | | openForm("edit", row); |
| | | }, |
| | | disabled: row => row.returnUserId, |
| | | }, |
| | | { |
| | | name: "æ¥ç", |
| | | type: "text", |
| | | clickFun: row => { |
| | | openForm("view", row); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ]); |
| | | const userList = ref([]); |
| | | // çå½å¨æ |
| | | onMounted(() => { |
| | | getCurrentFactoryName(); |
| | | getList(); |
| | | startAutoRefresh(); |
| | | userListNoPage().then(res => { |
| | | userList.value = res.data; |
| | | }); |
| | | }); |
| | | const currentUserId = ref(""); |
| | | const currentUserName = ref(""); |
| | | const getCurrentFactoryName = async () => { |
| | | let res = await userStore.getInfo(); |
| | | currentUserId.value = res.user.userId; |
| | | currentUserName.value = res.user.nickName; |
| | | }; |
| | | |
| | | // å¤çç¨æ·éæ©åå |
| | | const handleUserChange = userId => { |
| | | const selectedUser = userList.value.find(user => user.userId === userId); |
| | | if (selectedUser) { |
| | | form.value.principalUser = selectedUser.nickName; |
| | | form.value.principalMobile = selectedUser.phonenumber; |
| | | } |
| | | }; |
| | | const handleApplyQtyChange = () => { |
| | | if (form.value.applyQty > valueItem.value.stockQty) { |
| | | ElMessage.error("é¢ç¨æ°éä¸è½å¤§äºåºåæ°é"); |
| | | form.value.applyQty = ""; |
| | | } |
| | | }; |
| | | |
| | | // å¼å§èªå¨å·æ° |
| | | const startAutoRefresh = () => { |
| | | setInterval(() => { |
| | | getList(); |
| | | }, 600000); // 10åéå·æ°ä¸æ¬¡ (10 * 60 * 1000 = 600000ms) |
| | | }; |
| | | |
| | | // æ¥è¯¢æ°æ® |
| | | const handleQuery = () => { |
| | | page.value.current = 1; |
| | | getList(); |
| | | }; |
| | | |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | safeHazardRecordListPage({ ...page.value, ...searchForm.value }) |
| | | .then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | page.value.total = res.data.total; |
| | | }) |
| | | .catch(err => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }; |
| | | const openSafeHazardSelect = async () => { |
| | | await fetchSafeHazardList(); |
| | | safeHazardSelectVisible.value = true; |
| | | }; |
| | | |
| | | const fetchSafeHazardList = () => { |
| | | safeHazardLoading.value = true; |
| | | return safeHazardListPage({ |
| | | page: safeHazardPage.value.current, |
| | | size: safeHazardPage.value.size, |
| | | }) |
| | | .then(res => { |
| | | safeHazardList.value = res.data.records; |
| | | safeHazardPage.value.total = res.data.total; |
| | | }) |
| | | .finally(() => { |
| | | safeHazardLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | const handleSafeHazardSelect = item => { |
| | | valueItem.value = { |
| | | ...item, |
| | | }; |
| | | valueItem.value.type = getTypeLabel(valueItem.value.type); |
| | | form.value.safeHazardId = item.id; |
| | | safeHazardSelectVisible.value = false; |
| | | }; |
| | | |
| | | const safeHazardPagination = obj => { |
| | | safeHazardPage.value.current = obj.page; |
| | | safeHazardPage.value.size = obj.limit; |
| | | fetchSafeHazardList(); |
| | | }; |
| | | |
| | | // å页å¤ç |
| | | const pagination1 = obj => { |
| | | page.value.current = obj.page; |
| | | page.value.size = obj.limit; |
| | | handleQuery(); |
| | | }; |
| | | |
| | | // éæ©ååå¤ç |
| | | const handleSelectionChange = selection => { |
| | | selectedIds.value = selection.map(item => item.id); |
| | | }; |
| | | |
| | | // æå¼è¡¨å |
| | | const openForm = (type, row = null) => { |
| | | dialogType.value = type; |
| | | if (type === "add") { |
| | | dialogTitle.value = "é¢ç¨å±é©æº"; |
| | | // é置表å |
| | | form.value = {}; |
| | | Object.assign(form.value, { |
| | | applyPurpose: "", // é¢ç¨ç¨é |
| | | applyTime: dayjs().format("YYYY-MM-DD"), // é¢ç¨æ¶é´ |
| | | applyQty: "", // é¢ç¨æ°é |
| | | applyUserId: currentUserId.value, // é¢ç¨äººID |
| | | safeHazardId: "", // å±é©æºID |
| | | }); |
| | | valueItem.value = {}; |
| | | } else if (type === "edit" && row) { |
| | | dialogTitle.value = "å½è¿"; |
| | | Object.assign(form.value, { |
| | | id: row.id, // 主é®ID |
| | | materialRecordCode: row.materialRecordCode, // åå· |
| | | applyPurpose: row.applyPurpose, // é¢ç¨ç¨é |
| | | applyTime: row.applyTime, // é¢ç¨æ¶é´ |
| | | applyQty: row.applyQty, // é¢ç¨æ°é |
| | | applyUserId: row.applyUserId, // é¢ç¨äººID |
| | | safeHazardId: row.safeHazardId, // å±é©æºID |
| | | applyUserName: row.applyUserName, // é¢ç¨äººå§å |
| | | code: row.code, // å±é©æºç¼ç |
| | | name: row.name, // å±é©æºåç§° |
| | | type: row.type, // å±é©æºç±»å |
| | | location: row.location, // æå¨ä½ç½® |
| | | riskLevel: row.riskLevel, // é£é©ç级 |
| | | type: row.type, // å±é©æºç±»å |
| | | returnTime: dayjs().format("YYYY-MM-DD"), // å½è¿æ¶é´ |
| | | returnUserName: "", // å½è¿äººå§å |
| | | returnUserId: currentUserId.value, // å½è¿äººID |
| | | returnRemark: "", // å½è¿æ
åµè¯´æ |
| | | }); |
| | | } else if (type === "view") { |
| | | dialogTitle.value = "æ¥ç"; |
| | | form.value = { ...row }; |
| | | } |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // æ¥çå±é©æºè¯¦æ
|
| | | const viewKnowledge = row => { |
| | | currentKnowledge.value = { ...row }; |
| | | viewDialogVisible.value = true; |
| | | }; |
| | | |
| | | // è·åç±»åæ ç¾ç±»å |
| | | const getTypeTagType = type => { |
| | | const typeMap = { |
| | | è¾å¤§é£é©: "warning", |
| | | ä½é£é©: "info", |
| | | ä¸è¬é£é©: "info", |
| | | é大é£é©: "danger", |
| | | }; |
| | | return typeMap[type] || "info"; |
| | | }; |
| | | |
| | | // è·åç±»åæ ç¾ææ¬ |
| | | const getTypeLabel = type => { |
| | | return getKnowledgeTypeLabel(type); |
| | | }; |
| | | |
| | | // è·åæçæ ç¾ç±»å |
| | | const getEfficiencyTagType = efficiency => { |
| | | const typeMap = { |
| | | high: "success", |
| | | medium: "warning", |
| | | low: "info", |
| | | }; |
| | | return typeMap[efficiency] || "info"; |
| | | }; |
| | | |
| | | // è·åæçæ ç¾ææ¬ |
| | | const getEfficiencyLabel = efficiency => { |
| | | const efficiencyMap = { |
| | | high: "æ¾èæå", |
| | | medium: "ä¸è¬æå", |
| | | low: "轻微æå", |
| | | }; |
| | | return efficiencyMap[efficiency] || efficiency; |
| | | }; |
| | | |
| | | // è·åæçæåç¾åæ¯ |
| | | const getEfficiencyScore = efficiency => { |
| | | const scoreMap = { |
| | | high: 40, |
| | | medium: 25, |
| | | low: 15, |
| | | }; |
| | | return scoreMap[efficiency] || 0; |
| | | }; |
| | | |
| | | // è·åå¹³åèçæ¶é´ |
| | | const getTimeSaved = efficiency => { |
| | | const timeMap = { |
| | | high: "2-3天", |
| | | medium: "1-2天", |
| | | low: "0.5-1天", |
| | | }; |
| | | return timeMap[efficiency] || "æªç¥"; |
| | | }; |
| | | |
| | | // æäº¤å±é©æºè¡¨å |
| | | const submitForm = async () => { |
| | | try { |
| | | if (dialogType.value === "add") { |
| | | await formRef.value.validate(); |
| | | safeHazardRecordAdd({ ...form.value }) |
| | | .then(res => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("æ·»å æå"); |
| | | dialogVisible.value = false; |
| | | getList(); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }); |
| | | } else { |
| | | await formRef1.value.validate(); |
| | | safeHazardRecordUpdate({ ...form.value }) |
| | | .then(res => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("æ´æ°æå"); |
| | | dialogVisible.value = false; |
| | | getList(); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }); |
| | | } |
| | | } catch (error) { |
| | | console.error("表åéªè¯å¤±è´¥:", error); |
| | | } |
| | | }; |
| | | |
| | | // å é¤å±é©æºè®°å½ |
| | | const handleDelete = () => { |
| | | if (selectedIds.value.length === 0) { |
| | | ElMessage.warning("è¯·éæ©è¦å é¤çè®°å½"); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼", "å é¤", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | // console.log(selectedIds.value); |
| | | safeHazardRecordDel(selectedIds.value).then(res => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("å 餿å"); |
| | | selectedIds.value = []; |
| | | getList(); |
| | | } |
| | | }); |
| | | }) |
| | | .catch(() => { |
| | | // ç¨æ·åæ¶ |
| | | }); |
| | | }; |
| | | |
| | | // å¯¼åº |
| | | const { proxy } = getCurrentInstance(); |
| | | const { hazard_source_type } = proxy.useDict("hazard_source_type"); |
| | | |
| | | // åå
¸å·¥å
· |
| | | const knowledgeTypeOptions = computed(() => hazard_source_type?.value || []); |
| | | const getKnowledgeTypeLabel = val => { |
| | | const item = knowledgeTypeOptions.value.find( |
| | | i => String(i.value) === String(val) |
| | | ); |
| | | return item ? item.label : val; |
| | | }; |
| | | const getKnowledgeTypeTagType = val => { |
| | | const item = knowledgeTypeOptions.value.find( |
| | | i => String(i.value) === String(val) |
| | | ); |
| | | return item?.elTagType || "info"; |
| | | }; |
| | | const handleExport = () => { |
| | | proxy.download( |
| | | "/knowledgeBase/export", |
| | | { ...searchForm.value }, |
| | | "ç¥è¯åº.xlsx" |
| | | ); |
| | | }; |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .auto-refresh-info { |
| | | margin-bottom: 15px; |
| | | } |
| | | |
| | | .auto-refresh-info .el-alert { |
| | | border-radius: 8px; |
| | | } |
| | | |
| | | .dialog-footer { |
| | | text-align: right; |
| | | } |
| | | |
| | | .knowledge-detail { |
| | | padding: 20px 0; |
| | | } |
| | | |
| | | .detail-title { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | color: #303133; |
| | | } |
| | | |
| | | .detail-section { |
| | | margin-top: 24px; |
| | | } |
| | | |
| | | .detail-section h4 { |
| | | margin: 0 0 12px 0; |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | color: #303133; |
| | | border-left: 4px solid #409eff; |
| | | padding-left: 12px; |
| | | } |
| | | |
| | | .detail-content { |
| | | background: #f8f9fa; |
| | | padding: 16px; |
| | | border-radius: 6px; |
| | | line-height: 1.6; |
| | | color: #606266; |
| | | white-space: pre-wrap; |
| | | } |
| | | |
| | | .key-points { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 8px; |
| | | } |
| | | |
| | | .usage-stats { |
| | | margin-top: 16px; |
| | | } |
| | | |
| | | .stat-item { |
| | | text-align: center; |
| | | padding: 20px; |
| | | background: #f8f9fa; |
| | | border-radius: 8px; |
| | | } |
| | | |
| | | .stat-number { |
| | | font-size: 24px; |
| | | font-weight: bold; |
| | | color: #409eff; |
| | | margin-bottom: 8px; |
| | | } |
| | | |
| | | .stat-label { |
| | | font-size: 14px; |
| | | color: #909399; |
| | | } |
| | | |
| | | :deep(.danger-row td) { |
| | | color: #e95a66 !important; |
| | | } |
| | | </style> |