From c2dcff2da9764f50dbd645032ac34c67442b67bc Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 29 一月 2026 17:45:47 +0800
Subject: [PATCH] 安全培训考核部分功能
---
src/views/collaborativeApproval/sealManagement/index.vue | 285 ++++++++++++++++++++++++++++++++++-----------------------
1 files changed, 170 insertions(+), 115 deletions(-)
diff --git a/src/views/collaborativeApproval/sealManagement/index.vue b/src/views/collaborativeApproval/sealManagement/index.vue
index f3778ac..5193aa9 100644
--- a/src/views/collaborativeApproval/sealManagement/index.vue
+++ b/src/views/collaborativeApproval/sealManagement/index.vue
@@ -3,22 +3,23 @@
<el-card class="box-card">
<template #header>
<div class="card-header">
- <span>鐢ㄥ嵃绠$悊涓庤绔犲埗搴﹀彂甯�</span>
- <el-button type="primary" @click="showSealApplyDialog = true">
- <el-icon><Plus /></el-icon>
- 鐢宠鐢ㄥ嵃
- </el-button>
+ <span>鐢ㄥ嵃绠$悊鍙戝竷</span>
</div>
</template>
- <el-tabs v-model="activeTab" type="border-card">
- <!-- 鐢ㄥ嵃鐢宠绠$悊 -->
- <el-tab-pane label="鐢ㄥ嵃鐢宠绠$悊" name="seal">
- <div class="tab-content">
- <el-row :gutter="20" class="mb-20">
- <el-col :span="6">
+
+ <!-- 鐢ㄥ嵃鐢宠绠$悊 -->
+ <div class="tab-content">
+ <el-row :gutter="20" class="mb-20 ">
+ <span class="ml-10">鐢ㄥ嵃鏍囬锛�</span>
+ <el-col :span="4">
<el-input v-model="sealSearchForm.title" placeholder="璇疯緭鍏ョ敵璇锋爣棰�" clearable />
</el-col>
+ <span class="ml-10">鐢ㄥ嵃缂栧彿锛�</span>
+ <el-col :span="4">
+ <el-input v-model="sealSearchForm.applicationNum" placeholder="璇疯緭鍏ョ敤鍗扮紪鍙�" clearable />
+ </el-col>
+ <span class="search_title">瀹℃壒鐘舵�侊細</span>
<el-col :span="4">
<el-select v-model="sealSearchForm.status" placeholder="瀹℃壒鐘舵��" clearable>
<el-option label="寰呭鎵�" value="pending" />
@@ -26,9 +27,12 @@
<el-option label="宸叉嫆缁�" value="rejected" />
</el-select>
</el-col>
- <el-col :span="4">
+ <el-col :span="6">
<el-button type="primary" @click="searchSealApplications">鎼滅储</el-button>
<el-button @click="resetSealSearch">閲嶇疆</el-button>
+ <el-button @click="handleExport">瀵煎嚭</el-button>
+ <el-button type="primary" @click="showSealApplyDialog = true">鐢宠鐢ㄥ嵃
+ </el-button>
</el-col>
</el-row>
@@ -72,78 +76,20 @@
</template>
</el-table-column>
</el-table>
- </div>
- </el-tab-pane>
-
- <!-- 瑙勭珷鍒跺害绠$悊 -->
- <el-tab-pane label="瑙勭珷鍒跺害绠$悊" name="regulations">
- <div class="tab-content">
- <el-row :gutter="20" class="mb-20">
- <el-col :span="6">
- <el-input v-model="regulationSearchForm.title" placeholder="璇疯緭鍏ュ埗搴︽爣棰�" clearable />
- </el-col>
- <el-col :span="4">
- <el-select v-model="regulationSearchForm.category" placeholder="鍒跺害鍒嗙被" clearable>
- <el-option label="浜轰簨鍒跺害" value="hr" />
- <el-option label="璐㈠姟鍒跺害" value="finance" />
- <el-option label="瀹夊叏鍒跺害" value="safety" />
- <el-option label="鎶�鏈埗搴�" value="tech" />
- </el-select>
- </el-col>
- <el-col :span="8">
- <el-button type="primary" @click="searchRegulations">鎼滅储</el-button>
- <el-button @click="resetRegulationSearch">閲嶇疆</el-button>
- <el-button type="success" @click="handleAdd">
- 鍙戝竷鍒跺害
- </el-button>
- </el-col>
- </el-row>
-
- <el-table :data="regulations" border v-loading="tableLoading" style="width: 100%">
- <el-table-column prop="regulationNum" label="鍒跺害缂栧彿" width="120" />
- <el-table-column prop="title" label="鍒跺害鏍囬" min-width="200" />
- <el-table-column prop="category" label="鍒嗙被" width="120">
- <template #default="scope">
- <el-tag>{{ getCategoryText(scope.row.category) }}</el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="version" label="鐗堟湰" width="80" />
- <el-table-column prop="createUserName" label="鍙戝竷浜�" width="120" />
- <el-table-column prop="createTime" label="鍙戝竷鏃堕棿" width="180" />
- <el-table-column prop="status" label="鐘舵��" width="100">
- <template #default="scope">
- <el-tag :type="scope.row.status === 'active' ? 'success' : 'info'">
- {{ scope.row.status === 'active' ? '鐢熸晥涓�' : '宸插簾姝�' }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column prop="readCount" label="宸茶浜烘暟" width="100" />
- <el-table-column label="鎿嶄綔" width="250" fixed="right">
- <template #default="scope">
- <el-button link @click="viewRegulation(scope.row)">鏌ョ湅</el-button>
- <el-button link type="primary" @click="handleEdit(scope.row)">缂栬緫</el-button>
- <el-button link type="danger" @click="repealEdit(scope.row)">搴熷純</el-button>
- <el-button link type="success" @click="viewVersionHistory(scope.row)">鐗堟湰鍘嗗彶</el-button>
- <el-button link type="warning" @click="viewReadStatus(scope.row)">闃呰鐘舵��</el-button>
- </template>
- </el-table-column>
- </el-table>
- <!-- 鍒嗛〉
- <pagination
- v-show="total > 0"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- :page="page.current"
- :limit="page.size"
- @pagination="paginationChange"
- /> -->
- </div>
- </el-tab-pane>
- </el-tabs>
+ <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
+ :page="page.current" :limit="page.size" @pagination="paginationChange" />
+ </div>
</el-card>
<!-- 鐢ㄥ嵃鐢宠瀵硅瘽妗� -->
- <el-dialog v-model="showSealApplyDialog" title="鐢宠鐢ㄥ嵃" width="600px">
+ <FormDialog
+ v-model="showSealApplyDialog"
+ title="鐢宠鐢ㄥ嵃"
+ :width="'600px'"
+ @close="closeSealApplyDialog"
+ @confirm="submitSealApplication"
+ @cancel="closeSealApplyDialog"
+ >
<el-form :model="sealForm" :rules="sealRules" ref="sealFormRef" label-width="100px">
<el-form-item label="鐢宠缂栧彿" prop="applicationNum">
<el-input v-model="sealForm.applicationNum" placeholder="璇疯緭鍏ョ敵璇风紪鍙�" />
@@ -162,6 +108,16 @@
<el-form-item label="鐢宠鍘熷洜" prop="reason">
<el-input v-model="sealForm.reason" type="textarea" :rows="4" placeholder="璇疯缁嗚鏄庣敤鍗板師鍥�" />
</el-form-item>
+ <el-form-item label="瀹℃壒浜�" prop="approveUserId">
+ <el-select v-model="sealForm.approveUserId" placeholder="璇烽�夋嫨瀹℃壒浜�" style="width: 100%" filterable>
+ <el-option
+ v-for="user in userList"
+ :key="user.userId"
+ :label="user.nickName"
+ :value="user.userId"
+ />
+ </el-select>
+ </el-form-item>
<el-form-item label="绱ф�ョ▼搴�" prop="urgency">
<el-radio-group v-model="sealForm.urgency">
<el-radio label="normal">鏅��</el-radio>
@@ -170,16 +126,10 @@
</el-radio-group>
</el-form-item>
</el-form>
- <template #footer>
- <span class="dialog-footer">
- <el-button @click="showSealApplyDialog = false">鍙栨秷</el-button>
- <el-button type="primary" @click="submitSealApplication">鎻愪氦鐢宠</el-button>
- </span>
- </template>
- </el-dialog>
+ </FormDialog>
<!-- 瑙勭珷鍒跺害鍙戝竷瀵硅瘽妗� -->
- <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? '鍙戝竷鍒跺害' : '缂栬緫鍒跺害'" width="800px">
+ <!-- <el-dialog v-model="showRegulationDialog" :title="operationType === 'add' ? '鍙戝竷鍒跺害' : '缂栬緫鍒跺害'" width="800px">
<el-form :model="regulationForm" :rules="regulationRules" ref="regulationFormRef" label-width="100px">
<el-form-item label="鍒跺害缂栧彿" prop="regulationNum">
<el-input v-model="regulationForm.regulationNum" placeholder="璇疯緭鍏ュ埗搴︾紪鍙�" />
@@ -225,13 +175,20 @@
<el-button type="primary" @click="submitRegulation">鍙戝竷鍒跺害</el-button>
</span>
</template>
- </el-dialog>
+ </el-dialog> -->
<!-- 鐢ㄥ嵃璇︽儏瀵硅瘽妗� -->
- <el-dialog v-model="showSealDetailDialog" title="鐢ㄥ嵃鐢宠璇︽儏" width="700px">
+ <FormDialog
+ v-model="showSealDetailDialog"
+ title="鐢ㄥ嵃鐢宠璇︽儏"
+ :width="'700px'"
+ @close="closeSealDetailDialog"
+ @confirm="closeSealDetailDialog"
+ @cancel="closeSealDetailDialog"
+ >
<div v-if="currentSealDetail" class="mb10">
<el-descriptions :column="2" border>
- <el-descriptions-item label="鐢宠缂栧彿">{{ currentSealDetail.id }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠缂栧彿">{{ currentSealDetail.applicationNum }}</el-descriptions-item>
<el-descriptions-item label="鐢宠鏍囬">{{ currentSealDetail.title }}</el-descriptions-item>
<el-descriptions-item label="鐢宠浜�">{{ currentSealDetail.createUserName }}</el-descriptions-item>
<el-descriptions-item label="鎵�灞為儴闂�">{{ currentSealDetail.department }}</el-descriptions-item>
@@ -245,10 +202,17 @@
<el-descriptions-item label="鐢宠鍘熷洜" :span="2">{{ currentSealDetail.reason }}</el-descriptions-item>
</el-descriptions>
</div>
- </el-dialog>
+ </FormDialog>
<!-- 瑙勭珷鍒跺害璇︽儏瀵硅瘽妗� -->
- <el-dialog v-model="showRegulationDetailDialog" title="瑙勭珷鍒跺害璇︽儏" width="800px">
+ <FormDialog
+ v-model="showRegulationDetailDialog"
+ title="瑙勭珷鍒跺害璇︽儏"
+ :width="'800px'"
+ @close="closeRegulationDetailDialog"
+ @confirm="handleRegulationDetailConfirm"
+ @cancel="closeRegulationDetailDialog"
+ >
<div v-if="currentRegulationDetail">
<el-descriptions :column="2" border>
<el-descriptions-item label="鍒跺害缂栧彿">{{ currentRegulationDetail.id }}</el-descriptions-item>
@@ -267,10 +231,17 @@
<el-button type="success" @click="resetForm(currentRegulationDetail)">纭鏌ョ湅</el-button>
</div>
</div>
- </el-dialog>
+ </FormDialog>
<!-- 鐗堟湰鍘嗗彶瀵硅瘽妗� -->
- <el-dialog v-model="showVersionHistoryDialog" title="鐗堟湰鍘嗗彶" width="800px">
+ <FormDialog
+ v-model="showVersionHistoryDialog"
+ title="鐗堟湰鍘嗗彶"
+ :width="'800px'"
+ @close="closeVersionHistoryDialog"
+ @confirm="closeVersionHistoryDialog"
+ @cancel="closeVersionHistoryDialog"
+ >
<el-table :data="versionHistory" style="width: 100%;margin-bottom: 10px">
<el-table-column prop="version" label="鐗堟湰鍙�" width="100" />
<el-table-column prop="updateTime" label="鏇存柊鏃堕棿" width="180" />
@@ -283,10 +254,17 @@
</template>
</el-table-column>
</el-table>
- </el-dialog>
+ </FormDialog>
<!-- 闃呰鐘舵�佸璇濇 -->
- <el-dialog v-model="showReadStatusDialog" title="闃呰鐘舵��" width="800px">
+ <FormDialog
+ v-model="showReadStatusDialog"
+ title="闃呰鐘舵��"
+ :width="'800px'"
+ @close="closeReadStatusDialog"
+ @confirm="closeReadStatusDialog"
+ @cancel="closeReadStatusDialog"
+ >
<el-table :data="readStatusList" style="width: 100%;margin-bottom: 10px">
<el-table-column prop="employee" label="鍛樺伐濮撳悕" width="120" />
<el-table-column prop="department" label="鎵�灞為儴闂�" width="150" />
@@ -300,20 +278,22 @@
</template>
</el-table-column>
</el-table>
- </el-dialog>
+ </FormDialog>
</div>
</template>
<script setup>
-import { ref, reactive, onMounted } from 'vue'
+import { ref, reactive, onMounted, getCurrentInstance, watch } from 'vue'
+import { useRoute } from 'vue-router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import { listSealApplication, addSealApplication, updateSealApplication,listRuleManagement,addRuleManagement,updateRuleManagement,delRuleManagement,getReadingStatusByRuleId,getReadingStatusList,addReadingStatus,updateReadingStatus } from '@/api/collaborativeApproval/sealManagement.js'
import { el } from 'element-plus/es/locales.mjs'
-import { getUserProfile } from '@/api/system/user.js'
-import {staffJoinDel, staffJoinListPage} from "@/api/personnelManagement/onboarding.js";
+import { getUserProfile, userListNoPageByTenantId } from '@/api/system/user.js'
import useUserStore from '@/store/modules/user'
import { userLoginFacotryList } from "@/api/system/user.js"
+import {staffOnJobListPage} from "@/api/personnelManagement/staffOnJob.js"
+import FormDialog from '@/components/Dialog/FormDialog.vue'
// 鍝嶅簲寮忔暟鎹�
const currentUser = ref(null)
@@ -322,16 +302,19 @@
const tableData = ref([])
// 鐢ㄥ嵃鐢宠鐩稿叧
const userStore = useUserStore()
+const route = useRoute()
const showSealApplyDialog = ref(false)
const tableLoading = ref(false)
const showSealDetailDialog = ref(false)
const currentSealDetail = ref(null)
const sealFormRef = ref()
+const userList = ref([])
const sealForm = reactive({
applicationNum: '',
title: '',
sealType: '',
reason: '',
+ approveUserId: '',
urgency: 'normal',
status: 'pending'
})
@@ -340,17 +323,19 @@
applicationNum: [{ required: true, message: '璇疯緭鍏ョ敵璇风紪鍙�', trigger: 'blur' }],
title: [{ required: true, message: '璇疯緭鍏ョ敵璇锋爣棰�', trigger: 'blur' }],
sealType: [{ required: true, message: '璇烽�夋嫨鐢ㄥ嵃绫诲瀷', trigger: 'change' }],
- reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }]
+ reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }],
+ approveUserId: [{ required: true, message: '璇烽�夋嫨瀹℃壒浜�', trigger: 'change' }]
}
const sealSearchForm = reactive({
title: '',
- status: ''
+ status: '',
+ applicationNum: ''
})
// 鍒嗛〉鍙傛暟
const page = reactive({
current: 1,
- size: 10,
+ size: 100,
total: 0
})
// 瑙勭珷鍒跺害鐩稿叧
@@ -458,6 +443,7 @@
const resetSealSearch = () => {
sealSearchForm.title = ''
sealSearchForm.status = ''
+ sealSearchForm.applicationNum = ''
searchSealApplications()
}
// 鎼滅储鍒跺害
@@ -478,24 +464,66 @@
addSealApplication(sealForm).then(res => {
if(res.code == 200){
ElMessage.success('鐢宠鎻愪氦鎴愬姛')
- showSealApplyDialog.value = false
+ closeSealApplyDialog()
getSealApplicationList()
Object.assign(sealForm, {
applicationNum: '',
title: '',
sealType: '',
reason: '',
+ approveUserId: '',
urgency: 'normal',
status: 'pending'
})
}
}).catch(err => {
- ElMessage.error(err.msg)
+ console.log(err.msg)
})
} catch (error) {
- ElMessage.error('璇峰畬鍠勭敵璇蜂俊鎭�')
}
+}
+// 鍏抽棴鐢ㄥ嵃鐢宠瀵硅瘽妗�
+const closeSealApplyDialog = () => {
+ // 娓呯┖琛ㄥ崟鏁版嵁
+ Object.assign(sealForm, {
+ applicationNum: '',
+ title: '',
+ sealType: '',
+ reason: '',
+ approveUserId: '',
+ urgency: 'normal',
+ status: 'pending'
+ })
+ // 娓呴櫎琛ㄥ崟楠岃瘉鐘舵��
+ if (sealFormRef.value) {
+ sealFormRef.value.clearValidate()
+ }
+ showSealApplyDialog.value = false
+}
+// 鍏抽棴鐢ㄥ嵃璇︽儏瀵硅瘽妗�
+const closeSealDetailDialog = () => {
+ showSealDetailDialog.value = false
+}
+// 鍏抽棴瑙勭珷鍒跺害璇︽儏瀵硅瘽妗�
+const closeRegulationDetailDialog = () => {
+ showRegulationDetailDialog.value = false
+}
+// 澶勭悊瑙勭珷鍒跺害璇︽儏纭
+const handleRegulationDetailConfirm = () => {
+ // 濡傛灉tableData>0锛屾墽琛岀‘璁ゆ煡鐪嬫搷浣�
+ if (currentRegulationDetail.value && tableData.value && tableData.value.length > 0) {
+ resetForm(currentRegulationDetail.value)
+ }
+ closeRegulationDetailDialog()
+}
+// 鍏抽棴鐗堟湰鍘嗗彶瀵硅瘽妗�
+const closeVersionHistoryDialog = () => {
+ showVersionHistoryDialog.value = false
+}
+// 鍏抽棴闃呰鐘舵�佸璇濇
+const closeReadStatusDialog = () => {
+ showReadStatusDialog.value = false
}
// 鏂板
const handleAdd = () => {
@@ -626,12 +654,11 @@
currentUser.value = res.data.userName
}
})
- staffJoinListPage({staffState: 1}).then(res => {
+ staffOnJobListPage({staffState: 1, ...page}).then(res => {
tableLoading.value = false;
// tableData.value = res.data.records
// //绛涢�夊嚭鍜宑urrentUser鍚屽悕鐨勪汉鍛�
tableData.value = res.data.records.filter(item => item.staffName === currentUser.value)
- console.log("tableData",tableData.value)
page.total = res.data.total;
if(tableData.value.length == 0){
@@ -730,6 +757,12 @@
})
}
+// 瀵煎嚭鐢ㄥ嵃鐢宠
+const { proxy } = getCurrentInstance()
+const handleExport = () => {
+ proxy.download('/sealApplicationManagement/export', { ...sealSearchForm }, '鐢ㄥ嵃鐢宠.xlsx')
+}
+
// 鑾峰彇鍗扮珷鐢宠鍒楄〃鏁版嵁
const getSealApplicationList = async () => {
tableLoading.value = true
@@ -742,11 +775,11 @@
// 鏍规嵁currentFactoryName杩囨护鍑篸epartment鐩稿悓鐨勬暟鎹�
sealApplications.value = res.data.records.filter(item => item.department === currentFactoryName)
// 鏇存柊杩囨护鍚庣殑鎬绘暟
- page.value.total = sealApplications.value.length
+ page.total = sealApplications.value.length
} else {
// 濡傛灉娌℃湁currentFactoryName锛屽垯鏄剧ず鎵�鏈夋暟鎹�
sealApplications.value = res.data.records
- page.value.total = res.data.total
+ page.total = res.data.total
}
// sealApplications.value = res.data.records
// page.value.total = res.data.total;
@@ -765,7 +798,7 @@
regulations.value = res.data.records
// 杩囨护鎺夊凡搴熷純鐨勫埗搴�
// regulations.value = res.data.records.filter(item => item.status !== 'repealed')
- page.value.total = res.data.total;
+ page.total = res.data.total;
tableLoading.value = false;
}).catch(err => {
@@ -773,9 +806,31 @@
})
}
+// 鍒嗛〉鍙樺寲澶勭悊
+const paginationChange = (obj) => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getSealApplicationList();
+};
+
+// 鐩戝惉瀵硅瘽妗嗘墦寮�锛岃幏鍙栫敤鎴峰垪琛�
+watch(showSealApplyDialog, (newVal) => {
+ if (newVal) {
+ userListNoPageByTenantId().then((res) => {
+ userList.value = res.data;
+ });
+ }
+});
+
onMounted(() => {
- // 鍒濆鍖�
- getSealApplicationList()
+ // 璺敱鎼哄甫 applicationNum 鏃讹紝棰勫~骞舵煡璇�
+ if (route.query.applicationNum) {
+ sealSearchForm.applicationNum = String(route.query.applicationNum)
+ page.current = 1
+ getSealApplicationList()
+ } else {
+ getSealApplicationList()
+ }
getRegulationList()
})
</script>
--
Gitblit v1.9.3