| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">äºæ
åç§°ï¼</span> |
| | | <el-input v-model="searchForm.accidentName" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥äºæ
åç§°æç´¢" |
| | | @change="handleQuery" |
| | | clearable |
| | | :prefix-icon="Search" /> |
| | | <span class="search_title ml10">äºæ
ç±»åï¼</span> |
| | | <el-select v-model="searchForm.accidentType" |
| | | clearable |
| | | @change="handleQuery" |
| | | style="width: 240px"> |
| | | <el-option v-for="item in accidentTypeOptions" |
| | | :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="pagination" |
| | | :total="page.total"></PIMTable> |
| | | </div> |
| | | <!-- æ°å¢/ç¼è¾äºæ
å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" |
| | | :title="dialogTitle" |
| | | width="800px" |
| | | :close-on-click-modal="false"> |
| | | <el-form ref="formRef" |
| | | :model="form" |
| | | :rules="rules" |
| | | label-width="140px"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="äºæ
ç¼å·" |
| | | prop="accidentCode"> |
| | | <el-input v-model="form.accidentCode" |
| | | placeholder="请è¾å
¥äºæ
ç¼å·" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="äºæ
åç§°" |
| | | prop="accidentName"> |
| | | <el-input v-model="form.accidentName" |
| | | placeholder="请è¾å
¥äºæ
åç§°" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="äºæ
åçæ¶é´ï¼" |
| | | prop="happenTime"> |
| | | <el-date-picker style="width: 100%" |
| | | v-model="form.happenTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="äºæ
åçä½ç½®" |
| | | prop="happenLocation"> |
| | | <el-input v-model="form.happenLocation" |
| | | placeholder="请è¾å
¥äºæ
åçä½ç½®" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="äºæ
ç级" |
| | | prop="accidentGrade"> |
| | | <el-select v-model="form.accidentGrade" |
| | | placeholder="è¯·éæ©äºæ
ç级" |
| | | style="width: 100%"> |
| | | <el-option v-for="item in accidentGradeOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="äºæ
ç±»å" |
| | | prop="accidentType"> |
| | | <el-select v-model="form.accidentType" |
| | | placeholder="è¯·éæ©äºæ
ç±»å" |
| | | style="width: 100%"> |
| | | <el-option v-for="item in accidentTypeOptions" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="人åæå¤±æ
åµ " |
| | | prop="personLoss"> |
| | | <el-input v-model="form.personLoss" |
| | | placeholder="请è¾å
¥äººåæå¤±æ
åµ" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç´æ¥è´¢äº§æå¤±ï¼å
ï¼" |
| | | prop="assetLoss"> |
| | | <el-input v-model="form.assetLoss" |
| | | type="number" |
| | | placeholder="请è¾å
¥ç´æ¥è´¢äº§æå¤±" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="䏿¥äºº" |
| | | prop="createUser"> |
| | | <el-select v-model="form.createUser" |
| | | placeholder="è¯·éæ©" |
| | | disabled |
| | | 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="createTime"> |
| | | <el-date-picker style="width: 100%" |
| | | v-model="form.createTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | type="datetime" |
| | | disabled |
| | | placeholder="è¯·éæ©" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="äºæ
ç´æ¥åå " |
| | | prop="accidentCause"> |
| | | <el-input v-model="form.accidentCause" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥äºæ
ç´æ¥åå " /> |
| | | </el-form-item> |
| | | <el-form-item label="äºæ
æ ¹æ¬åå " |
| | | prop="rootCause"> |
| | | <el-input v-model="form.rootCause" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥äºæ
æ ¹æ¬åå " /> |
| | | </el-form-item> |
| | | <el-form-item label="ç产影åæ
åµ" |
| | | prop="productionLoss"> |
| | | <el-input v-model="form.productionLoss" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥ç产影åæ
åµ" /> |
| | | </el-form-item> |
| | | <el-form-item label="ç°åºåºæ¥å¤ç½®æªæ½" |
| | | prop="handleMeasures"> |
| | | <el-input v-model="form.handleMeasures" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="ç°åºåºæ¥å¤ç½®æªæ½" /> |
| | | </el-form-item> |
| | | <el-form-item label="夿³¨" |
| | | prop="remark"> |
| | | <el-input v-model="form.remark" |
| | | type="textarea" |
| | | :rows="3" |
| | | 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="viewDialogVisible" |
| | | title="äºæ
详æ
" |
| | | width="900px" |
| | | :close-on-click-modal="false"> |
| | | <div class="knowledge-detail"> |
| | | <el-descriptions :column="2" |
| | | border> |
| | | <el-descriptions-item label="äºæ
ç¼ç "> |
| | | <span>{{ currentKnowledge.accidentCode }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="äºæ
åç§°"> |
| | | <span>{{ currentKnowledge.accidentName }}</span> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="äºæ
åçæ¶é´"> |
| | | {{ currentKnowledge.happenTime }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="äºæ
åçå°ç¹"> |
| | | {{ currentKnowledge.happenLocation }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="äºæ
ç级"> |
| | | {{ currentKnowledge.accidentGrade }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="äºæ
ç±»å"> |
| | | {{ currentKnowledge.accidentType }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="人å伤亡æ
åµ"> |
| | | {{ currentKnowledge.personLoss }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç´æ¥è´¢äº§æå¤±ï¼å
ï¼"> |
| | | {{ currentKnowledge.assetLoss }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="䏿¥äºº"> |
| | | {{ currentKnowledge.createUserName }} |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="䏿¥æ¶é´"> |
| | | {{ currentKnowledge.createTime }} |
| | | </el-descriptions-item> |
| | | </el-descriptions> |
| | | <div class="detail-section"> |
| | | <h4>äºæ
ç´æ¥åå </h4> |
| | | <div class="detail-content">{{ currentKnowledge.accidentCause }}</div> |
| | | </div> |
| | | <div class="detail-section"> |
| | | <h4>äºæ
æ ¹æ¬åå </h4> |
| | | <div class="detail-content">{{ currentKnowledge.rootCause }}</div> |
| | | </div> |
| | | <div class="detail-section"> |
| | | <h4>ç产影åæ
åµ</h4> |
| | | <div class="detail-content">{{ currentKnowledge.productionLoss }}</div> |
| | | </div> |
| | | <div class="detail-section"> |
| | | <h4>ç°åºåºæ¥å¤ç½®æªæ½</h4> |
| | | <div class="detail-content">{{ currentKnowledge.handleMeasures }}</div> |
| | | </div> |
| | | <div class="detail-section"> |
| | | <h4>夿³¨</h4> |
| | | <div class="detail-content">{{ currentKnowledge.remark }}</div> |
| | | </div> |
| | | </div> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="viewDialogVisible = false">å
³é</el-button> |
| | | <!-- <el-button type="success" @click="markAsFavorite">æ¶è@</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 { userListNoPage } from "@/api/system/user.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { |
| | | safeAccidentListPage, |
| | | safeAccidentAdd, |
| | | safeAccidentUpdate, |
| | | safeAccidentDel, |
| | | } from "@/api/safeProduction/accidentReportingRecord.js"; |
| | | import dayjs from "dayjs"; |
| | | const userStore = useUserStore(); |
| | | // 表åéªè¯è§å |
| | | const rules = { |
| | | accidentCode: [ |
| | | { required: true, message: "请è¾å
¥äºæ
ç¼å·", trigger: "blur" }, |
| | | ], |
| | | accidentName: [ |
| | | { required: true, message: "请è¾å
¥äºæ
åç§°", trigger: "blur" }, |
| | | ], |
| | | happenTime: [ |
| | | { required: true, message: "è¯·éæ©äºæ
åçæ¶é´", trigger: "change" }, |
| | | ], |
| | | happenLocation: [ |
| | | { required: true, message: "请è¾å
¥äºæ
åçä½ç½®", trigger: "blur" }, |
| | | ], |
| | | accidentGrade: [ |
| | | { required: true, message: "è¯·éæ©äºæ
ç级", trigger: "change" }, |
| | | ], |
| | | accidentType: [ |
| | | { required: true, message: "è¯·éæ©äºæ
ç±»å", trigger: "change" }, |
| | | ], |
| | | }; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const data = reactive({ |
| | | searchForm: { |
| | | accidentName: "", |
| | | accidentType: "", |
| | | }, |
| | | tableLoading: false, |
| | | page: { |
| | | current: 1, |
| | | size: 20, |
| | | total: 0, |
| | | }, |
| | | tableData: [], |
| | | selectedIds: [], |
| | | form: { |
| | | accidentCode: "", // äºæ
ç¼ç |
| | | accidentName: "", // äºæ
åç§° |
| | | happenTime: "", // äºæ
åçæ¶é´ |
| | | happenLocation: "", // äºæ
åçå°ç¹ |
| | | accidentGrade: "", // äºæ
ç级 |
| | | accidentType: "", // äºæ
ç±»å |
| | | personLoss: "", // 人å伤亡 |
| | | assetLoss: "", // èµäº§æå¤± |
| | | createUser: "", // åå»ºç¨æ· |
| | | createTime: "", // å建æ¶é´ |
| | | createUserName: "", // åå»ºç¨æ·å |
| | | accidentCause: "", // äºæ
ç´æ¥åå |
| | | rootCause: "", // äºæ
æ ¹æ¬åå |
| | | productionLoss: "", // ç产æå¤± |
| | | handleMeasures: "", // åºæ¥å¤ç½®æªæ½ |
| | | remark: "", // 夿³¨ |
| | | }, |
| | | dialogVisible: false, |
| | | dialogTitle: "", |
| | | dialogType: "add", |
| | | viewDialogVisible: false, |
| | | currentKnowledge: {}, |
| | | }); |
| | | |
| | | const { |
| | | searchForm, |
| | | tableLoading, |
| | | page, |
| | | tableData, |
| | | selectedIds, |
| | | form, |
| | | dialogVisible, |
| | | dialogTitle, |
| | | dialogType, |
| | | viewDialogVisible, |
| | | currentKnowledge, |
| | | } = toRefs(data); |
| | | |
| | | // 表åå¼ç¨ |
| | | const formRef = ref(); |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const tableColumn = ref([ |
| | | { |
| | | label: "äºæ
ç¼ç ", |
| | | prop: "accidentCode", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "äºæ
åç§°", |
| | | prop: "accidentName", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "äºæ
åçæ¶é´", |
| | | prop: "happenTime", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "äºæ
åçä½ç½®", |
| | | prop: "happenLocation", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "äºæ
ç级", |
| | | prop: "accidentGrade", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | label: "äºæ
ç±»å", |
| | | prop: "accidentType", |
| | | showOverflowTooltip: true, |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 200, |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: row => { |
| | | openForm("edit", row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "æ¥ç", |
| | | type: "text", |
| | | clickFun: row => { |
| | | viewKnowledge(row); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ]); |
| | | const userList = ref([]); |
| | | // çå½å¨æ |
| | | onMounted(() => { |
| | | getCurrentFactoryName(); |
| | | userListNoPage().then(res => { |
| | | userList.value = res.data; |
| | | }); |
| | | getList(); |
| | | startAutoRefresh(); |
| | | }); |
| | | const handleChange = userId => { |
| | | const selectedUser = userList.value.find(user => user.userId === userId); |
| | | if (selectedUser) { |
| | | form.value.coreResponsorUserName = selectedUser.nickName; |
| | | } |
| | | }; |
| | | // å¼å§èªå¨å·æ° |
| | | const startAutoRefresh = () => { |
| | | setInterval(() => { |
| | | getList(); |
| | | }, 600000); // 10åéå·æ°ä¸æ¬¡ (10 * 60 * 1000 = 600000ms) |
| | | }; |
| | | |
| | | // æ¥è¯¢æ°æ® |
| | | const handleQuery = () => { |
| | | page.value.current = 1; |
| | | getList(); |
| | | }; |
| | | const accidentGradeOptions = [ |
| | | { |
| | | label: "è½»å¾®äºæ
", |
| | | value: "è½»å¾®äºæ
", |
| | | }, |
| | | { |
| | | label: "ä¸è¬äºæ
", |
| | | value: "ä¸è¬äºæ
", |
| | | }, |
| | | { |
| | | label: "è¾å¤§äºæ
", |
| | | value: "è¾å¤§äºæ
", |
| | | }, |
| | | { |
| | | label: "éå¤§äºæ
", |
| | | value: "éå¤§äºæ
", |
| | | }, |
| | | ]; |
| | | const accidentTypeOptions = [ |
| | | { |
| | | label: "è´£ä»»äºæ
", |
| | | value: "è´£ä»»äºæ
", |
| | | }, |
| | | { |
| | | label: "éè´£ä»»äºæ
", |
| | | value: "éè´£ä»»äºæ
", |
| | | }, |
| | | { |
| | | label: "ç ´åæ§äºæ
", |
| | | value: "ç ´åæ§äºæ
", |
| | | }, |
| | | { |
| | | label: "éå¤§äºæ
", |
| | | value: "éå¤§äºæ
", |
| | | }, |
| | | ]; |
| | | |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | safeAccidentListPage({ ...page.value, ...searchForm.value }) |
| | | .then(res => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | page.total = res.data.total; |
| | | }) |
| | | .catch(err => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }; |
| | | |
| | | // å页å¤ç |
| | | const pagination = obj => { |
| | | page.value.current = obj.page; |
| | | page.value.size = obj.limit; |
| | | handleQuery(); |
| | | }; |
| | | 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 handleSelectionChange = selection => { |
| | | selectedIds.value = selection.map(item => item.id); |
| | | }; |
| | | |
| | | // æå¼è¡¨å |
| | | const openForm = (type, row = null) => { |
| | | dialogType.value = type; |
| | | if (type === "add") { |
| | | dialogTitle.value = "æ°å¢äºæ
"; |
| | | // é置表å |
| | | Object.assign(form.value, { |
| | | accidentCode: "", // äºæ
ç¼ç |
| | | accidentName: "", // äºæ
åç§° |
| | | happenTime: "", // äºæ
åçæ¶é´ |
| | | happenLocation: "", // äºæ
åçå°ç¹ |
| | | accidentGrade: "", // äºæ
ç级 |
| | | accidentType: "", // äºæ
ç±»å |
| | | personLoss: "", // 人å伤亡 |
| | | assetLoss: "", // èµäº§æå¤± |
| | | createUser: currentUserId.value, // åå»ºç¨æ· |
| | | createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"), // å建æ¶é´ |
| | | createUserName: currentUserName.value, // åå»ºç¨æ·å |
| | | accidentCause: "", // äºæ
ç´æ¥åå |
| | | rootCause: "", // äºæ
æ ¹æ¬åå |
| | | productionLoss: "", // ç产æå¤± |
| | | handleMeasures: "", // åºæ¥å¤ç½®æªæ½ |
| | | remark: "", // 夿³¨ |
| | | }); |
| | | } else if (type === "edit" && row) { |
| | | dialogTitle.value = "ç¼è¾äºæ
"; |
| | | Object.assign(form.value, { |
| | | id: row.id, |
| | | accidentCode: row.accidentCode, // äºæ
ç¼ç |
| | | accidentName: row.accidentName, // äºæ
åç§° |
| | | happenTime: row.happenTime, // äºæ
åçæ¶é´ |
| | | happenLocation: row.happenLocation, // äºæ
åçå°ç¹ |
| | | accidentGrade: row.accidentGrade, // äºæ
ç级 |
| | | accidentType: row.accidentType, // äºæ
ç±»å |
| | | personLoss: row.personLoss, // 人å伤亡 |
| | | assetLoss: row.assetLoss, // èµäº§æå¤± |
| | | createUser: row.createUser, // åå»ºç¨æ· |
| | | createTime: row.createTime, // å建æ¶é´ |
| | | createUserName: row.createUserName, // åå»ºç¨æ·å |
| | | accidentCause: row.accidentCause, // äºæ
ç´æ¥åå |
| | | rootCause: row.rootCause, // äºæ
æ ¹æ¬åå |
| | | productionLoss: row.productionLoss, // ç产æå¤± |
| | | handleMeasures: row.handleMeasures, // åºæ¥å¤ç½®æªæ½ |
| | | remark: row.remark, // 夿³¨ |
| | | }); |
| | | } |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // æ¥çäºæ
详æ
|
| | | const viewKnowledge = row => { |
| | | currentKnowledge.value = { ...row }; |
| | | viewDialogVisible.value = true; |
| | | }; |
| | | const getApplyScopeLabel = scope => { |
| | | const scopeMap = { |
| | | all: "å
¨ä½åå·¥", |
| | | manager: "管çå±", |
| | | hr: "人äºé¨é¨", |
| | | finance: "è´¢å¡é¨é¨", |
| | | tech: "ææ¯é¨é¨", |
| | | }; |
| | | return scopeMap[scope] || scope; |
| | | }; |
| | | |
| | | // è·åç±»åæ ç¾ç±»å |
| | | const getTypeTagType = type => { |
| | | const typeMap = { |
| | | contract: "success", |
| | | approval: "warning", |
| | | solution: "primary", |
| | | experience: "info", |
| | | guide: "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 { |
| | | await formRef.value.validate(); |
| | | if (dialogType.value === "add") { |
| | | safeAccidentAdd({ ...form.value }) |
| | | .then(res => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("æ·»å æå"); |
| | | dialogVisible.value = false; |
| | | getList(); |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | ElMessage.error(err.msg); |
| | | }); |
| | | } else { |
| | | safeAccidentUpdate({ ...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); |
| | | safeAccidentDel(selectedIds.value).then(res => { |
| | | if (res.code == 200) { |
| | | ElMessage.success("å 餿å"); |
| | | selectedIds.value = []; |
| | | getList(); |
| | | } |
| | | }); |
| | | }) |
| | | .catch(() => { |
| | | // ç¨æ·åæ¶ |
| | | }); |
| | | }; |
| | | |
| | | // å¯¼åº |
| | | const { proxy } = getCurrentInstance(); |
| | | const { knowledge_type } = proxy.useDict("knowledge_type"); |
| | | |
| | | // åå
¸å·¥å
· |
| | | const knowledgeTypeOptions = computed(() => knowledge_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; |
| | | } |
| | | |
| | | .exec-steps-container { |
| | | border: 1px solid #e4e7ed; |
| | | border-radius: 4px; |
| | | padding: 15px; |
| | | background-color: #f9fafc; |
| | | } |
| | | |
| | | .exec-step-item { |
| | | margin-bottom: 10px; |
| | | padding: 10px; |
| | | background-color: #ffffff; |
| | | border: 1px solid #e4e7ed; |
| | | border-radius: 4px; |
| | | } |
| | | |
| | | .step-header { |
| | | display: flex; |
| | | align-items: flex-start; |
| | | flex-direction: column; |
| | | } |
| | | |
| | | .exec-step-view { |
| | | margin-bottom: 8px; |
| | | padding-left: 20px; |
| | | position: relative; |
| | | } |
| | | |
| | | .step-number { |
| | | position: absolute; |
| | | left: 0; |
| | | font-weight: bold; |
| | | color: #409eff; |
| | | } |
| | | |
| | | .step-title { |
| | | font-weight: bold; |
| | | margin-right: 5px; |
| | | } |
| | | |
| | | .no-data { |
| | | color: #909399; |
| | | font-style: italic; |
| | | } |
| | | </style> |