From 14d29f928b24d203e76f1dcefc1a51182657cd45 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 10 三月 2025 16:29:09 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/center-lims-before-ruoyi into dev

---
 src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue |  567 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 567 insertions(+), 0 deletions(-)

diff --git a/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue
new file mode 100644
index 0000000..49dd10d
--- /dev/null
+++ b/src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue
@@ -0,0 +1,567 @@
+<!-- 浜哄憳鑳藉姏 -->
+<template>
+  <div>
+    <div style="text-align: left; margin-bottom: 15px;padding: 0 16px">
+      <label>濮撳悕</label>
+      <el-input v-model="userName" placeholder="璇疯緭鍏ュ鍚�" size="small" style="width: 20vh;"></el-input>
+      <el-button size="small" type="primary" @click="refreshTable">鏌ヨ</el-button>
+      <div v-if="isDepartment" style="float: right;">
+        <el-button size="small" type="primary" @click="addAppointPost('add')">鏂板</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <TableCard :showForm="false" :showTitle="false">
+        <template v-slot:table>
+          <limsTable :column="yearColumnData" :height="'calc(100vh - 20em)'" :table-data="tableData"
+            :table-loading="yearLoading" style="padding: 0 15px;margin-bottom: 16px" :page="search"
+            @pagination="pagination">
+            <div slot="jobResponsibilities" slot-scope="scope">
+              <div v-html="changeLine(scope.row.responsibilities)"></div>
+            </div>
+            <div slot="placeWorkSlot" slot-scope="scope">
+              <div v-html="changeLine(scope.row.placeWork)"></div>
+            </div>
+          </limsTable>
+        </template>
+      </TableCard>
+    </div>
+    <!--鏂板鑳藉姏璁ゅ畾寮规-->
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="title" :visible.sync="dialogVisible"
+      width="80%" @close="resetForm">
+      <el-form v-if="dialogVisible" ref="infoForm" :model="form" :rules="rules">
+        <el-col :span="12">
+          <el-form-item label="浜哄憳锛�" label-width="110px" prop="userId">
+            <el-select v-model="form.userId" :disabled="operationType === 'view'" clearable filterable placeholder="璇烽�夋嫨"
+              size="small" style="width: 100%;">
+              <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.id">
+              </el-option>
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="鑱岀О锛�" label-width="110px" prop="technicalPost">
+            <el-input v-model="form.technicalPost" :disabled="operationType === 'view'" clearable size="small"
+              style="width: 100%;" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <div style="display: flex;justify-content: space-evenly;font-weight: 600">
+            <span>鏌ユ牳缁撴灉</span>
+            <span>绗﹀悎涓庡惁</span>
+            <span>澶囨敞</span>
+          </div>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="瀛﹀巻锛�" label-width="110px" prop="academicDegree">
+            <el-input v-model="form.academicDegree" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="radio-group" prop="academicConformNot" style="text-align: center">
+            <el-radio-group v-model="form.academicConformNot" :disabled="operationType === 'view'">
+              <el-radio :label="1">绗﹀悎</el-radio>
+              <el-radio :label="2">涓嶇鍚�</el-radio>
+              <el-radio :label="3">涓嶉�傜敤</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="academicRemarks">
+            <el-input v-model="form.academicRemarks" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="鐩稿叧骞撮檺锛�" label-width="110px" prop="relatedYears">
+            <el-input v-model="form.relatedYears" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="radio-group" prop="relatedYearsConformNot" style="text-align: center">
+            <el-radio-group v-model="form.relatedYearsConformNot" :disabled="operationType === 'view'">
+              <el-radio :label="1">绗﹀悎</el-radio>
+              <el-radio :label="2">涓嶇鍚�</el-radio>
+              <el-radio :label="3">涓嶉�傜敤</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="relatedYearsRemarks	">
+            <el-input v-model="form.relatedYearsRemarks" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="鐩稿叧鍩硅锛�" label-width="110px" prop="relatedTraining">
+            <el-input v-model="form.relatedTraining" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="radio-group" prop="relatedTrainingConformNot" style="text-align: center">
+            <el-radio-group v-model="form.relatedTrainingConformNot" :disabled="operationType === 'view'">
+              <el-radio :label="1">绗﹀悎</el-radio>
+              <el-radio :label="2">涓嶇鍚�</el-radio>
+              <el-radio :label="3">涓嶉�傜敤</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="relatedTrainingRemarks">
+            <el-input v-model="form.relatedTrainingRemarks" :disabled="operationType === 'view'"
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="鐩稿叧缁忛獙锛�" label-width="110px" prop="relevantExperience">
+            <el-input v-model="form.relevantExperience" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="radio-group" prop="relevantExperienceConformNot" style="text-align: center">
+            <el-radio-group v-model="form.relevantExperienceConformNot" :disabled="operationType === 'view'">
+              <el-radio :label="1">绗﹀悎</el-radio>
+              <el-radio :label="2">涓嶇鍚�</el-radio>
+              <el-radio :label="3">涓嶉�傜敤</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="relevantExperienceRemarks">
+            <el-input v-model="form.relevantExperienceRemarks" :disabled="operationType === 'view'"
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="涓婂矖璇侊細" label-width="110px" prop="workLicense">
+            <el-input v-model="form.workLicense" :disabled="operationType === 'view'" size="small" style="width: 100%">
+            </el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="radio-group" prop="workLicenseConformNot" style="text-align: center">
+            <el-radio-group v-model="form.workLicenseConformNot" :disabled="operationType === 'view'">
+              <el-radio :label="1">绗﹀悎</el-radio>
+              <el-radio :label="2">涓嶇鍚�</el-radio>
+              <el-radio :label="3">涓嶉�傜敤</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="workLicenseRemarks">
+            <el-input v-model="form.workLicenseRemarks" :disabled="operationType === 'view'" size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="宀椾綅鑱岃矗锛�" label-width="110px" prop="jobResponsibilitiesTem" style="height: 450px">
+            <el-checkbox-group v-model="form.jobResponsibilitiesTem" :disabled="operationType === 'view'"
+              @change="selectResponsibilities">
+              <el-checkbox v-for="city in responsibilities" :key="city.value" :label="city.label"
+                :value="city.value"></el-checkbox>
+            </el-checkbox-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item class="radio-group" prop="jobResponsibilitiesConformNot"
+            style="text-align: center;height: 420px">
+            <el-radio-group v-model="form.jobResponsibilitiesConformNot" :disabled="operationType === 'view'">
+              <el-radio :label="1">绗﹀悎</el-radio>
+              <el-radio :label="2">涓嶇鍚�</el-radio>
+              <el-radio :label="3">涓嶉�傜敤</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item prop="jobResponsibilitiesRemarks" style="height: 420px">
+            <el-input v-model="form.jobResponsibilitiesRemarks" :disabled="operationType === 'view'"
+              size="small"></el-input>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <span style="padding-left: 110px;font-size: 14px">澶囨敞锛氬矖浣嶈亴璐h揪鍒�5椤瑰強5椤逛互涓婁负绗﹀悎</span>
+        </el-col>
+        <el-col :span="16">
+          <el-form-item label="缁煎悎璇勪环锛�" label-width="110px" prop="comprehensiveAssessment">
+            <el-radio-group v-model="form.comprehensiveAssessment" :disabled="operationType === 'view'">
+              <el-radio label="Qualified this position">鍙儨浠昏宀椾綅</el-radio>
+              <el-radio label="You can work while training">鍙竟鍩硅杈逛笂宀�</el-radio>
+              <el-radio label="Iconpetent for the position">涓嶈儨浠昏宀椾綅</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="operationType !== 'view'" @click="resetForm">鍙栨秷</el-button>
+        <el-button v-if="operationType !== 'view'" type="primary" @click="submitForm">淇濆瓨</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import TableCard from '@/components/TableCard/index.vue';
+import {
+  exportPersonnelCapacity,
+  personPersonnelCapacityPage,
+  addOrUpdatePersonPersonnelCapacity,
+  confirmPersonnelCapability,
+  deletePersonPersonnelCapacity,
+  selectUserList,
+} from '@/api/cnas/personnel/personnelInfo.js'
+export default {
+  dicts: ['responsibilities_list'],
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  components: {
+    limsTable,
+    TableCard
+  },
+  data() {
+    return {
+      userName: '',
+      tableData: [],
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      title: '鏂板鑳藉姏璁ゅ畾',
+      operationType: '',
+      yearColumnData: [
+        {
+          label: '宀椾綅',
+          prop: 'postName',
+          minWidth: '100'
+        }, {
+          label: '濮撳悕',
+          prop: 'userName',
+          minWidth: '100'
+        }, {
+          label: '瀛﹀巻',
+          prop: 'academicDegree',
+          minWidth: '100'
+        }, {
+          label: '涓撲笟',
+          prop: 'major',
+          minWidth: '100'
+        }, {
+          label: '鑱岀О',
+          prop: 'technicalPost',
+          minWidth: '100'
+        }, {
+          dataType: 'slot',
+          label: '宸ヤ綔缁忓巻',
+          prop: 'placeWork',
+          minWidth: '100',
+          slot: 'placeWorkSlot'
+        }, {
+          dataType: 'slot',
+          label: '宀椾綅鑱岃矗',
+          prop: 'jobResponsibilities',
+          minWidth: '200px',
+          slot: 'jobResponsibilities'
+        }, {
+          dataType: 'tag',
+          label: '缁煎悎璇勪环',
+          minWidth: '140px',
+          prop: 'comprehensiveAssessment',
+          formatData: (params) => {
+            if (params == 'Qualified this position') {
+              return '鍙儨浠昏宀椾綅';
+            } else if (params == 'You can work while training') {
+              return '鍙竟鍩硅杈逛笂宀�';
+            } else {
+              return '涓嶈儨浠昏宀椾綅';
+            }
+          },
+          formatType: (params) => {
+            if (params == 'Qualified this position') {
+              return 'success';
+            } else if (params == 'You can work while training') {
+              return 'warning';
+            } else {
+              return 'danger';
+            }
+          }
+        }, {
+          label: '纭浜�',
+          prop: 'confirmOperatingPersonnelId',
+          minWidth: '100'
+        }, {
+          label: '纭鏃ユ湡',
+          prop: 'confirmDate',
+          minWidth: '160'
+        }, {
+          dataType: 'action',
+          minWidth: '220',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleViewClick('edit', row);
+              },
+              showHide: (row) => {
+                if (this.isDepartment) {
+                  return true;
+                } else {
+                  return false;
+                }
+              }
+            },
+            {
+              name: '鏌ョ湅',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleViewClick('view', row);
+              }
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.downLoadPost(row);
+              }
+            },
+            {
+              name: '纭',
+              type: 'text',
+              clickFun: (row) => {
+                this.verifyGet(row.id);
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.deletePost(row.id);
+              },
+              showHide: (row) => {
+                if (this.isDepartment) {
+                  return true;
+                } else {
+                  return false;
+                }
+              }
+            }
+          ]
+        }],
+      yearLoading: false,
+      dialogVisible: false,
+      form: {
+        jobResponsibilitiesTem: []
+      },
+      responsibleOptions: [],
+      rules: {
+        userId: [{ required: true, message: '璇烽�夋嫨浜哄憳', trigger: 'change' }],
+        academicDegree: [{ required: true, message: '璇疯緭鍏ュ鍘嗘煡鏍哥粨鏋�', trigger: 'blur' }],
+        academicConformNot: [{ required: true, message: '璇烽�夋嫨瀛﹀巻绗﹀悎涓庡惁', trigger: 'change' }],
+        relatedYears: [{ required: true, message: '璇疯緭鍏ョ浉鍏冲勾闄愭煡鏍哥粨鏋�', trigger: 'blur' }],
+        relatedYearsConformNot: [{ required: true, message: '璇烽�夋嫨鐩稿叧骞撮檺绗﹀悎涓庡惁', trigger: 'change' }],
+        relatedTraining: [{ required: true, message: '璇疯緭鍏ョ浉鍩硅闄愭煡鏍哥粨鏋�', trigger: 'blur' }],
+        relatedTrainingConformNot: [{ required: true, message: '璇烽�夋嫨鐩稿叧鍩硅绗﹀悎涓庡惁', trigger: 'change' }],
+        relevantExperience: [{ required: true, message: '璇疯緭鍏ョ浉鍏崇粡楠屾煡鏍哥粨鏋�', trigger: 'blur' }],
+        relevantExperienceConformNot: [{ required: true, message: '璇烽�夋嫨鐩稿叧缁忛獙绗﹀悎涓庡惁', trigger: 'change' }],
+        workLicense: [{ required: true, message: '璇疯緭鍏ヤ笂宀楄瘉鏌ユ牳缁撴灉', trigger: 'blur' }],
+        workLicenseConformNot: [{ required: true, message: '璇烽�夋嫨涓婂矖璇佺鍚堜笌鍚�', trigger: 'change' }],
+        jobResponsibilitiesTem: [{ required: true, message: '璇烽�夋嫨宀椾綅鑱岃矗鏌ユ牳缁撴灉', trigger: 'change' }],
+        jobResponsibilitiesConformNot: [{ required: true, message: '璇烽�夋嫨宀椾綅鑱岃矗绗﹀悎涓庡惁', trigger: 'change' }],
+        comprehensiveAssessment: [{ required: true, message: '璇烽�夋嫨缁煎悎璇勪环', trigger: 'change' }]
+      },
+      responsibilities: []
+    };
+  },
+  mounted() {
+    this.getList(this.departId);
+  },
+  methods: {
+    // 涓嬭浇
+    downLoadPost(row) {
+      exportPersonnelCapacity({ id: row.id }).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, "浜哄憳鑳藉姏瀵煎嚭" + '.docx')
+      })
+    },
+    // 鏌ヨ
+    refreshTable() {
+      this.getList(this.departId);
+    },
+    // 鑾峰彇浜哄憳鑳藉姏鍒楄〃淇℃伅
+    getList(userId) {
+      this.search.userId = userId;
+      const name = this.isDepartment ? 'departmentId' : 'userId';
+      this.yearLoading = true
+      personPersonnelCapacityPage({
+        userName: this.userName,
+        [name]: this.search.userId,
+        size: this.search.size,
+        current: this.search.current
+      }).then(res => {
+        this.yearLoading = false
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      }).catch(err => {
+        console.log(err);
+        this.yearLoading = false
+      })
+    },
+    selectResponsibilities(arr) {
+      let arrTem = [];
+      arr.map(val => {
+        const index = this.responsibilities.findIndex(item => item.label === val);
+        if (index > -1) {
+          arrTem.push(this.responsibilities[index].value);
+        }
+      });
+      this.form.jobResponsibilities = arrTem.join(',');
+    },
+    getResponsibilities() {
+      this.responsibilities = this.dict.type.responsibilities_list;
+    },
+    changeLine(val) {
+      if (val) {
+        return val.replace(/,/g, '<br>')
+      } else {
+        return
+      }
+    },
+    // 鏂板
+    addAppointPost(type) {
+      this.operationType = type;
+      this.title = '鏂板鑳藉姏璁ゅ畾'
+      this.dialogVisible = true;
+      this.form = {
+        jobResponsibilitiesTem: []
+      }
+      this.getUserList();
+      this.getResponsibilities();
+
+    },
+    // 缂栬緫/鏌ョ湅
+    handleViewClick(type, row) {
+      this.operationType = type;
+      this.title = this.operationType === 'edit' ? '淇敼鑳藉姏璁ゅ畾' : '鏌ョ湅鑳藉姏璁ゅ畾'
+      this.dialogVisible = true;
+      this.form = { ...row }
+      if (this.form.responsibilities) {
+        this.$set(this.form, 'jobResponsibilitiesTem', this.form.responsibilities.split(","))
+      } else {
+        this.$set(this.form, 'jobResponsibilitiesTem', [])
+      }
+      this.getUserList();
+      this.getResponsibilities();
+    },
+    submitForm() {
+      this.$refs.infoForm.validate((valid) => {
+        if (valid) {
+          addOrUpdatePersonPersonnelCapacity(this.form).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛');
+              this.getList(this.departId);
+              this.form.id = null;
+              this.dialogVisible = false;
+            }
+          });
+        }
+      });
+    },
+    verifyGet(id) {
+      this.$confirm('鏄惁纭鏈潯淇℃伅?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        confirmPersonnelCapability({ id }).then(res => {
+          if (res.code == 200) {
+            this.$message.success('纭鎴愬姛');
+            this.getList(this.departId);
+          }
+        });
+      }).catch((err) => {
+        console.log('err---', err);
+        this.$message.info('宸插彇娑�')
+      });
+    },
+    // 鍒犻櫎宀椾綅鑱岃矗
+    deletePost(id) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎姝ゆ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deletePersonPersonnelCapacity({ id }).then(res => {
+          if (res.code == 200) {
+            this.$message.success('鍒犻櫎鎴愬姛');
+            this.getList(this.departId);
+          }
+        });
+      }).catch(() => {
+        this.$message.error('鍒犻櫎澶辫触');
+      });
+    },
+    resetForm() {
+      this.$refs.infoForm.resetFields();
+      this.dialogVisible = false;
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      selectUserList().then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data;
+        }
+      });
+    },
+    pagination({ page, limit }) {
+      this.search.current = page;
+      this.search.size = limit;
+      this.getList();
+    },
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    departId: {
+      handler(newId, oldId) {
+        this.getList(newId);
+      }
+    },
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    isDepartment: {
+      handler(newId, oldId) {
+        this.getList(this.departId);
+      }
+    },
+  }
+};
+</script>
+<style scoped>
+>>>.el-dialog {
+  margin: 6vh auto 50px !important;
+}
+
+>>>.el-dialog__body {
+  max-height: 70vh;
+  overflow-y: auto;
+}
+
+.radio-group>>>.el-form-item__error {
+  padding-left: 38px;
+}
+
+>>>.el-checkbox__label {
+  width: 212px;
+  white-space: pre-wrap;
+}
+</style>

--
Gitblit v1.9.3