Merge branch 'wkz'

pull/781/head
quu 2025-05-17 17:17:31 +09:00
commit 8c74752b2b
84 changed files with 14734 additions and 2 deletions

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// 通知表(公告、新闻、制度) VO
export interface AnnouncementVO {
id: number // 唯一主键
annoType: number // 通知类型(公告、新闻、制度)
title: string // 标题
content: string // 内容
publishType: number // 公告类别(公告:人事任免、放假通知、其他)
publishName: string // 署名
attachment: string // 附件
publishMode: number // 发布模式0=立即1=定时)
publishPlanTime: Date // 计划发布时间. 立即发布时为空
publishRealTime: Date // 实际发布时间
publishRangerType: number // 发布范围类型 1公司 2部门 3人员
publishRanger: string // 发布范围选择
publishStatus: number // 发布状态。已发布 未发布
}
// 通知表(公告、新闻、制度) API
export const AnnouncementApi = {
// 查询通知表(公告、新闻、制度)分页
getAnnouncementPage: async (params: any) => {
return await request.get({ url: `/hrm/announcement/page`, params })
},
// 查询通知表(公告、新闻、制度)详情
getAnnouncement: async (id: number) => {
return await request.get({ url: `/hrm/announcement/get?id=` + id })
},
// 新增通知表(公告、新闻、制度)
createAnnouncement: async (data: AnnouncementVO) => {
return await request.post({ url: `/hrm/announcement/create`, data })
},
// 修改通知表(公告、新闻、制度)
updateAnnouncement: async (data: AnnouncementVO) => {
return await request.put({ url: `/hrm/announcement/update`, data })
},
// 删除通知表(公告、新闻、制度)
deleteAnnouncement: async (id: number) => {
return await request.delete({ url: `/hrm/announcement/delete?id=` + id })
},
// 导出通知表(公告、新闻、制度) Excel
exportAnnouncement: async (params) => {
return await request.download({ url: `/hrm/announcement/export-excel`, params })
}
}

View File

@ -0,0 +1,52 @@
import request from '@/config/axios'
// 关怀通知 VO
export interface CareNoticeVO {
id: number // 主键,自动递增
careType: number // 关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等
noticeTitle: string // 通知主题
publishRangerType: number // 发布范围类型 1公司 2部门 3人员
releaseMethod: number // 发送时间方式(字典):前一天、当天、后一天
publishRanger: string // 发布范围选择
releaseTime: localtime // 发布时间
releaseDate: Date // 发布日期/节日日期
noticeMethod: number // 通知方式(字典):邮件、短信、系统通知
noticeContent: string // 通知内容
employmentDateType: number // 入职关怀日期类型
employmentNoticeType: number // 入职关怀发送通知
diyType: number // 自定义通知类型
diyEventType: number // 自定义事件名称
}
// 关怀通知 API
export const CareNoticeApi = {
// 查询关怀通知分页
getCareNoticePage: async (params: any) => {
return await request.get({ url: `/hrm/care-notice/page`, params })
},
// 查询关怀通知详情
getCareNotice: async (id: number) => {
return await request.get({ url: `/hrm/care-notice/get?id=` + id })
},
// 新增关怀通知
createCareNotice: async (data: CareNoticeVO) => {
return await request.post({ url: `/hrm/care-notice/create`, data })
},
// 修改关怀通知
updateCareNotice: async (data: CareNoticeVO) => {
return await request.put({ url: `/hrm/care-notice/update`, data })
},
// 删除关怀通知
deleteCareNotice: async (id: number) => {
return await request.delete({ url: `/hrm/care-notice/delete?id=` + id })
},
// 导出关怀通知 Excel
exportCareNotice: async (params) => {
return await request.download({ url: `/hrm/care-notice/export-excel`, params })
}
}

View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// 人事证明申请 VO
export interface CertificateRequestVO {
id: number // 主键ID
userId: number // 申请人ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
certificateType: number // 证明类型(在职证明、实习证明)
applicationDate: Date // 申请日期
reason: string // 申请事由
}
// 人事证明申请 API
export const CertificateRequestApi = {
// 查询人事证明申请分页
getCertificateRequestPage: async (params: any) => {
return await request.get({ url: `/hrm/certificate-request/page`, params })
},
// 查询人事证明申请详情
getCertificateRequest: async (id: number) => {
return await request.get({ url: `/hrm/certificate-request/get?id=` + id })
},
// 新增人事证明申请
createCertificateRequest: async (data: CertificateRequestVO) => {
return await request.post({ url: `/hrm/certificate-request/create`, data })
},
// 修改人事证明申请
updateCertificateRequest: async (data: CertificateRequestVO) => {
return await request.put({ url: `/hrm/certificate-request/update`, data })
},
// 删除人事证明申请
deleteCertificateRequest: async (id: number) => {
return await request.delete({ url: `/hrm/certificate-request/delete?id=` + id })
},
// 导出人事证明申请 Excel
exportCertificateRequest: async (params) => {
return await request.download({ url: `/hrm/certificate-request/export-excel`, params })
}
}

View File

@ -0,0 +1,55 @@
import request from '@/config/axios'
// 课件 VO
export interface CoursewareVO {
id: number // 主键ID
coursewareName: string // 课件名称
author: number // 作者
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
courseType: number // 课程类型
suitableDept: string // 适合学习的部门. 逗号分隔的部门id
content: string // 课件内容
videoAttachment: string // 视频附件
outline: string // 课件大纲
}
// 课件 API
export const CoursewareApi = {
// 查询课件分页
getCoursewarePage: async (params: any) => {
return await request.get({ url: `/hrm/courseware/page`, params })
},
// 查询课件详情
getCourseware: async (id: number) => {
return await request.get({ url: `/hrm/courseware/get?id=` + id })
},
// 新增课件
createCourseware: async (data: CoursewareVO) => {
return await request.post({ url: `/hrm/courseware/create`, data })
},
// 修改课件
updateCourseware: async (data: CoursewareVO) => {
return await request.put({ url: `/hrm/courseware/update`, data })
},
// 删除课件
deleteCourseware: async (id: number) => {
return await request.delete({ url: `/hrm/courseware/delete?id=` + id })
},
// 导出课件 Excel
exportCourseware: async (params) => {
return await request.download({ url: `/hrm/courseware/export-excel`, params })
},
// ==================== 子表(课件详情) ====================
// 获得课件详情列表
getCoursewareDetailListByCoursewareId: async (coursewareId) => {
return await request.get({ url: `/hrm/courseware/courseware-detail/list-by-courseware-id?coursewareId=` + coursewareId })
}
}

View File

@ -0,0 +1,47 @@
import request from '@/config/axios'
// 课件详情 VO
export interface CoursewareDetailVO {
id: number // 主键ID
coursewareId: number // 课件ID关联courseware表
question: string // 题目
questionType: number // 题目类型(选择、填空、论述)
answer: string // 答案
optionA: string // 选择题选项A
optionB: string // 选择题选项B
optionC: string // 选择题选项C
optionD: string // 选择题选项D
}
// 课件详情 API
export const CoursewareDetailApi = {
// 查询课件详情分页
getCoursewareDetailPage: async (params: any) => {
return await request.get({ url: `/hrm/courseware-detail/page`, params })
},
// 查询课件详情详情
getCoursewareDetail: async (id: number) => {
return await request.get({ url: `/hrm/courseware-detail/get?id=` + id })
},
// 新增课件详情
createCoursewareDetail: async (data: CoursewareDetailVO) => {
return await request.post({ url: `/hrm/courseware-detail/create`, data })
},
// 修改课件详情
updateCoursewareDetail: async (data: CoursewareDetailVO) => {
return await request.put({ url: `/hrm/courseware-detail/update`, data })
},
// 删除课件详情
deleteCoursewareDetail: async (id: number) => {
return await request.delete({ url: `/hrm/courseware-detail/delete?id=` + id })
},
// 导出课件详情 Excel
exportCoursewareDetail: async (params) => {
return await request.download({ url: `/hrm/courseware-detail/export-excel`, params })
}
}

View File

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 学历进修申请 VO
export interface EducationApplyVO {
id: number // 主键ID
userId: number // 员工ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
currentEducation: number // 现学历
advancedEducation: number // 进修后学历
studyStartDate: Date // 开始进修时间
studyEndDate: Date // 结束进修时间
studyFee: number // 进修费用
studySchool: string // 进修学校
studyMajor: string // 进修专业
elecSignature: string // 员工签字
}
// 学历进修申请 API
export const EducationApplyApi = {
// 查询学历进修申请分页
getEducationApplyPage: async (params: any) => {
return await request.get({ url: `/hrm/education-apply/page`, params })
},
// 查询学历进修申请详情
getEducationApply: async (id: number) => {
return await request.get({ url: `/hrm/education-apply/get?id=` + id })
},
// 新增学历进修申请
createEducationApply: async (data: EducationApplyVO) => {
return await request.post({ url: `/hrm/education-apply/create`, data })
},
// 修改学历进修申请
updateEducationApply: async (data: EducationApplyVO) => {
return await request.put({ url: `/hrm/education-apply/update`, data })
},
// 删除学历进修申请
deleteEducationApply: async (id: number) => {
return await request.delete({ url: `/hrm/education-apply/delete?id=` + id })
},
// 导出学历进修申请 Excel
exportEducationApply: async (params) => {
return await request.download({ url: `/hrm/education-apply/export-excel`, params })
}
}

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// 转正申请 VO
export interface FullMemberApplyVO {
id: number // 主键,自动递增
userId: number // 员工档案ID关联hrm_user_infor
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
confirmationDate: Date // 转正日期
isConfirmed: number // 是否转正10
applicationDate: Date // 申请日期
applicationNote: string // 转正申请说明
workPerformanceScore: number // 工作业绩评分
attendanceScore: number // 出勤情况评分
teamworkScore: number // 团队协作评分
abilityPerformanceScore: number // 能力表现评分
eSignature: string // 本人签字
}
// 转正申请 API
export const FullMemberApplyApi = {
// 查询转正申请分页
getFullMemberApplyPage: async (params: any) => {
return await request.get({ url: `/hrm/full-member-apply/page`, params })
},
// 查询转正申请详情
getFullMemberApply: async (id: number) => {
return await request.get({ url: `/hrm/full-member-apply/get?id=` + id })
},
// 新增转正申请
createFullMemberApply: async (data: FullMemberApplyVO) => {
return await request.post({ url: `/hrm/full-member-apply/create`, data })
},
// 修改转正申请
updateFullMemberApply: async (data: FullMemberApplyVO) => {
return await request.put({ url: `/hrm/full-member-apply/update`, data })
},
// 删除转正申请
deleteFullMemberApply: async (id: number) => {
return await request.delete({ url: `/hrm/full-member-apply/delete?id=` + id })
},
// 导出转正申请 Excel
exportFullMemberApply: async (params) => {
return await request.download({ url: `/hrm/full-member-apply/export-excel`, params })
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// 发起面试 VO
export interface InterviewInitiationVO {
id: number // 主键ID
recruitmentRequestId: number // 招聘Id
talentPoolId: number // 人才库ID关联hrm_talent_pool
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
interviewAddress: number // 面试地址
interviewTime: Date // 面试通知时间
interviewEmail: string // 面试通知邮箱
status: number // 状态
deptId: number // 部门ID
}
// 发起面试 API
export const InterviewInitiationApi = {
// 查询发起面试分页
getInterviewInitiationPage: async (params: any) => {
return await request.get({ url: `/hrm/interview-initiation/page`, params })
},
// 查询发起面试详情
getInterviewInitiation: async (id: number) => {
return await request.get({ url: `/hrm/interview-initiation/get?id=` + id })
},
// 新增发起面试
createInterviewInitiation: async (data: InterviewInitiationVO) => {
return await request.post({ url: `/hrm/interview-initiation/create`, data })
},
// 修改发起面试
updateInterviewInitiation: async (data: InterviewInitiationVO) => {
return await request.put({ url: `/hrm/interview-initiation/update`, data })
},
// 删除发起面试
deleteInterviewInitiation: async (id: number) => {
return await request.delete({ url: `/hrm/interview-initiation/delete?id=` + id })
},
// 导出发起面试 Excel
exportInterviewInitiation: async (params) => {
return await request.download({ url: `/hrm/interview-initiation/export-excel`, params })
}
}

45
src/api/hrm/item/index.ts Normal file
View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// 物品管理 VO
export interface ItemVO {
id: number // 唯一主键
itemCode: string // 物品编码
itemCategory: number // 物品分类(办公用品、办公设备等)
itemName: string // 物品名称
itemCount: number // 目前库存数量
itemType: number // 规格
remark: string // 备注
}
// 物品管理 API
export const ItemApi = {
// 查询物品管理分页
getItemPage: async (params: any) => {
return await request.get({ url: `/hrm/item/page`, params })
},
// 查询物品管理详情
getItem: async (id: number) => {
return await request.get({ url: `/hrm/item/get?id=` + id })
},
// 新增物品管理
createItem: async (data: ItemVO) => {
return await request.post({ url: `/hrm/item/create`, data })
},
// 修改物品管理
updateItem: async (data: ItemVO) => {
return await request.put({ url: `/hrm/item/update`, data })
},
// 删除物品管理
deleteItem: async (id: number) => {
return await request.delete({ url: `/hrm/item/delete?id=` + id })
},
// 导出物品管理 Excel
exportItem: async (params) => {
return await request.download({ url: `/hrm/item/export-excel`, params })
}
}

View File

@ -0,0 +1,51 @@
import request from '@/config/axios'
// 物品申请 VO
export interface ItemRequestVO {
id: number // 自动递增的主键
applicantId: number // 领用人ID
requestDate: Date // 申请日期
eSignature: string // 领用人电子签名
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
}
// 物品申请 API
export const ItemRequestApi = {
// 查询物品申请分页
getItemRequestPage: async (params: any) => {
return await request.get({ url: `/hrm/item-request/page`, params })
},
// 查询物品申请详情
getItemRequest: async (id: number) => {
return await request.get({ url: `/hrm/item-request/get?id=` + id })
},
// 新增物品申请
createItemRequest: async (data: ItemRequestVO) => {
return await request.post({ url: `/hrm/item-request/create`, data })
},
// 修改物品申请
updateItemRequest: async (data: ItemRequestVO) => {
return await request.put({ url: `/hrm/item-request/update`, data })
},
// 删除物品申请
deleteItemRequest: async (id: number) => {
return await request.delete({ url: `/hrm/item-request/delete?id=` + id })
},
// 导出物品申请 Excel
exportItemRequest: async (params) => {
return await request.download({ url: `/hrm/item-request/export-excel`, params })
},
// ==================== 子表(物品申请明细) ====================
// 获得物品申请明细列表
getItemRequestDetailListByItemRequestId: async (itemRequestId) => {
return await request.get({ url: `/hrm/item-request/item-request-detail/list-by-item-request-id?itemRequestId=` + itemRequestId })
}
}

View File

@ -0,0 +1,43 @@
import request from '@/config/axios'
// 物品申请明细 VO
export interface ItemRequestDetailVO {
id: number // 主键
itemRequestId: number // 物品申请ID关联 hrm_item_request
itemId: number // 物品管理ID关联 hrm_item
requestCount: number // 领用数量
instructions: string // 申请说明
}
// 物品申请明细 API
export const ItemRequestDetailApi = {
// 查询物品申请明细分页
getItemRequestDetailPage: async (params: any) => {
return await request.get({ url: `/hrm/item-request-detail/page`, params })
},
// 查询物品申请明细详情
getItemRequestDetail: async (id: number) => {
return await request.get({ url: `/hrm/item-request-detail/get?id=` + id })
},
// 新增物品申请明细
createItemRequestDetail: async (data: ItemRequestDetailVO) => {
return await request.post({ url: `/hrm/item-request-detail/create`, data })
},
// 修改物品申请明细
updateItemRequestDetail: async (data: ItemRequestDetailVO) => {
return await request.put({ url: `/hrm/item-request-detail/update`, data })
},
// 删除物品申请明细
deleteItemRequestDetail: async (id: number) => {
return await request.delete({ url: `/hrm/item-request-detail/delete?id=` + id })
},
// 导出物品申请明细 Excel
exportItemRequestDetail: async (params) => {
return await request.download({ url: `/hrm/item-request-detail/export-excel`, params })
}
}

View File

@ -0,0 +1,58 @@
import request from '@/config/axios'
// 调岗申请 VO
export interface JobTransferApplyVO {
id: number // 主键,自动递增
userId: number // 员工档案ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
applyType: number // 调岗类型
applyReason: number // 调岗原因
beforeDeptId: number // 调动前部门
beforePostLevel: number // 调动前职级
beforeGradeLevel: number // 调动前档级
beforeSalary: string // 调动前薪资
beforePostId: number // 调动前岗位
applyInfo: string // 申请说明
afterDeptId: number // 调动后部门
afterSalary: number // 调动后薪资
afterPostLevel: number // 调动后职级
afterGradeLevel: number // 调动前档级
afterPostId: number // 调动后岗位
afterPostName: string // 调动后岗位名称
effectiverDate: Date // 生效日期
attachment: string // 附件
}
// 调岗申请 API
export const JobTransferApplyApi = {
// 查询调岗申请分页
getJobTransferApplyPage: async (params: any) => {
return await request.get({ url: `/hrm/job-transfer-apply/page`, params })
},
// 查询调岗申请详情
getJobTransferApply: async (id: number) => {
return await request.get({ url: `/hrm/job-transfer-apply/get?id=` + id })
},
// 新增调岗申请
createJobTransferApply: async (data: JobTransferApplyVO) => {
return await request.post({ url: `/hrm/job-transfer-apply/create`, data })
},
// 修改调岗申请
updateJobTransferApply: async (data: JobTransferApplyVO) => {
return await request.put({ url: `/hrm/job-transfer-apply/update`, data })
},
// 删除调岗申请
deleteJobTransferApply: async (id: number) => {
return await request.delete({ url: `/hrm/job-transfer-apply/delete?id=` + id })
},
// 导出调岗申请 Excel
exportJobTransferApply: async (params) => {
return await request.download({ url: `/hrm/job-transfer-apply/export-excel`, params })
}
}

View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// 师徒申请 VO
export interface MentorsApplyVO {
id: number // 主键,自动递增
userId: number // 员工档案ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
mentorsType: number // 师徒类型. 0拜师 1收徒
acceptUserId: number // 接受员工Id
effectiverDate: Date // 生效日期
}
// 师徒申请 API
export const MentorsApplyApi = {
// 查询师徒申请分页
getMentorsApplyPage: async (params: any) => {
return await request.get({ url: `/hrm/mentors-apply/page`, params })
},
// 查询师徒申请详情
getMentorsApply: async (id: number) => {
return await request.get({ url: `/hrm/mentors-apply/get?id=` + id })
},
// 新增师徒申请
createMentorsApply: async (data: MentorsApplyVO) => {
return await request.post({ url: `/hrm/mentors-apply/create`, data })
},
// 修改师徒申请
updateMentorsApply: async (data: MentorsApplyVO) => {
return await request.put({ url: `/hrm/mentors-apply/update`, data })
},
// 删除师徒申请
deleteMentorsApply: async (id: number) => {
return await request.delete({ url: `/hrm/mentors-apply/delete?id=` + id })
},
// 导出师徒申请 Excel
exportMentorsApply: async (params) => {
return await request.download({ url: `/hrm/mentors-apply/export-excel`, params })
}
}

View File

@ -0,0 +1,53 @@
import request from '@/config/axios'
// 招聘需求申请 VO
export interface RecruitmentRequestVO {
id: number // 主键,自动递增
requestType: number // 需求类型:新增需求、替换需求、储备需求
requestDeptId: number // 所属部门
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
postId: number // 岗位id
positionName: string // 需求岗位名称
expectedOnboard: Date // 期望到岗日期
requestedCount: number // 需求人数
ageRange: string // 年龄范围18-2525-3530-45
monthlySalary: string // 薪资4k-7k5k-8k10k-15k
minEducation: number // 最低学历1=高中2=大专3=本科4=硕士5=博士
workLocation: number // 工作地点
maritalStatus: number // 婚姻状况:未婚、已婚、离异、丧偶
experience: string // 从业经验
}
// 招聘需求申请 API
export const RecruitmentRequestApi = {
// 查询招聘需求申请分页
getRecruitmentRequestPage: async (params: any) => {
return await request.get({ url: `/hrm/recruitment-request/page`, params })
},
// 查询招聘需求申请详情
getRecruitmentRequest: async (id: number) => {
return await request.get({ url: `/hrm/recruitment-request/get?id=` + id })
},
// 新增招聘需求申请
createRecruitmentRequest: async (data: RecruitmentRequestVO) => {
return await request.post({ url: `/hrm/recruitment-request/create`, data })
},
// 修改招聘需求申请
updateRecruitmentRequest: async (data: RecruitmentRequestVO) => {
return await request.put({ url: `/hrm/recruitment-request/update`, data })
},
// 删除招聘需求申请
deleteRecruitmentRequest: async (id: number) => {
return await request.delete({ url: `/hrm/recruitment-request/delete?id=` + id })
},
// 导出招聘需求申请 Excel
exportRecruitmentRequest: async (params) => {
return await request.download({ url: `/hrm/recruitment-request/export-excel`, params })
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// 离职申请 VO
export interface ResignationApplyVO {
id: number // 主键,自动递增
userId: number // 员工档案ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
expectedResignDate: Date // 预计离职日期
resignationReason: number // 离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他
reasonDescription: string // 离职原因说明
feedbackOnWorkEnv: string // 对工作等环境和公司文化的反馈
suggestions: string // 对公司的意见和建议
suggestionsForImprovement: string // 希望公司在未来的发展中能够做到的改进
}
// 离职申请 API
export const ResignationApplyApi = {
// 查询离职申请分页
getResignationApplyPage: async (params: any) => {
return await request.get({ url: `/hrm/resignation-apply/page`, params })
},
// 查询离职申请详情
getResignationApply: async (id: number) => {
return await request.get({ url: `/hrm/resignation-apply/get?id=` + id })
},
// 新增离职申请
createResignationApply: async (data: ResignationApplyVO) => {
return await request.post({ url: `/hrm/resignation-apply/create`, data })
},
// 修改离职申请
updateResignationApply: async (data: ResignationApplyVO) => {
return await request.put({ url: `/hrm/resignation-apply/update`, data })
},
// 删除离职申请
deleteResignationApply: async (id: number) => {
return await request.delete({ url: `/hrm/resignation-apply/delete?id=` + id })
},
// 导出离职申请 Excel
exportResignationApply: async (params) => {
return await request.download({ url: `/hrm/resignation-apply/export-excel`, params })
}
}

View File

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 用章申请 VO
export interface SealRequestVO {
id: number // 主键ID
applicantId: number // 申请人ID
companyId: number // 用章主体ID
sealType: number // 印章类型
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
fileName: string // 文件名称
sealCount: number // 用章次数
attachment: string // 附件
isPrint: boolean // 是否打印
instructions: string // 申请说明
applicantTime: Date // 申请时间
}
// 用章申请 API
export const SealRequestApi = {
// 查询用章申请分页
getSealRequestPage: async (params: any) => {
return await request.get({ url: `/hrm/seal-request/page`, params })
},
// 查询用章申请详情
getSealRequest: async (id: number) => {
return await request.get({ url: `/hrm/seal-request/get?id=` + id })
},
// 新增用章申请
createSealRequest: async (data: SealRequestVO) => {
return await request.post({ url: `/hrm/seal-request/create`, data })
},
// 修改用章申请
updateSealRequest: async (data: SealRequestVO) => {
return await request.put({ url: `/hrm/seal-request/update`, data })
},
// 删除用章申请
deleteSealRequest: async (id: number) => {
return await request.delete({ url: `/hrm/seal-request/delete?id=` + id })
},
// 导出用章申请 Excel
exportSealRequest: async (params) => {
return await request.download({ url: `/hrm/seal-request/export-excel`, params })
}
}

View File

@ -0,0 +1,52 @@
import request from '@/config/axios'
// 补助申请 VO
export interface SubsidyApplyVO {
id: number // 主键,自动递增
userId: number // 员工ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
effectiveDate: Date // 生效日期
applyDesc: string // 申请说明
elecSignature: string // 本人签字
}
// 补助申请 API
export const SubsidyApplyApi = {
// 查询补助申请分页
getSubsidyApplyPage: async (params: any) => {
return await request.get({ url: `/hrm/subsidy-apply/page`, params })
},
// 查询补助申请详情
getSubsidyApply: async (id: number) => {
return await request.get({ url: `/hrm/subsidy-apply/get?id=` + id })
},
// 新增补助申请
createSubsidyApply: async (data: SubsidyApplyVO) => {
return await request.post({ url: `/hrm/subsidy-apply/create`, data })
},
// 修改补助申请
updateSubsidyApply: async (data: SubsidyApplyVO) => {
return await request.put({ url: `/hrm/subsidy-apply/update`, data })
},
// 删除补助申请
deleteSubsidyApply: async (id: number) => {
return await request.delete({ url: `/hrm/subsidy-apply/delete?id=` + id })
},
// 导出补助申请 Excel
exportSubsidyApply: async (params) => {
return await request.download({ url: `/hrm/subsidy-apply/export-excel`, params })
},
// ==================== 子表(补助申请明细) ====================
// 获得补助申请明细列表
getSubsidyApplyDetailListBySubsidyApplicationId: async (subsidyApplicationId) => {
return await request.get({ url: `/hrm/subsidy-apply/subsidy-apply-detail/list-by-subsidy-application-id?subsidyApplicationId=` + subsidyApplicationId })
}
}

View File

@ -0,0 +1,43 @@
import request from '@/config/axios'
// 补助申请明细 VO
export interface SubsidyApplyDetailVO {
id: number // 主键,自动递增
subsidyApplicationId: number // 补助申请ID
subsidyType: number // 补助类型
beforeMoney: number // 原补助金额
afterMoney: number // 补助后金额
}
// 补助申请明细 API
export const SubsidyApplyDetailApi = {
// 查询补助申请明细分页
getSubsidyApplyDetailPage: async (params: any) => {
return await request.get({ url: `/hrm/subsidy-apply-detail/page`, params })
},
// 查询补助申请明细详情
getSubsidyApplyDetail: async (id: number) => {
return await request.get({ url: `/hrm/subsidy-apply-detail/get?id=` + id })
},
// 新增补助申请明细
createSubsidyApplyDetail: async (data: SubsidyApplyDetailVO) => {
return await request.post({ url: `/hrm/subsidy-apply-detail/create`, data })
},
// 修改补助申请明细
updateSubsidyApplyDetail: async (data: SubsidyApplyDetailVO) => {
return await request.put({ url: `/hrm/subsidy-apply-detail/update`, data })
},
// 删除补助申请明细
deleteSubsidyApplyDetail: async (id: number) => {
return await request.delete({ url: `/hrm/subsidy-apply-detail/delete?id=` + id })
},
// 导出补助申请明细 Excel
exportSubsidyApplyDetail: async (params) => {
return await request.download({ url: `/hrm/subsidy-apply-detail/export-excel`, params })
}
}

View File

@ -0,0 +1,59 @@
import request from '@/config/axios'
// 人才库 VO
export interface TalentPoolVO {
id: number // 主键ID
recruitmentRequestId: number // 招聘需求ID
name: string // 姓名
gender: string // 性别
birthPlace: string // 籍贯
age: number // 年龄
email: string // 电子邮箱
school: string // 学校
major: string // 专业
phone: string // 手机号
birthday: Date // 出生日期
postId: number // 岗位id
desiredPosition: string // 意向岗位名称
desiredCity: string // 意向城市
highestEducation: number // 最高学历(大专、本科、硕士、博士)
personalPhoto: string // 个人照片
workCaseAttachment: string // 工作案例附件
resumeAttachment: string // 简历附件
isInternalRef: number // 是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号
maritalStatus: number // 婚育情况(未婚、已婚未育、已婚已育)
deptId: number // 部门ID
}
// 人才库 API
export const TalentPoolApi = {
// 查询人才库分页
getTalentPoolPage: async (params: any) => {
return await request.get({ url: `/hrm/talent-pool/page`, params })
},
// 查询人才库详情
getTalentPool: async (id: number) => {
return await request.get({ url: `/hrm/talent-pool/get?id=` + id })
},
// 新增人才库
createTalentPool: async (data: TalentPoolVO) => {
return await request.post({ url: `/hrm/talent-pool/create`, data })
},
// 修改人才库
updateTalentPool: async (data: TalentPoolVO) => {
return await request.put({ url: `/hrm/talent-pool/update`, data })
},
// 删除人才库
deleteTalentPool: async (id: number) => {
return await request.delete({ url: `/hrm/talent-pool/delete?id=` + id })
},
// 导出人才库 Excel
exportTalentPool: async (params) => {
return await request.download({ url: `/hrm/talent-pool/export-excel`, params })
}
}

View File

@ -0,0 +1,50 @@
import request from '@/config/axios'
// 培训信息 VO
export interface TrainingVO {
id: number // 主键ID
coursewareId: number // 课件ID关联courseware表
trainingName: string // 培训名称
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
startTime: Date // 培训开始时间
endTime: Date // 培训结束时间
trainingHours: number // 培训学时
lecturer: string // 讲师
trainingLocation: string // 培训地点
trainingPurpose: string // 培训目的
deptId: number // 部门ID
}
// 培训信息 API
export const TrainingApi = {
// 查询培训信息分页
getTrainingPage: async (params: any) => {
return await request.get({ url: `/hrm/training/page`, params })
},
// 查询培训信息详情
getTraining: async (id: number) => {
return await request.get({ url: `/hrm/training/get?id=` + id })
},
// 新增培训信息
createTraining: async (data: TrainingVO) => {
return await request.post({ url: `/hrm/training/create`, data })
},
// 修改培训信息
updateTraining: async (data: TrainingVO) => {
return await request.put({ url: `/hrm/training/update`, data })
},
// 删除培训信息
deleteTraining: async (id: number) => {
return await request.delete({ url: `/hrm/training/delete?id=` + id })
},
// 导出培训信息 Excel
exportTraining: async (params) => {
return await request.download({ url: `/hrm/training/export-excel`, params })
}
}

View File

@ -0,0 +1,47 @@
import request from '@/config/axios'
// 培训经历 VO
export interface TrainingExperienceVO {
id: number // 主键ID
userId: number // 员工ID
trainingId: number // 培训ID关联training表
startTime: Date // 培训开始时间
endTime: Date // 培训结束时间
trainingScore: number // 培训成绩
certificate: string // 培训证书名称
certificateNumber: string // 培训证书编号
remark: string // 备注
}
// 培训经历 API
export const TrainingExperienceApi = {
// 查询培训经历分页
getTrainingExperiencePage: async (params: any) => {
return await request.get({ url: `/hrm/training-experience/page`, params })
},
// 查询培训经历详情
getTrainingExperience: async (id: number) => {
return await request.get({ url: `/hrm/training-experience/get?id=` + id })
},
// 新增培训经历
createTrainingExperience: async (data: TrainingExperienceVO) => {
return await request.post({ url: `/hrm/training-experience/create`, data })
},
// 修改培训经历
updateTrainingExperience: async (data: TrainingExperienceVO) => {
return await request.put({ url: `/hrm/training-experience/update`, data })
},
// 删除培训经历
deleteTrainingExperience: async (id: number) => {
return await request.delete({ url: `/hrm/training-experience/delete?id=` + id })
},
// 导出培训经历 Excel
exportTrainingExperience: async (params) => {
return await request.download({ url: `/hrm/training-experience/export-excel`, params })
}
}

106
src/api/hrm/user/index.ts Normal file
View File

@ -0,0 +1,106 @@
import request from '@/config/axios'
// 员工档案信息 VO
export interface UserVO {
id: number // 唯一主键
acctId: number // 用户登录账号IDsys_user表
userNo: string // 员工编号
realName: string // 员工姓名
phone: string // 手机号
email: string // 邮箱
employmentDate: Date // 入职日期
regularizationDate: Date // 转正日期
postId: number // 岗位Id
postLevel: number // 职级
gradeLevel: number // 档级
employType: number // 聘用形式(全职、见习、实习、劳务、联创、其他)
trialStartDate: Date // 试用开始日期
trialEndDate: Date // 试用结束日期
probationPeriod: number // 试用期限(月)
contractStartDate: Date // 合同开始日期
contractEndDate: Date // 合同结束日期
contractTerm: number // 合同期限(年)
gender: number // 性别(男、女、其他)
age: string // 年龄
resume: string // 简历附件
workPhoto: string // 形象照
idCardFaceSide: string // 身份证人像
idCardNationalEmblemSide: string // 身份证国徽
currentAddress: string // 现住址
idCardNumber: string // 身份证号
birthDate: Date // 出生日期
issuingAuthority: string // 发证机关
nation: number // 民族56个民族
householdRegistrationScan: string // 户口扫描件
householdType: number // 户籍类型(农村、城镇)
householdAddress: string // 户籍地
politicalStatus: number // 政治面貌(共青团员、中共预备党员、中共党员、群众、其他)
maritalStatus: number // 婚姻状况(未婚、已婚未育、已婚已育)
relationship1: number // 关系1父母、夫妻、兄弟、姊妹、朋友、其他
contactName1: string // 联系人姓名1
contactPhone1: string // 联系手机号1
relationship2: number // 关系2父母、夫妻、兄弟、姊妹、朋友、其他
contactName2: string // 联系人姓名2
contactPhone2: string // 联系手机号2
bankBranch: string // 工商银行开户支行
salaryCardNumber: string // 工资卡卡号
accountRelationship: number // 账户名与本人关系(父亲、母亲)
pensionCardHolder: string // 敬老费银行卡户名
pensionAccountNumber: string // 敬老费银行账号
pensionBankBranch: string // 敬老费开户行网点
insuranceStatus: number // 五险缴纳情况(未缴纳过、已缴纳过)
oneInchPhoto: string // 1寸白底照当未缴纳五险一金需要上传
resignationCertScan: string // 离职证明扫描件
highestEducation: string // 最高学历
educationSystemType: number // 学制类型(全日制、非全日制)
educationCertificateScan: string // 学历扫描件
status: number // 状态
deptId: number // 部门ID
}
// 员工档案信息 API
export const UserApi = {
// 查询员工档案信息分页
getUserPage: async (params: any) => {
return await request.get({ url: `/hrm/user/page`, params })
},
// 查询员工档案信息详情
getUser: async (id: number) => {
return await request.get({ url: `/hrm/user/get?id=` + id })
},
// 新增员工档案信息
createUser: async (data: UserVO) => {
return await request.post({ url: `/hrm/user/create`, data })
},
// 修改员工档案信息
updateUser: async (data: UserVO) => {
return await request.put({ url: `/hrm/user/update`, data })
},
// 删除员工档案信息
deleteUser: async (id: number) => {
return await request.delete({ url: `/hrm/user/delete?id=` + id })
},
// 导出员工档案信息 Excel
exportUser: async (params) => {
return await request.download({ url: `/hrm/user/export-excel`, params })
},
// ==================== 子表(教育信息) ====================
// 获得教育信息列表
getUserEducationInfoListByUserId: async (userId) => {
return await request.get({ url: `/hrm/user/user-education-info/list-by-user-id?userId=` + userId })
},
// ==================== 子表(工作经历信息) ====================
// 获得工作经历信息列表
getUserWorkInfoListByUserId: async (userId) => {
return await request.get({ url: `/hrm/user/user-work-info/list-by-user-id?userId=` + userId })
}
}

View File

@ -0,0 +1,45 @@
import request from '@/config/axios'
// 教育信息 VO
export interface UserEducationInfoVO {
id: number // 唯一主键
userId: number // 员工档案ID关联hrm_user_infor
education: number // 学历
beginDate: Date // 入学日期
graduationDate: Date // 毕业日期
schoolName: string // 学校名称
major: string // 专业名称
}
// 教育信息 API
export const UserEducationInfoApi = {
// 查询教育信息分页
getUserEducationInfoPage: async (params: any) => {
return await request.get({ url: `/hrm/user-education-info/page`, params })
},
// 查询教育信息详情
getUserEducationInfo: async (id: number) => {
return await request.get({ url: `/hrm/user-education-info/get?id=` + id })
},
// 新增教育信息
createUserEducationInfo: async (data: UserEducationInfoVO) => {
return await request.post({ url: `/hrm/user-education-info/create`, data })
},
// 修改教育信息
updateUserEducationInfo: async (data: UserEducationInfoVO) => {
return await request.put({ url: `/hrm/user-education-info/update`, data })
},
// 删除教育信息
deleteUserEducationInfo: async (id: number) => {
return await request.delete({ url: `/hrm/user-education-info/delete?id=` + id })
},
// 导出教育信息 Excel
exportUserEducationInfo: async (params) => {
return await request.download({ url: `/hrm/user-education-info/export-excel`, params })
}
}

View File

@ -0,0 +1,48 @@
import request from '@/config/axios'
// 员工消息 VO
export interface UserMessageVO {
id: number // 主键 ID
userId: number // 员工ID
messageType: number // 消息类型,如系统通知、提醒、关怀等
careType: number // 消息关怀类型,如生日、节日等
title: string // 通知主题
content: string // 通知内容
noticeMethod: number // 通知方式,如邮件、短信、系统通知
noticeTime: Date // 通知时间
messageStatus: number // 消息状态0=未读1=已读
readTime: Date // 已读时间
}
// 员工消息 API
export const UserMessageApi = {
// 查询员工消息分页
getUserMessagePage: async (params: any) => {
return await request.get({ url: `/hrm/user-message/page`, params })
},
// 查询员工消息详情
getUserMessage: async (id: number) => {
return await request.get({ url: `/hrm/user-message/get?id=` + id })
},
// 新增员工消息
createUserMessage: async (data: UserMessageVO) => {
return await request.post({ url: `/hrm/user-message/create`, data })
},
// 修改员工消息
updateUserMessage: async (data: UserMessageVO) => {
return await request.put({ url: `/hrm/user-message/update`, data })
},
// 删除员工消息
deleteUserMessage: async (id: number) => {
return await request.delete({ url: `/hrm/user-message/delete?id=` + id })
},
// 导出员工消息 Excel
exportUserMessage: async (params) => {
return await request.download({ url: `/hrm/user-message/export-excel`, params })
}
}

View File

@ -0,0 +1,46 @@
import request from '@/config/axios'
// 入职申请 VO
export interface UserOnboardingVO {
id: number // 主键,自动递增
talentId: number // 人才库id
userId: number // 员工ID
processInstanceId: string // 工作流编号
auditStatus: number // 审批状态
employType: number // 聘用形式(全职、见习、实习、劳务、劳动、联创、其他)
eSignature: string // 员工签字
submissionDate: Date // 提交日期
}
// 入职申请 API
export const UserOnboardingApi = {
// 查询入职申请分页
getUserOnboardingPage: async (params: any) => {
return await request.get({ url: `/hrm/user-onboarding/page`, params })
},
// 查询入职申请详情
getUserOnboarding: async (id: number) => {
return await request.get({ url: `/hrm/user-onboarding/get?id=` + id })
},
// 新增入职申请
createUserOnboarding: async (data: UserOnboardingVO) => {
return await request.post({ url: `/hrm/user-onboarding/create`, data })
},
// 修改入职申请
updateUserOnboarding: async (data: UserOnboardingVO) => {
return await request.put({ url: `/hrm/user-onboarding/update`, data })
},
// 删除入职申请
deleteUserOnboarding: async (id: number) => {
return await request.delete({ url: `/hrm/user-onboarding/delete?id=` + id })
},
// 导出入职申请 Excel
exportUserOnboarding: async (params) => {
return await request.download({ url: `/hrm/user-onboarding/export-excel`, params })
}
}

View File

@ -0,0 +1,46 @@
import request from '@/config/axios'
// 工作经历信息 VO
export interface UserWorkInfoVO {
id: number // 唯一主键
userId: number // 员工档案ID关联hrm_user_infor
companyName: string // 单位名称
deptName: string // 部门名称
postName: string // 职位名称
startDate: Date // 开始日期
endDate: Date // 离职日期
monthlySalary: number // 待遇(元/月)
}
// 工作经历信息 API
export const UserWorkInfoApi = {
// 查询工作经历信息分页
getUserWorkInfoPage: async (params: any) => {
return await request.get({ url: `/hrm/user-work-info/page`, params })
},
// 查询工作经历信息详情
getUserWorkInfo: async (id: number) => {
return await request.get({ url: `/hrm/user-work-info/get?id=` + id })
},
// 新增工作经历信息
createUserWorkInfo: async (data: UserWorkInfoVO) => {
return await request.post({ url: `/hrm/user-work-info/create`, data })
},
// 修改工作经历信息
updateUserWorkInfo: async (data: UserWorkInfoVO) => {
return await request.put({ url: `/hrm/user-work-info/update`, data })
},
// 删除工作经历信息
deleteUserWorkInfo: async (id: number) => {
return await request.delete({ url: `/hrm/user-work-info/delete?id=` + id })
},
// 导出工作经历信息 Excel
exportUserWorkInfo: async (params) => {
return await request.download({ url: `/hrm/user-work-info/export-excel`, params })
}
}

View File

@ -49,8 +49,8 @@ const formData = ref({
description: undefined,
})
const formRules = reactive({
name: [{ required: true, message: '合同名称不能为空', trigger: 'blur' }],
url: [{ required: true, message: '文件地址不能为空', trigger: 'blur' }],
// name: [{ required: true, message: '', trigger: 'blur' }],
// url: [{ required: true, message: '', trigger: 'blur' }],
})
const formRef = ref() // Ref

View File

@ -0,0 +1,197 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="通知类型(公告、新闻、制度)" prop="annoType">
<el-select v-model="formData.annoType" placeholder="请选择通知类型(公告、新闻、制度)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_ANNO_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input v-model="formData.title" placeholder="请输入标题" />
</el-form-item>
<el-form-item label="内容" prop="content">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="公告类别(公告:人事任免、放假通知、其他)" prop="publishType">
<el-select v-model="formData.publishType" placeholder="请选择公告类别(公告:人事任免、放假通知、其他)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="署名" prop="publishName">
<el-input v-model="formData.publishName" placeholder="请输入署名" />
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="formData.attachment" placeholder="请输入附件" />
</el-form-item>
<el-form-item label="发布模式0=立即1=定时)" prop="publishMode">
<el-select v-model="formData.publishMode" placeholder="请选择发布模式0=立即1=定时)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_MODE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="计划发布时间. 立即发布时为空" prop="publishPlanTime">
<el-date-picker
v-model="formData.publishPlanTime"
type="date"
value-format="x"
placeholder="选择计划发布时间. 立即发布时为空"
/>
</el-form-item>
<el-form-item label="实际发布时间" prop="publishRealTime">
<el-date-picker
v-model="formData.publishRealTime"
type="date"
value-format="x"
placeholder="选择实际发布时间"
/>
</el-form-item>
<el-form-item label="发布范围类型 1公司 2部门 3人员" prop="publishRangerType">
<el-select v-model="formData.publishRangerType" placeholder="请选择发布范围类型 1公司 2部门 3人员">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_RANGER_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发布范围选择" prop="publishRanger">
<el-input v-model="formData.publishRanger" placeholder="请输入发布范围选择" />
</el-form-item>
<el-form-item label="发布状态。已发布 未发布" prop="publishStatus">
<el-select v-model="formData.publishStatus" placeholder="请选择发布状态。已发布 未发布">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { AnnouncementApi, AnnouncementVO } from '@/api/hrm/announcement'
/** 通知表(公告、新闻、制度) 表单 */
defineOptions({ name: 'AnnouncementForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
annoType: undefined,
title: undefined,
content: undefined,
publishType: undefined,
publishName: undefined,
attachment: undefined,
publishMode: undefined,
publishPlanTime: undefined,
publishRealTime: undefined,
publishRangerType: undefined,
publishRanger: undefined,
publishStatus: undefined
})
const formRules = reactive({
annoType: [{ required: true, message: '通知类型(公告、新闻、制度)不能为空', trigger: 'change' }],
title: [{ required: true, message: '标题不能为空', trigger: 'blur' }],
content: [{ required: true, message: '内容不能为空', trigger: 'blur' }],
publishName: [{ required: true, message: '署名不能为空', trigger: 'blur' }],
publishMode: [{ required: true, message: '发布模式0=立即1=定时)不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await AnnouncementApi.getAnnouncement(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as AnnouncementVO
if (formType.value === 'create') {
await AnnouncementApi.createAnnouncement(data)
message.success(t('common.createSuccess'))
} else {
await AnnouncementApi.updateAnnouncement(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
annoType: undefined,
title: undefined,
content: undefined,
publishType: undefined,
publishName: undefined,
attachment: undefined,
publishMode: undefined,
publishPlanTime: undefined,
publishRealTime: undefined,
publishRangerType: undefined,
publishRanger: undefined,
publishStatus: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,366 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="通知类型(公告、新闻、制度)" prop="annoType">
<el-select
v-model="queryParams.annoType"
placeholder="请选择通知类型(公告、新闻、制度)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_ANNO_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="标题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入标题"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="公告类别(公告:人事任免、放假通知、其他)" prop="publishType">
<el-select
v-model="queryParams.publishType"
placeholder="请选择公告类别(公告:人事任免、放假通知、其他)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="署名" prop="publishName">
<el-input
v-model="queryParams.publishName"
placeholder="请输入署名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input
v-model="queryParams.attachment"
placeholder="请输入附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="发布模式0=立即1=定时)" prop="publishMode">
<el-select
v-model="queryParams.publishMode"
placeholder="请选择发布模式0=立即1=定时)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_MODE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="计划发布时间. 立即发布时为空" prop="publishPlanTime">
<el-date-picker
v-model="queryParams.publishPlanTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="实际发布时间" prop="publishRealTime">
<el-date-picker
v-model="queryParams.publishRealTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="发布范围类型 1公司 2部门 3人员" prop="publishRangerType">
<el-select
v-model="queryParams.publishRangerType"
placeholder="请选择发布范围类型 1公司 2部门 3人员"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_RANGER_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发布范围选择" prop="publishRanger">
<el-input
v-model="queryParams.publishRanger"
placeholder="请输入发布范围选择"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="发布状态。已发布 未发布" prop="publishStatus">
<el-select
v-model="queryParams.publishStatus"
placeholder="请选择发布状态。已发布 未发布"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:announcement:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:announcement:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="唯一主键" align="center" prop="id" />
<el-table-column label="通知类型(公告、新闻、制度)" align="center" prop="annoType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_ANNO_TYPE" :value="scope.row.annoType" />
</template>
</el-table-column>
<el-table-column label="标题" align="center" prop="title" />
<el-table-column label="内容" align="center" prop="content" />
<el-table-column label="公告类别(公告:人事任免、放假通知、其他)" align="center" prop="publishType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_PUBLISH_TYPE" :value="scope.row.publishType" />
</template>
</el-table-column>
<el-table-column label="署名" align="center" prop="publishName" />
<el-table-column label="附件" align="center" prop="attachment" />
<el-table-column label="发布模式0=立即1=定时)" align="center" prop="publishMode">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_PUBLISH_MODE" :value="scope.row.publishMode" />
</template>
</el-table-column>
<el-table-column
label="计划发布时间. 立即发布时为空"
align="center"
prop="publishPlanTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="实际发布时间"
align="center"
prop="publishRealTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="发布范围类型 1公司 2部门 3人员" align="center" prop="publishRangerType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_PUBLISH_RANGER_TYPE" :value="scope.row.publishRangerType" />
</template>
</el-table-column>
<el-table-column label="发布范围选择" align="center" prop="publishRanger" />
<el-table-column label="发布状态。已发布 未发布" align="center" prop="publishStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_PUBLISH_STATUS" :value="scope.row.publishStatus" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:announcement:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:announcement:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<AnnouncementForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { AnnouncementApi, AnnouncementVO } from '@/api/hrm/announcement'
import AnnouncementForm from './AnnouncementForm.vue'
/** 通知表(公告、新闻、制度) 列表 */
defineOptions({ name: 'Announcement' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<AnnouncementVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
annoType: undefined,
title: undefined,
content: undefined,
publishType: undefined,
publishName: undefined,
attachment: undefined,
publishMode: undefined,
publishPlanTime: [],
publishRealTime: [],
publishRangerType: undefined,
publishRanger: undefined,
publishStatus: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await AnnouncementApi.getAnnouncementPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await AnnouncementApi.deleteAnnouncement(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await AnnouncementApi.exportAnnouncement(queryParams)
download.excel(data, '通知表(公告、新闻、制度).xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,224 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等" prop="careType">
<el-select v-model="formData.careType" placeholder="请选择关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_CARA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知主题" prop="noticeTitle">
<el-input v-model="formData.noticeTitle" placeholder="请输入通知主题" />
</el-form-item>
<el-form-item label="发布范围类型 1公司 2部门 3人员" prop="publishRangerType">
<el-select v-model="formData.publishRangerType" placeholder="请选择发布范围类型 1公司 2部门 3人员">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_RANGER_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发送时间方式(字典):前一天、当天、后一天" prop="releaseMethod">
<el-select v-model="formData.releaseMethod" placeholder="请选择发送时间方式(字典):前一天、当天、后一天">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELEASE_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发布范围选择" prop="publishRanger">
<el-input v-model="formData.publishRanger" placeholder="请输入发布范围选择" />
</el-form-item>
<el-form-item label="发布时间" prop="releaseTime">
<el-date-picker
v-model="formData.releaseTime"
type="date"
value-format="x"
placeholder="选择发布时间"
/>
</el-form-item>
<el-form-item label="发布日期/节日日期" prop="releaseDate">
<el-date-picker
v-model="formData.releaseDate"
type="date"
value-format="x"
placeholder="选择发布日期/节日日期"
/>
</el-form-item>
<el-form-item label="通知方式(字典):邮件、短信、系统通知" prop="noticeMethod">
<el-select v-model="formData.noticeMethod" placeholder="请选择通知方式(字典):邮件、短信、系统通知">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_NOTICE_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知内容" prop="noticeContent">
<Editor v-model="formData.noticeContent" height="150px" />
</el-form-item>
<el-form-item label="入职关怀日期类型" prop="employmentDateType">
<el-select v-model="formData.employmentDateType" placeholder="请选择入职关怀日期类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOYMENT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="入职关怀发送通知" prop="employmentNoticeType">
<el-select v-model="formData.employmentNoticeType" placeholder="请选择入职关怀发送通知">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOYMENT_NOTICE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="自定义通知类型" prop="diyType">
<el-select v-model="formData.diyType" placeholder="请选择自定义通知类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_DIY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="自定义事件名称" prop="diyEventType">
<el-select v-model="formData.diyEventType" placeholder="请选择自定义事件名称">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_DIY_EVENT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CareNoticeApi, CareNoticeVO } from '@/api/hrm/carenotice'
/** 关怀通知 表单 */
defineOptions({ name: 'CareNoticeForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
careType: undefined,
noticeTitle: undefined,
publishRangerType: undefined,
releaseMethod: undefined,
publishRanger: undefined,
releaseTime: undefined,
releaseDate: undefined,
noticeMethod: undefined,
noticeContent: undefined,
employmentDateType: undefined,
employmentNoticeType: undefined,
diyType: undefined,
diyEventType: undefined
})
const formRules = reactive({
careType: [{ required: true, message: '关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等不能为空', trigger: 'change' }],
noticeTitle: [{ required: true, message: '通知主题不能为空', trigger: 'blur' }],
releaseMethod: [{ required: true, message: '发送时间方式(字典):前一天、当天、后一天不能为空', trigger: 'change' }],
releaseTime: [{ required: true, message: '发布时间不能为空', trigger: 'blur' }],
noticeMethod: [{ required: true, message: '通知方式(字典):邮件、短信、系统通知不能为空', trigger: 'change' }],
noticeContent: [{ required: true, message: '通知内容不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await CareNoticeApi.getCareNotice(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as CareNoticeVO
if (formType.value === 'create') {
await CareNoticeApi.createCareNotice(data)
message.success(t('common.createSuccess'))
} else {
await CareNoticeApi.updateCareNotice(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
careType: undefined,
noticeTitle: undefined,
publishRangerType: undefined,
releaseMethod: undefined,
publishRanger: undefined,
releaseTime: undefined,
releaseDate: undefined,
noticeMethod: undefined,
noticeContent: undefined,
employmentDateType: undefined,
employmentNoticeType: undefined,
diyType: undefined,
diyEventType: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,395 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等" prop="careType">
<el-select
v-model="queryParams.careType"
placeholder="请选择关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_CARA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知主题" prop="noticeTitle">
<el-input
v-model="queryParams.noticeTitle"
placeholder="请输入通知主题"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="发布范围类型 1公司 2部门 3人员" prop="publishRangerType">
<el-select
v-model="queryParams.publishRangerType"
placeholder="请选择发布范围类型 1公司 2部门 3人员"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_PUBLISH_RANGER_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发送时间方式(字典):前一天、当天、后一天" prop="releaseMethod">
<el-select
v-model="queryParams.releaseMethod"
placeholder="请选择发送时间方式(字典):前一天、当天、后一天"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELEASE_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发布范围选择" prop="publishRanger">
<el-input
v-model="queryParams.publishRanger"
placeholder="请输入发布范围选择"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="发布时间" prop="releaseTime">
<el-date-picker
v-model="queryParams.releaseTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="发布日期/节日日期" prop="releaseDate">
<el-date-picker
v-model="queryParams.releaseDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="通知方式(字典):邮件、短信、系统通知" prop="noticeMethod">
<el-select
v-model="queryParams.noticeMethod"
placeholder="请选择通知方式(字典):邮件、短信、系统通知"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_NOTICE_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="入职关怀日期类型" prop="employmentDateType">
<el-select
v-model="queryParams.employmentDateType"
placeholder="请选择入职关怀日期类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOYMENT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="入职关怀发送通知" prop="employmentNoticeType">
<el-select
v-model="queryParams.employmentNoticeType"
placeholder="请选择入职关怀发送通知"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOYMENT_NOTICE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="自定义通知类型" prop="diyType">
<el-select
v-model="queryParams.diyType"
placeholder="请选择自定义通知类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_DIY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="自定义事件名称" prop="diyEventType">
<el-select
v-model="queryParams.diyEventType"
placeholder="请选择自定义事件名称"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_DIY_EVENT_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:care-notice:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:care-notice:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="关怀类型(字典):生日、节日、入职周年、转正日期到期、任职开始/结束、退休到期、身份证有效期到期等" align="center" prop="careType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_CARA_TYPE" :value="scope.row.careType" />
</template>
</el-table-column>
<el-table-column label="通知主题" align="center" prop="noticeTitle" />
<el-table-column label="发布范围类型 1公司 2部门 3人员" align="center" prop="publishRangerType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_PUBLISH_RANGER_TYPE" :value="scope.row.publishRangerType" />
</template>
</el-table-column>
<el-table-column label="发送时间方式(字典):前一天、当天、后一天" align="center" prop="releaseMethod">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_RELEASE_METHOD" :value="scope.row.releaseMethod" />
</template>
</el-table-column>
<el-table-column label="发布范围选择" align="center" prop="publishRanger" />
<el-table-column label="发布时间" align="center" prop="releaseTime" />
<el-table-column label="发布日期/节日日期" align="center" prop="releaseDate" />
<el-table-column label="通知方式(字典):邮件、短信、系统通知" align="center" prop="noticeMethod">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_NOTICE_METHOD" :value="scope.row.noticeMethod" />
</template>
</el-table-column>
<el-table-column label="通知内容" align="center" prop="noticeContent" />
<el-table-column label="入职关怀日期类型" align="center" prop="employmentDateType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EMPLOYMENT_TYPE" :value="scope.row.employmentDateType" />
</template>
</el-table-column>
<el-table-column label="入职关怀发送通知" align="center" prop="employmentNoticeType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EMPLOYMENT_NOTICE_TYPE" :value="scope.row.employmentNoticeType" />
</template>
</el-table-column>
<el-table-column label="自定义通知类型" align="center" prop="diyType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_DIY_TYPE" :value="scope.row.diyType" />
</template>
</el-table-column>
<el-table-column label="自定义事件名称" align="center" prop="diyEventType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_DIY_EVENT_TYPE" :value="scope.row.diyEventType" />
</template>
</el-table-column>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:care-notice:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:care-notice:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<CareNoticeForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CareNoticeApi, CareNoticeVO } from '@/api/hrm/carenotice'
import CareNoticeForm from './CareNoticeForm.vue'
/** 关怀通知 列表 */
defineOptions({ name: 'CareNotice' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<CareNoticeVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
careType: undefined,
noticeTitle: undefined,
publishRangerType: undefined,
releaseMethod: undefined,
publishRanger: undefined,
releaseTime: [],
releaseDate: [],
noticeMethod: undefined,
noticeContent: undefined,
employmentDateType: undefined,
employmentNoticeType: undefined,
diyType: undefined,
diyEventType: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await CareNoticeApi.getCareNoticePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await CareNoticeApi.deleteCareNotice(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CareNoticeApi.exportCareNotice(queryParams)
download.excel(data, '关怀通知.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,136 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="申请人ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入申请人ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="证明类型(在职证明、实习证明)" prop="certificateType">
<el-select v-model="formData.certificateType" placeholder="请选择证明类型(在职证明、实习证明)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_CERTIFICATE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="申请日期" prop="applicationDate">
<el-date-picker
v-model="formData.applicationDate"
type="date"
value-format="x"
placeholder="选择申请日期"
/>
</el-form-item>
<el-form-item label="申请事由" prop="reason">
<el-input v-model="formData.reason" placeholder="请输入申请事由" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CertificateRequestApi, CertificateRequestVO } from '@/api/hrm/certificaterequest'
/** 人事证明申请 表单 */
defineOptions({ name: 'CertificateRequestForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
certificateType: undefined,
applicationDate: undefined,
reason: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '申请人ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
certificateType: [{ required: true, message: '证明类型(在职证明、实习证明)不能为空', trigger: 'change' }],
applicationDate: [{ required: true, message: '申请日期不能为空', trigger: 'blur' }],
reason: [{ required: true, message: '申请事由不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await CertificateRequestApi.getCertificateRequest(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as CertificateRequestVO
if (formType.value === 'create') {
await CertificateRequestApi.createCertificateRequest(data)
message.success(t('common.createSuccess'))
} else {
await CertificateRequestApi.updateCertificateRequest(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
certificateType: undefined,
applicationDate: undefined,
reason: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,256 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="申请人ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入申请人ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="证明类型(在职证明、实习证明)" prop="certificateType">
<el-select
v-model="queryParams.certificateType"
placeholder="请选择证明类型(在职证明、实习证明)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_CERTIFICATE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="申请日期" prop="applicationDate">
<el-date-picker
v-model="queryParams.applicationDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="申请事由" prop="reason">
<el-input
v-model="queryParams.reason"
placeholder="请输入申请事由"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:certificate-request:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:certificate-request:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="申请人ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="证明类型(在职证明、实习证明)" align="center" prop="certificateType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_CERTIFICATE_TYPE" :value="scope.row.certificateType" />
</template>
</el-table-column>
<el-table-column label="申请日期" align="center" prop="applicationDate" />
<el-table-column label="申请事由" align="center" prop="reason" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:certificate-request:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:certificate-request:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<CertificateRequestForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CertificateRequestApi, CertificateRequestVO } from '@/api/hrm/certificaterequest'
import CertificateRequestForm from './CertificateRequestForm.vue'
/** 人事证明申请 列表 */
defineOptions({ name: 'CertificateRequest' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<CertificateRequestVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
certificateType: undefined,
applicationDate: [],
reason: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await CertificateRequestApi.getCertificateRequestPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await CertificateRequestApi.deleteCertificateRequest(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CertificateRequestApi.exportCertificateRequest(queryParams)
download.excel(data, '人事证明申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,163 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="课件名称" prop="coursewareName">
<el-input v-model="formData.coursewareName" placeholder="请输入课件名称" />
</el-form-item>
<el-form-item label="作者" prop="author">
<el-input v-model="formData.author" placeholder="请输入作者" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="课程类型" prop="courseType">
<el-select v-model="formData.courseType" placeholder="请选择课程类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_COURSE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="适合学习的部门. 逗号分隔的部门id" prop="suitableDept">
<el-input v-model="formData.suitableDept" placeholder="请输入适合学习的部门. 逗号分隔的部门id" />
</el-form-item>
<el-form-item label="课件内容" prop="content">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="视频附件" prop="videoAttachment">
<el-input v-model="formData.videoAttachment" placeholder="请输入视频附件" />
</el-form-item>
<el-form-item label="课件大纲" prop="outline">
<el-input v-model="formData.outline" placeholder="请输入课件大纲" />
</el-form-item>
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="课件详情" name="coursewareDetail">
<CoursewareDetailForm ref="coursewareDetailFormRef" :courseware-id="formData.id" />
</el-tab-pane>
</el-tabs>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CoursewareApi, CoursewareVO } from '@/api/hrm/courseware'
import CoursewareDetailForm from './components/CoursewareDetailForm.vue'
/** 课件 表单 */
defineOptions({ name: 'CoursewareForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
coursewareName: undefined,
author: undefined,
processInstanceId: undefined,
auditStatus: undefined,
courseType: undefined,
suitableDept: undefined,
content: undefined,
videoAttachment: undefined,
outline: undefined
})
const formRules = reactive({
coursewareName: [{ required: true, message: '课件名称不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 子表的表单 */
const subTabsName = ref('coursewareDetail')
const coursewareDetailFormRef = ref()
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await CoursewareApi.getCourseware(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await coursewareDetailFormRef.value.validate()
} catch (e) {
subTabsName.value = 'coursewareDetail'
return
}
//
formLoading.value = true
try {
const data = formData.value as unknown as CoursewareVO
//
data.coursewareDetails = coursewareDetailFormRef.value.getData()
if (formType.value === 'create') {
await CoursewareApi.createCourseware(data)
message.success(t('common.createSuccess'))
} else {
await CoursewareApi.updateCourseware(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
coursewareName: undefined,
author: undefined,
processInstanceId: undefined,
auditStatus: undefined,
courseType: undefined,
suitableDept: undefined,
content: undefined,
videoAttachment: undefined,
outline: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,148 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="题目" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.question`" :rules="formRules.question" class="mb-0px!">
<el-input v-model="row.question" placeholder="请输入题目" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="题目类型(选择、填空、论述)" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.questionType`" :rules="formRules.questionType" class="mb-0px!">
<el-select v-model="row.questionType" placeholder="请选择题目类型(选择、填空、论述)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_QUESTION_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="答案" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.answer`" :rules="formRules.answer" class="mb-0px!">
<el-input v-model="row.answer" placeholder="请输入答案" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="选择题选项A" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.optionA`" :rules="formRules.optionA" class="mb-0px!">
<el-input v-model="row.optionA" placeholder="请输入选择题选项A" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="选择题选项B" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.optionB`" :rules="formRules.optionB" class="mb-0px!">
<el-input v-model="row.optionB" placeholder="请输入选择题选项B" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="选择题选项C" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.optionC`" :rules="formRules.optionC" class="mb-0px!">
<el-input v-model="row.optionC" placeholder="请输入选择题选项C" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="选择题选项D" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.optionD`" :rules="formRules.optionD" class="mb-0px!">
<el-input v-model="row.optionD" placeholder="请输入选择题选项D" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加课件详情</el-button>
</el-row>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CoursewareApi } from '@/api/hrm/courseware'
const props = defineProps<{
coursewareId: undefined // IDcourseware
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
coursewareId: [{ required: true, message: '课件ID关联courseware表不能为空', trigger: 'blur' }],
question: [{ required: true, message: '题目不能为空', trigger: 'blur' }],
questionType: [{ required: true, message: '题目类型(选择、填空、论述)不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.coursewareId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await CoursewareApi.getCoursewareDetailListByCoursewareId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
coursewareId: undefined,
question: undefined,
questionType: undefined,
answer: undefined,
optionA: undefined,
optionB: undefined,
optionC: undefined,
optionD: undefined
}
row.coursewareId = props.coursewareId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

View File

@ -0,0 +1,278 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="课件名称" prop="coursewareName">
<el-input
v-model="queryParams.coursewareName"
placeholder="请输入课件名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="作者" prop="author">
<el-input
v-model="queryParams.author"
placeholder="请输入作者"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="课程类型" prop="courseType">
<el-select
v-model="queryParams.courseType"
placeholder="请选择课程类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_COURSE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="适合学习的部门. 逗号分隔的部门id" prop="suitableDept">
<el-input
v-model="queryParams.suitableDept"
placeholder="请输入适合学习的部门. 逗号分隔的部门id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="视频附件" prop="videoAttachment">
<el-input
v-model="queryParams.videoAttachment"
placeholder="请输入视频附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="课件大纲" prop="outline">
<el-input
v-model="queryParams.outline"
placeholder="请输入课件大纲"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:courseware:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:courseware:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="课件名称" align="center" prop="coursewareName" />
<el-table-column label="作者" align="center" prop="author" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="课程类型" align="center" prop="courseType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_COURSE_TYPE" :value="scope.row.courseType" />
</template>
</el-table-column>
<el-table-column label="适合学习的部门. 逗号分隔的部门id" align="center" prop="suitableDept" />
<el-table-column label="课件内容" align="center" prop="content" />
<el-table-column label="视频附件" align="center" prop="videoAttachment" />
<el-table-column label="课件大纲" align="center" prop="outline" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:courseware:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:courseware:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<CoursewareForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { CoursewareApi, CoursewareVO } from '@/api/hrm/courseware'
import CoursewareForm from './CoursewareForm.vue'
/** 课件 列表 */
defineOptions({ name: 'Courseware' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<CoursewareVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
coursewareName: undefined,
author: undefined,
processInstanceId: undefined,
auditStatus: undefined,
courseType: undefined,
suitableDept: undefined,
content: undefined,
videoAttachment: undefined,
outline: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await CoursewareApi.getCoursewarePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await CoursewareApi.deleteCourseware(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CoursewareApi.exportCourseware(queryParams)
download.excel(data, '课件.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,137 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="课件ID关联courseware表" prop="coursewareId">
<el-input v-model="formData.coursewareId" placeholder="请输入课件ID关联courseware表" />
</el-form-item>
<el-form-item label="题目" prop="question">
<el-input v-model="formData.question" placeholder="请输入题目" />
</el-form-item>
<el-form-item label="题目类型(选择、填空、论述)" prop="questionType">
<el-select v-model="formData.questionType" placeholder="请选择题目类型(选择、填空、论述)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_QUESTION_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="答案" prop="answer">
<el-input v-model="formData.answer" placeholder="请输入答案" />
</el-form-item>
<el-form-item label="选择题选项A" prop="optionA">
<el-input v-model="formData.optionA" placeholder="请输入选择题选项A" />
</el-form-item>
<el-form-item label="选择题选项B" prop="optionB">
<el-input v-model="formData.optionB" placeholder="请输入选择题选项B" />
</el-form-item>
<el-form-item label="选择题选项C" prop="optionC">
<el-input v-model="formData.optionC" placeholder="请输入选择题选项C" />
</el-form-item>
<el-form-item label="选择题选项D" prop="optionD">
<el-input v-model="formData.optionD" placeholder="请输入选择题选项D" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { CoursewareDetailApi, CoursewareDetailVO } from '@/api/hrm/coursewaredetail'
/** 课件详情 表单 */
defineOptions({ name: 'CoursewareDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
coursewareId: undefined,
question: undefined,
questionType: undefined,
answer: undefined,
optionA: undefined,
optionB: undefined,
optionC: undefined,
optionD: undefined
})
const formRules = reactive({
coursewareId: [{ required: true, message: '课件ID关联courseware表不能为空', trigger: 'blur' }],
question: [{ required: true, message: '题目不能为空', trigger: 'blur' }],
questionType: [{ required: true, message: '题目类型(选择、填空、论述)不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await CoursewareDetailApi.getCoursewareDetail(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as CoursewareDetailVO
if (formType.value === 'create') {
await CoursewareDetailApi.createCoursewareDetail(data)
message.success(t('common.createSuccess'))
} else {
await CoursewareDetailApi.updateCoursewareDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
coursewareId: undefined,
question: undefined,
questionType: undefined,
answer: undefined,
optionA: undefined,
optionB: undefined,
optionC: undefined,
optionD: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,255 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="课件ID关联courseware表" prop="coursewareId">
<el-input
v-model="queryParams.coursewareId"
placeholder="请输入课件ID关联courseware表"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="题目" prop="question">
<el-input
v-model="queryParams.question"
placeholder="请输入题目"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="题目类型(选择、填空、论述)" prop="questionType">
<el-select
v-model="queryParams.questionType"
placeholder="请选择题目类型(选择、填空、论述)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_QUESTION_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="答案" prop="answer">
<el-input
v-model="queryParams.answer"
placeholder="请输入答案"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="选择题选项A" prop="optionA">
<el-input
v-model="queryParams.optionA"
placeholder="请输入选择题选项A"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="选择题选项B" prop="optionB">
<el-input
v-model="queryParams.optionB"
placeholder="请输入选择题选项B"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="选择题选项C" prop="optionC">
<el-input
v-model="queryParams.optionC"
placeholder="请输入选择题选项C"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="选择题选项D" prop="optionD">
<el-input
v-model="queryParams.optionD"
placeholder="请输入选择题选项D"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:courseware-detail:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:courseware-detail:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="课件ID关联courseware表" align="center" prop="coursewareId" />
<el-table-column label="题目" align="center" prop="question" />
<el-table-column label="题目类型(选择、填空、论述)" align="center" prop="questionType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_QUESTION_TYPE" :value="scope.row.questionType" />
</template>
</el-table-column>
<el-table-column label="答案" align="center" prop="answer" />
<el-table-column label="选择题选项A" align="center" prop="optionA" />
<el-table-column label="选择题选项B" align="center" prop="optionB" />
<el-table-column label="选择题选项C" align="center" prop="optionC" />
<el-table-column label="选择题选项D" align="center" prop="optionD" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:courseware-detail:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:courseware-detail:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<CoursewareDetailForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import download from '@/utils/download'
import { CoursewareDetailApi, CoursewareDetailVO } from '@/api/hrm/coursewaredetail'
import CoursewareDetailForm from './CoursewareDetailForm.vue'
/** 课件详情 列表 */
defineOptions({ name: 'CoursewareDetail' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<CoursewareDetailVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
coursewareId: undefined,
question: undefined,
questionType: undefined,
answer: undefined,
optionA: undefined,
optionB: undefined,
optionC: undefined,
optionD: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await CoursewareDetailApi.getCoursewareDetailPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await CoursewareDetailApi.deleteCoursewareDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await CoursewareDetailApi.exportCoursewareDetail(queryParams)
download.excel(data, '课件详情.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,174 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="现学历" prop="currentEducation">
<el-select v-model="formData.currentEducation" placeholder="请选择现学历">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="进修后学历" prop="advancedEducation">
<el-select v-model="formData.advancedEducation" placeholder="请选择进修后学历">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="开始进修时间" prop="studyStartDate">
<el-date-picker
v-model="formData.studyStartDate"
type="date"
value-format="x"
placeholder="选择开始进修时间"
/>
</el-form-item>
<el-form-item label="结束进修时间" prop="studyEndDate">
<el-date-picker
v-model="formData.studyEndDate"
type="date"
value-format="x"
placeholder="选择结束进修时间"
/>
</el-form-item>
<el-form-item label="进修费用" prop="studyFee">
<el-input v-model="formData.studyFee" placeholder="请输入进修费用" />
</el-form-item>
<el-form-item label="进修学校" prop="studySchool">
<el-input v-model="formData.studySchool" placeholder="请输入进修学校" />
</el-form-item>
<el-form-item label="进修专业" prop="studyMajor">
<el-input v-model="formData.studyMajor" placeholder="请输入进修专业" />
</el-form-item>
<el-form-item label="员工签字" prop="elecSignature">
<el-input v-model="formData.elecSignature" placeholder="请输入员工签字" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { EducationApplyApi, EducationApplyVO } from '@/api/hrm/educationapply'
/** 学历进修申请 表单 */
defineOptions({ name: 'EducationApplyForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
currentEducation: undefined,
advancedEducation: undefined,
studyStartDate: undefined,
studyEndDate: undefined,
studyFee: undefined,
studySchool: undefined,
studyMajor: undefined,
elecSignature: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
currentEducation: [{ required: true, message: '现学历不能为空', trigger: 'change' }],
advancedEducation: [{ required: true, message: '进修后学历不能为空', trigger: 'change' }],
studyStartDate: [{ required: true, message: '开始进修时间不能为空', trigger: 'blur' }],
studyEndDate: [{ required: true, message: '结束进修时间不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await EducationApplyApi.getEducationApply(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as EducationApplyVO
if (formType.value === 'create') {
await EducationApplyApi.createEducationApply(data)
message.success(t('common.createSuccess'))
} else {
await EducationApplyApi.updateEducationApply(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
currentEducation: undefined,
advancedEducation: undefined,
studyStartDate: undefined,
studyEndDate: undefined,
studyFee: undefined,
studySchool: undefined,
studyMajor: undefined,
elecSignature: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,323 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="现学历" prop="currentEducation">
<el-select
v-model="queryParams.currentEducation"
placeholder="请选择现学历"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="进修后学历" prop="advancedEducation">
<el-select
v-model="queryParams.advancedEducation"
placeholder="请选择进修后学历"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="开始进修时间" prop="studyStartDate">
<el-date-picker
v-model="queryParams.studyStartDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="结束进修时间" prop="studyEndDate">
<el-date-picker
v-model="queryParams.studyEndDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="进修费用" prop="studyFee">
<el-input
v-model="queryParams.studyFee"
placeholder="请输入进修费用"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="进修学校" prop="studySchool">
<el-input
v-model="queryParams.studySchool"
placeholder="请输入进修学校"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="进修专业" prop="studyMajor">
<el-input
v-model="queryParams.studyMajor"
placeholder="请输入进修专业"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="员工签字" prop="elecSignature">
<el-input
v-model="queryParams.elecSignature"
placeholder="请输入员工签字"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:education-apply:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:education-apply:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="员工ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="现学历" align="center" prop="currentEducation">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EDUCATION" :value="scope.row.currentEducation" />
</template>
</el-table-column>
<el-table-column label="进修后学历" align="center" prop="advancedEducation">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EDUCATION" :value="scope.row.advancedEducation" />
</template>
</el-table-column>
<el-table-column label="开始进修时间" align="center" prop="studyStartDate" />
<el-table-column label="结束进修时间" align="center" prop="studyEndDate" />
<el-table-column label="进修费用" align="center" prop="studyFee" />
<el-table-column label="进修学校" align="center" prop="studySchool" />
<el-table-column label="进修专业" align="center" prop="studyMajor" />
<el-table-column label="员工签字" align="center" prop="elecSignature" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:education-apply:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:education-apply:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<EducationApplyForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { EducationApplyApi, EducationApplyVO } from '@/api/hrm/educationapply'
import EducationApplyForm from './EducationApplyForm.vue'
/** 学历进修申请 列表 */
defineOptions({ name: 'EducationApply' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<EducationApplyVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
currentEducation: undefined,
advancedEducation: undefined,
studyStartDate: [],
studyEndDate: [],
studyFee: undefined,
studySchool: undefined,
studyMajor: undefined,
elecSignature: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await EducationApplyApi.getEducationApplyPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await EducationApplyApi.deleteEducationApply(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await EducationApplyApi.exportEducationApply(queryParams)
download.excel(data, '学历进修申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,175 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工档案ID关联hrm_user_infor" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工档案ID关联hrm_user_infor" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="转正日期" prop="confirmationDate">
<el-date-picker
v-model="formData.confirmationDate"
type="date"
value-format="x"
placeholder="选择转正日期"
/>
</el-form-item>
<el-form-item label="是否转正10" prop="isConfirmed">
<el-select v-model="formData.isConfirmed" placeholder="请选择是否转正10">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="申请日期" prop="applicationDate">
<el-date-picker
v-model="formData.applicationDate"
type="date"
value-format="x"
placeholder="选择申请日期"
/>
</el-form-item>
<el-form-item label="转正申请说明" prop="applicationNote">
<el-input v-model="formData.applicationNote" placeholder="请输入转正申请说明" />
</el-form-item>
<el-form-item label="工作业绩评分" prop="workPerformanceScore">
<el-input v-model="formData.workPerformanceScore" placeholder="请输入工作业绩评分" />
</el-form-item>
<el-form-item label="出勤情况评分" prop="attendanceScore">
<el-input v-model="formData.attendanceScore" placeholder="请输入出勤情况评分" />
</el-form-item>
<el-form-item label="团队协作评分" prop="teamworkScore">
<el-input v-model="formData.teamworkScore" placeholder="请输入团队协作评分" />
</el-form-item>
<el-form-item label="能力表现评分" prop="abilityPerformanceScore">
<el-input v-model="formData.abilityPerformanceScore" placeholder="请输入能力表现评分" />
</el-form-item>
<el-form-item label="本人签字" prop="eSignature">
<el-input v-model="formData.eSignature" placeholder="请输入本人签字" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { FullMemberApplyApi, FullMemberApplyVO } from '@/api/hrm/fullmemberapply'
/** 转正申请 表单 */
defineOptions({ name: 'FullMemberApplyForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
confirmationDate: undefined,
isConfirmed: undefined,
applicationDate: undefined,
applicationNote: undefined,
workPerformanceScore: undefined,
attendanceScore: undefined,
teamworkScore: undefined,
abilityPerformanceScore: undefined,
eSignature: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID关联hrm_user_infor不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
confirmationDate: [{ required: true, message: '转正日期不能为空', trigger: 'blur' }],
isConfirmed: [{ required: true, message: '是否转正10不能为空', trigger: 'change' }],
applicationDate: [{ required: true, message: '申请日期不能为空', trigger: 'blur' }],
workPerformanceScore: [{ required: true, message: '工作业绩评分不能为空', trigger: 'blur' }],
attendanceScore: [{ required: true, message: '出勤情况评分不能为空', trigger: 'blur' }],
teamworkScore: [{ required: true, message: '团队协作评分不能为空', trigger: 'blur' }],
abilityPerformanceScore: [{ required: true, message: '能力表现评分不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await FullMemberApplyApi.getFullMemberApply(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as FullMemberApplyVO
if (formType.value === 'create') {
await FullMemberApplyApi.createFullMemberApply(data)
message.success(t('common.createSuccess'))
} else {
await FullMemberApplyApi.updateFullMemberApply(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
confirmationDate: undefined,
isConfirmed: undefined,
applicationDate: undefined,
applicationNote: undefined,
workPerformanceScore: undefined,
attendanceScore: undefined,
teamworkScore: undefined,
abilityPerformanceScore: undefined,
eSignature: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,324 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工档案ID关联hrm_user_infor" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工档案ID关联hrm_user_infor"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="转正日期" prop="confirmationDate">
<el-date-picker
v-model="queryParams.confirmationDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="是否转正10" prop="isConfirmed">
<el-select
v-model="queryParams.isConfirmed"
placeholder="请选择是否转正10"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="申请日期" prop="applicationDate">
<el-date-picker
v-model="queryParams.applicationDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="转正申请说明" prop="applicationNote">
<el-input
v-model="queryParams.applicationNote"
placeholder="请输入转正申请说明"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作业绩评分" prop="workPerformanceScore">
<el-input
v-model="queryParams.workPerformanceScore"
placeholder="请输入工作业绩评分"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="出勤情况评分" prop="attendanceScore">
<el-input
v-model="queryParams.attendanceScore"
placeholder="请输入出勤情况评分"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="团队协作评分" prop="teamworkScore">
<el-input
v-model="queryParams.teamworkScore"
placeholder="请输入团队协作评分"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="能力表现评分" prop="abilityPerformanceScore">
<el-input
v-model="queryParams.abilityPerformanceScore"
placeholder="请输入能力表现评分"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="本人签字" prop="eSignature">
<el-input
v-model="queryParams.eSignature"
placeholder="请输入本人签字"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:full-member-apply:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:full-member-apply:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="员工档案ID关联hrm_user_infor" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="转正日期" align="center" prop="confirmationDate" />
<el-table-column label="是否转正10" align="center" prop="isConfirmed">
<template #default="scope">
<dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isConfirmed" />
</template>
</el-table-column>
<el-table-column label="申请日期" align="center" prop="applicationDate" />
<el-table-column label="转正申请说明" align="center" prop="applicationNote" />
<el-table-column label="工作业绩评分" align="center" prop="workPerformanceScore" />
<el-table-column label="出勤情况评分" align="center" prop="attendanceScore" />
<el-table-column label="团队协作评分" align="center" prop="teamworkScore" />
<el-table-column label="能力表现评分" align="center" prop="abilityPerformanceScore" />
<el-table-column label="本人签字" align="center" prop="eSignature" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:full-member-apply:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:full-member-apply:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<FullMemberApplyForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { FullMemberApplyApi, FullMemberApplyVO } from '@/api/hrm/fullmemberapply'
import FullMemberApplyForm from './FullMemberApplyForm.vue'
/** 转正申请 列表 */
defineOptions({ name: 'FullMemberApply' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<FullMemberApplyVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
confirmationDate: [],
isConfirmed: undefined,
applicationDate: [],
applicationNote: undefined,
workPerformanceScore: undefined,
attendanceScore: undefined,
teamworkScore: undefined,
abilityPerformanceScore: undefined,
eSignature: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await FullMemberApplyApi.getFullMemberApplyPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await FullMemberApplyApi.deleteFullMemberApply(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await FullMemberApplyApi.exportFullMemberApply(queryParams)
download.excel(data, '转正申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,149 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="招聘Id" prop="recruitmentRequestId">
<el-input v-model="formData.recruitmentRequestId" placeholder="请输入招聘Id" />
</el-form-item>
<el-form-item label="人才库ID关联hrm_talent_pool" prop="talentPoolId">
<el-input v-model="formData.talentPoolId" placeholder="请输入人才库ID关联hrm_talent_pool" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="面试地址" prop="interviewAddress">
<el-select v-model="formData.interviewAddress" placeholder="请选择面试地址">
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="面试通知时间" prop="interviewTime">
<el-date-picker
v-model="formData.interviewTime"
type="date"
value-format="x"
placeholder="选择面试通知时间"
/>
</el-form-item>
<el-form-item label="面试通知邮箱" prop="interviewEmail">
<el-input v-model="formData.interviewEmail" placeholder="请输入面试通知邮箱" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input v-model="formData.deptId" placeholder="请输入部门ID" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { InterviewInitiationApi, InterviewInitiationVO } from '@/api/hrm/interviewinitiation'
/** 发起面试 表单 */
defineOptions({ name: 'InterviewInitiationForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
recruitmentRequestId: undefined,
talentPoolId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
interviewAddress: undefined,
interviewTime: undefined,
interviewEmail: undefined,
status: undefined,
deptId: undefined
})
const formRules = reactive({
recruitmentRequestId: [{ required: true, message: '招聘Id不能为空', trigger: 'blur' }],
talentPoolId: [{ required: true, message: '人才库ID关联hrm_talent_pool不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
interviewAddress: [{ required: true, message: '面试地址不能为空', trigger: 'change' }],
interviewTime: [{ required: true, message: '面试通知时间不能为空', trigger: 'blur' }],
interviewEmail: [{ required: true, message: '面试通知邮箱不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门ID不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await InterviewInitiationApi.getInterviewInitiation(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as InterviewInitiationVO
if (formType.value === 'create') {
await InterviewInitiationApi.createInterviewInitiation(data)
message.success(t('common.createSuccess'))
} else {
await InterviewInitiationApi.updateInterviewInitiation(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
recruitmentRequestId: undefined,
talentPoolId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
interviewAddress: undefined,
interviewTime: undefined,
interviewEmail: undefined,
status: undefined,
deptId: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,286 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="招聘Id" prop="recruitmentRequestId">
<el-input
v-model="queryParams.recruitmentRequestId"
placeholder="请输入招聘Id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="人才库ID关联hrm_talent_pool" prop="talentPoolId">
<el-input
v-model="queryParams.talentPoolId"
placeholder="请输入人才库ID关联hrm_talent_pool"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="面试地址" prop="interviewAddress">
<el-select
v-model="queryParams.interviewAddress"
placeholder="请选择面试地址"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="面试通知时间" prop="interviewTime">
<el-date-picker
v-model="queryParams.interviewTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="面试通知邮箱" prop="interviewEmail">
<el-input
v-model="queryParams.interviewEmail"
placeholder="请输入面试通知邮箱"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input
v-model="queryParams.deptId"
placeholder="请输入部门ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:interview-initiation:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:interview-initiation:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="招聘Id" align="center" prop="recruitmentRequestId" />
<el-table-column label="人才库ID关联hrm_talent_pool" align="center" prop="talentPoolId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="面试地址" align="center" prop="interviewAddress" />
<el-table-column
label="面试通知时间"
align="center"
prop="interviewTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="面试通知邮箱" align="center" prop="interviewEmail" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="部门ID" align="center" prop="deptId" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:interview-initiation:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:interview-initiation:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<InterviewInitiationForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { InterviewInitiationApi, InterviewInitiationVO } from '@/api/hrm/interviewinitiation'
import InterviewInitiationForm from './InterviewInitiationForm.vue'
/** 发起面试 列表 */
defineOptions({ name: 'InterviewInitiation' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<InterviewInitiationVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
recruitmentRequestId: undefined,
talentPoolId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
interviewAddress: undefined,
interviewTime: [],
interviewEmail: undefined,
status: undefined,
deptId: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await InterviewInitiationApi.getInterviewInitiationPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await InterviewInitiationApi.deleteInterviewInitiation(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await InterviewInitiationApi.exportInterviewInitiation(queryParams)
download.excel(data, '发起面试.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,134 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="物品编码" prop="itemCode">
<el-input v-model="formData.itemCode" placeholder="请输入物品编码" />
</el-form-item>
<el-form-item label="物品分类(办公用品、办公设备等)" prop="itemCategory">
<el-select v-model="formData.itemCategory" placeholder="请选择物品分类(办公用品、办公设备等)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_ITEM_CATEGORY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="物品名称" prop="itemName">
<el-input v-model="formData.itemName" placeholder="请输入物品名称" />
</el-form-item>
<el-form-item label="目前库存数量" prop="itemCount">
<el-input v-model="formData.itemCount" placeholder="请输入目前库存数量" />
</el-form-item>
<el-form-item label="规格" prop="itemType">
<el-select v-model="formData.itemType" placeholder="请选择规格">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_ITEM_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { ItemApi, ItemVO } from '@/api/hrm/item'
/** 物品管理 表单 */
defineOptions({ name: 'ItemForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
itemCode: undefined,
itemCategory: undefined,
itemName: undefined,
itemCount: undefined,
itemType: undefined,
remark: undefined
})
const formRules = reactive({
itemCategory: [{ required: true, message: '物品分类(办公用品、办公设备等)不能为空', trigger: 'change' }],
itemName: [{ required: true, message: '物品名称不能为空', trigger: 'blur' }],
itemCount: [{ required: true, message: '目前库存数量不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ItemApi.getItem(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as ItemVO
if (formType.value === 'create') {
await ItemApi.createItem(data)
message.success(t('common.createSuccess'))
} else {
await ItemApi.updateItem(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
itemCode: undefined,
itemCategory: undefined,
itemName: undefined,
itemCount: undefined,
itemType: undefined,
remark: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,263 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="物品编码" prop="itemCode">
<el-input
v-model="queryParams.itemCode"
placeholder="请输入物品编码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物品分类(办公用品、办公设备等)" prop="itemCategory">
<el-select
v-model="queryParams.itemCategory"
placeholder="请选择物品分类(办公用品、办公设备等)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_ITEM_CATEGORY)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="物品名称" prop="itemName">
<el-input
v-model="queryParams.itemName"
placeholder="请输入物品名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="目前库存数量" prop="itemCount">
<el-input
v-model="queryParams.itemCount"
placeholder="请输入目前库存数量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="规格" prop="itemType">
<el-select
v-model="queryParams.itemType"
placeholder="请选择规格"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_ITEM_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:item:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:item:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="唯一主键" align="center" prop="id" />
<el-table-column label="物品编码" align="center" prop="itemCode" />
<el-table-column label="物品分类(办公用品、办公设备等)" align="center" prop="itemCategory">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_ITEM_CATEGORY" :value="scope.row.itemCategory" />
</template>
</el-table-column>
<el-table-column label="物品名称" align="center" prop="itemName" />
<el-table-column label="目前库存数量" align="center" prop="itemCount" />
<el-table-column label="规格" align="center" prop="itemType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_ITEM_TYPE" :value="scope.row.itemType" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:item:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:item:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ItemForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ItemApi, ItemVO } from '@/api/hrm/item'
import ItemForm from './ItemForm.vue'
/** 物品管理 列表 */
defineOptions({ name: 'Item' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<ItemVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
itemCode: undefined,
itemCategory: undefined,
itemName: undefined,
itemCount: undefined,
itemType: undefined,
remark: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ItemApi.getItemPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ItemApi.deleteItem(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ItemApi.exportItem(queryParams)
download.excel(data, '物品管理.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,142 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="领用人ID" prop="applicantId">
<el-input v-model="formData.applicantId" placeholder="请输入领用人ID" />
</el-form-item>
<el-form-item label="申请日期" prop="requestDate">
<el-date-picker
v-model="formData.requestDate"
type="date"
value-format="x"
placeholder="选择申请日期"
/>
</el-form-item>
<el-form-item label="领用人电子签名" prop="eSignature">
<el-input v-model="formData.eSignature" placeholder="请输入领用人电子签名" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="物品申请明细" name="itemRequestDetail">
<ItemRequestDetailForm ref="itemRequestDetailFormRef" :item-request-id="formData.id" />
</el-tab-pane>
</el-tabs>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ItemRequestApi, ItemRequestVO } from '@/api/hrm/itemrequest'
import ItemRequestDetailForm from './components/ItemRequestDetailForm.vue'
/** 物品申请 表单 */
defineOptions({ name: 'ItemRequestForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
applicantId: undefined,
requestDate: undefined,
eSignature: undefined,
processInstanceId: undefined,
auditStatus: undefined
})
const formRules = reactive({
applicantId: [{ required: true, message: '领用人ID不能为空', trigger: 'blur' }],
requestDate: [{ required: true, message: '申请日期不能为空', trigger: 'blur' }],
eSignature: [{ required: true, message: '领用人电子签名不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 子表的表单 */
const subTabsName = ref('itemRequestDetail')
const itemRequestDetailFormRef = ref()
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ItemRequestApi.getItemRequest(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await itemRequestDetailFormRef.value.validate()
} catch (e) {
subTabsName.value = 'itemRequestDetail'
return
}
//
formLoading.value = true
try {
const data = formData.value as unknown as ItemRequestVO
//
data.itemRequestDetails = itemRequestDetailFormRef.value.getData()
if (formType.value === 'create') {
await ItemRequestApi.createItemRequest(data)
message.success(t('common.createSuccess'))
} else {
await ItemRequestApi.updateItemRequest(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
applicantId: undefined,
requestDate: undefined,
eSignature: undefined,
processInstanceId: undefined,
auditStatus: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,108 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="物品管理ID关联 hrm_item" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.itemId`" :rules="formRules.itemId" class="mb-0px!">
<el-input v-model="row.itemId" placeholder="请输入物品管理ID关联 hrm_item" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="领用数量" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.requestCount`" :rules="formRules.requestCount" class="mb-0px!">
<el-input v-model="row.requestCount" placeholder="请输入领用数量" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="申请说明" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.instructions`" :rules="formRules.instructions" class="mb-0px!">
<el-input v-model="row.instructions" placeholder="请输入申请说明" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加物品申请明细</el-button>
</el-row>
</template>
<script setup lang="ts">
import { ItemRequestApi } from '@/api/hrm/itemrequest'
const props = defineProps<{
itemRequestId: undefined // ID hrm_item_request
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
itemRequestId: [{ required: true, message: '物品申请ID关联 hrm_item_request不能为空', trigger: 'blur' }],
itemId: [{ required: true, message: '物品管理ID关联 hrm_item不能为空', trigger: 'blur' }],
requestCount: [{ required: true, message: '领用数量不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.itemRequestId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await ItemRequestApi.getItemRequestDetailListByItemRequestId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
itemRequestId: undefined,
itemId: undefined,
requestCount: undefined,
instructions: undefined
}
row.itemRequestId = props.itemRequestId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

View File

@ -0,0 +1,234 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="领用人ID" prop="applicantId">
<el-input
v-model="queryParams.applicantId"
placeholder="请输入领用人ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="申请日期" prop="requestDate">
<el-date-picker
v-model="queryParams.requestDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="领用人电子签名" prop="eSignature">
<el-input
v-model="queryParams.eSignature"
placeholder="请输入领用人电子签名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:item-request:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:item-request:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="自动递增的主键" align="center" prop="id" />
<el-table-column label="领用人ID" align="center" prop="applicantId" />
<el-table-column label="申请日期" align="center" prop="requestDate" />
<el-table-column label="领用人电子签名" align="center" prop="eSignature" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:item-request:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:item-request:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ItemRequestForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ItemRequestApi, ItemRequestVO } from '@/api/hrm/itemrequest'
import ItemRequestForm from './ItemRequestForm.vue'
/** 物品申请 列表 */
defineOptions({ name: 'ItemRequest' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<ItemRequestVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
applicantId: undefined,
requestDate: [],
eSignature: undefined,
processInstanceId: undefined,
auditStatus: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ItemRequestApi.getItemRequestPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ItemRequestApi.deleteItemRequest(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ItemRequestApi.exportItemRequest(queryParams)
download.excel(data, '物品申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,109 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="物品申请ID关联 hrm_item_request" prop="itemRequestId">
<el-input v-model="formData.itemRequestId" placeholder="请输入物品申请ID关联 hrm_item_request" />
</el-form-item>
<el-form-item label="物品管理ID关联 hrm_item" prop="itemId">
<el-input v-model="formData.itemId" placeholder="请输入物品管理ID关联 hrm_item" />
</el-form-item>
<el-form-item label="领用数量" prop="requestCount">
<el-input v-model="formData.requestCount" placeholder="请输入领用数量" />
</el-form-item>
<el-form-item label="申请说明" prop="instructions">
<el-input v-model="formData.instructions" placeholder="请输入申请说明" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ItemRequestDetailApi, ItemRequestDetailVO } from '@/api/hrm/itemrequestdetail'
/** 物品申请明细 表单 */
defineOptions({ name: 'ItemRequestDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
itemRequestId: undefined,
itemId: undefined,
requestCount: undefined,
instructions: undefined
})
const formRules = reactive({
itemRequestId: [{ required: true, message: '物品申请ID关联 hrm_item_request不能为空', trigger: 'blur' }],
itemId: [{ required: true, message: '物品管理ID关联 hrm_item不能为空', trigger: 'blur' }],
requestCount: [{ required: true, message: '领用数量不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ItemRequestDetailApi.getItemRequestDetail(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as ItemRequestDetailVO
if (formType.value === 'create') {
await ItemRequestDetailApi.createItemRequestDetail(data)
message.success(t('common.createSuccess'))
} else {
await ItemRequestDetailApi.updateItemRequestDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
itemRequestId: undefined,
itemId: undefined,
requestCount: undefined,
instructions: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,200 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="物品申请ID关联 hrm_item_request" prop="itemRequestId">
<el-input
v-model="queryParams.itemRequestId"
placeholder="请输入物品申请ID关联 hrm_item_request"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="物品管理ID关联 hrm_item" prop="itemId">
<el-input
v-model="queryParams.itemId"
placeholder="请输入物品管理ID关联 hrm_item"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="领用数量" prop="requestCount">
<el-input
v-model="queryParams.requestCount"
placeholder="请输入领用数量"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="申请说明" prop="instructions">
<el-input
v-model="queryParams.instructions"
placeholder="请输入申请说明"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:item-request-detail:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:item-request-detail:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键" align="center" prop="id" />
<el-table-column label="物品申请ID关联 hrm_item_request" align="center" prop="itemRequestId" />
<el-table-column label="物品管理ID关联 hrm_item" align="center" prop="itemId" />
<el-table-column label="领用数量" align="center" prop="requestCount" />
<el-table-column label="申请说明" align="center" prop="instructions" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:item-request-detail:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:item-request-detail:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ItemRequestDetailForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import download from '@/utils/download'
import { ItemRequestDetailApi, ItemRequestDetailVO } from '@/api/hrm/itemrequestdetail'
import ItemRequestDetailForm from './ItemRequestDetailForm.vue'
/** 物品申请明细 列表 */
defineOptions({ name: 'ItemRequestDetail' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<ItemRequestDetailVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
itemRequestId: undefined,
itemId: undefined,
requestCount: undefined,
instructions: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ItemRequestDetailApi.getItemRequestDetailPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ItemRequestDetailApi.deleteItemRequestDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ItemRequestDetailApi.exportItemRequestDetail(queryParams)
download.excel(data, '物品申请明细.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,210 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工档案ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工档案ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="调岗类型" prop="applyType">
<el-select v-model="formData.applyType" placeholder="请选择调岗类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_APPLY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="调岗原因" prop="applyReason">
<el-select v-model="formData.applyReason" placeholder="请选择调岗原因">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_APPLY_REASON)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="调动前部门" prop="beforeDeptId">
<el-input v-model="formData.beforeDeptId" placeholder="请输入调动前部门" />
</el-form-item>
<el-form-item label="调动前职级" prop="beforePostLevel">
<el-input v-model="formData.beforePostLevel" placeholder="请输入调动前职级" />
</el-form-item>
<el-form-item label="调动前档级" prop="beforeGradeLevel">
<el-input v-model="formData.beforeGradeLevel" placeholder="请输入调动前档级" />
</el-form-item>
<el-form-item label="调动前薪资" prop="beforeSalary">
<el-input v-model="formData.beforeSalary" placeholder="请输入调动前薪资" />
</el-form-item>
<el-form-item label="调动前岗位" prop="beforePostId">
<el-input v-model="formData.beforePostId" placeholder="请输入调动前岗位" />
</el-form-item>
<el-form-item label="申请说明" prop="applyInfo">
<el-input v-model="formData.applyInfo" placeholder="请输入申请说明" />
</el-form-item>
<el-form-item label="调动后部门" prop="afterDeptId">
<el-input v-model="formData.afterDeptId" placeholder="请输入调动后部门" />
</el-form-item>
<el-form-item label="调动后薪资" prop="afterSalary">
<el-input v-model="formData.afterSalary" placeholder="请输入调动后薪资" />
</el-form-item>
<el-form-item label="调动后职级" prop="afterPostLevel">
<el-input v-model="formData.afterPostLevel" placeholder="请输入调动后职级" />
</el-form-item>
<el-form-item label="调动前档级" prop="afterGradeLevel">
<el-input v-model="formData.afterGradeLevel" placeholder="请输入调动前档级" />
</el-form-item>
<el-form-item label="调动后岗位" prop="afterPostId">
<el-input v-model="formData.afterPostId" placeholder="请输入调动后岗位" />
</el-form-item>
<el-form-item label="调动后岗位名称" prop="afterPostName">
<el-input v-model="formData.afterPostName" placeholder="请输入调动后岗位名称" />
</el-form-item>
<el-form-item label="生效日期" prop="effectiverDate">
<el-date-picker
v-model="formData.effectiverDate"
type="date"
value-format="x"
placeholder="选择生效日期"
/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="formData.attachment" placeholder="请输入附件" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { JobTransferApplyApi, JobTransferApplyVO } from '@/api/hrm/jobtransferapply'
/** 调岗申请 表单 */
defineOptions({ name: 'JobTransferApplyForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
applyType: undefined,
applyReason: undefined,
beforeDeptId: undefined,
beforePostLevel: undefined,
beforeGradeLevel: undefined,
beforeSalary: undefined,
beforePostId: undefined,
applyInfo: undefined,
afterDeptId: undefined,
afterSalary: undefined,
afterPostLevel: undefined,
afterGradeLevel: undefined,
afterPostId: undefined,
afterPostName: undefined,
effectiverDate: undefined,
attachment: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
applyType: [{ required: true, message: '调岗类型不能为空', trigger: 'change' }],
applyReason: [{ required: true, message: '调岗原因不能为空', trigger: 'change' }],
beforeDeptId: [{ required: true, message: '调动前部门不能为空', trigger: 'blur' }],
effectiverDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }],
attachment: [{ required: true, message: '附件不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await JobTransferApplyApi.getJobTransferApply(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as JobTransferApplyVO
if (formType.value === 'create') {
await JobTransferApplyApi.createJobTransferApply(data)
message.success(t('common.createSuccess'))
} else {
await JobTransferApplyApi.updateJobTransferApply(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
applyType: undefined,
applyReason: undefined,
beforeDeptId: undefined,
beforePostLevel: undefined,
beforeGradeLevel: undefined,
beforeSalary: undefined,
beforePostId: undefined,
applyInfo: undefined,
afterDeptId: undefined,
afterSalary: undefined,
afterPostLevel: undefined,
afterGradeLevel: undefined,
afterPostId: undefined,
afterPostName: undefined,
effectiverDate: undefined,
attachment: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,409 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工档案ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工档案ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="调岗类型" prop="applyType">
<el-select
v-model="queryParams.applyType"
placeholder="请选择调岗类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_APPLY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="调岗原因" prop="applyReason">
<el-select
v-model="queryParams.applyReason"
placeholder="请选择调岗原因"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_APPLY_REASON)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="调动前部门" prop="beforeDeptId">
<el-input
v-model="queryParams.beforeDeptId"
placeholder="请输入调动前部门"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动前职级" prop="beforePostLevel">
<el-input
v-model="queryParams.beforePostLevel"
placeholder="请输入调动前职级"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动前档级" prop="beforeGradeLevel">
<el-input
v-model="queryParams.beforeGradeLevel"
placeholder="请输入调动前档级"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动前薪资" prop="beforeSalary">
<el-input
v-model="queryParams.beforeSalary"
placeholder="请输入调动前薪资"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动前岗位" prop="beforePostId">
<el-input
v-model="queryParams.beforePostId"
placeholder="请输入调动前岗位"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="申请说明" prop="applyInfo">
<el-input
v-model="queryParams.applyInfo"
placeholder="请输入申请说明"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动后部门" prop="afterDeptId">
<el-input
v-model="queryParams.afterDeptId"
placeholder="请输入调动后部门"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动后薪资" prop="afterSalary">
<el-input
v-model="queryParams.afterSalary"
placeholder="请输入调动后薪资"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动后职级" prop="afterPostLevel">
<el-input
v-model="queryParams.afterPostLevel"
placeholder="请输入调动后职级"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动前档级" prop="afterGradeLevel">
<el-input
v-model="queryParams.afterGradeLevel"
placeholder="请输入调动前档级"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动后岗位" prop="afterPostId">
<el-input
v-model="queryParams.afterPostId"
placeholder="请输入调动后岗位"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="调动后岗位名称" prop="afterPostName">
<el-input
v-model="queryParams.afterPostName"
placeholder="请输入调动后岗位名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="生效日期" prop="effectiverDate">
<el-date-picker
v-model="queryParams.effectiverDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input
v-model="queryParams.attachment"
placeholder="请输入附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:job-transfer-apply:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:job-transfer-apply:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="员工档案ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="调岗类型" align="center" prop="applyType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_APPLY_TYPE" :value="scope.row.applyType" />
</template>
</el-table-column>
<el-table-column label="调岗原因" align="center" prop="applyReason">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_APPLY_REASON" :value="scope.row.applyReason" />
</template>
</el-table-column>
<el-table-column label="调动前部门" align="center" prop="beforeDeptId" />
<el-table-column label="调动前职级" align="center" prop="beforePostLevel" />
<el-table-column label="调动前档级" align="center" prop="beforeGradeLevel" />
<el-table-column label="调动前薪资" align="center" prop="beforeSalary" />
<el-table-column label="调动前岗位" align="center" prop="beforePostId" />
<el-table-column label="申请说明" align="center" prop="applyInfo" />
<el-table-column label="调动后部门" align="center" prop="afterDeptId" />
<el-table-column label="调动后薪资" align="center" prop="afterSalary" />
<el-table-column label="调动后职级" align="center" prop="afterPostLevel" />
<el-table-column label="调动前档级" align="center" prop="afterGradeLevel" />
<el-table-column label="调动后岗位" align="center" prop="afterPostId" />
<el-table-column label="调动后岗位名称" align="center" prop="afterPostName" />
<el-table-column label="生效日期" align="center" prop="effectiverDate" />
<el-table-column label="附件" align="center" prop="attachment" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:job-transfer-apply:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:job-transfer-apply:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<JobTransferApplyForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { JobTransferApplyApi, JobTransferApplyVO } from '@/api/hrm/jobtransferapply'
import JobTransferApplyForm from './JobTransferApplyForm.vue'
/** 调岗申请 列表 */
defineOptions({ name: 'JobTransferApply' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<JobTransferApplyVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
applyType: undefined,
applyReason: undefined,
beforeDeptId: undefined,
beforePostLevel: undefined,
beforeGradeLevel: undefined,
beforeSalary: undefined,
beforePostId: undefined,
applyInfo: undefined,
afterDeptId: undefined,
afterSalary: undefined,
afterPostLevel: undefined,
afterGradeLevel: undefined,
afterPostId: undefined,
afterPostName: undefined,
effectiverDate: [],
attachment: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await JobTransferApplyApi.getJobTransferApplyPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await JobTransferApplyApi.deleteJobTransferApply(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await JobTransferApplyApi.exportJobTransferApply(queryParams)
download.excel(data, '调岗申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,136 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工档案ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工档案ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="师徒类型. 0拜师 1收徒" prop="mentorsType">
<el-select v-model="formData.mentorsType" placeholder="请选择师徒类型. 0拜师 1收徒">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MENTORS_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="接受员工Id" prop="acceptUserId">
<el-input v-model="formData.acceptUserId" placeholder="请输入接受员工Id" />
</el-form-item>
<el-form-item label="生效日期" prop="effectiverDate">
<el-date-picker
v-model="formData.effectiverDate"
type="date"
value-format="x"
placeholder="选择生效日期"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { MentorsApplyApi, MentorsApplyVO } from '@/api/hrm/mentorsapply'
/** 师徒申请 表单 */
defineOptions({ name: 'MentorsApplyForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
mentorsType: undefined,
acceptUserId: undefined,
effectiverDate: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
mentorsType: [{ required: true, message: '师徒类型. 0拜师 1收徒不能为空', trigger: 'change' }],
acceptUserId: [{ required: true, message: '接受员工Id不能为空', trigger: 'blur' }],
effectiverDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await MentorsApplyApi.getMentorsApply(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as MentorsApplyVO
if (formType.value === 'create') {
await MentorsApplyApi.createMentorsApply(data)
message.success(t('common.createSuccess'))
} else {
await MentorsApplyApi.updateMentorsApply(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
mentorsType: undefined,
acceptUserId: undefined,
effectiverDate: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,256 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工档案ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工档案ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="师徒类型. 0拜师 1收徒" prop="mentorsType">
<el-select
v-model="queryParams.mentorsType"
placeholder="请选择师徒类型. 0拜师 1收徒"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MENTORS_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="接受员工Id" prop="acceptUserId">
<el-input
v-model="queryParams.acceptUserId"
placeholder="请输入接受员工Id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="生效日期" prop="effectiverDate">
<el-date-picker
v-model="queryParams.effectiverDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:mentors-apply:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:mentors-apply:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="员工档案ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="师徒类型. 0拜师 1收徒" align="center" prop="mentorsType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_MENTORS_TYPE" :value="scope.row.mentorsType" />
</template>
</el-table-column>
<el-table-column label="接受员工Id" align="center" prop="acceptUserId" />
<el-table-column label="生效日期" align="center" prop="effectiverDate" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:mentors-apply:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:mentors-apply:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<MentorsApplyForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { MentorsApplyApi, MentorsApplyVO } from '@/api/hrm/mentorsapply'
import MentorsApplyForm from './MentorsApplyForm.vue'
/** 师徒申请 列表 */
defineOptions({ name: 'MentorsApply' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<MentorsApplyVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
mentorsType: undefined,
acceptUserId: undefined,
effectiverDate: [],
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await MentorsApplyApi.getMentorsApplyPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await MentorsApplyApi.deleteMentorsApply(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await MentorsApplyApi.exportMentorsApply(queryParams)
download.excel(data, '师徒申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,201 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="需求类型:新增需求、替换需求、储备需求" prop="requestType">
<el-select v-model="formData.requestType" placeholder="请选择需求类型:新增需求、替换需求、储备需求">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_REQUEST_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="所属部门" prop="requestDeptId">
<el-input v-model="formData.requestDeptId" placeholder="请输入所属部门" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select v-model="formData.auditStatus" placeholder="请选择审批状态">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_AUDIT_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="岗位id" prop="postId">
<el-input v-model="formData.postId" placeholder="请输入岗位id" />
</el-form-item>
<el-form-item label="需求岗位名称" prop="positionName">
<el-input v-model="formData.positionName" placeholder="请输入需求岗位名称" />
</el-form-item>
<el-form-item label="期望到岗日期" prop="expectedOnboard">
<el-input v-model="formData.expectedOnboard" placeholder="请输入期望到岗日期" />
</el-form-item>
<el-form-item label="需求人数" prop="requestedCount">
<el-input v-model="formData.requestedCount" placeholder="请输入需求人数" />
</el-form-item>
<el-form-item label="年龄范围18-2525-3530-45" prop="ageRange">
<el-input v-model="formData.ageRange" placeholder="请输入年龄范围18-2525-3530-45" />
</el-form-item>
<el-form-item label="薪资4k-7k5k-8k10k-15k" prop="monthlySalary">
<el-input v-model="formData.monthlySalary" type="textarea" placeholder="请输入薪资4k-7k5k-8k10k-15k" />
</el-form-item>
<el-form-item label="最低学历1=高中2=大专3=本科4=硕士5=博士" prop="minEducation">
<el-select v-model="formData.minEducation" placeholder="请选择最低学历1=高中2=大专3=本科4=硕士5=博士">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="工作地点" prop="workLocation">
<el-select v-model="formData.workLocation" placeholder="请选择工作地点">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_WORK_LOCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="婚姻状况:未婚、已婚、离异、丧偶" prop="maritalStatus">
<el-select v-model="formData.maritalStatus" placeholder="请选择婚姻状况:未婚、已婚、离异、丧偶">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MARITAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="从业经验" prop="experience">
<el-input v-model="formData.experience" placeholder="请输入从业经验" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { RecruitmentRequestApi, RecruitmentRequestVO } from '@/api/hrm/recruitmentrequest'
/** 招聘需求申请 表单 */
defineOptions({ name: 'RecruitmentRequestForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
requestType: undefined,
requestDeptId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
postId: undefined,
positionName: undefined,
expectedOnboard: undefined,
requestedCount: undefined,
ageRange: undefined,
monthlySalary: undefined,
minEducation: undefined,
workLocation: undefined,
maritalStatus: undefined,
experience: undefined
})
const formRules = reactive({
requestType: [{ required: true, message: '需求类型:新增需求、替换需求、储备需求不能为空', trigger: 'change' }],
requestDeptId: [{ required: true, message: '所属部门不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'change' }],
postId: [{ required: true, message: '岗位id不能为空', trigger: 'blur' }],
expectedOnboard: [{ required: true, message: '期望到岗日期不能为空', trigger: 'blur' }],
ageRange: [{ required: true, message: '年龄范围18-2525-3530-45不能为空', trigger: 'blur' }],
monthlySalary: [{ required: true, message: '薪资4k-7k5k-8k10k-15k不能为空', trigger: 'blur' }],
minEducation: [{ required: true, message: '最低学历1=高中2=大专3=本科4=硕士5=博士不能为空', trigger: 'change' }],
workLocation: [{ required: true, message: '工作地点不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await RecruitmentRequestApi.getRecruitmentRequest(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as RecruitmentRequestVO
if (formType.value === 'create') {
await RecruitmentRequestApi.createRecruitmentRequest(data)
message.success(t('common.createSuccess'))
} else {
await RecruitmentRequestApi.updateRecruitmentRequest(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
requestType: undefined,
requestDeptId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
postId: undefined,
positionName: undefined,
expectedOnboard: undefined,
requestedCount: undefined,
ageRange: undefined,
monthlySalary: undefined,
minEducation: undefined,
workLocation: undefined,
maritalStatus: undefined,
experience: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,372 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="需求类型:新增需求、替换需求、储备需求" prop="requestType">
<el-select
v-model="queryParams.requestType"
placeholder="请选择需求类型:新增需求、替换需求、储备需求"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_REQUEST_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="所属部门" prop="requestDeptId">
<el-input
v-model="queryParams.requestDeptId"
placeholder="请输入所属部门"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.CRM_AUDIT_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="岗位id" prop="postId">
<el-input
v-model="queryParams.postId"
placeholder="请输入岗位id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="需求岗位名称" prop="positionName">
<el-input
v-model="queryParams.positionName"
placeholder="请输入需求岗位名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="期望到岗日期" prop="expectedOnboard">
<el-input
v-model="queryParams.expectedOnboard"
placeholder="请输入期望到岗日期"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="需求人数" prop="requestedCount">
<el-input
v-model="queryParams.requestedCount"
placeholder="请输入需求人数"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="年龄范围18-2525-3530-45" prop="ageRange">
<el-input
v-model="queryParams.ageRange"
placeholder="请输入年龄范围18-2525-3530-45"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="最低学历1=高中2=大专3=本科4=硕士5=博士" prop="minEducation">
<el-select
v-model="queryParams.minEducation"
placeholder="请选择最低学历1=高中2=大专3=本科4=硕士5=博士"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="工作地点" prop="workLocation">
<el-select
v-model="queryParams.workLocation"
placeholder="请选择工作地点"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_WORK_LOCATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="婚姻状况:未婚、已婚、离异、丧偶" prop="maritalStatus">
<el-select
v-model="queryParams.maritalStatus"
placeholder="请选择婚姻状况:未婚、已婚、离异、丧偶"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MARITAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="从业经验" prop="experience">
<el-input
v-model="queryParams.experience"
placeholder="请输入从业经验"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:recruitment-request:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:recruitment-request:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="需求类型:新增需求、替换需求、储备需求" align="center" prop="requestType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_REQUEST_TYPE" :value="scope.row.requestType" />
</template>
</el-table-column>
<el-table-column label="所属部门" align="center" prop="requestDeptId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.CRM_AUDIT_STATUS" :value="scope.row.auditStatus" />
</template>
</el-table-column>
<el-table-column label="岗位id" align="center" prop="postId" />
<el-table-column label="需求岗位名称" align="center" prop="positionName" />
<el-table-column label="期望到岗日期" align="center" prop="expectedOnboard" />
<el-table-column label="需求人数" align="center" prop="requestedCount" />
<el-table-column label="年龄范围18-2525-3530-45" align="center" prop="ageRange" />
<el-table-column label="薪资4k-7k5k-8k10k-15k" align="center" prop="monthlySalary" />
<el-table-column label="最低学历1=高中2=大专3=本科4=硕士5=博士" align="center" prop="minEducation">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EDUCATION" :value="scope.row.minEducation" />
</template>
</el-table-column>
<el-table-column label="工作地点" align="center" prop="workLocation">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_WORK_LOCATION" :value="scope.row.workLocation" />
</template>
</el-table-column>
<el-table-column label="婚姻状况:未婚、已婚、离异、丧偶" align="center" prop="maritalStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_MARITAL_STATUS" :value="scope.row.maritalStatus" />
</template>
</el-table-column>
<el-table-column label="从业经验" align="center" prop="experience" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:recruitment-request:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:recruitment-request:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<RecruitmentRequestForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { RecruitmentRequestApi, RecruitmentRequestVO } from '@/api/hrm/recruitmentrequest'
import RecruitmentRequestForm from './RecruitmentRequestForm.vue'
/** 招聘需求申请 列表 */
defineOptions({ name: 'RecruitmentRequest' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<RecruitmentRequestVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
requestType: undefined,
requestDeptId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
postId: undefined,
positionName: undefined,
expectedOnboard: undefined,
requestedCount: undefined,
ageRange: undefined,
monthlySalary: undefined,
minEducation: undefined,
workLocation: undefined,
maritalStatus: undefined,
experience: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await RecruitmentRequestApi.getRecruitmentRequestPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await RecruitmentRequestApi.deleteRecruitmentRequest(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await RecruitmentRequestApi.exportRecruitmentRequest(queryParams)
download.excel(data, '招聘需求申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,142 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工档案ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工档案ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="预计离职日期" prop="expectedResignDate">
<el-date-picker
v-model="formData.expectedResignDate"
type="date"
value-format="x"
placeholder="选择预计离职日期"
/>
</el-form-item>
<el-form-item label="离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他" prop="resignationReason">
<el-input v-model="formData.resignationReason" placeholder="请输入离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他" />
</el-form-item>
<el-form-item label="离职原因说明" prop="reasonDescription">
<Editor v-model="formData.reasonDescription" height="150px" />
</el-form-item>
<el-form-item label="对工作等环境和公司文化的反馈" prop="feedbackOnWorkEnv">
<el-input v-model="formData.feedbackOnWorkEnv" placeholder="请输入对工作等环境和公司文化的反馈" />
</el-form-item>
<el-form-item label="对公司的意见和建议" prop="suggestions">
<el-input v-model="formData.suggestions" placeholder="请输入对公司的意见和建议" />
</el-form-item>
<el-form-item label="希望公司在未来的发展中能够做到的改进" prop="suggestionsForImprovement">
<el-input v-model="formData.suggestionsForImprovement" placeholder="请输入希望公司在未来的发展中能够做到的改进" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ResignationApplyApi, ResignationApplyVO } from '@/api/hrm/resignationapply'
/** 离职申请 表单 */
defineOptions({ name: 'ResignationApplyForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
expectedResignDate: undefined,
resignationReason: undefined,
reasonDescription: undefined,
feedbackOnWorkEnv: undefined,
suggestions: undefined,
suggestionsForImprovement: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
expectedResignDate: [{ required: true, message: '预计离职日期不能为空', trigger: 'blur' }],
resignationReason: [{ required: true, message: '离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await ResignationApplyApi.getResignationApply(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as ResignationApplyVO
if (formType.value === 'create') {
await ResignationApplyApi.createResignationApply(data)
message.success(t('common.createSuccess'))
} else {
await ResignationApplyApi.updateResignationApply(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
expectedResignDate: undefined,
resignationReason: undefined,
reasonDescription: undefined,
feedbackOnWorkEnv: undefined,
suggestions: undefined,
suggestionsForImprovement: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,269 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工档案ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工档案ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="预计离职日期" prop="expectedResignDate">
<el-date-picker
v-model="queryParams.expectedResignDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他" prop="resignationReason">
<el-input
v-model="queryParams.resignationReason"
placeholder="请输入离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="对工作等环境和公司文化的反馈" prop="feedbackOnWorkEnv">
<el-input
v-model="queryParams.feedbackOnWorkEnv"
placeholder="请输入对工作等环境和公司文化的反馈"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="对公司的意见和建议" prop="suggestions">
<el-input
v-model="queryParams.suggestions"
placeholder="请输入对公司的意见和建议"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="希望公司在未来的发展中能够做到的改进" prop="suggestionsForImprovement">
<el-input
v-model="queryParams.suggestionsForImprovement"
placeholder="请输入希望公司在未来的发展中能够做到的改进"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:resignation-apply:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:resignation-apply:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="员工档案ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="预计离职日期" align="center" prop="expectedResignDate" />
<el-table-column label="离职原因:个人原因、发展原因、薪酬原因、工作压力大、不接受组织调整、其他" align="center" prop="resignationReason" />
<el-table-column label="离职原因说明" align="center" prop="reasonDescription" />
<el-table-column label="对工作等环境和公司文化的反馈" align="center" prop="feedbackOnWorkEnv" />
<el-table-column label="对公司的意见和建议" align="center" prop="suggestions" />
<el-table-column label="希望公司在未来的发展中能够做到的改进" align="center" prop="suggestionsForImprovement" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:resignation-apply:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:resignation-apply:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<ResignationApplyForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { ResignationApplyApi, ResignationApplyVO } from '@/api/hrm/resignationapply'
import ResignationApplyForm from './ResignationApplyForm.vue'
/** 离职申请 列表 */
defineOptions({ name: 'ResignationApply' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<ResignationApplyVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
expectedResignDate: [],
resignationReason: undefined,
reasonDescription: undefined,
feedbackOnWorkEnv: undefined,
suggestions: undefined,
suggestionsForImprovement: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ResignationApplyApi.getResignationApplyPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ResignationApplyApi.deleteResignationApply(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ResignationApplyApi.exportResignationApply(queryParams)
download.excel(data, '离职申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,168 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="申请人ID" prop="applicantId">
<el-input v-model="formData.applicantId" placeholder="请输入申请人ID" />
</el-form-item>
<el-form-item label="用章主体ID" prop="companyId">
<el-input v-model="formData.companyId" placeholder="请输入用章主体ID" />
</el-form-item>
<el-form-item label="印章类型" prop="sealType">
<el-select v-model="formData.sealType" placeholder="请选择印章类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_SEAL_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="文件名称" prop="fileName">
<el-input v-model="formData.fileName" placeholder="请输入文件名称" />
</el-form-item>
<el-form-item label="用章次数" prop="sealCount">
<el-input v-model="formData.sealCount" placeholder="请输入用章次数" />
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input v-model="formData.attachment" placeholder="请输入附件" />
</el-form-item>
<el-form-item label="是否打印" prop="isPrint">
<el-radio-group v-model="formData.isPrint">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="申请说明" prop="instructions">
<el-input v-model="formData.instructions" placeholder="请输入申请说明" />
</el-form-item>
<el-form-item label="申请时间" prop="applicantTime">
<el-date-picker
v-model="formData.applicantTime"
type="date"
value-format="x"
placeholder="选择申请时间"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { SealRequestApi, SealRequestVO } from '@/api/hrm/sealrequest'
/** 用章申请 表单 */
defineOptions({ name: 'SealRequestForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
applicantId: undefined,
companyId: undefined,
sealType: undefined,
processInstanceId: undefined,
auditStatus: undefined,
fileName: undefined,
sealCount: undefined,
attachment: undefined,
isPrint: undefined,
instructions: undefined,
applicantTime: undefined
})
const formRules = reactive({
applicantId: [{ required: true, message: '申请人ID不能为空', trigger: 'blur' }],
companyId: [{ required: true, message: '用章主体ID不能为空', trigger: 'blur' }],
sealType: [{ required: true, message: '印章类型不能为空', trigger: 'change' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
fileName: [{ required: true, message: '文件名称不能为空', trigger: 'blur' }],
sealCount: [{ required: true, message: '用章次数不能为空', trigger: 'blur' }],
attachment: [{ required: true, message: '附件不能为空', trigger: 'blur' }],
isPrint: [{ required: true, message: '是否打印不能为空', trigger: 'blur' }],
instructions: [{ required: true, message: '申请说明不能为空', trigger: 'blur' }],
applicantTime: [{ required: true, message: '申请时间不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SealRequestApi.getSealRequest(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as SealRequestVO
if (formType.value === 'create') {
await SealRequestApi.createSealRequest(data)
message.success(t('common.createSuccess'))
} else {
await SealRequestApi.updateSealRequest(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
applicantId: undefined,
companyId: undefined,
sealType: undefined,
processInstanceId: undefined,
auditStatus: undefined,
fileName: undefined,
sealCount: undefined,
attachment: undefined,
isPrint: undefined,
instructions: undefined,
applicantTime: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,318 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="申请人ID" prop="applicantId">
<el-input
v-model="queryParams.applicantId"
placeholder="请输入申请人ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="用章主体ID" prop="companyId">
<el-input
v-model="queryParams.companyId"
placeholder="请输入用章主体ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="印章类型" prop="sealType">
<el-select
v-model="queryParams.sealType"
placeholder="请选择印章类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_SEAL_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="文件名称" prop="fileName">
<el-input
v-model="queryParams.fileName"
placeholder="请输入文件名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="用章次数" prop="sealCount">
<el-input
v-model="queryParams.sealCount"
placeholder="请输入用章次数"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="附件" prop="attachment">
<el-input
v-model="queryParams.attachment"
placeholder="请输入附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否打印" prop="isPrint">
<el-select
v-model="queryParams.isPrint"
placeholder="请选择是否打印"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="申请说明" prop="instructions">
<el-input
v-model="queryParams.instructions"
placeholder="请输入申请说明"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="申请时间" prop="applicantTime">
<el-date-picker
v-model="queryParams.applicantTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:seal-request:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:seal-request:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="申请人ID" align="center" prop="applicantId" />
<el-table-column label="用章主体ID" align="center" prop="companyId" />
<el-table-column label="印章类型" align="center" prop="sealType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_SEAL_TYPE" :value="scope.row.sealType" />
</template>
</el-table-column>
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="文件名称" align="center" prop="fileName" />
<el-table-column label="用章次数" align="center" prop="sealCount" />
<el-table-column label="附件" align="center" prop="attachment" />
<el-table-column label="是否打印" align="center" prop="isPrint" />
<el-table-column label="申请说明" align="center" prop="instructions" />
<el-table-column
label="申请时间"
align="center"
prop="applicantTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:seal-request:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:seal-request:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SealRequestForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { SealRequestApi, SealRequestVO } from '@/api/hrm/sealrequest'
import SealRequestForm from './SealRequestForm.vue'
/** 用章申请 列表 */
defineOptions({ name: 'SealRequest' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<SealRequestVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
applicantId: undefined,
companyId: undefined,
sealType: undefined,
processInstanceId: undefined,
auditStatus: undefined,
fileName: undefined,
sealCount: undefined,
attachment: undefined,
isPrint: undefined,
instructions: undefined,
applicantTime: [],
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SealRequestApi.getSealRequestPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SealRequestApi.deleteSealRequest(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SealRequestApi.exportSealRequest(queryParams)
download.excel(data, '用章申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,147 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="生效日期" prop="effectiveDate">
<el-date-picker
v-model="formData.effectiveDate"
type="date"
value-format="x"
placeholder="选择生效日期"
/>
</el-form-item>
<el-form-item label="申请说明" prop="applyDesc">
<el-input v-model="formData.applyDesc" placeholder="请输入申请说明" />
</el-form-item>
<el-form-item label="本人签字" prop="elecSignature">
<el-input v-model="formData.elecSignature" placeholder="请输入本人签字" />
</el-form-item>
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="补助申请明细" name="subsidyApplyDetail">
<SubsidyApplyDetailForm ref="subsidyApplyDetailFormRef" :subsidy-application-id="formData.id" />
</el-tab-pane>
</el-tabs>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { SubsidyApplyApi, SubsidyApplyVO } from '@/api/hrm/subsidyapply'
import SubsidyApplyDetailForm from './components/SubsidyApplyDetailForm.vue'
/** 补助申请 表单 */
defineOptions({ name: 'SubsidyApplyForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
effectiveDate: undefined,
applyDesc: undefined,
elecSignature: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
effectiveDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }],
applyDesc: [{ required: true, message: '申请说明不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 子表的表单 */
const subTabsName = ref('subsidyApplyDetail')
const subsidyApplyDetailFormRef = ref()
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubsidyApplyApi.getSubsidyApply(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await subsidyApplyDetailFormRef.value.validate()
} catch (e) {
subTabsName.value = 'subsidyApplyDetail'
return
}
//
formLoading.value = true
try {
const data = formData.value as unknown as SubsidyApplyVO
//
data.subsidyApplyDetails = subsidyApplyDetailFormRef.value.getData()
if (formType.value === 'create') {
await SubsidyApplyApi.createSubsidyApply(data)
message.success(t('common.createSuccess'))
} else {
await SubsidyApplyApi.updateSubsidyApply(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
effectiveDate: undefined,
applyDesc: undefined,
elecSignature: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,117 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="补助类型" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subsidyType`" :rules="formRules.subsidyType" class="mb-0px!">
<el-select v-model="row.subsidyType" placeholder="请选择补助类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_SUBSIDY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="原补助金额" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.beforeMoney`" :rules="formRules.beforeMoney" class="mb-0px!">
<el-input v-model="row.beforeMoney" placeholder="请输入原补助金额" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="补助后金额" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.afterMoney`" :rules="formRules.afterMoney" class="mb-0px!">
<el-input v-model="row.afterMoney" placeholder="请输入补助后金额" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加补助申请明细</el-button>
</el-row>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { SubsidyApplyApi } from '@/api/hrm/subsidyapply'
const props = defineProps<{
subsidyApplicationId: undefined // ID
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
subsidyApplicationId: [{ required: true, message: '补助申请ID不能为空', trigger: 'blur' }],
subsidyType: [{ required: true, message: '补助类型不能为空', trigger: 'change' }],
beforeMoney: [{ required: true, message: '原补助金额不能为空', trigger: 'blur' }],
afterMoney: [{ required: true, message: '补助后金额不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.subsidyApplicationId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await SubsidyApplyApi.getSubsidyApplyDetailListBySubsidyApplicationId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
subsidyApplicationId: undefined,
subsidyType: undefined,
beforeMoney: undefined,
afterMoney: undefined
}
row.subsidyApplicationId = props.subsidyApplicationId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

View File

@ -0,0 +1,245 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="生效日期" prop="effectiveDate">
<el-date-picker
v-model="queryParams.effectiveDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="申请说明" prop="applyDesc">
<el-input
v-model="queryParams.applyDesc"
placeholder="请输入申请说明"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="本人签字" prop="elecSignature">
<el-input
v-model="queryParams.elecSignature"
placeholder="请输入本人签字"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:subsidy-apply:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:subsidy-apply:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="员工ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="生效日期" align="center" prop="effectiveDate" />
<el-table-column label="申请说明" align="center" prop="applyDesc" />
<el-table-column label="本人签字" align="center" prop="elecSignature" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:subsidy-apply:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:subsidy-apply:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SubsidyApplyForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { SubsidyApplyApi, SubsidyApplyVO } from '@/api/hrm/subsidyapply'
import SubsidyApplyForm from './SubsidyApplyForm.vue'
/** 补助申请 列表 */
defineOptions({ name: 'SubsidyApply' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<SubsidyApplyVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
effectiveDate: [],
applyDesc: undefined,
elecSignature: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SubsidyApplyApi.getSubsidyApplyPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SubsidyApplyApi.deleteSubsidyApply(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SubsidyApplyApi.exportSubsidyApply(queryParams)
download.excel(data, '补助申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,118 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="补助申请ID" prop="subsidyApplicationId">
<el-input v-model="formData.subsidyApplicationId" placeholder="请输入补助申请ID" />
</el-form-item>
<el-form-item label="补助类型" prop="subsidyType">
<el-select v-model="formData.subsidyType" placeholder="请选择补助类型">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_SUBSIDY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="原补助金额" prop="beforeMoney">
<el-input v-model="formData.beforeMoney" placeholder="请输入原补助金额" />
</el-form-item>
<el-form-item label="补助后金额" prop="afterMoney">
<el-input v-model="formData.afterMoney" placeholder="请输入补助后金额" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { SubsidyApplyDetailApi, SubsidyApplyDetailVO } from '@/api/hrm/subsidyapplydetail'
/** 补助申请明细 表单 */
defineOptions({ name: 'SubsidyApplyDetailForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
subsidyApplicationId: undefined,
subsidyType: undefined,
beforeMoney: undefined,
afterMoney: undefined
})
const formRules = reactive({
subsidyApplicationId: [{ required: true, message: '补助申请ID不能为空', trigger: 'blur' }],
subsidyType: [{ required: true, message: '补助类型不能为空', trigger: 'change' }],
beforeMoney: [{ required: true, message: '原补助金额不能为空', trigger: 'blur' }],
afterMoney: [{ required: true, message: '补助后金额不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await SubsidyApplyDetailApi.getSubsidyApplyDetail(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as SubsidyApplyDetailVO
if (formType.value === 'create') {
await SubsidyApplyDetailApi.createSubsidyApplyDetail(data)
message.success(t('common.createSuccess'))
} else {
await SubsidyApplyDetailApi.updateSubsidyApplyDetail(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
subsidyApplicationId: undefined,
subsidyType: undefined,
beforeMoney: undefined,
afterMoney: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,231 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="补助申请ID" prop="subsidyApplicationId">
<el-input
v-model="queryParams.subsidyApplicationId"
placeholder="请输入补助申请ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="补助类型" prop="subsidyType">
<el-select
v-model="queryParams.subsidyType"
placeholder="请选择补助类型"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_SUBSIDY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="原补助金额" prop="beforeMoney">
<el-input
v-model="queryParams.beforeMoney"
placeholder="请输入原补助金额"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="补助后金额" prop="afterMoney">
<el-input
v-model="queryParams.afterMoney"
placeholder="请输入补助后金额"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:subsidy-apply-detail:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:subsidy-apply-detail:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="补助申请ID" align="center" prop="subsidyApplicationId" />
<el-table-column label="补助类型" align="center" prop="subsidyType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_SUBSIDY_TYPE" :value="scope.row.subsidyType" />
</template>
</el-table-column>
<el-table-column label="原补助金额" align="center" prop="beforeMoney" />
<el-table-column label="补助后金额" align="center" prop="afterMoney" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:subsidy-apply-detail:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:subsidy-apply-detail:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<SubsidyApplyDetailForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { SubsidyApplyDetailApi, SubsidyApplyDetailVO } from '@/api/hrm/subsidyapplydetail'
import SubsidyApplyDetailForm from './SubsidyApplyDetailForm.vue'
/** 补助申请明细 列表 */
defineOptions({ name: 'SubsidyApplyDetail' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<SubsidyApplyDetailVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
subsidyApplicationId: undefined,
subsidyType: undefined,
beforeMoney: undefined,
afterMoney: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await SubsidyApplyDetailApi.getSubsidyApplyDetailPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await SubsidyApplyDetailApi.deleteSubsidyApplyDetail(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await SubsidyApplyDetailApi.exportSubsidyApplyDetail(queryParams)
download.excel(data, '补助申请明细.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,216 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="招聘需求ID" prop="recruitmentRequestId">
<el-input v-model="formData.recruitmentRequestId" placeholder="请输入招聘需求ID" />
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="formData.gender" placeholder="请选择性别">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="籍贯" prop="birthPlace">
<el-input v-model="formData.birthPlace" placeholder="请输入籍贯" />
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model="formData.age" placeholder="请输入年龄" />
</el-form-item>
<el-form-item label="电子邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入电子邮箱" />
</el-form-item>
<el-form-item label="学校" prop="school">
<el-input v-model="formData.school" placeholder="请输入学校" />
</el-form-item>
<el-form-item label="专业" prop="major">
<el-input v-model="formData.major" placeholder="请输入专业" />
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="出生日期" prop="birthday">
<el-input v-model="formData.birthday" placeholder="请输入出生日期" />
</el-form-item>
<el-form-item label="岗位id" prop="postId">
<el-input v-model="formData.postId" placeholder="请输入岗位id" />
</el-form-item>
<el-form-item label="意向岗位名称" prop="desiredPosition">
<el-input v-model="formData.desiredPosition" placeholder="请输入意向岗位名称" />
</el-form-item>
<el-form-item label="意向城市" prop="desiredCity">
<el-input v-model="formData.desiredCity" placeholder="请输入意向城市" />
</el-form-item>
<el-form-item label="最高学历(大专、本科、硕士、博士)" prop="highestEducation">
<el-input v-model="formData.highestEducation" placeholder="请输入最高学历(大专、本科、硕士、博士)" />
</el-form-item>
<el-form-item label="个人照片" prop="personalPhoto">
<el-input v-model="formData.personalPhoto" placeholder="请输入个人照片" />
</el-form-item>
<el-form-item label="工作案例附件" prop="workCaseAttachment">
<el-input v-model="formData.workCaseAttachment" placeholder="请输入工作案例附件" />
</el-form-item>
<el-form-item label="简历附件" prop="resumeAttachment">
<el-input v-model="formData.resumeAttachment" placeholder="请输入简历附件" />
</el-form-item>
<el-form-item label="是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号" prop="isInternalRef">
<el-select v-model="formData.isInternalRef" placeholder="请选择是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_INTERNAL_REF)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="婚育情况(未婚、已婚未育、已婚已育)" prop="maritalStatus">
<el-select v-model="formData.maritalStatus" placeholder="请选择婚育情况(未婚、已婚未育、已婚已育)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MARITAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input v-model="formData.deptId" placeholder="请输入部门ID" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { TalentPoolApi, TalentPoolVO } from '@/api/hrm/talentpool'
/** 人才库 表单 */
defineOptions({ name: 'TalentPoolForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
recruitmentRequestId: undefined,
name: undefined,
gender: undefined,
birthPlace: undefined,
age: undefined,
email: undefined,
school: undefined,
major: undefined,
phone: undefined,
birthday: undefined,
postId: undefined,
desiredPosition: undefined,
desiredCity: undefined,
highestEducation: undefined,
personalPhoto: undefined,
workCaseAttachment: undefined,
resumeAttachment: undefined,
isInternalRef: undefined,
maritalStatus: undefined,
deptId: undefined
})
const formRules = reactive({
name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }],
phone: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
desiredPosition: [{ required: true, message: '意向岗位名称不能为空', trigger: 'blur' }],
desiredCity: [{ required: true, message: '意向城市不能为空', trigger: 'blur' }],
highestEducation: [{ required: true, message: '最高学历(大专、本科、硕士、博士)不能为空', trigger: 'blur' }],
isInternalRef: [{ required: true, message: '是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号不能为空', trigger: 'change' }],
maritalStatus: [{ required: true, message: '婚育情况(未婚、已婚未育、已婚已育)不能为空', trigger: 'change' }],
deptId: [{ required: true, message: '部门ID不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await TalentPoolApi.getTalentPool(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as TalentPoolVO
if (formType.value === 'create') {
await TalentPoolApi.createTalentPool(data)
message.success(t('common.createSuccess'))
} else {
await TalentPoolApi.updateTalentPool(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
recruitmentRequestId: undefined,
name: undefined,
gender: undefined,
birthPlace: undefined,
age: undefined,
email: undefined,
school: undefined,
major: undefined,
phone: undefined,
birthday: undefined,
postId: undefined,
desiredPosition: undefined,
desiredCity: undefined,
highestEducation: undefined,
personalPhoto: undefined,
workCaseAttachment: undefined,
resumeAttachment: undefined,
isInternalRef: undefined,
maritalStatus: undefined,
deptId: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,427 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="招聘需求ID" prop="recruitmentRequestId">
<el-input
v-model="queryParams.recruitmentRequestId"
placeholder="请输入招聘需求ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="姓名" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select
v-model="queryParams.gender"
placeholder="请选择性别"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="籍贯" prop="birthPlace">
<el-input
v-model="queryParams.birthPlace"
placeholder="请输入籍贯"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input
v-model="queryParams.age"
placeholder="请输入年龄"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="电子邮箱" prop="email">
<el-input
v-model="queryParams.email"
placeholder="请输入电子邮箱"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="学校" prop="school">
<el-input
v-model="queryParams.school"
placeholder="请输入学校"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="专业" prop="major">
<el-input
v-model="queryParams.major"
placeholder="请输入专业"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input
v-model="queryParams.phone"
placeholder="请输入手机号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="出生日期" prop="birthday">
<el-input
v-model="queryParams.birthday"
placeholder="请输入出生日期"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="岗位id" prop="postId">
<el-input
v-model="queryParams.postId"
placeholder="请输入岗位id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="意向岗位名称" prop="desiredPosition">
<el-input
v-model="queryParams.desiredPosition"
placeholder="请输入意向岗位名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="意向城市" prop="desiredCity">
<el-input
v-model="queryParams.desiredCity"
placeholder="请输入意向城市"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="最高学历(大专、本科、硕士、博士)" prop="highestEducation">
<el-input
v-model="queryParams.highestEducation"
placeholder="请输入最高学历(大专、本科、硕士、博士)"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="个人照片" prop="personalPhoto">
<el-input
v-model="queryParams.personalPhoto"
placeholder="请输入个人照片"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作案例附件" prop="workCaseAttachment">
<el-input
v-model="queryParams.workCaseAttachment"
placeholder="请输入工作案例附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="简历附件" prop="resumeAttachment">
<el-input
v-model="queryParams.resumeAttachment"
placeholder="请输入简历附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号" prop="isInternalRef">
<el-select
v-model="queryParams.isInternalRef"
placeholder="请选择是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_INTERNAL_REF)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="婚育情况(未婚、已婚未育、已婚已育)" prop="maritalStatus">
<el-select
v-model="queryParams.maritalStatus"
placeholder="请选择婚育情况(未婚、已婚未育、已婚已育)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MARITAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input
v-model="queryParams.deptId"
placeholder="请输入部门ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:talent-pool:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:talent-pool:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="招聘需求ID" align="center" prop="recruitmentRequestId" />
<el-table-column label="姓名" align="center" prop="name" />
<el-table-column label="性别" align="center" prop="gender">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.gender" />
</template>
</el-table-column>
<el-table-column label="籍贯" align="center" prop="birthPlace" />
<el-table-column label="年龄" align="center" prop="age" />
<el-table-column label="电子邮箱" align="center" prop="email" />
<el-table-column label="学校" align="center" prop="school" />
<el-table-column label="专业" align="center" prop="major" />
<el-table-column label="手机号" align="center" prop="phone" />
<el-table-column label="出生日期" align="center" prop="birthday" />
<el-table-column label="岗位id" align="center" prop="postId" />
<el-table-column label="意向岗位名称" align="center" prop="desiredPosition" />
<el-table-column label="意向城市" align="center" prop="desiredCity" />
<el-table-column label="最高学历(大专、本科、硕士、博士)" align="center" prop="highestEducation" />
<el-table-column label="个人照片" align="center" prop="personalPhoto" />
<el-table-column label="工作案例附件" align="center" prop="workCaseAttachment" />
<el-table-column label="简历附件" align="center" prop="resumeAttachment" />
<el-table-column label="是否内推内部推荐、BOSS直聘、猎聘、智联招聘、脉脉、公众号" align="center" prop="isInternalRef">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_INTERNAL_REF" :value="scope.row.isInternalRef" />
</template>
</el-table-column>
<el-table-column label="婚育情况(未婚、已婚未育、已婚已育)" align="center" prop="maritalStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_MARITAL_STATUS" :value="scope.row.maritalStatus" />
</template>
</el-table-column>
<el-table-column label="部门ID" align="center" prop="deptId" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:talent-pool:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:talent-pool:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<TalentPoolForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { TalentPoolApi, TalentPoolVO } from '@/api/hrm/talentpool'
import TalentPoolForm from './TalentPoolForm.vue'
/** 人才库 列表 */
defineOptions({ name: 'TalentPool' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<TalentPoolVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
recruitmentRequestId: undefined,
name: undefined,
gender: undefined,
birthPlace: undefined,
age: undefined,
email: undefined,
school: undefined,
major: undefined,
phone: undefined,
birthday: undefined,
postId: undefined,
desiredPosition: undefined,
desiredCity: undefined,
highestEducation: undefined,
personalPhoto: undefined,
workCaseAttachment: undefined,
resumeAttachment: undefined,
isInternalRef: undefined,
maritalStatus: undefined,
deptId: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await TalentPoolApi.getTalentPoolPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TalentPoolApi.deleteTalentPool(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TalentPoolApi.exportTalentPool(queryParams)
download.excel(data, '人才库.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,159 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="课件ID关联courseware表" prop="coursewareId">
<el-input v-model="formData.coursewareId" placeholder="请输入课件ID关联courseware表" />
</el-form-item>
<el-form-item label="培训名称" prop="trainingName">
<el-input v-model="formData.trainingName" placeholder="请输入培训名称" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="培训开始时间" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="date"
value-format="x"
placeholder="选择培训开始时间"
/>
</el-form-item>
<el-form-item label="培训结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="date"
value-format="x"
placeholder="选择培训结束时间"
/>
</el-form-item>
<el-form-item label="培训学时" prop="trainingHours">
<el-input v-model="formData.trainingHours" placeholder="请输入培训学时" />
</el-form-item>
<el-form-item label="讲师" prop="lecturer">
<el-input v-model="formData.lecturer" placeholder="请输入讲师" />
</el-form-item>
<el-form-item label="培训地点" prop="trainingLocation">
<el-input v-model="formData.trainingLocation" placeholder="请输入培训地点" />
</el-form-item>
<el-form-item label="培训目的" prop="trainingPurpose">
<el-input v-model="formData.trainingPurpose" placeholder="请输入培训目的" />
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input v-model="formData.deptId" placeholder="请输入部门ID" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { TrainingApi, TrainingVO } from '@/api/hrm/training'
/** 培训信息 表单 */
defineOptions({ name: 'TrainingForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
coursewareId: undefined,
trainingName: undefined,
processInstanceId: undefined,
auditStatus: undefined,
startTime: undefined,
endTime: undefined,
trainingHours: undefined,
lecturer: undefined,
trainingLocation: undefined,
trainingPurpose: undefined,
deptId: undefined
})
const formRules = reactive({
coursewareId: [{ required: true, message: '课件ID关联courseware表不能为空', trigger: 'blur' }],
trainingName: [{ required: true, message: '培训名称不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
startTime: [{ required: true, message: '培训开始时间不能为空', trigger: 'blur' }],
endTime: [{ required: true, message: '培训结束时间不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门ID不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await TrainingApi.getTraining(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as TrainingVO
if (formType.value === 'create') {
await TrainingApi.createTraining(data)
message.success(t('common.createSuccess'))
} else {
await TrainingApi.updateTraining(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
coursewareId: undefined,
trainingName: undefined,
processInstanceId: undefined,
auditStatus: undefined,
startTime: undefined,
endTime: undefined,
trainingHours: undefined,
lecturer: undefined,
trainingLocation: undefined,
trainingPurpose: undefined,
deptId: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,314 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="课件ID关联courseware表" prop="coursewareId">
<el-input
v-model="queryParams.coursewareId"
placeholder="请输入课件ID关联courseware表"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训名称" prop="trainingName">
<el-input
v-model="queryParams.trainingName"
placeholder="请输入培训名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="培训开始时间" prop="startTime">
<el-date-picker
v-model="queryParams.startTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="培训结束时间" prop="endTime">
<el-date-picker
v-model="queryParams.endTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="培训学时" prop="trainingHours">
<el-input
v-model="queryParams.trainingHours"
placeholder="请输入培训学时"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="讲师" prop="lecturer">
<el-input
v-model="queryParams.lecturer"
placeholder="请输入讲师"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训地点" prop="trainingLocation">
<el-input
v-model="queryParams.trainingLocation"
placeholder="请输入培训地点"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训目的" prop="trainingPurpose">
<el-input
v-model="queryParams.trainingPurpose"
placeholder="请输入培训目的"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input
v-model="queryParams.deptId"
placeholder="请输入部门ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:training:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:training:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="课件ID关联courseware表" align="center" prop="coursewareId" />
<el-table-column label="培训名称" align="center" prop="trainingName" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column
label="培训开始时间"
align="center"
prop="startTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="培训结束时间"
align="center"
prop="endTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="培训学时" align="center" prop="trainingHours" />
<el-table-column label="讲师" align="center" prop="lecturer" />
<el-table-column label="培训地点" align="center" prop="trainingLocation" />
<el-table-column label="培训目的" align="center" prop="trainingPurpose" />
<el-table-column label="部门ID" align="center" prop="deptId" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:training:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:training:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<TrainingForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { TrainingApi, TrainingVO } from '@/api/hrm/training'
import TrainingForm from './TrainingForm.vue'
/** 培训信息 列表 */
defineOptions({ name: 'Training' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<TrainingVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
coursewareId: undefined,
trainingName: undefined,
processInstanceId: undefined,
auditStatus: undefined,
startTime: [],
endTime: [],
trainingHours: undefined,
lecturer: undefined,
trainingLocation: undefined,
trainingPurpose: undefined,
deptId: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await TrainingApi.getTrainingPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TrainingApi.deleteTraining(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TrainingApi.exportTraining(queryParams)
download.excel(data, '培训信息.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,140 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工ID" />
</el-form-item>
<el-form-item label="培训ID关联training表" prop="trainingId">
<el-input v-model="formData.trainingId" placeholder="请输入培训ID关联training表" />
</el-form-item>
<el-form-item label="培训开始时间" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="date"
value-format="x"
placeholder="选择培训开始时间"
/>
</el-form-item>
<el-form-item label="培训结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="date"
value-format="x"
placeholder="选择培训结束时间"
/>
</el-form-item>
<el-form-item label="培训成绩" prop="trainingScore">
<el-input v-model="formData.trainingScore" placeholder="请输入培训成绩" />
</el-form-item>
<el-form-item label="培训证书名称" prop="certificate">
<el-input v-model="formData.certificate" placeholder="请输入培训证书名称" />
</el-form-item>
<el-form-item label="培训证书编号" prop="certificateNumber">
<el-input v-model="formData.certificateNumber" placeholder="请输入培训证书编号" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="formData.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { TrainingExperienceApi, TrainingExperienceVO } from '@/api/hrm/trainingexperience'
/** 培训经历 表单 */
defineOptions({ name: 'TrainingExperienceForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
trainingId: undefined,
startTime: undefined,
endTime: undefined,
trainingScore: undefined,
certificate: undefined,
certificateNumber: undefined,
remark: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工ID不能为空', trigger: 'blur' }],
trainingId: [{ required: true, message: '培训ID关联training表不能为空', trigger: 'blur' }],
startTime: [{ required: true, message: '培训开始时间不能为空', trigger: 'blur' }],
endTime: [{ required: true, message: '培训结束时间不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await TrainingExperienceApi.getTrainingExperience(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as TrainingExperienceVO
if (formType.value === 'create') {
await TrainingExperienceApi.createTrainingExperience(data)
message.success(t('common.createSuccess'))
} else {
await TrainingExperienceApi.updateTrainingExperience(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
trainingId: undefined,
startTime: undefined,
endTime: undefined,
trainingScore: undefined,
certificate: undefined,
certificateNumber: undefined,
remark: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,261 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训ID关联training表" prop="trainingId">
<el-input
v-model="queryParams.trainingId"
placeholder="请输入培训ID关联training表"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训开始时间" prop="startTime">
<el-date-picker
v-model="queryParams.startTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="培训结束时间" prop="endTime">
<el-date-picker
v-model="queryParams.endTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="培训成绩" prop="trainingScore">
<el-input
v-model="queryParams.trainingScore"
placeholder="请输入培训成绩"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训证书名称" prop="certificate">
<el-input
v-model="queryParams.certificate"
placeholder="请输入培训证书名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="培训证书编号" prop="certificateNumber">
<el-input
v-model="queryParams.certificateNumber"
placeholder="请输入培训证书编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input
v-model="queryParams.remark"
placeholder="请输入备注"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:training-experience:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:training-experience:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键ID" align="center" prop="id" />
<el-table-column label="员工ID" align="center" prop="userId" />
<el-table-column label="培训ID关联training表" align="center" prop="trainingId" />
<el-table-column
label="培训开始时间"
align="center"
prop="startTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="培训结束时间"
align="center"
prop="endTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="培训成绩" align="center" prop="trainingScore" />
<el-table-column label="培训证书名称" align="center" prop="certificate" />
<el-table-column label="培训证书编号" align="center" prop="certificateNumber" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:training-experience:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:training-experience:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<TrainingExperienceForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { TrainingExperienceApi, TrainingExperienceVO } from '@/api/hrm/trainingexperience'
import TrainingExperienceForm from './TrainingExperienceForm.vue'
/** 培训经历 列表 */
defineOptions({ name: 'TrainingExperience' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<TrainingExperienceVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
trainingId: undefined,
startTime: [],
endTime: [],
trainingScore: undefined,
certificate: undefined,
certificateNumber: undefined,
remark: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await TrainingExperienceApi.getTrainingExperiencePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await TrainingExperienceApi.deleteTrainingExperience(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await TrainingExperienceApi.exportTrainingExperience(queryParams)
download.excel(data, '培训经历.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,540 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="用户登录账号IDsys_user表" prop="acctId">
<el-input v-model="formData.acctId" placeholder="请输入用户登录账号IDsys_user表" />
</el-form-item>
<el-form-item label="员工编号" prop="userNo">
<el-input v-model="formData.userNo" placeholder="请输入员工编号" />
</el-form-item>
<el-form-item label="员工姓名" prop="realName">
<el-input v-model="formData.realName" placeholder="请输入员工姓名" />
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input v-model="formData.phone" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input v-model="formData.email" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="入职日期" prop="employmentDate">
<el-date-picker
v-model="formData.employmentDate"
type="date"
value-format="x"
placeholder="选择入职日期"
/>
</el-form-item>
<el-form-item label="转正日期" prop="regularizationDate">
<el-date-picker
v-model="formData.regularizationDate"
type="date"
value-format="x"
placeholder="选择转正日期"
/>
</el-form-item>
<el-form-item label="岗位Id" prop="postId">
<el-input v-model="formData.postId" placeholder="请输入岗位Id" />
</el-form-item>
<el-form-item label="职级" prop="postLevel">
<el-select v-model="formData.postLevel" placeholder="请选择职级">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_POST_RANK)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="档级" prop="gradeLevel">
<el-select v-model="formData.gradeLevel" placeholder="请选择档级">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_GRADE_LEVEL)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="聘用形式(全职、见习、实习、劳务、联创、其他)" prop="employType">
<el-select v-model="formData.employType" placeholder="请选择聘用形式(全职、见习、实习、劳务、联创、其他)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="试用开始日期" prop="trialStartDate">
<el-date-picker
v-model="formData.trialStartDate"
type="date"
value-format="x"
placeholder="选择试用开始日期"
/>
</el-form-item>
<el-form-item label="试用结束日期" prop="trialEndDate">
<el-date-picker
v-model="formData.trialEndDate"
type="date"
value-format="x"
placeholder="选择试用结束日期"
/>
</el-form-item>
<el-form-item label="试用期限(月)" prop="probationPeriod">
<el-input v-model="formData.probationPeriod" placeholder="请输入试用期限(月)" />
</el-form-item>
<el-form-item label="合同开始日期" prop="contractStartDate">
<el-date-picker
v-model="formData.contractStartDate"
type="date"
value-format="x"
placeholder="选择合同开始日期"
/>
</el-form-item>
<el-form-item label="合同结束日期" prop="contractEndDate">
<el-date-picker
v-model="formData.contractEndDate"
type="date"
value-format="x"
placeholder="选择合同结束日期"
/>
</el-form-item>
<el-form-item label="合同期限(年)" prop="contractTerm">
<el-input v-model="formData.contractTerm" placeholder="请输入合同期限(年)" />
</el-form-item>
<el-form-item label="性别(男、女、其他)" prop="gender">
<el-select v-model="formData.gender" placeholder="请选择性别(男、女、其他)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input v-model="formData.age" placeholder="请输入年龄" />
</el-form-item>
<el-form-item label="简历附件" prop="resume">
<el-input v-model="formData.resume" placeholder="请输入简历附件" />
</el-form-item>
<el-form-item label="形象照" prop="workPhoto">
<el-input v-model="formData.workPhoto" placeholder="请输入形象照" />
</el-form-item>
<el-form-item label="身份证人像" prop="idCardFaceSide">
<el-input v-model="formData.idCardFaceSide" placeholder="请输入身份证人像" />
</el-form-item>
<el-form-item label="身份证国徽" prop="idCardNationalEmblemSide">
<el-input v-model="formData.idCardNationalEmblemSide" placeholder="请输入身份证国徽" />
</el-form-item>
<el-form-item label="现住址" prop="currentAddress">
<el-input v-model="formData.currentAddress" placeholder="请输入现住址" />
</el-form-item>
<el-form-item label="身份证号" prop="idCardNumber">
<el-input v-model="formData.idCardNumber" placeholder="请输入身份证号" />
</el-form-item>
<el-form-item label="出生日期" prop="birthDate">
<el-date-picker
v-model="formData.birthDate"
type="date"
value-format="x"
placeholder="选择出生日期"
/>
</el-form-item>
<el-form-item label="发证机关" prop="issuingAuthority">
<el-input v-model="formData.issuingAuthority" placeholder="请输入发证机关" />
</el-form-item>
<el-form-item label="民族56个民族" prop="nation">
<el-select v-model="formData.nation" placeholder="请选择民族56个民族">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_NATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="户口扫描件" prop="householdRegistrationScan">
<el-input v-model="formData.householdRegistrationScan" placeholder="请输入户口扫描件" />
</el-form-item>
<el-form-item label="户籍类型(农村、城镇)" prop="householdType">
<el-select v-model="formData.householdType" placeholder="请选择户籍类型(农村、城镇)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_HOUSEHOLD_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="户籍地" prop="householdAddress">
<el-input v-model="formData.householdAddress" placeholder="请输入户籍地" />
</el-form-item>
<el-form-item label="政治面貌(共青团员、中共预备党员、中共党员、群众、其他)" prop="politicalStatus">
<el-select v-model="formData.politicalStatus" placeholder="请选择政治面貌(共青团员、中共预备党员、中共党员、群众、其他)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_POLITICAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="婚姻状况(未婚、已婚未育、已婚已育)" prop="maritalStatus">
<el-select v-model="formData.maritalStatus" placeholder="请选择婚姻状况(未婚、已婚未育、已婚已育)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MARITAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="关系1父母、夫妻、兄弟、姊妹、朋友、其他" prop="relationship1">
<el-select v-model="formData.relationship1" placeholder="请选择关系1父母、夫妻、兄弟、姊妹、朋友、其他">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELATIONSHIP)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="联系人姓名1" prop="contactName1">
<el-input v-model="formData.contactName1" placeholder="请输入联系人姓名1" />
</el-form-item>
<el-form-item label="联系手机号1" prop="contactPhone1">
<el-input v-model="formData.contactPhone1" placeholder="请输入联系手机号1" />
</el-form-item>
<el-form-item label="关系2父母、夫妻、兄弟、姊妹、朋友、其他" prop="relationship2">
<el-select v-model="formData.relationship2" placeholder="请选择关系2父母、夫妻、兄弟、姊妹、朋友、其他">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELATIONSHIP)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="联系人姓名2" prop="contactName2">
<el-input v-model="formData.contactName2" placeholder="请输入联系人姓名2" />
</el-form-item>
<el-form-item label="联系手机号2" prop="contactPhone2">
<el-input v-model="formData.contactPhone2" placeholder="请输入联系手机号2" />
</el-form-item>
<el-form-item label="工商银行开户支行" prop="bankBranch">
<el-input v-model="formData.bankBranch" placeholder="请输入工商银行开户支行" />
</el-form-item>
<el-form-item label="工资卡卡号" prop="salaryCardNumber">
<el-input v-model="formData.salaryCardNumber" placeholder="请输入工资卡卡号" />
</el-form-item>
<el-form-item label="账户名与本人关系(父亲、母亲)" prop="accountRelationship">
<el-select v-model="formData.accountRelationship" placeholder="请选择账户名与本人关系(父亲、母亲)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELATIONSHIP)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="敬老费银行卡户名" prop="pensionCardHolder">
<el-input v-model="formData.pensionCardHolder" placeholder="请输入敬老费银行卡户名" />
</el-form-item>
<el-form-item label="敬老费银行账号" prop="pensionAccountNumber">
<el-input v-model="formData.pensionAccountNumber" placeholder="请输入敬老费银行账号" />
</el-form-item>
<el-form-item label="敬老费开户行网点" prop="pensionBankBranch">
<el-input v-model="formData.pensionBankBranch" placeholder="请输入敬老费开户行网点" />
</el-form-item>
<el-form-item label="五险缴纳情况(未缴纳过、已缴纳过)" prop="insuranceStatus">
<el-radio-group v-model="formData.insuranceStatus">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_INSURANCE_STATUS)"
:key="dict.value"
:label="dict.value"
>
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="1寸白底照当未缴纳五险一金需要上传" prop="oneInchPhoto">
<el-input v-model="formData.oneInchPhoto" placeholder="请输入1寸白底照当未缴纳五险一金需要上传" />
</el-form-item>
<el-form-item label="离职证明扫描件" prop="resignationCertScan">
<el-input v-model="formData.resignationCertScan" placeholder="请输入离职证明扫描件" />
</el-form-item>
<el-form-item label="最高学历" prop="highestEducation">
<el-input v-model="formData.highestEducation" placeholder="请输入最高学历" />
</el-form-item>
<el-form-item label="学制类型(全日制、非全日制)" prop="educationSystemType">
<el-select v-model="formData.educationSystemType" placeholder="请选择学制类型(全日制、非全日制)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION_SYSTEM_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="学历扫描件" prop="educationCertificateScan">
<el-input v-model="formData.educationCertificateScan" placeholder="请输入学历扫描件" />
</el-form-item>
<el-form-item label="状态" prop="status">
<el-radio-group v-model="formData.status">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input v-model="formData.deptId" placeholder="请输入部门ID" />
</el-form-item>
</el-form>
<!-- 子表的表单 -->
<el-tabs v-model="subTabsName">
<el-tab-pane label="教育信息" name="userEducationInfo">
<UserEducationInfoForm ref="userEducationInfoFormRef" :user-id="formData.id" />
</el-tab-pane>
<el-tab-pane label="工作经历信息" name="userWorkInfo">
<UserWorkInfoForm ref="userWorkInfoFormRef" :user-id="formData.id" />
</el-tab-pane>
</el-tabs>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { UserApi, UserVO } from '@/api/hrm/user'
import UserEducationInfoForm from './components/UserEducationInfoForm.vue'
import UserWorkInfoForm from './components/UserWorkInfoForm.vue'
/** 员工档案信息 表单 */
defineOptions({ name: 'UserForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
acctId: undefined,
userNo: undefined,
realName: undefined,
phone: undefined,
email: undefined,
employmentDate: undefined,
regularizationDate: undefined,
postId: undefined,
postLevel: undefined,
gradeLevel: undefined,
employType: undefined,
trialStartDate: undefined,
trialEndDate: undefined,
probationPeriod: undefined,
contractStartDate: undefined,
contractEndDate: undefined,
contractTerm: undefined,
gender: undefined,
age: undefined,
resume: undefined,
workPhoto: undefined,
idCardFaceSide: undefined,
idCardNationalEmblemSide: undefined,
currentAddress: undefined,
idCardNumber: undefined,
birthDate: undefined,
issuingAuthority: undefined,
nation: undefined,
householdRegistrationScan: undefined,
householdType: undefined,
householdAddress: undefined,
politicalStatus: undefined,
maritalStatus: undefined,
relationship1: undefined,
contactName1: undefined,
contactPhone1: undefined,
relationship2: undefined,
contactName2: undefined,
contactPhone2: undefined,
bankBranch: undefined,
salaryCardNumber: undefined,
accountRelationship: undefined,
pensionCardHolder: undefined,
pensionAccountNumber: undefined,
pensionBankBranch: undefined,
insuranceStatus: undefined,
oneInchPhoto: undefined,
resignationCertScan: undefined,
highestEducation: undefined,
educationSystemType: undefined,
educationCertificateScan: undefined,
status: undefined,
deptId: undefined
})
const formRules = reactive({
userNo: [{ required: true, message: '员工编号不能为空', trigger: 'blur' }],
realName: [{ required: true, message: '员工姓名不能为空', trigger: 'blur' }],
phone: [{ required: true, message: '手机号不能为空', trigger: 'blur' }],
postId: [{ required: true, message: '岗位Id不能为空', trigger: 'blur' }],
employType: [{ required: true, message: '聘用形式(全职、见习、实习、劳务、联创、其他)不能为空', trigger: 'change' }],
gender: [{ required: true, message: '性别(男、女、其他)不能为空', trigger: 'change' }],
resume: [{ required: true, message: '简历附件不能为空', trigger: 'blur' }],
workPhoto: [{ required: true, message: '形象照不能为空', trigger: 'blur' }],
idCardFaceSide: [{ required: true, message: '身份证人像不能为空', trigger: 'blur' }],
idCardNationalEmblemSide: [{ required: true, message: '身份证国徽不能为空', trigger: 'blur' }],
currentAddress: [{ required: true, message: '现住址不能为空', trigger: 'blur' }],
idCardNumber: [{ required: true, message: '身份证号不能为空', trigger: 'blur' }],
householdRegistrationScan: [{ required: true, message: '户口扫描件不能为空', trigger: 'blur' }],
relationship1: [{ required: true, message: '关系1父母、夫妻、兄弟、姊妹、朋友、其他不能为空', trigger: 'change' }],
contactName1: [{ required: true, message: '联系人姓名1不能为空', trigger: 'blur' }],
contactPhone1: [{ required: true, message: '联系手机号1不能为空', trigger: 'blur' }],
bankBranch: [{ required: true, message: '工商银行开户支行不能为空', trigger: 'blur' }],
salaryCardNumber: [{ required: true, message: '工资卡卡号不能为空', trigger: 'blur' }],
accountRelationship: [{ required: true, message: '账户名与本人关系(父亲、母亲)不能为空', trigger: 'change' }],
pensionCardHolder: [{ required: true, message: '敬老费银行卡户名不能为空', trigger: 'blur' }],
pensionAccountNumber: [{ required: true, message: '敬老费银行账号不能为空', trigger: 'blur' }],
pensionBankBranch: [{ required: true, message: '敬老费开户行网点不能为空', trigger: 'blur' }],
insuranceStatus: [{ required: true, message: '五险缴纳情况(未缴纳过、已缴纳过)不能为空', trigger: 'blur' }],
oneInchPhoto: [{ required: true, message: '1寸白底照当未缴纳五险一金需要上传不能为空', trigger: 'blur' }],
educationSystemType: [{ required: true, message: '学制类型(全日制、非全日制)不能为空', trigger: 'change' }],
educationCertificateScan: [{ required: true, message: '学历扫描件不能为空', trigger: 'blur' }],
deptId: [{ required: true, message: '部门ID不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 子表的表单 */
const subTabsName = ref('userEducationInfo')
const userEducationInfoFormRef = ref()
const userWorkInfoFormRef = ref()
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await UserApi.getUser(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
try {
await userEducationInfoFormRef.value.validate()
} catch (e) {
subTabsName.value = 'userEducationInfo'
return
}
try {
await userWorkInfoFormRef.value.validate()
} catch (e) {
subTabsName.value = 'userWorkInfo'
return
}
//
formLoading.value = true
try {
const data = formData.value as unknown as UserVO
//
data.userEducationInfos = userEducationInfoFormRef.value.getData()
data.userWorkInfos = userWorkInfoFormRef.value.getData()
if (formType.value === 'create') {
await UserApi.createUser(data)
message.success(t('common.createSuccess'))
} else {
await UserApi.updateUser(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
acctId: undefined,
userNo: undefined,
realName: undefined,
phone: undefined,
email: undefined,
employmentDate: undefined,
regularizationDate: undefined,
postId: undefined,
postLevel: undefined,
gradeLevel: undefined,
employType: undefined,
trialStartDate: undefined,
trialEndDate: undefined,
probationPeriod: undefined,
contractStartDate: undefined,
contractEndDate: undefined,
contractTerm: undefined,
gender: undefined,
age: undefined,
resume: undefined,
workPhoto: undefined,
idCardFaceSide: undefined,
idCardNationalEmblemSide: undefined,
currentAddress: undefined,
idCardNumber: undefined,
birthDate: undefined,
issuingAuthority: undefined,
nation: undefined,
householdRegistrationScan: undefined,
householdType: undefined,
householdAddress: undefined,
politicalStatus: undefined,
maritalStatus: undefined,
relationship1: undefined,
contactName1: undefined,
contactPhone1: undefined,
relationship2: undefined,
contactName2: undefined,
contactPhone2: undefined,
bankBranch: undefined,
salaryCardNumber: undefined,
accountRelationship: undefined,
pensionCardHolder: undefined,
pensionAccountNumber: undefined,
pensionBankBranch: undefined,
insuranceStatus: undefined,
oneInchPhoto: undefined,
resignationCertScan: undefined,
highestEducation: undefined,
educationSystemType: undefined,
educationCertificateScan: undefined,
status: undefined,
deptId: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,136 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="学历" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.education`" :rules="formRules.education" class="mb-0px!">
<el-input v-model="row.education" placeholder="请输入学历" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="入学日期" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.beginDate`" :rules="formRules.beginDate" class="mb-0px!">
<el-date-picker
v-model="row.beginDate"
type="date"
value-format="x"
placeholder="选择入学日期"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="毕业日期" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.graduationDate`" :rules="formRules.graduationDate" class="mb-0px!">
<el-date-picker
v-model="row.graduationDate"
type="date"
value-format="x"
placeholder="选择毕业日期"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="学校名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.schoolName`" :rules="formRules.schoolName" class="mb-0px!">
<el-input v-model="row.schoolName" placeholder="请输入学校名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="专业名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.major`" :rules="formRules.major" class="mb-0px!">
<el-input v-model="row.major" placeholder="请输入专业名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加教育信息</el-button>
</el-row>
</template>
<script setup lang="ts">
import { UserApi } from '@/api/hrm/user'
const props = defineProps<{
userId: undefined // IDhrm_user_infor
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID关联hrm_user_infor不能为空', trigger: 'blur' }],
education: [{ required: true, message: '学历不能为空', trigger: 'blur' }],
beginDate: [{ required: true, message: '入学日期不能为空', trigger: 'blur' }],
graduationDate: [{ required: true, message: '毕业日期不能为空', trigger: 'blur' }],
schoolName: [{ required: true, message: '学校名称不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.userId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await UserApi.getUserEducationInfoListByUserId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
userId: undefined,
education: undefined,
beginDate: undefined,
graduationDate: undefined,
schoolName: undefined,
major: undefined
}
row.userId = props.userId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

View File

@ -0,0 +1,146 @@
<template>
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
v-loading="formLoading"
label-width="0px"
:inline-message="true"
>
<el-table :data="formData" class="-mt-10px">
<el-table-column label="序号" type="index" width="100" />
<el-table-column label="单位名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.companyName`" :rules="formRules.companyName" class="mb-0px!">
<el-input v-model="row.companyName" placeholder="请输入单位名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="部门名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.deptName`" :rules="formRules.deptName" class="mb-0px!">
<el-input v-model="row.deptName" placeholder="请输入部门名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="职位名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.postName`" :rules="formRules.postName" class="mb-0px!">
<el-input v-model="row.postName" placeholder="请输入职位名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="开始日期" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.startDate`" :rules="formRules.startDate" class="mb-0px!">
<el-date-picker
v-model="row.startDate"
type="date"
value-format="x"
placeholder="选择开始日期"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="离职日期" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.endDate`" :rules="formRules.endDate" class="mb-0px!">
<el-date-picker
v-model="row.endDate"
type="date"
value-format="x"
placeholder="选择离职日期"
/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="待遇(元/月)" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.monthlySalary`" :rules="formRules.monthlySalary" class="mb-0px!">
<el-input v-model="row.monthlySalary" placeholder="请输入待遇(元/月)" />
</el-form-item>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" label="操作" width="60">
<template #default="{ $index }">
<el-button @click="handleDelete($index)" link></el-button>
</template>
</el-table-column>
</el-table>
</el-form>
<el-row justify="center" class="mt-3">
<el-button @click="handleAdd" round>+ 添加工作经历信息</el-button>
</el-row>
</template>
<script setup lang="ts">
import { UserApi } from '@/api/hrm/user'
const props = defineProps<{
userId: undefined // IDhrm_user_infor
}>()
const formLoading = ref(false) //
const formData = ref([])
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID关联hrm_user_infor不能为空', trigger: 'blur' }],
companyName: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }],
deptName: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
postName: [{ required: true, message: '职位名称不能为空', trigger: 'blur' }],
startDate: [{ required: true, message: '开始日期不能为空', trigger: 'blur' }],
endDate: [{ required: true, message: '离职日期不能为空', trigger: 'blur' }],
monthlySalary: [{ required: true, message: '待遇(元/月)不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 监听主表的关联字段的变化,加载对应的子表数据 */
watch(
() => props.userId,
async (val) => {
// 1.
formData.value = []
// 2. val
if (!val) {
return;
}
try {
formLoading.value = true
formData.value = await UserApi.getUserWorkInfoListByUserId(val)
} finally {
formLoading.value = false
}
},
{ immediate: true }
)
/** 新增按钮操作 */
const handleAdd = () => {
const row = {
id: undefined,
userId: undefined,
companyName: undefined,
deptName: undefined,
postName: undefined,
startDate: undefined,
endDate: undefined,
monthlySalary: undefined
}
row.userId = props.userId
formData.value.push(row)
}
/** 删除按钮操作 */
const handleDelete = (index) => {
formData.value.splice(index, 1)
}
/** 表单校验 */
const validate = () => {
return formRef.value.validate()
}
/** 表单值 */
const getData = () => {
return formData.value
}
defineExpose({ validate, getData })
</script>

View File

@ -0,0 +1,905 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="用户登录账号IDsys_user表" prop="acctId">
<el-input
v-model="queryParams.acctId"
placeholder="请输入用户登录账号IDsys_user表"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="员工编号" prop="userNo">
<el-input
v-model="queryParams.userNo"
placeholder="请输入员工编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="员工姓名" prop="realName">
<el-input
v-model="queryParams.realName"
placeholder="请输入员工姓名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="手机号" prop="phone">
<el-input
v-model="queryParams.phone"
placeholder="请输入手机号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input
v-model="queryParams.email"
placeholder="请输入邮箱"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="入职日期" prop="employmentDate">
<el-date-picker
v-model="queryParams.employmentDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="转正日期" prop="regularizationDate">
<el-date-picker
v-model="queryParams.regularizationDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="岗位Id" prop="postId">
<el-input
v-model="queryParams.postId"
placeholder="请输入岗位Id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="职级" prop="postLevel">
<el-select
v-model="queryParams.postLevel"
placeholder="请选择职级"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_POST_RANK)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="档级" prop="gradeLevel">
<el-select
v-model="queryParams.gradeLevel"
placeholder="请选择档级"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_GRADE_LEVEL)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="聘用形式(全职、见习、实习、劳务、联创、其他)" prop="employType">
<el-select
v-model="queryParams.employType"
placeholder="请选择聘用形式(全职、见习、实习、劳务、联创、其他)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="试用开始日期" prop="trialStartDate">
<el-date-picker
v-model="queryParams.trialStartDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="试用结束日期" prop="trialEndDate">
<el-date-picker
v-model="queryParams.trialEndDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="试用期限(月)" prop="probationPeriod">
<el-input
v-model="queryParams.probationPeriod"
placeholder="请输入试用期限(月)"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="合同开始日期" prop="contractStartDate">
<el-date-picker
v-model="queryParams.contractStartDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="合同结束日期" prop="contractEndDate">
<el-date-picker
v-model="queryParams.contractEndDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="合同期限(年)" prop="contractTerm">
<el-input
v-model="queryParams.contractTerm"
placeholder="请输入合同期限(年)"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="性别(男、女、其他)" prop="gender">
<el-select
v-model="queryParams.gender"
placeholder="请选择性别(男、女、其他)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="年龄" prop="age">
<el-input
v-model="queryParams.age"
placeholder="请输入年龄"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="简历附件" prop="resume">
<el-input
v-model="queryParams.resume"
placeholder="请输入简历附件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="形象照" prop="workPhoto">
<el-input
v-model="queryParams.workPhoto"
placeholder="请输入形象照"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="身份证人像" prop="idCardFaceSide">
<el-input
v-model="queryParams.idCardFaceSide"
placeholder="请输入身份证人像"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="身份证国徽" prop="idCardNationalEmblemSide">
<el-input
v-model="queryParams.idCardNationalEmblemSide"
placeholder="请输入身份证国徽"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="现住址" prop="currentAddress">
<el-input
v-model="queryParams.currentAddress"
placeholder="请输入现住址"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="身份证号" prop="idCardNumber">
<el-input
v-model="queryParams.idCardNumber"
placeholder="请输入身份证号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="出生日期" prop="birthDate">
<el-date-picker
v-model="queryParams.birthDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="发证机关" prop="issuingAuthority">
<el-input
v-model="queryParams.issuingAuthority"
placeholder="请输入发证机关"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="民族56个民族" prop="nation">
<el-select
v-model="queryParams.nation"
placeholder="请选择民族56个民族"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_NATION)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="户口扫描件" prop="householdRegistrationScan">
<el-input
v-model="queryParams.householdRegistrationScan"
placeholder="请输入户口扫描件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="户籍类型(农村、城镇)" prop="householdType">
<el-select
v-model="queryParams.householdType"
placeholder="请选择户籍类型(农村、城镇)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_HOUSEHOLD_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="户籍地" prop="householdAddress">
<el-input
v-model="queryParams.householdAddress"
placeholder="请输入户籍地"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="政治面貌(共青团员、中共预备党员、中共党员、群众、其他)" prop="politicalStatus">
<el-select
v-model="queryParams.politicalStatus"
placeholder="请选择政治面貌(共青团员、中共预备党员、中共党员、群众、其他)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_POLITICAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="婚姻状况(未婚、已婚未育、已婚已育)" prop="maritalStatus">
<el-select
v-model="queryParams.maritalStatus"
placeholder="请选择婚姻状况(未婚、已婚未育、已婚已育)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MARITAL_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="关系1父母、夫妻、兄弟、姊妹、朋友、其他" prop="relationship1">
<el-select
v-model="queryParams.relationship1"
placeholder="请选择关系1父母、夫妻、兄弟、姊妹、朋友、其他"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELATIONSHIP)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="联系人姓名1" prop="contactName1">
<el-input
v-model="queryParams.contactName1"
placeholder="请输入联系人姓名1"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="联系手机号1" prop="contactPhone1">
<el-input
v-model="queryParams.contactPhone1"
placeholder="请输入联系手机号1"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="关系2父母、夫妻、兄弟、姊妹、朋友、其他" prop="relationship2">
<el-select
v-model="queryParams.relationship2"
placeholder="请选择关系2父母、夫妻、兄弟、姊妹、朋友、其他"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELATIONSHIP)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="联系人姓名2" prop="contactName2">
<el-input
v-model="queryParams.contactName2"
placeholder="请输入联系人姓名2"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="联系手机号2" prop="contactPhone2">
<el-input
v-model="queryParams.contactPhone2"
placeholder="请输入联系手机号2"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工商银行开户支行" prop="bankBranch">
<el-input
v-model="queryParams.bankBranch"
placeholder="请输入工商银行开户支行"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工资卡卡号" prop="salaryCardNumber">
<el-input
v-model="queryParams.salaryCardNumber"
placeholder="请输入工资卡卡号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="账户名与本人关系(父亲、母亲)" prop="accountRelationship">
<el-select
v-model="queryParams.accountRelationship"
placeholder="请选择账户名与本人关系(父亲、母亲)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_RELATIONSHIP)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="敬老费银行卡户名" prop="pensionCardHolder">
<el-input
v-model="queryParams.pensionCardHolder"
placeholder="请输入敬老费银行卡户名"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="敬老费银行账号" prop="pensionAccountNumber">
<el-input
v-model="queryParams.pensionAccountNumber"
placeholder="请输入敬老费银行账号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="敬老费开户行网点" prop="pensionBankBranch">
<el-input
v-model="queryParams.pensionBankBranch"
placeholder="请输入敬老费开户行网点"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="五险缴纳情况(未缴纳过、已缴纳过)" prop="insuranceStatus">
<el-select
v-model="queryParams.insuranceStatus"
placeholder="请选择五险缴纳情况(未缴纳过、已缴纳过)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_INSURANCE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="1寸白底照当未缴纳五险一金需要上传" prop="oneInchPhoto">
<el-input
v-model="queryParams.oneInchPhoto"
placeholder="请输入1寸白底照当未缴纳五险一金需要上传"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="离职证明扫描件" prop="resignationCertScan">
<el-input
v-model="queryParams.resignationCertScan"
placeholder="请输入离职证明扫描件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="最高学历" prop="highestEducation">
<el-input
v-model="queryParams.highestEducation"
placeholder="请输入最高学历"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="学制类型(全日制、非全日制)" prop="educationSystemType">
<el-select
v-model="queryParams.educationSystemType"
placeholder="请选择学制类型(全日制、非全日制)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EDUCATION_SYSTEM_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="学历扫描件" prop="educationCertificateScan">
<el-input
v-model="queryParams.educationCertificateScan"
placeholder="请输入学历扫描件"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="部门ID" prop="deptId">
<el-input
v-model="queryParams.deptId"
placeholder="请输入部门ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:user:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:user:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="唯一主键" align="center" prop="id" />
<el-table-column label="用户登录账号IDsys_user表" align="center" prop="acctId" />
<el-table-column label="员工编号" align="center" prop="userNo" />
<el-table-column label="员工姓名" align="center" prop="realName" />
<el-table-column label="手机号" align="center" prop="phone" />
<el-table-column label="邮箱" align="center" prop="email" />
<el-table-column label="入职日期" align="center" prop="employmentDate" />
<el-table-column label="转正日期" align="center" prop="regularizationDate" />
<el-table-column label="岗位Id" align="center" prop="postId" />
<el-table-column label="职级" align="center" prop="postLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_POST_RANK" :value="scope.row.postLevel" />
</template>
</el-table-column>
<el-table-column label="档级" align="center" prop="gradeLevel">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_GRADE_LEVEL" :value="scope.row.gradeLevel" />
</template>
</el-table-column>
<el-table-column label="聘用形式(全职、见习、实习、劳务、联创、其他)" align="center" prop="employType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EMPLOY_TYPE" :value="scope.row.employType" />
</template>
</el-table-column>
<el-table-column label="试用开始日期" align="center" prop="trialStartDate" />
<el-table-column label="试用结束日期" align="center" prop="trialEndDate" />
<el-table-column label="试用期限(月)" align="center" prop="probationPeriod" />
<el-table-column label="合同开始日期" align="center" prop="contractStartDate" />
<el-table-column label="合同结束日期" align="center" prop="contractEndDate" />
<el-table-column label="合同期限(年)" align="center" prop="contractTerm" />
<el-table-column label="性别(男、女、其他)" align="center" prop="gender">
<template #default="scope">
<dict-tag :type="DICT_TYPE.SYSTEM_USER_SEX" :value="scope.row.gender" />
</template>
</el-table-column>
<el-table-column label="年龄" align="center" prop="age" />
<el-table-column label="简历附件" align="center" prop="resume" />
<el-table-column label="形象照" align="center" prop="workPhoto" />
<el-table-column label="身份证人像" align="center" prop="idCardFaceSide" />
<el-table-column label="身份证国徽" align="center" prop="idCardNationalEmblemSide" />
<el-table-column label="现住址" align="center" prop="currentAddress" />
<el-table-column label="身份证号" align="center" prop="idCardNumber" />
<el-table-column label="出生日期" align="center" prop="birthDate" />
<el-table-column label="发证机关" align="center" prop="issuingAuthority" />
<el-table-column label="民族56个民族" align="center" prop="nation">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_NATION" :value="scope.row.nation" />
</template>
</el-table-column>
<el-table-column label="户口扫描件" align="center" prop="householdRegistrationScan" />
<el-table-column label="户籍类型(农村、城镇)" align="center" prop="householdType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_HOUSEHOLD_TYPE" :value="scope.row.householdType" />
</template>
</el-table-column>
<el-table-column label="户籍地" align="center" prop="householdAddress" />
<el-table-column label="政治面貌(共青团员、中共预备党员、中共党员、群众、其他)" align="center" prop="politicalStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_POLITICAL_STATUS" :value="scope.row.politicalStatus" />
</template>
</el-table-column>
<el-table-column label="婚姻状况(未婚、已婚未育、已婚已育)" align="center" prop="maritalStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_MARITAL_STATUS" :value="scope.row.maritalStatus" />
</template>
</el-table-column>
<el-table-column label="关系1父母、夫妻、兄弟、姊妹、朋友、其他" align="center" prop="relationship1">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_RELATIONSHIP" :value="scope.row.relationship1" />
</template>
</el-table-column>
<el-table-column label="联系人姓名1" align="center" prop="contactName1" />
<el-table-column label="联系手机号1" align="center" prop="contactPhone1" />
<el-table-column label="关系2父母、夫妻、兄弟、姊妹、朋友、其他" align="center" prop="relationship2">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_RELATIONSHIP" :value="scope.row.relationship2" />
</template>
</el-table-column>
<el-table-column label="联系人姓名2" align="center" prop="contactName2" />
<el-table-column label="联系手机号2" align="center" prop="contactPhone2" />
<el-table-column label="工商银行开户支行" align="center" prop="bankBranch" />
<el-table-column label="工资卡卡号" align="center" prop="salaryCardNumber" />
<el-table-column label="账户名与本人关系(父亲、母亲)" align="center" prop="accountRelationship">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_RELATIONSHIP" :value="scope.row.accountRelationship" />
</template>
</el-table-column>
<el-table-column label="敬老费银行卡户名" align="center" prop="pensionCardHolder" />
<el-table-column label="敬老费银行账号" align="center" prop="pensionAccountNumber" />
<el-table-column label="敬老费开户行网点" align="center" prop="pensionBankBranch" />
<el-table-column label="五险缴纳情况(未缴纳过、已缴纳过)" align="center" prop="insuranceStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_INSURANCE_STATUS" :value="scope.row.insuranceStatus" />
</template>
</el-table-column>
<el-table-column label="1寸白底照当未缴纳五险一金需要上传" align="center" prop="oneInchPhoto" />
<el-table-column label="离职证明扫描件" align="center" prop="resignationCertScan" />
<el-table-column label="最高学历" align="center" prop="highestEducation" />
<el-table-column label="学制类型(全日制、非全日制)" align="center" prop="educationSystemType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EDUCATION_SYSTEM_TYPE" :value="scope.row.educationSystemType" />
</template>
</el-table-column>
<el-table-column label="学历扫描件" align="center" prop="educationCertificateScan" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="部门ID" align="center" prop="deptId" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:user:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:user:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<UserForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { UserApi, UserVO } from '@/api/hrm/user'
import UserForm from './UserForm.vue'
/** 员工档案信息 列表 */
defineOptions({ name: 'User' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<UserVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
acctId: undefined,
userNo: undefined,
realName: undefined,
phone: undefined,
email: undefined,
employmentDate: [],
regularizationDate: [],
postId: undefined,
postLevel: undefined,
gradeLevel: undefined,
employType: undefined,
trialStartDate: [],
trialEndDate: [],
probationPeriod: undefined,
contractStartDate: [],
contractEndDate: [],
contractTerm: undefined,
gender: undefined,
age: undefined,
resume: undefined,
workPhoto: undefined,
idCardFaceSide: undefined,
idCardNationalEmblemSide: undefined,
currentAddress: undefined,
idCardNumber: undefined,
birthDate: [],
issuingAuthority: undefined,
nation: undefined,
householdRegistrationScan: undefined,
householdType: undefined,
householdAddress: undefined,
politicalStatus: undefined,
maritalStatus: undefined,
relationship1: undefined,
contactName1: undefined,
contactPhone1: undefined,
relationship2: undefined,
contactName2: undefined,
contactPhone2: undefined,
bankBranch: undefined,
salaryCardNumber: undefined,
accountRelationship: undefined,
pensionCardHolder: undefined,
pensionAccountNumber: undefined,
pensionBankBranch: undefined,
insuranceStatus: undefined,
oneInchPhoto: undefined,
resignationCertScan: undefined,
highestEducation: undefined,
educationSystemType: undefined,
educationCertificateScan: undefined,
status: undefined,
deptId: undefined,
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await UserApi.getUserPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await UserApi.deleteUser(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await UserApi.exportUser(queryParams)
download.excel(data, '员工档案信息.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,131 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工档案ID关联hrm_user_infor" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工档案ID关联hrm_user_infor" />
</el-form-item>
<el-form-item label="学历" prop="education">
<el-input v-model="formData.education" placeholder="请输入学历" />
</el-form-item>
<el-form-item label="入学日期" prop="beginDate">
<el-date-picker
v-model="formData.beginDate"
type="date"
value-format="x"
placeholder="选择入学日期"
/>
</el-form-item>
<el-form-item label="毕业日期" prop="graduationDate">
<el-date-picker
v-model="formData.graduationDate"
type="date"
value-format="x"
placeholder="选择毕业日期"
/>
</el-form-item>
<el-form-item label="学校名称" prop="schoolName">
<el-input v-model="formData.schoolName" placeholder="请输入学校名称" />
</el-form-item>
<el-form-item label="专业名称" prop="major">
<el-input v-model="formData.major" placeholder="请输入专业名称" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { UserEducationInfoApi, UserEducationInfoVO } from '@/api/hrm/usereducationinfo'
/** 教育信息 表单 */
defineOptions({ name: 'UserEducationInfoForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
education: undefined,
beginDate: undefined,
graduationDate: undefined,
schoolName: undefined,
major: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID关联hrm_user_infor不能为空', trigger: 'blur' }],
education: [{ required: true, message: '学历不能为空', trigger: 'blur' }],
beginDate: [{ required: true, message: '入学日期不能为空', trigger: 'blur' }],
graduationDate: [{ required: true, message: '毕业日期不能为空', trigger: 'blur' }],
schoolName: [{ required: true, message: '学校名称不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await UserEducationInfoApi.getUserEducationInfo(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as UserEducationInfoVO
if (formType.value === 'create') {
await UserEducationInfoApi.createUserEducationInfo(data)
message.success(t('common.createSuccess'))
} else {
await UserEducationInfoApi.updateUserEducationInfo(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
education: undefined,
beginDate: undefined,
graduationDate: undefined,
schoolName: undefined,
major: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,226 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工档案ID关联hrm_user_infor" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工档案ID关联hrm_user_infor"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="学历" prop="education">
<el-input
v-model="queryParams.education"
placeholder="请输入学历"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="入学日期" prop="beginDate">
<el-date-picker
v-model="queryParams.beginDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="毕业日期" prop="graduationDate">
<el-date-picker
v-model="queryParams.graduationDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="学校名称" prop="schoolName">
<el-input
v-model="queryParams.schoolName"
placeholder="请输入学校名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="专业名称" prop="major">
<el-input
v-model="queryParams.major"
placeholder="请输入专业名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:user-education-info:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:user-education-info:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="唯一主键" align="center" prop="id" />
<el-table-column label="员工档案ID关联hrm_user_infor" align="center" prop="userId" />
<el-table-column label="学历" align="center" prop="education" />
<el-table-column label="入学日期" align="center" prop="beginDate" />
<el-table-column label="毕业日期" align="center" prop="graduationDate" />
<el-table-column label="学校名称" align="center" prop="schoolName" />
<el-table-column label="专业名称" align="center" prop="major" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:user-education-info:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:user-education-info:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<UserEducationInfoForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import download from '@/utils/download'
import { UserEducationInfoApi, UserEducationInfoVO } from '@/api/hrm/usereducationinfo'
import UserEducationInfoForm from './UserEducationInfoForm.vue'
/** 教育信息 列表 */
defineOptions({ name: 'UserEducationInfo' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<UserEducationInfoVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
education: undefined,
beginDate: [],
graduationDate: [],
schoolName: undefined,
major: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await UserEducationInfoApi.getUserEducationInfoPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await UserEducationInfoApi.deleteUserEducationInfo(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await UserEducationInfoApi.exportUserEducationInfo(queryParams)
download.excel(data, '教育信息.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,177 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工ID" />
</el-form-item>
<el-form-item label="消息类型,如系统通知、提醒、关怀等" prop="messageType">
<el-select v-model="formData.messageType" placeholder="请选择消息类型,如系统通知、提醒、关怀等">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MESSAGE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="消息关怀类型,如生日、节日等" prop="careType">
<el-select v-model="formData.careType" placeholder="请选择消息关怀类型,如生日、节日等">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_CARA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知主题" prop="title">
<el-input v-model="formData.title" placeholder="请输入通知主题" />
</el-form-item>
<el-form-item label="通知内容" prop="content">
<Editor v-model="formData.content" height="150px" />
</el-form-item>
<el-form-item label="通知方式,如邮件、短信、系统通知" prop="noticeMethod">
<el-select v-model="formData.noticeMethod" placeholder="请选择通知方式,如邮件、短信、系统通知">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_NOTICE_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知时间" prop="noticeTime">
<el-date-picker
v-model="formData.noticeTime"
type="date"
value-format="x"
placeholder="选择通知时间"
/>
</el-form-item>
<el-form-item label="消息状态0=未读1=已读" prop="messageStatus">
<el-select v-model="formData.messageStatus" placeholder="请选择消息状态0=未读1=已读">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MESSAGE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="已读时间" prop="readTime">
<el-date-picker
v-model="formData.readTime"
type="date"
value-format="x"
placeholder="选择已读时间"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { UserMessageApi, UserMessageVO } from '@/api/hrm/usermessage'
/** 员工消息 表单 */
defineOptions({ name: 'UserMessageForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
messageType: undefined,
careType: undefined,
title: undefined,
content: undefined,
noticeMethod: undefined,
noticeTime: undefined,
messageStatus: undefined,
readTime: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工ID不能为空', trigger: 'blur' }],
messageType: [{ required: true, message: '消息类型,如系统通知、提醒、关怀等不能为空', trigger: 'change' }],
title: [{ required: true, message: '通知主题不能为空', trigger: 'blur' }],
content: [{ required: true, message: '通知内容不能为空', trigger: 'blur' }],
noticeMethod: [{ required: true, message: '通知方式,如邮件、短信、系统通知不能为空', trigger: 'change' }],
noticeTime: [{ required: true, message: '通知时间不能为空', trigger: 'blur' }],
messageStatus: [{ required: true, message: '消息状态0=未读1=已读不能为空', trigger: 'change' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await UserMessageApi.getUserMessage(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as UserMessageVO
if (formType.value === 'create') {
await UserMessageApi.createUserMessage(data)
message.success(t('common.createSuccess'))
} else {
await UserMessageApi.updateUserMessage(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
messageType: undefined,
careType: undefined,
title: undefined,
content: undefined,
noticeMethod: undefined,
noticeTime: undefined,
messageStatus: undefined,
readTime: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,323 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="消息类型,如系统通知、提醒、关怀等" prop="messageType">
<el-select
v-model="queryParams.messageType"
placeholder="请选择消息类型,如系统通知、提醒、关怀等"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MESSAGE_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="消息关怀类型,如生日、节日等" prop="careType">
<el-select
v-model="queryParams.careType"
placeholder="请选择消息关怀类型,如生日、节日等"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_CARA_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知主题" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入通知主题"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="通知方式,如邮件、短信、系统通知" prop="noticeMethod">
<el-select
v-model="queryParams.noticeMethod"
placeholder="请选择通知方式,如邮件、短信、系统通知"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_NOTICE_METHOD)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="通知时间" prop="noticeTime">
<el-date-picker
v-model="queryParams.noticeTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="消息状态0=未读1=已读" prop="messageStatus">
<el-select
v-model="queryParams.messageStatus"
placeholder="请选择消息状态0=未读1=已读"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_MESSAGE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="已读时间" prop="readTime">
<el-date-picker
v-model="queryParams.readTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:user-message:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:user-message:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键 ID" align="center" prop="id" />
<el-table-column label="员工ID" align="center" prop="userId" />
<el-table-column label="消息类型,如系统通知、提醒、关怀等" align="center" prop="messageType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_MESSAGE_TYPE" :value="scope.row.messageType" />
</template>
</el-table-column>
<el-table-column label="消息关怀类型,如生日、节日等" align="center" prop="careType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_CARA_TYPE" :value="scope.row.careType" />
</template>
</el-table-column>
<el-table-column label="通知主题" align="center" prop="title" />
<el-table-column label="通知内容" align="center" prop="content" />
<el-table-column label="通知方式,如邮件、短信、系统通知" align="center" prop="noticeMethod">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_NOTICE_METHOD" :value="scope.row.noticeMethod" />
</template>
</el-table-column>
<el-table-column
label="通知时间"
align="center"
prop="noticeTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="消息状态0=未读1=已读" align="center" prop="messageStatus">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_MESSAGE_STATUS" :value="scope.row.messageStatus" />
</template>
</el-table-column>
<el-table-column
label="已读时间"
align="center"
prop="readTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:user-message:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:user-message:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<UserMessageForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { UserMessageApi, UserMessageVO } from '@/api/hrm/usermessage'
import UserMessageForm from './UserMessageForm.vue'
/** 员工消息 列表 */
defineOptions({ name: 'UserMessage' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<UserMessageVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
messageType: undefined,
careType: undefined,
title: undefined,
content: undefined,
noticeMethod: undefined,
noticeTime: [],
messageStatus: undefined,
readTime: [],
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await UserMessageApi.getUserMessagePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await UserMessageApi.deleteUserMessage(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await UserMessageApi.exportUserMessage(queryParams)
download.excel(data, '员工消息.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,140 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="人才库id" prop="talentId">
<el-input v-model="formData.talentId" placeholder="请输入人才库id" />
</el-form-item>
<el-form-item label="员工ID" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工ID" />
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input v-model="formData.processInstanceId" placeholder="请输入工作流编号" />
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-radio-group v-model="formData.auditStatus">
<el-radio value="1">请选择字典生成</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="聘用形式(全职、见习、实习、劳务、劳动、联创、其他)" prop="employType">
<el-select v-model="formData.employType" placeholder="请选择聘用形式(全职、见习、实习、劳务、劳动、联创、其他)">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="员工签字" prop="eSignature">
<el-input v-model="formData.eSignature" placeholder="请输入员工签字" />
</el-form-item>
<el-form-item label="提交日期" prop="submissionDate">
<el-date-picker
v-model="formData.submissionDate"
type="date"
value-format="x"
placeholder="选择提交日期"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { UserOnboardingApi, UserOnboardingVO } from '@/api/hrm/useronboarding'
/** 入职申请 表单 */
defineOptions({ name: 'UserOnboardingForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
talentId: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
employType: undefined,
eSignature: undefined,
submissionDate: undefined
})
const formRules = reactive({
talentId: [{ required: true, message: '人才库id不能为空', trigger: 'blur' }],
userId: [{ required: true, message: '员工ID不能为空', trigger: 'blur' }],
auditStatus: [{ required: true, message: '审批状态不能为空', trigger: 'blur' }],
submissionDate: [{ required: true, message: '提交日期不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await UserOnboardingApi.getUserOnboarding(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as UserOnboardingVO
if (formType.value === 'create') {
await UserOnboardingApi.createUserOnboarding(data)
message.success(t('common.createSuccess'))
} else {
await UserOnboardingApi.updateUserOnboarding(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
talentId: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
employType: undefined,
eSignature: undefined,
submissionDate: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,267 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="人才库id" prop="talentId">
<el-input
v-model="queryParams.talentId"
placeholder="请输入人才库id"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="员工ID" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工ID"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="工作流编号" prop="processInstanceId">
<el-input
v-model="queryParams.processInstanceId"
placeholder="请输入工作流编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="审批状态" prop="auditStatus">
<el-select
v-model="queryParams.auditStatus"
placeholder="请选择审批状态"
clearable
class="!w-240px"
>
<el-option label="请选择字典生成" value="" />
</el-select>
</el-form-item>
<el-form-item label="聘用形式(全职、见习、实习、劳务、劳动、联创、其他)" prop="employType">
<el-select
v-model="queryParams.employType"
placeholder="请选择聘用形式(全职、见习、实习、劳务、劳动、联创、其他)"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HRM_EMPLOY_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="员工签字" prop="eSignature">
<el-input
v-model="queryParams.eSignature"
placeholder="请输入员工签字"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="提交日期" prop="submissionDate">
<el-date-picker
v-model="queryParams.submissionDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
v-model="queryParams.createTime"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:user-onboarding:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:user-onboarding:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="主键,自动递增" align="center" prop="id" />
<el-table-column label="人才库id" align="center" prop="talentId" />
<el-table-column label="员工ID" align="center" prop="userId" />
<el-table-column label="工作流编号" align="center" prop="processInstanceId" />
<el-table-column label="审批状态" align="center" prop="auditStatus" />
<el-table-column label="聘用形式(全职、见习、实习、劳务、劳动、联创、其他)" align="center" prop="employType">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HRM_EMPLOY_TYPE" :value="scope.row.employType" />
</template>
</el-table-column>
<el-table-column label="员工签字" align="center" prop="eSignature" />
<el-table-column label="提交日期" align="center" prop="submissionDate" />
<el-table-column
label="创建时间"
align="center"
prop="createTime"
:formatter="dateFormatter"
width="180px"
/>
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:user-onboarding:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:user-onboarding:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<UserOnboardingForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter } from '@/utils/formatTime'
import download from '@/utils/download'
import { UserOnboardingApi, UserOnboardingVO } from '@/api/hrm/useronboarding'
import UserOnboardingForm from './UserOnboardingForm.vue'
/** 入职申请 列表 */
defineOptions({ name: 'UserOnboarding' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<UserOnboardingVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
talentId: undefined,
userId: undefined,
processInstanceId: undefined,
auditStatus: undefined,
employType: undefined,
eSignature: undefined,
submissionDate: [],
createTime: []
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await UserOnboardingApi.getUserOnboardingPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await UserOnboardingApi.deleteUserOnboarding(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await UserOnboardingApi.exportUserOnboarding(queryParams)
download.excel(data, '入职申请.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -0,0 +1,138 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="员工档案ID关联hrm_user_infor" prop="userId">
<el-input v-model="formData.userId" placeholder="请输入员工档案ID关联hrm_user_infor" />
</el-form-item>
<el-form-item label="单位名称" prop="companyName">
<el-input v-model="formData.companyName" placeholder="请输入单位名称" />
</el-form-item>
<el-form-item label="部门名称" prop="deptName">
<el-input v-model="formData.deptName" placeholder="请输入部门名称" />
</el-form-item>
<el-form-item label="职位名称" prop="postName">
<el-input v-model="formData.postName" placeholder="请输入职位名称" />
</el-form-item>
<el-form-item label="开始日期" prop="startDate">
<el-date-picker
v-model="formData.startDate"
type="date"
value-format="x"
placeholder="选择开始日期"
/>
</el-form-item>
<el-form-item label="离职日期" prop="endDate">
<el-date-picker
v-model="formData.endDate"
type="date"
value-format="x"
placeholder="选择离职日期"
/>
</el-form-item>
<el-form-item label="待遇(元/月)" prop="monthlySalary">
<el-input v-model="formData.monthlySalary" placeholder="请输入待遇(元/月)" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { UserWorkInfoApi, UserWorkInfoVO } from '@/api/hrm/userworkinfo'
/** 工作经历信息 表单 */
defineOptions({ name: 'UserWorkInfoForm' })
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
userId: undefined,
companyName: undefined,
deptName: undefined,
postName: undefined,
startDate: undefined,
endDate: undefined,
monthlySalary: undefined
})
const formRules = reactive({
userId: [{ required: true, message: '员工档案ID关联hrm_user_infor不能为空', trigger: 'blur' }],
companyName: [{ required: true, message: '单位名称不能为空', trigger: 'blur' }],
deptName: [{ required: true, message: '部门名称不能为空', trigger: 'blur' }],
postName: [{ required: true, message: '职位名称不能为空', trigger: 'blur' }],
startDate: [{ required: true, message: '开始日期不能为空', trigger: 'blur' }],
endDate: [{ required: true, message: '离职日期不能为空', trigger: 'blur' }],
monthlySalary: [{ required: true, message: '待遇(元/月)不能为空', trigger: 'blur' }]
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (type: string, id?: number) => {
dialogVisible.value = true
dialogTitle.value = t('action.' + type)
formType.value = type
resetForm()
//
if (id) {
formLoading.value = true
try {
formData.value = await UserWorkInfoApi.getUserWorkInfo(id)
} finally {
formLoading.value = false
}
}
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
const data = formData.value as unknown as UserWorkInfoVO
if (formType.value === 'create') {
await UserWorkInfoApi.createUserWorkInfo(data)
message.success(t('common.createSuccess'))
} else {
await UserWorkInfoApi.updateUserWorkInfo(data)
message.success(t('common.updateSuccess'))
}
dialogVisible.value = false
//
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
userId: undefined,
companyName: undefined,
deptName: undefined,
postName: undefined,
startDate: undefined,
endDate: undefined,
monthlySalary: undefined
}
formRef.value?.resetFields()
}
</script>

View File

@ -0,0 +1,237 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="员工档案ID关联hrm_user_infor" prop="userId">
<el-input
v-model="queryParams.userId"
placeholder="请输入员工档案ID关联hrm_user_infor"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="单位名称" prop="companyName">
<el-input
v-model="queryParams.companyName"
placeholder="请输入单位名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="部门名称" prop="deptName">
<el-input
v-model="queryParams.deptName"
placeholder="请输入部门名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="职位名称" prop="postName">
<el-input
v-model="queryParams.postName"
placeholder="请输入职位名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="开始日期" prop="startDate">
<el-date-picker
v-model="queryParams.startDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="离职日期" prop="endDate">
<el-date-picker
v-model="queryParams.endDate"
value-format="YYYY-MM-DD HH:mm:ss"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
:default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
class="!w-220px"
/>
</el-form-item>
<el-form-item label="待遇(元/月)" prop="monthlySalary">
<el-input
v-model="queryParams.monthlySalary"
placeholder="请输入待遇(元/月)"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<el-button
type="primary"
plain
@click="openForm('create')"
v-hasPermi="['hrm:user-work-info:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['hrm:user-work-info:export']"
>
<Icon icon="ep:download" class="mr-5px" /> 导出
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="唯一主键" align="center" prop="id" />
<el-table-column label="员工档案ID关联hrm_user_infor" align="center" prop="userId" />
<el-table-column label="单位名称" align="center" prop="companyName" />
<el-table-column label="部门名称" align="center" prop="deptName" />
<el-table-column label="职位名称" align="center" prop="postName" />
<el-table-column label="开始日期" align="center" prop="startDate" />
<el-table-column label="离职日期" align="center" prop="endDate" />
<el-table-column label="待遇(元/月)" align="center" prop="monthlySalary" />
<el-table-column label="操作" align="center" min-width="120px">
<template #default="scope">
<el-button
link
type="primary"
@click="openForm('update', scope.row.id)"
v-hasPermi="['hrm:user-work-info:update']"
>
编辑
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id)"
v-hasPermi="['hrm:user-work-info:delete']"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
<!-- 表单弹窗添加/修改 -->
<UserWorkInfoForm ref="formRef" @success="getList" />
</template>
<script setup lang="ts">
import download from '@/utils/download'
import { UserWorkInfoApi, UserWorkInfoVO } from '@/api/hrm/userworkinfo'
import UserWorkInfoForm from './UserWorkInfoForm.vue'
/** 工作经历信息 列表 */
defineOptions({ name: 'UserWorkInfo' })
const message = useMessage() //
const { t } = useI18n() //
const loading = ref(true) //
const list = ref<UserWorkInfoVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
userId: undefined,
companyName: undefined,
deptName: undefined,
postName: undefined,
startDate: [],
endDate: [],
monthlySalary: undefined
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await UserWorkInfoApi.getUserWorkInfoPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await UserWorkInfoApi.deleteUserWorkInfo(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await UserWorkInfoApi.exportUserWorkInfo(queryParams)
download.excel(data, '工作经历信息.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>