feat(我的绩效): 开发我的绩效功能。

fix(加班申请、工作报告): 重构加班申请在审批时的样式,工作报告在新增时的对话框、报告详情页的样式。
This commit is contained in:
dk
2026-06-21 18:22:44 +08:00
parent cd64cf42cc
commit 9a5845708d
35 changed files with 4211 additions and 924 deletions

231
src/typings/api/performance.d.ts vendored Normal file
View File

@@ -0,0 +1,231 @@
declare namespace Api {
namespace Performance {
namespace Common {
interface PageParams {
pageNo: number;
pageSize: number;
}
interface PageResult<T> {
total: number;
list: T[];
}
type SheetStatusCode = 'draft' | 'sent' | 'confirmed' | 'rejected' | string;
type SheetActionCode = 'send' | 'resend' | 'confirm' | 'reject' | string;
type RemindType = 'pending_confirm' | 'pending_send';
}
namespace Template {
interface ScoreCellMapping {
actualScoreTotalCell?: string | null;
baseScoreTotalCell?: string | null;
extraScoreTotalCell?: string | null;
}
interface Template {
id: string;
templateName: string;
fileId: string;
fileName: string;
versionNo: number;
activeFlag: boolean;
uploadUserId: string;
uploadUserName: string;
uploadTime: string;
remark?: string | null;
scoreCellMapping?: ScoreCellMapping | null;
}
type SearchParams = CommonType.RecordNullable<
Common.PageParams & {
templateName: string;
activeFlag: boolean;
}
>;
interface UploadParams {
templateName: string;
fileId: string;
fileName: string;
activeFlag?: boolean | null;
remark?: string | null;
}
}
namespace Sheet {
interface Sheet {
id: string;
periodMonth: string;
employeeId: string;
employeeName: string;
employeeDeptId: string;
employeeDeptName: string;
deptOrgType: string;
managerId: string;
managerName: string;
templateId: string;
fileId?: string | null;
fileName?: string | null;
fileVersion: number;
statusCode: Common.SheetStatusCode;
statusName: string;
actualScoreTotal?: string | number | null;
baseScoreTotal?: string | number | null;
extraScoreTotal?: string | number | null;
sentTime?: string | null;
confirmedTime?: string | null;
rejectedTime?: string | null;
lastStatusReason?: string | null;
createTime?: string | null;
updateTime?: string | null;
}
type SearchParams = CommonType.RecordNullable<
Common.PageParams & {
employeeIds: string[];
periodMonthRange: string[];
employeeId: string;
employeeName: string;
employeeDeptId: string;
employeeDeptName: string;
managerId: string;
managerName: string;
statusCode: Common.SheetStatusCode;
}
>;
interface CreateParams {
periodMonth: string;
employeeId: string;
}
interface ExcelUpdateParams {
fileId: string;
fileName: string;
fileVersion: number;
actualScoreTotal: string | number;
baseScoreTotal: string | number;
extraScoreTotal: string | number;
}
interface StatusActionParams {
reason?: string | null;
}
interface BatchDownloadParams {
ids: string[];
}
interface StatusDict {
statusCode: Common.SheetStatusCode;
statusName: string;
sort: number;
initialFlag: boolean;
terminalFlag: boolean;
allowEdit: boolean;
}
interface StatusTransition {
actionCode: Common.SheetActionCode;
actionName: string;
fromStatusCode: Common.SheetStatusCode;
toStatusCode: Common.SheetStatusCode;
needReason: boolean;
}
interface StatusLog {
id: string;
sheetId: string;
actionType: Common.SheetActionCode;
fromStatus?: Common.SheetStatusCode | null;
toStatus?: Common.SheetStatusCode | null;
reason?: string | null;
operatorUserId: string;
operatorName: string;
periodMonthSnapshot: string;
employeeNameSnapshot: string;
remark?: string | null;
createTime: string;
}
interface ResponseRecord {
id: string;
sheetId: string;
statusLogId: string;
roundNo: number;
actionType: Common.SheetActionCode;
fromStatus: Common.SheetStatusCode;
toStatus: Common.SheetStatusCode;
opinion?: string | null;
responderUserId: string;
responderName: string;
createTime: string;
}
interface MonthlyResult {
sheetId?: string | null;
periodMonth: string;
employeeId: string;
actualScoreTotal?: string | number | null;
baseScoreTotal?: string | number | null;
extraScoreTotal?: string | number | null;
statusCode?: Common.SheetStatusCode | null;
}
}
namespace Team {
interface SummaryParams {
periodMonthStart?: string | null;
periodMonthEnd?: string | null;
}
interface PendingSendUser {
userId: string;
userNickname: string;
managerUserId: string;
managerName: string;
sheetId?: string | null;
statusCode?: Common.SheetStatusCode | null;
}
interface PendingConfirmUser {
userId: string;
userNickname: string;
sheetId: string;
sentTime?: string | null;
}
interface DeptOrgAverage {
deptId: string;
deptName: string;
deptOrgType: string;
averageScore?: string | number | null;
confirmedCount: number;
}
interface Summary {
periodMonthStart: string;
periodMonthEnd: string;
totalSheetCount: number;
pendingSendCount: number;
pendingConfirmCount: number;
confirmedRate: string | number;
pendingSendUsers: PendingSendUser[];
pendingConfirmUsers: PendingConfirmUser[];
deptOrgAverages: DeptOrgAverage[];
}
interface RemindParams {
periodMonthStart?: string | null;
periodMonthEnd?: string | null;
remindType: Common.RemindType;
userIds?: string[] | null;
}
interface RemindResult {
remindedCount: number;
}
}
}
}

View File

@@ -16,7 +16,6 @@ declare module 'vue' {
BusinessFormDialog: typeof import('./../components/custom/business-form-dialog.vue')['default']
BusinessFormDrawer: typeof import('./../components/custom/business-form-drawer.vue')['default']
BusinessFormSection: typeof import('./../components/custom/business-form-section.vue')['default']
BusinessFormSimpleDialog: typeof import('./../components/custom/business-form-simple-dialog.vue')['default']
BusinessRichTextEditor: typeof import('./../components/custom/business-rich-text-editor.vue')['default']
BusinessRichTextView: typeof import('./../components/custom/business-rich-text-view.vue')['default']
BusinessUserPicker: typeof import('./../components/custom/business-user-picker.vue')['default']
@@ -35,17 +34,13 @@ declare module 'vue' {
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton']
ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
ElCard: typeof import('element-plus/es')['ElCard']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
ElCollapse: typeof import('element-plus/es')['ElCollapse']
ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDatePickerPanel: typeof import('element-plus/es')['ElDatePickerPanel']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
ElDialog: typeof import('element-plus/es')['ElDialog']
@@ -78,7 +73,6 @@ declare module 'vue' {
ElSelect: typeof import('element-plus/es')['ElSelect']
ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
ElSpace: typeof import('element-plus/es')['ElSpace']
ElStatistic: typeof import('element-plus/es')['ElStatistic']
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
ElSwitch: typeof import('element-plus/es')['ElSwitch']
ElTable: typeof import('element-plus/es')['ElTable']
@@ -86,11 +80,10 @@ declare module 'vue' {
ElTabPane: typeof import('element-plus/es')['ElTabPane']
ElTabs: typeof import('element-plus/es')['ElTabs']
ElTag: typeof import('element-plus/es')['ElTag']
ElTimeline: typeof import('element-plus/es')['ElTimeline']
ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
ElTooltip: typeof import('element-plus/es')['ElTooltip']
ElTree: typeof import('element-plus/es')['ElTree']
ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
ElUpload: typeof import('element-plus/es')['ElUpload']
ElWatermark: typeof import('element-plus/es')['ElWatermark']
ExceptionBase: typeof import('./../components/common/exception-base.vue')['default']
FullScreen: typeof import('./../components/common/full-screen.vue')['default']
@@ -98,10 +91,6 @@ declare module 'vue' {
IconAntDesignEnterOutlined: typeof import('~icons/ant-design/enter-outlined')['default']
IconAntDesignReloadOutlined: typeof import('~icons/ant-design/reload-outlined')['default']
IconAntDesignSettingOutlined: typeof import('~icons/ant-design/setting-outlined')['default']
IconCarbonAdd: typeof import('~icons/carbon/add')['default']
IconCarbonPlay: typeof import('~icons/carbon/play')['default']
IconCarbonStop: typeof import('~icons/carbon/stop')['default']
'IconCharm:download': typeof import('~icons/charm/download')['default']
'IconEp:arrowDown': typeof import('~icons/ep/arrow-down')['default']
'IconEp:arrowRight': typeof import('~icons/ep/arrow-right')['default']
'IconEp:box': typeof import('~icons/ep/box')['default']
@@ -113,53 +102,32 @@ declare module 'vue' {
'IconEp:sort': typeof import('~icons/ep/sort')['default']
IconEpRemoveFilled: typeof import('~icons/ep/remove-filled')['default']
IconEpSuccessFilled: typeof import('~icons/ep/success-filled')['default']
'IconF7:circleFill': typeof import('~icons/f7/circle-fill')['default']
'IconF7:flagCircleFill': typeof import('~icons/f7/flag-circle-fill')['default']
'IconFe:eye': typeof import('~icons/fe/eye')['default']
'IconFe:question': typeof import('~icons/fe/question')['default']
'IconFileIcons:microsoftExcel': typeof import('~icons/file-icons/microsoft-excel')['default']
'IconGg:ratio': typeof import('~icons/gg/ratio')['default']
IconGridiconsFullscreen: typeof import('~icons/gridicons/fullscreen')['default']
IconGridiconsFullscreenExit: typeof import('~icons/gridicons/fullscreen-exit')['default']
'IconIc:roundPlus': typeof import('~icons/ic/round-plus')['default']
'IconIconParkOutline:equalRatio': typeof import('~icons/icon-park-outline/equal-ratio')['default']
IconIcRoundChevronRight: typeof import('~icons/ic/round-chevron-right')['default']
IconIcRoundDelete: typeof import('~icons/ic/round-delete')['default']
IconIcRoundEdit: typeof import('~icons/ic/round-edit')['default']
IconIcRoundFolder: typeof import('~icons/ic/round-folder')['default']
IconIcRoundInventory2: typeof import('~icons/ic/round-inventory2')['default']
IconIcRoundPackage2: typeof import('~icons/ic/round-package2')['default']
IconIcRoundPlus: typeof import('~icons/ic/round-plus')['default']
IconIcRoundRefresh: typeof import('~icons/ic/round-refresh')['default']
IconIcRoundRemove: typeof import('~icons/ic/round-remove')['default']
IconIcRoundRocketLaunch: typeof import('~icons/ic/round-rocket-launch')['default']
IconIcRoundSearch: typeof import('~icons/ic/round-search')['default']
IconIcRoundUnfoldLess: typeof import('~icons/ic/round-unfold-less')['default']
IconIcRoundUnfoldMore: typeof import('~icons/ic/round-unfold-more')['default']
IconLocalActivity: typeof import('~icons/local/activity')['default']
IconLocalBanner: typeof import('~icons/local/banner')['default']
IconLocalCast: typeof import('~icons/local/cast')['default']
IconLocalLogo: typeof import('~icons/local/logo')['default']
'IconMaterialSymbolsLight:rotate90DegreesCcwOutlineRounded': typeof import('~icons/material-symbols-light/rotate90-degrees-ccw-outline-rounded')['default']
IconMaterialSymbolsLightCheckCircleRounded: typeof import('~icons/material-symbols-light/check-circle-rounded')['default']
IconMaterialSymbolsPackage2: typeof import('~icons/material-symbols/package2')['default']
'IconMdi:paperclip': typeof import('~icons/mdi/paperclip')['default']
'IconMdi:printer': typeof import('~icons/mdi/printer')['default']
IconMdiAccountTieOutline: typeof import('~icons/mdi/account-tie-outline')['default']
IconMdiArrowDownThin: typeof import('~icons/mdi/arrow-down-thin')['default']
IconMdiArrowUpThin: typeof import('~icons/mdi/arrow-up-thin')['default']
IconMdiCheck: typeof import('~icons/mdi/check')['default']
IconMdiCheckCircleOutline: typeof import('~icons/mdi/check-circle-outline')['default']
IconMdiChevronDoubleDown: typeof import('~icons/mdi/chevron-double-down')['default']
IconMdiChevronDoubleUp: typeof import('~icons/mdi/chevron-double-up')['default']
IconMdiChevronDown: typeof import('~icons/mdi/chevron-down')['default']
IconMdiChevronRight: typeof import('~icons/mdi/chevron-right')['default']
IconMdiClose: typeof import('~icons/mdi/close')['default']
IconMdiCloseCircle: typeof import('~icons/mdi/close-circle')['default']
IconMdiCrown: typeof import('~icons/mdi/crown')['default']
IconMdiCloseCircleOutline: typeof import('~icons/mdi/close-circle-outline')['default']
IconMdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default']
IconMdiDotsHorizontal: typeof import('~icons/mdi/dots-horizontal')['default']
IconMdiDownload: typeof import('~icons/mdi/download')['default']
IconMdiDrag: typeof import('~icons/mdi/drag')['default']
IconMdiFileCogOutline: typeof import('~icons/mdi/file-cog-outline')['default']
IconMdiFilterVariant: typeof import('~icons/mdi/filter-variant')['default']
IconMdiFolderOpen: typeof import('~icons/mdi/folder-open')['default']
IconMdiFolderOutline: typeof import('~icons/mdi/folder-outline')['default']
@@ -167,18 +135,16 @@ declare module 'vue' {
IconMdiKeyboardEsc: typeof import('~icons/mdi/keyboard-esc')['default']
IconMdiKeyboardReturn: typeof import('~icons/mdi/keyboard-return')['default']
IconMdiLinkVariant: typeof import('~icons/mdi/link-variant')['default']
IconMdiMenuDown: typeof import('~icons/mdi/menu-down')['default']
IconMdiPackageDown: typeof import('~icons/mdi/package-down')['default']
IconMdiPencilOutline: typeof import('~icons/mdi/pencil-outline')['default']
IconMdiPlus: typeof import('~icons/mdi/plus')['default']
IconMdiRefresh: typeof import('~icons/mdi/refresh')['default']
'IconMingcute:zoomInLine': typeof import('~icons/mingcute/zoom-in-line')['default']
'IconMingcute:zoomOutLine': typeof import('~icons/mingcute/zoom-out-line')['default']
IconMdiUpload: typeof import('~icons/mdi/upload')['default']
IconUilSearch: typeof import('~icons/uil/search')['default']
LangSwitch: typeof import('./../components/common/lang-switch.vue')['default']
LookForward: typeof import('./../components/custom/look-forward.vue')['default']
MenuToggler: typeof import('./../components/common/menu-toggler.vue')['default']
PinToggler: typeof import('./../components/common/pin-toggler.vue')['default']
PrioritySelect: typeof import('../views/product/requirement/modules/priority-select.vue')['default']
ReadonlyField: typeof import('./../components/custom/readonly-field.vue')['default']
ReloadButton: typeof import('./../components/common/reload-button.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink']