From f18c78c262089284bf6099b3fc37c61cdfb4cfaf Mon Sep 17 00:00:00 2001
From: licp <lichunping@guanfang.com.cn>
Date: 星期四, 26 十二月 2024 14:33:08 +0800
Subject: [PATCH] 完成人员迁移

---
 src/components/do/a6-personnel/training-record.vue          |  319 +++
 src/components/view/a7-changes-standard-methods.vue         |   23 
 src/components/do/a6-personnel/personnel-information.vue    |  948 ++++++++++
 src/assets/api/controller.js                                |  150 +
 src/components/do/a6-personnel/personnel-supervision.vue    |  100 +
 src/components/do/a6-personnel-training/AddInDetail.vue     |  173 +
 src/components/do/a6-personnel/job-responsibilities.vue     |  374 ++++
 src/components/do/a6-personnel-training/Edit.vue            |  448 +++++
 src/components/do/a6-personnel-training/index.vue           |  794 ++++++++
 src/main.js                                                 |    2 
 src/components/do/a6-personnel-collect/personnel-list.vue   |  388 ++++
 src/components/do/a6-personnel/personnel-capacity.vue       |  579 ++++++
 src/components/do/a6-personnel/reward-punishment-record.vue |  329 +++
 src/components/do/a6-personnel/track-record.vue             |  299 +++
 src/components/do/a8-file-handling/FileChangeRequest.vue    |    3 
 src/components/view/a7-method-verification.vue              |   22 
 src/components/view/a6-personnel.vue                        |  324 +++
 src/components/view/a7-Ensure-results-validity.vue          |   49 
 18 files changed, 5,299 insertions(+), 25 deletions(-)

diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js
index 7e33442..8fa13dc 100644
--- a/src/assets/api/controller.js
+++ b/src/assets/api/controller.js
@@ -70,6 +70,8 @@
     feCalibrationSchedule,
     feStandardSubstance,
     feStandardSubstanceRecord,
+    personPostAuthorizationRecord,
+    deviceCheck,
   }
 }
 
@@ -179,28 +181,31 @@
 }
 
 const deviceScope = {
-  selectDeviceParameter: "/deviceScope/selectDeviceParameter", //鏌ヨ璁惧璇︽儏鍒楄〃
-  addDeviceParameter: "/deviceScope/addDeviceParameter", //娣诲姞璁惧璇︽儏鍙傛暟
-  delDeviceParameter: "/deviceScope/delDeviceParameter", //鍒犻櫎璁惧璇︽儏鍙傛暟
-  upDeviceParameter: "/deviceScope/upDeviceParameter", //淇敼璁惧璇︽儏鍙傛暟
-  selectDeviceByCategory: "/deviceScope/selectDeviceByCategory", //閫氳繃璁惧鍒嗙被鑾峰彇璁惧鍒楄〃
-  authorizedPerson: "/user/getDeviceManager", //鑾峰彇鎺堟潈浜�
-  selectEquipmentOverview: "/deviceScope/selectEquipmentOverview", //鑾峰彇璁惧鎬昏
-  uploadFile: "/deviceScope/uploadFile", //涓婁紶鍥剧墖
-  selectDevicePrincipal: "/user/getDeviceManager", //鑾峰彇璁惧璐熻矗浜�
-  selectDeviceByCode: "/deviceScope/selectDeviceByCode", //閫氳繃璁惧缂栧彿鑾峰彇璁惧鍒楄〃
-  getNumberCollect: "/deviceScope/getNumberCollect", //鏌ヨ鏁伴噰閰嶇疆
-  numberCollect: "/deviceScope/numberCollect", //缁存姢鏁伴噰閰嶇疆
-  saveDataAcquisitionConfiguration: "/deviceScope/saveDataAcquisitionConfiguration", // 缁存姢鏁伴噰閰嶇疆
-  queryDataAcquisitionConfiguration: "/deviceScope/queryDataAcquisitionConfiguration", // 鏌ヨ鏁伴噰閰嶇疆
-  deleteDataAcquisitionConfiguration: "/deviceScope/deleteDataAcquisitionConfiguration", // 鍒犻櫎鏁伴噰閰嶇疆
-  determineWhetherToCollectData: "/deviceScope/determineWhetherToCollectData", // 鍒ゆ柇璇ヨ澶囨槸鍚﹀彲浠ユ暟閲�
-  dataCollection: "/deviceScope/dataCollection", // 鏁伴噰-鏁版嵁閲囬泦
-  treeDevice: "/deviceScope/treeDevice", // 璁惧鏍戝舰
-  temDataAcquisition: "/deviceScope/temDataAcquisition", // PK8000鏁伴噰
-  temDataAcquisition2: "/deviceScope/temDataAcquisition2", // PK8000鏁伴噰--澶氭潯
-  formulaCalculation: "/deviceScope/formulaCalculation", // 鏁伴噰-鍏紡璁$畻
+  selectUserList: '/deviceScope/selectUserList', //鑾峰彇鐢ㄦ埛鍒楄〃
+  selectDeviceParameter: '/deviceScope/selectDeviceParameter', //鏌ヨ璁惧璇︽儏鍒楄〃
+  addDeviceParameter: '/deviceScope/addDeviceParameter', //娣诲姞璁惧璇︽儏鍙傛暟
+  delDeviceParameter: '/deviceScope/delDeviceParameter', //鍒犻櫎璁惧璇︽儏鍙傛暟
+  upDeviceParameter: '/deviceScope/upDeviceParameter', //淇敼璁惧璇︽儏鍙傛暟
+  selectDeviceByCategory: '/deviceScope/selectDeviceByCategory', //閫氳繃璁惧鍒嗙被鑾峰彇璁惧鍒楄〃
   deviceScopeSearch: "/deviceScope/search", //閫氳繃璁惧鍒嗙被鑾峰彇璁惧鍒楄〃
+  authorizedPerson: '/user/getDeviceManager', //鑾峰彇鎺堟潈浜�
+  selectEquipmentOverview: '/deviceScope/selectEquipmentOverview', //鑾峰彇璁惧鎬昏
+  uploadFile: '/deviceScope/uploadFile', //涓婁紶鍥剧墖
+  selectDevicePrincipal: '/user/getDeviceManager', //鑾峰彇璁惧璐熻矗浜�
+  selectDeviceByCode: '/deviceScope/selectDeviceByCode', //閫氳繃璁惧缂栧彿鑾峰彇璁惧鍒楄〃
+  getNumberCollect: '/deviceScope/getNumberCollect', //鏌ヨ鏁伴噰閰嶇疆
+  numberCollect: '/deviceScope/numberCollect', //缁存姢鏁伴噰閰嶇疆
+  saveDataAcquisitionConfiguration: '/deviceScope/saveDataAcquisitionConfiguration', // 缁存姢鏁伴噰閰嶇疆
+  queryDataAcquisitionConfiguration: '/deviceScope/queryDataAcquisitionConfiguration', // 鏌ヨ鏁伴噰閰嶇疆
+  deleteDataAcquisitionConfiguration: '/deviceScope/deleteDataAcquisitionConfiguration', // 鍒犻櫎鏁伴噰閰嶇疆
+  determineWhetherToCollectData: '/deviceScope/determineWhetherToCollectData', // 鍒ゆ柇璇ヨ澶囨槸鍚﹀彲浠ユ暟閲�
+  dataCollection: '/deviceScope/dataCollection', // 鏁伴噰-鏁版嵁閲囬泦
+  treeDevice: '/deviceScope/treeDevice', // 璁惧鏍戝舰
+  temDataAcquisition: '/deviceScope/temDataAcquisition', // PK8000鏁伴噰
+  temDataAcquisition2: '/deviceScope/temDataAcquisition2', // PK8000鏁伴噰--澶氭潯
+  formulaCalculation: '/deviceScope/formulaCalculation', // 鏁伴噰-鍏紡璁$畻
+  formulaCalculation2: '/deviceScope/export', //瀵煎嚭
+  selectListBylargeCategory: '/deviceScope/largeCategory'
 }
 
 const insOrder = {
@@ -578,7 +583,55 @@
 // 6.2 浜哄憳
 const personnel = {
   selectCNSAPersonTree: '/personBasicInfo/selectCNSAPersonTree', // 鏌ヨCNAS浜哄憳渚ц竟鏍�
+  getAnnex: '/personBasicInfo/getAnnex', // 鑾峰彇闄勪欢
+  basicInformationOfPersonnelSelectPage: 'personBasicInfo/basicInformationOfPersonnelSelectPage', // 鑾峰彇浜哄憳鍒楄〃
+  getAnnexByUserId: '/personBasicInfo/getAnnexByUserId',
+  addAnnex: '/personBasicInfo/addAnnex', // 娣诲姞闄勪欢
+  deleteAnnex: '/personBasicInfo/deleteAnnex', // 鍒犻櫎闄勪欢
+  updateAnnex: '/personBasicInfo/updateAnnex', // 鏇存柊闄勪欢
+  getCNASFile: '/personBasicInfo/getCNASFile', // 鑾峰彇鍥剧墖
+  getCNASInformation: '/personBasicInfo/getCNASInformation', // 鏌ヨCNAS浜哄憳淇℃伅
+  updateCNASInformation: '/personBasicInfo/updateCNASInformation', // 鏇存柊CNAS浜哄憳淇℃伅
+  getCNASPersonnelInfo: '/personBasicInfo/getCNASPersonnelInfo', // 浜哄憳鍩烘湰淇℃伅鏌ヨ
+  saveCNASPersonnelInfo: '/personBasicInfo/saveCNASPersonnelInfo', // 浜哄憳鍩烘湰淇℃伅淇濆瓨
   saveCNASFile: '/personBasicInfo/saveCNASFile', // 鍏叡鏂囦欢淇濆瓨鎺ュ彛
+  deleteCNASFile: '/personBasicInfo/deleteCNASFile', // 鍒犻櫎鏂囦欢
+  personTrainingSelect: '/personTraining/personTrainingSelect', // 鏌ヨ浜哄憳鍩硅
+  personTrainingDelete: '/personTraining/personTrainingDelete', // 鍒犻櫎浜哄憳鍩硅淇℃伅
+  approveAnnualPersonnelTraining: '/personTraining/approveAnnualPersonnelTraining', // 鎵瑰噯 骞村害浜哄憳鍩硅
+  reviewAnnualPersonnelTraining: '/personTraining/reviewAnnualPersonnelTraining', // 瀹℃牳 骞村害浜哄憳鍩硅
+  personTrainingImport: '/personTraining/personTrainingImport', // 瀵煎叆 浜哄憳鍩硅
+  exportPersonTraining: "/personTraining/exportPersonTraining", // 瀵煎嚭/浜哄憳鍩硅
+  queryTheAnnualPlanDetailsTable: '/personTraining/queryTheAnnualPlanDetailsTable', // 鏌ヨ鍩硅璁″垝骞村害璁″垝鏄庣粏琛�
+  addOrUpdatePersonTrainingDetailed: '/personTraining/addOrUpdatePersonTrainingDetailed', // 鏂板鍩硅璁″垝骞村害璁″垝鏄庣粏琛�
+  deleteAnnualPlanDetailTable: '/personTraining/deleteAnnualPlanDetailTable', // 鎵归噺鍒犻櫎 骞村害璁″垝鏄庣粏琛�
+  trainingAndAssessmentRecordsPage: '/personTraining/trainingAndAssessmentRecordsPage', // 鍩硅涓庤�冩牳璁板綍 鏌ヨ
+  deleteTrainingAndAssessmentRecords: '/personTraining/deleteTrainingAndAssessmentRecords', // 鍩硅涓庤�冩牳璁板綍 鎵归噺鍒犻櫎
+  trainingAndAssessmentRecordsAdded: '/personTraining/trainingAndAssessmentRecordsAdded', // 鍩硅涓庤�冩牳璁板綍 鎻愪氦
+  personJobResponsibilitiesSave: '/personJobResponsibilities/personJobResponsibilitiesSave', // 鏂板宀椾綅鑱岃矗
+  personJobResponsibilitiesDelete: '/personJobResponsibilities/personJobResponsibilitiesDelete', // 鍒犻櫎宀椾綅鑱岃矗
+  personJobResponsibilitiesUpdate: '/personJobResponsibilities/personJobResponsibilitiesUpdate', // 鏇存柊宀椾綅鑱岃矗
+  personJobResponsibilitiesSelect: '/personJobResponsibilities/personJobResponsibilitiesSelect', // 鍒嗛〉鏌ヨ宀椾綅鑱岃矗
+  personJobResponsibilitiesExport: '/personJobResponsibilities/personJobResponsibilitiesExport', // 瀵煎嚭宀椾綅鑱岃矗
+  personTrackRecordSave: '/personTrackRecord/personTrackRecordSave', // 鏂板宸ヤ綔灞ュ巻
+  personTrackRecordDelete: '/personTrackRecord/personTrackRecordDelete', // 鍒犻櫎宸ヤ綔灞ュ巻
+  personTrackRecordUpdate: '/personTrackRecord/personTrackRecordUpdate', // 鏇存柊宸ヤ綔灞ュ巻
+  personTrackRecordSelect: '/personTrackRecord/personTrackRecordSelect', // 鏌ヨ宸ヤ綔灞ュ巻
+  personTrackRecordExport: '/personTrackRecord/personTrackRecordExport', // 瀵煎嚭宸ヤ綔灞ュ巻
+  personTrainingRecordSelect: '/personTrainingRecord/personTrainingRecordSelect', // 鏌ヨ鍩硅璁板綍
+  personTrainingRecordExport: '/personTrainingRecord/personTrainingRecordExport', // 宸ヤ綔鍩硅璁板綍
+  personPersonnelCapacityPage: '/personPersonnelCapacity/personPersonnelCapacityPage', // 鏌ヨ浜哄憳鑳藉姏
+  deletePersonPersonnelCapacity: '/personPersonnelCapacity/deletePersonPersonnelCapacity', // 鍒犻櫎浜哄憳鑳藉姏
+  addOrUpdatePersonPersonnelCapacity: '/personPersonnelCapacity/addOrUpdatePersonPersonnelCapacity', // 鏂板缂栬緫浜哄憳鑳藉姏
+  exportPersonnelCapacity: '/personPersonnelCapacity/exportPersonnelCapacity', // 瀵煎嚭浜哄憳鑳藉姏
+  newPersonnelAddedToTrainingRecords: "/personTraining/newPersonnelAddedToTrainingRecords", // 鍩硅涓庤�冩牳 鏂板浜哄憳
+  outOfFocusPreservation: "/personTraining/outOfFocusPreservation", // 鍩硅涓庤�冩牳 澶辩劍鏇存柊
+  trainingSelectTrainingRecord: "/personTrainingRecord/trainingSelectTrainingRecord", // 鏌ヨ浜哄憳 鍩硅璁板綍
+  queryPersonnelDetails: "/personTrainingRecord/queryPersonnelDetails", // 鏌ヨ浜哄憳鏄庣粏 鍩硅璁板綍
+  claimOfTrainingAndAssessmentRecords: "/personTraining/claimOfTrainingAndAssessmentRecords", // 璁ら/鍙栨秷璁ら
+  exportPersonTrainingRecord: "/personTraining/exportPersonTrainingRecord", // 瀵煎嚭浜哄憳鍩硅涓庤�冩牳璁板綍
+  exportTrainingRecord: "/personTrainingRecord/exportTrainingRecord", // 瀵煎嚭鍩硅璁板綍
+  confirmPersonnelCapability: "/personPersonnelCapacity/confirmPersonnelCapability", // 纭浜哄憳鑳藉姏
 }
 
 // 8.3 瀹㈡埛婊℃剰搴﹁皟鏌�
@@ -739,6 +792,7 @@
   getVerifyMethodFileList:'/processMethodVerify/getVerifyMethodFileList', // 鍘熷璁板綍鍒楄〃
   delVerifyMethodFileList:'/processMethodVerify/delVerifyMethodFileList', // 鍒犻櫎楠岃瘉鍘熷璁板綍鍒楄〃
   delMethodVerify:'/processMethodVerify/delMethodVerify', // 鍒犻櫎鏍囧噯鏂规硶鏇存柊楠岃瘉
+  exportMethodVerify:'/processMethodVerify/exportMethodVerify', // 瀵煎嚭鏍囧噯鏂规硶鏇存柊楠岃瘉
 }
 
 // 7.4妫�娴嬫垨鏍″噯鐗╁搧鐨勫缃�-鏍峰搧鎺ユ敹
@@ -796,7 +850,9 @@
   ratifyQualityMonitor:'/qualityMonitor/ratifyQualityMonitor', // 鐩戞帶璁″垝鎵瑰噯
   delQualitySupervise:'/qualityMonitor/delQualitySupervise', // 鐩戞帶璁″垝鎵瑰噯
   importQualityMonitor:'/qualityMonitor/importQualityMonitor', // 瀵煎叆鐩戞帶璁″垝
-  exportQualityMonitorDetail:'/qualityMonitor/exportQualityMonitorDetail', // 瀵煎嚭鐩戞帶璁″垝
+  exportQualityMonitorDetail:'/qualityMonitor/exportQualityMonitorDetail',
+  exportQualityMonitorRatify:'/qualityMonitor/exportQualityMonitorRatify', // 璐ㄩ噺鐩戞帶瀹炴柦璁″垝瀵煎嚭
+  exportQualityMonitorEvaluate:'/qualityMonitor/exportQualityMonitorEvaluate', // 璐ㄩ噺鐩戞帶璇勪环瀵煎嚭
 }
 
 // 8.5 搴斿椋庨櫓鍜屾満閬囩殑鎺柦
@@ -921,3 +977,53 @@
   returnSubstance:'/feStandardSubstanceRecord/returnSubstance',//鏍囧噯鐗╄川娓呭崟褰掕繕
   getPageSubstanceRecord: '/feStandardSubstanceRecord/getPageSubstanceRecord', // 鍒嗛〉鏌ヨ
 }
+
+const personPostAuthorizationRecord = {
+  exportPersonPostAuthorizationRecord:'/personPostAuthorizationRecord/exportPersonPostAuthorizationRecord',//浼犲弬id  浜哄憳鐨勪换鑱屾巿鏉冨鍑�
+  exportPersonBasicInfo:'/personBasicInfo/exportPersonBasicInfo',//鏈俊鎭鍑�,浼犲弬绫讳技鍒嗛〉
+  exportPersonBasicInfoById:'/personBasicInfo/exportPersonBasicInfoById',//鏈俊鎭鍑�,浼犲弬绫讳技鍒嗛〉
+  exportPersonJobResponsibilities:'/personJobResponsibilities/exportPersonJobResponsibilities',//瀵煎嚭浜哄憳鑱岃矗,浼犲弬id
+}
+
+//璁惧鎺ュ彛
+const deviceCheck = {
+  list: '/device-alt',
+  edit: '/device-alt/edit',
+  saveIncidentReportData: '/incident-report/saveIncidentReportData', // 璁惧楠屾敹 淇濆瓨锛屾彁浜わ紝椹冲洖锛岄�氳繃鎺ュ彛
+  incidentReportPage: '/incident-report/incidentReportPage', // 鎵撳紑鏂板寮规锛岃幏鍙栬澶囩殑鍩虹淇℃伅
+  deleteIncidentReport: '/incident-report/deleteIncidentReport', // 鍒犻櫎璁惧楠屾敹鏁版嵁
+  getShowIncidentReport: '/incident-report/getShowIncidentReport', // 璁惧楠屾敹 鐐瑰嚮鏌ョ湅鑾峰彇鏁版嵁
+  deleteIncidentReportAll: '/incident-report/deleteIncidentReportAll', // 璁惧楠屾敹涓洓涓猼able琛ㄦ牸鐨勫垹闄ゅ姛鑳�
+  incidentReportExport: '/incident-report/incidentReportExport', // 璁惧楠屾敹瀵煎嚭
+  deviceRecordPage: '/deviceRecord/deviceRecordPage', // cnas璁惧浣跨敤璁板綍鍒嗛〉鏌ヨ
+  saveDeviceRecord: '/deviceRecord/saveDeviceRecord', // 璁惧浣跨敤璁板綍淇濆瓨
+  deleteDeviceRecord: '/deviceRecord/deleteDeviceRecord', // 鍒犻櫎璁惧浣跨敤璁板綍
+  deviceRecordExport: '/deviceRecord/deviceRecordExport', // 璁惧浣跨敤璁板綍鍒犻櫎
+  getDeviceMaintenancePage: '/device-maintain/getDeviceMaintenancePage', // 璁惧缁存姢鍒嗛〉鏌ヨ
+  deviceMaintenanceExport: '/device-maintain/deviceMaintenanceExport', // 璁惧缁存姢瀵煎嚭
+  deviceMaintenanceDelete: '/device-maintain/delete', // 璁惧缁存姢鍒犻櫎
+  deviceMaintainAdd: '/device-maintain', // 璁惧缁存姢鏂板
+  saveDeviceState: '/deviceState/saveDeviceState', // 璁惧鍚敤/鍋滅敤 淇濆瓨锛屾彁浜わ紝椹冲洖锛岄�氳繃鎺ュ彛
+  getDeviceStatePage: '/deviceState/getDeviceStatePage', // 璁惧鍚敤/鍋滅敤 鍒嗛〉
+  deleteDeviceState: '/deviceState/deleteDeviceState', // 璁惧鍚敤/鍋滅敤 鍒犻櫎
+  deviceFaultOnePage: '/deviceFaultOne/deviceFaultOnePage', // 璁惧鏁呴殰琛� 鍒嗛〉鏌ヨ
+  addOrUpdateDeviceFaultOne: '/deviceFaultOne/addOrUpdateDeviceFaultOne',
+  deleteDeviceFaultOne: '/deviceFaultOne/deleteDeviceFaultOne', // 鍒犻櫎 璁惧鏁呴殰
+  deviceMetricRecordPage: '/deviceMetricRecord/deviceMetricRecordPage', // 璁惧鏍″噯 鍒嗛〉鏌ヨ
+  addOrUpdateDeviceMetricRecord: '/deviceMetricRecord/addOrUpdateDeviceMetricRecord', // 璁惧鏍″噯 鏂板 鏇存柊
+  deleteDeviceMetricRecord: '/deviceMetricRecord/deleteDeviceMetricRecord', // 璁惧鏍″噯 鍒犻櫎
+  showDeviceMetricsCopy: '/deviceMetricRecord/showDeviceMetricsCopy', // 璁惧鏍″噯 鏌ヨ鏍″噯鏉$洰
+  selectDeviceMetric: '/deviceMetrics/selectDeviceMetric', // 璁惧鏍″噯 璁惧缁存姢琛� 鏌ヨ
+  saveOrUpdateDeviceMetric: '/deviceMetrics/saveOrUpdateDeviceMetric', // 璁惧鏍″噯 鏂板 鏇存柊
+  deleteDeviceMetrics: '/deviceMetrics/deleteDeviceMetrics', // 璁惧鏍″噯 鍒犻櫎
+  rewardPunishmentExport: '/personRewardPunishmentRecord/rewardPunishmentExport', // 濂栨儵璁板綍 瀵煎嚭
+  exportRewardAndPunishmentRecords: '/deviceFaultOne/exportRewardAndPunishmentRecords', // 濂栨儵璁板綍瀵煎嚭
+  deviceStateExport: "/deviceState/deviceStateExport", // 璁惧鐘舵��
+  newHomeworkGuidebookAdded: "/instruction/newHomeworkGuidebookAdded", // 浣滀笟鎸囧涔︽柊澧�
+  pageByPageQueryOfHomeworkInstructions: "/instruction/pageByPageQueryOfHomeworkInstructions", // 浣滀笟鎸囧涔� 鏌ヨ
+  homeworkGuidebookEditor: "/instruction/homeworkGuidebookEditor", // 浣滀笟鎸囧涔� 缂栬緫鏌ヨ
+  deleteHomeworkGuidebook: "/instruction/deleteHomeworkGuidebook", // 浣滀笟鎸囧涔﹀彈鎺ф枃浠跺垹闄�
+  homeworkGuidebook: "/instruction/homeworkGuidebook", // 浣滀笟鎸囧涔� 鍒犻櫎
+  approvalOfHomeworkInstructionManual: "/instruction/approvalOfHomeworkInstructionManual", // 浣滀笟鎸囧涔� 瀹℃壒
+  deviceMetricRecordExport: '/deviceMetricRecord/deviceMetricRecordExport', // 璁惧鏍″噯 瀵煎嚭
+};
diff --git a/src/components/do/a6-personnel-collect/personnel-list.vue b/src/components/do/a6-personnel-collect/personnel-list.vue
new file mode 100644
index 0000000..57330cf
--- /dev/null
+++ b/src/components/do/a6-personnel-collect/personnel-list.vue
@@ -0,0 +1,388 @@
+<template>
+  <div>
+    <div class="search-list">
+      <span class="search-input">
+        <span class="search-label">
+          <span style="width: 120px;font-size: 14px;line-height: 32px"
+          >浜哄憳鍚嶇О锛�</span
+          >
+          <el-input
+            v-model="entity.name"
+            clearable
+            placeholder="璇疯緭鍏�"
+            size="small"
+            style="width: 100%;"
+            @keyup.enter.native="refreshTable()"
+          >
+          </el-input>
+        </span>
+        <el-button size="small" style="margin-left: 10px" @click="refresh()"
+        >閲� 缃�</el-button
+        >
+        <el-button size="small" type="primary" @click="refreshTable()"
+        >鏌� 璇�</el-button
+        >
+      </span>
+      <span>
+        <el-button
+          :loading="outLoading"
+          size="small"
+          type="primary"
+          @click="handleDown"
+        >瀵煎嚭</el-button
+        >
+        <el-button size="small" type="primary" @click="selectUserDia = true"
+        >鏂板缓</el-button
+        >
+      </span>
+    </div>
+    <div class="search-table">
+      <el-table
+        v-loading="tableLoading"
+        :data="tableData"
+        border
+        height="calc(100vh - 20em)"
+        style="width: 100%;"
+      >
+        <el-table-column align="center" label="搴忓彿" type="index" width="60"></el-table-column>
+        <el-table-column label="鍛樺伐缂栧彿" prop="account" width="150"></el-table-column>
+        <el-table-column label="濮撳悕" prop="name" width="120"></el-table-column>
+        <el-table-column label="鍏ラ泦鍥㈡椂闂�" prop="groupTime" width="120"></el-table-column>
+        <el-table-column label="绫嶈疮" prop="nativePlace" width="120"></el-table-column>
+        <el-table-column label="璇佷欢鍙风爜" prop="identityCard" show-overflow-tooltip width="300"></el-table-column>
+        <el-table-column label="璇佷欢鍦板潃" prop="idAddress" show-overflow-tooltip width="100"></el-table-column>
+        <el-table-column label="鎵嬫満鍙�" prop="telephone" show-overflow-tooltip width="100"></el-table-column>
+        <el-table-column label="姣曚笟闄㈡牎" prop="graduatedInstitutions1" width="100"></el-table-column>
+        <el-table-column label="鎵�瀛︿笓涓�" prop="major1" width="100"></el-table-column>
+        <el-table-column label="姣曚笟鏃堕棿" prop="graduationTime1" width="100"></el-table-column>
+        <el-table-column label="鏈�楂樺鍘�" prop="officialAcademicRedentials" width="100"></el-table-column>
+        <el-table-column label="鏈�楂樺浣�" prop="highestDegree" width="100"></el-table-column>
+        <el-table-column label="鑱岀О" prop="professionalTitle" width="100"></el-table-column>
+        <el-table-column label="绱ф�ヨ仈绯讳汉" prop="emergencyContact" width="120"></el-table-column>
+        <el-table-column label="绱ф�ヨ仈绯荤數璇�" prop="emergencyContactPhone" width="120"></el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="140">
+          <template slot-scope="scope">
+            <el-button size="small" type="text" @click="downPerson(scope.row)">涓嬭浇</el-button>
+            <el-button
+              size="small"
+              type="text"
+              @click="$emit('updatePerson', scope.row)"
+            >缂栬緫
+            </el-button>
+            <el-button size="small" type="text" @click="deletePerson(scope.row)"
+            >鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination
+        :current-page="1"
+        :current-page.sync="page.current"
+        :page-size="page.size"
+        :page-sizes="[10, 20, 30, 50, 100]"
+        :total="page.total"
+        layout="->,total, sizes, prev, pager, next, jumper"
+        style="margin-top: 16px"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      >
+      </el-pagination>
+    </div>
+    <el-dialog :visible.sync="selectUserDia" title="閫夋嫨鐢ㄦ埛" width="70%">
+      <div class="search" style="margin-bottom: 9px;">
+        <div class="search_thing">
+          <div class="search_label">鐢ㄦ埛鍚嶏細</div>
+          <div class="search_input">
+            <el-input
+              v-model="addUserTableInfo.entity.name"
+              clearable
+              placeholder="璇疯緭鍏�"
+              size="small"
+              @keyup.enter.native="$refs.ValueTable.selectList()"
+            ></el-input>
+          </div>
+        </div>
+      </div>
+      <div v-if="selectUserDia" class="body" style="height: 60vh;">
+        <ValueTable
+          ref="ValueTable"
+          :componentData="addUserTableInfo"
+          :url="$api.user.selectUserList"
+        />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="selectUserDia = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="selectUser">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue';
+
+export default {
+  name: 'PersonnelList',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: { ValueTable },
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    },
+    currentCompaniesList: {
+      type: Array,
+      default: []
+    }
+  },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      page: {
+        size: 20,
+        current: 1,
+      },
+      outLoading: false,
+      tableLoading: false,
+      tableData: [], // 浜哄憳鎬诲垪琛ㄦ暟鎹�
+      selectUserDia: false, // 娣诲姞浜哄憳寮规
+      entity: {
+        name: '',
+        orderBy: {
+          field: 'id',
+          order: 'asc'
+        }
+      },
+      addUserTableInfo: {
+        name: null,
+        entity: {
+          isCustom: 0,
+          orderBy: {
+            field: 'id',
+            order: 'asc'
+          }
+        },
+        isIndex: true,
+        showSelect: true,
+        select: true,
+        do: [],
+        tagField: {
+          state: {
+            select: [
+              {
+                value: 1,
+                type: 'success',
+                label: '鍚敤'
+              },
+              {
+                value: 0,
+                type: 'danger',
+                label: '鍋滅敤'
+              }
+            ]
+          }
+        },
+        selectField: {},
+        upUserDepardLimsIdPower: true
+      },
+    };
+  },
+  mounted() {
+    this.refreshTable();
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    /**
+     * @desc 鑾峰彇璁惧id
+     */
+    // 閲嶇疆
+    refresh() {
+      this.page = {
+        size: 20,
+        current: 1,
+      };
+      this.entity.name = ''
+      this.refreshTable();
+    },
+    // 鏌ヨ浜哄憳鍒楄〃鏁版嵁
+    refreshTable(entity, type) {
+      try {
+        this.tableLoading = true;
+        this.entity.departLimsId = this.departId;
+        this.$axios.get(
+          this.$api.personnel.basicInformationOfPersonnelSelectPage
+          + '?size=' + this.page.size
+          + '&current=' + this.page.current
+          + '&departmentId=' + this.entity.departLimsId
+          + '&name=' + this.entity.name
+        )
+          .then(res => {
+            this.tableLoading = false;
+            if (res.code === 201) {
+              return;
+            }
+            this.page.total = res.data.total;
+            this.tableData = res.data.records;
+          });
+      } catch (e) {
+        this.tableLoading = false;
+      }
+    },
+    // 鍒犻櫎浜哄憳
+    deletePerson(row) {
+      this.$confirm('鏄惁鍒犻櫎褰撳墠鏁版嵁?', '璀﹀憡', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      })
+        .then(() => {
+          this.$axios
+            .post(this.$api.user.delUserDepardLimsId + '?id=' + row.id)
+            .then(res => {
+              if (res.code === 201) {
+                return;
+              }
+              this.$message.success('鍒犻櫎鎴愬姛');
+              this.refreshTable();
+            })
+            .catch(e => {
+              this.$message.error('鍒犻櫎澶辫触');
+            });
+        })
+        .catch(() => {
+        });
+    },
+    handleSizeChange(val) {
+      this.page.size = val;
+      this.refreshTable();
+    },
+    handleCurrentChange(val) {
+      this.page.current = val;
+      this.refreshTable();
+    },
+    selectUser() {
+      if (!this.currentCompaniesList.length > 0) {
+        this.$message.warning("璇烽�夋嫨閮ㄩ棬锛�")
+        return;
+      }
+      let selects = this.$refs.ValueTable.multipleSelection;
+      if (selects.length == 0) {
+        this.$message.error('鏈�夋嫨鏁版嵁');
+        return;
+      }
+      let ids = [];
+      selects.forEach(a => {
+        ids.push(a.id);
+      });
+      let str = '';
+      this.currentCompaniesList.forEach(a => {
+        if (a) {
+          str += a + ',';
+        }
+      });
+      this.selectUserDia = false;
+      this.$axios.post(this.$api.user.upUserDepardLimsId, {
+        ids: JSON.stringify(ids),
+        id: str
+      }).then(res => {
+        if (res.code === 201) {
+          return;
+        }
+        this.$message.success('娣诲姞鎴愬姛');
+        this.refreshTable();
+      });
+      this.$emit('refreshTree')
+    },
+    handleDown() {
+      this.outLoading = true;
+      let entity = this.HaveJson(this.entity)
+      delete entity.orderBy;
+      this.$axios.post(
+          this.$api.personPostAuthorizationRecord.exportPersonBasicInfo,
+          {
+            entity: entity
+          },
+          {
+            headers: {
+              'Content-Type': 'application/json'
+            },
+            responseType: "blob"
+          }
+        )
+        .then(res => {
+          this.outLoading = false;
+          if (res.code === 201) {
+            return;
+          }
+          this.$message.success('涓嬭浇鎴愬姛')
+          const blob = new Blob([res],{ type: 'application/octet-stream' });
+          const url = URL.createObjectURL(blob);
+          const link = document.createElement('a');
+          link.href = url;
+          link.download = '浜哄憳淇℃伅.xlsx';
+          link.click();
+        });
+    },
+    downPerson(row){
+      this.$axios.post(
+          this.$api.personPostAuthorizationRecord.exportPersonBasicInfoById+'?id=' + row.userId,
+          {
+            id: row.userId
+          }
+        )
+        .then(res => {
+          if (res.code === 201) {
+            return;
+          }
+          this.$message.success('涓嬭浇鎴愬姛')
+          try {
+            let url = res.message;
+            const link = document.createElement('a');
+            link.href = this.javaApi + '/word/'+ url;
+            // link.target = '_blank';
+            document.body.appendChild(link);
+            link.click();
+          } catch (error) {
+
+          }
+        });
+    }
+  },
+  watch: {
+    departId: {
+      handler(newId, oldId) {
+        if (newId) {
+          this.page.current = 1
+          this.refreshTable();
+        }
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.search-list {
+  padding: 0 16px 16px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search-table {
+  padding: 0 16px;
+}
+
+.search-input {
+  display: flex;
+}
+
+.search-label {
+  display: flex;
+}
+</style>
diff --git a/src/components/do/a6-personnel-training/AddInDetail.vue b/src/components/do/a6-personnel-training/AddInDetail.vue
new file mode 100644
index 0000000..5a98e66
--- /dev/null
+++ b/src/components/do/a6-personnel-training/AddInDetail.vue
@@ -0,0 +1,173 @@
+<template>
+  <div>
+    <el-dialog :visible.sync="addTrainingPlanDia" title="鏂板鍩硅璁″垝" width="50%">
+      <div class="body">
+        <el-form ref="trainingPlan" :model="trainingPlan" label-position="right" label-width="90px" :rules="trainingPlanRules">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="鍩硅鏃ユ湡:" prop="trainingDate">
+                <el-date-picker v-model="trainingPlan.trainingDate" format="yyyy-MM-dd"
+                                placeholder="閫夋嫨鏃ユ湡" size="small" value-format="yyyy-MM-dd"
+                                type="date" style="width: 100%"></el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="璇炬椂:">
+                <el-input type="number" v-model="trainingPlan.classHour" label="鎻忚堪鏂囧瓧" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="寮�濮嬫椂闂�:" prop="openingTime">
+                <el-time-picker v-model="trainingPlan.openingTime" placeholder="閫夋嫨鏃堕棿"
+                                size="small" style="width: 100%" value-format="HH:mm:ss"></el-time-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="缁撴潫鏃堕棿:" prop="endTime">
+                <el-time-picker v-model="trainingPlan.endTime" placeholder="閫夋嫨鏃堕棿" size="small"
+                                style="width: 100%" value-format="HH:mm:ss"></el-time-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍩硅鐩爣:">
+                <el-input v-model="trainingPlan.trainingObjectives" placeholder="璇疯緭鍏�" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍙傚姞瀵硅薄:">
+                <el-input v-model="trainingPlan.participants" placeholder="璇疯緭鍏�" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍩硅鍐呭:" prop="trainingContent">
+                <el-input v-model="trainingPlan.trainingContent" placeholder="璇疯緭鍏�" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍩硅璁插笀:" prop="trainingLecturerId">
+                <el-select v-model="trainingPlan.trainingLecturerId"
+                           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="璇鹃瀛﹀垎:">
+                <el-input type="number" v-model="trainingPlan.projectCredits" label="鎻忚堪鏂囧瓧" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍩硅鍦扮偣:">
+                <el-input v-model="trainingPlan.placeTraining" placeholder="璇疯緭鍏�" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="鍩硅鏂瑰紡:">
+                <el-input v-model="trainingPlan.trainingMode" placeholder="璇疯緭鍏�" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="涓惧姙閮ㄩ棬:">
+                <el-input v-model="trainingPlan.holdingDepartment" placeholder="璇疯緭鍏�" size="small"></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+				<el-button @click="closeAdd">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitAdd">纭� 瀹�</el-button>
+			</span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    currentChangeRow: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    },
+  },
+  name: 'Add',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {},
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      addTrainingPlanDia: false,
+      trainingPlan: {
+        planId: '',
+      },
+      trainingPlanRules: {
+        trainingDate: [{ required: true, message: '璇烽�夋嫨鍩硅鏃ユ湡', trigger: 'change' }],
+        openingTime: [{ required: true, message: '璇烽�夋嫨寮�濮嬫椂闂�', trigger: 'change' }],
+        endTime: [{ required: true, message: '璇烽�夋嫨缁撴潫鏃堕棿', trigger: 'change' }],
+        trainingContent: [{ required: true, message: '璇疯緭鍏ュ煿璁唴瀹�', trigger: 'change' }],
+        trainingLecturerId: [{ required: true, message: '璇烽�夋嫨鍩硅璁插笀', trigger: 'change' }],
+      },
+      responsibleOptions: [],
+    };
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    showDialog(id) {
+      this.addTrainingPlanDia = true;
+      this.trainingPlan.planId = id
+      this.getUserList()
+    },
+    // 鎻愪氦鏂板
+    submitAdd() {
+      this.$refs.trainingPlan.validate((valid) => {
+        if (valid) {
+          this.trainingPlan.planId = this.currentChangeRow.id
+          const personTrainingDetailed = this.trainingPlan
+          this.$axios.post(this.$api.personnel.addOrUpdatePersonTrainingDetailed, personTrainingDetailed, {
+            headers: {
+              'Content-Type': 'application/json'
+            },
+            noQs: true
+          }).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛');
+              this.closeAdd();
+              this.dialogVisible = false;
+            }
+          });
+        }
+      })
+    },
+    // 鍏抽棴寮规
+    closeAdd() {
+      this.$refs.trainingPlan.resetFields();
+      this.$emit('search')
+      this.addTrainingPlanDia = false;
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data;
+        }
+      });
+    },
+  },
+  watch: {
+    addTrainingPlanDia(newVal) {
+      if (newVal) {
+        this.trainingPlan = {
+          planId: '',
+        }
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+</style>
diff --git a/src/components/do/a6-personnel-training/Edit.vue b/src/components/do/a6-personnel-training/Edit.vue
new file mode 100644
index 0000000..0c041cc
--- /dev/null
+++ b/src/components/do/a6-personnel-training/Edit.vue
@@ -0,0 +1,448 @@
+<template>
+  <div>
+    <div class="page-header">
+      <h4><span class="line"></span><span>鍩硅涓庤�冩牳璁板綍</span></h4>
+      <div class="btns">
+        <el-button size="small" type="primary" @click="submitForm">{{ currentRow.state === 4 ? '鎻愪氦' : '鎾ら攢' }}</el-button>
+        <el-button size="small" @click="$emit('goBack')">杩斿洖</el-button>
+      </div>
+    </div>
+    <div class="form_title">
+      <el-row>
+        <el-col :span="5">
+          <span class="form_label">璇剧▼缂栧彿锛�</span>
+          <span> {{ trainingForm.courseCode }} </span>
+        </el-col>
+        <el-col :span="6">
+          <span class="form_label">鍩硅鍐呭锛�</span>
+          <span> {{ trainingForm.trainingContent }} </span>
+        </el-col>
+        <el-col :span="4">
+          <span class="form_label">鐘舵�侊細</span>
+          <el-tag v-if="trainingForm.state === 1" type="success">宸插畬鎴�</el-tag>
+          <el-tag v-if="trainingForm.state === 2" type="warning">杩涜涓�</el-tag>
+          <el-tag v-if="trainingForm.state === 3" type="primary">鏈紑濮�</el-tag>
+          <el-tag v-if="trainingForm.state === 4" type="info">宸茬粨鏉�</el-tag>
+        </el-col>
+        <el-col :span="4">
+          <span class="form_label">鍩硅璁插笀锛�</span>
+          <span> {{ trainingForm.trainingLecturerName }} </span>
+        </el-col>
+        <el-col :span="4">
+          <span class="form_label">鍩硅鏃ユ湡锛�</span>
+          <span> {{ trainingForm.trainingDate }} </span>
+        </el-col>
+      </el-row>
+      <el-row style="margin: 15px 0">
+        <el-form>
+          <el-col :span="12">
+            <el-form-item label="鑰冩牳鏂瑰紡">
+              <el-input v-model="trainingForm.assessmentMethod" :disabled="currentRow.state === 1" :rows="2" placeholder="璇疯緭鍏�"
+                        size="small" style="width: 79%" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏈鍩硅缁煎悎璇勪环">
+              <el-input v-model="trainingForm.comprehensiveAssessment" :disabled="currentRow.state === 1" :rows="2" placeholder="璇疯緭鍏�"
+                        size="small" style="width: 68%" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璇勪环浜�">
+              <el-select v-model="trainingForm.assessmentUserId" :disabled="currentRow.state === 1" placeholder="璇烽�夋嫨" size="small" style="width: 68%">
+                <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </el-row>
+    </div>
+    <el-divider>浜哄憳璇︽儏</el-divider>
+    <div>
+      <div class="items_center">
+        <span>濮撳悕</span>
+        <el-input v-model="userName" class="search" placeholder="璇疯緭鍏�"
+                  size="small"></el-input>
+        <el-button size="small" type="primary" @click="getInfo">鏌ヨ</el-button>
+      </div>
+      <div class="items_btn">
+        <el-button :disabled="currentRow.state === 1" size="small" type="primary" @click="addPerson">鏂板浜哄憳</el-button>
+        <el-button :disabled="currentRow.state === 1" size="small" @click="batchDelete">鎵归噺鍒犻櫎</el-button>
+      </div>
+      <el-table :data="trainingTableData" height="calc(100vh - 30em)" stripe style="width: 100%"
+                @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column label="搴忓彿" type="index" width="60"></el-table-column>
+        <el-table-column label="濮撳悕" prop="userName"></el-table-column>
+        <el-table-column label="宸ュ彿" prop="account"></el-table-column>
+        <el-table-column label="瑙掕壊" prop="roleName"></el-table-column>
+        <el-table-column label="鐢佃瘽鍙风爜" prop="phone"></el-table-column>
+        <el-table-column label="鑰冩牳缁撴灉" prop="examinationResults">
+          <template v-slot="scope">
+            <el-input v-model="scope.row.examinationResults" :disabled="currentRow.state === 1" clearable size="small" style="width: 100%" @blur="updatePersonResult(scope.row)"></el-input>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <el-dialog :visible.sync="selectUserDia" title="閫夋嫨鐢ㄦ埛" width="70%">
+      <div class="search" style="margin-bottom: 9px;">
+        <div class="search_thing">
+          <div class="search_label">鐢ㄦ埛鍚嶏細</div>
+          <div class="search_input">
+            <el-input
+              v-model="addUserTableInfo.entity.name"
+              clearable
+              placeholder="璇疯緭鍏�"
+              size="small"
+              @keyup.enter.native="$refs.ValueTable.selectList()"
+            ></el-input>
+          </div>
+        </div>
+      </div>
+      <div v-if="selectUserDia" class="body" style="height: 60vh;">
+        <ValueTable
+          ref="ValueTable"
+          :componentData="addUserTableInfo"
+          :isSelectedList="isSelectedList"
+          :url="$api.user.selectUserList"
+        />
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="selectUserDia = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="selectUser">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import TableCard from '../../caorui/TableCard/index.vue';
+import ZTTable from '../../caorui/ZTTable/index.vue';
+import ValueTable from '../../tool/value-table.vue';
+
+export default {
+  name: 'Edit',
+  // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
+  components: {ValueTable, ZTTable, TableCard},
+  props: {
+    currentRow: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    },
+  },
+  data() {
+    // 杩欓噷瀛樻斁鏁版嵁
+    return {
+      isSelectedList: [], // 绂佺敤鐨勫閫�
+      userName: undefined,
+      trainingForm: {
+        code: '111111',
+        date: '2024-10-10',
+      },
+      trainingColumn: [
+        {
+          label: '濮撳悕',
+          prop: 'userName'
+        },
+        {
+          label: '宸ュ彿',
+          prop: 'account'
+        },
+        {
+          label: '瑙掕壊',
+          prop: 'roleName'
+        },
+        {
+          label: '鐢佃瘽鍙风爜',
+          prop: 'phone'
+        },
+        {
+          label: '鑰冩牳缁撴灉',
+          prop: 'result'
+        }
+      ],
+      trainingTableData: [],
+      trainingLoading: false,
+      selectUserDia: false, // 娣诲姞浜哄憳寮规
+      addUserTableInfo: {
+        name: null,
+        entity: {
+          departLimsId: '1',
+          orderBy: {
+            field: 'id',
+            order: 'asc'
+          }
+        },
+        isIndex: true,
+        showSelect: true,
+        select: true,
+        do: [],
+        tagField: {
+          state: {
+            select: [
+              {
+                value: 1,
+                type: 'success',
+                label: '鍚敤'
+              },
+              {
+                value: 0,
+                type: 'danger',
+                label: '鍋滅敤'
+              }
+            ]
+          }
+        },
+        selectField: {},
+        upUserDepardLimsIdPower: true
+      },
+      multipleSelection: [],
+      userList: [],
+    };
+  },
+  mounted() {
+    this.trainingForm = this.currentRow
+    this.getInfo()
+    this.getUserList()
+  },
+  // 鏂规硶闆嗗悎
+  methods: {
+    // 鑾峰彇褰撳墠鏁版嵁
+    async getInfo() {
+      this.trainingLoading = true
+      await this.$axios({
+        method: 'get',
+        url: this.$api.personnel.trainingAndAssessmentRecordsPage,
+        params: {
+          trainingDetailedId: this.currentRow.id,
+          userName: this.userName
+        },
+        headers: {
+          'Content-Type': 'application/x-www-form-urlencoded'
+        },
+        noQs: true
+      })
+        .then(res => {
+          if (res.code === 200) {
+            this.trainingTableData = res.data
+          }
+          this.trainingLoading = false
+        })
+    },
+    async updatePersonResult(row) {
+      const { code } = await this.$axios({
+        method: 'post',
+        url: this.$api.personnel.outOfFocusPreservation,
+        data: row,
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      })
+      if (code === 200) {
+        this.$message.success("鎿嶄綔鎴愬姛锛�")
+      }
+    },
+    addPerson() {
+      this.isSelectedList = this.trainingTableData.map(item => item.userId)
+      this.selectUserDia = true;
+    },
+    selectUser() {
+      let selects = this.$refs.ValueTable.multipleSelection;
+      if (selects.length == 0) {
+        this.$message.error('鏈�夋嫨鏁版嵁');
+        return;
+      }
+      let list = []
+      selects.forEach(a => {
+        const obj = {
+          courseId: this.currentRow.id,
+          examinationResults: "",
+          userId: a.id
+        }
+        list.push(obj)
+        // this.trainingTableData.push(obj);
+      });
+      this.$axios({
+        method: 'post',
+        url: this.$api.personnel.newPersonnelAddedToTrainingRecords,
+        data: list,
+        headers: {
+          'Content-Type': 'application/json'
+        },
+        noQs: true
+      })
+        .then(res => {
+          this.isSelectedList = []
+          this.selectUserDia = false;
+          this.getInfo()
+        })
+    },
+    // 鎵归噺鍒犻櫎
+    handleSelectionChange(list) {
+      this.multipleSelection = list
+    },
+    batchDelete() {
+      console.log('鎵归噺鍒犻櫎', this.multipleSelection)
+      if (this.multipleSelection.length > 0) {
+        let ids = this.multipleSelection.map(item => item.trainingRecordId)
+        this.$confirm('鏄惁纭鍒犻櫎鎵�閫夋嫨鐨勬暟鎹�?', '鎻愮ず', {
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }).then(() => {
+          let formData = new FormData()
+          formData.append('ids', ids)
+          this.$axios({
+            method: 'post',
+            url: this.$api.personnel.deleteTrainingAndAssessmentRecords,
+            data: formData,
+            headers: {
+              'Content-Type': 'application/x-www-form-urlencoded'
+            },
+            noQs: true
+          })
+            .then(res => {
+              if (res.code == 200) {
+                this.$message.success('鍒犻櫎鎴愬姛');
+                this.getInfo()
+              }
+            });
+        }).catch(() => {
+          this.$message.warning('鍙栨秷鍒犻櫎');
+        });
+      } else {
+        this.$message.warning('璇烽�夋嫨闇�瑕佸垹闄ょ殑鏁版嵁')
+      }
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.getInfo();
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.getInfo();
+    },
+    /**
+     * @desc 鎻愪氦琛ㄥ崟
+     */
+    async submitForm() {
+      if (this.currentRow.state !== 4 && this.currentRow.state !== 1) {
+        this.$message.warning("褰撳墠鐘舵�佹棤娉曟彁浜�/鎾ら攢锛�")
+        return
+      }
+      // 濡傛灉绛変簬4 琛ㄧず璇ョ姸鎬佷负宸茬粨鏉燂紝1 琛ㄧず宸插畬鎴�
+      let state = this.currentRow.state === 4 ? 1 : 4
+      let data = {
+        assessmentMethod: this.trainingForm.assessmentMethod,
+        comprehensiveAssessment: this.trainingForm.comprehensiveAssessment,
+        trainingDetailedId: this.trainingForm.id,
+        assessmentUserId: this.trainingForm.assessmentUserId,
+        state: state
+      }
+      const {code} = await this.$axios({
+        method: 'post',
+        url: this.$api.personnel.trainingAndAssessmentRecordsAdded,
+        data: data,
+        headers: {
+          'Content-Type': 'application/json;'
+        },
+        noQs: true
+      })
+      if(code === 200) {
+        this.currentRow.state = state
+        this.$message.success("鎿嶄綔鎴愬姛")
+      }
+    },
+    getUserList(){
+      this.$axios.post(this.$api.user.selectUserList, {
+        page: {current: -1, size: -1,},
+        entity: {name: null, isCustom: 0}
+      }, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      }).then(res => {
+        if (res.code === 201) {
+          return
+        }
+        this.userList = res.data.body.records
+      })
+    },
+  }
+};
+</script>
+
+<style scoped>
+.page-header {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  padding: 0 20px;
+  margin-bottom: 10px;
+}
+
+h4 {
+  display: flex;
+  align-items: center;
+}
+
+h4 .line {
+  display: inline-block;
+  width: 3px;
+  height: 16px;
+  background: #3A7BFA;
+  margin-right: 4px;
+}
+
+.form_title {
+  font-size: 14px;
+  padding: 0 20px;
+  margin-bottom: 10px;
+}
+
+.el-divider {
+  margin: 0 1em 1em 0;
+}
+
+.form__input_label {
+  width: 90px;
+  margin-right: 6px;
+  color: #606266;
+}
+
+.form__input_label2 {
+  width: 210px;
+  margin-right: 6px;
+  color: #606266;
+}
+.search_thing {
+  display: flex;
+  align-items: center
+}
+.search_label {
+  width: 120px;
+}
+.pagination {
+  display: flex;
+  justify-content: space-between
+}
+
+.items_center {
+  float: left;
+  width: 50%;
+  text-align: left;
+}
+.items_btn {
+  text-align: right;
+  width: 50%;
+  float: right;
+  margin-bottom: 1em;
+}
+
+.search {
+  width: 180px;
+  padding: 0 16px;
+}
+</style>
diff --git a/src/components/do/a6-personnel-training/index.vue b/src/components/do/a6-personnel-training/index.vue
new file mode 100644
index 0000000..5a4f796
--- /dev/null
+++ b/src/components/do/a6-personnel-training/index.vue
@@ -0,0 +1,794 @@
+<!-- 浜哄憳鍩硅 -->
+<template>
+  <div class="flex_column">
+    <div v-if="!editPlanShow && isDepartment">
+      <TableCard title="骞村害璁″垝琛�">
+        <template v-slot:form>
+          <div class="items_center">
+            <span>鍒涘缓浜�</span>
+            <el-input v-model="pagination.compilerName" class="search" placeholder="璇疯緭鍏�" size="small"></el-input>
+            <el-button size="small" type="primary" @click="getYearPlanList(departId)">鏌ヨ</el-button>
+          </div>
+          <div>
+            <el-button size="small" type="primary" @click="uploadDia = true">瀵煎叆</el-button>
+          </div>
+        </template>
+        <template v-slot:table>
+          <ZTTable
+            :column="yearPlanColumn"
+            :currentChange="currentChange"
+            :height="'320'"
+            :table-data="yearPlanTableData"
+            :table-loading="yearLoading"
+            highlightCurrentRow
+            style="padding: 0 15px;">
+          </ZTTable>
+          <div class="pagination">
+            <div></div>
+            <el-pagination
+              :page-size="pagination.pageSize"
+              :page-sizes="[10, 20, 30, 40]"
+              :total="pagination.total"
+              layout="total, sizes, prev, pager, next, jumper"
+              @current-change="handleYearCurrent"
+              @size-change="handleYearSizeChange">
+            </el-pagination>
+          </div>
+        </template>
+      </TableCard>
+    </div>
+    <div v-if="!editPlanShow" class="table">
+      <TableCard title="骞村害璁″垝鏄庣粏琛�">
+        <template v-slot:form>
+          <div class="items_center">
+            <span>鍩硅璁插笀</span>
+            <el-input v-model="inDetailForm.trainingLecturerName" class="search" clearable placeholder="璇疯緭鍏�" size="small"></el-input>
+            <span>璇剧▼缂栧彿</span>
+            <el-input v-model="inDetailForm.courseCode" class="search" clearable placeholder="璇疯緭鍏�" size="small"></el-input>
+            <span style="margin-right: 16px">鍩硅鏃ユ湡</span>
+            <el-date-picker v-model="inDetailForm.trainingDate" clearable
+                            format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" size="small"
+                            type="date" value-format="yyyy-MM-dd"></el-date-picker>
+            <el-button size="small" style="margin-left: 16px" type="primary" @click="searchTable">鏌ヨ</el-button>
+          </div>
+          <div>
+            <el-button v-if="isDepartment && currentChangeRow && isOperation" size="small" @click="batchDelete">鎵归噺鍒犻櫎</el-button>
+            <el-button v-if="isDepartment && currentChangeRow && isOperation" size="small" type="primary" @click="addTrainingPlan">鏂板</el-button>
+          </div>
+        </template>
+        <template v-slot:table>
+          <ZTTable
+            :column="inDetailPlanColumn"
+            :handleSelectionChange="handleSelectionChange"
+            :height="isDepartment ? '45vh' : '68vh' "
+            :isSelection="true"
+            :table-data="inDetailPlanTableData"
+            :table-loading="yearLoading"
+            style="padding: 0 15px;">
+          </ZTTable>
+          <div class="pagination">
+            <div></div>
+            <el-pagination
+              :page-size="inDetailPagination.pageSize"
+              :page-sizes="[10, 20, 30, 40]"
+              :total="inDetailPagination.total"
+              layout="total, sizes, prev, pager, next, jumper"
+              @current-change="handleCurrentChange"
+              @size-change="handleSizeChange">
+            </el-pagination>
+          </div>
+        </template>
+      </TableCard>
+    </div>
+    <Add ref="addPlan" :currentChangeRow="currentChangeRow" @search="getInDetailPlan(currentRowId, departId)"></Add>
+    <Edit
+      v-if="editPlanShow"
+      ref="editPlan"
+      :currentRow="currentRow"
+      @del="getInDetailPlan(currentRowId, departId)"
+      @goBack="goBack"
+    ></Edit>
+    <el-dialog :visible.sync="reviewDialog" title="瀹℃牳" width="30%" @close="reviewRemarks = ''">
+      <span>
+        瀹℃牳澶囨敞锛�
+        <el-input v-model="reviewRemarks" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="reviewLoading" @click="handleReview(2)">涓嶉�氳繃</el-button>
+        <el-button :loading="reviewLoading" type="primary" @click="handleReview(1)">閫� 杩�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="approvalDialog" title="鎵瑰噯" width="30%" @close="approvalRemarks = ''">
+      <span>
+        鎵瑰噯澶囨敞锛�
+        <el-input v-model="approvalRemarks" type="textarea"></el-input>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button :loading="approvalLoading" @click="handleApproval(2)">涓嶆壒鍑�</el-button>
+        <el-button :loading="reviewLoading" type="primary" @click="handleApproval(1)">鎵� 鍑�</el-button>
+      </span>
+    </el-dialog>
+    <el-dialog :visible.sync="uploadDia" title="鏁版嵁瀵煎叆" width="500px">
+      <div style="margin: 0 auto;">
+        <el-upload ref="upload" :action="javaApi + $api.personnel.personTrainingImport" :auto-upload="false" :before-upload="beforeUpload" :file-list="fileList" :headers="token"
+                   :limit="1" :on-error="onError" :on-success="onSuccess" accept=".xlsx" drag
+                   name="file">
+          <i class="el-icon-upload"></i>
+          <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+        </el-upload>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="uploadDia = false">鍙� 娑�</el-button>
+        <el-button :loading="uploading" type="primary" @click="submitUpload()">涓� 浼�</el-button>
+      </span>
+    </el-dialog >
+  </div>
+</template>
+
+<script>
+import ValueTable from '../../tool/value-table.vue';
+import TableCard from '../../caorui/TableCard/index.vue';
+import ZTTable from '../../caorui/ZTTable/index.vue';
+import Add from './AddInDetail.vue';
+import Edit from './Edit.vue';
+
+export default {
+  name: 'PersonnelTraining',
+  components: { Add, ZTTable, TableCard, ValueTable, Edit },
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      search: {},
+      superviseForm: {},
+      inDetailForm: {
+        trainingLecturerName: '',
+        courseCode: '',
+        trainingDate: '',
+      },
+      yearLoading: false,
+      yearPlanTableData: [], // 骞村害璁″垝琛ㄦ暟鎹�
+      yearPlanColumn: [
+        {
+          label: '鏂囦欢鍚嶇О',
+          width: '160px',
+          prop: 'fileName'
+        }, {
+          label: '鍒涘缓鏃堕棿',
+          width: '160px',
+          prop: 'createTime'
+        }, {
+          label: '鍒涘缓浜�',
+          prop: 'createUserName'
+        }, {
+          label: '缂栧埗浜�',
+          prop: 'compilerName'
+        }, {
+          label: '缂栧埗鏃ユ湡',
+          width: '160px',
+          prop: 'compilationDate'
+        }, {
+          label: '瀹℃牳浜�',
+          prop: 'reviewerName',
+          minWidth: '100px',
+        }, {
+          dataType: 'tag',
+          label: '瀹℃牳鐘舵��',
+          prop: 'reviewerStatus',
+          width: '100px',
+          formatData: (params) => {
+            if (params == 1) {
+              return '閫氳繃';
+            } else if (params == 2) {
+              return '涓嶉�氳繃';
+            } else {
+              return null
+            }
+          },
+          formatType: (params) => {
+            if (params == 1) {
+              return 'success';
+            } else if (params == 2) {
+              return 'danger';
+            } else {
+              return null
+            }
+          }
+        }, {
+          label: '瀹℃牳澶囨敞',
+          prop: 'auditRemarks',
+          minWidth: '100px',
+        }, {
+          label: '瀹℃牳鏃ユ湡',
+          width: '160px',
+          prop: 'auditDate'
+        }, {
+          label: '鎵瑰噯浜�',
+          prop: 'approverName',
+          minWidth: '100px',
+        }, {
+          label: '鎵瑰噯澶囨敞',
+          prop: 'approvalRemarks',
+          minWidth: '100px',
+        }, {
+          dataType: 'tag',
+          label: '鎵瑰噯鐘舵��',
+          minWidth: '100px',
+          prop: 'approvalStatus',
+          formatData: (params) => {
+            if (params == 1) {
+              return '鎵瑰噯';
+            } else if (params == 2) {
+              return '涓嶆壒鍑�';
+            } else {
+              return null
+            }
+          },
+          formatType: (params) => {
+            if (params == 1) {
+              return 'success';
+            } else if (params == 2)  {
+              return 'danger';
+            } else {
+              return null
+            }
+          }
+        }, {
+          label: '鎵瑰噯鏃ユ湡',
+          width: '160px',
+          prop: 'approvalDate'
+        }, {
+          dataType: 'action',
+          width: '180px',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              disabled: (row) => {
+                if(row.approvalStatus === 1 && row.reviewerStatus === 1) {
+                  return false;
+                } else {
+                  return true;
+                }
+              },
+              clickFun: (row) => {
+                this.downLoadPost(row);
+              }
+            },
+            {
+              name: '瀹℃牳',
+              type: 'text',
+              disabled: (row) => {
+                if(row.reviewerStatus === 1) {
+                  return true;
+                } else {
+                  return false;
+                }
+              },
+              clickFun: (row) => {
+                this.handleCheck(row.id);
+              }
+            },
+            {
+              name: '鎵瑰噯',
+              type: 'text',
+              disabled: (row) => {
+                if(row.approvalStatus === 1) {
+                  return true;
+                } else {
+                  return false;
+                }
+              },
+              clickFun: (row) => {
+                this.handleApprove(row.id);
+              }
+            },
+            {
+              name: '鍒犻櫎',
+              type: 'text',
+              color: '#f56c6c',
+              clickFun: (row) => {
+                this.deleteFun(row.id);
+              }
+            }
+          ]
+        }],
+      inDetailPlanTableData: [], // 骞村害璁″垝鏄庣粏琛ㄨ〃鏁版嵁
+      inDetailPlanColumn: [
+        {
+          label: '璇剧▼缂栧彿',
+          prop: 'courseCode',
+          width: '130px',
+        }, {
+          dataType: 'tag',
+          label: '璁ら鐘舵��',
+          width: '100px',
+          prop: 'whetherClaim',
+          formatData: (params) => {
+            if (params === true) {
+              return '宸茶棰�';
+            } else {
+              return '鏈棰�';
+            }
+          },
+          formatType: (params) => {
+            if (params === true) {
+              return 'success';
+            } else {
+              return 'info'
+            }
+          }
+        }, {
+          label: '鍩硅鐩爣',
+          prop: 'trainingObjectives',
+          width: '100px',
+        }, {
+          label: '鍩硅鍐呭',
+          prop: 'trainingContent',
+          width: '100px',
+        }, {
+          label: '鍩硅鏂瑰紡',
+          prop: 'trainingMode',
+          width: '100px',
+        }, {
+          dataType: 'tag',
+          label: '璇剧▼鐘舵��',
+          width: '100px',
+          prop: 'state',
+          formatData: (params) => {
+            if (params == 1) {
+              return '宸插畬鎴�';
+            } else if (params == 2) {
+              return '杩涜涓�';
+            } else if (params == 3) {
+              return '鏈紑濮�';
+            } else if (params == 4) {
+              return '宸茬粨鏉�';
+            } else {
+              return null
+            }
+          },
+          formatType: (params) => {
+            if (params == 1) {
+              return 'success';
+            } else if (params == 2) {
+              return 'warning';
+            } else if (params == 3) {
+              return 'primary';
+            } else if (params == 4) {
+              return 'info';
+            } else {
+              return null
+            }
+          }
+        }, {
+          label: '鍙傚姞瀵硅薄',
+          prop: 'participants',
+          width: '100px',
+        }, {
+          label: '涓惧姙閮ㄩ棬',
+          prop: 'holdingDepartment',
+          width: '100px',
+        }, {
+          label: '鍩硅鍦扮偣',
+          prop: 'placeTraining',
+          width: '100px',
+        }, {
+          label: '鍩硅璁插笀',
+          prop: 'trainingLecturerName',
+          width: '100px',
+        }, {
+          label: '鍩硅鏃ユ湡',
+          prop: 'trainingDate',
+          width: '100px',
+        }, {
+          label: '寮�濮嬫椂闂�',
+          prop: 'openingTime',
+          width: '100px',
+        }, {
+          label: '璇炬椂',
+          prop: 'classHour',
+          width: '100px',
+        }, {
+          label: '澶囨敞',
+          prop: 'remarks',
+          width: '100px',
+        }, {
+          dataType: 'action',
+          width: '180',
+          label: '鎿嶄綔',
+          fixed: 'right',
+          operation: [
+            // 瓒呰繃浼氳寮�濮嬫椂闂村氨涓嶈兘璁ら浜�
+            {
+              name: '璁ら',
+              type: 'text',
+              clickFun: (row) => {
+                this.handleClaim(row);
+              },
+              disabled: (row) => {
+                if(row.whetherClaim === true || row.trainingDate < this.$moment().format('YYYY-MM-DD')) {
+                  return true;
+                } else {
+                  return false;
+                }
+              },
+            },
+            {
+              name: '缁撴灉鏄庣粏',
+              type: 'text',
+              clickFun: (row) => {
+                this.editInDetail(row);
+              },
+              showHide: () => {
+                if (this.isDepartment) {
+                  return true;
+                } else {
+                  return false;
+                }
+              }
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.downLoadInDetail(row);
+              }
+            }
+
+          ]
+        }],
+      pagination: {
+        pageSize: 20,
+        current: 1,
+        total: 0,
+        compilerName: ""
+      },
+      inDetailPagination: {
+        pageSize: 20,
+        current: 1,
+        total: 0
+      },
+      editPlanShow: false,
+      currentRow: {},
+      currentRowId: null, // 褰撳墠閫変腑鏁版嵁鐨刬d
+      reviewRemarks: '', // 瀹℃牳澶囨敞
+      reviewDialog: false, // 瀹℃牳寮规
+      reviewLoading: false, // 瀹℃牳鎻愪氦鎸夐挳
+      approvalRemarks: '', // 瀹℃牳澶囨敞
+      approvalDialog: false, // 瀹℃牳寮规
+      approvalLoading: false, // 瀹℃牳鎻愪氦鎸夐挳
+      multipleSelection: [], // 骞村害鏄庣粏琛ㄩ�変腑鐨勬暟鎹�
+      uploadDia: false,
+      uploading: false,
+      isOperation: false,
+      token: null,
+      fileList: [],
+      currentChangeRow: {},
+    };
+  },
+  mounted() {
+    this.token = {
+      'token': sessionStorage.getItem('token')
+    }
+    if (this.isDepartment) {
+      this.getYearPlanList(this.departId)
+    } else {
+      this.getInDetailPlan('', this.departId)
+    }
+  },
+  methods: {
+    searchTable () {
+      this.getInDetailPlan(this.currentRowId)
+    },
+    // 鏌ヨ-骞村害璁″垝琛�
+    getYearPlanList(userId) {
+      const name = this.isDepartment ? 'departmentId' : 'userId';
+      this.$axios.get(this.$api.personnel.personTrainingSelect + `?${name}=` + userId + '&size=' + this.pagination.pageSize + '&current=' + this.pagination.current + '&compilerName=' + this.pagination.compilerName).then(res => {
+        if (res.code === 201) return
+        this.yearPlanTableData = res.data.records;
+        this.pagination.total = res.data.total;
+        if (this.yearPlanTableData.length > 0) {
+          this.currentRowId = this.yearPlanTableData[0].id
+          this.currentChange(this.yearPlanTableData[0])
+        }
+      });
+    },
+    currentChange (row) {
+      const now = new Date();
+      const currentYear = now.getFullYear();
+      this.currentChangeRow = row
+      this.currentRowId = row.id
+      if (row.createTime.slice(0,4) == currentYear) {
+        this.isOperation = true;
+      } else {
+        this.isOperation = false;
+      }
+      this.getInDetailPlan(row.id)
+    },
+    getInDetailPlan (id) {
+      if (this.inDetailForm.trainingDate === null) {
+        this.inDetailForm.trainingDate = ''
+      }
+      const userId = this.isDepartment ? '' : this.departId
+      this.$axios.get(this.$api.personnel.queryTheAnnualPlanDetailsTable + '?userId=' + userId + '&size=' + this.inDetailPagination.pageSize +
+        '&current=' + this.inDetailPagination.current + '&id=' + id +
+      '&trainingLecturerName=' + this.inDetailForm.trainingLecturerName+
+      '&trainingDate=' + this.inDetailForm.trainingDate+
+      '&courseCode=' + this.inDetailForm.courseCode).then(res => {
+        if (res.code === 201) return
+        this.inDetailPlanTableData = res.data.records;
+        this.inDetailPagination.total = res.data.total;
+      });
+    },
+    // 鏂板骞村害璁″垝鏄庣粏琛�
+    addTrainingPlan() {
+      if (!this.currentRowId) {
+        this.$message.warning('璇烽�夋嫨涓�鏉¤鍒掕繘琛屾柊澧�')
+        return
+      }
+      this.$refs.addPlan.showDialog(this.currentRowId);
+    },
+    // 骞村害璁″垝琛�-鍒犻櫎
+    deleteFun(id) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.personnel.personTrainingDelete + '?id=' + id).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�');
+          this.getYearPlanList(this.departId);
+        });
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    // 骞村害璁″垝琛�-瀹℃牳
+    handleCheck(id) {
+      this.currentRowId = id
+      this.reviewDialog = true
+    },
+    handleReview (status) {
+      const personTrainingUpdateDto = {
+        id: this.currentRowId,
+        remarks: this.reviewRemarks,
+        status: status
+      }
+      this.reviewLoading = true
+      this.$axios.post(this.$api.personnel.reviewAnnualPersonnelTraining, personTrainingUpdateDto, {
+        headers: {
+          'Content-Type': 'application/json'
+        },
+        noQs: true
+      }).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.reviewDialog = false
+          this.getYearPlanList(this.departId);
+        }
+        this.reviewLoading = false
+      }).catch(() => {
+        this.reviewLoading = false
+      })
+    },
+    // 骞村害璁″垝琛�-鎵瑰噯
+    handleApprove(id) {
+      this.currentRowId = id
+      this.approvalDialog = true
+    },
+    handleApproval (status) {
+      const personTrainingUpdateDto = {
+        id: this.currentRowId,
+        remarks: this.approvalRemarks,
+        status: status
+      }
+      this.approvalLoading = true
+      this.$axios.post(this.$api.personnel.approveAnnualPersonnelTraining, personTrainingUpdateDto, {
+        headers: {
+          'Content-Type': 'application/json'
+        },
+        noQs: true
+      }).then(res => {
+        if (res.code === 200) {
+          this.$message.success('鎻愪氦鎴愬姛锛�');
+          this.approvalDialog = false
+          this.getYearPlanList(this.departId);
+        }
+        this.approvalLoading = false
+      }).catch(() => {
+        this.approvalLoading = false
+      })
+    },
+    // 骞村害璁″垝琛�-涓嬭浇
+    downLoadPost(row) {
+      this.$axios.get(this.$api.personnel.exportPersonTraining + '?id=' + row.id,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = row.fileName + '.docx';
+        link.click();
+      })
+    },
+    // 骞村害璁″垝-瀵煎叆
+    submitUpload() {
+      if (this.$refs.upload.uploadFiles.length == 0) {
+        this.$message.error('鏈�夋嫨鏂囦欢')
+        return
+      }
+      this.uploading = true
+      this.$refs.upload.submit();
+      this.uploading = false
+    },
+    onSuccess(response, file, fileList) {
+      this.$refs.upload.clearFiles()
+      this.uploadDia = false
+      this.uploading = false
+      if (response.code == 201) {
+        this.$message.error(response.message)
+        return
+      }
+      this.$message.success('涓婁紶鎴愬姛')
+      this.standardList = []
+      this.productList = []
+      this.getYearPlanList(this.departId)
+    },
+    onError(err, file, fileList) {
+      this.$message.error('涓婁紶澶辫触')
+      this.$refs.upload.clearFiles()
+      this.uploading = false
+    },
+    beforeUpload(file, fileList) {
+      if (file.type != 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') {
+        this.$message.error('涓婁紶鏂囦欢鏍煎紡涓嶆纭�');
+        this.$refs.upload.clearFiles()
+        return false;
+      }
+    },
+    // 骞村害璁″垝鍒嗛〉
+    handleYearCurrent(page) {
+      this.pagination.current = page;
+      this.getYearPlanList(this.departId);
+    },
+    handleYearSizeChange(size) {
+      this.pagination.pageSize = size;
+      this.getYearPlanList(this.departId);
+    },
+    // 骞村害璁″垝鏄庣粏琛�-璁ら銆佸彇娑堣棰�
+    handleClaim(row) {
+      this.$confirm('鏄惁纭璁ら璇ヨ绋�?', '鎻愮ず', {
+        confirmButtonText: '璁ら',
+        cancelButtonText: '鍙栨秷璁ら',
+        type: 'warning'
+      }).then(() => {
+        this.handleClaimFun(true, row.id)
+      }).catch(() => {
+        this.handleClaimFun(false, row.id)
+      });
+    },
+    handleClaimFun(claimAndClaim, rowId) {
+      this.$axios.post(this.$api.personnel.claimOfTrainingAndAssessmentRecords + `?claimAndClaim=${claimAndClaim}&courseId=${rowId}`).then(res => {
+        this.getInDetailPlan(this.currentChangeRow.id)
+      });
+    },
+    // 骞村害璁″垝鏄庣粏琛�-缂栬緫
+    editInDetail(row) {
+      this.editPlanShow = true;
+      this.currentRow = row
+    },
+    //
+    goBack() {
+      this.editPlanShow = false;
+      this.getInDetailPlan(this.currentRowId)
+    },
+    // 骞村害璁″垝鏄庣粏琛�-涓嬭浇
+    downLoadInDetail(row) {
+      this.$axios.get(this.$api.personnel.exportPersonTrainingRecord + '?id=' + row.id,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = row.courseCode + '浜哄憳鍩硅涓庤�冩牳璁板綍' + '.docx';
+        link.click();
+      })
+    },
+    // 骞村害璁″垝鏄庣粏琛�-澶氶��
+    handleSelectionChange(list) {
+      this.multipleSelection = list
+    },
+    // 骞村害鏄庣粏琛�-鍒犻櫎
+    batchDelete () {
+      if (this.multipleSelection.length > 0) {
+        let ids = []
+        this.multipleSelection.forEach(item => {
+          ids.push(item.id)
+        })
+        this.$confirm('鏄惁纭鍒犻櫎鎵�閫夋嫨鐨勬暟鎹�?', '鎻愮ず', {
+          confirmButtonText: '纭畾',
+          cancelButtonText: '鍙栨秷',
+          type: 'warning'
+        }).then(() => {
+          this.$axios.post(this.$api.personnel.deleteAnnualPlanDetailTable+ '?ids=' +ids.join(',')).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鍒犻櫎鎴愬姛');
+              this.getInDetailPlan(this.currentRowId);
+            }
+          });
+        }).catch(() => {
+          this.$message.warning('鍙栨秷鍒犻櫎');
+        });
+      } else {
+        this.$message.warning('璇烽�夋嫨闇�瑕佸垹闄ょ殑鏁版嵁')
+      }
+    },
+    handleSizeChange(val) {
+      this.inDetailPagination.size = val;
+      this.getYearPlanList(this.departId);
+    },
+    handleCurrentChange(val) {
+      this.inDetailPagination.current = val;
+      this.getYearPlanList(this.departId);
+    },
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    departId: {
+      handler(newId, oldId) {
+        if (this.isDepartment) {
+          this.getYearPlanList(newId);
+        } else {
+          this.getInDetailPlan('')
+        }
+      }
+    }
+  }
+};
+</script>
+<style scoped>
+.flex_column {
+  display: flex;
+  height: 80vh;
+  flex-direction: column;
+  overflow: auto;
+  justify-content: space-between;
+}
+
+.pagination {
+  display: flex;
+  justify-content: space-between
+}
+
+.items_center {
+  display: flex;
+  align-items: center;
+}
+
+.date_box {
+  margin: 0 5px;
+}
+
+.search {
+  width: 150px;
+  margin: 0 16px;
+}
+</style>
diff --git a/src/components/do/a6-personnel/job-responsibilities.vue b/src/components/do/a6-personnel/job-responsibilities.vue
new file mode 100644
index 0000000..8a3186d
--- /dev/null
+++ b/src/components/do/a6-personnel/job-responsibilities.vue
@@ -0,0 +1,374 @@
+<!-- 宀椾綅鑱岃矗 -->
+<template>
+  <div class="view">
+    <div style="text-align: left; margin-bottom: 15px;padding: 0 10px">
+      <label>鍛樺伐锛�</label>
+      <el-input v-model="userName" clearable 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="addPost">鏂板</el-button>
+        <!--        <el-button size="small" type="primary">瀵煎嚭excel</el-button>-->
+      </div>
+    </div>
+    <div class="table" style="padding: 0 10px">
+      <el-table :data="tableData" height="70vh" style="width: 100%">
+        <el-table-column label="搴忓彿" type="index" width="60"></el-table-column>
+        <el-table-column label="鍛樺伐缂栧彿" min-width="120" prop="account"></el-table-column>
+        <el-table-column label="宀椾綅鍚嶇О" min-width="180" prop="postName"></el-table-column>
+        <el-table-column label="鎵�灞為儴闂�" min-width="180" prop="departLimsName"></el-table-column>
+        <el-table-column label="宸ヤ綔鐩爣" min-width="180" prop="jobObjective"></el-table-column>
+        <el-table-column label="宀椾綅鑱岃矗" min-width="180" prop="jobResponsibilities"></el-table-column>
+        <el-table-column label="浠昏亴浜�" min-width="180" prop="incumbentName"></el-table-column>
+        <el-table-column label="浠昏亴浜哄鏍告棩鏈�" min-width="180" prop="incumbentDate"></el-table-column>
+        <el-table-column label="涓荤" min-width="180" prop="supervisorName"></el-table-column>
+        <el-table-column label="涓荤瀹℃牳鏃ユ湡" min-width="180" prop="supervisorDate"></el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="140">
+          <template v-slot="scope">
+            <el-button v-if="!isDepartment || scope.row.currentState === '鍏抽棴'" size="small" type="text"
+                       @click="handleViewClick(scope.row, 'view')">鏌ョ湅
+            </el-button>
+            <el-button v-if="isDepartment && scope.row.currentState !== '鍏抽棴'" size="small" type="text"
+                       @click="handleViewClick(scope.row, 'edit')">缂栬緫
+            </el-button>
+            <el-button size="small" type="text" @click="downLoadPost(scope.row)">涓嬭浇</el-button>
+            <el-button v-if="isDepartment" size="small" type="text" @click="deletePost(scope.row)">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <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"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <!-- 鏂板宀椾綅鑱岃矗 -->
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="dialogVisible"
+               title="鏂板宀椾綅鑱岃矗"
+               width="50%" @close="resetForm">
+      <el-steps :active="currentStep" align-center finish-status="success">
+        <el-step v-for="(v, i) in steps" :key="i" :title="v" style="cursor:pointer"
+                 @click.native="choiceStep(i)"></el-step>
+      </el-steps>
+      <el-form ref="form" :model="form" :rules="rules" label-width="130px">
+        <div>
+          <el-card style="margin-top: 1em; height: 40vh; overflow-y: scroll;">
+            <!-- 鏂板璁惧浜嬭褰曞崱鐗� -->
+            <el-row>
+              <el-col :span="12">
+                <el-form-item label="宀椾綅鍚嶇О锛�" prop="postName">
+                  <el-input v-model="form.postName" :disabled="currentStep !== 0 || operationType === 'view'"
+                            size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="宸ヤ綔鐩爣锛�" prop="jobObjective">
+                  <el-input v-model="form.jobObjective" :disabled="currentStep !== 0 || operationType === 'view'"
+                            size="small"
+                            type="textarea"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="宀椾綅鑱岃矗锛�" prop="jobResponsibilities">
+                  <el-input v-model="form.jobResponsibilities" :disabled="currentStep !== 0 || operationType === 'view'"
+                            size="small"
+                            type="textarea"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col v-if="currentStep === 0 || operationType === 'view'" :span="12">
+                <el-form-item
+                  :rules="[{ required: currentStep === 0, message: '璇烽�夋嫨浠昏亴浜�', trigger: 'change' }]"
+                  label="浠昏亴浜猴細"
+                  prop="incumbentId">
+                  <el-select v-model="form.incumbentId" :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 v-if="currentStep === 1 || operationType === 'view'" :span="12">
+                <el-form-item
+                  :rules="[{ required: currentStep === 1, message: '璇烽�夋嫨涓荤', trigger: 'blur' }]"
+                  label="涓荤锛�"
+                  prop="supervisorId">
+                  <el-select v-model="form.supervisorId" :disabled="currentStep !== 1 || 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-row>
+          </el-card>
+          <el-row style="margin-top: 1em;">
+            <el-col :span="4">
+              鎿嶄綔浜猴細{{ form.submitPerson }}
+            </el-col>
+            <el-col :span="6">
+              鏃ユ湡锛歿{ form.submitDate }}
+            </el-col>
+          </el-row>
+        </div>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button v-if="currentStep !== 0 && currentStep !== 3" @click="submitForm('3reject')">椹冲洖</el-button>
+        <el-button v-if="currentStep === 0" @click="submitForm('2save')">淇濆瓨</el-button>
+        <el-button v-if="currentStep !== 3" type="primary"
+                   @click="submitForm('1submit')">{{ currentStep === 0 ? '鎻愪氦' : '閫氳繃' }}</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { dateFormat } from '../../../util/date';
+import { deletePersonCommunicationAbility } from '../../../assets/api/api';
+
+export default {
+  data() {
+    return {
+      userName: '',
+      tableData: [],
+      responsibleOptions: [],
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      dialogVisible: false,
+      currentStep: 0, // 姝ラ鏉℃樉绀虹鍑犳
+      currentStepClick: 0, // 鐐瑰嚮姝ラ鏉″彉鍖�
+      operationType: '',
+      steps: ['鎻愪氦', '浠昏亴浜虹‘璁�', '涓荤纭'],
+      form: {
+        postName: '', // 宀椾綅鍚嶇О
+        jobObjective: '', // 宸ヤ綔鐩爣
+        jobResponsibilities: '', // 宀椾綅鑱岃矗
+        incumbentId: '', // 浠昏亴浜�
+        supervisorId: '' // 涓荤
+      },
+      rules: {
+        postName: [{ required: true, message: '璇疯緭鍏ュ矖浣嶅悕绉�', trigger: 'blur' }],
+        jobObjective: [{ required: true, message: '璇疯緭鍏ュ伐浣滅洰鏍�', trigger: 'blur' }],
+        jobResponsibilities: [{ required: true, message: '璇疯緭鍏ュ矖浣嶈亴璐�', trigger: 'blur' }],
+        incumbentId: [{ required: true, message: '璇烽�夋嫨浠昏亴浜�', trigger: 'change' }],
+        supervisorId: [{ required: true, message: '璇烽�夋嫨涓荤', trigger: 'change' }]
+      }
+      // departId: 0
+    };
+  },
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted() {
+    this.getPostList(this.departId);
+  },
+  methods: {
+    addPost() {
+      this.dialogVisible = true;
+      this.form = {
+        postName: '', // 宀椾綅鍚嶇О
+        jobObjective: '', // 宸ヤ綔鐩爣
+        jobResponsibilities: '', // 宀椾綅鑱岃矗
+        incumbentId: '', // 浠昏亴浜�
+        supervisorId: '', // 鎿嶄綔浜�
+        submitPerson: '', // 涓荤
+        submitDate: '', // 鏃ユ湡
+        currentStep: 0 // 鏃ユ湡
+      };
+      this.currentStep = 0;
+      this.getUserList();
+    },
+    // 鏌ヨ鍒楄〃淇℃伅
+    getPostList(userId) {
+      this.search.userId = userId;
+      const name = this.isDepartment ? 'departmentId' : 'userId';
+      this.$axios.get(this.$api.personnel.personJobResponsibilitiesSelect + '?userName=' + this.userName + `&${name}=` + this.search.userId + '&size=' + this.search.size + '&current=' + this.search.current).then(res => {
+        if (res.code === 201) return;
+        this.tableData = res.data.records;
+        this.search.total = res.data.total;
+      });
+    },
+    //鎻愪氦琛ㄥ崟
+    async submitForm(saveState) {
+      this.$refs.form.validate((valid) => {
+        if (valid === true || saveState !== '1submit') {
+          // 缁欏綋鍓嶇幆鑺傝缃垱寤轰汉涓庢椂闂�
+          let user = JSON.parse(localStorage.getItem('user'));
+          const dateTime = dateFormat(new Date());
+          // 鑾峰彇褰撳墠鐜妭鎿嶄綔浜轰笌鏃ユ湡
+          switch (this.currentStep) {
+            case 0:
+              this.form.submittingOperator = user.name;
+              this.form.submittingDate = dateTime;
+              break;
+            case 1:
+              this.form.incumbentOperator = user.name;
+              this.form.incumbentDate = dateTime;
+              break;
+            case 2:
+              this.form.supervisorOperator = user.name;
+              this.form.supervisorDate = dateTime;
+              break;
+            default:
+              break;
+          }
+          // 鑾峰彇褰撳墠鐜妭璐熻矗浜�
+          switch (saveState === '3reject' ? this.currentStep - 1 : this.currentStep) {
+            case 1:
+              this.form.currentResponsible = this.form.submittingOperator;
+              break;
+            case 2:
+              this.form.currentResponsible = this.form.incumbentOperator;
+              break;
+            default:
+              break;
+          }
+          let currentStepAction;
+          // 璁剧疆璇ユ搷浣滃垽鏂槸鍚︿负鎻愪氦锛屼繚瀛橈紝椹冲洖锛岄�氳繃
+          switch (saveState) {
+            // 鎻愪氦锛岄�氳繃
+            case '1submit':
+              currentStepAction = this.currentStep + 1;
+              break;
+            // 淇濆瓨
+            case '2save':
+              currentStepAction = this.currentStep;
+              break;
+            // 椹冲洖
+            case '3reject':
+              currentStepAction = this.currentStep - 1;
+              break;
+            default:
+              break;
+          }
+          // 鑾峰彇褰撳墠鐘舵��
+          this.form.currentState = currentStepAction === 3 ? '鍏抽棴' : this.steps[currentStepAction];
+          this.$axios.post(this.$api.personnel.personJobResponsibilitiesSave, this.form, {
+            headers: {
+              'Content-Type': 'application/json'
+            },
+            noQs: true
+          }).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛');
+              this.getPostList(this.departId);
+              this.dialogVisible = false;
+            }
+          });
+        } else {
+          let step = this.steps[this.currentStep];
+          this.$message.warning(step + '  娴佺▼涓湁蹇呭~椤规湭濉紒');
+        }
+      });
+    },
+    // 缂栬緫
+    handleViewClick(row, type) {
+      this.operationType = type;
+      this.getUserList();
+      row.incumbentId = Number(row.incumbentId);
+      this.form = { ...row };
+      switch (row.currentState) {
+        case '鎻愪氦':
+          this.currentStep = 0;
+          break;
+        case '浠昏亴浜虹‘璁�':
+          this.currentStep = 1;
+          this.form.submitPerson = row.submittingOperator;
+          this.form.submitDate = row.submittingDate;
+          break;
+        case '涓荤纭':
+          this.currentStep = 2;
+          this.form.submitPerson = row.incumbentOperator;
+          this.form.submitDate = row.incumbentDate;
+          break;
+        case '鍏抽棴':
+          this.currentStep = 3;
+          this.form.submitPerson = row.supervisorOperator;
+          this.form.submitDate = row.supervisorDate;
+          break;
+        default:
+          break;
+      }
+      this.form.currentState = this.currentStep;
+      this.currentStepClick = this.currentStep === 3 ? 0 : this.currentStep
+      console.log('this.form---', this.form);
+      this.dialogVisible = true;
+    },
+    // 涓嬭浇宀椾綅鑱岃矗
+    downLoadPost(row) {
+      this.$axios.post(this.$api.personPostAuthorizationRecord.exportPersonJobResponsibilities,{id:row.id},{responseType: "blob"}).then(res => {
+            this.$message.success('涓嬭浇鎴愬姛')
+            const blob = new Blob([res],{ type: 'application/octet-stream' });
+            const url = URL.createObjectURL(blob);
+            const link = document.createElement('a');
+            link.href = url;
+            link.download = row.incumbentName+'-宀椾綅鑱岃矗'+'.docx';
+            link.click();
+          })
+    },
+    // 鍒犻櫎宀椾綅鑱岃矗
+    deletePost(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎姝ゆ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.personnel.personJobResponsibilitiesDelete + '?id=' + row.id).then(res => {
+          if (res.code == 200) {
+            this.$message.success('鍒犻櫎鎴愬姛');
+            this.getPostList(this.departId);
+          }
+        });
+      }).catch(() => {
+        this.$message.error('鍒犻櫎澶辫触');
+      });
+    },
+    resetForm() {
+      this.$refs.form.resetFields();
+    },
+    refreshTable() {
+      this.getPostList(this.departId);
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data;
+        }
+      });
+    },
+    choiceStep(index) {
+      this.currentStepClick = index;
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.getPostList(this.departId);
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.getPostList(this.departId);
+    }
+  },
+  watch: {
+    departId: {
+      handler(newId, oldId) {
+        this.getPostList(newId);
+      }
+    }
+  }
+};
+</script>
+<style scoped>
+</style>
diff --git a/src/components/do/a6-personnel/personnel-capacity.vue b/src/components/do/a6-personnel/personnel-capacity.vue
new file mode 100644
index 0000000..cde9fe9
--- /dev/null
+++ b/src/components/do/a6-personnel/personnel-capacity.vue
@@ -0,0 +1,579 @@
+<!-- 浜哄憳鑳藉姏 -->
+<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>
+          <ZTTable
+            :column="yearColumnData"
+            :height="'calc(100vh - 20em)'"
+            :table-data="tableData"
+            :table-loading="yearLoading"
+            style="padding: 0 15px;margin-bottom: 16px"
+          >
+            <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>
+          </ZTTable>
+        </template>
+      </TableCard>
+      <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"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </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 ZTTable from '../../caorui/ZTTable/index.vue';
+import TableCard from '../../caorui/TableCard/index.vue';
+import {exportSuperVisePlanApi} from "../../../assets/api/api";
+
+export default {
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  components: {
+    ZTTable,
+    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) {
+      this.$axios.get(this.$api.personnel.exportPersonnelCapacity + '?id=' + row.id,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = "浜哄憳鑳藉姏瀵煎嚭" + '.docx';
+        link.click();
+      })
+    },
+    // 鏌ヨ
+    refreshTable() {
+      this.getList(this.departId);
+    },
+    // 鑾峰彇浜哄憳鑳藉姏鍒楄〃淇℃伅
+    getList(userId) {
+      this.search.userId = userId;
+      const name = this.isDepartment ? 'departmentId' : 'userId';
+      this.yearLoading = true
+      this.$axios.get(this.$api.personnel.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.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: '宀椾綅鑱岃矗'
+      }).then(res => {
+        this.responsibilities = res.data;
+      });
+    },
+    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) {
+          this.$axios.post(this.$api.personnel.addOrUpdatePersonPersonnelCapacity, this.form, {
+            headers: {
+              'Content-Type': 'application/json'
+            }
+          }).then(res => {
+            if (res.code == 200) {
+              this.$message.success('鎻愪氦鎴愬姛');
+              this.getList(this.departId);
+              this.dialogVisible = false;
+            }
+          });
+        }
+      });
+    },
+    verifyGet (id) {
+      this.$confirm('鏄惁纭鏈潯淇℃伅?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.get(this.$api.personnel.confirmPersonnelCapability + '?id=' + 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(() => {
+        this.$axios.delete(this.$api.personnel.deletePersonPersonnelCapacity + '?id=' + 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() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data;
+        }
+      });
+    },
+    handleSizeChange(val) {
+      this.search.size = val;
+      this.getList(this.departId);
+    },
+    handleCurrentChange(val) {
+      this.search.current = val;
+      this.getList(this.departId);
+    }
+  },
+  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>
diff --git a/src/components/do/a6-personnel/personnel-information.vue b/src/components/do/a6-personnel/personnel-information.vue
new file mode 100644
index 0000000..b10df08
--- /dev/null
+++ b/src/components/do/a6-personnel/personnel-information.vue
@@ -0,0 +1,948 @@
+<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="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 v-model="form.name" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鐧诲綍璐﹀彿">
+                  <el-input 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-input v-model="form.jobNumber" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍛樺伐瀛愮紪鍙�">
+                  <el-input v-model="form.subordinateNumber" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <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-date-picker v-model="form.entryTime" type="date" placeholder="閫夋嫨鏃ユ湡" size="small"
+                                      style="width: 99%;" format="yyyy-MM-dd" 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.currentPosition" size="small" clearable></el-input>
+                              </el-form-item>
+                          </el-col> -->
+            </el-row>
+            <el-row>
+              <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-input v-model="form.department" 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.postType" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="宀椾綅缂栧彿">
+                  <el-input v-model="form.postCode" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <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-row>
+            <el-row>
+              <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-date-picker v-model="form.unitTime" 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.reportingTo" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row>
+              <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 :label=1 size="mini">姝e紡宸�</el-radio>
+                  </el-radio-group>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="璇曠敤寮�濮嬫椂闂�">
+                  <el-date-picker v-model="form.trialStartTime" 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.trialEndTime" 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="24" 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"
+                                  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.idType" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <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-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-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-col :span="8">
+                <el-form-item label="璇佷欢鍦板潃">
+                  <el-input v-model="form.idAddress" 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.idDetailAddress" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鐜板眳鍦板潃">
+                  <el-input v-model="form.currentAddress" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鐜板眳璇︾粏鍦板潃">
+                  <el-input v-model="form.currentDetailAddress" 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.serviceAddress" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="閫佽揪璇︾粏鍦板潃">
+                  <el-input v-model="form.serviceDetailAddress" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鏄惁閫�浼嶅啗浜�">
+                  <el-radio-group v-model="form.retiredSoldiers">
+                    <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-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.cornet" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="鍔炲叕鐢佃瘽">
+                  <el-input v-model="form.officePhone" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <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-row>
+            <el-row>
+              <el-col :span="8">
+                <el-form-item label="璁$畻鏈虹瓑绾�">
+                  <el-input v-model="form.ncre" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <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-radio-group v-model="form.fullTime">
+                    <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-radio-group v-model="form.enroll">
+                    <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="XX灞婂ぇ瀛︾敓">
+                  <el-input v-model="form.collegeStudents" 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.emergencyContact" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="绱ф�ヨ仈绯荤數璇�">
+                  <el-input v-model="form.emergencyContactPhone" clearable size="small"></el-input>
+                </el-form-item>
+              </el-col>
+              <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-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" :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" :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-input v-model="form.attachmentInformation" size="small" disabled>
+                                      <el-button v-if="form.attachmentInformation" slot="append"
+                                          icon="el-icon-delete-solid"
+                                          @click="deleteFile(form.attachmentInformation, 'attachmentInformation')"></el-button>
+                                  </el-input>
+                              </el-form-item>
+                          </el-col>
+                          <el-col :span="4">
+                              <el-upload ref="upload" style="float: left; margin: 0 20px;" :action="action"
+                                  :show-file-list="false"
+                                  :on-success="(response, file, fileList) => onSuccess(response, file, fileList, 'attachmentInformation')">
+                                  <el-button class="uploadFile" slot="trigger" size="mini" type="primary">娴忚</el-button>
+                              </el-upload>
+                              <el-button class="uploadFile" size="mini" type="primary" @click="downloadFile(form.attachmentInformation)">涓嬭浇</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>
+            <el-table :data="annexList" border height="200" style="width: 96%;float: right;">
+              <el-table-column label="搴忓彿" type="index" width="80px">
+              </el-table-column>
+              <el-table-column label="璇佷欢鍙�" prop="idNumber" width="150px">
+              </el-table-column>
+              <el-table-column label="鍙戣瘉鍗曚綅" prop="issueUnit" width="150px">
+              </el-table-column>
+              <el-table-column label="鏂囦欢鍚嶇О" prop="fileName" show-overflow-tooltip width="200px">
+              </el-table-column>
+              <el-table-column label="绾у埆" prop="level" width="150px">
+              </el-table-column>
+              <el-table-column label="鏈夋晥鏈�" prop="periodValidity" width="150px">
+              </el-table-column>
+              <el-table-column label="娣诲姞鏃堕棿" prop="createTime" width="150px">
+              </el-table-column>
+              <el-table-column fixed="right" label="鎿嶄綔" width="150px">
+                <template slot-scope="scope">
+                  <el-button size="mini" type="text" @click="downloadFile(scope.row.fileName)">涓嬭浇</el-button>
+                  <el-button size="mini" type="text" @click="annexAdd(1,scope.row)">缂栬緫</el-button>
+                  <el-button size="mini" type="text" @click="deleteAnnex(scope.row)">鍒犻櫎</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-form>
+          <el-row>
+          </el-row>
+        </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 personnelClassification" :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-date-picker v-model="annex.periodValidity" 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 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"
+                :on-success="(response,file,fileList) => onSuccess(response, file, fileList, 'fileName')"
+                :show-file-list="false">
+                <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('annex')">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import fileDownload from '../../../util/file'
+export default {
+  props: {
+    clickNodeVal: {
+      type: Object,
+      default: () => { return {} }
+    },
+  },
+  data() {
+    return {
+      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: true, message: '璇烽�夋嫨鏈夋晥鏈�', trigger: 'blur' }
+        ]
+      },
+      dialogVisible1: false,
+      form: {
+        userId: '',
+        name: '',
+        account: '',
+        currentState: '',
+        jobNumber: '',
+        subordinateNumber: '',
+        sex: '',
+        corporateName: '',
+        department: '',
+        departLimsId: [],
+        postType: '',
+        postCode: '',
+        postName: '',
+        groupTime: '',
+        unitTime: '',
+        reportingTo: '',
+        laborRelations: '',
+        trialStartTime: '',
+        trialEndTime: '',
+        personnelClassification: '',
+        dateBirth: '',
+        nativePlace: '',
+        nation: '',
+        idType: '',
+        identityCard: '',
+        age: '',
+        validityPeriod: '',
+        maritalStatus: '',
+        idAddress: '',
+        idDetailAddress: '',
+        currentAddress: '',
+        currentDetailAddress: '',
+        serviceAddress: '',
+        serviceDetailAddress: '',
+        retiredSoldiers: '',
+        politicalStatus: '',
+        dumplingTime: '',
+        telephone: '',
+        cornet: '',
+        officePhone: '',
+        email: '',
+        ncre: '',
+        officialAcademicRedentials: '',
+        highestDegree: '',
+        graduatedInstitutions1: '',
+        major1: '',
+        graduationTime1: '',
+        graduatedInstitutions2: '',
+        major2: '',
+        graduationTime2: '',
+        fullTime: '',
+        enroll: '',
+        collegeStudents: '',
+        emergencyContact: '',
+        emergencyContactPhone: '',
+        lastUpdateTime: '',
+        pictureUrl: '',
+        signatureUrl: '',
+      },
+      department: [],
+      saveLoading: false,
+      dialogVisible: false,
+      personnelClassification: [],
+      checkList: [],
+      successFileList: [], // 闃叉鍚庣鍑虹幇鑴忔暟鎹�
+      isSave: false,
+    }
+  },
+  components: {
+    fileDownload
+  },
+  created() {
+    this.init()
+  },
+  computed: {
+    action() {
+      return this.javaApi + this.$api.personnel.saveCNASFile
+    }
+  },
+  methods: {
+    annexAdd(type,row) {
+      if(type === 1) {
+        this.title = '缂栬緫闄勪欢璧勬枡'
+        this.addOrupdate = 1
+        this.$axios.get(this.$api.personnel.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(formName) {
+      this.$refs[formName].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) {
+        this.$axios.post(this.$api.personnel.updateAnnex, this.annex, {
+          headers: {
+            'Content-Type': 'application/json'
+          }
+        }).then(res => {
+          if(res.code == 200) {
+            this.$axios.get(this.$api.personnel.getAnnexByUserId + '?userId=' + this.clickNodeVal.userId).then(res => {
+              this.dialogVisible1 = false
+              this.imageUrl = ''
+              this.resetForm('annex')
+              this.annexList = res.data
+              this.$message.success('鏇存柊鎴愬姛锛�')
+            })
+          }
+        })
+      }else {
+        this.annex.id = null
+        this.$axios.post(this.$api.personnel.addAnnex, this.annex, {
+          headers: {
+            'Content-Type': 'application/json'
+          }
+        }).then(res => {
+          if(res.code == 200) {
+            this.$axios.get(this.$api.personnel.getAnnexByUserId + '?userId=' + this.clickNodeVal.userId).then(res => {
+              this.dialogVisible1 = false
+              this.imageUrl = ''
+              this.resetForm('annex')
+              this.annexList = res.data
+              this.$message.success('淇濆瓨鎴愬姛')
+            })
+          }
+        })
+      }
+    },
+    deleteAnnex(row) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ枃浠�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.personnel.deleteAnnex + '/' + row.id).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.annexList = this.annexList.filter(item => item.id != row.id)
+        })
+      })
+    },
+    beforeAvatarUpload(file) {
+      const isJPGorPNG = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/gif';
+      const isLt2MB = file.size / 1024 / 1024 < 2;
+      if (!isJPGorPNG) {
+        this.$message.error('涓婁紶鍥剧墖鍙兘鏄� JPG/PNG 鏍煎紡!');
+        return false;
+      }
+      if (!isLt2MB) {
+        this.$message.error('涓婁紶鍥剧墖澶у皬涓嶈兘瓒呰繃 2MB!');
+      }
+      // 鏍¢獙閫氳繃鎵嶈繑鍥� true锛屽厑璁告枃浠朵笂浼�
+      return isJPGorPNG && isLt2MB;
+    },
+    downloadFile(fileName) {
+      let url = this.javaApi + '/img/' + fileName;
+      fileDownload.downloadIamge(url, fileName)
+    },
+    async onSuccess(response, file, fileList, entityVal) {
+      if(entityVal == 'fileName') {
+        this.annex.fileName = response.data
+        this.imageUrl = this.javaApi + '/img/' + 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) {
+      this.$axios.get(this.$api.personnel.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)
+        console.log('res.data',res);
+      })
+    },
+    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 = ''
+        }
+      }
+      this.$axios.post(this.$api.personnel.saveCNASPersonnelInfo, this.form, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      }).then(res => {
+        this.saveLoading = false
+        this.isSave = true
+        this.getUserBasisInfo(this.clickNodeVal.userId)
+        this.$message.success('淇濆瓨鎴愬姛锛�')
+      })
+    },
+    // 鍙栦汉鍛樺垎绫荤殑瀛楀吀
+    getComparisonList() {
+      this.$axios.post(this.$api.enums.selectEnumByCategory, {
+        category: "浜哄憳鍒嗙被"
+      }).then(res => {
+        let data = res.data
+        this.personnelClassification = data;
+        this.checkList = this.form.personnelClassification.split('锛�')
+      })
+    },
+    clickPersonnelClassificationSure() {
+      this.dialogVisible = false
+      this.form.personnelClassification = this.checkList.filter(m=>m).join('锛�')
+    },
+    async deleteFile(fileName, entityVal) {
+      await this.$axios.delete(this.$api.personnel.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)
+        }
+      })
+    },
+    validateFileSize(rule, value, callback) {
+      if (!value) {
+        return callback(new Error('璇蜂笂浼犳枃浠�'));
+      }else {
+        callback();
+      }
+    },
+    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();
+    }
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    clickNodeVal: {
+      handler(newVal, oldVal) {
+        if (newVal.userId) {
+          this.getUserBasisInfo(newVal.userId)
+        }
+      },
+    }
+  }
+}
+</script>
+
+<style scoped>
+>>>.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>
diff --git a/src/components/do/a6-personnel/personnel-supervision.vue b/src/components/do/a6-personnel/personnel-supervision.vue
new file mode 100644
index 0000000..5ad3091
--- /dev/null
+++ b/src/components/do/a6-personnel/personnel-supervision.vue
@@ -0,0 +1,100 @@
+<!-- 浜哄憳鐩戠潱 -->
+<template>
+  <div>
+    <div style="text-align: left; margin-bottom: 15px;">
+      <label>鍏抽敭瀛�</label>
+      <el-input placeholder="璇疯緭鍏ュ叧閿瓧" style="width: 20vh;" size="small"></el-input>
+      <el-button type="primary" size="small">鏌ヨ</el-button>
+      <div style="float: right;">
+        <el-button type="primary" size="small">鏌ヨ</el-button>
+        <el-button type="primary" size="small">瀵煎嚭excel</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <el-table :data="tableData" style="width: 100%" height="70vh">
+        <el-table-column prop="date" label="搴忓彿" min-width="120">
+        </el-table-column>
+        <el-table-column prop="name" label="娴佺▼缂栧彿" min-width="180">
+        </el-table-column>
+        <el-table-column prop="address" label="鎵�灞炲勾搴�" min-width="180">
+        </el-table-column>
+        <el-table-column prop="address" label="缂栧埗鏃ユ湡" min-width="180">
+        </el-table-column>
+        <el-table-column prop="address" label="鎻愪氦浜�" min-width="180">
+        </el-table-column>
+        <el-table-column prop="address" label="褰撳墠鐘舵��" min-width="120">
+        </el-table-column>
+        <el-table-column prop="address" label="褰撳墠璐d换浜�" min-width="180">
+        </el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="100">
+          <template v-slot="scope">
+            <el-button type="text" size="small">鏌ョ湅</el-button>
+            <el-button type="text" size="small">缂栬緫</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="1"
+        :page-sizes="[10, 20, 30, 50, 100]" :page-size="search.size" layout="->,total, sizes, prev, pager, next, jumper"
+        :total="search.total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    clickNodeVal: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      }
+    };
+  },
+  created() {
+    this.init();
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.search.size = val
+      this.getPersonnelTraining(this.clickNodeVal.userId);
+    },
+    handleCurrentChange(val) {
+      this.search.current = val
+      this.getPersonnelTraining(this.clickNodeVal.userId);
+    },
+    // 鍒濆鍖栬皟鐢�
+    init() {
+      if (this.clickNodeVal.userId) {
+        this.getPersonnelTraining(this.clickNodeVal.userId ? this.clickNodeVal.userId : null, null);
+      } else {
+        this.getPersonnelTraining(null, this.clickNodeVal.id ? this.clickNodeVal.id : null);
+      }
+    },
+    getPersonnelTraining(userId) {
+      this.search.userId = userId
+      this.$axios.get(this.$api.personnel.personTrainingSelect+"?userId=" + userId + "&size=" + this.search.size + "&current=" + this.search.current).then(res => {
+        console.log(`output->res`,res)
+      })
+    }
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    clickNodeVal(newVal) {
+      if (newVal.userId) {
+        this.getPersonnelTraining(newVal.userId);
+      }
+    }
+  }
+};
+</script>
\ No newline at end of file
diff --git a/src/components/do/a6-personnel/reward-punishment-record.vue b/src/components/do/a6-personnel/reward-punishment-record.vue
new file mode 100644
index 0000000..9bac57a
--- /dev/null
+++ b/src/components/do/a6-personnel/reward-punishment-record.vue
@@ -0,0 +1,329 @@
+<!-- 濂栨儵璁板綍 -->
+<template>
+  <div>
+    <div style="text-align: left; margin-bottom: 15px;">
+      <label>濮撳悕</label>
+      <el-input v-model="search.userName" clearable placeholder="璇疯緭鍏ュ叧閿瓧" size="small" style="width: 20vh;"></el-input>
+      <label style="margin-left: 1em">濂栨儵鏃ユ湡</label>
+      <el-date-picker
+        v-model="search.searchTimeList"
+        :picker-options="pickerOptions"
+        align="right"
+        clearable
+        end-placeholder="缁撴潫鏃ユ湡"
+        format="yyyy-MM-dd"
+        range-separator="鑷�"
+        size="small"
+        start-placeholder="寮�濮嬫棩鏈�"
+        style="width: 20%"
+        type="daterange"
+        unlink-panels
+        value-format="yyyy-MM-dd 00:00:00">
+      </el-date-picker>
+      <el-button size="small" type="primary" @click="getPersonnelTraining(departId)">鏌ヨ</el-button>
+      <div style="float: right;">
+        <el-button :loading="outLoading" size="small" type="primary" @click="handleDown">瀵煎嚭</el-button>
+        <el-button size="small" type="primary" @click="dialogVisible = true">鏂板</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <el-table :data="tableData" height="70vh" style="width: 100%">
+        <el-table-column label="搴忓彿" type="index" width="120">
+          <template v-slot="scope">
+            <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍛樺伐缂栧彿" min-width="180" prop="account">
+        </el-table-column>
+        <el-table-column label="濮撳悕" min-width="180" prop="userName">
+        </el-table-column>
+        <el-table-column label="濂栨儵绾у埆" min-width="180" prop="rewardPunishLevel">
+        </el-table-column>
+        <el-table-column label="濂栨儵鏃堕棿" min-width="180" prop="rewardPunishTime">
+        </el-table-column>
+        <el-table-column label="濂栨儵鍚嶇О" min-width="180" prop="rewardPunishName">
+        </el-table-column>
+        <el-table-column label="濂栨儵鍏蜂綋鍐呭" min-width="120" prop="rewardPunishContent">
+        </el-table-column>
+        <el-table-column label="濂栨儵鍗曚綅" min-width="180" prop="rewardPunishWorkUnit">
+        </el-table-column>
+        <el-table-column label="鍒涘缓浜�" min-width="180" prop="createUserName">
+        </el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="100">
+          <template v-slot="scope">
+            <el-button size="small" type="text" @click="editForm(scope.row)">缂栬緫</el-button>
+            <el-button size="small" type="text" @click="deleteRow(scope.row)">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <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"
+                     @size-change="handleSizeChange"
+                     @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <el-dialog
+      :visible.sync="dialogVisible"
+      title="鎻愮ず"
+      width="50%"
+      @open="getUserList">
+      <div style="height: 40vh">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+          <el-col :span="12">
+            <el-form-item label="鍛樺伐缂栧彿">
+              <el-input v-model="form.account" disabled size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍛樺伐濮撳悕" prop="userName">
+              <el-select v-model="form.userName" placeholder="璇烽�夋嫨" size="small" style="width: 100%" value-key="id"
+                         @change="selectUserChange">
+                <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵绾у埆" prop="rewardPunishLevel">
+              <el-input v-model="form.rewardPunishLevel" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵鍚嶇О" prop="rewardPunishName">
+              <el-input v-model="form.rewardPunishName" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵鏃堕棿" prop="rewardPunishTime">
+              <el-date-picker
+                v-model="form.rewardPunishTime"
+                format="yyyy-MM-dd HH:mm:ss"
+                placeholder="閫夋嫨鏃ユ湡"
+                size="small"
+                style="width: 100%"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵鍗曚綅" prop="rewardPunishWorkUnit">
+              <el-input v-model="form.rewardPunishWorkUnit" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="濂栨儵鍐呭">
+              <el-input v-model="form.rewardPunishContent" :rows="2" size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+    <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+    <el-button type="primary" @click="saveOrUpdate">纭� 瀹�</el-button>
+  </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  addOrUpdateRewardPunishmentApi,
+  deleteRewardPunishmentApi,
+  rewardPunishmentExportApi,
+  rewardPunishmentPageApi
+} from "../../../assets/api/api"
+export default {
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      search: {
+        size: 20,
+        current: 1,
+        total: 0,
+        userName: '',
+        searchTimeList: []
+      },
+      form: {},
+      dialogVisible: false,
+      outLoading: false,
+      pickerOptions: {
+        shortcuts: [{
+          text: '鏈�杩戜竴鍛�',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '鏈�杩戜竴涓湀',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '鏈�杩戜笁涓湀',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+            picker.$emit('pick', [start, end]);
+          }
+        }]
+      },
+      rules: {
+        userName: [{
+          required: true, message: '璇烽�夋嫨鍛樺伐濮撳悕', trigger: 'change'
+        }],
+        rewardPunishLevel: [{
+          required: true, message: '璇疯緭鍏ュ鎯╃骇鍒�', trigger: 'blur'
+        }],
+        rewardPunishName: [{
+          required: true, message: '璇疯緭鍏ュ鎯╁悕绉�', trigger: 'blur'
+        }],
+        rewardPunishTime: [{
+          required: true, message: '璇疯緭鍏ュ鎯╂椂闂�', trigger: 'blur'
+        }],
+        rewardPunishWorkUnit: [{
+          required: true, message: '璇疯緭鍏ュ鎯╁崟浣�', trigger: 'blur'
+        }]
+      },
+      responsibleOptions: []
+    };
+  },
+  mounted() {
+    this.getPersonnelTraining(this.departId);
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.search.size = val
+      this.getPersonnelTraining(this.departId);
+    },
+    handleCurrentChange(val) {
+      this.search.current = val
+      this.getPersonnelTraining(this.departId);
+    },
+    async getPersonnelTraining() {
+      const {code, data} = await this.$axios({
+        method: 'get',
+        url: rewardPunishmentPageApi,
+        params: {
+          userId: this.isDepartment ? '' : this.departId,
+          departmentId: this.isDepartment ? this.departId : '',
+          current: this.search.curent,
+          size: this.search.size,
+          userName: this.search.userName,
+          startTime: this.search.searchTimeList && this.search.searchTimeList[0],
+          endTime: this.search.searchTimeList && this.search.searchTimeList[1],
+        }
+      })
+      if (code == 200) {
+        this.tableData = data.records
+        this.search.total = data.total
+      }
+    },
+    handleDown(){
+      this.outLoading = true
+      this.$axios.post(this.$api.deviceCheck.rewardPunishmentExport,{
+        userId: this.isDepartment ? '' : this.departId,
+        departmentId: this.isDepartment ? this.departId : '',
+        userName: this.search.userName,
+        startTime: this.search.searchTimeList && this.search.searchTimeList[0],
+        endTime: this.search.searchTimeList && this.search.searchTimeList[1]
+      },{responseType: 'blob'}).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], {
+          type: 'application/force-download'
+        })
+        // 鍒涘缓涓�涓秴閾炬帴锛屽皢鏂囦欢娴佽祴杩涘幓锛岀劧鍚庡疄鐜拌繖涓秴閾炬帴鐨勫崟鍑讳簨浠�
+        const elink = document.createElement('a')
+        elink.download = decodeURI('濂栨儵璁板綍'+'.xlsx')
+        elink.style.display = 'none'
+        elink.href = URL.createObjectURL(blob)
+        document.body.appendChild(elink)
+        elink.click();
+        URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+        document.body.removeChild(elink)
+      })
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data
+        }
+      })
+    },
+    selectUserChange(val) {
+      this.form.userName = val.name
+      this.form.account = val.account
+      this.form.userId = val.id
+    },
+    editForm(row) {
+      this.dialogVisible = true
+      this.form = {...row};
+    },
+    saveOrUpdate() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          this.dialogVisible = false
+          const {code, data} = await this.$axios({
+            method: 'post',
+            url: addOrUpdateRewardPunishmentApi,
+            data: this.form,
+            headers: {
+              'Content-Type': 'application/json'
+            }
+          })
+          if (code == 200) {
+            this.$message.success("鎿嶄綔鎴愬姛锛�")
+            this.getPersonnelTraining(this.departId);
+          }
+        }
+      })
+    },
+    async deleteRow(row) {
+      const {code, data} = await this.$axios({
+        method: 'delete',
+        url: deleteRewardPunishmentApi,
+        params: {
+          id: row.id
+        }
+      })
+      if (code == 200) {
+        this.$message.success("鎿嶄綔鎴愬姛锛�")
+        this.getPersonnelTraining(this.departId);
+      }
+    }
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    departId: {
+      handler(newId, oldId) {
+        this.getPersonnelTraining(newId);
+      }
+    },
+    dialogVisible(newVal) {
+      if (newVal === false) {
+        this.form = {}
+        this.$refs['form'].clearValidate()
+      }
+    }
+  }
+};
+</script>
diff --git a/src/components/do/a6-personnel/track-record.vue b/src/components/do/a6-personnel/track-record.vue
new file mode 100644
index 0000000..60e0aed
--- /dev/null
+++ b/src/components/do/a6-personnel/track-record.vue
@@ -0,0 +1,299 @@
+<!-- 宸ヤ綔灞ュ巻 -->
+<template>
+  <div>
+    <div style="text-align: right; margin-bottom: 15px;">
+      <el-button type="primary" size="small" @click="dialogVisible = true" v-if="clickNodeVal.userId">娣诲姞宸ヤ綔灞ュ巻</el-button>
+      <el-button type="primary" size="small" @click="exportExcel" :loading="outLoading">瀵煎嚭excel</el-button>
+    </div>
+    <div class="table">
+      <el-table :data="tableData" style="width: 100%" height="70vh">
+        <el-table-column type="index" label="搴忓彿" width="120">
+          <template v-slot="scope">
+            <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="startTime" label="璧峰鏃ユ湡" min-width="180">
+        </el-table-column>
+        <el-table-column prop="endTime" label="缁撴潫鏃ユ湡" min-width="180">
+        </el-table-column>
+        <el-table-column prop="placeWork" label="宸ヤ綔鍗曚綅" min-width="120">
+        </el-table-column>
+        <el-table-column prop="department" label="宸ヤ綔閮ㄩ棬" min-width="120">
+        </el-table-column>
+        <el-table-column prop="post" label="鑱屽姟" min-width="120">
+        </el-table-column>
+        <el-table-column prop="remarks" label="澶囨敞" min-width="180">
+        </el-table-column>
+        <el-table-column prop="createUser" label="鍒涘缓浜�" min-width="180">
+        </el-table-column>
+        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" min-width="180">
+        </el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="150">
+          <template v-slot="scope">
+            <el-button type="text" size="small" @click="downloadFile(scope.row.fileName)">涓嬭浇</el-button>
+            <el-button type="text" size="small" @click="checkFun(scope.row)">鏌ョ湅</el-button>
+            <el-button type="text" size="small" style="color: red;" @click="deleteFun(scope.row.id)">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" :current-page="1"
+        :page-sizes="[10, 20, 30, 50, 100]" :page-size="search.size" layout="->,total, sizes, prev, pager, next, jumper"
+        :total="search.total">
+      </el-pagination>
+    </div>
+    <el-dialog title="鎻愮ず" :visible.sync="dialogVisible" width="45%">
+      <div style="height: 30vh;">
+        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="璧峰鏃ユ湡" prop="startTime">
+                <el-date-picker v-model="ruleForm.startTime" type="date" placeholder="閫夋嫨鏃ユ湡" size="small"
+                  style="width: 99%;" format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss" required>
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="缁撴潫鏃ユ湡">
+                <el-date-picker v-model="ruleForm.endTime" type="date" placeholder="閫夋嫨鏃ユ湡" size="small"
+                  style="width: 99%;" format="yyyy-MM-dd" value-format="yyyy-MM-dd HH:mm:ss">
+                </el-date-picker>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="宸ヤ綔鍗曚綅" prop="placeWork">
+                <el-input v-model="ruleForm.placeWork" size="small" clearable required></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="宸ヤ綔閮ㄩ棬" prop="department">
+                <el-input v-model="ruleForm.department" size="small" clearable required></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="鏈�楂樿亴鍔�" prop="post">
+                <el-input v-model="ruleForm.post" size="small" clearable required></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="闄勪欢璧勬枡">
+                <el-row>
+                  <el-col :span="17"><el-input v-model="ruleForm.fileName" size="small" disabled></el-input></el-col>
+                  <el-col :span="7">
+                    <el-upload ref="upload" style="float: left; margin: 0 20px;" :action="action"
+                      :on-success="onSuccess" :on-change="handleChangePic" :show-file-list="false">
+                      <el-button class="uploadFile" slot="trigger" size="mini" type="primary">娴忚</el-button>
+                    </el-upload>
+                  </el-col>
+                </el-row>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="24">
+              <el-form-item label="澶囨敞">
+                <el-input v-model="ruleForm.remarks" size="small" clearable></el-input>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="saveOrUpdate">{{ isUpdate ? '鏇� 鏂�' : '淇� 瀛�' }}</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+  import fileDownload from '../../../util/file'
+export default {
+  props: {
+    clickNodeVal: {
+      type: Object,
+      default: () => {
+        return {};
+      }
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      search: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      dialogVisible: false,
+      ruleForm: {
+        fileName: '',
+        sysFileName: ''
+      },
+      rules: {
+        startTime: [
+          { required: true, message: '璇疯緭鍏ヨ捣濮嬫棩鏈�', trigger: 'blur' },
+          { required: true, message: '璇疯緭鍏ヨ捣濮嬫棩鏈�', trigger: 'change' }
+        ],
+        placeWork: [
+          { required: true, message: '璇疯緭鍏ュ伐浣滃崟浣�', trigger: 'blur' }
+        ],
+        department: [
+          { required: true, message: '璇疯緭鍏ュ伐浣滈儴闂�', trigger: 'blur' }
+        ],
+        post: [
+          { required: true, message: '璇疯緭鍏ユ渶楂樿亴鍔�', trigger: 'blur' }
+        ]
+      },
+      isUpdate: false,
+      outLoading: false
+    };
+  },
+  created() {
+    this.init();
+  },
+  computed: {
+    action() {
+      return this.javaApi + this.$api.personnel.saveCNASFile
+    }
+  },
+  methods: {
+    downloadFile(fileName) {
+      let url = this.javaApi + '/img/' + fileName;
+      fileDownload.downloadIamge(url,fileName)
+    },
+    handleChangePic(file, fileList) {
+      if (fileList.length > 1) {
+        fileList.splice(0, 1);
+      }
+    },
+    onSuccess(response, file, fileList) {
+      if (response.code === 200) {
+        this.$set(this.ruleForm, 'fileName', response.data)
+      } else {
+        this.$message.warning(response.message)
+      }
+    },
+    exportExcel() {
+      this.outLoading = true
+      let userId = this.clickNodeVal.userId ? this.clickNodeVal.userId : null
+      let departmentId = this.clickNodeVal.id ? this.clickNodeVal.id : null
+      this.$axios.get(this.$api.personnel.personTrackRecordExport + "?userId=" + userId + "&departmentId=" + departmentId, { responseType: "blob" }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '宸ヤ綔灞ュ巻.xlsx';
+        link.click();
+      })
+    },
+    saveOrUpdate() {
+      this.$refs['ruleForm'].validate((valid) => {
+        if (valid) {
+          if (this.isUpdate) {
+            this.$axios.put(this.$api.personnel.personTrackRecordUpdate, this.ruleForm, {
+              headers: {
+                'Content-Type': 'application/json'
+              }
+            }).then(res => {
+              if (res.code = 200) {
+                this.dialogVisible = false
+                this.$message.success('鏇存柊鎴愬姛锛�')
+                this.init()
+              }
+            })
+          } else {
+            this.ruleForm.userId = this.clickNodeVal.userId
+            this.$axios.post(this.$api.personnel.personTrackRecordSave, this.ruleForm, {
+              headers: {
+                'Content-Type': 'application/json'
+              }
+            }).then(res => {
+              if (res.code = 200) {
+                this.dialogVisible = false
+                this.$message.success('鏂板鎴愬姛锛�')
+                this.init()
+              }
+            })
+          }
+        } else {
+          return false;
+        }
+      });
+    },
+    deleteFun(id) {
+      this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
+        confirmButtonText: '纭畾',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }).then(() => {
+        this.$axios.delete(this.$api.personnel.personTrackRecordDelete + "?id=" + id).then(res => {
+          this.$message.success('鍒犻櫎鎴愬姛锛�')
+          this.init()
+        })
+      }).catch(() => {
+        this.$message({
+          type: 'info',
+          message: '宸插彇娑堝垹闄�'
+        });
+      });
+    },
+    handleSizeChange(val) {
+      this.search.size = val
+      this.init()
+    },
+    handleCurrentChange(val) {
+      this.search.current = val
+      this.init()
+    },
+    // 鍒濆鍖栬皟鐢�
+    init() {
+      if (this.clickNodeVal.userId) {
+        this.getPersonnelTraining(this.clickNodeVal.userId ? this.clickNodeVal.userId : null, null);
+      } else {
+        this.getPersonnelTraining(null, this.clickNodeVal.id ? this.clickNodeVal.id : null);
+      }
+    },
+    getPersonnelTraining(userId, departmentId) {
+      this.$axios.get(this.$api.personnel.personTrackRecordSelect + "?userId=" + userId + "&size=" + this.search.size + "&current=" + this.search.current + "&departmentId=" + departmentId).then(res => {
+        this.tableData = res.data.records
+        this.search.total = res.data.total
+      })
+    },
+    checkFun(row) {
+      this.ruleForm = { ...row }
+      this.dialogVisible = true
+      this.isUpdate = true
+    }
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    clickNodeVal(newVal) {
+      if (newVal.userId) {
+        // 鐢ㄦ埛id
+        this.getPersonnelTraining(newVal.userId, null);
+      } else {
+        // 閮ㄩ棬id
+        this.getPersonnelTraining(null, newVal.id);
+      }
+    },
+    dialogVisible(newVal) {
+      if (!newVal) {
+        this.isUpdate = false
+        this.$refs.ruleForm.resetFields();
+        this.ruleForm = {}
+      }
+    }
+  }
+};
+</script>
+<style scoped>
+>>>.el-form-item {
+  margin-bottom: 13px;
+}
+</style>
diff --git a/src/components/do/a6-personnel/training-record.vue b/src/components/do/a6-personnel/training-record.vue
new file mode 100644
index 0000000..21ad553
--- /dev/null
+++ b/src/components/do/a6-personnel/training-record.vue
@@ -0,0 +1,319 @@
+<!-- 鍩硅璁板綍 -->
+<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>
+<!--              <el-button :loading="outLoading" size="small" type="primary" @click="exportExcel">瀵煎嚭</el-button>-->
+            </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>
+    </div>
+  </div>
+</template>
+
+<script>
+import ZTTable from '../../caorui/ZTTable/index.vue';
+import TableCard from '../../caorui/TableCard/index.vue';
+import {exportPersonSupervisionRecord} from "../../../assets/api/api";
+
+export default {
+  components: { TableCard, ZTTable },
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      outLoading: false,
+      trainingForm: {},
+      trainingColumn: [
+        {
+          label: '鍛樺伐缂栧彿',
+          prop: 'account',
+          width: '100'
+        }, {
+          label: '濮撳悕',
+          prop: 'name'
+        }, {
+          label: '鎵�鍦ㄩ儴闂�',
+          prop: 'departLimsName',
+          width: '150'
+        }, {
+          label: '鑱岀О',
+          prop: 'professionalTitle'
+        }, {
+          label: '鏈�楂樺鍘�',
+          prop: 'officialAcademicRedentials',
+          width: '100'
+        }, {
+          label: '鍏ュ崟浣嶆椂闂�',
+          prop: 'unitTime',
+          width: '150'
+        },
+        // {
+        //   fixed: 'right',
+        //   dataType: 'action',
+        //   width: 80,
+        //   label: '鎿嶄綔',
+        //   operation: [
+        //     {
+        //       name: '瀵煎嚭',
+        //       type: 'text',
+        //       clickFun: (row) => {
+        //         this.openDownloadDia(row)
+        //       }
+        //     }
+        //   ]
+        // }
+      ],
+      trainingTableData: [],
+      trainingLoading: false,
+      trainingPagination: {
+        size: 20,
+        total: 0,
+        current: 1,
+        userName: null
+      },
+      searchForm: {
+        trainingDate: ''
+      },
+      trainingPersonColumn: [
+        {
+          label: '鍩硅鏃ユ湡',
+          prop: 'trainingDate'
+        }, {
+          label: '鍩硅鍐呭',
+          prop: 'trainingContent'
+        }, {
+          label: '鍩硅璇炬椂',
+          prop: 'educationBackground'
+        }, {
+          label: '璇炬椂',
+          prop: 'classHour'
+        }, {
+          label: '鍩硅缁撴灉',
+          prop: 'examinationResults',
+        }, {
+          label: '澶囨敞',
+          prop: 'remarks'
+        }
+      ],
+      trainingPersonTableData: [],
+      trainingPersonLoading: false,
+      trainingPersonPagination: {
+        size: 20,
+        current: 1,
+        total: 0
+      },
+      currentChangeRow: '',
+    };
+  },
+  mounted() {
+    this.getPersonnelTraining(this.departId);
+  },
+  methods: {
+    exportExcel() {
+      this.outLoading = true;
+      const name = this.isDepartment ? 'departmentId' : 'userId';
+      this.$axios.get(this.$api.personnel.personTrackRecordExport + `&${name}=` + this.departId, { responseType: 'blob' }).then(res => {
+        this.outLoading = false;
+        this.$message.success('瀵煎嚭鎴愬姛');
+        const blob = new Blob([res], { type: 'application/octet-stream' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鍩硅璁板綍.xlsx';
+        link.click();
+      }).catch(err => {
+        this.outLoading = false;
+      })
+    },
+    // 鏌ヨ
+    refreshTable() {
+      this.getPersonnelTraining(this.departId);
+    },
+    // 鍩硅璁板綍瀵煎嚭
+    openDownloadDia (row) {
+      let date = this.searchForm.trainingDate
+      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 => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鍩硅璁板綍瀵煎嚭' + '.docx';
+        link.click();
+      })
+    },
+    // 鑾峰彇瀹為獙瀹�-鍩硅璁″垝鍒楄〃淇℃伅
+    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 => {
+        this.trainingTableData = res.data.records;
+        this.trainingPagination.total = res.data.total;
+        if (this.trainingTableData.length > 0) {
+          this.currentChange(this.trainingTableData[0]);
+        }
+      });
+    },
+    // 鑾峰彇涓汉-鍩硅璁″垝鍒楄〃淇℃伅
+    currentChange(row) {
+      this.currentChangeRow = row
+      if (row === null) {
+        row = this.trainingTableData[0]
+      }
+      this.queryPersonnelDetailsPage(row.userId)
+    },
+    queryPersonnelDetailsPage(userId) {
+      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 => {
+        this.trainingPersonTableData = res.data.records;
+        this.trainingPersonPagination.total = res.data.total;
+      });
+    },
+    // 鍒嗛〉
+    handleYearCurrentTraining(page) {
+      this.trainingPagination.curent = page;
+      this.getPersonnelTraining(this.departId);
+    },
+    handleYearSizeChangeTraining(size) {
+      this.trainingPagination.size = size;
+      this.getPersonnelTraining(this.departId);
+    },
+    // 鍒嗛〉
+    handleYearCurrentPagination(page) {
+      this.trainingPersonPagination.curent = page;
+      this.queryPersonnelDetailsPage(this.currentChangeRow.userId);
+    },
+    handleYearSizeChangePagination(size) {
+      this.trainingPersonPagination.size = size;
+      this.queryPersonnelDetailsPage(this.currentChangeRow.userId);
+    }
+  },
+  watch: {
+    departId: {
+      handler(newId, oldId) {
+        if (this.isDepartment) {
+          this.getPersonnelTraining(newId);
+        } else {
+          this.queryPersonnelDetailsPage(newId)
+        }
+      }
+    }
+  }
+};
+</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;
+}
+</style>
diff --git a/src/components/do/a8-file-handling/FileChangeRequest.vue b/src/components/do/a8-file-handling/FileChangeRequest.vue
index 00f24ac..3ba9eab 100644
--- a/src/components/do/a8-file-handling/FileChangeRequest.vue
+++ b/src/components/do/a8-file-handling/FileChangeRequest.vue
@@ -465,6 +465,9 @@
     // 褰撳墠鏂囦欢
     getCurrentFile(e){
       this.currentFile = this.fileList.find(m=>m.documentCode==e)
+      if(!this.currentFile){
+        this.currentFile = {}
+      }
     },
     selectEnumByCategory() {
       this.$axios.post(this.$api.enums.selectEnumByCategory, {
diff --git a/src/components/view/a6-personnel.vue b/src/components/view/a6-personnel.vue
new file mode 100644
index 0000000..9e788fa
--- /dev/null
+++ b/src/components/view/a6-personnel.vue
@@ -0,0 +1,324 @@
+<template>
+  <div class="main">
+
+    <div class="main_left">
+      <el-row>
+        <el-col :span="20">
+        <el-input
+          v-model="search"
+          class="div_left_input"
+          clearable
+          placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�"
+          size="small"
+          suffix-icon="el-icon-search"
+          @blur="searchFilter"
+          @clear="searchFilter"
+          @keyup.enter.native="searchFilter"
+        ></el-input>
+        </el-col>
+        <el-col :span="4" style="text-align: center;line-height: 30px; margin-top: 14px">
+          <el-button circle icon="el-icon-plus" size="mini" type="primary" @click="handleAdd"></el-button>
+        </el-col>
+      </el-row>
+      <el-tree
+        ref="tree"
+        :data="list"
+        :default-expanded-keys="[1]"
+        :expand-on-click-node="false"
+        :filter-node-method="filterNode"
+        :props="{ children: 'children', label: 'name' }"
+        highlight-current
+        node-key="id"
+        style="height:calc(100% - 70px);overflow-y: scroll;scrollbar-width: none;"
+        @node-click="handleNodeClick"
+        @node-expand="nodeOpen"
+        @node-collapse="nodeClose"
+      >
+        <div slot-scope="{ node, data }" class="custom-tree-node">
+          <el-row style="width: 100%;">
+            <el-col :span="22" style="text-align: left;">
+              <span><i
+                :class="`node_i ${data.children != undefined&&data.children.length>0 ? 'el-icon-folder-opened' : 'el-icon-tickets'}`"></i>
+                {{ data.name }}</span>
+            </el-col>
+            <el-col v-if="node.level>1 && data.id !== null" :span="2" style="text-align: right;">
+              <el-button size="mini" type="text" @click.stop="remove(node, data)">
+                <i class="el-icon-delete"></i>
+              </el-button>
+            </el-col>
+          </el-row>
+        </div>
+      </el-tree>
+    </div>
+    <div style="width: 10px;"></div>
+    <div class="main_right">
+      <!-- 閮ㄩ棬 -->
+      <Department
+        ref="departRef"
+        :clickNodeVal="clickNodeVal"
+        :currentCompaniesList="currentCompaniesList"
+        :departId="departId"
+        :isDepartment="isDepartment"
+        :isShowAll="isShowAll"
+      />
+    </div>
+    <el-dialog :visible.sync="addDia" title="鏋舵瀯鏂板" width="400px">
+      <div class="body">
+        <el-row style="line-height: 50px;">
+          <el-col :span="6" style="text-align: right;">
+            <span class="required-span">* </span>鏋舵瀯鍚嶇О锛�
+          </el-col>
+          <el-col :offset="1" :span="16">
+            <el-input v-model="addOb.name" clearable placeholder="璇疯緭鍏ユ灦鏋勫悕绉�" size="small" @keyup.enter.native="addStandardTree"></el-input>
+          </el-col>
+        </el-row>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="addDia = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="addStandardTree">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import Department from '../caorui/Department/index.vue';
+
+export default {
+  components: {
+    Department
+  },
+  data() {
+    return {
+      isShowAll: true, //  鏄惁灞曠ず鏍囩鏍�
+      departId: 0,
+      list: [],
+      addDia: false,
+      addOb: {
+        name: '',
+        fatherId: ''
+      },
+      search: '',
+      clickNodeVal: {},
+      addUserForm: {
+        name: ''
+      },
+      currentCompaniesList: [],
+      entity: {
+        name: '',
+        departLimsId: '',
+        orderBy: {
+          field: 'id',
+          order: 'asc'
+        }
+      },
+      overallRecord: '浜哄憳鍒楄〃',
+      isDepartment: false,
+    };
+  },
+  mounted() {
+    this.geList();
+  },
+  methods: {
+    remove(node, data) {
+      this.$confirm("鏄惁鍒犻櫎璇ュ眰绾�", "鎻愮ず", {
+        type: "error"
+      }).then(() => {
+        this.treeLoad = true
+        this.$axios.post(this.$api.department.delDepartmentLims, {
+          id: data.id
+        }).then(res => {
+          if (res.code == 201) return
+          this.$message.success('宸插垹闄�')
+          this.geList();
+        })
+      }).catch(e => {})
+    },
+    addStandardTree() {
+      if (this.addOb.name == null || this.addOb.factory == '') {
+        this.$message.error('鏋勬灦鍚嶇О鏄繀濉」')
+        return
+      }
+      this.$axios.post(this.$api.department.addDepartmentLims, this.addOb, {
+        headers: {
+          'Content-Type': 'application/json'
+        }
+      }).then(res => {
+        if (res.code === 201) {
+          return
+        }
+        this.$message.success('娣诲姞鎴愬姛')
+        this.addDia = false
+        this.geList();
+        this.addOb.name = ''
+        this.addOb.fatherId = ''
+      })
+    },
+    handleAdd() {
+      if (this.addOb.fatherId) {
+        this.addDia = true;
+      } else {
+        this.$message.error('璇烽�夋嫨涓�涓灦鏋勫眰绾�')
+      }
+    },
+    // 浜哄憳鍒楄〃缂栬緫
+    updatePerson(row) {
+      const node = this.findNodeById(this.list, row.name);
+      if (node) {
+        this.handleNodeClick(node);
+      } else {
+        this.$message.warning('鏈壘鍒拌浜哄憳');
+      }
+    },
+    // 鏂板缓浜哄憳鍚庡埛鏂版爲
+    refreshTree () {
+      this.geList()
+    },
+    findNodeById(treeData, name) {
+      for (let i = 0; i < treeData.length; i++) {
+        if (treeData[i].name === name) {
+          return treeData[i]; // 鎵惧埌鑺傜偣锛岃繑鍥炶鑺傜偣
+        }
+        if (treeData[i].children && treeData[i].children.length > 0) {
+          const foundNode = this.findNodeById(treeData[i].children, name);
+          if (foundNode) {
+            return foundNode; // 鍦ㄥ瓙鑺傜偣涓壘鍒帮紝杩斿洖璇ヨ妭鐐�
+          }
+        }
+      }
+      return null; // 娌℃湁鎵惧埌鑺傜偣锛岃繑鍥瀗ull
+    },
+    searchFilter() {
+      this.$refs.tree.filter(this.search);
+    },
+    // 鑾峰彇鏍�
+    geList() {
+      this.$axios.get(this.$api.personnel.selectCNSAPersonTree).then(res => {
+        this.list = res.data;
+        if(this.list.length > 0) {
+          this.isDepartment = true;
+          this.departId = this.list[0].id
+        }
+      });
+    },
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.name.indexOf(value) !== -1;
+    },
+    nodeClose(data, node, el) {
+      $($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder');
+    },
+    nodeOpen(data, node, el) {
+      $($(el.$el).find('.node_i')[0]).attr('class', 'node_i el-icon-folder-opened');
+    },
+    handleNodeClick(val, node, el) {
+      //鏍戠殑鍊�
+      this.clickNodeVal = val;
+      // 瀛樺偍鐖剁骇鑺傜偣绾ф暟
+      if (node) {
+        this.getNodeParent(node);
+        this.clickNodeVal.level = node.level;
+        this.clickNodeVal.parent = node.parent.data;
+      }
+      this.entity.departLimsId = val.id;
+      this.addOb.fatherId = val.id;
+      // 鏄惁鏄剧ず璁惧璇︽儏
+      this.isShowAll = val.id !== null;
+      if (val.id) {	// 濡傛灉鏄疄楠屽
+        this.departId = val.id;
+        this.isDepartment = true;
+      }
+      if (val.userId) { // 鏄汉鍛�
+        this.departId = val.userId;
+        this.isDepartment = false
+      }
+    },
+    getNodeParent(val) {
+      if (val.parent != null) {
+        this.currentCompaniesList[val.level - 1] = val.data.id;
+        this.selectTree += ' - ' + val.label;
+        this.getNodeParent(val.parent);
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.custom-tree-node {
+  width: 80%;
+  line-height: 32px;
+}
+.custom-tree-node .el-icon-delete {
+  color: #3A7BFA;
+  opacity: 0;
+  font-size: 15px;
+}
+
+.custom-tree-node:hover .el-icon-delete {
+  opacity: 1;
+}
+
+.node_i {
+  color: orange;
+  font-size: 18px;
+}
+
+.main {
+  display: flex;
+  padding: 15px 0;
+}
+
+.main_left {
+  background: #ffffff;
+  text-align: center;
+  height: calc(100vh - 6.5em);
+  width: 270px;
+  border-radius: 15px;
+}
+
+.main_right {
+  width: calc(100% - 288px);
+  border-radius: 15px;
+}
+
+.div_left_input {
+  margin: 15px 0;
+  width: 90%;
+}
+
+>>> .el-tabs--border-card > .el-tabs__header .el-tabs__item {
+  border: 0 none;
+}
+
+>>> .el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
+  color: black;
+}
+
+>>> .el-tabs--border-card > .el-tabs__header {
+  border-bottom: none;
+}
+
+.search {
+  background-color: #fff;
+  height: 100%;
+  display: flex;
+  justify-content: end;
+}
+
+.search_thing {
+  width: 350px;
+  display: flex;
+  align-items: center;
+}
+
+.search_label {
+  width: 110px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 110px);
+}
+</style>
diff --git a/src/components/view/a7-Ensure-results-validity.vue b/src/components/view/a7-Ensure-results-validity.vue
index 7297006..2c6ba99 100644
--- a/src/components/view/a7-Ensure-results-validity.vue
+++ b/src/components/view/a7-Ensure-results-validity.vue
@@ -100,6 +100,15 @@
         <el-button :loading="ratifyLoading" type="primary" @click="handleRatify(1)">鎵� 鍑�</el-button>
       </span>
     </el-dialog>
+    <el-dialog :visible.sync="downloadDialog" title="瀵煎嚭" width="600px">
+      <span>
+        <el-button plain type="primary" @click="controlDown">瀹炴柦璁″垝瀵煎嚭</el-button>
+        <el-button plain type="primary" @click="processingDown">璇勪环瀵煎嚭</el-button>
+      </span>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="downloadDialog = false">鍙� 娑�</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
@@ -333,6 +342,13 @@
               }
             },
             {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.downLoadPost(row);
+              },
+            },
+            {
               name: '鍒犻櫎',
               type: 'text',
               color: '#f56c6c',
@@ -361,6 +377,8 @@
       examineInfo: {},
       ratifyInfo: {},
       upLoading: false,
+      downloadDialog: false,
+      download: {},
     };
   },
   mounted() {
@@ -573,6 +591,11 @@
       this.evaluateDialog = false
       this.getYearDetailPlanList()
     },
+    // 鎵撳紑瀵煎嚭寮规
+    downLoadPost (row) {
+      this.downloadDialog = true
+      this.download = row
+    },
     // 鎵撳紑骞村害鏄庣粏鏂板銆佷慨鏀瑰脊妗�
     showDialog (type, row) {
       this.formDia = true
@@ -584,6 +607,32 @@
       this.formDia = false
       this.getYearDetailPlanList()
     },
+    // 鎺у埗鍗曞鍑�
+    controlDown() {
+      this.$axios.get(this.$api.qualityMonitor.exportQualityMonitorRatify + '?qualityMonitorDetailsId=' + this.download.qualityMonitorDetailsId, { responseType: "blob" }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '璐ㄩ噺鐩戞帶瀹炴柦璁″垝.docx';
+        link.click();
+      })
+    },
+    // 澶勭悊鍗曞鍑�
+    processingDown() {
+      this.$axios.get(this.$api.qualityMonitor.exportQualityMonitorEvaluate + '?qualityMonitorDetailsId=' + this.download.qualityMonitorDetailsId, { responseType: "blob" }).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res], { type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '璐ㄩ噺鐩戞帶璇勪环.docx';
+        link.click();
+      })
+    },
     delYearPlanDetail (row) {
       this.$confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ユ暟鎹�, 鏄惁缁х画?', '鎻愮ず', {
         confirmButtonText: '纭畾',
diff --git a/src/components/view/a7-changes-standard-methods.vue b/src/components/view/a7-changes-standard-methods.vue
index ae0ea31..e363c45 100644
--- a/src/components/view/a7-changes-standard-methods.vue
+++ b/src/components/view/a7-changes-standard-methods.vue
@@ -10,7 +10,8 @@
       <div class="search-background">
         <span class="search-group">
           <span style="width: 120px">鏍囧噯鏂规硶锛�</span>
-          <el-input size="small" v-model="searchForm.methodName" clearable></el-input>
+          <!-- <el-input size="small" v-model="searchForm.methodName" clearable></el-input> -->
+          <el-input v-model="searchForm.methodName" clearable size="small"></el-input>
         </span>
         <span class="search-group">
           <el-button size="medium"  @click="resetSearchForm">閲� 缃�</el-button>
@@ -88,6 +89,13 @@
               type: 'text',
               clickFun: (row) => {
                 this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.downLoadPost(row);
               },
             },
             {
@@ -177,6 +185,19 @@
       this.formDIa = false
       this.searchList()
     },
+    // 瀵煎嚭
+    downLoadPost(row) {
+      this.$axios.get(this.$api.processMethodVerify.exportMethodVerify + '?methodVerifyId=' + row.methodVerifyId,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鏍囧噯锛堟柟娉曪級纭璁板綍.docx';
+        link.click();
+      })
+    },
     // 鍒嗛〉
     handleSizeChange(val) {
       this.page.size = val;
diff --git a/src/components/view/a7-method-verification.vue b/src/components/view/a7-method-verification.vue
index a922044..152dd0d 100644
--- a/src/components/view/a7-method-verification.vue
+++ b/src/components/view/a7-method-verification.vue
@@ -10,7 +10,7 @@
       <div class="search-background">
         <span class="search-group">
           <span style="width: 120px">鏍囧噯鏂规硶锛�</span>
-          <el-input size="small" v-model="searchForm.methodName" clearable></el-input>
+          <el-input v-model="searchForm.methodName" clearable size="small"></el-input>
         </span>
         <span class="search-group">
           <el-button size="medium"  @click="resetSearchForm">閲� 缃�</el-button>
@@ -88,6 +88,13 @@
               type: 'text',
               clickFun: (row) => {
                 this.openFormDia('edit', row);
+              },
+            },
+            {
+              name: '瀵煎嚭',
+              type: 'text',
+              clickFun: (row) => {
+                this.downLoadPost(row);
               },
             },
             {
@@ -172,6 +179,19 @@
         this.$refs.formDIa.openDia(row)
       })
     },
+    // 瀵煎嚭
+    downLoadPost(row) {
+      this.$axios.get(this.$api.processMethodVerify.exportMethodVerify + '?methodVerifyId=' + row.methodVerifyId,{responseType: "blob"}).then(res => {
+        this.outLoading = false
+        this.$message.success('瀵煎嚭鎴愬姛')
+        const blob = new Blob([res],{ type: 'application/msword' });
+        const url = URL.createObjectURL(blob);
+        const link = document.createElement('a');
+        link.href = url;
+        link.download = '鏍囧噯锛堟柟娉曪級纭璁板綍.docx';
+        link.click();
+      })
+    },
     // 鍏抽棴寮规
     closeDia () {
       this.formDIa = false
diff --git a/src/main.js b/src/main.js
index b2a35c8..30cf6af 100644
--- a/src/main.js
+++ b/src/main.js
@@ -32,7 +32,7 @@
 const javaApi = 'https://ztwxlims.ztt.cn:7443/lims/';
 
 //浜�
-// Vue.prototype.LOCATIONVUE = "http://114.132.189.42:8080";
+Vue.prototype.LOCATIONVUE = "http://114.132.189.42:8080";
 const javaApi = 'http://114.132.189.42:1234';
 
 // //妫�娴嬩腑蹇冩寮忓簱

--
Gitblit v1.9.3