gaoluyang
2025-02-28 42935de0c2ec1a626cef63bce7c79da0e0708d32
人员-培训记录搬迁
已修改9个文件
已添加1个文件
296 ■■■■ 文件已修改
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/personal/personTrainingRecord.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/styles/ruoyi.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Pagination/index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/index.vue 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/tabs/job-responsibilities.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/tabs/personnel-list.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/tabs/reward-punishment-record.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/tabs/training-record.vue 245 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -54,6 +54,7 @@
    "jsencrypt": "3.0.0-rc.1",
    "jspdf": "^3.0.0",
    "mammoth": "^1.9.0",
    "moment": "^2.30.1",
    "nprogress": "0.2.0",
    "pako": "^2.1.0",
    "print-js": "^1.6.0",
src/api/cnas/personal/personTrainingRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
import request from "@/utils/request";
// å¯¼å‡ºåŸ¹è®­è®°å½•
export function exportTrainingRecord(query) {
  return request({
    url: "/personTrainingRecord/exportTrainingRecord",
    method: "get",
    params: query,
    responseType: 'blob'
  });
}
// æŸ¥è¯¢äººå‘˜ åŸ¹è®­è®°å½•
export function trainingSelectTrainingRecord(query) {
  return request({
    url: "/personTrainingRecord/trainingSelectTrainingRecord",
    method: "get",
    params: query,
  });
}
// æŸ¥è¯¢äººå‘˜æ˜Žç»† åŸ¹è®­è®°å½•
export function queryPersonnelDetails(query) {
  return request({
    url: "/personTrainingRecord/queryPersonnelDetails",
    method: "get",
    params: query,
  });
}
src/assets/styles/ruoyi.scss
@@ -121,7 +121,7 @@
  height: 32px;
  margin-bottom: 10px;
  margin-top: 15px;
  padding: 10px 20px !important;
  padding: 0 20px !important;
}
/* tree border */
src/components/Pagination/index.vue
@@ -106,7 +106,8 @@
<style scoped>
.pagination-container {
  background: #fff;
  padding: 32px 16px;
  padding: 28px 16px;
  margin-top: 10px;
}
.pagination-container.hidden {
  display: none;
src/main.js
@@ -49,6 +49,8 @@
import DictData from "@/components/DictData";
import { checkPermi } from "@/utils/permission"; // æƒé™åˆ¤æ–­å‡½æ•°
import { getToken } from "@/utils/auth";
// æ—¶é—´è½¬æ¢
import Moment from 'moment'
// å…¨å±€æ–¹æ³•挂载
Vue.prototype.getDicts = getDicts;
@@ -80,6 +82,8 @@
    });
  }
})
Vue.use(Moment)
Vue.prototype.$moment = Moment
// å…¨å±€ç»„件挂载
Vue.component("DictTag", DictTag);
src/views/CNAS/personnel/personnelInfo/index.vue
@@ -70,11 +70,11 @@
          <rewardPunishmentRecord v-if="activeName === '奖惩记录'"
                                  :departId="departId" :isDepartment="isDepartment"></rewardPunishmentRecord>
        </el-tab-pane>
<!--        <el-tab-pane label="培训记录" name="培训记录">-->
<!--          <training-record v-if="activeName === '培训记录'" ref="trainingRecord"-->
<!--                           :departId="departId"-->
<!--                           :isDepartment="isDepartment"></training-record>-->
<!--        </el-tab-pane>-->
        <el-tab-pane label="培训记录" name="培训记录">
          <training-record v-if="activeName === '培训记录'" ref="trainingRecord"
                           :departId="departId"
                           :isDepartment="isDepartment"></training-record>
        </el-tab-pane>
<!--        <el-tab-pane label="任职授权记录" name="任职授权记录">-->
<!--          <Mandate v-if="activeName === '任职授权记录'" ref="manDateRef" :departId="departId" :isDepartment="isDepartment"></Mandate>-->
<!--        </el-tab-pane>-->
src/views/CNAS/personnel/personnelInfo/tabs/job-responsibilities.vue
@@ -43,6 +43,7 @@
      <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
                     :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
                     background
                     style="margin-top: 10px"
                     @size-change="handleSizeChange"
                     @current-change="handleCurrentChange">
      </el-pagination>
src/views/CNAS/personnel/personnelInfo/tabs/personnel-list.vue
@@ -48,7 +48,7 @@
        :total="page.total"
        background
        layout="->,total, sizes, prev, pager, next, jumper"
        style="margin-top: 16px"
        style="margin-top: 10px"
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
      >
src/views/CNAS/personnel/personnelInfo/tabs/reward-punishment-record.vue
@@ -68,6 +68,7 @@
                     :page-sizes="[10, 20, 30, 50, 100]"
                     :total="search.total" layout="->,total, sizes, prev, pager, next, jumper"
                     background
                     style="margin-top: 10px"
                     @size-change="handleSizeChange"
                     @current-change="handleCurrentChange">
      </el-pagination>
src/views/CNAS/personnel/personnelInfo/tabs/training-record.vue
@@ -2,82 +2,54 @@
<template>
  <div>
    <div class="flex_table">
      <div v-if="isDepartment" style="width: 50%">
<!--        <TableCard :showTitle="false">-->
<!--          <template v-slot:form>-->
<!--            <div class="items_center">-->
<!--              <span>姓名</span>-->
<!--              <el-input v-model="trainingPagination.userName" class="search" clearable placeholder="请输入" size="small"></el-input>-->
<!--              <el-button size="small" type="primary" @click="getPersonnelTraining(departId)">查询</el-button>-->
<!--            </div>-->
<!--            <div>-->
<!--&lt;!&ndash;              <el-button :loading="outLoading" size="small" type="primary" @click="exportExcel">导出</el-button>&ndash;&gt;-->
<!--            </div>-->
<!--          </template>-->
<!--          <template v-slot:table>-->
<!--            <ZTTable-->
<!--              :column="trainingColumn"-->
<!--              :currentChange="currentChange"-->
<!--              :height="'calc(100vh - 18em)'"-->
<!--              :highlightCurrentRow="true"-->
<!--              :table-data="trainingTableData"-->
<!--              :table-loading="trainingLoading"-->
<!--              style="padding: 0 15px;">-->
<!--            </ZTTable>-->
<!--            <div class="pagination">-->
<!--              <div></div>-->
<!--              <el-pagination-->
<!--                :page-size="trainingPagination.size"-->
<!--                :page-sizes="[10, 20, 30, 40]"-->
<!--                :total="trainingPagination.total"-->
<!--                layout="total, sizes, prev, pager, next, jumper"-->
<!--                @current-change="handleYearCurrentTraining"-->
<!--                @size-change="handleYearSizeChangeTraining">-->
<!--              </el-pagination>-->
<!--            </div>-->
<!--          </template>-->
<!--        </TableCard>-->
<!--      </div>-->
<!--      <div :style="`width: ${isDepartment ? '50%' : '100%'};`">-->
<!--        <TableCard :showTitle="false">-->
<!--          <template v-slot:form>-->
<!--            <div class="items_center">-->
<!--              <span>年份</span>-->
<!--              <el-date-picker-->
<!--                v-model="searchForm.trainingDate"-->
<!--                clearable-->
<!--                format="yyyy"-->
<!--                placeholder="选择年"-->
<!--                size="small"-->
<!--                style="margin: 0 10px"-->
<!--                type="year"-->
<!--                value-format="yyyy">-->
<!--              </el-date-picker>-->
<!--              <el-button size="small" type="primary" @click="queryPersonnelDetailsPage(currentChangeRow.userId)">查询</el-button>-->
<!--              <el-button size="small" type="primary" @click="openDownloadDia(currentChangeRow)">导出</el-button>-->
<!--            </div>-->
<!--          </template>-->
<!--          <template v-slot:table>-->
<!--            <ZTTable-->
<!--              :column="trainingPersonColumn"-->
<!--              :height="'calc(100vh - 18em)'"-->
<!--              :table-data="trainingPersonTableData"-->
<!--              :table-loading="trainingPersonLoading"-->
<!--              style="padding: 0 15px;">-->
<!--            </ZTTable>-->
<!--            <div class="pagination">-->
<!--              <div></div>-->
<!--              <el-pagination-->
<!--                :page-size="trainingPersonPagination.size"-->
<!--                :page-sizes="[10, 20, 30, 40]"-->
<!--                :total="trainingPersonPagination.total"-->
<!--                layout="total, sizes, prev, pager, next, jumper"-->
<!--                @current-change="handleYearCurrentPagination"-->
<!--                @size-change="handleYearSizeChangePagination">-->
<!--              </el-pagination>-->
<!--            </div>-->
<!--          </template>-->
<!--        </TableCard>-->
      <div v-if="isDepartment" style="width: 49%">
        <div class="title">
          <span style="font-weight: bold">年度计划</span>
        </div>
        <div style="display: flex;justify-content: space-between;">
          <el-form :model="trainingPagination" ref="trainingPagination" size="small" :inline="true">
            <el-form-item label="姓名">
              <el-input v-model="trainingPagination.userName" class="search" clearable placeholder="请输入" size="small"></el-input>
            </el-form-item>
            <el-form-item>
              <el-button size="small" type="primary" @click="getPersonnelTraining(departId)">查询</el-button>
            </el-form-item>
          </el-form>
        </div>
        <lims-table :tableData="trainingTableData" :column="trainingColumn"
                    ref="trainingTableData"
                    :currentChange="currentChange" :highlightCurrentRow="true"
                    @pagination="pagination" :height="'calc(100vh - 22em)'"
                    :page="trainingPagination" :tableLoading="trainingLoading"></lims-table>
      </div>
      <div :style="`width: ${isDepartment ? '49%' : '100%'};`">
        <div class="title">
          <span style="font-weight: bold">年度计划明细</span>
        </div>
        <div style="display: flex;justify-content: space-between;">
          <el-form :model="searchForm" ref="searchForm" size="small" :inline="true">
            <el-form-item label="年份">
              <el-date-picker
                v-model="searchForm.trainingDate"
                clearable
                format="yyyy"
                placeholder="选择年"
                size="small"
                type="year"
                value-format="yyyy">
              </el-date-picker>
            </el-form-item>
            <el-form-item>
              <el-button size="small" type="primary" @click="queryPersonnelDetailsPage(currentChangeRow.userId)">查询</el-button>
            </el-form-item>
          </el-form>
          <div>
            <el-button size="small" type="primary" @click="openDownloadDia(currentChangeRow)">导出</el-button>
          </div>
        </div>
        <lims-table :tableData="trainingPersonTableData" :column="trainingPersonColumn"
                    :height="'calc(100vh - 22em)'" @pagination="pagination1"
                    :page="trainingPersonPagination" :tableLoading="trainingPersonLoading"></lims-table>
      </div>
    </div>
  </div>
@@ -85,8 +57,15 @@
<script>
import limsTable from "@/components/Table/lims-table.vue";
import {
  exportTrainingRecord,
  queryPersonnelDetails,
  trainingSelectTrainingRecord
} from "@/api/cnas/personal/personTrainingRecord";
export default {
  components: {},
  components: {limsTable},
  props: {
    departId: {
      type: Number,
@@ -215,48 +194,31 @@
      if (!date) {
        date = this.$moment().format('YYYY')
      }
      console.log('date----', date);
      this.$axios.get( this.$api.personnel.exportTrainingRecord+ '?userId=' + row.userId + '&trainingDate=' + date,{responseType: "blob"}).then(res => {
      exportTrainingRecord({userId: row.userId, trainingDate: date}).then(res => {
        this.outLoading = false
        const blob = new Blob([res],{ type: 'application/msword' });
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              const url = URL.createObjectURL(blob);
              const link = document.createElement('a');
              link.href = url;
              link.download = '培训记录导出' + '.docx';
              link.click();
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            const url = URL.createObjectURL(blob);
            const link = document.createElement('a');
            link.href = url;
            link.download = '培训记录导出' + '.docx';
            link.click();
            this.$message.success('导出成功')
          }
        }
        this.$download.saveAs(blob, '培训记录导出.docx');
      })
    },
    // èŽ·å–å®žéªŒå®¤-培训计划列表信息
    getPersonnelTraining(departId) {
      // const name = this.isDepartment ? 'departmentId' : 'userId';
      this.$axios.get(`${this.$api.personnel.trainingSelectTrainingRecord}?departmentId=${departId}&size=${this.trainingPagination.size}&current=${this.trainingPagination.current}&userName=${this.trainingPagination.userName}`).then(res => {
      const params = {
        departmentId: departId,
        size: this.trainingPagination.size,
        current: this.trainingPagination.current,
        userName: this.trainingPagination.userName,
      }
      this.trainingLoading = true
      trainingSelectTrainingRecord(params).then(res => {
        this.trainingLoading = false
        this.trainingTableData = res.data.records;
        this.trainingPagination.total = res.data.total;
        if (this.trainingTableData.length > 0) {
          this.currentChange(this.trainingTableData[0]);
          this.$refs.trainingTableData.setCurrentRow(this.trainingTableData[0])
        }
      });
      }).catch(err => {
        this.trainingLoading = false
      })
    },
    // èŽ·å–ä¸ªäºº-培训计划列表信息
    currentChange(row) {
@@ -270,29 +232,31 @@
      if (this.searchForm.trainingDate === null) {
        this.searchForm.trainingDate = ''
      }
      this.$axios.get(`${this.$api.personnel.queryPersonnelDetails}?userId=${userId}&size=${this.trainingPersonPagination.size}&current=${this.trainingPersonPagination.current}&trainingDate=${this.searchForm.trainingDate}`).then(res => {
      const params = {
        userId: userId,
        size: this.trainingPersonPagination.size,
        current: this.trainingPersonPagination.current,
        trainingDate: this.searchForm.trainingDate,
      }
      this.trainingPersonLoading = true
      queryPersonnelDetails(params).then(res => {
        this.trainingPersonLoading = false
        this.trainingPersonTableData = res.data.records;
        this.trainingPersonPagination.total = res.data.total;
      });
      }).catch(err => {
        this.trainingPersonLoading = false
      })
    },
    // åˆ†é¡µ
    handleYearCurrentTraining(page) {
      this.trainingPagination.curent = page;
      this.getPersonnelTraining(this.departId);
    },
    handleYearSizeChangeTraining(size) {
      this.trainingPagination.size = size;
    pagination(page) {
      this.trainingPagination.size = page.limit;
      this.getPersonnelTraining(this.departId);
    },
    // åˆ†é¡µ
    handleYearCurrentPagination(page) {
      this.trainingPersonPagination.curent = page;
    pagination1(page) {
      this.trainingPersonPagination.size = page.limit;
      this.queryPersonnelDetailsPage(this.currentChangeRow.userId);
    },
    handleYearSizeChangePagination(size) {
      this.trainingPersonPagination.size = size;
      this.queryPersonnelDetailsPage(this.currentChangeRow.userId);
    }
  },
  watch: {
    departId: {
@@ -308,29 +272,32 @@
};
</script>
<style scoped>
>>> .el-form-item {
  margin-bottom: 13px;
}
.flex_table {
  display: flex;
  flex-direction: row;
  justify-content: space-between;
}
.pagination {
  display: flex;
  justify-content: space-between;
  margin-top: 10px;
}
.items_center {
  display: flex;
  align-items: center;
}
.search {
  width: 150px;
  padding: 0 6px;
}
.title {
  position: relative;
  font-size: 16px;
  color: #333;
  font-weight: 400;
  padding-left: 10px;
  margin-bottom: 10px;
}
.title::before {
  position: absolute;
  left: 0;
  top: 4px;
  content: '';
  width: 4px;
  height: 16px;
  background-color: #3A7BFA;
  border-radius: 2px;
}
</style>