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