From dc3af0cbb4a6d105bdff497b510cc0a87b3e8d0a Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期五, 28 二月 2025 17:53:44 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-before into dev

---
 src/views/CNAS/personnel/personnelInfo/tabs/personnel-information.vue | 1115 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,115 insertions(+), 0 deletions(-)

diff --git a/src/views/CNAS/personnel/personnelInfo/tabs/personnel-information.vue b/src/views/CNAS/personnel/personnelInfo/tabs/personnel-information.vue
new file mode 100644
index 0000000..2b71f75
--- /dev/null
+++ b/src/views/CNAS/personnel/personnelInfo/tabs/personnel-information.vue
@@ -0,0 +1,1115 @@
+<template>
+  <div>
+    <div style="text-align: right;margin-bottom: 10px">
+<!--       <el-button size="small" @click="$emit('goBackList')">杩斿洖</el-button>-->
+      <el-button size="small" type="primary" @click="downPerson">涓嬭浇妗f</el-button>
+      <el-button size="small" type="primary" @click="dialogVisible = true">浜哄憳鍒嗙被</el-button>
+      <el-button :loading="saveLoading" size="small" type="primary" @click="save">淇濆瓨</el-button>
+    </div>
+    <div>
+      <div style="display: flex;flex-direction: row;">
+        <div style="width: 12em">
+          <el-image :src="javaApi + '/img/' + form.pictureUrl" fit="fill"
+                    style="width:100%;height: 300px;border: 1px solid #000;border-radius: 10px;margin-left: 6px;margin-top: 10px;">
+            <div slot="error" class="image-slot">
+              <i class="el-icon-picture-outline" style="font-size: 40px;"></i>
+            </div>
+          </el-image>
+          <el-image :src="javaApi + '/img/' + form.signatureUrl" fit="fill"
+                    style="width:80%;height: 50px;border: 1px solid #000;border-radius: 10px;margin-left: 22px;margin-top: 20px;">
+            <div slot="error" class="image-slot">
+              <i class="el-icon-picture-outline" style="font-size: 40px;"></i>
+            </div>
+          </el-image>
+        </div>
+        <div style="height: calc(100vh - 14em);overflow-y: auto">
+          <el-form ref="form" :model="form" label-width="110px">
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="濮撳悕">
+                  <el-input disabled v-model="form.name" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="宸ュ彿">
+                  <el-input disabled v-model="form.account" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="褰撳墠鐘舵��">
+                  <el-radio-group v-model="form.currentState">
+                    <el-radio label="1formal" size="mini">姝e紡</el-radio>
+                    <el-radio label="2intern" size="mini">瀹炰範</el-radio>
+                    <el-radio label="3leaveOffice" size="mini">绂昏亴</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鎬у埆">
+                  <el-radio-group v-model="form.sex">
+                    <el-radio label="1" size="mini">鐢�</el-radio>
+                    <el-radio label="0" size="mini">濂�</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍏徃鍚嶇О">
+                  <el-input v-model="form.corporateName" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鎵�灞為儴闂�">
+                  <el-cascader v-model="form.departLimsId" :options="department" :props="{ label: 'name', value: 'id',checkStrictly: true }"  filterable style="width: 100%;"></el-cascader>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="宀椾綅鍚嶇О">
+                  <el-input v-model="form.postName" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍏ラ泦鍥㈡椂闂�">
+                  <el-date-picker v-model="form.groupTime" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                  style="width: 99%;" type="date" value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍔冲姩鍏崇郴">
+                  <el-radio-group v-model="form.laborRelations">
+                    <el-radio :label=0 size="mini">鍚堝悓宸�</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鍏徃閭">
+                  <el-input v-model="form.email" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="宸ヤ綔鏃堕棿">
+                  <el-date-picker v-model="form.workingTime" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                  style="width: 99%;" type="date" value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍚堝悓鍒版湡鏃堕棿">
+                  <el-date-picker v-model="form.contractLifeTime" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                  style="width: 99%;" type="date" value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鑱岀О">
+                  <el-input v-model="form.professionalTitle" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="16" style="text-align: left;">
+                <el-form-item label="浜哄憳鍒嗙被">
+                  <span style="color: #000;">{{ form.personnelClassification }}</span>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鍑虹敓鏃ユ湡">
+                  <el-date-picker v-model="form.dateBirth" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                  @change="getAge"
+                                  style="width: 99%;" type="date" value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="绫嶈疮">
+                  <el-input v-model="form.nativePlace" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="姘戞棌">
+                  <el-input v-model="form.nation" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="韬唤璇佸彿">
+                  <el-input v-model="form.identityCard" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="骞撮緞">
+                  <el-input-number v-model="form.age" :max="130" :min="1"
+                                   controls-position="right" size="small" style="width: 99%;"></el-input-number>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="濠氬Щ鐘跺喌">
+                  <el-radio-group v-model="form.maritalStatus">
+                    <el-radio :label=0 size="mini">宸插</el-radio>
+                    <el-radio :label=1 size="mini">鏈</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="璇佷欢鏈夋晥鏈�">
+                  <el-date-picker v-model="form.validityPeriod" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
+                                  size="small" style="width: 99%;" type="date"
+                                  value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="璇佷欢鍦板潃">
+                  <el-input v-model="form.idAddress" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="璇佷欢璇︾粏鍦板潃">
+                  <el-input v-model="form.idDetailAddress" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鏀挎不闈㈣矊">
+                  <el-input v-model="form.politicalStatus" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍏ュ厷/鍥㈡椂闂�">
+                  <el-date-picker v-model="form.dumplingTime" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
+                                  size="small" style="width: 99%;" type="date"
+                                  value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鎵嬫満鍙�">
+                  <el-input v-model="form.telephone" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鏈�楂樺鍘�">
+                  <el-input v-model="form.officialAcademicRedentials" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鏈�楂樺浣�">
+                  <el-input v-model="form.highestDegree" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="姣曚笟闄㈡牎1">
+                  <el-input v-model="form.graduatedInstitutions1" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="涓撲笟1">
+                  <el-input v-model="form.major1" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="姣曚笟鏃堕棿1">
+                  <el-date-picker v-model="form.graduationTime1" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
+                                  size="small" style="width: 99%;" type="date"
+                                  value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="姣曚笟闄㈡牎2">
+                  <el-input v-model="form.graduatedInstitutions2" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="涓撲笟2">
+                  <el-input v-model="form.major2" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="姣曚笟鏃堕棿2">
+                  <el-date-picker v-model="form.graduationTime2" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
+                                  size="small" style="width: 99%;" type="date"
+                                  value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="鐧昏鏃堕棿">
+                  <el-date-picker v-model="form.lastUpdateTime" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡"
+                                  size="small" style="width: 99%;" type="date"
+                                  value-format="yyyy-MM-dd HH:mm:ss">
+                  </el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="澶囨敞">
+                  <el-input type="textarea" v-model="form.remarks" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="18">
+                <el-form-item label="涓汉鐓х墖">
+                  <el-input v-model="form.pictureUrl" disabled size="small">
+                    <el-button v-if="form.pictureUrl" slot="append" icon="el-icon-delete-solid"
+                               @click="deleteFile(form.pictureUrl, 'pictureUrl')"></el-button>
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-upload ref="upload" :action="action"
+                           :headers="uploadHeader"
+                           :on-success="(response, file, fileList) => onSuccess(response, file, fileList, 'pictureUrl')"
+                           :show-file-list="false"
+                           style="float: left; margin: 0 10px 0 10px;">
+                  <el-button slot="trigger" class="uploadFile" size="mini" type="primary">涓婁紶</el-button>
+                </el-upload>
+                <el-button v-if="form.pictureUrl" class="uploadFile" size="mini"
+                           type="primary" @click="downloadFile(form.pictureUrl)">涓嬭浇</el-button>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="18">
+                <el-form-item label="鐢靛瓙绛惧悕">
+                  <el-input v-model="form.signatureUrl" disabled size="small">
+                    <el-button v-if="form.signatureUrl" slot="append" icon="el-icon-delete-solid"
+                               @click="deleteFile(form.signatureUrl, 'signatureUrl')"></el-button>
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-upload ref="upload" :action="action"
+                           :headers="uploadHeader"
+                           :on-success="(response, file, fileList) => onSuccess(response, file, fileList, 'signatureUrl')"
+                           :show-file-list="false"
+                           style="float: left; margin: 0 10px 0 10px;">
+                  <el-button slot="trigger" class="uploadFile" size="small" type="primary">涓婁紶</el-button>
+                </el-upload>
+                <el-button v-if="form.signatureUrl" class="uploadFile" size="small"
+                           type="primary" @click="downloadFile(form.signatureUrl)">涓嬭浇</el-button>
+              </el-col>
+            </el-row>
+            <el-row>
+              <el-col :span="20">
+                <el-form-item label="璇佷功璧勬枡" >
+                </el-form-item>
+              </el-col>
+              <el-col :span="4">
+                <el-button size="mini" style="float: right;margin-right: 25px" type="primary" @click="annexAdd(0)">鏂板</el-button>
+              </el-col>
+            </el-row>
+            <lims-table :tableData="annexList" :column="columnData2" style="width: 96%;margin-left: 34px"
+                        height="200" :tableLoading="tableLoading2"></lims-table>
+            <el-row style="margin-top: 10px">
+              <el-col :span="20">
+                <el-form-item label="闄勪欢璧勬枡" >
+                </el-form-item>
+              </el-col>
+              <el-col :span="4">
+                <el-upload ref='upload'
+                           :action="fileAction"
+                           :auto-upload="true" :data="{userId: clickNodeVal.userId}"
+                           :before-upload="fileBeforeUpload"
+                           :headers="uploadHeader" :on-error="onError"
+                           :on-success="handleSuccessUp"
+                           :show-file-list="false"
+                           accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' style="width: 80px !important;">
+                  <el-button size="small" type="primary">闄勪欢涓婁紶</el-button>
+                </el-upload>
+              </el-col>
+            </el-row>
+            <lims-table :tableData="tableData" :column="columnData" style="width: 96%;float: right;"
+                        height="200" :tableLoading="tableLoading"></lims-table>
+            <el-row style="margin-top: 10px">
+              <el-col :span="20">
+                <el-form-item label="宸ヤ綔缁忓巻" >
+                </el-form-item>
+              </el-col>
+              <el-col :span="4">
+                <el-button size="mini" style="float: right;margin-right: 25px" type="primary" @click="annexAdd1('add')">鏂板</el-button>
+              </el-col>
+            </el-row>
+            <el-table :data="tableData1" border height="200" style="width: 96%;float: right;" v-loading="tableLoading1">
+              <el-table-column label="搴忓彿" type="index" width="55px" align="center">
+              </el-table-column>
+              <el-table-column label="宸ヤ綔缁忓巻" prop="workExperience">
+              </el-table-column>
+              <el-table-column align="center" label="鎿嶄綔">
+                <template slot-scope="scope">
+                  <el-button type="text" size="mini" @click="annexAdd1('edit',scope.row)">缂栬緫</el-button>
+                  <el-button type="text" size="mini" @click="deleteAnnex1(scope.row)" style="color: #f56c6c">鍒犻櫎</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form>
+        </div>
+      </div>
+    </div>
+    <!-- 浜哄憳鍒嗙被寮规 -->
+    <el-dialog :visible.sync="dialogVisible" title="鎻愮ず" width="40%" @open="getComparisonList">
+      <div style="height: 30vh;">
+        <el-row>
+          <el-col :span="4">
+            浜哄憳鍒嗙被锛�
+          </el-col>
+          <el-col :span="20" style="text-align: left;">
+            <el-checkbox-group v-model="checkList">
+              <el-checkbox v-for="v in dict.type.personnl_type" :key="v.value"
+                           :label="v.value"></el-checkbox>
+            </el-checkbox-group>
+          </el-col>
+        </el-row>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="clickPersonnelClassificationSure">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+
+    <!-- 鏂板闄勪欢璧勬枡 -->
+    <el-dialog :before-close="handleClose" :title="title" :visible.sync="dialogVisible1" width="40%" @open="getComparisonList">
+      <el-form ref="annex" :model="annex" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="16">
+            <el-form-item label="璇佷欢鍙�" prop="idNumber">
+              <el-input v-model="annex.idNumber" clearable size="small" style="width: 100%;"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row style="margin-top: 15px">
+          <el-col :span="16">
+            <el-form-item label="鍙戣瘉鍗曚綅" prop="issueUnit">
+              <el-input v-model="annex.issueUnit" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row style="margin-top: 15px">
+          <el-col :span="16">
+            <el-form-item label="绾у埆">
+              <el-input v-model="annex.level" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row style="margin-top: 15px">
+          <el-col :span="16">
+            <el-form-item label="鏈夋晥鏈�" prop="periodValidity">
+              <el-input v-model="annex.periodValidity" clearable size="small"></el-input>
+<!--              <el-date-picker v-model="annex.periodValidity" format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"-->
+<!--                              style="width: 99%;" type="date" value-format="yyyy-MM-dd">-->
+<!--              </el-date-picker>-->
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row style="margin-top: 15px">
+          <el-col :span="16">
+            <el-form-item label="澶嶅嵃浠�">
+              <el-input v-model="annex.copy" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+
+        <el-row style="margin-top: 15px">
+          <el-col :span="16">
+            <el-form-item label="鍘熶欢">
+              <el-input v-model="annex.original" clearable size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row style="margin-top: 15px">
+          <el-col :span="16">
+            <el-form-item label="鏂囦欢">
+              <el-upload
+                :action="action"
+                :before-upload="beforeAvatarUpload"
+                :headers="uploadHeader"
+                :on-success="(response,file,fileList) => onSuccess(response, file, fileList, 'fileName')"
+                :show-file-list="false">
+                <span v-if="annex.fileName">{{annex.fileName}}</span>
+<!--                <img v-if="imageUrl" :src="imageUrl" class="avatar">-->
+                <i v-else class="el-icon-upload avatar-uploader-icon"></i>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="cancellation">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+    <!-- 鏂板宸ヤ綔缁忓巻 -->
+    <el-dialog @close="handleClose2" title="娣诲姞宸ヤ綔缁忓巻" :visible.sync="dialogVisible2" width="40%">
+      <el-form ref="annex2" :model="annex2" label-width="100px">
+        <el-row>
+          <el-col :span="16">
+            <el-form-item label="宸ヤ綔缁忓巻" prop="idNumber">
+              <el-input type="textarea" v-model="annex2.workExperience" clearable size="small" style="width: 100%;"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="handleClose2">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm2">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import fileDownload from '@/utils/file'
+import {
+  addAnnex,
+  addBasicInfoWork,
+  delBasicInfoFileList,
+  delBasicInfoWorkList,
+  deleteAnnex, deleteCNASFile,
+  exportPersonBasicInfoById,
+  getAnnex,
+  getAnnexByUserId,
+  getBasicInfoFileList,
+  getBasicInfoWorkList,
+  getCNASPersonnelInfo,
+  saveCNASPersonnelInfo,
+  updateAnnex,
+  updateBasicInfoWorkList
+} from "@/api/cnas/personal/personalList";
+import limsTable from "@/components/Table/lims-table.vue";
+
+export default {
+  props: {
+    clickNodeVal: {
+      type: Object,
+      default: () => { return {} }
+    },
+  },
+  dicts: ['personnl_type'],
+  data() {
+    return {
+      operationType: '',
+      basicInfoWorkId: '',
+      dialogVisible2: false,
+      annex2: {
+        workExperience: ''
+      },
+      tableLoading: false,
+      tableData: [],
+      columnData: [
+        {
+          label: '鏂囦欢鍚嶇О',
+          prop: 'fileName',
+          minWidth: '150px'
+        },
+        {
+          dataType: 'action',
+          minWidth: '100',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.upload(row)
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.delete(row)
+              }
+            }
+          ]
+        }
+      ],
+      columnData2: [
+        {
+          label: '璇佷欢鍙�',
+          prop: 'idNumber',
+          minWidth: '150px'
+        },{
+          label: '鍙戣瘉鍗曚綅',
+          prop: 'issueUnit',
+          minWidth: '150px'
+        },{
+          label: '鏂囦欢鍚嶇О',
+          prop: 'fileName',
+          minWidth: '200px'
+        },{
+          label: '绾у埆',
+          prop: 'level',
+          minWidth: '150px'
+        },{
+          label: '鏈夋晥鏈�',
+          prop: 'periodValidity',
+          minWidth: '150px'
+        },{
+          label: '娣诲姞鏃堕棿',
+          prop: 'createTime',
+          minWidth: '150px'
+        },
+        {
+          dataType: 'action',
+          minWidth: '130',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '涓嬭浇',
+              type: 'text',
+              clickFun: (row) => {
+                this.downloadFile(row.fileName)
+              }
+            },
+            {
+              name: '缂栬緫',
+              type: 'text',
+              clickFun: (row) => {
+                this.annexAdd(1,row)
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.deleteAnnex(row)
+              }
+            }
+          ]
+        }
+      ],
+      tableLoading1: false,
+      tableLoading2: false,
+      tableData1: [],
+      addOrupdate: null,
+      title: '',
+      annexList: [],
+      imageUrl: '',
+      annex: {
+        userId: '',
+        idNumber: '',
+        issueUnit: '',
+        level: '',
+        periodValidity: '',
+        copy: '',
+        original: '',
+        fileName: ''
+      },
+      rules: {
+        idNumber: [
+          { required: true, message: '璇疯緭鍏ヨ瘉浠跺彿', trigger: 'blur' }
+        ],
+        issueUnit: [
+          { required: true, message: '璇疯緭鍏ュ彂璇佸崟浣�', trigger: 'blur' }
+        ],
+        periodValidity: [
+          { required: false, message: '璇烽�夋嫨鏈夋晥鏈�', trigger: 'blur' }
+        ]
+      },
+      dialogVisible1: false,
+      form: {
+        userId: '',
+        name: '',
+        account: '',
+        currentState: '',
+        sex: '',
+        corporateName: '',
+        department: '',
+        departLimsId: [],
+        postName: '',
+        groupTime: '',
+        laborRelations: '',
+        workingTime: '',
+        contractLifeTime: '',
+        personnelClassification: '',
+        dateBirth: '',
+        nativePlace: '',
+        nation: '',
+        identityCard: '',
+        age: '',
+        validityPeriod: '',
+        maritalStatus: '',
+        idAddress: '',
+        idDetailAddress: '',
+        politicalStatus: '',
+        dumplingTime: '',
+        telephone: '',
+        email: '',
+        officialAcademicRedentials: '',
+        highestDegree: '',
+        graduatedInstitutions1: '',
+        major1: '',
+        graduationTime1: '',
+        graduatedInstitutions2: '',
+        major2: '',
+        graduationTime2: '',
+        lastUpdateTime: '',
+        pictureUrl: '',
+        signatureUrl: '',
+        professionalTitle: '',
+        remarks: '',
+      },
+      department: [],
+      saveLoading: false,
+      dialogVisible: false,
+      checkList: [],
+      successFileList: [], // 闃叉鍚庣鍑虹幇鑴忔暟鎹�
+      isSave: false,
+    }
+  },
+  components: {limsTable, fileDownload},
+  created() {
+    this.init()
+    this.searchTableList()
+    this.searchTableList2()
+  },
+  computed: {
+    action() {
+      return this.javaApi + '/personBasicInfo/saveCNASFile'
+    },
+    fileAction() {
+      return this.javaApi + '/personBasicInfo/uploadBasicInfoFile'
+    },
+  },
+  methods: {
+    // 涓嬭浇妗f
+    downPerson(){
+      exportPersonBasicInfoById({id: this.clickNodeVal.userId}).then(res => {
+        const blob = new Blob([res],{ type: 'application/msword' });
+        this.$download.saveAs(blob, '浜哄憳妗f.docx');
+        this.$message.success('瀵煎嚭鎴愬姛')
+      })
+    },
+    // 涓婁紶楠岃瘉
+    fileBeforeUpload(file) {
+      let flag = true
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        flag = false
+      }
+      if (!flag) {
+        return Promise.reject(flag); //姝g‘鐨勭粓姝�
+      }
+    },
+    onError(err, file, fileList,type) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+    },
+    handleSuccessUp(response, ) {
+      this.upLoading = false;
+      if (response.code == 200) {
+        this.$message.success('涓婁紶鎴愬姛');
+        this.searchTableList()
+      } else {
+        this.$message.error(response.message);
+      }
+    },
+    // 鏌ヨ闄勪欢鍒楄〃
+    searchTableList () {
+      this.tableLoading = true
+      getBasicInfoFileList({userId: this.clickNodeVal.userId}).then(res => {
+        this.tableLoading = false
+        this.tableData = res.data
+      }).catch(err => {
+        this.tableLoading = false
+        console.log('err---', err);
+      })
+    },
+    // 涓嬭浇
+    upload (row) {
+      let url = '';
+      if(row.type==1){
+        url = this.javaApi+'/img/'+row.fileUrl
+        fileDownload.downloadIamge(url,row.fileName)
+      }else{
+        url = this.javaApi+'/word/'+row.fileUrl
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = row.fileName;
+        link.click();
+      }
+    },
+    // 鍒犻櫎
+    delete (row) {
+      this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading = true
+        delBasicInfoFileList({basicInfoFileId: row.basicInfoFileId}).then(res => {
+          this.tableLoading = false
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchTableList();
+        }).catch(err => {
+          this.tableLoading = false
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      })
+    },
+    // 鎵撳紑宸ヤ綔缁忓巻鎺㈠喌
+    annexAdd1 (type, row) {
+      this.operationType = type
+      if (type === 'edit') {
+        this.basicInfoWorkId = row.basicInfoWorkId
+        this.annex2.workExperience = row.workExperience
+      } else {
+        this.basicInfoWorkId = ''
+        this.annex2.workExperience = ''
+      }
+      this.dialogVisible2 = true
+    },
+    // 鎻愪氦宸ヤ綔缁忓巻
+    submitForm2 () {
+      const params = {
+        workExperience: this.annex2.workExperience,
+        userId: this.clickNodeVal.userId,
+        basicInfoWorkId: this.basicInfoWorkId
+      }
+      this.tableLoading1 = true
+      if (this.operationType === 'add') {
+        addBasicInfoWork(params).then(res => {
+          this.tableLoading1 = false
+          if (res.code == 200) {
+            this.dialogVisible2 = false
+            this.$message.success('鏂板鎴愬姛')
+            this.searchTableList2();
+          }
+        }).catch(err => {
+          this.tableLoading1 = false
+        })
+      } else {
+        updateBasicInfoWorkList(params).then(res => {
+          this.tableLoading1 = false
+          this.dialogVisible2 = false
+          this.$message.success('淇敼鎴愬姛')
+          this.searchTableList2();
+        }).catch(err => {
+          this.tableLoading1 = false
+        })
+      }
+    },
+    // 鍏抽棴宸ヤ綔缁忓巻寮规
+    handleClose2 () {
+      this.dialogVisible2 = false
+      this.annex2.workExperience = ''
+    },
+    // 鍒犻櫎宸ヤ綔缁忓巻
+    deleteAnnex1 (row) {
+      this.$confirm('姝ゆ搷浣滃皢鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.tableLoading1 = true
+        delBasicInfoWorkList({basicInfoWorkId: row.basicInfoWorkId}).then(res => {
+          this.tableLoading1 = false
+          this.$message.success('鍒犻櫎鎴愬姛')
+          this.searchTableList2();
+        }).catch(err => {
+          this.tableLoading1 = false
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 鏌ヨ宸ヤ綔缁忓巻鍒楄〃
+    searchTableList2 () {
+      this.tableLoading1 = true
+      getBasicInfoWorkList({userId: this.clickNodeVal.userId}).then(res => {
+        this.tableLoading1 = false
+        this.tableData1 = res.data
+      }).catch(err => {
+        this.tableLoading1 = false
+        console.log('err---', err);
+      })
+    },
+    annexAdd(type,row) {
+      if(type === 1) {
+        this.title = '缂栬緫闄勪欢璧勬枡'
+        this.addOrupdate = 1
+        getAnnex({id: row.id}).then(res => {
+          this.annex = res.data
+          this.imageUrl = this.javaApi + '/img/' + res.data.fileName
+        })
+      }else {
+        this.title = '鏂板闄勪欢璧勬枡'
+        this.addOrupdate = 2
+      }
+      this.dialogVisible1 = true
+    },
+    submitForm() {
+      this.$refs['annex'].validate((valid) => {
+        if (valid) {
+          this.addAnnex()
+        } else {
+          return false
+        }
+      })
+    },
+    addAnnex() {
+      if(this.annex.fileName == "" || this.annex.fileName == null || this.annex.fileName == undefined) {
+        this.$message.error("璇蜂笂浼犳枃浠�")
+        return
+      }
+      this.annex.userId = this.clickNodeVal.userId
+      if(this.addOrupdate === 1) {
+        updateAnnex(this.annex).then(res => {
+          if(res.code == 200) {
+            getAnnexByUserId({userId: this.clickNodeVal.userId}).then(res => {
+              this.imageUrl = ''
+              this.resetForm('annex')
+              this.annexList = res.data
+              this.dialogVisible1 = false
+              this.$message.success('鏇存柊鎴愬姛锛�')
+            })
+          }
+        })
+      }else {
+        this.annex.id = null
+        addAnnex(this.annex).then(res => {
+          if(res.code == 200) {
+            getAnnexByUserId({userId: this.clickNodeVal.userId}).then(res => {
+              this.imageUrl = ''
+              this.resetForm('annex')
+              this.annexList = res.data
+              this.dialogVisible1 = false
+              this.$message.success('淇濆瓨鎴愬姛')
+            })
+          }
+        })
+      }
+    },
+    deleteAnnex(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        deleteAnnex({id: row.id}).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.annexList = this.annexList.filter(item => item.id != row.id)
+        })
+      })
+    },
+    beforeAvatarUpload(file) {
+      let flag = true
+      if (file.size > 1024 * 1024 * 10) {
+        this.$message.error('涓婁紶鏂囦欢涓嶈秴杩�10M');
+        this.$refs.upload.clearFiles()
+        flag = false
+      }
+      if (!flag) {
+        return Promise.reject(flag); //姝g‘鐨勭粓姝�
+      }
+    },
+    downloadFile(fileName) {
+      let state = /\.(jpg|jpeg|png|gif)$/i.test(fileName)
+      if (state) {
+        let url = this.javaApi + '/img/' + fileName;
+        fileDownload.downloadIamge(url, fileName)
+      } else {
+        const url = this.javaApi + '/word/' + fileName
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = fileName;
+        link.click();
+        this.$message.success('涓嬭浇鎴愬姛')
+      }
+    },
+    async onSuccess(response, file, fileList, entityVal) {
+      if(entityVal == 'fileName') {
+        this.annex.fileName = response.data
+      }
+      // 鍦ㄤ繚瀛樿祴鍊兼柊鏂囦欢
+      this.successFileList.push(response.data)
+      this.$set(this.form, entityVal, response.data)
+    },
+    // 鍒濆鍖栬皟鐢�
+    init() {
+      if (!this.clickNodeVal.userId) {
+        let user = JSON.parse(localStorage.getItem('user'))
+        this.getUserBasisInfo(user.userId)
+        this.clickNodeVal.userId = user.userId
+      } else {
+        this.getUserBasisInfo(this.clickNodeVal.userId)
+      }
+    },
+    getUserBasisInfo(userId) {
+      getCNASPersonnelInfo({userId: userId}).then(res => {
+        this.form = res.data.PersonBasicInfoDto
+        this.department = res.data.department
+        this.annexList = res.data.annexList
+        this.form.departLimsId = res.data.PersonBasicInfoDto.departLimsId.split(',').filter(a => a != "").map(Number)
+      })
+    },
+    async save() {
+      this.saveLoading = true
+      this.form.userId = this.clickNodeVal.userId
+      if(Array.isArray(this.form.departLimsId)) {
+        if(this.form.departLimsId.length > 0) {
+          this.form.departLimsId = this.form.departLimsId.join(',').trim() + ','
+        }else {
+          this.form.departLimsId = ''
+        }
+      }
+      saveCNASPersonnelInfo(this.form).then(res => {
+        this.saveLoading = false
+        this.isSave = true
+        this.getUserBasisInfo(this.clickNodeVal.userId)
+        this.$message.success('淇濆瓨鎴愬姛锛�')
+      })
+    },
+    // 鍙栦汉鍛樺垎绫荤殑瀛楀吀
+    getComparisonList() {
+      if (this.checkList.length > 0) {
+        this.form.personnelClassification = this.checkList.split('锛�')
+      }
+    },
+    clickPersonnelClassificationSure() {
+      this.dialogVisible = false
+      this.form.personnelClassification = this.checkList.filter(m=>m).join('锛�')
+    },
+    async deleteFile(fileName, entityVal) {
+      await deleteCNASFile({fileName: fileName}).then(res => {
+        this.$message.success('鍒犻櫎鎴愬姛锛�')
+        this.$set(this.form, entityVal, null)
+        let index = this.successFileList.indexOf(fileName)
+        if (index != -1) {
+          this.successFileList.splice(index, 1)
+        }
+      })
+    },
+    cancellation() {
+      this.dialogVisible1 = false
+      this.imageUrl = ''
+      this.resetForm('annex')
+    },
+    handleClose(done) {
+      this.imageUrl = ''
+      this.annex = {
+        userId: '',
+        idNumber: '',
+        issueUnit: '',
+        level: '',
+        periodValidity: '',
+        copy: '',
+        original: '',
+        fileName: ''
+      }
+      done();
+    },
+    resetForm(formName) {
+      this.$refs[formName].resetFields();
+    },
+    getAge (val) {
+      this.form.age = this.calculateAge(val)
+    },
+    calculateAge(birthDateString) {
+      // 瑙f瀽鍑虹敓鏃ユ湡瀛楃涓蹭负鏃ユ湡瀵硅薄
+      const birthDate = new Date(birthDateString);
+
+      // 鑾峰彇褰撳墠鏃ユ湡
+      const currentDate = new Date();
+
+      // 璁$畻骞翠唤宸�
+      let age = currentDate.getFullYear() - birthDate.getFullYear();
+
+      // 妫�鏌ユ槸鍚﹀凡缁忚繃浜嗕粖骞寸殑鐢熸棩
+      const currentMonth = currentDate.getMonth();
+      const currentDay = currentDate.getDate();
+      const birthMonth = birthDate.getMonth();
+      const birthDay = birthDate.getDate();
+
+      if (currentMonth < birthMonth || (currentMonth === birthMonth && currentDay < birthDay)) {
+        // 濡傛灉杩樻病鍒颁粖骞寸殑鐢熸棩锛屽勾榫勫噺1
+        age--;
+      }
+
+      return age;
+    }
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    clickNodeVal: {
+      handler(newVal, oldVal) {
+        if (newVal.userId) {
+          this.getUserBasisInfo(newVal.userId)
+          this.searchTableList()
+          this.searchTableList2()
+        }
+      },
+    }
+  }
+}
+</script>
+
+<style scoped>
+>>>.el-table__body-wrapper::-webkit-scrollbar {
+  height: 12px;
+  /* 璁剧疆婊氬姩鏉″搴� */
+}
+>>>.el-form-item {
+    margin-bottom: 3px;
+}
+
+.el-input {
+    border-radius: 15px;
+}
+
+.el-icon-picture-outline {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+}
+
+.uploadFile {
+    margin-top: 2px;
+    float: left;
+}
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #0f8bf1;
+    width: 178px;
+    height: 50px;
+    text-align: center;
+    border: 1px solid #d9d9d9;
+  }
+  .avatar {
+    width: 178px;
+    height: 178px;
+    display: block;
+  }
+</style>

--
Gitblit v1.9.3