From b8da78824e4c67632abb65302f01ccf74d5a1096 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 26 五月 2026 18:45:51 +0800
Subject: [PATCH] 浪潮对接:芯导-安环管理系统,配置调整
---
src/views/safetyManagement/employeeLearning/index.vue | 175 +++++++++++++++++++++++++++++-----------------------------
1 files changed, 87 insertions(+), 88 deletions(-)
diff --git a/src/views/safetyManagement/employeeLearning/index.vue b/src/views/safetyManagement/employeeLearning/index.vue
index 2070899..f4c6bc0 100644
--- a/src/views/safetyManagement/employeeLearning/index.vue
+++ b/src/views/safetyManagement/employeeLearning/index.vue
@@ -11,103 +11,128 @@
<el-divider />
<div class="stat-item">
<span class="label">宸插畬鎴愬煿璁�</span>
- <span class="value">{{ userInfo.completedTrainings }} 娆�</span>
+ <span class="value">{{ statistics.completedTrainings }} 娆�</span>
</div>
<div class="stat-item">
<span class="label">寰呭弬鍔犲煿璁�</span>
- <span class="value">{{ userInfo.pendingTrainings }} 娆�</span>
+ <span class="value">{{ statistics.pendingTrainings }} 娆�</span>
</div>
<div class="stat-item">
<span class="label">骞冲潎鑰冩牳鍒嗘暟</span>
- <span class="value">{{ userInfo.avgScore }} 鍒�</span>
+ <span class="value">{{ statistics.avgScore }} 鍒�</span>
</div>
</el-card>
</el-col>
<el-col :span="18">
- <el-tabs v-model="activeTab" type="border-card">
- <el-tab-pane label="鎴戠殑瀛︿範璁板綍" name="records">
- <PIMTable :column="recordColumns" :tableData="recordList" :page="recordPage" @pagination="changeRecordPage" />
- </el-tab-pane>
-
- <el-tab-pane label="鑰冩牳鎶ュ憡" name="reports">
- <PIMTable :column="reportColumns" :tableData="reportList" :page="reportPage" @pagination="changeReportPage" />
- </el-tab-pane>
-
- <el-tab-pane label="鍦ㄧ嚎娴嬭瘎" name="assessment">
- <div class="assessment-list">
- <el-card v-for="item in assessmentList" :key="item.id" class="assessment-card">
- <div class="assessment-header">
- <h4>{{ item.title }}</h4>
- <el-tag :type="item.status === '寰呮祴璇�' ? 'warning' : 'success'">{{ item.status }}</el-tag>
- </div>
- <p class="assessment-desc">{{ item.description }}</p>
- <div class="assessment-footer">
- <span>鎴鏃堕棿锛歿{ item.deadline }}</span>
- <el-button type="primary" size="small" :disabled="item.status !== '寰呮祴璇�'" @click="startAssessment(item)">
- {{ item.status === '寰呮祴璇�' ? '寮�濮嬫祴璇�' : '宸插畬鎴�' }}
- </el-button>
- </div>
- </el-card>
- </div>
- </el-tab-pane>
- </el-tabs>
+ <el-card>
+ <template #header>
+ <span>鎴戠殑瀛︿範璁板綍</span>
+ </template>
+ <PIMTable :column="recordColumns" :tableData="recordList" :page="recordPage" @pagination="changeRecordPage" :tableLoading="recordLoading" />
+ </el-card>
</el-col>
</el-row>
</div>
</template>
<script setup>
-import { ref, reactive } from "vue";
+import { ref, reactive, onMounted, computed } from "vue";
import PIMTable from "@/components/PIMTable/PIMTable.vue";
+import useUserStore from "@/store/modules/user";
+import {
+ getRecordList
+} from "@/api/safetyManagement/trainingManage.js";
+import { ElMessage } from "element-plus";
defineOptions({
name: "鍛樺伐瀛︿範",
});
-const activeTab = ref("records");
+const userStore = useUserStore();
-const userInfo = reactive({
- name: "寮犱笁",
- dept: "鐢熶骇閮�",
- post: "鎿嶄綔宸�",
- avatar: "",
- completedTrainings: 12,
- pendingTrainings: 3,
- avgScore: 85,
+const userInfo = computed(() => ({
+ name: userStore.name || "-",
+ dept: userStore.currentFactoryName || "-",
+ post: userStore.roleName || "-",
+ avatar: userStore.avatar || "",
+}));
+
+const statistics = reactive({
+ completedTrainings: 0,
+ pendingTrainings: 0,
+ avgScore: 0,
});
-// 瀛︿範璁板綍
+// 瀛︿範璁板綍锛堟潵鑷煿璁畬鎴愯褰曪級
const recordList = ref([]);
const recordPage = reactive({ current: 1, size: 10, total: 0 });
+const recordLoading = ref(false);
const recordColumns = [
{ label: "鍩硅鍐呭", prop: "content", align: "center" },
- { label: "鍩硅鏃堕棿", prop: "trainingTime", align: "center" },
- { label: "鍩硅鏃堕暱", prop: "duration", align: "center" },
+ { label: "瀹屾垚鏃堕棿", prop: "completeTime", align: "center" },
+ { label: "瀛︿範鏃堕暱", prop: "duration", align: "center" },
{ label: "鍩硅鏂瑰紡", prop: "method", align: "center" },
- { label: "瀹屾垚鐘舵��", prop: "status", align: "center" },
+ { label: "鍒嗘暟", prop: "score", align: "center" },
+ {
+ label: "鑰冩牳缁撴灉",
+ prop: "result",
+ align: "center",
+ dataType: "tag",
+ formatType: (val) => {
+ if (val === '閫氳繃') return 'success';
+ if (val === '鏈�氳繃') return 'danger';
+ return 'info';
+ },
+ formatData: (val) => val || '-'
+ }
];
-// 鑰冩牳鎶ュ憡
-const reportList = ref([]);
-const reportPage = reactive({ current: 1, size: 10, total: 0 });
-const reportColumns = [
- { label: "鑰冩牳鍚嶇О", prop: "name", align: "center" },
- { label: "鑰冩牳鏃堕棿", prop: "assessTime", align: "center" },
- { label: "寰楀垎", prop: "score", align: "center" },
- { label: "绛夌骇", prop: "grade", align: "center" },
- { label: "鏄惁鍚堟牸", prop: "qualified", align: "center" },
-];
-// 鍦ㄧ嚎娴嬭瘎
-const assessmentList = ref([
- { id: 1, title: "瀹夊叏鎿嶄綔瑙勭▼娴嬭瘎", description: "鑰冩牳鍛樺伐瀵瑰畨鍏ㄦ搷浣滆绋嬬殑鎺屾彙绋嬪害", deadline: "2026-05-30", status: "寰呮祴璇�" },
- { id: 2, title: "搴旀�ュ缃兘鍔涙祴璇�", description: "鑰冩牳鍛樺伐搴旀�ュ缃兘鍔�", deadline: "2026-06-15", status: "宸插畬鎴�" },
-]);
-const changeRecordPage = ({ page, limit }) => { recordPage.current = page; recordPage.size = limit; };
-const changeReportPage = ({ page, limit }) => { reportPage.current = page; reportPage.size = limit; };
-const startAssessment = (item) => {};
+// 璁$畻缁熻鏁版嵁
+const calculateStatistics = (records) => {
+ const completedTrainings = records.filter(r => r.status === 1).length;
+ const pendingTrainings = records.filter(r => r.status === 0).length;
+ const scores = records.filter(r => r.score > 0).map(r => r.score);
+ const avgScore = scores.length > 0 ? (scores.reduce((a, b) => a + b, 0) / scores.length).toFixed(1) : 0;
+
+ statistics.completedTrainings = completedTrainings;
+ statistics.pendingTrainings = pendingTrainings;
+ statistics.avgScore = avgScore;
+};
+
+// 瀛︿範璁板綍鏂规硶锛堟煡璇㈠綋鍓嶇敤鎴风殑瀹屾垚璁板綍锛�
+const getRecordData = async () => {
+ recordLoading.value = true;
+ try {
+ const res = await getRecordList({
+ pageNum: recordPage.current,
+ pageSize: recordPage.size,
+ employeeId: userStore.userId // 鍙煡璇㈠綋鍓嶇敤鎴风殑鏁版嵁
+ });
+ if (res.code === 200) {
+ recordList.value = res.data.rows || res.data.records || [];
+ recordPage.total = res.data.total || 0;
+ // 鏍规嵁鏌ヨ鍒扮殑鏁版嵁璁$畻缁熻
+ calculateStatistics(recordList.value);
+ }
+ } catch (error) {
+ ElMessage.error('鑾峰彇瀛︿範璁板綍澶辫触');
+ } finally {
+ recordLoading.value = false;
+ }
+};
+
+const changeRecordPage = ({ page, limit }) => {
+ recordPage.current = page;
+ recordPage.size = limit;
+ getRecordData();
+};
+
+onMounted(() => {
+ getRecordData();
+});
</script>
<style lang="scss" scoped>
@@ -136,30 +161,4 @@
}
}
-.assessment-list {
- .assessment-card {
- margin-bottom: 15px;
- .assessment-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- h4 {
- margin: 0;
- }
- }
- .assessment-desc {
- color: #666;
- margin: 10px 0;
- }
- .assessment-footer {
- display: flex;
- justify-content: space-between;
- align-items: center;
- span {
- color: #999;
- font-size: 12px;
- }
- }
- }
-}
</style>
--
Gitblit v1.9.3