gaoluyang
2025-03-10 2f5d64825dbc81f9732893ee9f3de1a38725ae25
Merge remote-tracking branch 'origin/dev' into dev
已添加37个文件
已修改8个文件
10610 ■■■■■ 文件已修改
src/api/cnas/personnel/personalOverview.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/personnel/personnelInfo.js 819 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/images/renyuan-title.svg 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Editor/index.vue 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/FileUpload/index.vue 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/ImageUpload/index.vue 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/value-table.vue 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/materialOrder/filesLookVisible.vue 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personalOverview/index.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Communicate/Add.vue 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Communicate/index.vue 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/JobResponsibilities/index.vue 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Mandate/Add.vue 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Mandate/index.vue 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue 567 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue 947 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue 319 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/AddInDetail.vue 319 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/Edit.vue 580 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/index.vue 1012 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Plan/Add.vue 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Plan/UploadExcel.vue 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Plan/index.vue 484 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/Add.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/ConditionForm.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/Inform.vue 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/MeasureForm.vue 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/RectifyForm.vue 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/index.vue 312 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Fact.vue 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Measure.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Reason.vue 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Result.vue 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/index.vue 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/index.vue 406 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/supervise/ApproveForm.vue 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/Records/supervise/SuperviseForm.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/TrainingRecord/index.vue 285 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/rewardPunishmentRecord/index.vue 316 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/components/trackRecord/index.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/Department/index.vue 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/personnel/personnelInfo/index.vue 297 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/structural/capabilityAndLaboratory/capability/index.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/structural/capabilityAndLaboratory/laboratory/index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/personnel/personalOverview.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,10 @@
import request from "@/utils/request";
// èµ„源要求-人员总览
export function selectPersonnelOverview(query) {
  return request({
    url: "/user/selectPersonnelOverview",
    method: "get",
    params: query,
  });
}
src/api/cnas/personnel/personnelInfo.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,819 @@
import request from "@/utils/request";
//删除部门
export function delDepartmentLims(query) {
  return request({
    url: "/department/delDepartmentLims",
    method: "delete",
    params: query,
  });
}
// æ·»åŠ éƒ¨é—¨
export function addDepartmentLims(data) {
  return request({
    url: "/department/addDepartmentLims",
    method: "post",
    data: data,
  });
}
// æŸ¥è¯¢CNAS人员侧边栏
export function selectCNSAPersonTree(query) {
  return request({
    url: "/personBasicInfo/selectCNSAPersonTree",
    method: "get",
    params: query,
  });
}
// å¯¹æŽ¥äººå‘˜å¹³å° èŽ·å–æ‰€æœ‰äººå‘˜ä¿¡æ¯
export function getEmployees(query) {
  return request({
    url: "/personBasicInfo/getEmployees",
    method: "get",
    params: query,
  });
}
// èŽ·å–äººå‘˜åˆ—è¡¨
export function basicInformationOfPersonnelSelectPage(query) {
  return request({
    url: "/personBasicInfo/basicInformationOfPersonnelSelectPage",
    method: "get",
    params: query,
  });
}
//删除人员明细所在组织架构
export function delUserDepardLimsId(query) {
  return request({
    url: "/user/delUserDepardLimsId",
    method: "delete",
    params: query,
  });
}
// ä¿®æ”¹äººå‘˜æ˜Žç»†æ‰€åœ¨ç»„织架构
export function upUserDepardLimsId(data) {
  return request({
    url: "/user/upUserDepardLimsId",
    method: "post",
    data: data,
  });
}
// æœ¬ä¿¡æ¯å¯¼å‡º,传参类似分页
export function exportPersonBasicInfo(query) {
  return request({
    url: "/personBasicInfo/exportPersonBasicInfo",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// æœ¬ä¿¡æ¯å¯¼å‡º,传参类似分页
export function exportPersonBasicInfoById(query) {
  return request({
    url: "/personBasicInfo/exportPersonBasicInfoById",
    method: "get",
    params: query,
  });
}
/**
 * @desc æ²Ÿé€šè®°å½•
 */
// æ²Ÿé€šè®°å½•-列表
export function personPersonCommunicationAbilityPage(query) {
  return request({
    url: "/personCommunicationAbility/personPersonCommunicationAbilityPage",
    method: "get",
    params: query,
  });
}
//沟通记录-删除
export function deletePersonCommunicationAbility(query) {
  return request({
    url: "/personCommunicationAbility/deletePersonCommunicationAbility",
    method: "delete",
    params: query,
  });
}
// æ²Ÿé€šè®°å½•-导出
export function exportPersonCommunicationAbility(query) {
  return request({
    url: "/personCommunicationAbility/exportPersonCommunicationAbility",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// äººå‘˜åˆ—表
export function selectUserList(query) {
  return request({
    url: "/deviceScope/selectUserList",
    method: "get",
    params: query,
  });
}
// æ²Ÿé€šè®°å½•新增-编辑
export function addOrUpdatePersonCommunicationAbility(data) {
  return request({
    url: "/personCommunicationAbility/addOrUpdatePersonCommunicationAbility",
    method: "post",
    data: data,
  });
}
/**
 * @desc å²—位职责
 */
// åˆ†é¡µæŸ¥è¯¢å²—位职责
export function personJobResponsibilitiesSelect(query) {
  return request({
    url: "/personJobResponsibilities/personJobResponsibilitiesSelect",
    method: "get",
    params: query,
  });
}
// æ–°å¢žå²—位职责
export function personJobResponsibilitiesSave(data) {
  return request({
    url: "/personJobResponsibilities/personJobResponsibilitiesSave",
    method: "post",
    data: data,
  });
}
// å¯¼å‡ºäººå‘˜èŒè´£,传参id
export function exportPersonJobResponsibilities(query) {
  return request({
    url: "/personJobResponsibilities/exportPersonJobResponsibilities",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
//删除岗位职责
export function personJobResponsibilitiesDelete(query) {
  return request({
    url: "/personJobResponsibilities/personJobResponsibilitiesDelete",
    method: "delete",
    params: query,
  });
}
/**
 * @desc ä»»èŒæŽˆæƒ
 */
// ä»»èŒæŽˆæƒè®°å½•-列表
export function PersonPostAuthorizationRecordPage(query) {
  return request({
    url: "/personPostAuthorizationRecord/PersonPostAuthorizationRecordPage",
    method: "get",
    params: query,
  });
}
//任职授权记录-删除
export function deletePersonPostAuthorizationRecord(query) {
  return request({
    url: "/personPostAuthorizationRecord/deletePersonPostAuthorizationRecord",
    method: "delete",
    params: query,
  });
}
// å¯¼å‡ºäººå‘˜èŒè´£,传参id
export function exportPersonPostAuthorizationRecord(query) {
  return request({
    url: "/personPostAuthorizationRecord/exportPersonPostAuthorizationRecord",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// ä»»èŒæŽˆæƒè®°å½•-新增
export function addOrUpdatePersonPostAuthorizationRecord(data) {
  return request({
    url: "/personPostAuthorizationRecord/addOrUpdatePersonPostAuthorizationRecord",
    method: "post",
    data: data,
  });
}
//删除文件
export function deleteCNASFile(query) {
  return request({
    url: "/personBasicInfo/deleteCNASFile",
    method: "delete",
    params: query,
  });
}
/**
 * @desc äººå‘˜èƒ½åŠ›
 */
// å¯¼å‡ºäººå‘˜èƒ½åŠ›
export function exportPersonnelCapacity(query) {
  return request({
    url: "/personPersonnelCapacity/exportPersonnelCapacity",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// æŸ¥è¯¢äººå‘˜èƒ½åŠ›
export function personPersonnelCapacityPage(query) {
  return request({
    url: "/personPersonnelCapacity/personPersonnelCapacityPage",
    method: "get",
    params: query,
  });
}
// æ–°å¢žç¼–辑人员能力
export function addOrUpdatePersonPersonnelCapacity(data) {
  return request({
    url: "/personPersonnelCapacity/addOrUpdatePersonPersonnelCapacity",
    method: "post",
    data: data,
  });
}
// ç¡®è®¤äººå‘˜èƒ½åŠ›
export function confirmPersonnelCapability(data) {
  return request({
    url: "/personPersonnelCapacity/confirmPersonnelCapability",
    method: "post",
    data: data,
  });
}
//删除人员能力
export function deletePersonPersonnelCapacity(query) {
  return request({
    url: "/personPersonnelCapacity/deletePersonPersonnelCapacity",
    method: "delete",
    params: query,
  });
}
/**
 * @desc äººå‘˜ä¿¡æ¯
 */
// èŽ·å–é™„ä»¶
export function getAnnex(query) {
  return request({
    url: "/personBasicInfo/getAnnex",
    method: "get",
    params: query,
  });
}
// æ›´æ–°é™„ä»¶
export function updateAnnex(data) {
  return request({
    url: "/personBasicInfo/updateAnnex",
    method: "post",
    data: data,
  });
}
//
export function getAnnexByUserId(query) {
  return request({
    url: "/personBasicInfo/getAnnexByUserId",
    method: "get",
    params: query,
  });
}
// æ·»åР附件
export function addAnnex(data) {
  return request({
    url: "/personBasicInfo/addAnnex",
    method: "post",
    data: data,
  });
}
//删除附件
export function deleteAnnex(query) {
  return request({
    url: "/personBasicInfo/deleteAnnex/" + query,
    method: "delete",
    // params: query,
  });
}
//人员基本信息查询
export function getCNASPersonnelInfo(query) {
  return request({
    url: "/personBasicInfo/getCNASPersonnelInfo",
    method: "get",
    params: query,
  });
}
// äººå‘˜åŸºæœ¬ä¿¡æ¯ä¿å­˜
export function saveCNASPersonnelInfo(data) {
  return request({
    url: "/personBasicInfo/saveCNASPersonnelInfo",
    method: "post",
    data: data,
  });
}
/**培训计划
 */
//年度计划明细表 åˆ é™¤
export function deleteDetail(query) {
  return request({
    url: "/personTraining/deleteDetail",
    method: "delete",
    params: query,
  });
}
//查询人员培训
export function personTrainingSelect(query) {
  return request({
    url: "/personTraining/personTrainingSelect",
    method: "get",
    params: query,
  });
}
//查询培训计划年度计划明细表
export function queryTheAnnualPlanDetailsTable(query) {
  return request({
    url: "/personTraining/queryTheAnnualPlanDetailsTable",
    method: "get",
    params: query,
  });
}
//删除人员培训信息
export function personTrainingDelete(query) {
  return request({
    url: "/personTraining/personTrainingDelete",
    method: "delete",
    params: query,
  });
}
// å®¡æ ¸ å¹´åº¦äººå‘˜åŸ¹è®­
export function reviewAnnualPersonnelTraining(data) {
  return request({
    url: "/personTraining/reviewAnnualPersonnelTraining",
    method: "post",
    data: data,
  });
}
// æ‰¹å‡† å¹´åº¦äººå‘˜åŸ¹è®­
export function approveAnnualPersonnelTraining(data) {
  return request({
    url: "/personTraining/approveAnnualPersonnelTraining",
    method: "post",
    data: data,
  });
}
// å¯¼å‡ºäººå‘˜åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½•
export function exportPersonTrainingRecord(query) {
  return request({
    url: "/personTraining/exportPersonTrainingRecord",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// å¯¼å‡º/人员培训
export function exportPersonTraining(query) {
  return request({
    url: "/personTraining/exportPersonTraining",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// è®¤é¢†/取消认领
export function claimOfTrainingAndAssessmentRecords(data) {
  return request({
    url: "/personTraining/claimOfTrainingAndAssessmentRecords",
    method: "post",
    data: data,
  });
}
// æ‰¹é‡åˆ é™¤ å¹´åº¦è®¡åˆ’明细表
export function deleteAnnualPlanDetailTable(query) {
  return request({
    url: "/personTraining/deleteAnnualPlanDetailTable",
    method: "delete",
    params: query,
  });
}
// å¹´åº¦è®¡åˆ’明细 æ–‡ä»¶ä¸‹è½½
export function fileDownLoad(query) {
  return request({
    url: "/personTraining/fileDownLoad",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// åˆ é™¤æŸ¥è¯¢
export function deleteFile(query) {
  return request({
    url: "/personTraining/deleteFile",
    method: "delete",
    params: query,
  });
}
//附件查询
export function getFileData(query) {
  return request({
    url: "/personTraining/getFileData",
    method: "get",
    params: query,
  });
}
//培训与考核记录 æŸ¥è¯¢
export function trainingAndAssessmentRecordsPage(query) {
  return request({
    url: "/personTraining/trainingAndAssessmentRecordsPage",
    method: "get",
    params: query,
  });
}
// åŸ¹è®­ä¸Žè€ƒæ ¸ å¤±ç„¦æ›´æ–°
export function outOfFocusPreservation(data) {
  return request({
    url: "/personTraining/outOfFocusPreservation",
    method: "post",
    data: data,
  });
}
// åŸ¹è®­ä¸Žè€ƒæ ¸ æ–°å¢žäººå‘˜
export function newPersonnelAddedToTrainingRecords(data) {
  return request({
    url: "/personTraining/newPersonnelAddedToTrainingRecords",
    method: "post",
    data: data,
  });
}
// åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½• æ‰¹é‡åˆ é™¤
export function deleteTrainingAndAssessmentRecords(query) {
  return request({
    url: "/personTraining/deleteTrainingAndAssessmentRecords",
    method: "delete",
    params: query,
  });
}
//  åŸ¹è®­ä¸Žè€ƒæ ¸è®°å½• æäº¤
export function trainingAndAssessmentRecordsAdded(data) {
  return request({
    url: "/personTraining/trainingAndAssessmentRecordsAdded",
    method: "post",
    data: data,
  });
}
//查询部门
export function selectDepartLims(query) {
  return request({
    url: "/personTraining/selectDepartLims",
    method: "get",
    params: query,
  });
}
//  æ–°å¢žåŸ¹è®­è®¡åˆ’年度计划明细表
export function addOrUpdatePersonTrainingDetailed(data) {
  return request({
    url: "/personTraining/addOrUpdatePersonTrainingDetailed",
    method: "post",
    data: data,
  });
}
/**
 * @desc ç›‘督计划
 */
//年度计划列表
export function yearPlanList(query) {
  return request({
    url: "/superVisePlan/yearPlanList",
    method: "get",
    params: query,
  });
}
//年度计划明细
export function yearPlanDetailList(query) {
  return request({
    url: "/superVisePlan/yearPlanDetailList",
    method: "get",
    params: query,
  });
}
// åˆ é™¤å¹´è®¡åˆ’
export function yearPlanDel(query) {
  return request({
    url: "/superVisePlan/yearPlanDel",
    method: "delete",
    params: query,
  });
}
// åˆ é™¤å¹´è®¡åˆ’明细
export function yearPlanDetailDel(query) {
  return request({
    url: "/superVisePlan/yearPlanDetailDel",
    method: "delete",
    params: query,
  });
}
//  æ‰¹å‡†å¹´åº¦è®¡åˆ’
export function yearPlanDetailApproval(data) {
  return request({
    url: "/superVisePlan/yearPlanDetailApproval",
    method: "post",
    data: data,
  });
}
// äººå‘˜ ç›‘督计划导出
export function exportSuperVisePlan(query) {
  return request({
    url: "/superVisePlan/exportSuperVisePlan",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
//  ç›‘督计划导入年度计划
export function yearPlanDetailImport(data) {
  return request({
    url: "/superVisePlan/yearPlanDetailImport",
    method: "post",
    headers: {
      "Content-Type": "multipart/form-data;",
    },
    data: data,
  });
}
//  ç›‘督计划-新增年度计划
export function yearPlanDetailAdd(data) {
  return request({
    url: "/superVisePlan/yearPlanDetailAdd",
    method: "post",
    data: data,
  });
}
//  ç›‘督计划-编辑年度计划
export function yearPlanDetailEdit(data) {
  return request({
    url: "/superVisePlan/yearPlanDetailEdit",
    method: "post",
    data: data,
  });
}
/**
 * @desc ç›‘督记录
 */
//查询
export function personSupervisionRecordPage(query) {
  return request({
    url: "/personSupervisionRecord/personSupervisionRecordPage",
    method: "get",
    params: query,
  });
}
// åˆ é™¤ ç›‘督记录
export function deletePersonSupervisionRecord(query) {
  return request({
    url: "/personSupervisionRecord/deletePersonSupervisionRecord",
    method: "delete",
    params: query,
  });
}
// æŽ§åˆ¶å•导出
export function exportSupervisionControlSheet(query) {
  return request({
    url: "/personSupervisionRecord/exportSupervisionControlSheet",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// å¤„理单导出
export function exportSupervisionProcessingSheet(query) {
  return request({
    url: "/personSupervisionRecord/exportSupervisionProcessingSheet",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
// ç›‘督记录导出
export function exportPersonSupervisionRecord(query) {
  return request({
    url: "/personSupervisionRecord/exportPersonSupervisionRecord",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
//  æ–°å¢ž-编辑 ç›‘督记录
export function addOrUpdatePersonSupervisionRecord(data) {
  return request({
    url: "/personSupervisionRecord/addOrUpdatePersonSupervisionRecord",
    method: "post",
    data: data,
  });
}
//查询 æŽ§åˆ¶å•
export function personSupervisionControlSheetPage(query) {
  return request({
    url: "/personSupervisionRecord/personSupervisionControlSheetPage",
    method: "get",
    params: query,
  });
}
//  æ–°å¢ž-编辑 æŽ§åˆ¶å•
export function addOrUpdatePersonSupervisionControl(data) {
  return request({
    url: "/personSupervisionRecord/addOrUpdatePersonSupervisionControl",
    method: "post",
    data: data,
  });
}
//查询 å¤„理单
export function personSupervisionProcessingPage(query) {
  return request({
    url: "/personSupervisionRecord/personSupervisionProcessingPage",
    method: "get",
    params: query,
  });
}
//  æ–°å¢ž-编辑 å¤„理单
export function addOrUpdatePersonnelServiceProcessing(data) {
  return request({
    url: "/personSupervisionRecord/addOrUpdatePersonnelServiceProcessing",
    method: "post",
    data: data,
  });
}
/**
 * @desc å¥–惩记录
 */
//  å¥–惩记录 æ–°å¢ž/更新
export function addOrUpdateRewardPunishment(data) {
  return request({
    url: "/personRewardPunishmentRecord/addOrUpdateRewardPunishment",
    method: "post",
    data: data,
  });
}
// äººå‘˜ - å¥–惩记录 åˆ é™¤
export function deleteRewardPunishment(query) {
  return request({
    url: "/personRewardPunishmentRecord/deleteRewardPunishment",
    method: "delete",
    params: query,
  });
}
// äººå‘˜ - å¥–惩记录 åˆ†é¡µæŸ¥è¯¢
export function rewardPunishmentPage(query) {
  return request({
    url: "/personRewardPunishmentRecord/rewardPunishmentPage",
    method: "get",
    params: query,
  });
}
/**
 * @desc å·¥ä½œå±¥åކ
 */
// å¯¼å‡ºå·¥ä½œå±¥åކ
export function personTrackRecordExport(query) {
  return request({
    url: "/personTrackRecord/personTrackRecordExport",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
//  æ›´æ–°å·¥ä½œå±¥åކ
export function personTrackRecordUpdate(data) {
  return request({
    url: "/personTrackRecord/personTrackRecordUpdate",
    method: "post",
    data: data,
  });
}
//  æ–°å¢žå·¥ä½œå±¥åކ
export function personTrackRecordSave(data) {
  return request({
    url: "/personTrackRecord/personTrackRecordSave",
    method: "post",
    data: data,
  });
}
// åˆ é™¤å·¥ä½œå±¥åކ
export function personTrackRecordDelete(query) {
  return request({
    url: "/personTrackRecord/personTrackRecordDelete",
    method: "delete",
    params: query,
  });
}
//查询工作履历
export function personTrackRecordSelect(query) {
  return request({
    url: "/personTrackRecord/personTrackRecordSelect",
    method: "get",
    params: query,
  });
}
/**
 * @desc åŸ¹è®­è®°å½•
 */
// å¯¼å‡ºåŸ¹è®­è®°å½•
export function exportTrainingRecord(query) {
  return request({
    url: "/personTrainingRecord/exportTrainingRecord",
    method: "get",
    responseType: "blob",
    params: query,
  });
}
//查询人员 åŸ¹è®­è®°å½•
export function trainingSelectTrainingRecord(query) {
  return request({
    url: "/personTrainingRecord/trainingSelectTrainingRecord",
    method: "get",
    params: query,
  });
}
//查询人员明细 åŸ¹è®­è®°å½•
export function queryPersonnelDetails(query) {
  return request({
    url: "/personTrainingRecord/queryPersonnelDetails",
    method: "get",
    params: query,
  });
}
src/assets/images/renyuan-title.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<svg width="148" height="21" viewBox="0 0 148 21" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.00437 5.75531V0.0625L0.772461 5.75531H7.00437Z" fill="#B26F00"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M141.709 5.75531V0.0625L147.941 5.75531H141.709Z" fill="#B26F00"/>
<path d="M6.97192 2.0625C6.97192 0.957931 7.86735 0.0625 8.97192 0.0625H139.676C140.781 0.0625 141.676 0.957931 141.676 2.0625V12.0625C141.676 16.4808 138.095 20.0625 133.676 20.0625H14.9719C10.5537 20.0625 6.97192 16.4808 6.97192 12.0625V2.0625Z" fill="url(#paint0_linear_2026_4)"/>
<defs>
<linearGradient id="paint0_linear_2026_4" x1="6.97192" y1="0.0625" x2="6.97192" y2="20.0625" gradientUnits="userSpaceOnUse">
<stop stop-color="#F9C76F"/>
<stop offset="1" stop-color="#FEB42F"/>
</linearGradient>
</defs>
</svg>
src/components/Editor/index.vue
@@ -1,17 +1,8 @@
<template>
  <div>
    <el-upload
      :action="uploadUrl"
      :before-upload="handleBeforeUpload"
      :on-success="handleUploadSuccess"
      :on-error="handleUploadError"
      name="file"
      :show-file-list="false"
      :headers="headers"
      style="display: none"
      ref="upload"
      v-if="this.type == 'url'"
    >
    <el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess"
      :on-error="handleUploadError" name="file" :show-file-list="false" :headers="uploadHeader" style="display: none"
      ref="upload" v-if="this.type == 'url'">
    </el-upload>
    <div class="editor" ref="editor" :style="styles"></div>
  </div>
@@ -197,76 +188,95 @@
</script>
<style>
.editor, .ql-toolbar {
.editor,
.ql-toolbar {
  white-space: pre-wrap !important;
  line-height: normal !important;
}
.quill-img {
  display: none;
}
.ql-snow .ql-tooltip[data-mode="link"]::before {
  content: "请输入链接地址:";
}
.ql-snow .ql-tooltip.ql-editing a.ql-action::after {
  border-right: 0px;
  content: "保存";
  padding-right: 0px;
}
.ql-snow .ql-tooltip[data-mode="video"]::before {
  content: "请输入视频地址:";
}
.ql-snow .ql-picker.ql-size .ql-picker-label::before,
.ql-snow .ql-picker.ql-size .ql-picker-item::before {
  content: "14px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before {
  content: "10px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before {
  content: "18px";
}
.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before,
.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before {
  content: "32px";
}
.ql-snow .ql-picker.ql-header .ql-picker-label::before,
.ql-snow .ql-picker.ql-header .ql-picker-item::before {
  content: "文本";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before {
  content: "标题1";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before {
  content: "标题2";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before {
  content: "标题3";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before {
  content: "标题4";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before {
  content: "标题5";
}
.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before,
.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before {
  content: "标题6";
}
.ql-snow .ql-picker.ql-font .ql-picker-label::before,
.ql-snow .ql-picker.ql-font .ql-picker-item::before {
  content: "标准字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before {
  content: "衬线字体";
}
.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before,
.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before {
  content: "等宽字体";
src/components/FileUpload/index.vue
@@ -1,19 +1,8 @@
<template>
  <div class="upload-file">
    <el-upload
      multiple
      :action="uploadFileUrl"
      :before-upload="handleBeforeUpload"
      :file-list="fileList"
      :limit="limit"
      :on-error="handleUploadError"
      :on-exceed="handleExceed"
      :on-success="handleUploadSuccess"
      :show-file-list="false"
      :headers="headers"
      class="upload-file-uploader"
      ref="fileUpload"
    >
    <el-upload multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" :file-list="fileList" :limit="limit"
      :on-error="handleUploadError" :on-exceed="handleExceed" :on-success="handleUploadSuccess" :show-file-list="false"
      :headers="uploadHeader" class="upload-file-uploader" ref="fileUpload">
      <!-- ä¸Šä¼ æŒ‰é’® -->
      <el-button size="mini" type="primary">选取文件</el-button>
      <!-- ä¸Šä¼ æç¤º -->
@@ -203,18 +192,21 @@
.upload-file-uploader {
  margin-bottom: 5px;
}
.upload-file-list .el-upload-list__item {
  border: 1px solid #e4e7ed;
  line-height: 2;
  margin-bottom: 10px;
  position: relative;
}
.upload-file-list .ele-upload-list__item-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: inherit;
}
.ele-upload-list__item-content-action .el-link {
  margin-right: 10px;
}
src/components/ImageUpload/index.vue
@@ -1,22 +1,9 @@
<template>
  <div class="component-upload-image">
    <el-upload
      multiple
      :action="uploadImgUrl"
      list-type="picture-card"
      :on-success="handleUploadSuccess"
      :before-upload="handleBeforeUpload"
      :limit="limit"
      :on-error="handleUploadError"
      :on-exceed="handleExceed"
      ref="imageUpload"
      :on-remove="handleDelete"
      :show-file-list="true"
      :headers="headers"
      :file-list="fileList"
      :on-preview="handlePictureCardPreview"
      :class="{hide: this.fileList.length >= this.limit}"
    >
    <el-upload multiple :action="uploadImgUrl" list-type="picture-card" :on-success="handleUploadSuccess"
      :before-upload="handleBeforeUpload" :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed"
      ref="imageUpload" :on-remove="handleDelete" :show-file-list="true" :headers="uploadHeader" :file-list="fileList"
      :on-preview="handlePictureCardPreview" :class="{ hide: this.fileList.length >= this.limit }">
      <i class="el-icon-plus"></i>
    </el-upload>
@@ -28,16 +15,8 @@
      çš„æ–‡ä»¶
    </div>
    <el-dialog
      :visible.sync="dialogVisible"
      title="预览"
      width="800"
      append-to-body
    >
      <img
        :src="dialogImageUrl"
        style="display: block; max-width: 100%; margin: 0 auto"
      />
    <el-dialog :visible.sync="dialogVisible" title="预览" width="800" append-to-body>
      <img :src="dialogImageUrl" style="display: block; max-width: 100%; margin: 0 auto" />
    </el-dialog>
  </div>
</template>
@@ -56,7 +35,7 @@
    },
    // å¤§å°é™åˆ¶(MB)
    fileSize: {
       type: Number,
      type: Number,
      default: 5,
    },
    // æ–‡ä»¶ç±»åž‹, ä¾‹å¦‚['png', 'jpg', 'jpeg']
@@ -95,9 +74,9 @@
          this.fileList = list.map(item => {
            if (typeof item === "string") {
              if (item.indexOf(this.baseUrl) === -1 && !isExternal(item)) {
                  item = { name: this.baseUrl + item, url: this.baseUrl + item };
                item = { name: this.baseUrl + item, url: this.baseUrl + item };
              } else {
                  item = { name: item, url: item };
                item = { name: item, url: item };
              }
            }
            return item;
@@ -215,17 +194,18 @@
<style scoped lang="scss">
// .el-upload--picture-card æŽ§åˆ¶åŠ å·éƒ¨åˆ†
::v-deep.hide .el-upload--picture-card {
    display: none;
  display: none;
}
// åŽ»æŽ‰åŠ¨ç”»æ•ˆæžœ
::v-deep .el-list-enter-active,
::v-deep .el-list-leave-active {
    transition: all 0s;
  transition: all 0s;
}
::v-deep .el-list-enter, .el-list-leave-active {
::v-deep .el-list-enter,
.el-list-leave-active {
  opacity: 0;
  transform: translateY(0);
}
</style>
src/components/Table/value-table.vue
@@ -152,8 +152,8 @@
            <!-- å¯æ“ä½œè¡Œè¿›è¡Œç‚¹å‡»äº‹ä»¶ -->
            <span v-else-if="data.linkEvent && showLink(a.label, data.linkEvent)" style="color:#409EFF;cursor: pointer;"
              @click="handleLinkEvent(scope.row, data.linkEvent[a.label])">{{ scope.row[a.label] }}</span>
            <img v-else-if="showUpload(a.label) && scope.row[a.label]" :src="javaApi + '/img/' + scope.row[a.label]" alt=""
              style="width: 40px;height: 40px;margin-top: 10px;">
            <img v-else-if="showUpload(a.label) && scope.row[a.label]" :src="javaApi + '/img/' + scope.row[a.label]"
              alt="" style="width: 40px;height: 40px;margin-top: 10px;">
            <span v-else :class="{ red: getRedColor(a.label, scope.row) }">{{ scope.row[a.label] }}</span>
          </template>
        </el-table-column>
@@ -165,8 +165,9 @@
              <span v-if="a.type != 'upload'">{{ a.font }}</span>
              <el-upload v-else ref='upload' :accept='a.uploadConfig.accept'
                :action="javaApi + a.uploadConfig.url + '?id=' + (a.uploadConfig.uploadIdFun ? a.uploadConfig.uploadIdFun(scope.row) : scope.row.id)"
                :disabled="a.disabled ? a.disabled(scope.row, scope.$index) : false" :headers="token" :on-error="onError"
                :on-success="handleSuccessUp" :show-file-list="false" name="file" style="background: transparent;">
                :disabled="a.disabled ? a.disabled(scope.row, scope.$index) : false" :headers="uploadHeader"
                :on-error="onError" :on-success="handleSuccessUp" :show-file-list="false" name="file"
                style="background: transparent;">
                <span>{{ a.font }}</span>
              </el-upload>
            </el-button>
@@ -189,7 +190,8 @@
              <span v-if="showUpReq(a.label)" class="required-span">* </span>{{ a.value }}:
            </el-col>
            <el-col :span="16 / data.row">
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
              <el-input
                v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :disabled="isDisabled(a.label)" :placeholder="`请输入${a.value}`" clearable
                size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
@@ -201,8 +203,9 @@
                </el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                :action="javaApi + data.addUploadConfig.url" :headers="uploadHeader" :multiple="false"
                :on-error="onError" :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false"
                class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi + '/img/' + upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
@@ -221,7 +224,8 @@
              <span v-if="showUpReq(a.label)" class="required-span">* </span>{{ a.value }}:
            </el-col>
            <el-col :offset="1" :span="16">
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
              <el-input
                v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :disabled="isDisabled(a.label)" :placeholder="`请输入${a.value}`" clearable
                size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
@@ -231,8 +235,9 @@
                  :value="b.value"></el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                :action="javaApi + data.addUploadConfig.url" :headers="uploadHeader" :multiple="false"
                :on-error="onError" :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false"
                class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi + '/img/' + upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
@@ -260,7 +265,8 @@
                class="required-span">*
              </span>{{ a.value }}:</el-col>
            <el-col :span="16 / data.row">
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
              <el-input
                v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :placeholder="`请输入${a.value}`" clearable size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
                :multiple="data.selectField[a.label].choose" :placeholder="`请选择${a.value}`" clearable filterable
@@ -269,8 +275,9 @@
                  :value="b.value"></el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                :action="javaApi + data.addUploadConfig.url" :headers="uploadHeader" :multiple="false"
                :on-error="onError" :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false"
                class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi + '/img/' + upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
@@ -287,7 +294,8 @@
            <el-col :span="6" style="text-align: right;"><span v-if="showAddReq(a.label)" class="required-span">*
              </span>{{ a.value }}:</el-col>
            <el-col :offset="1" :span="16">
              <el-input v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
              <el-input
                v-if="showType(a.label, data.selectField) == null && !showUpload(a.label) && !showCascader(a.label)"
                v-model="upData[a.label]" :placeholder="`请输入${a.value}`" clearable size="small"></el-input>
              <el-select v-if="showType(a.label, data.selectField) != null" v-model="upData[a.label]"
                :multiple="data.selectField[a.label].choose" :placeholder="`请选择${a.value}`" clearable size="small"
@@ -296,8 +304,9 @@
                  :value="b.value"></el-option>
              </el-select>
              <el-upload v-if="showUpload(a.label)" ref='upload' :accept='data.addUploadConfig.accept'
                :action="javaApi + data.addUploadConfig.url" :headers="token" :multiple="false" :on-error="onError"
                :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false" class="avatar-uploader" name="file"
                :action="javaApi + data.addUploadConfig.url" :headers="uploadHeader" :multiple="false"
                :on-error="onError" :on-success="m => handleSuccessUp(m, a.label)" :show-file-list="false"
                class="avatar-uploader" name="file"
                style="background: transparent;width: 80px;height: 80px;border: 1px solid #DCDFE6;border-radius: 6px;margin: 10px 0;">
                <img v-if="upData[a.label]" :src="javaApi + '/img/' + upData[a.label]" class="avatar"
                  style="width: 80px;height: 80px;border-radius: 6px;">
@@ -328,8 +337,8 @@
    <el-dialog :visible.sync="uploadDia" title="数据导入" width="500px">
      <div style="margin: 0 auto;">
        <el-upload ref="upload" :accept="data.accept === undefined ? '.csv' : data.accept" :action="javaApi + inputUrl"
          :auto-upload="false" :data="{ param: data.uploadStr }" :file-list="fileList" :headers="token" :limit="1"
          :on-change="beforeUpload" :on-error="onError" :on-success="onSuccess" drag name="file">
          :auto-upload="false" :data="{ param: data.uploadStr }" :file-list="fileList" :headers="uploadHeader"
          :limit="1" :on-change="beforeUpload" :on-error="onError" :on-success="onSuccess" drag name="file">
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        </el-upload>
src/components/materialOrder/filesLookVisible.vue
@@ -3,26 +3,20 @@
    <el-dialog title="附件查看" :visible.sync="isShow" width="80%" @closed="$emit('closeFilesLook')">
      <div style="display: flex;justify-content: space-between;">
        <ul class="tab">
          <li v-for="(m,i) in dataVisibleTitle" :key="i" :class="{active:i===dataVisibleIndex}" @click="handleDataVisibleTab(m,i)">{{m.label}}</li>
          <li v-for="(m, i) in dataVisibleTitle" :key="i" :class="{ active: i === dataVisibleIndex }"
            @click="handleDataVisibleTab(m, i)">{{ m.label }}</li>
        </ul>
        <el-upload :action="action"
                   :auto-upload="true"
                   :data="{orderId: dataVisibleIndex === 0 ? filesLookInfo.enterOrderId : filesLookInfo.quarterOrderId}"
                   :on-success="handleSuccessUp" :show-file-list="false"
                   accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' :headers="headers"
                   :before-upload="beforeUpload"
                   style="width: 80px !important;"
                   :on-error="onError" ref='upload'>
        <el-upload :action="action" :auto-upload="true"
          :data="{ orderId: dataVisibleIndex === 0 ? filesLookInfo.enterOrderId : filesLookInfo.quarterOrderId }"
          :on-success="handleSuccessUp" :show-file-list="false"
          accept='.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar' :headers="uploadHeader"
          :before-upload="beforeUpload" style="width: 80px !important;" :on-error="onError" ref='upload'>
          <el-button size="small" type="primary" style="height: 38px">附件上传</el-button>
        </el-upload>
      </div>
      <div style="height: 70vh;overflow-y: auto;" v-if="filesDialogVisible">
        <ValueTable ref="fileList"
                    :url="$api.insOrderPlan.getFileList"
                    :delUrl="$api.insOrderPlan.delfile"
                    class="value-table"
                    :key="upIndex"
                    :componentData="componentData"/>
        <ValueTable ref="fileList" :url="$api.insOrderPlan.getFileList" :delUrl="$api.insOrderPlan.delfile"
          class="value-table" :key="upIndex" :componentData="componentData" />
      </div>
    </el-dialog>
  </div>
@@ -35,7 +29,7 @@
export default {
  name: "filesLookVisible",
  // import å¼•入的组件需要注入到对象中才能使用
  components: {ValueTable},
  components: { ValueTable },
  props: {
    filesDialogVisible: {
      type: Boolean,
@@ -43,7 +37,7 @@
    },
    filesLookInfo: {
      type: Object,
      default: () => {}
      default: () => { }
    },
  },
  data() {
@@ -64,20 +58,20 @@
      dataVisibleIndex: 0, // tab栏选择值
      componentData: {
        entity: {
          insOrderId:''
          insOrderId: ''
        },
        isIndex: true,
        showSelect: false,
        select: false,
        sort: false,
        init:false,
        init: false,
        do: [
          {
            id: 'parent',
            font: '下载',
            type: 'text',
            method: 'handleDown'
          },{
          }, {
            id: 'delete',
            font: '删除',
            type: 'text',
@@ -87,8 +81,8 @@
        isPage: false,
        linkEvent: {},
        tagField: {
          type:{
            select:[
          type: {
            select: [
              {
                value: 1,
                label: '图片'
@@ -114,7 +108,7 @@
  // æ–¹æ³•集合
  methods: {
    // åˆ‡æ¢æ•°æ®æŸ¥çœ‹tab栏
    handleDataVisibleTab (m, i) {
    handleDataVisibleTab(m, i) {
      this.dataVisibleIndex = i
      this.refreshTable()
    },
@@ -129,17 +123,17 @@
        this.$refs['fileList'].selectList(e)
      })
    },
    handleDown(row){
    handleDown(row) {
      this.$axios.post(this.$api.insOrderPlan.downFile, {
        id: row.id,
      }).then(res => {
        if (res.code === 200) {
          let url = '';
          if(res.data.type==1){
            url = this.javaApi+'/img/'+res.data.fileUrl
            file.downloadIamge(url,row.fileName)
          }else{
            url = this.javaApi+'/word/'+res.data.fileUrl
          if (res.data.type == 1) {
            url = this.javaApi + '/img/' + res.data.fileUrl
            file.downloadIamge(url, row.fileName)
          } else {
            url = this.javaApi + '/word/' + res.data.fileUrl
            const link = document.createElement('a');
            link.href = url;
            link.download = row.fileName;
@@ -150,7 +144,7 @@
      })
    },
    handleSuccessUp(response, ) {
    handleSuccessUp(response,) {
      this.upLoading = false;
      if (response.code == 200) {
        this.$message.success('上传成功');
src/views/CNAS/personnel/personalOverview/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,242 @@
<style scoped>
.search {
  background-color: #fff;
  height: 80px;
  display: flex;
  align-items: center;
}
.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);
}
.table {
  margin-top: 10px;
  background-color: #fff;
  width: calc(100% - 40px);
  height: calc(100% - 60px - 80px - 10px - 40px);
  padding: 20px;
  overflow-y: auto;
}
.card {
  list-style-type: none;
  display: grid;
  grid-template-columns: repeat(auto-fit, 320px);
  /* justify-content: center; */
  grid-gap: 16px;
  min-height: 200px;
}
.card li {
  width: 320px;
  border-radius: 8px 8px 8px 8px;
  box-shadow: 4px 4px 8px 0px rgba(51, 51, 51, 0.04);
  border: 1px solid #EEEEEE;
  margin: 0 !important;
  display: flex;
  align-items: center;
  justify-content: space-between;
  box-sizing: border-box;
  padding: 26px 16px 16px;
  font-size: 14px;
  position: relative;
  overflow: show;
}
li .title {
  width: 147px;
  height: 20px;
  background: url(../../../../assets/images/renyuan-title.svg) no-repeat;
  position: absolute;
  top: -6px;
  left: 50%;
  transform: translateX(-50%);
  text-align: center;
  line-height: 20px;
  color: #fff;
}
</style>
<template>
  <div class="role_manage">
    <div class="search">
      <div class="search_thing">
        <div class="search_label">人员名称:</div>
        <div class="search_input"><el-input size="small" placeholder="请输入" clearable v-model="entity.name"></el-input>
        </div>
      </div>
      <div class="search_thing" style="padding-left: 30px;">
        <el-button size="small" @click="refresh()">重 ç½®</el-button>
        <el-button size="small" type="primary"
          @click="currentPage = 1, list = [], finishLoding = false, keyMap = {}, refreshTable()">查 è¯¢</el-button>
      </div>
    </div>
    <div class="table" v-loading="loading">
      <scroll-pagination @load="refreshTable" :finishLoding="finishLoding" :list="list"
        v-if="list.length > 0 || loading">
        <ul class="card" style="margin-top: 10px;">
          <li v-for="(m, i) in list" :key="i">
            <el-image style="width: 80px;
            height: 112px;" :src="javaApi + '/img/' + m.pictureUrl">
              <div slot="error" class="image-error" style="width: 79px;
            height: 110px;
            display: flex;
            align-items: center;
            justify-content: center;
            border: 1px solid #EEEEEE;">
                <i class="el-icon-picture-outline" style="font-size:30px;color:#666666;"></i>
              </div>
            </el-image>
            <el-image style="width: 195px;
            height: 112px;" :src="javaApi + '/img/' + m.signatureUrl">
              <div slot="error" class="image-error" style="width: 194px;
            height: 110px;
            display: flex;
            align-items: center;
            justify-content: center;
            border: 1px solid #EEEEEE;">
                <i class="el-icon-picture-outline" style="font-size:30px;color:#666666;"></i>
              </div>
            </el-image>
            <div class="title">{{ m.name }}</div>
          </li>
        </ul>
      </scroll-pagination>
      <div v-if="list.length < 1 && !loading" style="color:#909399;font-size:14px;text-align: center;margin-top:200px">
        æš‚无数据
      </div>
    </div>
  </div>
</template>
<script>
import ScrollPagination from '@/components/index/scroll-paging.vue'
import {
  selectPersonnelOverview
} from '@/api/cnas/personnel/personalOverview'
export default {
  components: {
    ScrollPagination
  },
  data() {
    return {
      entity: {
        name: null,
        state: 1,
        orderBy: { field: "id", order: "asc" }
      },
      list: [],
      currentPage: 1, // å½“前页
      pageSize: 16, // ä¸€é¡µ16条
      total: '',
      loading: true, // ç»„ä»¶loading的展示,默认为true
      finishLoding: false, // åŠ è½½å®Œæˆï¼Œæ˜¾ç¤ºå·²ç»æ²¡æœ‰æ›´å¤šäº†
      keyMap: {}
    }
  },
  created() {
    this.keyMap = {};
    this.currentPage = 1;
    this.list = [];
    this.refreshTable();
  },
  methods: {
    refreshTable() {
      const key = `_${this.currentPage}`
      const value = this.keyMap[key]
      // å¦‚æžœvalue存在,表示缓存有值,那么阻止请求
      if (value) {
        return
      }
      // value不存在,表示第一次请求,设置占位
      this.keyMap[key] = 'temp'
      if (this.currentPage == 1) {
        this.loading = true
      }
      selectPersonnelOverview({
        current: this.currentPage,
        size: this.pageSize,
        ...this.entity
      }).then(res => {
        if (res.code == 200) {
          this.total = res.data.body.total
          let list = res.data.body.records;
          if (list.length == 0) {
            this.finishLoding = true;
          } else {
            if (list.length < this.pageSize) {
              this.finishLoding = true;
            }
            this.list = this.list.concat(list)
            if (this.total == this.list.length) {
              this.finishLoding = true;
            }
            this.currentPage++;
          }
        }
        this.loading = false
      })
    },
    refresh() {
      this.keyMap = {};
      this.currentPage = 1;
      this.list = [];
      this.finishLoding = false;
      this.entity = {
        name: null,
        state: 1,
        orderBy: { field: "id", order: "asc" }
      };
      this.refreshTable()
    },
    // æ»šåŠ¨è§¦åº•åŠ è½½
    scrollFn() {
      let clientHeight = document.documentElement.clientHeight - 18; //可视区域
      let scrollHeight = document.body.scrollHeight; // æ»šåŠ¨æ–‡æ¡£é«˜åº¦
      let scrollTop = parseInt(document.documentElement.scrollTop); // å·²æ»šåŠ¨çš„é«˜åº¦
      let height = 300;
      if (
        scrollTop + clientHeight >= scrollHeight - height &&
        scrollHeight != 0
      ) {
        if (!this.finishLoding && this.currentPage * this.pageSize < this.total) {
          this.currentPage = this.currentPage + 1;
          this.refreshTable();
        }
      } else {
        return false;
      }
    },
    throttle(fn, wait) {
      // å°è£…函数进行节流
      var timer = null;
      return function () {
        var context = this;
        var args = arguments;
        if (!timer) {
          timer = setTimeout(function () {
            fn.apply(context, args);
            timer = null;
          }, wait);
        }
      };
    },
  },
  destroyed() {
    window.removeEventListener("scroll", this.throttle(), false);
  },
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Communicate/Add.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
<template>
    <div class="add">
        <el-dialog :title="isEdit ? '编辑附件资料' : '新增附件资料'" :visible.sync="dialogVisible" width="40%">
            <el-form :model="form" label-width="80px" size="small">
                <el-form-item label="沟通人">
                    <el-select v-model="form.userId" placeholder="请选择" style="width: 100%" multiple>
                        <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                            :value="item.id"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="沟通时间">
                    <el-date-picker v-model="form.communicationTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="请选择日期时间" style="width: 100%">
                    </el-date-picker>
                </el-form-item>
                <el-form-item label="沟通地点">
                    <el-input v-model="form.communicationPlace" placeholder="请选择"></el-input>
                </el-form-item>
                <el-form-item label="沟通内容">
                    <el-input v-model="form.communicationContent" placeholder="请选择"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="foot">
                <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
                <el-button type="primary" :loading="loading" @click="submitForm">ç¡® å®š</el-button>
            </div>
        </el-dialog>
    </div>
</template>
<script>
import {
    selectUserList,
    addOrUpdatePersonCommunicationAbility
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    data() {
        return {
            isEdit: false,
            dialogVisible: false,
            form: {
                id: undefined,
                userId: [],
                communicationTime: undefined,
                communicationPlace: undefined,
                communicationContent: undefined
            },
            loading: false,
            userList: []
        }
    },
    methods: {
        /**
         * @desc æ˜¾ç¤ºæ¨¡æ€æ¡†
         * @param {*} row
         * @param {*} type
         */
        openDialog(row, type) {
            this.getUserList()
            this.dialogVisible = true
            if (type) {
                this.isEdit = true
                this.form.id = row.id
                this.form.userId = row.userId.split(',').map(m => Number(m))
                this.form.communicationTime = row.communicationTime
                this.form.communicationPlace = row.communicationPlace
                this.form.communicationContent = row.communicationContent
            } else {
                this.isEdit = false
                this.form.id = undefined
                this.form.userId = []
                this.form.communicationTime = undefined
                this.form.communicationPlace = undefined
                this.form.communicationContent = undefined
            }
        },
        /**
         * @desc èŽ·å–ç”¨æˆ·ä¿¡æ¯
         */
        async getUserList() {
            const { code, data } = await selectUserList()
            if (code == 200) {
                this.userList = data
            }
        },
        /**
         * @desc æäº¤è¡¨å•
         */
        async submitForm() {
            this.loading = true
            const { code, data } = await addOrUpdatePersonCommunicationAbility({
                id: this.form.id,
                userId: this.form.userId.join(','),
                communicationTime: this.form.communicationTime,
                communicationPlace: this.form.communicationPlace,
                communicationContent: this.form.communicationContent,
            })
            if (code == 200) {
                this.$emit('submit')
                this.dialogVisible = false
            } else {
                this.$message.error(this.isEdit ? '编辑失败' : '新增失败')
            }
            this.loading = false
        }
    }
}
</script>
<style scoped>
.foot {
    width: 100%;
}
.add>>>.el-dialog__footer {
    padding-right: 20px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Communicate/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,213 @@
<template>
    <div class="flex_column">
        <TableCard :showForm="isDepartment" title="沟通记录">
            <template v-slot:form>
                <div v-if="isDepartment" class="w100 items_center justify_between">
                    <div></div>
                    <div>
                        <el-button size="small" type="primary" @click="openDialog">新增</el-button>
                    </div>
                </div>
            </template>
            <template v-slot:table>
                <limsTable :column="columnData" :height="'calc(100vh - 21em)'" :table-data="tableData"
                    :table-loading="loading" style="margin-top: 18px; padding: 0 15px;" :page="page"
                    @pagination="pagination"></limsTable>
            </template>
        </TableCard>
        <Add ref="communicateModal" @submit="getTableData"></Add>
    </div>
</template>
<script>
import TableCard from '@/components/TableCard/index.vue';
import limsTable from "@/components/Table/lims-table.vue";
import Add from "./Add.vue"
import {
    personPersonCommunicationAbilityPage,
    deletePersonCommunicationAbility,
    exportPersonCommunicationAbility
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    components: {
        TableCard,
        limsTable,
        Add
    },
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isDepartment: {
            type: Boolean,
            default: false
        }
    },
    data() {
        return {
            // departId: 0,
            columnData: [
                {
                    label: '序号',
                    prop: 'id'
                }, {
                    label: '沟通人',
                    prop: 'userName'
                }, {
                    label: '沟通时间',
                    prop: 'communicationTime'
                }, {
                    label: '沟通地点',
                    prop: 'communicationPlace'
                }, {
                    label: '沟通内容',
                    prop: 'communicationContent'
                }, {
                    label: '操作',
                    dataType: 'action',
                    operation: [
                        {
                            name: '编辑',
                            type: 'text',
                            clickFun: (row) => {
                                this.openDialog(row, true)
                            }
                        }, {
                            name: '导出',
                            type: 'text',
                            clickFun: (row) => {
                                this.handleDown(row)
                            }
                        }, {
                            name: '删除',
                            type: 'text',
                            color: '#f56c6c',
                            clickFun: (row) => {
                                this.delPerson(row.id)
                            }
                        }
                    ]
                },
            ],
            tableData: [],
            page: {
                current: 1,
                pageSize: 20,
                total: 0
            },
            loading: false
        }
    },
    mounted() {
        this.getTableData()
    },
    methods: {
        openDialog(row, type = false) {
            this.$refs.communicateModal.openDialog(row, type)
        },
        async getTableData() {
            this.loading = true
            const params = this.isDepartment ? {
                departLimsId: this.departId,
                current: this.page.current,
                size: this.page.pageSize
            } : {
                userId: this.departId,
                current: this.page.current,
                size: this.page.pageSize
            }
            const { code, data } = await personPersonCommunicationAbilityPage(params)
            if (code == 200) {
                this.page.total = data.total
                this.tableData = data.records
                this.loading = false
            }
        },
        pagination({ page, limit }) {
            this.page.current = page;
            this.page.size = limit;
            this.getTableData();
        },
        /**
         * @desc èŽ·å–è®¾å¤‡id
         */
        getDepart(id) {
            this.departId = id
            this.getTableData()
        },
        /**
         * @desc åˆ é™¤æ²Ÿé€šè®°å½•
         */
        delPerson(id) {
            this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(async () => {
                let formData = new FormData()
                formData.append('id', id)
                const { code } = await deletePersonCommunicationAbility(formData)
                if (code == 200) {
                    this.$message({
                        type: 'success',
                        message: '删除成功!'
                    });
                    this.getTableData()
                }
            })
        },
        async handleDown(row) {
            exportPersonCommunicationAbility({ id: row.id }).then(res => {
                if (res.code == 201) {
                    this.$message.error(res.message)
                    return
                }
                const blob = new Blob([res], { type: 'application/octet-stream' });
                this.$download.saveAs(blob, row.userName + '-沟通记录' + '.docx')
            })
        }
    },
    watch: {
        departId: {
            handler(newId, oldId) {
                if (newId) {
                    this.getTableData();
                }
            }
        }
    }
}
</script>
<style scoped>
.flex_column {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}
.w100 {
    width: 100%;
}
.items_center {
    display: flex;
    align-items: center;
}
.justify_between {
    justify-content: space-between
}
.date_box {
    margin: 0 5px;
}
.search {
    width: 150px;
    padding: 0 16px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/JobResponsibilities/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,364 @@
<!-- å²—位职责 -->
<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 '@/utils/date';
import {
  selectUserList,
  personJobResponsibilitiesSelect,
  personJobResponsibilitiesSave,
  exportPersonJobResponsibilities,
  personJobResponsibilitiesDelete,
} from '@/api/cnas/personnel/personnelInfo.js'
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';
      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];
          personJobResponsibilitiesSave(this.form).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) {
      exportPersonJobResponsibilities({ id: row.id }).then(res => {
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, row.incumbentName + '-岗位职责' + '.docx')
      })
    },
    // åˆ é™¤å²—位职责
    deletePost(row) {
      this.$confirm('此操作将永久删除此数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        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() {
      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>
src/views/CNAS/personnel/personnelInfo/Department/components/Mandate/Add.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,198 @@
<template>
    <div class="add">
        <el-dialog :title="isEdit ? '编辑附件资料' : '新增附件资料'" :visible.sync="dialogVisible" width="50%">
            <el-form ref="ruleForm" :rules="rules" :model="form" label-width="100px" size="medium">
                <el-form-item label="证书编号" prop="certificateNumber">
                    <el-input v-model="form.certificateNumber" placeholder="请输入" style="width: 100%">
                    </el-input>
                </el-form-item>
                <el-form-item label="被任职人员" prop="userId">
                    <el-select v-model="form.userId" placeholder="请选择">
                        <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                            :value="item.id"></el-option>
                    </el-select>
                </el-form-item>
                <el-form-item label="任职岗位" prop="post">
                    <el-input v-model="form.post" placeholder="请输入"></el-input>
                </el-form-item>
                <el-form-item label="理论考试成绩" prop="num1">
                    <el-input v-model="form.num1" placeholder="请输入"></el-input>
                </el-form-item>
                <el-form-item label="操作技能考试成绩" prop="num2">
                    <el-input v-model="form.num2" placeholder="请输入"></el-input>
                </el-form-item>
                <el-form-item label="操作类型" prop="operationType">
                    <el-input v-model="form.operationType" placeholder="请选择"></el-input>
                </el-form-item>
                <el-row>
                    <el-col :span="20">
                        <el-form-item label="上岗证书">
                            <el-input v-model="form.systemFileName" size="small" disabled>
                                <el-button slot="append" icon="el-icon-delete-solid"
                                    @click="deleteFile(form.systemFileName)"></el-button>
                            </el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="4">
                        <el-upload ref="upload" style="float: left; margin: 0 12px 0 20px;" :action="action"
                            :show-file-list="false" :on-success="onSuccess" :headers="uploadHeader">
                            <el-button class="uploadFile" slot="trigger" size="small" type="primary">浏览</el-button>
                        </el-upload>
                    </el-col>
                </el-row>
                <el-form-item label="备注">
                    <el-input v-model="form.remarks" placeholder="请选择"></el-input>
                </el-form-item>
            </el-form>
            <div slot="footer" class="foot">
                <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
                <el-button type="primary" :loading="loading" @click="submitForm">ç¡® å®š</el-button>
            </div>
        </el-dialog>
    </div>
</template>
<script>
import {
    addOrUpdatePersonPostAuthorizationRecord,
    selectUserList,
    deleteCNASFile
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    data() {
        return {
            isEdit: false,
            dialogVisible: false,
            form: {
                id: undefined,
                certificateNumber: undefined,
                userId: undefined,
                post: undefined,
                operationType: undefined,
                fileList: [],
                fileName: undefined,
                systemFileName: undefined,
                remarks: undefined,
                num2: undefined,
                num1: undefined
            },
            rules: {
                certificateNumber: [{ required: true, message: '请输入证书编号', trigger: 'blur' }],
                userId: [{ required: true, message: '请选择被任职人员', trigger: 'change' }],
                post: [{ required: true, message: '任职岗位', trigger: 'blur' }],
                operationType: [{ required: true, message: '操作类型', trigger: 'blur' }],
            },
            loading: false,
            userList: []
        }
    },
    mounted() {
    },
    computed: {
        action() {
            return this.javaApi + '/personBasicInfo/saveCNASFile'
        }
    },
    methods: {
        async onSuccess(response, file, fileList) {
            this.$set(this.form, "systemFileName", response.data)
        },
        deleteFile(fileName) {
            deleteCNASFile({ fileName }).then(res => {
                this.$message.success('删除成功!')
                this.$set(this.form, "systemFileName", null)
            })
        },
        async openDialog(row, type) {
            await this.getUserList()
            this.dialogVisible = true
            if (type) {
                this.isEdit = true
                this.form.id = row.id
                this.form.certificateNumber = row.certificateNumber
                this.form.userId = Number(row.userId)
                this.form.post = row.post
                this.form.operationType = row.operationType
                this.form.systemFileName = row.systemFileName
                this.form.remarks = row.remarks
                this.form.num1 = row.num1
                this.form.num2 = row.num2
            } else {
                this.isEdit = false
                this.form.id = undefined
                this.form.certificateNumber = undefined
                this.form.userId = undefined
                this.form.post = undefined
                this.form.operationType = undefined
                this.form.fileList = []
                this.form.fileName = undefined
                this.form.systemFileName = undefined
                this.form.remarks = undefined
                this.form.num1 = undefined
                this.form.num2 = undefined
            }
        },
        closeDialog() {
            this.dialogVisible = false
        },
        /**
         * @desc èŽ·å–ç”¨æˆ·ä¿¡æ¯
         */
        async getUserList() {
            const { code, data } = await selectUserList()
            if (code == 200) {
                this.userList = data
            }
        },
        /**
         * @desc æäº¤è¡¨å•
         */
        submitForm() {
            this.$refs.ruleForm.validate(async (valid) => {
                if (valid) {
                    await this.submitFormData()
                }
            })
        },
        /**
         * @desc ä¸Šä¼ æ–‡ä»¶
         */
        beforeUpload(file) {
            this.form.fileList = [file]
            this.form.fileName = file.name
        },
        /**
         * @desc æäº¤form表单
         */
        async submitFormData() {
            this.loading = true
            const { code, data } = await addOrUpdatePersonPostAuthorizationRecord({
                id: this.form.id,
                certificateNumber: this.form.certificateNumber,
                userId: this.form.userId,
                post: this.form.post,
                operationType: this.form.operationType,
                systemFileName: this.form.systemFileName,
                remarks: this.form.remarks,
                num1: this.form.num1,
                num2: this.form.num2
            })
            if (code == 200) {
                this.closeDialog()
                this.$emit('refresh')
            }
            this.loading = false
        }
    }
}
</script>
<style scoped>
.foot {
    width: 100%;
}
.add>>>.el-dialog__footer {
    padding-right: 20px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Mandate/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,228 @@
<template>
    <div class="flex_column">
        <TableCard :showForm="isDepartment" title="任职授权记录">
            <template v-slot:form>
                <div v-if="isDepartment" class="w100 items_center justify_between">
                    <div></div>
                    <div>
                        <el-button size="small" type="primary" @click="openDialog">新增</el-button>
                    </div>
                </div>
            </template>
            <template v-slot:table>
                <limsTable :column="columnData" :height="'calc(100vh - 21em)'" :table-data="tableData"
                    :table-loading="loading" style="margin-top: 18px; padding: 0 15px;" :page="page"
                    @pagination="pagination"></limsTable>
            </template>
        </TableCard>
        <Add ref="mandateModal" @refresh="getTableData"></Add>
    </div>
</template>
<script>
import TableCard from "@/components/TableCard/index.vue";
import limsTable from "@/components/Table/lims-table.vue";
import Add from "./Add.vue"
import {
    PersonPostAuthorizationRecordPage,
    deletePersonPostAuthorizationRecord,
    exportPersonPostAuthorizationRecord
} from '@/api/cnas/personnel/personnelInfo.js'
import { nextTick } from "vue";
export default {
    components: {
        TableCard,
        limsTable,
        Add
    },
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isDepartment: {
            type: Boolean,
            default: false
        }
    },
    data() {
        return {
            // departId: 0,
            columnData: [
                {
                    label: '序号',
                    prop: 'id'
                }, {
                    label: '证书编号',
                    prop: 'certificateNumber'
                }, {
                    label: '被任职人员',
                    prop: 'userName'
                }, {
                    label: '任职岗位',
                    prop: 'post'
                }, {
                    label: '理论考试成绩',
                    prop: 'num1'
                }, {
                    label: '操作技能考试成绩',
                    prop: 'num2'
                }, {
                    label: '操作时间',
                    prop: 'updateTime'
                }, {
                    label: '备注',
                    prop: 'remarks',
                    width: 300
                }, {
                    label: '操作',
                    dataType: 'action',
                    width: 160,
                    operation: [
                        {
                            name: '编辑',
                            type: 'text',
                            clickFun: (row) => {
                                this.openDialog(row, true)
                            }
                        }, {
                            name: '下载',
                            type: 'text',
                            clickFun: (row) => {
                                this.handleDown(row)
                            }
                        }, {
                            name: '删除',
                            type: 'text',
                            color: '#f56c6c',
                            clickFun: (row) => {
                                this.deleteNotify(row.id)
                            }
                        }
                    ]
                },
            ],
            tableData: [],
            page: {
                current: 1,
                pageSize: 20,
                total: 0
            },
            loading: false
        }
    },
    mounted() {
        this.getTableData()
        console.log(this.departId)
    },
    methods: {
        openDialog(row, type = false) {
            this.$refs.mandateModal.openDialog(row, type)
        },
        /**
         * @desc æŸ¥è¯¢è¡¨æ ¼æ•°æ®
         */
        async getTableData() {
            this.loading = true
            await nextTick()
            const params = this.isDepartment ? {
                departLimsId: this.departId,
                current: this.page.current,
                size: this.page.pageSize
            } : {
                userId: this.departId,
                current: this.page.current,
                size: this.page.pageSize
            }
            const { code, data } = await PersonPostAuthorizationRecordPage(params)
            if (code == 200) {
                this.page.total = data.total
                this.tableData = data.records
                this.loading = false
            }
        },
        /**
         * @desc åˆ†é¡µ
         */
        pagination({ page, limit }) {
            this.page.current = page;
            this.page.size = limit;
            this.getTableData();
        },
        /**
         * @desc åˆ é™¤ä»»èŒè®°å½•
         */
        deleteNotify(id) {
            this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(() => {
                this.delMandate(id)
            })
        },
        /**
         * @desc api删除
         */
        async delMandate(id) {
            const formData = new FormData()
            formData.append('id', id)
            const { code, data } = await deletePersonPostAuthorizationRecord(formData)
            if (code == 200) {
                this.$message({ message: '删除成功', type: 'success' })
                this.getTableData()
            } else {
                this.$message({ message: '删除失败', type: 'error' })
            }
        },
        /**
         * @desc èŽ·å–è®¾å¤‡id
         */
        getDepart(id) {
            this.departId = id
            this.getTableData()
        },
        handleDown(row) {
            exportPersonPostAuthorizationRecord({ id: row.id }).then(res => {
                if (res.code == 201) {
                    this.$message.error(res.message)
                    return
                }
                const blob = new Blob([res], { type: 'application/octet-stream' });
                this.$download.saveAs(blob, '任职授权-' + row.certificateNumber + '-' + row.post + '.docx')
            })
        }
    },
    //   watch: {
    //     departId: {
    //       handler(newId, oldId) {
    //         if (newId) {
    //           this.getTableData();
    //         }
    //       }
    //     }
    //   }
}
</script>
<style scoped>
.flex_column {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}
.w100 {
    width: 100%;
}
.items_center {
    display: flex;
    align-items: center;
}
.justify_between {
    justify-content: space-between
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelCapacity/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,567 @@
<!-- äººå‘˜èƒ½åŠ› -->
<template>
  <div>
    <div style="text-align: left; margin-bottom: 15px;padding: 0 16px">
      <label>姓名</label>
      <el-input v-model="userName" placeholder="请输入姓名" size="small" style="width: 20vh;"></el-input>
      <el-button size="small" type="primary" @click="refreshTable">查询</el-button>
      <div v-if="isDepartment" style="float: right;">
        <el-button size="small" type="primary" @click="addAppointPost('add')">新增</el-button>
      </div>
    </div>
    <div class="table">
      <TableCard :showForm="false" :showTitle="false">
        <template v-slot:table>
          <limsTable :column="yearColumnData" :height="'calc(100vh - 20em)'" :table-data="tableData"
            :table-loading="yearLoading" style="padding: 0 15px;margin-bottom: 16px" :page="search"
            @pagination="pagination">
            <div slot="jobResponsibilities" slot-scope="scope">
              <div v-html="changeLine(scope.row.responsibilities)"></div>
            </div>
            <div slot="placeWorkSlot" slot-scope="scope">
              <div v-html="changeLine(scope.row.placeWork)"></div>
            </div>
          </limsTable>
        </template>
      </TableCard>
    </div>
    <!--新增能力认定弹框-->
    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :title="title" :visible.sync="dialogVisible"
      width="80%" @close="resetForm">
      <el-form v-if="dialogVisible" ref="infoForm" :model="form" :rules="rules">
        <el-col :span="12">
          <el-form-item label="人员:" label-width="110px" prop="userId">
            <el-select v-model="form.userId" :disabled="operationType === 'view'" clearable filterable placeholder="请选择"
              size="small" style="width: 100%;">
              <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.id">
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="职称:" label-width="110px" prop="technicalPost">
            <el-input v-model="form.technicalPost" :disabled="operationType === 'view'" clearable size="small"
              style="width: 100%;" />
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <div style="display: flex;justify-content: space-evenly;font-weight: 600">
            <span>查核结果</span>
            <span>符合与否</span>
            <span>备注</span>
          </div>
        </el-col>
        <el-col :span="8">
          <el-form-item label="学历:" label-width="110px" prop="academicDegree">
            <el-input v-model="form.academicDegree" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item class="radio-group" prop="academicConformNot" style="text-align: center">
            <el-radio-group v-model="form.academicConformNot" :disabled="operationType === 'view'">
              <el-radio :label="1">符合</el-radio>
              <el-radio :label="2">不符合</el-radio>
              <el-radio :label="3">不适用</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item prop="academicRemarks">
            <el-input v-model="form.academicRemarks" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="相关年限:" label-width="110px" prop="relatedYears">
            <el-input v-model="form.relatedYears" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item class="radio-group" prop="relatedYearsConformNot" style="text-align: center">
            <el-radio-group v-model="form.relatedYearsConformNot" :disabled="operationType === 'view'">
              <el-radio :label="1">符合</el-radio>
              <el-radio :label="2">不符合</el-radio>
              <el-radio :label="3">不适用</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item prop="relatedYearsRemarks    ">
            <el-input v-model="form.relatedYearsRemarks" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="相关培训:" label-width="110px" prop="relatedTraining">
            <el-input v-model="form.relatedTraining" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item class="radio-group" prop="relatedTrainingConformNot" style="text-align: center">
            <el-radio-group v-model="form.relatedTrainingConformNot" :disabled="operationType === 'view'">
              <el-radio :label="1">符合</el-radio>
              <el-radio :label="2">不符合</el-radio>
              <el-radio :label="3">不适用</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item prop="relatedTrainingRemarks">
            <el-input v-model="form.relatedTrainingRemarks" :disabled="operationType === 'view'"
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="相关经验:" label-width="110px" prop="relevantExperience">
            <el-input v-model="form.relevantExperience" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item class="radio-group" prop="relevantExperienceConformNot" style="text-align: center">
            <el-radio-group v-model="form.relevantExperienceConformNot" :disabled="operationType === 'view'">
              <el-radio :label="1">符合</el-radio>
              <el-radio :label="2">不符合</el-radio>
              <el-radio :label="3">不适用</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item prop="relevantExperienceRemarks">
            <el-input v-model="form.relevantExperienceRemarks" :disabled="operationType === 'view'"
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="上岗证:" label-width="110px" prop="workLicense">
            <el-input v-model="form.workLicense" :disabled="operationType === 'view'" size="small" style="width: 100%">
            </el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item class="radio-group" prop="workLicenseConformNot" style="text-align: center">
            <el-radio-group v-model="form.workLicenseConformNot" :disabled="operationType === 'view'">
              <el-radio :label="1">符合</el-radio>
              <el-radio :label="2">不符合</el-radio>
              <el-radio :label="3">不适用</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item prop="workLicenseRemarks">
            <el-input v-model="form.workLicenseRemarks" :disabled="operationType === 'view'" size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item label="岗位职责:" label-width="110px" prop="jobResponsibilitiesTem" style="height: 450px">
            <el-checkbox-group v-model="form.jobResponsibilitiesTem" :disabled="operationType === 'view'"
              @change="selectResponsibilities">
              <el-checkbox v-for="city in responsibilities" :key="city.value" :label="city.label"
                :value="city.value"></el-checkbox>
            </el-checkbox-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item class="radio-group" prop="jobResponsibilitiesConformNot"
            style="text-align: center;height: 420px">
            <el-radio-group v-model="form.jobResponsibilitiesConformNot" :disabled="operationType === 'view'">
              <el-radio :label="1">符合</el-radio>
              <el-radio :label="2">不符合</el-radio>
              <el-radio :label="3">不适用</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="8">
          <el-form-item prop="jobResponsibilitiesRemarks" style="height: 420px">
            <el-input v-model="form.jobResponsibilitiesRemarks" :disabled="operationType === 'view'"
              size="small"></el-input>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <span style="padding-left: 110px;font-size: 14px">备注:岗位职责达到5项及5项以上为符合</span>
        </el-col>
        <el-col :span="16">
          <el-form-item label="综合评价:" label-width="110px" prop="comprehensiveAssessment">
            <el-radio-group v-model="form.comprehensiveAssessment" :disabled="operationType === 'view'">
              <el-radio label="Qualified this position">可胜任该岗位</el-radio>
              <el-radio label="You can work while training">可边培训边上岗</el-radio>
              <el-radio label="Iconpetent for the position">不胜任该岗位</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button v-if="operationType !== 'view'" @click="resetForm">取消</el-button>
        <el-button v-if="operationType !== 'view'" type="primary" @click="submitForm">保存</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import TableCard from '@/components/TableCard/index.vue';
import {
  exportPersonnelCapacity,
  personPersonnelCapacityPage,
  addOrUpdatePersonPersonnelCapacity,
  confirmPersonnelCapability,
  deletePersonPersonnelCapacity,
  selectUserList,
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
  dicts: ['responsibilities_list'],
  props: {
    departId: {
      type: Number,
      default: () => {
        return null;
      }
    },
    isDepartment: {
      type: Boolean,
      default: false
    }
  },
  components: {
    limsTable,
    TableCard
  },
  data() {
    return {
      userName: '',
      tableData: [],
      search: {
        size: 20,
        current: 1,
        total: 0
      },
      title: '新增能力认定',
      operationType: '',
      yearColumnData: [
        {
          label: '岗位',
          prop: 'postName',
          minWidth: '100'
        }, {
          label: '姓名',
          prop: 'userName',
          minWidth: '100'
        }, {
          label: '学历',
          prop: 'academicDegree',
          minWidth: '100'
        }, {
          label: '专业',
          prop: 'major',
          minWidth: '100'
        }, {
          label: '职称',
          prop: 'technicalPost',
          minWidth: '100'
        }, {
          dataType: 'slot',
          label: '工作经历',
          prop: 'placeWork',
          minWidth: '100',
          slot: 'placeWorkSlot'
        }, {
          dataType: 'slot',
          label: '岗位职责',
          prop: 'jobResponsibilities',
          minWidth: '200px',
          slot: 'jobResponsibilities'
        }, {
          dataType: 'tag',
          label: '综合评价',
          minWidth: '140px',
          prop: 'comprehensiveAssessment',
          formatData: (params) => {
            if (params == 'Qualified this position') {
              return '可胜任该岗位';
            } else if (params == 'You can work while training') {
              return '可边培训边上岗';
            } else {
              return '不胜任该岗位';
            }
          },
          formatType: (params) => {
            if (params == 'Qualified this position') {
              return 'success';
            } else if (params == 'You can work while training') {
              return 'warning';
            } else {
              return 'danger';
            }
          }
        }, {
          label: '确认人',
          prop: 'confirmOperatingPersonnelId',
          minWidth: '100'
        }, {
          label: '确认日期',
          prop: 'confirmDate',
          minWidth: '160'
        }, {
          dataType: 'action',
          minWidth: '220',
          label: '操作',
          fixed: 'right',
          operation: [
            {
              name: '编辑',
              type: 'text',
              clickFun: (row) => {
                this.handleViewClick('edit', row);
              },
              showHide: (row) => {
                if (this.isDepartment) {
                  return true;
                } else {
                  return false;
                }
              }
            },
            {
              name: '查看',
              type: 'text',
              clickFun: (row) => {
                this.handleViewClick('view', row);
              }
            },
            {
              name: '导出',
              type: 'text',
              clickFun: (row) => {
                this.downLoadPost(row);
              }
            },
            {
              name: '确认',
              type: 'text',
              clickFun: (row) => {
                this.verifyGet(row.id);
              }
            },
            {
              name: '删除',
              type: 'text',
              color: '#f56c6c',
              clickFun: (row) => {
                this.deletePost(row.id);
              },
              showHide: (row) => {
                if (this.isDepartment) {
                  return true;
                } else {
                  return false;
                }
              }
            }
          ]
        }],
      yearLoading: false,
      dialogVisible: false,
      form: {
        jobResponsibilitiesTem: []
      },
      responsibleOptions: [],
      rules: {
        userId: [{ required: true, message: '请选择人员', trigger: 'change' }],
        academicDegree: [{ required: true, message: '请输入学历查核结果', trigger: 'blur' }],
        academicConformNot: [{ required: true, message: '请选择学历符合与否', trigger: 'change' }],
        relatedYears: [{ required: true, message: '请输入相关年限查核结果', trigger: 'blur' }],
        relatedYearsConformNot: [{ required: true, message: '请选择相关年限符合与否', trigger: 'change' }],
        relatedTraining: [{ required: true, message: '请输入相培训限查核结果', trigger: 'blur' }],
        relatedTrainingConformNot: [{ required: true, message: '请选择相关培训符合与否', trigger: 'change' }],
        relevantExperience: [{ required: true, message: '请输入相关经验查核结果', trigger: 'blur' }],
        relevantExperienceConformNot: [{ required: true, message: '请选择相关经验符合与否', trigger: 'change' }],
        workLicense: [{ required: true, message: '请输入上岗证查核结果', trigger: 'blur' }],
        workLicenseConformNot: [{ required: true, message: '请选择上岗证符合与否', trigger: 'change' }],
        jobResponsibilitiesTem: [{ required: true, message: '请选择岗位职责查核结果', trigger: 'change' }],
        jobResponsibilitiesConformNot: [{ required: true, message: '请选择岗位职责符合与否', trigger: 'change' }],
        comprehensiveAssessment: [{ required: true, message: '请选择综合评价', trigger: 'change' }]
      },
      responsibilities: []
    };
  },
  mounted() {
    this.getList(this.departId);
  },
  methods: {
    // ä¸‹è½½
    downLoadPost(row) {
      exportPersonnelCapacity({ id: row.id }).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, "人员能力导出" + '.docx')
      })
    },
    // æŸ¥è¯¢
    refreshTable() {
      this.getList(this.departId);
    },
    // èŽ·å–äººå‘˜èƒ½åŠ›åˆ—è¡¨ä¿¡æ¯
    getList(userId) {
      this.search.userId = userId;
      const name = this.isDepartment ? 'departmentId' : 'userId';
      this.yearLoading = true
      personPersonnelCapacityPage({
        userName: this.userName,
        [name]: this.search.userId,
        size: this.search.size,
        current: this.search.current
      }).then(res => {
        this.yearLoading = false
        if (res.code === 201) return;
        this.tableData = res.data.records;
        this.search.total = res.data.total;
      }).catch(err => {
        console.log(err);
        this.yearLoading = false
      })
    },
    selectResponsibilities(arr) {
      let arrTem = [];
      arr.map(val => {
        const index = this.responsibilities.findIndex(item => item.label === val);
        if (index > -1) {
          arrTem.push(this.responsibilities[index].value);
        }
      });
      this.form.jobResponsibilities = arrTem.join(',');
    },
    getResponsibilities() {
      this.responsibilities = this.dict.type.responsibilities_list;
    },
    changeLine(val) {
      if (val) {
        return val.replace(/,/g, '<br>')
      } else {
        return
      }
    },
    // æ–°å¢ž
    addAppointPost(type) {
      this.operationType = type;
      this.title = '新增能力认定'
      this.dialogVisible = true;
      this.form = {
        jobResponsibilitiesTem: []
      }
      this.getUserList();
      this.getResponsibilities();
    },
    // ç¼–辑/查看
    handleViewClick(type, row) {
      this.operationType = type;
      this.title = this.operationType === 'edit' ? '修改能力认定' : '查看能力认定'
      this.dialogVisible = true;
      this.form = { ...row }
      if (this.form.responsibilities) {
        this.$set(this.form, 'jobResponsibilitiesTem', this.form.responsibilities.split(","))
      } else {
        this.$set(this.form, 'jobResponsibilitiesTem', [])
      }
      this.getUserList();
      this.getResponsibilities();
    },
    submitForm() {
      this.$refs.infoForm.validate((valid) => {
        if (valid) {
          addOrUpdatePersonPersonnelCapacity(this.form).then(res => {
            if (res.code == 200) {
              this.$message.success('提交成功');
              this.getList(this.departId);
              this.form.id = null;
              this.dialogVisible = false;
            }
          });
        }
      });
    },
    verifyGet(id) {
      this.$confirm('是否确认本条信息?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        confirmPersonnelCapability({ id }).then(res => {
          if (res.code == 200) {
            this.$message.success('确认成功');
            this.getList(this.departId);
          }
        });
      }).catch((err) => {
        console.log('err---', err);
        this.$message.info('已取消')
      });
    },
    // åˆ é™¤å²—位职责
    deletePost(id) {
      this.$confirm('此操作将永久删除此数据, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deletePersonPersonnelCapacity({ id }).then(res => {
          if (res.code == 200) {
            this.$message.success('删除成功');
            this.getList(this.departId);
          }
        });
      }).catch(() => {
        this.$message.error('删除失败');
      });
    },
    resetForm() {
      this.$refs.infoForm.resetFields();
      this.dialogVisible = false;
    },
    // èŽ·å–è´Ÿè´£äººä¿¡æ¯æŽ¥å£
    getUserList() {
      selectUserList().then(res => {
        if (res.code == 200) {
          this.responsibleOptions = res.data;
        }
      });
    },
    pagination({ page, limit }) {
      this.search.current = page;
      this.search.size = limit;
      this.getList();
    },
  },
  watch: {
    // ç›‘听点击el-tree的数据,进行数据刷新
    departId: {
      handler(newId, oldId) {
        this.getList(newId);
      }
    },
    // ç›‘听点击el-tree的数据,进行数据刷新
    isDepartment: {
      handler(newId, oldId) {
        this.getList(this.departId);
      }
    },
  }
};
</script>
<style scoped>
>>>.el-dialog {
  margin: 6vh auto 50px !important;
}
>>>.el-dialog__body {
  max-height: 70vh;
  overflow-y: auto;
}
.radio-group>>>.el-form-item__error {
  padding-left: 38px;
}
>>>.el-checkbox__label {
  width: 212px;
  white-space: pre-wrap;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelInformation/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,947 @@
<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="synchronous" :loading="synchronousLoading">同步第三方信息</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: 180px;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">正式</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.departmentCode" 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">
                  </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">
                  </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="合同工" size="mini">合同工</el-radio>
                    <el-radio label="正式工" 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.trialStartTime" format="yyyy-MM-dd" placeholder="选择日期" size="small"
                    style="width: 99%;" type="date" value-format="yyyy-MM-dd">
                  </el-date-picker>
                </el-form-item>
              </el-col>
              <el-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">
                  </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">
                  </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.personBasicInfoAge" :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">
                  </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='已婚' size="mini">已婚</el-radio>
                    <el-radio label='未婚' 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='是' size="mini">是</el-radio>
                    <el-radio label='否' 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">
                  </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.companyEmail" 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">
                  </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">
                  </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">
                  </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" :headers="uploadHeader"
                  :on-success="(response, file, fileList) => onSuccess(response, file, fileList, 'pictureUrl')"
                  :show-file-list="false" style="float: left; margin: 0 10px 0 10px;">
                  <el-button slot="trigger" class="uploadFile" size="mini" type="primary">上传</el-button>
                </el-upload>
                <el-button v-if="form.pictureUrl" class="uploadFile" size="mini" type="primary"
                  @click="downloadFile(form.pictureUrl)">下载</el-button>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="18">
                <el-form-item label="电子签名">
                  <el-input v-model="form.signatureUrl" disabled size="small">
                    <el-button v-if="form.signatureUrl" slot="append" icon="el-icon-delete-solid"
                      @click="deleteFile(form.signatureUrl, 'signatureUrl')"></el-button>
                  </el-input>
                </el-form-item>
              </el-col>
              <el-col :span="6">
                <el-upload ref="upload" :action="action" :headers="uploadHeader"
                  :on-success="(response, file, fileList) => onSuccess(response, file, fileList, 'signatureUrl')"
                  :show-file-list="false" style="float: left; margin: 0 10px 0 10px;">
                  <el-button slot="trigger" class="uploadFile" size="small" type="primary">上传</el-button>
                </el-upload>
                <el-button v-if="form.signatureUrl" class="uploadFile" size="small" type="primary"
                  @click="downloadFile(form.signatureUrl)">下载</el-button>
              </el-col>
            </el-row>
            <!-- <el-row>
                          <el-col :span="20">
                              <el-form-item label="附件资料">
                                  <el-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%;">
              <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="级别" prop="level">
              <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">
              </el-date-picker>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row style="margin-top: 15px">
          <el-col :span="16">
            <el-form-item label="复印件" prop="copy">
              <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="原件" prop="original">
              <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" :headers="uploadHeader" :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 {
  getEmployees,
  getAnnex,
  updateAnnex,
  getAnnexByUserId,
  addAnnex,
  deleteAnnex,
  getCNASPersonnelInfo,
  saveCNASPersonnelInfo,
  deleteCNASFile
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
  dicts: ['personnl_type'],
  props: {
    clickNodeVal: {
      type: Object,
      default: () => { return {} }
    },
  },
  data() {
    return {
      synchronousLoading: false,
      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,
    }
  },
  created() {
    this.init()
  },
  computed: {
    action() {
      return this.javaApi + '/personBasicInfo/saveCNASFile'
    }
  },
  methods: {
    synchronous() {
      console.log('基本信息', this.clickNodeVal);
      this.synchronousLoading = true
      getEmployees({ userId: this.clickNodeVal.userId }).then(res => {
        this.synchronousLoading = false
        this.getUserBasisInfo(this.clickNodeVal.userId)
        this.$message.success("同步成功")
      })
    },
    annexAdd(type, row) {
      if (type === 1) {
        this.title = '编辑附件资料'
        this.addOrupdate = 1
        getAnnex({ id: row.id }).then(res => {
          this.annex = res.data
          this.imageUrl = this.javaApi + '/img/' + res.data.fileName
        })
      } else {
        this.title = '新增附件资料'
        this.addOrupdate = 2
      }
      this.dialogVisible1 = true
    },
    submitForm(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) {
        updateAnnex(this.annex).then(res => {
          if (res.code == 200) {
            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
        addAnnex(this.annex).then(res => {
          if (res.code == 200) {
            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(() => {
        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) {
      this.$download.saveAs(fileName, 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) {
      getCNASPersonnelInfo({ 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 = ''
        }
      }
      saveCNASPersonnelInfo(this.form).then(res => {
        this.saveLoading = false
        this.isSave = true
        this.getUserBasisInfo(this.clickNodeVal.userId)
        this.$message.success('保存成功!')
      })
    },
    // å–人员分类的字典
    getComparisonList() {
      tthis.personnelClassification = this.dict.type.personnl_type;
      this.checkList = this.form.personnelClassification.split(',')
    },
    clickPersonnelClassificationSure() {
      this.dialogVisible = false
      this.form.personnelClassification = this.checkList.filter(m => m).join(',')
    },
    async deleteFile(fileName, entityVal) {
      await deleteCNASFile({ 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>
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelList/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,319 @@
<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="synchronousLoading" size="small" type="primary" @click="synchronous"
          :v-show="departId">同步第三方人员信息</el-button>
        <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="序号" width="60">
          <template v-slot="scope">
            <span>{{ (page.current - 1) * page.size + scope.$index + 1 }}</span>
          </template>
        </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 '@/components/Table/value-table.vue';
import {
  getEmployees,
  basicInformationOfPersonnelSelectPage,
  delUserDepardLimsId,
  upUserDepardLimsId,
  exportPersonBasicInfo,
  exportPersonBasicInfoById,
} from '@/api/cnas/personnel/personnelInfo.js'
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 {
      synchronousLoading: false,
      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: {
    synchronous() {
      console.log('departId', this.departId);
      this.$message.warning("正在同步,请稍后...")
      this.synchronousLoading = true
      getEmployees({ departId: this.departId }).then(res => {
        this.synchronousLoading = false
        this.$message.success("同步成功")
      })
    },
    /**
     * @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;
        basicInformationOfPersonnelSelectPage({ ...this.page, ...this.entit }).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(() => {
          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;
      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;
      exportPersonBasicInfo(entity).then(res => {
        this.outLoading = false;
        if (res.code === 201) {
          return;
        }
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, '人员信息.xlsx')
      });
    },
    downPerson(row) {
      exportPersonBasicInfoById({ id: row.userId }).then(res => {
        this.$download.saveAs(res.data, res.data)
        this.$message.success('下载成功')
      });
    }
  },
  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>
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/AddInDetail.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,319 @@
<template>
  <div>
    <el-dialog :visible.sync="addTrainingPlanDia" :show="currshowlist" @close="$emit('update:currshowlist', false)"
      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-form-item label="培训月份:" prop="trainingDate">
                <el-select v-model="trainingPlan.trainingDate">
                  <el-option v-for="(v, i) in months" :key="i" :label="v.label" :value="v.value"></el-option>
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="培训日期:" prop="trainingDateTwo">
                <el-date-picker v-model="trainingPlan.trainingDateTwo" type="date" value-format="yyyy-MM-dd"
                  placeholder="选择日期">
                </el-date-picker>
              </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" multiple clearable filterable placeholder="请选择"
                  size="small" style="width: 100%">
                  <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item.name">
                  </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-select v-model="trainingPlan.holdingDepartment" placeholder="请选择">
                  <el-option v-for="(v, i) in departLims" :key="i" :label="v.name" :value="v.id"></el-option>
                </el-select>
                <!--
                <el-input
                  v-model="trainingPlan.holdingDepartment"
                  placeholder="请输入"
                  size="small"
                ></el-input> -->
              </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-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>
import {
  selectDepartLims,
  addOrUpdatePersonTrainingDetailed,
} from '@/api/cnas/personnel/personnelInfo.js'
import { selectUserCondition } from "@/api/system/user";
export default {
  props: {
    currshowlist: {
      type: Boolean,
      default: false,
    },
    currentChangeRow: {
      type: Object,
      default: () => {
        return {};
      },
    },
  },
  name: "Add",
  // import å¼•入的组件需要注入到对象中才能使用
  components: {},
  data() {
    var trainingLecturerIdValidate = (rule, value, callback) => {
      if (typeof value !== "undefined" && value.length == 0) {
        callback(new Error("请选择讲师"));
      } else {
        callback();
      }
    };
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      departLims: [],
      months: [
        { label: "1月", value: "1月" },
        { label: "2月", value: "2月" },
        { label: "3月", value: "3月" },
        { label: "4月", value: "4月" },
        { label: "5月", value: "5月" },
        { label: "6月", value: "6月" },
        { label: "7月", value: "7月" },
        { label: "8月", value: "8月" },
        { label: "9月", value: "9月" },
        { label: "10月", value: "10月" },
        { label: "11月", value: "11月" },
        { label: "12月", value: "12月" },
      ],
      addTrainingPlanDia: false,
      trainingPlan: {
        id: "",
        planId: "",
        trainingDate: "",
        trainingDateTwo: "",
        classHour: "",
        openingTime: "",
        endTime: "",
        trainingObjectives: "",
        participants: "",
        trainingContent: "",
        trainingLecturerId: undefined,
        projectCredits: "",
        placeTraining: "",
        trainingMode: "",
        holdingDepartment: "",
      },
      trainingPlanRules: {
        trainingDate: [
          { required: true, message: "请选择培训日期", trigger: "change" },
        ],
        trainingDateTwo: [
          { required: true, message: "请选择培训日期", trigger: "change" },
        ],
        openingTime: [
          { required: true, message: "请选择开始时间", trigger: "change" },
        ],
        endTime: [
          { required: true, message: "请选择结束时间", trigger: "change" },
        ],
        trainingContent: [
          { required: true, message: "请输入培训内容", trigger: "blur" },
        ],
        trainingLecturerId: [
          {
            required: true,
            validator: trainingLecturerIdValidate,
            trigger: "change",
          },
        ],
      },
      responsibleOptions: [],
    };
  },
  created() {
    this.departLims = [];
    selectDepartLims().then((res) => {
      this.departLims = res.data;
    });
  },
  // æ–¹æ³•集合
  methods: {
    showDialog(id) {
      this.trainingPlan.planId = id;
      this.getUserList();
      // this.addTrainingPlanDia = true;
    },
    showEditDialog(row) {
      this.getUserList();
      let data = JSON.parse(JSON.stringify(row));
      console.log(data.trainingLecturerId);
      let list = data.trainingLecturerId.split(/、|,|,|\\s+/);
      this.$set(this.trainingPlan, "trainingLecturerId", list);
      this.$set(this.trainingPlan, "id", data.id);
      this.$set(this.trainingPlan, "trainingDate", data.trainingDate);
      this.$set(this.trainingPlan, "trainingDateTwo", data.trainingDateTwo);
      this.$set(this.trainingPlan, "classHour", data.classHour);
      this.$set(this.trainingPlan, "openingTime", data.openingTime);
      this.$set(this.trainingPlan, "endTime", data.endTime);
      this.$set(
        this.trainingPlan,
        "trainingObjectives",
        data.trainingObjectives
      );
      this.$set(this.trainingPlan, "participants", data.participants);
      this.$set(this.trainingPlan, "projectCredits", data.projectCredits);
      this.$set(this.trainingPlan, "placeTraining", data.placeTraining);
      this.$set(this.trainingPlan, "trainingContent", data.trainingContent);
      this.$set(this.trainingPlan, "trainingMode", data.trainingMode);
      this.$set(this.trainingPlan, "holdingDepartment", data.holdingDepartment);
      this.$set(this.trainingPlan, "planId", data.planId);
      console.log("222", this.trainingPlan);
    },
    // æäº¤æ–°å¢ž
    submitAdd() {
      this.$refs.trainingPlan.validate((valid) => {
        if (valid) {
          // å°†åŸ¹è®­è®²å¸ˆå€¼å°è£…
          this.trainingPlan.trainingLecturerId =
            this.trainingPlan.trainingLecturerId.join(",");
          console.log(
            "this.trainingPlan.trainingLecturerId",
            this.trainingPlan.trainingLecturerId
          );
          const personTrainingDetailed = this.trainingPlan;
          console.log("personTrainingDetailed", personTrainingDetailed);
          addOrUpdatePersonTrainingDetailed(personTrainingDetailed).then((res) => {
            if (res.code == 200) {
              this.$message.success("提交成功");
              this.closeAdd();
              this.dialogVisible = false;
            }
          });
        }
      });
    },
    // å…³é—­å¼¹æ¡†
    closeAdd() {
      this.$refs.trainingPlan.resetFields();
      this.$emit("search");
      this.$emit("searchPlan");
      this.addTrainingPlanDia = false;
    },
    // èŽ·å–è´Ÿè´£äººä¿¡æ¯æŽ¥å£
    getUserList() {
      selectUserCondition().then((res) => {
        if (res.code == 200) {
          this.responsibleOptions = res.data;
        }
      });
    },
  },
  watch: {
    // addTrainingPlanDia(newVal) {
    //   if (newVal) {
    //     this.trainingPlan.planId = null;
    //   }
    // },
    currshowlist(newValue) {
      this.addTrainingPlanDia = this.currshowlist;
      if (!newValue) {
        this.closeAdd();
        this.trainingPlan = {
          id: "",
          planId: "",
          trainingDate: "",
          classHour: "",
          openingTime: "",
          endTime: "",
          trainingObjectives: "",
          participants: "",
          trainingContent: "",
          trainingLecturerId: undefined,
          projectCredits: "",
          placeTraining: "",
          trainingMode: "",
          holdingDepartment: "",
        };
      }
      if (this.currshowlist) {
        this.$nextTick(() => {
          if (this.trainingPlan.trainingLecturerId.length == 0) {
            this.trainingPlan.trainingLecturerId = undefined;
          }
        });
      }
    },
  },
};
</script>
<style scoped></style>
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/Edit.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,580 @@
<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" :disabled="![1, 4].includes(currentRow.state)">{{
          currentRow.assessmentUserId ? '保存' : '提交' }}</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.trainingLecturerId }} </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 || currentRow.assessmentUserId" :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 || ((currentRow.assessmentUserId !== user.userId) && ![35, 16, 36].includes(user.userId)) || !currentRow.assessmentUserId"
                :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 || currentRow.assessmentUserId" 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-col :span="12">
            <el-form-item label="评价时间">
              <el-date-picker v-model="trainingForm.assessmentDate"
                :disabled="currentRow.state == 1 || ((currentRow.assessmentUserId !== user.userId) && ![35, 16, 36].includes(user.userId)) || !currentRow.assessmentUserId"
                style="width:40%" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" size="small"
                placeholder="选择日期">
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="培训摘要">
              <el-input v-model="trainingForm.trainingAbstract"
                :disabled="currentRow.state == 1 || currentRow.assessmentUserId" :rows="2" placeholder="请输入"
                size="small" style="width: 79%" type="textarea"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item>
              <!-- <el-upload
                ref="upload"
                :action="action"
                :before-upload="beforeUpload"
                :on-error="onError"
                :data="uploadData"
                :headers="uploadHeader"
                :on-success="attachmentUpload"
                >
                <el-button size="small" type="primary">点击上传</el-button>
              </el-upload> -->
              <el-button type="primary" size="small" @click="attachmentFrame = true">附件</el-button>
            </el-form-item>
          </el-col>
          <!-- <el-col :span="12" :offset="12">
            <el-image
              v-if="currentRow.url"
              style="width: 70%; height: 100px"
              :src="javaApi + '/img/' + currentRow.url">
              </el-image>
          </el-col> -->
        </el-form>
      </el-row>
    </div>
    <!-- æ–‡ä»¶é¢„览 -->
    <el-dialog :visible.sync="lookDialogVisible" fullscreen title="查看附件" width="800px">
      <filePreview v-if="lookDialogVisible" :currentFile="{}" :fileUrl="previewFile"
        style="height: 90vh;overflow-y: auto;top: 0" />
    </el-dialog>
    <!-- é™„件弹框 -->
    <el-dialog title="附件" :visible.sync="attachmentFrame" width="70%" border :before-close="handleClose">
      <el-upload ref="upload" :action="action" :before-upload="beforeUpload" :on-error="onError" :data="uploadData"
        :headers="uploadHeader" :on-success="attachmentUpload" style="margin-bottom: 10px">
        <el-button size="small" type="primary" :disabled="currentRow.state == 1">上传附件</el-button>
      </el-upload>
      <el-table ref="fileData" :data="fileData" height="400px">
        <el-table-column label="序号" type="index" width="100" header-align="center" align="center">
        </el-table-column>
        <el-table-column label="文件名称" prop="fileName" header-align="center" align="center">
        </el-table-column>
        <el-table-column label="操作" fixed="right" width="200px" header-align="center" align="center">
          <template slot-scope="scope">
            <el-button type="text" size="small" @click="preview(scope.row)">预览</el-button>
            <el-button type="text" size="small" @click="download(scope.row)">下载</el-button>
            <el-button type="text" style="color: red;" size="small" @click="deleteFile(scope.row)">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <span slot="footer" class="dialog-footer">
        <el-button @click="attachmentFrame = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="attachmentFrame = false">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <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-select v-model="scope.row.examinationResults" :disabled="currentRow.state === 1" size="small"
              style="width: 100%" @change="updatePersonResult(scope.row)">
              <el-option label="合格" value="合格"></el-option>
              <el-option label="不合格" value="不合格"></el-option>
            </el-select>
          </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 '@/components/TableCard/index.vue';
import limsTable from "@/components/Table/lims-table.vue";
import ValueTable from '@/components/Table/value-table.vue';
import filePreview from "@/components/Preview/filePreview.vue";
import {
  fileDownLoad,
  deleteFile,
  getFileData,
  trainingAndAssessmentRecordsPage,
  outOfFocusPreservation,
  newPersonnelAddedToTrainingRecords,
  deleteTrainingAndAssessmentRecords,
  trainingAndAssessmentRecordsAdded,
} from '@/api/cnas/personnel/personnelInfo.js'
import { selectUserCondition } from "@/api/system/user";
import { mapGetters } from "vuex";
export default {
  name: 'Edit',
  // import å¼•入的组件需要注入到对象中才能使用
  components: { ValueTable, limsTable, TableCard, filePreview },
  props: {
    currentRow: {
      type: Object,
      default: () => {
        return {}
      }
    },
  },
  data() {
    // è¿™é‡Œå­˜æ”¾æ•°æ®
    return {
      previewFile: '',
      lookDialogVisible: false,
      user: {},
      fileData: [],
      attachmentFrame: false,
      isSelectedList: [], // ç¦ç”¨çš„多选
      userName: undefined,
      trainingForm: {
        code: '111111',
        date: '2024-10-10',
      },
      uploadData: {},
      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: [],
    };
  },
  computed: {
    action() {
      return this.javaApi + '/personTraining/fileUpload';
    },
    ...mapGetters(["userId"]),
  },
  mounted() {
    this.trainingForm = JSON.parse(JSON.stringify(this.currentRow))
    this.getInfo()
    this.getUserList()
    this.getFileData(this.trainingForm.id)
    // èŽ·å–å½“å‰ç™»å½•äººä¿¡æ¯
    this.loginPerson();
  },
  // æ–¹æ³•集合
  methods: {
    // é™„件预览
    preview(row) {
      let folder = '';
      if (row.fileUrl.includes('xls')) {
        folder = 'excel'
      } else if (row.fileUrl.includes('docx')) {
        folder = 'word'
      } else {
        folder = 'img'
      }
      this.previewFile = this.javaApi + folder + row.fileUrl
      this.$nextTick(() => {
        this.lookDialogVisible = true
      })
    },
    // ä¸‹è½½
    download(row) {
      fileDownLoad({ id: row.id }).then(res => {
        console.log('2123');
        const blob = new Blob([res], { type: row.mime });
        this.$download.saveAs(blob, row.fileName)
      })
    },
    // åˆ é™¤
    deleteFile(row) {
      this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        deleteFile({ id: row.id }).then(res => {
          this.$message({
            type: 'success',
            message: '删除成功!'
          });
          this.getFileData(this.trainingForm.id);
        })
      })
    },
    // æŸ¥è¯¢
    getFileData(id) {
      getFileData({ detailedId: id }).then(res => {
        this.fileData = res.data
      })
    },
    // é™„件上传 æˆåŠŸçš„é’©å­
    attachmentUpload(res, file, fileList) {
      // ç»™å›¾ç‰‡è·¯å¾„赋值
      this.$message.success('上传成功')
      this.currentRow.url = res.data.url
      this.$refs.upload.clearFiles();
      this.getFileData(this.trainingForm.id);
    },
    // å¤±è´¥çš„钩子
    onError(err, file, fileList) {
      this.$message.error('上传失败')
    },
    // ä¸Šä¼ å‰çš„钩子
    beforeUpload(file) {
      // ç»™ä¼ é€’的参数赋值
      this.$set(this.uploadData, "id", this.currentRow.id)
    },
    // å½“前登录人信息
    loginPerson() {
      this.user = {
        userId: this.userId
      }
    },
    // èŽ·å–å½“å‰æ•°æ®
    async getInfo() {
      this.trainingLoading = true
      trainingAndAssessmentRecordsPage({
        trainingDetailedId: this.currentRow.id,
        userName: this.userName
      }).then(res => {
        if (res.code === 200) {
          this.trainingTableData = res.data
        }
        this.trainingLoading = false
      })
    },
    async updatePersonResult(row) {
      const { code } = await outOfFocusPreservation(row)
      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);
      });
      newPersonnelAddedToTrainingRecords(list).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)
          deleteTrainingAndAssessmentRecords(formData)
            .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() {
      console.log('this.currentRow.state', this.currentRow.state);
      if (this.currentRow.state !== 4 && this.currentRow.state !== 1) {
        this.$message.warning("当前状态无法提交/撤销!")
        return
      }
      // å¦‚果等于4 è¡¨ç¤ºè¯¥çŠ¶æ€ä¸ºå·²ç»“æŸï¼Œ1 è¡¨ç¤ºå·²å®Œæˆ
      let state = 4
      if (this.currentRow.assessmentUserId == this.user.userId) {
        state = 1
      }
      let data = {
        assessmentMethod: this.trainingForm.assessmentMethod,
        comprehensiveAssessment: this.trainingForm.comprehensiveAssessment,
        trainingDetailedId: this.trainingForm.id,
        assessmentUserId: this.currentRow.assessmentUserId ? this.currentRow.assessmentUserId : this.trainingForm.assessmentUserId,
        assessmentDate: this.trainingForm.assessmentDate,
        state: state,
        trainingAbstract: this.trainingForm.trainingAbstract
      }
      const { code } = await trainingAndAssessmentRecordsAdded(data)
      if (code === 200) {
        this.currentRow.state = state
        this.$message.success("操作成功")
        // this.$emit('refresh',this.currentRow.id)
      }
    },
    getUserList() {
      selectUserCondition().then(res => {
        if (res.code === 201) {
          return
        }
        this.userList = res.data
      })
    },
    handleClose() {
      this.attachmentFrame = false;
    },
  }
};
</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>
src/views/CNAS/personnel/personnelInfo/Department/components/PersonnelTraining/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1012 @@
<!-- äººå‘˜åŸ¹è®­ -->
<template>
  <div class="flex_column">
    <div v-if="!editPlanShow && isDepartment && flag">
      <TableCard title="年度计划表">
        <template v-slot:form>
          <div class="items_center">
            <span>创建人</span>
            <el-input v-model="pagination.compilerName" class="search" placeholder="请输入" size="mini"></el-input>
            <el-button size="mini" type="primary" @click="getYearPlanList(departId)">查询</el-button>
          </div>
          <div>
            <el-button size="mini" type="primary" @click="uploadDia = true">导入</el-button>
          </div>
        </template>
        <template v-slot:table>
          <limsTable :column="yearPlanColumn" :currentChange="currentChange" :height="'130'"
            :table-data="yearPlanTableData" :table-loading="yearLoading" highlightCurrentRow style="padding: 0 15px"
            :page="pagination" @pagination="paginationMetod">
          </limsTable>
        </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="mini"></el-input>
            <!-- <span>课程编号</span>
            <el-input v-model="inDetailForm.courseCode" class="search" clearable placeholder="请输入" size="small"></el-input> -->
            <span style="margin-right: 4px">培训日期</span>
            <el-date-picker v-model="inDetailForm.trainingDate" clearable format="yyyy-MM-dd" placeholder="选择日期"
              size="mini" type="date" value-format="yyyy-MM-dd"></el-date-picker>
            <el-button size="mini" style="margin-left: 10px" type="primary" @click="searchTable">查询</el-button>
          </div>
          <div style="display: flex; align-items: center">
            <el-button v-if="isDepartment && currentChangeRow && isOperation && flag" size="mini"
              @click="batchDelete">批量删除</el-button>
            <el-button v-if="isDepartment && currentChangeRow && isOperation && flag" size="mini" type="primary"
              @click="addTrainingPlan">新增</el-button>
          </div>
        </template>
        <template v-slot:table>
          <el-tabs v-model="activeName" style="margin-left: 15px">
            <el-tab-pane label="未培训" name="first">
              <limsTable :column="inDetailPlanColumn" :handleSelectionChange="handleSelectionChange"
                :height="tableHeight + ''" :isSelection="true" :table-data="inDetailPlanTableData"
                :table-loading="yearLoading" style="padding: 0 15px" :page="inDetailPagination"
                @pagination="paginationmethod0">
              </limsTable>
            </el-tab-pane>
            <el-tab-pane label="已结束" name="second">
              <limsTable :column="inDetailPlanColumn" :handleSelectionChange="handleSelectionChange"
                :height="tableHeight + ''" :isSelection="true" :table-data="inDetailPlanTableData"
                :table-loading="yearLoading" style="padding: 0 15px" :page="inDetailPagination"
                @pagination="paginationmethod0">
              </limsTable>
            </el-tab-pane>
          </el-tabs>
        </template>
      </TableCard>
    </div>
    <Add ref="addPlan" :currshowlist.sync="addInDetail" :currentChangeRow="currentChangeRow"
      @search="getInDetailPlan(currentRowId, departId)" @searchPlan="refreshYearPlanList(departId2)"></Add>
    <Edit v-if="editPlanShow" ref="editPlan" :currentRow="currentRow" :key="editKey" @refresh="refresh"
      @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 + '/personTraining/personTrainingImport'" :auto-upload="false"
          :before-upload="beforeUpload" :file-list="fileList" :headers="uploadHeader" :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 TableCard from '@/components/TableCard/index.vue';
import limsTable from "@/components/Table/lims-table.vue";
import Add from "./AddInDetail.vue";
import Edit from "./Edit.vue";
import {
  deleteDetail,
  personTrainingSelect,
  queryTheAnnualPlanDetailsTable,
  personTrainingDelete,
  reviewAnnualPersonnelTraining,
  approveAnnualPersonnelTraining,
  exportPersonTrainingRecord,
  claimOfTrainingAndAssessmentRecords,
  exportPersonTraining,
  deleteAnnualPlanDetailTable,
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
  name: "PersonnelTraining",
  components: { Add, limsTable, TableCard, Edit },
  props: {
    flag: {
      type: Boolean,
      default: false,
    },
    departId: {
      type: Number,
      default: () => {
        return null;
      },
    },
    isDepartment: {
      type: Boolean,
      default: false,
    },
  },
  data() {
    return {
      currentPlanId: null,
      activeName: "first",
      addInDetail: false,
      departId2: null,
      editKey: 1,
      search: {},
      superviseForm: {},
      inDetailForm: {
        trainingLecturerName: "",
        courseCode: "",
        trainingDate: "",
      },
      yearLoading: false,
      yearPlanTableData: [], // å¹´åº¦è®¡åˆ’表数据
      yearPlanColumn: [
        {
          label: "文件名称",
          width: "160px",
          minWidth: "160px",
          prop: "fileName",
          showOverflowTooltip: true,
        },
        {
          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 || (row.departId == 18 && row.currentId != 10 && row.currentId != 16) || (row.departId == 19 && row.currentId != 35 && row.currentId != 16)) {
                  return true;
                } else {
                  return false;
                }
              },
              clickFun: (row) => {
                this.handleCheck(row.id);
              },
            },
            {
              name: "批准",
              type: "text",
              disabled: (row) => {
                if (row.approvalStatus === 1 || (row.currentId != 11 && row.currentId != 16)) {
                  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",
          isShow: this.flag,
          formatData: (params) => {
            if (params === true) {
              return "已报名";
            } else {
              return "未报名";
            }
          },
          formatType: (params) => {
            if (params === true) {
              return "success";
            } else {
              return "info";
            }
          },
        },
        {
          label: "报名人数",
          prop: "enrollment",
          width: "100px",
          isShow: !this.flag,
        },
        {
          label: "培训目标",
          prop: "trainingObjectives",
          width: "160px",
          minWidth: "160px",
          showOverflowTooltip: true,
        },
        {
          label: "培训内容",
          prop: "trainingContent",
          width: "160px",
          minWidth: "160px",
          showOverflowTooltip: true,
        },
        {
          label: "培训方式",
          prop: "trainingMode",
          width: "140px",
          minWidth: "140px",
          showOverflowTooltip: true,
        },
        {
          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: "140px",
          minWidth: "140px",
          showOverflowTooltip: true,
        },
        {
          label: "举办部门",
          prop: "holdingDepartmentName",
          width: "140px",
          minWidth: "140px",
          showOverflowTooltip: true,
        },
        {
          label: "培训地点",
          prop: "placeTraining",
          width: "160px",
          minWidth: "160px",
          showOverflowTooltip: true,
        },
        {
          label: "培训讲师",
          prop: "trainingLecturerId",
          width: "120px",
          minWidth: "120px",
          showOverflowTooltip: true,
        },
        {
          label: "培训日期",
          prop: "trainingDateTwo",
          width: "140px",
        },
        {
          label: "开始时间",
          prop: "openingTime",
          width: "120px",
        },
        {
          label: "课时",
          prop: "classHour",
          width: "100px",
        },
        {
          label: "备注",
          prop: "remarks",
          width: "120px",
          minWidth: "120px",
          showOverflowTooltip: true,
        },
        {
          dataType: "action",
          width: "240",
          label: "操作",
          fixed: "right",
          operation: [
            // è¶…过会议开始时间就不能认领了
            {
              name: "报名",
              type: "text",
              clickFun: (row) => {
                this.handleClaim(row);
              },
              disabled: (row) => {
                if (
                  row.whetherClaim === true ||
                  row.trainingDateTwo < this.$moment().format("YYYY-MM-DD")
                ) {
                  return true;
                } else {
                  return false;
                }
              },
            },
            {
              name: "结果明细",
              type: "text",
              clickFun: (row) => {
                this.editInDetail(row);
              },
              showHide: (row) => {
                if (row.isDisabled == 1) {
                  return true;
                } else {
                  return false;
                }
              },
            },
            {
              name: "导出",
              type: "text",
              clickFun: (row) => {
                this.downLoadInDetail(row);
              },
            },
            {
              name: "删除",
              type: "text",
              color: "#f56c6c",
              clickFun: (row) => {
                this.deleteDetail(row);
              },
              showHide: (row) => {
                if (row.isDisabled == 1) {
                  return true;
                } else {
                  return false;
                }
              },
            },
            {
              name: "编辑",
              type: "text",
              clickFun: (row) => {
                this.editDetail(row);
              },
              showHide: (row) => {
                if (row.isDisabled == 1) {
                  return true;
                } else {
                  return false;
                }
              },
            },
          ],
        },
      ],
      pagination: {
        size: 20,
        current: 1,
        total: 0,
        compilerName: "",
      },
      inDetailPagination: {
        size: 20,
        current: 1,
        total: 0,
      },
      editPlanShow: false,
      currentRow: {},
      currentRowId: null, // å½“前选中数据的id
      reviewRemarks: "", // å®¡æ ¸å¤‡æ³¨
      reviewDialog: false, // å®¡æ ¸å¼¹æ¡†
      reviewLoading: false, // å®¡æ ¸æäº¤æŒ‰é’®
      approvalRemarks: "", // å®¡æ ¸å¤‡æ³¨
      approvalDialog: false, // å®¡æ ¸å¼¹æ¡†
      approvalLoading: false, // å®¡æ ¸æäº¤æŒ‰é’®
      multipleSelection: [], // å¹´åº¦æ˜Žç»†è¡¨é€‰ä¸­çš„æ•°æ®
      uploadDia: false,
      uploading: false,
      isOperation: false,
      token: null,
      fileList: [],
      currentChangeRow: {},
      tableHeight: 0,
    };
  },
  beforeDestroy() {
    window.removeEventListener("resize", this.getTableHeight);
  },
  created() {
    this.getTableHeight();
  },
  mounted() {
    window.addEventListener("resize", this.getTableHeight);
    this.token = {
      token: sessionStorage.getItem("token"),
    };
    if (this.isDepartment) {
      this.getYearPlanList(this.departId);
    } else {
      this.getInDetailPlan("", this.departId);
    }
    console.log("this.flag", this.flag);
  },
  methods: {
    //动态获取表格高度
    getTableHeight() {
      const otherHeight = 548; // å…¶ä½™é«˜åº¦
      const tableH = 50; // è·ç¦»é¡µé¢ä¸‹æ–¹çš„高度
      const tableHeightDetil = window.innerHeight - tableH;
      if (tableHeightDetil <= 300) {
        this.tableHeight = 200;
      } else {
        this.tableHeight = window.innerHeight - tableH - otherHeight;
      }
    },
    // ç¼–辑明细
    editDetail(row) {
      this.addInDetail = true;
      this.$nextTick(() => {
        this.$refs.addPlan.showEditDialog(row);
      });
    },
    // åˆ é™¤æ˜Žç»†
    deleteDetail(row) {
      this.$confirm("是否删除?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      }).then(() => {
        deleteDetail({ id: row.id }).then((res) => {
          this.$message.success("删除成功");
          this.searchTable();
        });
      });
    },
    searchTable() {
      // å°†é¡µç è®¾ä¸º
      this.inDetailPagination.current = 1
      this.getInDetailPlan(this.currentRowId);
    },
    // æŸ¥è¯¢-年度计划表
    getYearPlanList(userId) {
      const name = this.isDepartment ? "departmentId" : "userId";
      personTrainingSelect({
        [name]: userId,
        size: this.pagination.size,
        current: this.pagination.current,
        compilerName: this.pagination.compilerName
      }).then((res) => {
        if (res.code === 201) return;
        let data = {};
        this.yearPlanTableData = res.data.records;
        this.pagination.total = res.data.total;
        if (this.yearPlanTableData.length > 0) {
          this.currentRowId = this.yearPlanTableData[0].id;
          if (this.currentPlanId) {
            let filterData = this.yearPlanTableData.filter(
              (item) => item.id == this.currentPlanId
            );
            if (filterData.length > 0) {
              data = filterData[0];
            }
          } else {
            data = this.yearPlanTableData[0];
          }
          this.currentChange(data);
        } else {
          this.inDetailPlanTableData = [];
        }
      });
    },
    refreshYearPlanList(departmentId) {
      console.log("刷新主表", departmentId);
      personTrainingSelect({
        departmentId: departmentId,
        size: this.pagination.size,
        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;
      });
    },
    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.currentPlanId = row.id;
      this.getInDetailPlan(row.id);
    },
    getInDetailPlan(id) {
      if (this.inDetailForm.trainingDate === null) {
        this.inDetailForm.trainingDate = "";
      }
      let state = 3;
      if (this.activeName != "first") {
        state = -1;
      }
      const userId = this.isDepartment ? "" : this.departId;
      if (this.currentPlanId) {
        id = this.currentPlanId;
      }
      queryTheAnnualPlanDetailsTable({
        userId,
        size: this.inDetailPagination.size,
        current: this.inDetailPagination.current,
        trainingLecturerName: this.inDetailForm.trainingLecturerName,
        trainingDate: this.inDetailForm.trainingDate,
        courseCode: this.inDetailForm.courseCode,
        departId: this.departId,
        state
      }).then((res) => {
        if (res.code === 201) return;
        this.inDetailPlanTableData = res.data.records;
        this.inDetailPagination.total = res.data.total;
        this.departId2 = res.data.records[0].departId;
      });
    },
    // æ–°å¢žå¹´åº¦è®¡åˆ’明细表
    addTrainingPlan() {
      if (!this.currentRowId) {
        this.$message.warning("请选择一条计划进行新增");
        return;
      }
      this.addInDetail = true;
      this.$nextTick(() => {
        this.$refs.addPlan.showDialog(this.currentRowId);
      });
    },
    // å¹´åº¦è®¡åˆ’表-删除
    deleteFun(id) {
      this.$confirm("此操作将永久删除该数据, æ˜¯å¦ç»§ç»­?", "提示", {
        confirmButtonText: "确定",
        cancelButtonText: "取消",
        type: "warning",
      })
        .then(() => {
          personTrainingDelete({ 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;
      reviewAnnualPersonnelTraining(personTrainingUpdateDto).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;
      approveAnnualPersonnelTraining(personTrainingUpdateDto).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) {
      exportPersonTraining({ id: row.id }).then((res) => {
        this.outLoading = false;
        const blob = new Blob([res], { type: "application/msword" });
        this.$download.saveAs(blob, row.fileName + ".docx")
      });
    },
    // å¹´åº¦è®¡åˆ’-导入
    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;
      }
    },
    // å¹´åº¦è®¡åˆ’分页
    paginationMetod({ page, limit }) {
      this.pagination.current = page;
      this.pagination.size = limit;
      this.getYearPlanList();
    },
    // å¹´åº¦è®¡åˆ’明细表-认领、取消认领
    handleClaim(row) {
      this.$confirm("是否确认报名该课程?", "提示", {
        confirmButtonText: "报名",
        cancelButtonText: "取消报名",
        type: "warning",
      })
        .then(() => {
          this.handleClaimFun(true, row.id);
        })
        .catch(() => {
          this.handleClaimFun(false, row.id);
        });
    },
    handleClaimFun(claimAndClaim, rowId) {
      claimOfTrainingAndAssessmentRecords({
        claimAndClaim,
        rowId
      }).then((res) => {
        this.getInDetailPlan(this.currentChangeRow.id);
      });
    },
    // å¹´åº¦è®¡åˆ’明细表-编辑
    editInDetail(row) {
      this.editPlanShow = true;
      this.currentRow = row;
    },
    //
    goBack() {
      this.editPlanShow = false;
      this.getInDetailPlan(this.currentRowId);
    },
    refresh(id) {
      if (this.inDetailForm.trainingDate === null) {
        this.inDetailForm.trainingDate = "";
      }
      const userId = this.isDepartment ? "" : this.departId;
      queryTheAnnualPlanDetailsTable({
        userId,
        size: this.inDetailPagination.size,
        current: this.inDetailPagination.current,
        trainingLecturerName: this.inDetailForm.trainingLecturerName,
        id,
        trainingDate: this.inDetailForm.trainingDate,
        courseCode: this.inDetailForm.courseCode,
        departId: this.departId
      }).then((res) => {
        if (res.code === 201) return;
        this.inDetailPlanTableData = res.data.records;
        this.inDetailPagination.total = res.data.total;
        this.currentRow = this.inDetailPlanTableData.find(
          (item) => item.id == id
        );
        this.editKey += 1;
      });
      console.log("刷新", this.currentRow);
    },
    refresh(id) {
      if (this.inDetailForm.trainingDate === null) {
        this.inDetailForm.trainingDate = "";
      }
      const userId = this.isDepartment ? "" : this.departId;
      queryTheAnnualPlanDetailsTable({
        userId,
        size: this.inDetailPagination.size,
        current: this.inDetailPagination.current,
        id,
        trainingLecturerName: this.inDetailForm.trainingLecturerName,
        trainingDate: this.inDetailForm.trainingDate,
        courseCode: this.inDetailForm.courseCode,
        departId: this.departId
      }).then((res) => {
        if (res.code === 201) return;
        this.inDetailPlanTableData = res.data.records;
        this.inDetailPagination.total = res.data.total;
        this.currentRow = this.inDetailPlanTableData.find(
          (item) => item.id == id
        );
        this.editKey += 1;
      });
      console.log("刷新", this.currentRow);
    },
    // å¹´åº¦è®¡åˆ’明细表-下载
    downLoadInDetail(row) {
      exportPersonTrainingRecord({ id: row.id }).then((res) => {
        this.outLoading = false;
        const blob = new Blob([res], { type: "application/msword" });
        this.$download.saveAs(blob, row.courseCode + "人员培训与考核记录" + ".docx")
      });
    },
    // å¹´åº¦è®¡åˆ’明细表-多选
    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(() => {
            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("请选择需要删除的数据");
      }
    },
    paginationmethod0({ page, limit }) {
      this.inDetailPagination.current = page;
      this.inDetailPagination.size = limit;
      this.getYearPlanList(this.departId);
    },
  },
  watch: {
    // ç›‘听点击el-tree的数据,进行数据刷新
    departId: {
      handler(newId, oldId) {
        this.currentPlanId = null;
        if (this.isDepartment) {
          console.log("主");
          this.getYearPlanList(newId);
        } else {
          this.getInDetailPlan("");
        }
      },
    },
    activeName: {
      handler(newValue, oldValue) {
        this.getInDetailPlan(this.currentRowId);
      },
    },
  },
};
</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>
src/views/CNAS/personnel/personnelInfo/Department/components/Plan/Add.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
<template>
    <div class="add">
        <el-dialog :title="isEdit ? '编辑监督计划明细' : '新增监督计划明细'" :visible.sync="dialogVisible" width="800px">
            <el-form ref="formRef" :model="ruleForm" :rules="rules" label-width="100px">
                <el-col :span="12">
                    <el-form-item label="监督日期" prop="superviseDate">
                        <el-date-picker v-model="ruleForm.superviseDate" format="yyyy-MM-dd" placeholder="选择日期"
                            style="width: 100%;" type="date" value-format="yyyy-MM-dd"></el-date-picker>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="监督目的" prop="superviseDes">
                        <el-input v-model="ruleForm.superviseDes"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="监督项目" prop="superviseProject">
                        <el-input v-model="ruleForm.superviseProject"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="12">
                    <el-form-item label="被监督人" prop="supervisePerson">
                        <el-input v-model="ruleForm.supervisePerson"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="监督原因" prop="superviseReason">
                        <el-input v-model="ruleForm.superviseReason"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="24">
                    <el-form-item label="备注" prop="remarks">
                        <el-input v-model="ruleForm.remarks"></el-input>
                    </el-form-item>
                </el-col>
            </el-form>
            <div slot="footer" class="foot">
                <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
                <el-button :loading="loading" type="primary" @click="submitForm">ç¡® å®š</el-button>
            </div>
        </el-dialog>
    </div>
</template>
<script>
import {
    yearPlanDetailAdd,
    yearPlanDetailEdit
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    props: {
        planId: {
            type: Number,
            default: undefined
        }
    },
    data() {
        return {
            loading: false,
            isEdit: false,
            dialogVisible: false,
            ruleForm: {
                id: undefined,
                superviseDate: undefined, // ç›‘督日期
                superviseDes: undefined, // ç›‘督目的
                superviseProject: undefined, // ç›‘督项目
                supervisePerson: undefined, // è¢«ç›‘督人
                superviseReason: undefined, // ç›‘督原因
                remarks: undefined, // å¤‡æ³¨
            },
            rules: {
                superviseDate: [{ required: true, message: '请选择日期', trigger: 'change' }],
                superviseDes: [{ required: true, message: '请输入监督目的', trigger: 'blur' }],
                superviseProject: [{ required: true, message: '请输入监督项目', trigger: 'blur' }],
                supervisePerson: [{ required: true, message: '请输入被监督人', trigger: 'blur' }],
                superviseReason: [{ required: true, message: '请输入监督原因', trigger: 'blur' }],
            }
        }
    },
    methods: {
        formatForm(row) {
            this.ruleForm.id = undefined
            this.ruleForm.planId = row.planId
            this.ruleForm.superviseDate = undefined
            this.ruleForm.superviseDes = undefined
            this.ruleForm.superviseProject = undefined
            this.ruleForm.supervisePerson = undefined
            this.ruleForm.superviseReason = undefined
            this.ruleForm.remarks = undefined
        },
        renderForm(row) {
            this.ruleForm.id = row.id
            this.ruleForm.superviseDate = row.superviseDate
            this.ruleForm.superviseDes = row.superviseDes
            this.ruleForm.superviseProject = row.superviseProject
            this.ruleForm.supervisePerson = row.supervisePerson
            this.ruleForm.superviseReason = row.superviseReason
            this.ruleForm.remarks = row.remarks
        },
        showDialog(row, type) {
            console.log(row)
            if (type) {
                this.isEdit = true
                this.renderForm(row)
            } else {
                this.formatForm(row)
                this.isEdit = false
            }
            this.dialogVisible = true
        },
        closeDialog() {
            this.dialogVisible = false
        },
        async addYearDetail() {
            const { code, data } = await yearPlanDetailAdd(this.ruleForm)
            this.loading = false
            if (code == 200) {
                this.$message({
                    type: 'success',
                    message: '新增成功'
                })
                this.closeDialog()
                this.$emit('submit')
            } else {
                this.$message({
                    type: 'error',
                    message: '新增失败'
                })
            }
        },
        async editYearDetail() {
            const { code, data } = await yearPlanDetailEdit(this.ruleForm)
            this.loading = false
            if (code == 200) {
                this.$message({
                    type: 'success',
                    message: '编辑成功'
                })
                this.closeDialog()
                this.$emit('submit')
            } else {
                this.$message({
                    type: 'error',
                    message: '编辑失败'
                })
            }
        },
        submitForm() {
            this.$refs.formRef.validate((valid) => {
                if (valid) {
                    this.loading = true
                    if (this.isEdit) {
                        this.editYearDetail()
                    } else {
                        this.addYearDetail()
                    }
                } else {
                    return false;
                }
            })
        },
    }
}
</script>
<style scoped>
.foot {
    width: 100%;
}
.add>>>.el-dialog__footer {
    padding-right: 20px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Plan/UploadExcel.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,44 @@
<template>
    <div>
        <el-upload ref="upload" action="#" :before-upload="beforeUpload" :http-request="uploadFile"
            :file-list="fileList" :on-success="uploadFileSuccess" accept=".xls, .xlsx" :limit="1" :auto-upload="true"
            :show-file-list="false">
            <el-button size="small" type="primary">导入</el-button>
        </el-upload>
    </div>
</template>
<script>
import {
    yearPlanDetailImport
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    data() {
        return {
            fileList: []
        }
    },
    methods: {
        /**
         * @desc ä¸Šä¼ æ–‡ä»¶
         */
        beforeUpload(file) {
            this.fileList = [file]
        },
        /**
         * @desc ä¸Šä¼ è‡³æœåС噍
         */
        async uploadFile() {
            console.log('文件', this.fileList[0])
            let formData = new FormData()
            formData.append('file', this.fileList[0])
            const { code, data } = await yearPlanDetailImport(formData)
            if (code == 200) {
                this.$emit('upload')
            }
        },
        uploadFileSuccess() {
            this.$refs.upload.clearFiles()
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Plan/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,484 @@
<template>
    <div class="flex_column">
        <div>
            <TableCard title="年度计划表">
                <template v-slot:form>
                    <div class="items_center">
                        <span>编制人</span>
                        <el-input v-model="yearForm.organizationPerson" class="search" placeholder="请输入"
                            size="small"></el-input>
                        <el-button size="small" type="primary" @click="getYearPlanList">查询</el-button>
                        <el-button size="small" @click="clearYear">清空</el-button>
                    </div>
                    <!-- <UploadExcel v-if="isShowButton" @upload="getYearPlanList"></UploadExcel> -->
                    <el-upload ref="upload" v-if="isShowButton" :action="action" :data="uploadData"
                        :headers="uploadHeader" :before-upload="beforeUpload" :on-success="onSuccess">
                        <el-button size="small" type="primary">导入</el-button>
                    </el-upload>
                </template>
                <template v-slot:table>
                    <limsTable ref="yearTable" :column="yearColumnData" :height="'calc(100vh - 38em)'"
                        :highlightCurrentRow="true" :rowClick="rowClick" :table-data="yearTableData"
                        :table-loading="yearLoading" style="margin-top: 0.5em;
                        padding: 0 15px;" :page="yearPage" @pagination="yearPagination">
                    </limsTable>
                </template>
            </TableCard>
        </div>
        <div style="width: 100%; height: 0.5em; background-color: #f5f7fb;"></div>
        <div>
            <TableCard title="年度计划明细表">
                <template v-slot:form>
                    <div class="items_center">
                        <span>监督日期</span>
                        <el-date-picker v-model="yearDetailForm.date" class="date_box" format="yyyy-MM-dd"
                            placeholder="选择日期" size="small" type="date" value-format="yyyy-MM-dd">
                        </el-date-picker>
                        <span>监督项目</span>
                        <el-input v-model="yearDetailForm.project" class="search" placeholder="请输入"
                            size="small"></el-input>
                        <el-button size="small" type="primary" @click="getYearDetailPlanList">查询</el-button>
                        <el-button size="small" @click="clearDetail">清空</el-button>
                    </div>
                    <div>
                        <el-button v-if="isOperation" size="small" type="primary"
                            @click="showDialog('add')">新增</el-button>
                    </div>
                </template>
                <template v-slot:table>
                    <limsTable :column="yearDetailColumnData" :height="'calc(100vh - 38em)'"
                        :table-data="yearDetailTableData" :table-loading="yearDetailLoading"
                        style="margin-top: 18px; padding: 0 15px;" :page="yearDeatilPage"
                        @pagination="yearDeatilPagination">
                    </limsTable>
                </template>
            </TableCard>
        </div>
        <PlanAdd ref="planModal" :planId="planId" @submit="handleForm"></PlanAdd>
    </div>
</template>
<script>
import TableCard from '@/components/TableCard/index.vue';
import PlanAdd from "./Add.vue"
import limsTable from "@/components/Table/lims-table.vue";
import UploadExcel from "./UploadExcel.vue"
import {
    yearPlanList,
    yearPlanDetailList,
    yearPlanDel,
    yearPlanDetailDel,
    yearPlanDetailApproval,
    exportSuperVisePlan
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    props: {
        departId: {
            type: Number,
            default: null
        }
    },
    components: {
        TableCard,
        PlanAdd,
        limsTable,
        UploadExcel
    },
    data() {
        return {
            uploadData: {},
            isShowButton: false,
            planId: undefined,
            yearForm: {
                organizationPerson: undefined,
            },
            yearTableData: [],  // å¹´è¡¨
            yearPage: {
                curent: 1,
                pageSize: 20,
                total: 0
            },
            yearColumnData: [
                {
                    label: '文件名称',
                    prop: 'fileName',
                    minWidth: '150px'
                }, {
                    label: '编制人',
                    prop: 'organizationPersonName',
                    minWidth: '100'
                }, {
                    label: '编制日期',
                    prop: 'organizationDate',
                    minWidth: '160'
                }, {
                    label: '批准人',
                    prop: 'approvalName',
                    minWidth: '100'
                }, {
                    label: '批准日期',
                    prop: 'approvalDate',
                    minWidth: '160'
                }, {
                    label: '审核人',
                    prop: 'examine'
                }, {
                    dataType: 'tag',
                    label: '批准状态',
                    prop: 'approvalStatus',
                    minWidth: '130',
                    formatData: (params) => {
                        if (params == 1) {
                            return '批准'
                        } else {
                            return '不批准'
                        }
                    },
                    formatType: (params) => {
                        if (params == 1) {
                            return 'success'
                        } else {
                            return 'danger'
                        }
                    }
                }, {
                    label: '创建日期',
                    prop: 'createTime',
                    minWidth: '160'
                }, {
                    label: '创建人',
                    prop: 'createName',
                    minWidth: '100'
                }, {
                    dataType: 'action',
                    minWidth: '160',
                    label: '操作',
                    fixed: 'right',
                    operation: [
                        {
                            name: '导出',
                            type: 'text',
                            clickFun: (row) => {
                                this.downLoadPost(row)
                            }
                        },
                        {
                            name: '批准',
                            type: 'text',
                            disabled: (row) => {
                                if (row.approvalStatus == 1 || (row.departId == 18 && ![12, 11, 16].includes(row.currentId)) || (row.departId == 19 && ![35, 41, 16].includes(row.currentId))) {
                                    return true
                                } else {
                                    return false
                                }
                            },
                            clickFun: (row) => {
                                this.approvalYearPlan(row)
                            }
                        },
                        {
                            name: '删除',
                            type: 'text',
                            color: '#f56c6c',
                            clickFun: (row) => {
                                this.delYearPlan(row.id)
                            }
                        }
                    ]
                }],
            yearLoading: false,
            yearDetailForm: {
                date: undefined,
                project: undefined
            },
            yearDetailTableData: [],    // å¹´æ˜Žç»†è¡¨
            yearDeatilPage: {
                curent: 1,
                pageSize: 20,
                total: 0
            },
            yearDetailColumnData: [
                {
                    label: '监督日期',
                    prop: 'superviseDate'
                }, {
                    label: '监督目的',
                    prop: 'superviseDes'
                }, {
                    label: '被监督人员',
                    prop: 'supervisePerson'
                }, {
                    label: '备注',
                    prop: 'remarks'
                }, {
                    label: '培训日期',
                    prop: 'trainDate'
                }, {
                    label: '创建',
                    prop: 'createBy'
                }, {
                    dataType: 'action',
                    width: '180',
                    label: '操作',
                    operation: [
                        {
                            name: '编辑',
                            type: 'text',
                            clickFun: (row) => {
                                this.$refs.planModal.showDialog(row, true)
                            }
                        },
                        {
                            name: '删除',
                            type: 'text',
                            color: '#f56c6c',
                            clickFun: (row) => {
                                this.delYearPlanDetail(row.id)
                            }
                        }
                    ]
                }
            ],
            yearDetailLoading: false,
            isOperation: false,
        }
    },
    mounted() {
        this.getYearPlanList()
        // this.getPower()
        // this.getYearDetailPlanList()
    },
    computed: {
        action() {
            return this.javaApi + '/superVisePlan/yearPlanDetailImport'
        },
    },
    watch: {
        departId(newValue, oldValue) {
            this.getYearPlanList();
        }
    },
    methods: {
        // ä¸Šä¼ å‰çš„钩子
        beforeUpload(file) {
            let list = file.name.split(".")
            let fileName = list[list.length - 1]
            this.$set(this.uploadData, "suffix", fileName)
        },
        // æˆåŠŸä¹‹åŽçš„é’©å­
        onSuccess(response, file, fileList) {
            this.getYearPlanList();
            this.$message.success("导入成功")
            this.$refs.upload.clearFiles()
        },
        getPower() {
            let power = JSON.parse(sessionStorage.getItem('power'))
            let up = false
            for (var i = 0; i < power.length; i++) {
                if (power[i].menuMethod == 'yearPlanDetailImport') {
                    up = true
                }
            }
            if (!up) {
                this.isShowButton = false
            } else {
                this.isShowButton = true
            }
        },
        /**
         * @desc æŸ¥è¯¢å¹´åº¦è®¡åˆ’列表
         */
        async getYearPlanList() {
            this.yearLoading = true
            const { code, data } = await yearPlanList({
                current: this.yearPage.curent,
                size: this.yearPage.pageSize,
                organizationPerson: this.yearForm.organizationPerson,
                departId: this.departId
            })
            if (code == 200) {
                this.yearTableData = data.records
                this.yearPage.total = data.total
                if (this.yearTableData.length > 0) {
                    this.rowClick(this.yearTableData[0])
                } else {
                    this.yearDetailTableData = []
                }
            }
            console.log('主表数据', this.yearTableData);
            this.yearLoading = false
        },
        // å¹´è®¡åˆ’分页
        yearPagination({ page, limit }) {
            this.yearPage.current = page;
            this.yearPage.size = limit;
            this.getYearPlanList();
        },
        // å¹´åº¦è®¡åˆ’表格,点击行数据后刷新详情
        rowClick(row) {
            const now = new Date();
            const currentYear = now.getFullYear();
            if (row.createTime.slice(0, 4) == currentYear) {
                this.isOperation = true;
            } else {
                this.isOperation = false;
            }
            this.planId = row.id
            this.getYearDetailPlanList()
        },
        // æ–°å¢ž|编辑完成后做什么
        handleForm() {
            this.getYearDetailPlanList()
        },
        // æ¸…除年
        clearYear() {
            this.$refs.yearTable.setCurrent()
            this.yearForm.organizationPerson = undefined
            this.getYearPlanList()
        },
        // æ¸…除明细
        clearDetail() {
            this.yearDetailForm.date = undefined
            this.yearDetailForm.project = undefined
            this.getYearDetailPlanList()
        },
        /**
         * @desc æŸ¥è¯¢å¹´åº¦è®¡åˆ’明细
         */
        async getYearDetailPlanList() {
            this.yearDetailLoading = true
            const { code, data } = await yearPlanDetailList({
                planId: this.planId,
                current: this.yearDeatilPage.curent,
                size: this.yearDeatilPage.pageSize,
                date: this.yearDetailForm.date,
                project: this.yearDetailForm.project
            })
            if (code == 200) {
                this.yearDetailTableData = data.records
                this.yearDeatilPage.total = data.total
            }
            this.yearDetailLoading = false
        },
        showDialog(operationType, row, type = false) {
            if (operationType === 'add') {
                if (!this.planId) {
                    this.$message.warning('请选择一条计划进行新增')
                    return
                }
            }
            this.$refs.planModal.showDialog({ planId: this.planId, ...row }, type)
        },
        // å¹´æ˜Žç»†è®¡åˆ’分页
        yearDeatilPagination({ page, limit }) {
            this.yearDeatilPage.current = page;
            this.yearDeatilPage.size = limit;
            this.getYearDetailPlanList();
        },
        // åˆ é™¤å¹´è®¡åˆ’
        delYearPlan(id) {
            this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(async () => {
                const { code } = await yearPlanDel({ id })
                if (code == 200) {
                    this.$message.success('删除成功')
                    this.getYearPlanList()
                    this.getYearDetailPlanList()
                } else {
                    this.$message.error('删除失败')
                }
            })
        },
        // åˆ é™¤å¹´è®¡åˆ’明细
        delYearPlanDetail(id) {
            this.$confirm('此操作将永久删除该文件, æ˜¯å¦ç»§ç»­?', '提示', {
                confirmButtonText: '确定',
                cancelButtonText: '取消',
                type: 'warning'
            }).then(async () => {
                const { code } = await yearPlanDetailDel({ id })
                if (code == 200) {
                    this.$message.success('删除成功')
                    this.getYearDetailPlanList()
                } else {
                    this.$message.error('删除失败')
                }
            })
        },
        // æ‰¹å‡†å¹´åº¦è®¡åˆ’
        approvalYearPlan(row) {
            this.$confirm('确认批准该年度计划?', '提示', {
                confirmButtonText: '批准',
                cancelButtonText: '不批准',
                type: 'info'
            }).then(() => {
                this.approvalYearPlanFun(1, row.id)
            }).catch(action => {
                this.approvalYearPlanFun(0, row.id)
            })
        },
        // å¹´åº¦è®¡åˆ’表-下载
        downLoadPost(row) {
            exportSuperVisePlan({ id: row.id }).then(res => {
                this.outLoading = false
                const blob = new Blob([res], { type: 'application/msword' });
                this.$download.saveAs(blob, row.fileName + '.docx')
            })
        },
        async approvalYearPlanFun(approvalStatus, rowId) {
            const { code } = await yearPlanDetailApproval({
                id: rowId,
                approvalStatus: approvalStatus
            })
            if (code == 200) {
                this.$message.success('操作成功!')
                this.getYearPlanList()
            } else {
                this.$message.error('操作成功!')
            }
        }
    }
}
</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;
    padding: 0 16px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/Add.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,234 @@
<template>
    <div class="add">
        <el-dialog :isEdit="isEdit" :title="isEdit ? '编辑工作监督记录' : '新增工作监督记录'" :visible.sync="dialogVisible" width="800">
            <el-steps v-if="isEdit" :active="active" :align-center="true" finish-status="success">
                <el-step style="cursor: pointer;" title="检测" @click.native="setStep(0)"></el-step>
                <el-step style="cursor: pointer;" title="审批" @click.native="setStep(1)"></el-step>
            </el-steps>
            <SuperviseForm v-show="pageStatus == 0" ref="superviseFormRef" :disabled="active != 0" :departId="departId"
                :isEdit="isEdit" :superviseForm.sync="mainForm.superviseForm" :userList="userList" @addData="addData"
                @close="closeDialog" @submit="submit"></SuperviseForm>
            <ApproveForm v-show="pageStatus == 1" ref="approveFormRef" :approveForm.sync="mainForm.approveForm"
                :disabled="active != 1" :departId="departId" :isEdit="isEdit" :userList="userList" @close="toClose"
                @submit="submit"></ApproveForm>
            <el-result v-show="pageStatus == 2" icon="success" subTitle="处理完成" title="审核完成">
            </el-result>
        </el-dialog>
    </div>
</template>
<script>
import SuperviseForm from './supervise/SuperviseForm.vue'
import ApproveForm from './supervise/ApproveForm.vue'
import {
    selectUserList,
    addOrUpdatePersonSupervisionRecord
} from '@/api/cnas/personnel/personnelInfo.js'
import { dateFormat } from '@/utils/date.js'
export default {
    props: {
        departId: {
            type: Number,
            default: null
        }
    },
    components: {
        SuperviseForm,
        ApproveForm
    },
    data() {
        return {
            active: 0,
            pageStatus: 0,
            isEdit: false,
            dialogVisible: false,
            userList: [],
            id: undefined,
            mainForm: {
                superviseForm: {
                    testerId: undefined,
                    supervisorId: undefined,
                    testItem: undefined,
                    sampleNumber: undefined,
                    detectionDate: undefined,
                    personnel: [],
                    instrumentEquipment: undefined,
                    workingEnvironment: undefined,
                    sampleCollection: undefined,
                    samplePreparation: undefined,
                    testMethod: undefined,
                    testingRecords: undefined,
                    testReport: undefined,
                    evaluationSupervisionSituation: undefined,
                    doNotMeetTheHandlingOpinions: undefined,
                },
                approveForm: {
                    technicalDirector: undefined
                }
            }
        }
    },
    methods: {
        async openDialog(row, type = false) {
            this.dialogVisible = true
            this.isEdit = type
            console.log('type', this.isEdit);
            await this.getUserList()
            if (this.isEdit) {
                // ç¼–辑
                this.loadForm(row)
                this.id = row.id
                console.log(1111);
            } else {
                // æ–°å¢ž
                this.resetForm(row)
                this.id = undefined
                console.log(22222);
            }
            console.log('this.id', this.id);
        },
        /**
         * @desc åŠ è½½è¡¨å•
         */
        loadForm(row) {
            if (row.currentState) {
                this.active = Number(row.currentState)
                this.pageStatus = Number(row.currentState === '2' ? 0 : row.currentState)
            }
            // ç¬¬1æ­¥
            this.mainForm.superviseForm.testerId = row.testerId
            this.mainForm.superviseForm.supervisorId = row.supervisorId
            this.mainForm.superviseForm.testItem = row.testItem
            this.mainForm.superviseForm.sampleNumber = row.sampleNumber
            this.mainForm.superviseForm.detectionDate = row.detectionDate
            // let personList = row.personnel.split(',')
            // this.mainForm.superviseForm.personnel = personList.map(item => {
            //     return Number(item)
            // });
            this.mainForm.superviseForm.personnel = row.personnel
            this.mainForm.superviseForm.instrumentEquipment = row.instrumentEquipment
            this.mainForm.superviseForm.workingEnvironment = row.workingEnvironment
            this.mainForm.superviseForm.sampleCollection = row.sampleCollection
            this.mainForm.superviseForm.samplePreparation = row.samplePreparation
            this.mainForm.superviseForm.testMethod = row.testMethod
            this.mainForm.superviseForm.testingRecords = row.testingRecords
            this.mainForm.superviseForm.testReport = row.testReport
            this.mainForm.superviseForm.evaluationSupervisionSituation = row.evaluationSupervisionSituation
            this.mainForm.superviseForm.doNotMeetTheHandlingOpinions = row.doNotMeetTheHandlingOpinions
            // ç¬¬2æ­¥
            this.mainForm.approveForm.technicalDirector = row.technicalDirector
        },
        /**
         * @desc é‡ç½®è¡¨å•
         */
        resetForm(row) {
            console.log(row)
            this.active = 0
            this.pageStatus = 0
            // ç¬¬1个
            this.mainForm.superviseForm.currentState = undefined
            this.mainForm.superviseForm.testerId = undefined
            this.mainForm.superviseForm.supervisorId = undefined
            this.mainForm.superviseForm.testItem = undefined
            this.mainForm.superviseForm.sampleNumber = undefined
            this.mainForm.superviseForm.detectionDate = undefined
            this.mainForm.superviseForm.personnel = undefined
            this.mainForm.superviseForm.instrumentEquipment = undefined
            this.mainForm.superviseForm.workingEnvironment = undefined
            this.mainForm.superviseForm.sampleCollection = undefined
            this.mainForm.superviseForm.samplePreparation = undefined
            this.mainForm.superviseForm.testMethod = undefined
            this.mainForm.superviseForm.testingRecords = undefined
            this.mainForm.superviseForm.testReport = undefined
            this.mainForm.superviseForm.evaluationSupervisionSituation = undefined
            this.mainForm.superviseForm.doNotMeetTheHandlingOpinions = undefined
            // ç¬¬2个
            this.mainForm.approveForm.technicalDirector = undefined
            console.log('新增', this.mainForm);
        },
        closeDialog() {
            this.dialogVisible = false
        },
        /**
         * @desc èŽ·å–ç”¨æˆ·ä¿¡æ¯
         */
        async getUserList() {
            const { code, data } = await selectUserList()
            if (code == 200) {
                this.userList = data
            }
        },
        /**
         * @desc é©³å›ž
         */
        toClose() {
            this.submitFormApi({
                id: this.id,
                currentState: 0,
            })
        },
        /**
         * @desc æ–°å¢ž
         */
        addData(step) {
            let data = this.setParams(step)
            this.submitFormApi(data)
        },
        /**
         * @desc ç¼–辑
         */
        submit(step) {
            let data = this.setParams(step)
            data.id = this.id
            this.submitFormApi(data)
        },
        // è®¾ç½®å‚æ•°
        setParams(step) {
            if (step == 1) {
                let result = this.mainForm.superviseForm
                result.currentState = this.active + 1
                result.technicalDirectorDate = dateFormat(new Date(), 'YYYY-MM-DD HH:mm:ss')
                return result
            }
            if (step == 2) {
                let result = this.mainForm.approveForm
                result.currentState = this.active + 1
                return result
            }
        },
        // å‘服务器发送表单
        async submitFormApi(data) {
            console.log('接口表单', data)
            // å°†éƒ¨é—¨å¸¦å…¥
            if (data.id == null) {
                data.departLimsId = this.departId
            }
            const { code } = await addOrUpdatePersonSupervisionRecord(data)
            if (code == 200) {
                this.$message.success('操作成功')
                this.dialogVisible = false
                this.$emit('submit')
            }
        },
        setStep(e) {
            this.pageStatus = e
        }
    }
}
</script>
<style scoped>
.foot {
    width: 100%;
}
.add>>>.el-dialog__footer {
    padding-right: 20px;
}
.main_right {
    text-align: left;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/ConditionForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,145 @@
<template>
    <el-form label-width="160px" :model="form" :disabled="disabled" style="position: relative;" size="small">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="部门负责人">
                <el-select v-model="form.departmentHeadId" placeholder="请选择" style="width: 100%">
                    <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="被监督人">
                <el-select v-model="form.supervisedPersonId" placeholder="请选择" style="width: 100%">
                    <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="不符合工作发现途径">
                <el-checkbox-group v-model="form.discoveryApproach">
                    <el-checkbox v-for="(item, index) in checkbox" :key="index" :label="item.value" name="type">{{
                        item.label }}
                    </el-checkbox>
                </el-checkbox-group>
            </el-form-item>
            <el-form-item label="不符合工作的详细记录">
                <el-input v-model="form.notConformDetails" type="textarea" :rows="2" placeholder="请输入内容"></el-input>
            </el-form-item>
            <el-form-item label="不符合的依据及条款号">
                <el-input v-model="form.nonConformityClause" type="textarea" :rows="2" placeholder="请输入内容"></el-input>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style=" display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div v-if="step == 0 || step == 1">
                    <el-button v-if="step == 1" :disabled="false" @click="cancel">驳回</el-button>
                    <el-button :disabled="false" @click="save">保存</el-button>
                    <el-button type="primary" @click="onSubmit"
                        :disabled="(supervisedPersonId != null && userId != supervisedPersonId) ||
                            ((departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId)))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        supervisedPersonId: {
            type: Number,
            default: null
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        disabled: {
            type: Boolean,
            default: false
        },
        userList: {
            type: Array,
            default: () => {
                return []
            }
        },
        step: {
            type: Number,
            default: 0
        },
        condiForm: {
            type: Object,
            default: () => {
                return {}
            }
        }
    },
    computed: {
        form: {
            get() {
                return this.condiForm
            },
            set(val) {
                this.$emit('update:condiForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
            checkbox: [
                {
                    label: '管理评审',
                    value: 0
                }, {
                    label: '内部审核',
                    value: 1
                }, {
                    label: '检测过程控制',
                    value: 2
                }, {
                    label: '内部质量控制',
                    value: 3
                }, {
                    label: '内部监督',
                    value: 4
                }, {
                    label: '外部评审/检查',
                    value: 5
                }, {
                    label: '顾客投诉/意见反馈',
                    value: 6
                }, {
                    label: '其他',
                    value: 7
                }
            ],
        }
    },
    created() {
    },
    methods: {
        onSubmit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/Inform.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
<template>
    <el-form :model="form" label-width="160px" style="position: relative" :disabled="disabled" size="small">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="通知客户">
                <el-radio-group v-model="form.whetherInformCustomer">
                    <el-radio :label="1">是</el-radio>
                    <el-radio :label="2">否</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="恢复工作">
                <el-radio-group v-model="form.whetherResumeWork">
                    <el-radio :label="1">是</el-radio>
                    <el-radio :label="2">否</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="质量负责人">
                <el-select v-model="form.qualitySupervisorId" placeholder="请选择">
                    <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style=" display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div v-if="step == 4">
                    <el-button @click="cancel">驳回</el-button>
                    <el-button type="primary" @click="onSubmit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        disabled: {
            type: Boolean,
            default: false
        },
        userList: {
            type: Array,
            default: []
        },
        step: {
            type: Number,
            default: 0
        },
        inform: {
            type: Object,
            default: () => {
                return {}
            }
        }
    },
    computed: {
        form: {
            get() {
                return this.inform
            },
            set(val) {
                this.$emit('update:inform', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
        }
    },
    created() {
    },
    methods: {
        onSubmit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/MeasureForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,110 @@
<template>
    <el-form :model="form" label-width="200px" style="position: relative;" :disabled="disabled" size="small">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="责任部门">
                <el-select v-model="form.responsibleDepartmentId" placeholder="请选择" @change="filterUserList">
                    <el-option label="通信产品实验室" :value="18"></el-option>
                    <el-option label="电力产品实验室" :value="19"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="责任人">
                <el-select v-model="form.responsibleDepartmentPersonId" placeholder="请选择">
                    <el-option v-for="(item, index) in userListTwo" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="消除不符合工作所采取的措施">
                <el-input v-model="form.treatmentMeasures" type="textarea" :rows="2" placeholder="请输入内容"></el-input>
            </el-form-item>
        </el-card>
        <el-form-item v-if="step == 2" label-width="0px" :disabled="disabled">
            <div style=" display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div>
                    <el-button @click="cancel">驳回</el-button>
                    <el-button type="primary" @click="onSubmit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        disabled: {
            type: Boolean,
            default: false
        },
        userList: {
            type: Array,
            default: []
        },
        step: {
            type: Number,
            default: 0
        },
        handleForm: {
            type: Object,
            default: () => {
                return {}
            }
        }
    },
    computed: {
        form: {
            get() {
                return this.handleForm
            },
            set(val) {
                this.$emit('update:handleForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
            userListTwo: []
        }
    },
    mounted() {
        this.userListTwo = JSON.parse(JSON.stringify(this.userList))
    },
    created() {
    },
    methods: {
        filterUserList() {
            this.userListTwo = this.userList.filter(item => item.departLimsId.includes(this.form.responsibleDepartmentId))
            if (!this.userListTwo.some(item => item.id == this.form.responsibleDepartmentPersonId)) {
                this.form.responsibleDepartmentPersonId = null
            }
        },
        onSubmit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/Step/RectifyForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
<template>
    <el-form :model="form" label-width="160px" style="position: relative" :disabled="disabled" size="small">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="是否需要采取纠正措施">
                <el-radio-group v-model="form.correctiveMeasure">
                    <el-radio :label="1">是</el-radio>
                    <el-radio :label="2">否</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="纠正措施处理单跟踪">
                <el-radio-group v-model="form.correctiveMeasureFollowTracks">
                    <el-radio :label="1">是</el-radio>
                    <el-radio :label="2">否</el-radio>
                </el-radio-group>
            </el-form-item>
            <el-form-item label="技术负责人">
                <el-select v-model="form.correctiveMeasurePersonId" placeholder="请选择">
                    <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style=" display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div v-if="step == 3">
                    <el-button @click="cancel">驳回</el-button>
                    <el-button type="primary" @click="onSubmit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        disabled: {
            type: Boolean,
            default: false
        },
        userList: {
            type: Array,
            default: []
        },
        step: {
            type: Number,
            default: 0
        },
        rectifyForm: {
            type: Object,
            default: () => {
                return {}
            }
        }
    },
    computed: {
        form: {
            get() {
                return this.rectifyForm
            },
            set(val) {
                this.$emit('update:rectifyForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
        }
    },
    methods: {
        onSubmit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/control/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,312 @@
<template>
    <div>
        <el-dialog :visible.sync="dialogVisible" title="不符合工作控制单">
            <el-steps :active="active" :align-center="true" finish-status="success">
                <el-step v-for="(item, index) in stepList" :key="index" :title="item.label" style="cursor: pointer;"
                    @click.native="setStep(item.value)"></el-step>
            </el-steps>
            <el-divider></el-divider>
            <ConditionForm v-if="pageStatus == 0" :departId="departId" :isPermission="isPermission"
                :supervisedPersonId="mainForm.condiForm.supervisedPersonId" :condiForm.sync="mainForm.condiForm"
                :currentResponsible="currentResponsible" :disabled="active != 0" :step="active" :userList="userList"
                @nextStep="submit"></ConditionForm>
            <ConditionForm v-if="pageStatus == 1" :departId="departId" :isPermission="isPermission"
                :supervisedPersonId="mainForm.condiForm.supervisedPersonId" :condiForm.sync="mainForm.condiForm"
                :currentResponsible="currentResponsible" :disabled="true" :step="active" :userList="userList"
                @cancel="cancel" @nextStep="submit"></ConditionForm>
            <MeasureForm v-if="pageStatus == 2" :departId="departId" :isPermission="isPermission"
                :currentResponsible="currentResponsible" :disabled="active != 2" :handleForm.sync="mainForm.handleForm"
                :step="active" :userList="userList" @cancel="cancel" @nextStep="submit"></MeasureForm>
            <RectifyForm v-if="pageStatus == 3" :departId="departId" :isPermission="isPermission"
                :currentResponsible="currentResponsible" :disabled="active != 3"
                :rectifyForm.sync="mainForm.rectifyForm" :step="active" :userList="userList" @cancel="cancel"
                @nextStep="submit"></RectifyForm>
            <Inform v-if="pageStatus == 4" :departId="departId" :isPermission="isPermission" :disabled="active != 4"
                :inform.sync="mainForm.inform" :step="active" :userList="userList" @cancel="cancel" @nextStep="submit">
            </Inform>
            <el-result v-if="pageStatus == 5" icon="success" subTitle="处理完成" title="审核完成">
            </el-result>
        </el-dialog>
    </div>
</template>
<script>
import ConditionForm from './Step/ConditionForm.vue'
import MeasureForm from './Step/MeasureForm.vue'
import RectifyForm from './Step/RectifyForm.vue'
import Inform from './Step/Inform.vue'
import {
    selectUserList,
    personSupervisionControlSheetPage,
    addOrUpdatePersonSupervisionControl
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
    },
    components: {
        ConditionForm, MeasureForm, RectifyForm, Inform
    },
    data() {
        return {
            isPermission: true,
            supervisedPersonId: null,
            active: 0,
            pageStatus: 0,
            dialogVisible: false,
            currentResponsible: undefined,
            stepList: [{
                label: '工作情况',
                value: 0
            }, {
                label: '被监督人确认',
                value: 1
            }, {
                label: '处理措施',
                value: 2
            }, {
                label: '纠正措施',
                value: 3
            }, {
                label: '通知客户',
                value: 4
            }
            ],
            supervisionRecordId: undefined,
            controlId: undefined,
            mainForm: {
                condiForm: {
                    departmentHeadId: undefined,
                    supervisedPersonId: undefined,
                    discoveryApproach: [],
                    notConformDetails: undefined,
                    nonConformityClause: undefined,
                    departLimsId: undefined
                },
                handleForm: {
                    responsibleDepartmentPersonId: undefined,
                    treatmentMeasures: undefined,
                    departLimsId: undefined
                },
                rectifyForm: {
                    correctiveMeasure: undefined,
                    correctiveMeasureFollowTracks: undefined,
                    correctiveMeasurePersonId: undefined,
                    departLimsId: undefined
                },
                inform: {
                    whetherInformCustomer: undefined,
                    whetherResumeWork: undefined,
                    qualitySupervisorId: undefined,
                    departLimsId: undefined
                }
            },
            userList: [],
            controlType: undefined
        }
    },
    mounted() {
        this.isPermission = isPermission("isSubmit")
        console.log('权限', this.isPermission);
    },
    methods: {
        /**
         * @desc åˆå§‹åŒ–表单
         */
        initForm() {
            this.mainForm.condiForm.departmentHeadId = undefined
            this.mainForm.condiForm.supervisedPersonId = undefined
            this.mainForm.condiForm.discoveryApproach = []
            this.mainForm.condiForm.notConformDetails = undefined
            this.mainForm.condiForm.nonConformityClause = undefined
            this.mainForm.condiForm.departLimsId = undefined
            this.mainForm.handleForm.responsibleDepartmentPersonId = undefined
            this.mainForm.handleForm.treatmentMeasures = undefined
            this.mainForm.handleForm.departLimsId = undefined
            this.mainForm.rectifyForm.correctiveMeasure = undefined
            this.mainForm.rectifyForm.correctiveMeasureFollowTracks = undefined
            this.mainForm.rectifyForm.correctiveMeasurePersonId = undefined
            this.mainForm.rectifyForm.departLimsId = undefined
            this.mainForm.inform.whetherInformCustomer = undefined
            this.mainForm.inform.whetherResumeWork = undefined
            this.mainForm.inform.qualitySupervisorId = undefined
            this.mainForm.inform.departLimsId = undefined
        },
        /**
         * @desc æ‰“开模态框
         * @param {监督记录id} id
         */
        openDialog(id) {
            this.dialogVisible = true
            this.getUserList()
            this.getControlData(id)
        },
        /**
         * @desc èŽ·å–ç”¨æˆ·ä¿¡æ¯
         */
        async getUserList() {
            const { code, data } = await selectUserList()
            if (code == 200) {
                this.userList = data
            }
        },
        /**
         * @desc æŸ¥è¯¢ç›‘督记录控制单
         * @param {监督记录id} id
         */
        async getControlData(id) {
            const { code, data } = await personSupervisionControlSheetPage({ id })
            if (code == 202) {
                this.controlType = '新增'
                this.supervisionRecordId = id
                this.active = 0
                this.pageStatus = 0
                this.controlId = undefined
                this.initForm()
            }
            if (code == 200) {
                this.currentResponsible = data.currentResponsible
                this.controlType = '编辑'
                this.controlId = data.id
                this.active = Number(data.currentState)
                this.pageStatus = Number(data.currentState === 4 ? 0 : data.currentState)
                // ç¬¬1、2步数据
                this.mainForm.condiForm.departmentHeadId = data.departmentHeadId
                this.mainForm.condiForm.supervisedPersonId = data.supervisedPersonId
                this.mainForm.condiForm.notConformDetails = data.notConformDetails
                this.mainForm.condiForm.nonConformityClause = data.nonConformityClause
                this.mainForm.condiForm.departLimsId = data.departLimsId
                // ç¬¬3步数据
                this.mainForm.handleForm.responsibleDepartmentPersonId = data.responsibleDepartmentPersonId
                this.mainForm.handleForm.treatmentMeasures = data.treatmentMeasures
                this.mainForm.handleForm.departLimsId = data.departLimsId
                // ç¬¬4步数据
                this.mainForm.rectifyForm.correctiveMeasure = data.correctiveMeasure
                this.mainForm.rectifyForm.correctiveMeasureFollowTracks = data.correctiveMeasureFollowTracks
                this.mainForm.rectifyForm.correctiveMeasurePersonId = data.correctiveMeasurePersonId
                this.mainForm.rectifyForm.departLimsId = data.departLimsId
                // ç¬¬5步数据
                this.mainForm.inform.whetherInformCustomer = data.whetherInformCustomer
                this.mainForm.inform.whetherResumeWork = data.whetherResumeWork
                this.mainForm.inform.qualitySupervisorId = data.qualitySupervisorId
                this.mainForm.inform.departLimsId = data.departLimsId
                this.supervisionRecordId = data.supervisionRecordId
                this.supervisedPersonId = data.supervisedPersonId
            }
        },
        submit(type) {
            let currentState = undefined
            if (type == 'submit') {
                currentState = this.active + 1
            } else if (type == 'save') {
                currentState = undefined
            }
            if (this.active == 0) {
                let { discoveryApproach, ...condiFormRest } = this.mainForm.condiForm
                let approcahStr = discoveryApproach.join(',')
                this.submitForm({
                    id: this.controlId,
                    supervisionRecordId: this.supervisionRecordId,
                    discoveryApproach: approcahStr,
                    currentState: currentState,
                    discovererDate: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
                    ...condiFormRest
                })
            }
            if (this.active == 1) {
                let { discoveryApproach, ...condiFormRest } = this.mainForm.condiForm
                let approcahStr = discoveryApproach.join(',')
                this.submitForm({
                    id: this.controlId,
                    supervisionRecordId: this.supervisionRecordId,
                    discoveryApproach: approcahStr,
                    currentState: currentState,
                    supervisedPersonDate: this.$moment().format('YYYY-MM-DD'),
                    ...condiFormRest
                })
            }
            if (this.active == 2) {
                let { handleForm } = this.mainForm
                this.submitForm({
                    id: this.controlId,
                    supervisionRecordId: this.supervisionRecordId,
                    currentState: currentState,
                    responsibleDepartmentDate: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
                    ...handleForm
                })
            }
            if (this.active == 3) {
                let { rectifyForm } = this.mainForm
                this.submitForm({
                    id: this.controlId,
                    supervisionRecordId: this.supervisionRecordId,
                    currentState: currentState,
                    correctiveMeasureDate: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
                    ...rectifyForm
                })
            }
            if (this.active == 4) {
                let { inform } = this.mainForm
                this.submitForm({
                    id: this.controlId,
                    supervisionRecordId: this.supervisionRecordId,
                    currentState: currentState,
                    qualitySupervisorDate: this.$moment().format('YYYY-MM-DD HH:mm:ss'),
                    ...inform
                })
            }
        },
        /**
         * @desc æäº¤è¡¨å•
         */
        async submitForm(form) {
            let user = JSON.parse(localStorage.getItem('user'));
            form.responsibleDepartmentId = Number(form.responsibleDepartmentId)
            const { code } = await addOrUpdatePersonSupervisionControl({
                currentResponsible: user.name,
                ...form
            })
            if (this.controlType == '新增') {
                if (code == 200) {
                    this.$message.success('提交成功')
                }
            } else if (this.controlType == '编辑') {
                if (code == 200) {
                    this.$message.success('提交成功')
                }
            }
            this.$emit('getTableData')
            this.dialogVisible = false
        },
        /**
         * @desc é©³å›ž
         */
        cancel() {
            let currentState = this.active - 1
            this.submitForm({
                id: this.controlId,
                supervisionRecordId: this.supervisionRecordId,
                currentState: currentState,
            })
        },
        setStep(e) {
            this.pageStatus = e
        }
    }
}
</script>
<style scoped>
.dialog-footer {
    width: 100%;
}
>>>.el-dialog__footer {
    padding-right: 20px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Fact.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,108 @@
<template>
    <el-form :model="form" :disabled="disabled" label-width="140px" size="small" style="position: relative">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="提出部门">
                <!-- <el-select
                    v-model="form.proposingDepartment"
                    placeholder="请选择"
                    style="width: 100%"
                >
                    <el-option label="通信产品实验室" :value="18"></el-option>
                    <el-option label="电力产品实验室" :value="19"></el-option>
                </el-select> -->
                <el-input :disabled="true" v-model="form.proposingDepartment"></el-input>
            </el-form-item>
            <el-form-item label="人员选择">
                <el-select v-model="form.proposingDepartmentPersonId" placeholder="请选择" style="width: 100%">
                    <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="不合格或偏离描述">
                <el-input type="textarea" v-model="form.descriptionNonconformity" :rows="2" placeholder="请输入内容">
                </el-input>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style="display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div v-if="step == 0">
                    <el-button :disabled="false" @click="cancel">驳回</el-button>
                    <el-button @click="save">保存</el-button>
                    <el-button type="primary" @click="submit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        factForm: {
            type: Object,
            default: () => {
                return {}
            }
        },
        userList: {
            type: Array,
            default: []
        },
        step: {
            type: Number,
            default: 0
        },
        disabled: {
            type: Boolean,
            default: false
        }
    },
    computed: {
        form: {
            get() {
                this.$set(this.factForm, 'proposingDepartment', '监督员')
                return this.factForm
            },
            set(val) {
                this.$emit('update:factForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
        }
    },
    methods: {
        submit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Measure.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,121 @@
<template>
    <el-form :model="form" :disabled="disabled" label-width="130px" size="small" style="position: relative">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="责任部门">
                <!-- <el-select v-model="form.correctiveActionId" placeholder="请选择">
                    <el-option
                        v-for="(item, index) in userList"
                        :key="index"
                        :label="item.name"
                        :value="item.id"
                    ></el-option>
                </el-select> -->
                <el-select @change="filterUserList" v-model="form.causeAnalysisId" placeholder="请选择"
                    style="width: 100%">
                    <el-option label="通信产品实验室" :value="18"></el-option>
                    <el-option label="电力产品实验室" :value="19"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="责任人">
                <el-select v-model="form.correctiveActionId" placeholder="请选择">
                    <el-option v-for="(item, index) in userListTwo" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="纠正措施">
                <el-input type="textarea" v-model="form.correctiveMeasure" :rows="2" placeholder="请输入内容">
                </el-input>
            </el-form-item>
            <el-form-item label="提出要求部门确认">
                <el-input type="textarea" v-model="form.requestDepartmentConfirmation" :rows="2" placeholder="请输入内容">
                </el-input>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style="display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div v-if="step == 2">
                    <el-button :disabled="false" @click="cancel">驳回</el-button>
                    <el-button type="primary" @click="submit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        measureForm: {
            type: Object,
            default: {}
        },
        userList: {
            type: Array,
            default: []
        },
        step: {
            type: Number,
            default: 0
        },
        disabled: {
            type: Boolean,
            default: false
        }
    },
    computed: {
        form: {
            get() {
                return this.measureForm
            },
            set(val) {
                this.$emit('update:measureForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
            userListTwo: []
        }
    },
    mounted() {
        this.userListTwo = JSON.parse(JSON.stringify(this.userList))
        console.log('this.userListTwo', this.userListTwo);
    },
    methods: {
        filterUserList() {
            this.userListTwo = this.userList.filter(item => item.departLimsId.includes(this.form.causeAnalysisId))
            if (!this.userListTwo.some(item => item.id == this.form.correctiveActionId)) {
                this.form.correctiveActionId = null
            }
        },
        submit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Reason.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,122 @@
<template>
    <el-form :model="form" :disabled="disabled" label-width="140px" size="small" style="position: relative;">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="责任部门">
                <!-- <el-select
                    v-model="form.causeAnalysisPersonId"
                    placeholder="请选择"
                    style="width: 100%"
                >
                    <el-option
                        v-for="(item, index) in userList"
                        :key="index"
                        :label="item.name"
                        :value="item.id"
                    ></el-option>
                </el-select> -->
                <el-select @change="filterUserList" v-model="form.causeAnalysisId" placeholder="请选择"
                    style="width: 100%">
                    <el-option label="通信产品实验室" :value="18"></el-option>
                    <el-option label="电力产品实验室" :value="19"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="人员选择">
                <el-select v-model="form.causeAnalysisPersonId" placeholder="请选择" style="width: 100%">
                    <el-option v-for="(item, index) in userListTwo" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="原因分析">
                <el-input type="textarea" v-model="form.causeAnalysis" :rows="2" placeholder="请输入内容">
                </el-input>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style="display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    <span>操作人:{{ currentResponsible }}</span>
                </div>
                <div v-if="step == 1">
                    <el-button :disabled="false" @click="cancel">驳回</el-button>
                    <el-button type="primary" @click="submit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        userList: {
            type: Array,
            default: []
        },
        reasonForm: {
            type: Object,
            default: {}
        },
        step: {
            type: Number,
            default: 0
        },
        disabled: {
            type: Boolean,
            default: false
        }
    },
    computed: {
        form: {
            get() {
                return this.reasonForm
            },
            set(val) {
                this.$emit('update:reasonForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
            userListTwo: []
        }
    },
    mounted() {
        this.userListTwo = JSON.parse(JSON.stringify(this.userList))
    },
    methods: {
        filterUserList() {
            this.userListTwo = this.userList.filter(item => item.departLimsId.includes(this.form.causeAnalysisId))
            if (!this.userListTwo.some(item => item.id == this.form.causeAnalysisPersonId)) {
                this.form.causeAnalysisPersonId = null
            }
        },
        submit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/Step/Result.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
<template>
    <el-form :model="form" :disabled="disabled" label-width="130px" size="small" style="position: relative">
        <el-card :body-style="{ height: '350px', overflow: 'auto' }">
            <el-form-item label="验证部门">
                <!-- <el-select
                v-model="form.verificationDepartmentPersonId"
                placeholder="请选择"
                style="width: 100%"
            >
                <el-option
                    v-for="(item, index) in userList"
                    :key="index"
                    :label="item.name"
                    :value="item.id"
                ></el-option>
            </el-select> -->
                <el-input :disabled="true" v-model="form.verificationDepartment"></el-input>
            </el-form-item>
            <el-form-item label="人员选择">
                <el-select v-model="form.verificationDepartmentPersonId" placeholder="请选择" style="width: 100%">
                    <el-option v-for="(item, index) in userList" :key="index" :label="item.name"
                        :value="item.id"></el-option>
                </el-select>
            </el-form-item>
            <el-form-item label="实施验证结果">
                <el-input type="textarea" v-model="form.implementationVerificationResults" :rows="2"
                    placeholder="请输入内容">
                </el-input>
            </el-form-item>
        </el-card>
        <el-form-item label-width="0">
            <div style="display: flex; width: 100%; justify-content: space-between; margin-top: 15px;">
                <div>
                    æ“ä½œäººï¼š{{ currentResponsible }}
                </div>
                <div v-if="step == 3">
                    <el-button :disabled="false" @click="cancel">驳回</el-button>
                    <el-button type="primary" @click="submit"
                        :disabled="(departId == 18 && ![12, 10, 16].includes(userId)) || (departId == 19 && ![35, 41, 16].includes(userId))">提交</el-button>
                </div>
            </div>
        </el-form-item>
    </el-form>
</template>
<script>
import { mapGetters } from "vuex";
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
        isPermission: {
            type: Boolean,
            default: false,
        },
        currentResponsible: {
            type: String,
            default: ''
        },
        resultForm: {
            type: Object,
            default: {}
        },
        step: {
            type: Number,
            default: 0
        },
        disabled: {
            type: Boolean,
            default: false
        },
        userList: {
            type: Array,
            default: []
        },
    },
    computed: {
        form: {
            get() {
                this.$set(this.resultForm, 'verificationDepartment', '质量负责人')
                return this.resultForm
            },
            set(val) {
                this.$emit('update:resultForm', val)
            }
        },
        ...mapGetters(["userId"]),
    },
    data() {
        return {
        }
    },
    methods: {
        submit() {
            this.$emit('nextStep', 'submit')
        },
        save() {
            this.$emit('nextStep', 'save')
        },
        cancel() {
            this.$emit('cancel', 'cancel')
        }
    }
}
</script>
<style scoped></style>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/dispose/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,239 @@
<template>
    <div>
        <el-dialog title="纠错处理单" :visible.sync="dialogVisible">
            <el-steps :active="active" finish-status="success" :align-center="true">
                <el-step style="cursor: pointer;" v-for="(item, index) in stepList" :key="index" :title="item.label"
                    @click.native="setStep(item.value)"></el-step>
            </el-steps>
            <el-divider></el-divider>
            <Fact v-if="pageStatus == 0" :departId="departId" :isPermission="isPermission"
                :factForm.sync="mainForm.factForm" :userList="userList" :currentResponsible="currentResponsible"
                :disabled="active != 0" :step="active" @nextStep="submit" @cancel="cancel"></Fact>
            <Reason v-if="pageStatus == 1" :isPermission="isPermission" :departId="departId"
                :reasonForm.sync="mainForm.reasonForm" :userList="userList" :currentResponsible="currentResponsible"
                :disabled="active != 1" :step="active" @nextStep="submit" @cancel="cancel"></Reason>
            <Measure v-if="pageStatus == 2" :departId="departId" :isPermission="isPermission"
                :measureForm.sync="mainForm.measureForm" :userList="userList" :currentResponsible="currentResponsible"
                :disabled="active != 2" :step="active" @nextStep="submit" @cancel="cancel"></Measure>
            <Result v-if="pageStatus == 3" :departId="departId" :isPermission="isPermission"
                :resultForm.sync="mainForm.resultForm" :userList="userList" :currentResponsible="currentResponsible"
                :disabled="active != 3" :step="active" @nextStep="submit" @cancel="cancel"></Result>
            <!-- <div slot="footer" class="dialog-footer">
                <el-button v-if="active == 4" type="primary" @click="submit(5)">完成</el-button>
            </div> -->
        </el-dialog>
    </div>
</template>
<script>
import Fact from './Step/Fact.vue'
import Reason from './Step/Reason.vue'
import Measure from './Step/Measure.vue'
import Result from './Step/Result.vue'
import { dateFormat } from '@/utils/date.js'
import {
    selectUserList,
    personSupervisionProcessingPage,
    addOrUpdatePersonnelServiceProcessing
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    props: {
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
    },
    components: {
        Fact, Reason, Measure, Result
    },
    data() {
        return {
            isPermission: true,
            active: 0,
            pageStatus: 0,
            dialogVisible: false,
            currentResponsible: undefined,
            stepList: [
                {
                    label: '问题描述',
                    value: 0
                }, {
                    label: '原因分析',
                    value: 1
                }, {
                    label: '纠正措施',
                    value: 2
                }, {
                    label: '验证结果',
                    value: 3
                }
            ],
            supervisionRecordId: undefined,
            processId: undefined,
            mainForm: {
                factForm: {
                    proposingDepartmentPersonId: undefined,
                    descriptionNonconformity: undefined
                },
                reasonForm: {
                    causeAnalysisPersonId: undefined,
                    causeAnalysis: undefined
                },
                measureForm: {
                    correctiveActionId: undefined,
                    correctiveMeasure: undefined,
                    requestDepartmentConfirmation: undefined
                },
                resultForm: {
                    verificationDepartmentPersonId: undefined,
                    implementationVerificationResults: undefined
                }
            },
            userList: [],
        }
    },
    mounted() {
        this.isPermission = isPermission("isSubmit")
        console.log('权限', this.isPermission);
    },
    methods: {
        openDialog(id) {
            this.dialogVisible = true
            this.getUserList()
            this.getProcessData(id)
        },
        /**
         * @desc èŽ·å–ç”¨æˆ·ä¿¡æ¯
         */
        async getUserList() {
            const { code, data } = await selectUserList()
            if (code == 200) {
                this.userList = data
            }
        },
        /**
         * @desc æŸ¥è¯¢ç›‘督记录处理单
         * @param {监督记录id} id
         */
        async getProcessData(id) {
            const { code, data } = await personSupervisionProcessingPage({ id })
            if (code == 202) {
                this.controlType = '新增'
                this.supervisionRecordId = id
                this.active = 0
                this.pageStatus = 0
                this.processId = undefined
            }
            if (code == 200) {
                this.currentResponsible = data.currentResponsible
                this.controlType = '编辑'
                this.supervisionRecordId = id
                this.processId = data.processingId
                this.active = Number(data.currentState)
                this.pageStatus = Number(data.currentState === 2 ? 0 : data.currentState)
                // ç¬¬1步数据
                this.mainForm.factForm.proposingDepartmentPersonId = data.proposingDepartmentPersonId
                this.mainForm.factForm.descriptionNonconformity = data.descriptionNonconformity
                // ç¬¬2步数据
                this.mainForm.reasonForm.causeAnalysisPersonId = data.causeAnalysisPersonId
                this.mainForm.reasonForm.causeAnalysis = data.causeAnalysis
                // ç¬¬3步数据
                this.mainForm.measureForm.correctiveActionId = data.correctiveActionId
                this.mainForm.measureForm.correctiveMeasure = data.correctiveMeasure
                this.mainForm.measureForm.requestDepartmentConfirmation = data.requestDepartmentConfirmation
                // ç¬¬4步数据
                this.mainForm.resultForm.verificationDepartmentPersonId = data.verificationDepartmentPersonId
                this.mainForm.resultForm.implementationVerificationResults = data.implementationVerificationResults
            }
        },
        closeDialog() {
            this.dialogVisible = false
        },
        submit(type) {
            let currentState = undefined
            if (type == 'submit') {
                currentState = this.active + 1
            } else if (type == 'save') {
                currentState = undefined
            }
            if (this.active == 0) {
                // ç¬¬1æ­¥
                console.log('第1æ­¥', this.active, currentState)
                let { factForm } = this.mainForm
                this.submitForm({
                    proposingDepartmentDate: dateFormat(new Date(), 'YYYY-MM-DD HH:mm:ss'),
                    currentState: currentState,
                    ...factForm
                })
            } else if (this.active == 1) {
                // ç¬¬2æ­¥
                console.log('第2æ­¥', this.active, currentState)
                let { reasonForm } = this.mainForm
                this.submitForm({
                    causeAnalysisDate: dateFormat(new Date(), 'YYYY-MM-DD HH:mm:ss'),
                    currentState: currentState,
                    ...reasonForm
                })
            } else if (this.active == 2) {
                // ç¬¬3æ­¥
                console.log('第3æ­¥', this.active, currentState)
                let { measureForm } = this.mainForm
                let { requestDepartmentConfirmation, ...measureFormRest } = measureForm
                this.submitForm({
                    correctiveActionDate: dateFormat(new Date(), 'YYYY-MM-DD HH:mm:ss'),
                    currentState: currentState,
                    requestDepartmentConfirmation: requestDepartmentConfirmation ? 1 : 2,
                    ...measureFormRest
                })
            } else if (this.active == 3) {
                // ç¬¬4æ­¥
                console.log('第4æ­¥', this.active, currentState)
                let { resultForm } = this.mainForm
                this.submitForm({
                    verificationDepartmentDate: dateFormat(new Date(), 'YYYY-MM-DD HH:mm:ss'),
                    currentState: currentState,
                    ...resultForm
                })
            }
        },
        /**
         * @desc æäº¤è¡¨å•
         */
        async submitForm(form) {
            console.log('提交表单', form)
            const { code } = await addOrUpdatePersonnelServiceProcessing({
                processingId: this.processId,
                supervisionRecordId: this.supervisionRecordId,
                ...form
            })
            if (this.controlType == '新增') {
                if (code == 200) {
                    this.$message.success('提交成功')
                }
            } else if (this.controlType == '编辑') {
                if (code == 200) {
                    this.$message.success('提交成功')
                }
            }
            this.$emit('getTableData')
            this.dialogVisible = false
        },
        /**
         * @desc é©³å›ž
         */
        cancel() {
            let currentState = this.active - 1
            this.submitForm({
                id: this.processId,
                supervisionRecordId: this.supervisionRecordId,
                currentState: currentState,
            })
        },
        setStep(e) {
            console.log(e)
            this.pageStatus = e
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,406 @@
<template>
    <div class="flex_column">
        <div>
            <TableCard :showTitle="false">
                <template v-slot:form>
                    <div class="items_center">
                        <!-- <span>关键字</span>
                        <el-input size="small" class="search" v-model="superviseForm.searchVal" placeholder="请输入"></el-input>
                        <el-button type="primary" size="small">查询</el-button> -->
                        <el-button v-if="multipleSelection.length > 0" slot="reference" size="small" type="danger"
                            @click="delRecords">删除</el-button>
                    </div>
                    <div>
                        <el-button size="small" type="primary" @click="addRecord"
                            v-show="departId && departId != 1">新增</el-button>
                    </div>
                </template>
                <template v-slot:table>
                    <limsTable :column="superviseColumnData" :handleSelectionChange="handleSelectionChange"
                        :height="'calc(100vh - 19em)'" :isSelection="true" :table-data="superviseTableData"
                        :table-loading="superviseLoading" rowKey="id" style="margin-top: 18px; padding: 0 15px;"
                        :page="page" @pagination="pagination">
                        <div slot="action" slot-scope="scope">
                            <el-button type="text" @click="openDownloadDia(scope.row)">
                                <span>导出</span>
                            </el-button>
                            <el-button type="text" @click="openRecord(scope.row)">
                                <span>监督记录</span>
                            </el-button>
                            <el-button type="text" @click="openControl(scope.row.id)"
                                :disabled="scope.row.evaluationSupervisionSituation != '不符合'">
                                <span :style="renderBtn(scope.row.currentStateControl)">控制单</span>
                            </el-button>
                            <el-button type="text" @click="openDispose(scope.row.id)"
                                :disabled="scope.row.correctiveMeasure != '1'">
                                <span :style="renderBtn(scope.row.currentStateProcessing)">处理单</span>
                            </el-button>
                        </div>
                    </limsTable>
                </template>
            </TableCard>
        </div>
        <RecordAdd ref="recordModal" @submit="getTableData" :departId="departId"></RecordAdd>
        <ControlModal ref="controlModal" @getTableData="getTableData" :departId="departId"></ControlModal>
        <DisposeModal ref="disposeModal" @getTableData='getTableData' :departId="departId"></DisposeModal>
        <el-dialog :visible.sync="downloadDialog" title="导出" width="600px">
            <span>
                <el-button :disabled="!download.currentStateControl" plain type="primary"
                    @click="controlDown">控制单导出</el-button>
                <el-button :disabled="!download.currentStateProcessing" plain type="primary"
                    @click="processingDown">处理单导出</el-button>
                <el-button plain type="primary" @click="supervisoryDown">监督记录导出</el-button>
            </span>
            <span slot="footer" class="dialog-footer">
                <el-button @click="downloadDialog = false">取 æ¶ˆ</el-button>
            </span>
        </el-dialog>
    </div>
</template>
<script>
import TableCard from '@/components/TableCard/index.vue';
import RecordAdd from "./Add.vue"
import limsTable from "@/components/Table/lims-table.vue";
import ControlModal from "./control/index.vue"
import DisposeModal from "./dispose/index.vue"
import {
    personSupervisionRecordPage,
    deletePersonSupervisionRecord,
    exportSupervisionControlSheet,
    exportSupervisionProcessingSheet,
    exportPersonSupervisionRecord
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
    props: {
        isDepartment: {
            type: Boolean,
            default: false
        },
        departId: {
            type: Number,
            default: () => {
                return null;
            }
        },
    },
    components: {
        TableCard,
        RecordAdd,
        limsTable,
        ControlModal,
        DisposeModal
    },
    data() {
        return {
            loading: false,
            page: {
                current: 1,
                pageSize: 20,
                total: 0
            },
            // ç›‘督记录
            superviseForm: {
                searchVal: undefined
            },
            superviseColumnData: [
                // {
                //     label: 'id',
                //     prop: 'id'
                // },
                {
                    label: '检测人员',
                    prop: 'testerName',
                    width: 120
                }, {
                    label: '监督人员',
                    prop: 'supervisorName',
                    width: 120
                }, {
                    label: '检验项目',
                    prop: 'testItem',
                    width: 120
                }, {
                    label: '样品编号',
                    prop: 'sampleNumber',
                    width: 120
                }, {
                    label: '检验日期',
                    prop: 'detectionDate',
                    width: 160
                }, {
                    label: '控制单状态',
                    prop: 'currentStateControl',
                    formatData: (item) => {
                        let result = undefined
                        switch (item) {
                            case '0':
                                result = '工作情况'
                                break;
                            case '1':
                                result = '被监督人确认'
                                break;
                            case '2':
                                result = '处理措施'
                                break;
                            case '3':
                                result = '纠正措施'
                                break;
                            case '4':
                                result = '通知客户'
                                break;
                        }
                        return result
                    },
                    width: 140,
                }, {
                    label: '流程单状态',
                    prop: 'currentStateProcessing',
                    formatData: (item) => {
                        let result = undefined
                        switch (item) {
                            case '0':
                                result = '问题描述'
                                break;
                            case '1':
                                result = '原因分析'
                                break;
                            case '2':
                                result = '纠正措施'
                                break;
                            case '3':
                                result = '验证结果'
                                break;
                        }
                        return result
                    },
                    width: 140,
                }, {
                    label: '人员',
                    prop: 'personnel',
                    width: 150
                }, {
                    label: '设备仪器',
                    prop: 'instrumentEquipment',
                    width: 140
                }, {
                    label: '工作环境',
                    prop: 'workingEnvironment',
                    width: 140
                }, {
                    label: '样品采集',
                    prop: 'sampleCollection',
                    width: 140
                }, {
                    label: '样品的准备',
                    prop: 'samplePreparation',
                    width: 140
                }, {
                    label: '检验方法',
                    prop: 'testMethod',
                    width: 120
                }, {
                    label: '检测记录',
                    prop: 'testingRecords',
                    width: 120
                }, {
                    label: '检验报告',
                    prop: 'testReport',
                    width: 120
                }, {
                    label: '监督情况评价',
                    prop: 'evaluationSupervisionSituation',
                    width: 140
                }, {
                    label: '不符合处理意见',
                    prop: 'doNotMeetTheHandlingOpinions',
                    width: 140
                }, {
                    fixed: 'right',
                    dataType: "slot",
                    width: 280,
                    label: '操作',
                    slot: 'action',
                }
            ],
            superviseTableData: [],
            superviseLoading: false,
            multipleSelection: [],
            downloadDialog: false,
            download: {
                currentStateControl: '',
                currentStateProcessing: '',
            },
            downloadId: '',
        }
    },
    mounted() {
        this.getTableData()
    },
    methods: {
        /**
         * @desc èŽ·å–æ ‘çš„äººå‘˜id
         */
        getDepart() {
            this.getTableData()
        },
        pagination({ page, limit }) {
            this.page.current = page;
            this.page.pageSize = limit;
            this.getTableData();
        },
        // èŽ·å–ç›‘ç£è®°å½•
        async getTableData() {
            this.loading = true
            const { code, data } = await personSupervisionRecordPage({
                departLimsId: this.isDepartment ? this.departId : null,
                userId: this.isDepartment ? null : this.departId,
                current: this.page.current,
                size: this.page.pageSize
            })
            if (code == 200) {
                this.superviseTableData = data.records
                this.page.total = data.total
            }
            this.loading = false
        },
        // æ–°å¢žç›‘督记录
        addRecord(row, type = false) {
            this.$refs.recordModal.openDialog({ departId: this.departId, ...row }, type)
        },
        openRecord(row) {
            this.$refs.recordModal.openDialog(row, true)
        },
        // æ‰“开导出弹框
        openDownloadDia(row) {
            this.downloadDialog = true
            this.download = row
            console.log('this.download', this.download.currentStateProcessing, this.download.currentStateControl);
            this.downloadId = row.id
        },
        // æŽ§åˆ¶å•导出
        controlDown() {
            exportSupervisionControlSheet({ supervisionRecordId: this.downloadId }).then(res => {
                this.outLoading = false
                const blob = new Blob([res], { type: 'application/msword' });
                this.$download.saveAs(blob, '控制单导出' + '.docx')
            })
        },
        // å¤„理单导出
        processingDown() {
            exportSupervisionProcessingSheet({ supervisionRecordId: this.downloadId }).then(res => {
                this.outLoading = false
                const blob = new Blob([res], { type: 'application/msword' });
                this.$download.saveAs(blob, '处理单导出' + '.docx')
            })
        },
        // ç›‘督记录导出
        supervisoryDown() {
            exportPersonSupervisionRecord({ id: this.downloadId }).then(res => {
                this.outLoading = false
                const blob = new Blob([res], { type: 'application/msword' });
                this.$download.saveAs(blob, '监督记录导出' + '.docx')
            })
        },
        // æ˜¾ç¤ºæŽ§åˆ¶å•
        openControl(id) {
            this.$refs.controlModal.openDialog(id)
        },
        // æ˜¾ç¤ºå¤„理单
        openDispose(id) {
            this.$refs.disposeModal.openDialog(id)
        },
        // è¡¨æ ¼å¤šé€‰æ¿€æ´»åŽåšä»€ä¹ˆ
        handleSelectionChange(val) {
            this.multipleSelection = val
        },
        /**
         * @desc æ‰¹é‡åˆ é™¤ç›‘督记录
         */
        delRecords() {
            this.$confirm(
                '此操作将删除选中数据, æ˜¯å¦ç»§ç»­?',
                '提示',
                {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                })
                .then(() => {
                    console.log(this.multipleSelection)
                    let ids = this.multipleSelection.map((item) => item.id)
                    const code = this.delTableData(ids)
                    this.$message({
                        type: code == 200 ? 'success' : 'error',
                        message: code == 200 ? '删除成功!' : '删除失败!'
                    });
                    this.getTableData()
                })
        },
        // åˆ é™¤api
        async delTableData(ids) {
            const { code } = await this.$axios({
                method: 'delete',
                url: deletePersonSupervisionRecord,
                data: ids
            })
            return code
        },
        // è¡ŒèƒŒæ™¯è‰²
        renderBtn(currentState) {
            let status = Number(currentState)
            let res = {}
            switch (status) {
                case 0:
                    break;
                case 1:
                    res = { color: '#337ecc' }
                    break;
                case 2:
                    res = { color: '#409EFF' }
                    break;
                case 3:
                    res = { color: '#79bbff' }
                    break;
                case 4:
                    res = { color: '#a0cfff' }
                    break;
            }
            return res;
        }
    },
    watch: {
        // ç›‘听点击el-tree的数据,进行数据刷新
        departId: {
            handler(newId, oldId) {
                if (this.isDepartment) {
                    this.getTableData();
                } else {
                    this.getTableData()
                }
            }
        }
    }
}
</script>
<style scoped>
.flex_column {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
}
.items_center {
    display: flex;
    align-items: center;
}
.date_box {
    margin: 0 5px;
}
.search {
    width: 150px;
    padding: 0 16px;
}
</style>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/supervise/ApproveForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,84 @@
<template>
    <el-form
        :model="form"
        label-width="100px"
        :disabled="disabled"
        size="small"
    >
        <el-form-item label="技术负责人">
            <el-select
                v-model="form.technicalDirector"
                placeholder="请选择"
                style="width: 100%"
            >
                <el-option
                    v-for="(item, index) in userList"
                    :key="index"
                    :label="item.name"
                    :value="item.id"
                ></el-option>
            </el-select>
        </el-form-item>
        <!-- <el-form-item label="审批">
            <el-input
                type="textarea"
                :rows="2"
                placeholder="请输入"
            ></el-input>
        </el-form-item> -->
        <el-form-item v-if="!disabled" style="text-align: right;">
            <el-button size="small" type="danger" @click="close">驳回</el-button>
            <el-button size="small" type="primary" @click="submit">提交</el-button>
        </el-form-item>
    </el-form>
</template>
<script>
export default {
    props: {
        userList: {
            type: Array,
            default: () => {
                return []
            }
        },
        approveForm: {
            type: Object,
            default: {}
        },
        isEdit: {
            type: Boolean,
            default: false
        },
        disabled: {
            type: Boolean,
            default: false
        }
    },
    computed: {
        form: {
            get() {
                return this.approveForm
            },
            set(val) {
                this.$emit('approveForm', val)
            }
        }
    },
    data() {
        return {
        }
    },
    methods: {
        submit() {
            this.$emit('submit', 2)
        },
        /**
         * @desc é©³å›ž
         */
        close() {
            this.$emit('close', 2)
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/Records/supervise/SuperviseForm.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,201 @@
<template>
     <el-form
        :model="ruleForm"
        :disabled="disabled"
        label-width="100px"
        size="small"
    >
        <el-row>
            <el-col :span="12">
                <el-form-item label="检测人员">
                    <el-select v-model="ruleForm.testerId" placeholder="请选择" style="width: 100%">
                        <el-option
                            v-for="(item, index) in userList"
                            :key="index"
                            :label="item.name"
                            :value="item.id"
                        ></el-option>
                    </el-select>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="监督员">
                    <el-select v-model="ruleForm.supervisorId" placeholder="请选择" style="width: 100%">
                        <el-option
                            v-for="(item, index) in userList"
                            :key="index"
                            :label="item.name"
                            :value="item.id"
                        ></el-option>
                    </el-select>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="检测项目">
                    <el-input v-model="ruleForm.testItem" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="样品编号">
                    <el-input v-model="ruleForm.sampleNumber" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="检测日期">
                    <el-date-picker
                        v-model="ruleForm.detectionDate"
                        value-format="yyyy-MM-dd"
                        type="date"
                        placeholder="选择日期"
                        style="width: 100%;"
                    >
                    </el-date-picker>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="人员">
                    <!-- <el-select
                        v-model="ruleForm.personnel"
                        placeholder="请选择"
                        style="width: 100%"
                        multiple
                    >
                        <el-option
                            v-for="(item, index) in userList"
                            :key="index"
                            :label="item.name"
                            :value="item.id"
                        ></el-option>
                    </el-select> -->
                    <el-input v-model="ruleForm.personnel" type="textarea" :rows="2" style="width: 100%" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="仪器设备">
                    <el-input v-model="ruleForm.instrumentEquipment" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="工作环境">
                    <el-input v-model="ruleForm.workingEnvironment" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="样品采集">
                    <el-input v-model="ruleForm.sampleCollection" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="样品的准备">
                    <el-input v-model="ruleForm.samplePreparation" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="检测方法">
                    <el-input v-model="ruleForm.testMethod" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="检测记录">
                    <el-input v-model="ruleForm.testingRecords" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="检测报告">
                    <el-input v-model="ruleForm.testReport" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
            <el-col :span="12">
                <el-form-item label="监督情况评价">
                    <el-select v-model="ruleForm.evaluationSupervisionSituation" placeholder="请选择" style="width: 100%;">
                        <el-option label="符合" value="符合"></el-option>
                        <el-option label="不符合" value="不符合"></el-option>
                    </el-select>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col :span="12">
                <el-form-item label="处理意见">
                    <el-input v-model="ruleForm.doNotMeetTheHandlingOpinions" placeholder="请输入"></el-input>
                </el-form-item>
            </el-col>
        </el-row>
        <el-row>
            <el-col v-show="isEdit && !disabled" :span="24">
                <el-form-item style="text-align: right;">
                    <el-button size="small" @click="close">取消</el-button>
                    <el-button size="small" type="primary" @click="approve">审批</el-button>
                </el-form-item>
            </el-col>
            <el-col v-show="!isEdit" :span="24">
                <el-form-item style="text-align: right;">
                    <el-button size="small" type="primary" @click="addData">提交</el-button>
                </el-form-item>
            </el-col>
        </el-row>
    </el-form>
</template>
<script>
export default {
    props: {
        isEdit: {
            type: Boolean,
            default: false
        },
        userList: {
            type: Array,
            default: () => {
                return []
            }
        },
        superviseForm: {
            type: Object,
            default: {}
        },
        disabled: {
            type: Boolean,
            default: false
        }
    },
    computed: {
        ruleForm: {
            get() {
                return this.superviseForm
            },
            set(val) {
                this.$emit('superviseForm', val)
            }
        }
    },
    data() {
        return {
        }
    },
    methods: {
        close() {
            this.$emit('close')
        },
        approve() {
            this.$emit('submit', 1)
        },
        addData() {
            this.$emit('addData', 1)
        }
    }
}
</script>
src/views/CNAS/personnel/personnelInfo/Department/components/TrainingRecord/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,285 @@
<!-- åŸ¹è®­è®°å½• -->
<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>
            <limsTable :column="trainingColumn" :currentChange="currentChange" :height="'calc(100vh - 18em)'"
              :highlightCurrentRow="true" :table-data="trainingTableData" :table-loading="trainingLoading"
              style="padding: 0 15px;" :page="trainingPagination" @pagination="trainingPaginationMethod">
            </limsTable>
          </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>
            <limsTable :column="trainingPersonColumn" :height="'calc(100vh - 18em)'"
              :table-data="trainingPersonTableData" :table-loading="trainingPersonLoading" style="padding: 0 15px;"
              :page="trainingPersonPagination" @pagination="trainingPersonPaginationMethod">
            </limsTable>
          </template>
        </TableCard>
      </div>
    </div>
  </div>
</template>
<script>
import limsTable from "@/components/Table/lims-table.vue";
import TableCard from "@/components/TableCard/index.vue";
import {
  exportTrainingRecord,
  trainingSelectTrainingRecord,
  queryPersonnelDetails,
} from '@/api/cnas/personnel/personnelInfo.js'
export default {
  components: { TableCard, limsTable },
  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);
      exportTrainingRecord({
        userId: row.userId,
        trainingDate: date
      }).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/msword' });
        this.$download.saveAs(blob, '培训记录导出' + '.docx')
      })
    },
    // èŽ·å–å®žéªŒå®¤-培训计划列表信息
    getPersonnelTraining(departId) {
      // const name = this.isDepartment ? 'departmentId' : 'userId';
      trainingSelectTrainingRecord({
        departmentId: departId,
        ...this.trainingPagination
      }).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 = ''
      }
      queryPersonnelDetails({
        userId,
        ...this.trainingPersonPagination
      }).then(res => {
        this.trainingPersonTableData = res.data.records;
        this.trainingPersonPagination.total = res.data.total;
      });
    },
    // åˆ†é¡µ
    trainingPaginationMethod({ page, limit }) {
      this.trainingPagination.current = page;
      this.trainingPagination.size = limit;
      this.getPersonnelTraining(this.departId);
    },
    // åˆ†é¡µ
    trainingPersonPaginationMethod({ page, limit }) {
      this.trainingPersonPagination.current = page;
      this.trainingPersonPagination.size = limit;
      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>
src/views/CNAS/personnel/personnelInfo/Department/components/rewardPunishmentRecord/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,316 @@
<!-- å¥–惩记录 -->
<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 {
  deleteRewardPunishment,
  addOrUpdateRewardPunishment,
  rewardPunishmentPage
} from '@/api/cnas/personnel/personnelInfo.js'
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 rewardPunishmentPage({
        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'
        })
        //将Blob å¯¹è±¡è½¬æ¢æˆå­—符串
        let reader = new FileReader();
        reader.readAsText(blob, 'utf-8');
        reader.onload = () => {
          try {
            let result = JSON.parse(reader.result);
            if (result.message) {
              this.$message.error(result.message);
            } else {
              // åˆ›å»ºä¸€ä¸ªè¶…链接,将文件流赋进去,然后实现这个超链接的单击事件
              const 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)
              this.$message.success('导出成功')
            }
          } catch (err) {
            console.log(err);
            // åˆ›å»ºä¸€ä¸ªè¶…链接,将文件流赋进去,然后实现这个超链接的单击事件
            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)
            this.$message.success('导出成功')
          }
        }
      })
    },
    // èŽ·å–è´Ÿè´£äººä¿¡æ¯æŽ¥å£
    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 addOrUpdateRewardPunishment(this.form)
          if (code == 200) {
            this.$message.success("操作成功!")
            this.getPersonnelTraining(this.departId);
          }
        }
      })
    },
    async deleteRow(row) {
      const { code, data } = await deleteRewardPunishment({
        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>
src/views/CNAS/personnel/personnelInfo/Department/components/trackRecord/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,298 @@
<!-- å·¥ä½œå±¥åކ -->
<template>
  <div>
    <div style="text-align: right; margin-bottom: 15px;">
      <el-button v-if="clickNodeVal.userId" size="small" type="primary" @click="dialogVisible = true">添加工作履历</el-button>
      <el-button :loading="outLoading" size="small" type="primary" @click="exportExcel">导出excel</el-button>
    </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="startTime">
        </el-table-column>
        <el-table-column label="结束日期" min-width="180" prop="endTime">
        </el-table-column>
        <el-table-column label="工作单位" min-width="120" prop="placeWork">
        </el-table-column>
        <el-table-column label="工作部门" min-width="120" prop="department">
        </el-table-column>
        <el-table-column label="职务" min-width="120" prop="post">
        </el-table-column>
        <el-table-column label="备注" min-width="180" prop="remarks">
        </el-table-column>
        <el-table-column label="创建人" min-width="180" prop="createUser">
        </el-table-column>
        <el-table-column label="创建时间" min-width="180" prop="createTime">
        </el-table-column>
        <el-table-column fixed="right" label="操作" width="150">
          <template v-slot="scope">
            <el-button size="small" type="text" @click="downloadFile(scope.row.fileName)">导出</el-button>
            <el-button size="small" type="text" @click="checkFun(scope.row)">查看</el-button>
            <el-button size="small" style="color: red;" type="text" @click="deleteFun(scope.row.id)">删除</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="45%">
      <div style="height: 30vh;">
        <el-form ref="ruleForm" :model="ruleForm" :rules="rules" class="demo-ruleForm" label-width="100px">
          <el-row>
            <el-col :span="12">
              <el-form-item label="起始日期" prop="startTime">
                <el-date-picker v-model="ruleForm.startTime" format="yyyy-MM-dd" placeholder="选择日期" required
                  size="small" style="width: 99%;" type="date" value-format="yyyy-MM-dd HH:mm:ss">
                </el-date-picker>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="结束日期">
                <el-date-picker v-model="ruleForm.endTime" 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="12">
              <el-form-item label="工作单位" prop="placeWork">
                <el-input v-model="ruleForm.placeWork" clearable required size="small"></el-input>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="工作部门" prop="department">
                <el-input v-model="ruleForm.department" clearable required size="small"></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" clearable required size="small"></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" disabled size="small"></el-input></el-col>
                  <el-col :span="7">
                    <el-upload ref="upload" :action="action" :on-change="handleChangePic" :on-success="onSuccess"
                      :show-file-list="false" style="float: left; margin: 0 20px;" :headers="uploadHeader">
                      <el-button slot="trigger" class="uploadFile" 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" clearable size="small"></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 {
  personTrackRecordExport,
  personTrackRecordUpdate,
  personTrackRecordSave,
  personTrackRecordDelete,
  personTrackRecordSelect,
} from '@/api/cnas/personnel/personnelInfo.js'
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 + '/personBasicInfo/saveCNASFile'
    }
  },
  methods: {
    downloadFile(fileName) {
      this.$download.saveAs(fileName, 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
      personTrackRecordExport({
        userId,
        departmentId
      }).then(res => {
        this.outLoading = false
        const blob = new Blob([res], { type: 'application/octet-stream' });
        this.$download.saveAs(blob, '工作履历.xlsx')
      })
    },
    saveOrUpdate() {
      this.$refs['ruleForm'].validate((valid) => {
        if (valid) {
          if (this.isUpdate) {
            personTrackRecordUpdate(this.ruleForm).then(res => {
              if (res.code = 200) {
                this.dialogVisible = false
                this.$message.success('更新成功!')
                this.init()
              }
            })
          } else {
            this.ruleForm.userId = this.clickNodeVal.userId
            personTrackRecordSave(this.ruleForm).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(() => {
        personTrackRecordDelete({ 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) {
      personTrackRecordSelect({
        userId,
        departmentId,
        ...this.search
      }).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>
src/views/CNAS/personnel/personnelInfo/Department/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,156 @@
<template>
  <el-tabs v-model="activeName" :lazy="true" type="border-card">
    <el-tab-pane label="人员基本信息" name="人员基本信息">
      <PersonnelList v-if="activeName === '人员基本信息' && isShowAll" ref="personnelList"
        :currentCompaniesList="currentCompaniesList" :departId="departId" @refreshTree="refreshTree"
        @updatePerson="updatePerson"></PersonnelList>
      <personnelInformation v-if="activeName === '人员基本信息' && !isShowAll" :clickNodeVal="clickNodeVal">
      </personnelInformation>
    </el-tab-pane>
    <el-tab-pane label="培训计划" name="培训计划">
      <PersonnelTraining v-if="activeName === '培训计划'" ref="personnelTraining" :flag="flag" :departId="departId"
        :isDepartment="isDepartment"></PersonnelTraining>
    </el-tab-pane>
    <el-tab-pane label="监督计划" name="监督计划">
      <Plan v-if="activeName === '监督计划'" :departId="departId"></Plan>
    </el-tab-pane>
    <el-tab-pane label="岗位职责" name="岗位职责">
      <job-responsibilities v-if="activeName === '岗位职责'" ref="jobResponsibilities" :departId="departId"
        :isDepartment="isDepartment"></job-responsibilities>
    </el-tab-pane>
    <el-tab-pane label="工作履历" name="工作履历">
      <trackRecord v-if="activeName === '工作履历'" :clickNodeVal="clickNodeVal"></trackRecord>
    </el-tab-pane>
    <el-tab-pane label="奖惩记录" name="奖惩记录">
      <rewardPunishmentRecord v-if="activeName === '奖惩记录'" :departId="departId" :isDepartment="isDepartment">
      </rewardPunishmentRecord>
    </el-tab-pane>
    <el-tab-pane label="培训记录" name="培训记录">
      <training-record v-if="activeName === '培训记录'" ref="trainingRecord" :departId="departId"
        :isDepartment="isDepartment"></training-record>
    </el-tab-pane>
    <el-tab-pane label="监督记录" name="监督记录">
      <Records v-if="activeName === '监督记录'" ref="recordsRef" :departId="departId" :isDepartment="isDepartment">
      </Records>
    </el-tab-pane>
    <el-tab-pane label="任职授权记录" name="任职授权记录">
      <Mandate v-if="activeName === '任职授权记录'" ref="manDateRef" :departId="departId" :isDepartment="isDepartment">
      </Mandate>
    </el-tab-pane>
    <el-tab-pane label="人员能力" name="人员能力">
      <personnel-capacity v-if="activeName === '人员能力'" ref="personnelCapacity" :departId="departId"
        :isDepartment="isDepartment"></personnel-capacity>
    </el-tab-pane>
    <el-tab-pane label="沟通记录" name="沟通记录">
      <Communicate v-if="activeName === '沟通记录'" ref="communicateRef" :departId="departId" :isDepartment="isDepartment">
      </Communicate>
    </el-tab-pane>
  </el-tabs>
</template>
<script>
import Plan from './components/Plan/index.vue';
import Records from './components/Records/index.vue';
import Communicate from './components/Communicate/index.vue';
import Mandate from './components/Mandate/index.vue';
import PersonnelList from './components/PersonnelList/index.vue';
import PersonnelTraining from './components/PersonnelTraining/index.vue';
import JobResponsibilities from './components/JobResponsibilities/index.vue';
import TrainingRecord from './components/TrainingRecord/index.vue';
import PersonnelCapacity from './components/PersonnelCapacity/index.vue';
import trackRecord from "./components/trackRecord/index.vue";
import rewardPunishmentRecord from "./components/rewardPunishmentRecord/index.vue";
import PersonnelInformation from "./components/PersonnelInformation/index.vue";
export default {
  props: {
    clickNodeVal: {
      type: Object,
      default: () => {
        return {};
      }
    },
    departId: {
      type: Number,
      default: 0
    },
    isDepartment: {
      type: Boolean,
      default: false
    },
    isShowAll: {
      type: Boolean,
      default: false
    },
    currentCompaniesList: {
      type: Array,
      default: []
    }
  },
  components: {
    PersonnelInformation,
    rewardPunishmentRecord,
    trackRecord,
    PersonnelCapacity,
    TrainingRecord,
    JobResponsibilities,
    PersonnelTraining,
    PersonnelList,
    Plan,
    Records,
    Communicate,
    Mandate
  },
  watch: {
    departId: {
      handler(newId, oldId) {
        if (newId) {
          switch (this.activeName) {
            case '沟通记录':
              this.$refs.communicateRef.getDepart(newId);
              break;
            case '任职授权记录':
              this.$refs.manDateRef.getDepart(newId);
              break;
            default:
              break;
          }
        }
      }
    }
  },
  data() {
    return {
      flag: true,
      activeName: '人员基本信息',
    }
  },
  created() {
    // this.flag =  isPermission('personTrainingSelect')
    // console.log('this.flag',this.flag);
  },
  methods: {
    updatePerson(row) {
      this.$parent.updatePerson(row);
    },
    refreshTree() {
      this.$parent.refreshTree();
    },
  }
};
</script>
<style scoped>
.box {
  height: calc(100vh - 11em);
}
.el-tabs>>>.el-tabs--border-card {
  box-shadow: unset;
  border: unset;
}
.flex_column {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
</style>
src/views/CNAS/personnel/personnelInfo/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,297 @@
<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% - 80px);overflow-y: scroll;scrollbar-width: none;"
        @node-click="handleNodeClick">
        <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 './Department/index.vue';
import {
  delDepartmentLims,
  addDepartmentLims,
  selectCNSAPersonTree,
} from '@/api/cnas/personnel/personnelInfo.js'
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
        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
      }
      addDepartmentLims(this.addOb).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; // æ²¡æœ‰æ‰¾åˆ°èŠ‚ç‚¹ï¼Œè¿”å›žnull
    },
    searchFilter() {
      this.$refs.tree.filter(this.search);
    },
    // èŽ·å–æ ‘
    geList() {
      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;
    },
    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: 240px;
  border-radius: 15px;
}
.main_right {
  width: calc(100% - 240px);
  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>
src/views/CNAS/systemManagement/measuresDealRisks/components/hazardIdentificationRiskAssessment.vue
@@ -124,7 +124,6 @@
</template>
<script>
import { getToken } from "@/utils/auth";
import {
  getPageResults,
  dangerousRiskApproval,
src/views/structural/capabilityAndLaboratory/capability/index.vue
@@ -10,7 +10,7 @@
        </el-col>
        <el-col :span="12" style="text-align: right;">
          <el-upload v-if="radio === 0" ref='upload1' style="display: inline;margin-right: 8px" :action="uploadAction1"
            :before-upload="beforeUpload1" :headers="token" :on-error="onError1" :on-success="handleSuccessUp1"
            :before-upload="beforeUpload1" :headers="uploadHeader" :on-error="onError1" :on-success="handleSuccessUp1"
            :show-file-list="false" accept='.doc,.docx,.xls,.xlsx'>
            <el-button size="small" type="primary">导入</el-button>
          </el-upload>
@@ -81,9 +81,9 @@
    </el-dialog>
    <el-dialog :visible.sync="uploadDia" title="数据导入" width="500px">
      <div style="margin: 0 auto;">
        <el-upload ref="upload" :action="uploadAction" :auto-upload="false" :file-list="fileList" :headers="token"
          :limit="1" :on-change="beforeUpload" :on-error="onError" :on-success="onSuccess" accept=".xlsx" drag
          name="file">
        <el-upload ref="upload" :action="uploadAction" :auto-upload="false" :file-list="fileList"
          :headers="uploadHeader" :limit="1" :on-change="beforeUpload" :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>
src/views/structural/capabilityAndLaboratory/laboratory/index.vue
@@ -120,14 +120,14 @@
        </el-form-item>
        <el-form-item label="资质图片">
          <el-upload ref="upload" :action="uploadAction" :on-success="(m) => handleSuccessUpImg(m, 'imageUrl')"
            accept="image/jpg,image/jpeg,image/png" :multiple="false" :limit="1" :headers="headers"
            accept="image/jpg,image/jpeg,image/png" :multiple="false" :limit="1" :headers="uploadHeader"
            :on-change="beforeUpload" :on-error="onError">
            <el-button slot="trigger" size="small" type="primary">选取图片</el-button>
          </el-upload>
        </el-form-item>
        <el-form-item label="资质附件">
          <el-upload ref="upload1" :action="uploadAction" :on-success="(m) => handleSuccessUpImg(m, 'fileUrl')"
            accept="image/jpg,image/jpeg,image/png,application/pdf,.doc,.docx" :headers="headers" :multiple="false"
            accept="image/jpg,image/jpeg,image/png,application/pdf,.doc,.docx" :headers="uploadHeader" :multiple="false"
            :limit="1" :on-change="beforeUpload1" :on-error="onError1">
            <el-button slot="trigger" size="small" type="primary">选取文件</el-button>
          </el-upload>