zhangwencui
5 天以前 9af9d62696a57a8ac8603e41931afbe63ae05cb8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
import { API_BASE_URL, request, type ApiResponse } from "./request";
import type { PageResult } from "./purchase";
import type { DictData, DeptSimple } from "./crm";
 
export interface SimpleOption { id: number; name: string; code?: string; parentId?: number; status?: number }
export interface HrmAttachment { id: number; name?: string; url?: string; path?: string; size?: number }
export interface UserOption { id: number; nickname?: string; username?: string; deptId?: number; deptName?: string }
export interface EmployeeSimple { id: number; employeeNo: string; name: string; deptName?: string; employeeStatus?: number }
export interface Employee {
  id?: number; deptId?: number; deptName?: string; postId?: number; postName?: string;
  roleIds?: number[]; roleNames?: string; employeeNo?: string; name?: string; gender?: number; birthday?: string; phone?: string;
  email?: string; idCard?: string; nation?: string; marriageStatus?: string; age?: number; education?: string;
  politicalStatus?: string; hireDate?: string; regularDate?: string; leaveDate?: string; employeeStatus?: number;
  annualLeaveBalance?: number; sickLeaveBalance?: number; salaryStructureId?: number; baseSalary?: number; bankName?: string; bankAccount?: string;
  address?: string; remark?: string; createTime?: string;
}
export interface EmployeeContract {
  id?: number; parentId?: number; parentNo?: string; isCurrent?: boolean; contractNo?: string; employeeId?: number;
  employeeName?: string; employeeNo?: string; deptName?: string; contractType?: number; contractTermType?: number;
  signCompany?: string; signDate?: string; startDate?: string; endDate?: string; probationStartDate?: string;
  probationEndDate?: string; probationSalary?: number; regularSalary?: number; terminateStatus?: number;
  terminateDate?: string; terminateReason?: string; status?: number; blobIds?: number[]; attachmentList?: HrmAttachment[];
  remark?: string; createTime?: string;
}
export interface Leave {
  id?: number; userId?: number; userName?: string; deptId?: number; deptName?: string; leaveType?: number; startTime?: string;
  endTime?: string; duration?: number; reason?: string; status?: number; processInstanceId?: string;
  blobIds?: number[]; attachmentList?: HrmAttachment[]; remark?: string; createTime?: string;
}
export interface Transfer {
  id?: number; no?: string; userId?: number; userName?: string; currentDeptId?: number; currentDeptName?: string;
  currentPostId?: number; currentPostName?: string; targetDeptId?: number; targetDeptName?: string;
  targetPostId?: number; targetPostName?: string; transferType?: number; effectiveDate?: string; reason?: string;
  status?: number; processInstanceId?: string; blobIds?: number[]; attachmentList?: HrmAttachment[];
  remark?: string; createTime?: string;
}
export interface Resignation {
  id?: number; no?: string; userId?: number; userName?: string; deptId?: number; deptName?: string;
  resignationType?: number; resignationTypeName?: string; expectedDate?: string; actualDate?: string;
  reason?: string; handoverUserId?: number; handoverUserName?: string; handoverStatus?: number;
  handoverStatusName?: string; handoverRemark?: string; status?: number; statusName?: string;
  processInstanceId?: string; blobIds?: number[]; attachmentList?: HrmAttachment[]; remark?: string; createTime?: string;
}
export interface Overtime {
  id?: number; no?: string; userId?: number; employeeId?: number; employeeName?: string; employeeNo?: string;
  deptId?: number; deptName?: string; postName?: string; overtimeDate?: string; startTime?: string; endTime?: string;
  duration?: number; overtimeType?: number; overtimeTypeName?: string; crossDay?: boolean; mealDeduction?: boolean;
  mealDeductionHours?: number; reason?: string; relatedType?: number; relatedCode?: string; workContent?: string;
  status?: number; statusName?: string; processInstanceId?: string; createTime?: string;
}
export interface ApproveProcess { key: string; name: string }
export interface AttendanceRule {
  id?: number; name?: string; deptId?: number; deptName?: string; workStartTime?: string; workEndTime?: string;
  lateAllowMinutes?: number; earlyAllowMinutes?: number; overtimeThreshold?: number; status?: number; remark?: string;
  locationName?: string; locationAddress?: string; longitude?: number; latitude?: number; radiusMeters?: number;
  locationRequired?: boolean; coordinateSystem?: "WGS84";
}
export interface AttendanceRecord {
  id?: number; userId?: number; userName?: string; deptId?: number; deptName?: string; phone?: string; date?: string;
  clockInTime?: string; clockOutTime?: string; clockInType?: number; clockInTypeName?: string; clockOutType?: number;
  clockOutTypeName?: string; workHours?: number; overtimeHours?: number; location?: string; dataSource?: number;
  leaveFlag?: boolean; leaveHours?: number; leaveTypes?: string;
  dataSourceName?: string; remark?: string; createTime?: string;
}
export interface AttendanceClockable {
  clockIn?: boolean; clockOut?: boolean; nextAction?: "in" | "out" | "none"; message?: string;
}
export interface AttendanceMyStatus {
  userId?: number; employeeId?: number; employeeName?: string; deptId?: number; deptName?: string;
  date?: string; serverTime?: string; workDay?: boolean; restDayReason?: string | null;
  onLeave?: boolean; leaveHours?: number; leaveTypeNames?: string;
  rule?: AttendanceRule | null; record?: AttendanceRecord | null; clockable?: AttendanceClockable;
}
export interface AttendanceClockRequest {
  longitude?: number; latitude?: number; accuracy?: number; coordinateSystem?: "WGS84";
}
export interface AttendanceClockResponse {
  record: AttendanceRecord;
  locationName?: string;
  distanceMeters?: number;
  radiusMeters?: number;
  withinRange?: boolean;
}
 
const header = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
function query(params: Record<string, string | number | boolean | undefined>) {
  const content = Object.entries(params).filter(([, value]) => value !== undefined && value !== "")
    .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
  return content ? `?${content}` : "";
}
 
export function getHrmDicts(token: string) { return request<DictData[]>("/system/dict-data/simple-list", { header: header(token) }); }
export function getHrmDeptList(token: string) { return request<DeptSimple[]>("/system/dept/simple-list", { header: header(token) }); }
export function getHrmPostList(token: string) { return request<SimpleOption[]>("/system/post/simple-list", { header: header(token) }); }
export function getHrmRoleList(token: string) { return request<SimpleOption[]>("/system/role/simple-list", { header: header(token) }); }
export function getHrmUserList(token: string) { return request<UserOption[]>("/system/user/simple-list", { header: header(token) }); }
export function getEmployeeSimpleList(token: string) { return request<EmployeeSimple[]>("/hrm/employee/simple-list", { header: header(token) }); }
export function getSalaryStructureList(token: string) { return request<SimpleOption[]>(`/hrm/salary/structure/list${query({ status: 0 })}`, { header: header(token) }); }
export function getAutoApprovalPolicy(token: string) { return request<boolean>("/bpm/process-auto-approve/ui-policy", { header: header(token) }); }
export function getAttendanceMyStatus(token: string, date?: string) { return request<AttendanceMyStatus>(`/hrm/attendance/record/my-status${query({ date })}`, { header: header(token) }); }
export function clockIn(token: string, data: AttendanceClockRequest) { return request<AttendanceClockResponse>("/hrm/attendance/record/clock-in", { method: "POST", data, header: header(token) }); }
export function clockOut(token: string, data: AttendanceClockRequest) { return request<AttendanceClockResponse>("/hrm/attendance/record/clock-out", { method: "POST", data, header: header(token) }); }
 
export function uploadHrmFile(token: string, filePath: string) {
  return new Promise<HrmAttachment>((resolve, reject) => {
    uni.uploadFile({
      url: `${API_BASE_URL}/system/storage-blob/upload`,
      filePath,
      name: "files",
      header: header(token),
      formData: { directory: "hrm" },
      success: response => {
        try {
          const result = JSON.parse(response.data) as ApiResponse<HrmAttachment[]>;
          if (result.code === 0 && result.data?.[0]) resolve(result.data[0]);
          else reject(new Error(result.msg || "文件上传失败"));
        } catch {
          reject(new Error("文件上传响应解析失败"));
        }
      },
      fail: () => reject(new Error("文件上传失败,请检查网络后重试"))
    });
  });
}
 
export function chooseHrmFiles(count = 10): Promise<Array<{ path: string; name?: string }>> {
  return new Promise((resolve, reject) => {
    const complete = (files: Array<{ path: string; name?: string }>) => resolve(files.filter(item => Boolean(item.path)));
    // #ifdef MP-WEIXIN
    uni.chooseMessageFile({ count, type: "file", success: result => complete((result.tempFiles || []).map(item => ({ path: item.path, name: item.name }))), fail: reject });
    // #endif
    // #ifndef MP-WEIXIN
    uni.chooseFile({ count, success: result => complete((result.tempFiles || []).map(item => ({ path: item.path, name: item.name }))), fail: reject });
    // #endif
  });
}
 
export function getEmployeePage(token: string, params: { pageNo: number; pageSize: number; name?: string; employeeNo?: string; employeeStatus?: number }) { return request<PageResult<Employee>>(`/hrm/employee/page${query(params)}`, { header: header(token) }); }
export function getEmployee(token: string, id: number) { return request<Employee>(`/hrm/employee/get${query({ id })}`, { header: header(token) }); }
export function createEmployee(token: string, data: Employee) { return request<number>("/hrm/employee/create", { method: "POST", data, header: header(token) }); }
export function updateEmployee(token: string, data: Employee) { return request<boolean>("/hrm/employee/update", { method: "PUT", data, header: header(token) }); }
export function deleteEmployee(token: string, id: number) { return request<boolean>(`/hrm/employee/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
 
export function getContractPage(token: string, params: { pageNo: number; pageSize: number; contractNo?: string; employeeId?: number; status?: number }) { return request<PageResult<EmployeeContract>>(`/hrm/employee-contract/page${query(params)}`, { header: header(token) }); }
export function getContract(token: string, id: number) { return request<EmployeeContract>(`/hrm/employee-contract/get${query({ id })}`, { header: header(token) }); }
export function createContract(token: string, data: EmployeeContract) { return request<number>("/hrm/employee-contract/create", { method: "POST", data, header: header(token) }); }
export function updateContract(token: string, data: EmployeeContract) { return request<boolean>("/hrm/employee-contract/update", { method: "PUT", data, header: header(token) }); }
export function terminateContract(token: string, data: { id: number; terminateStatus: number; terminateDate: string; terminateReason: string }) { return request<boolean>("/hrm/employee-contract/terminate", { method: "PUT", data, header: header(token) }); }
export function deleteContract(token: string, id: number) { return request<boolean>(`/hrm/employee-contract/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
 
export function getLeavePage(token: string, params: { pageNo: number; pageSize: number; userId?: number; leaveType?: number; status?: number }) { return request<PageResult<Leave>>(`/hrm/leave/page${query(params)}`, { header: header(token) }); }
export function getLeave(token: string, id: number) { return request<Leave>(`/hrm/leave/get${query({ id })}`, { header: header(token) }); }
export function createLeave(token: string, data: Leave) { return request<number>("/hrm/leave/create", { method: "POST", data, header: header(token) }); }
export function updateLeave(token: string, data: Leave) { return request<boolean>("/hrm/leave/update", { method: "PUT", data, header: header(token) }); }
export function deleteLeave(token: string, id: number) { return request<boolean>(`/hrm/leave/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function submitLeave(token: string, id: number, processDefinitionKey: string) { return request<boolean>(`/hrm/leave/submit${query({ id, processDefinitionKey })}`, { method: "POST", header: header(token) }); }
export function getLeaveProcesses(token: string) { return request<ApproveProcess[]>("/hrm/leave/approve-process-definition-list", { header: header(token) }); }
 
export function getTransferPage(token: string, params: { pageNo: number; pageSize: number; userId?: number; transferType?: number; status?: number }) { return request<PageResult<Transfer>>(`/hrm/transfer/page${query(params)}`, { header: header(token) }); }
export function getTransfer(token: string, id: number) { return request<Transfer>(`/hrm/transfer/get${query({ id })}`, { header: header(token) }); }
export function createTransfer(token: string, data: Transfer) { return request<number>("/hrm/transfer/create", { method: "POST", data, header: header(token) }); }
export function updateTransfer(token: string, data: Transfer) { return request<boolean>("/hrm/transfer/update", { method: "PUT", data, header: header(token) }); }
export function deleteTransfer(token: string, id: number) { return request<boolean>(`/hrm/transfer/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function submitTransfer(token: string, id: number, processDefinitionKey: string) { return request<boolean>(`/hrm/transfer/submit${query({ id, processDefinitionKey })}`, { method: "POST", header: header(token) }); }
export function getTransferProcesses(token: string) { return request<ApproveProcess[]>("/hrm/transfer/approve-process-definition-list", { header: header(token) }); }
 
export function getResignationPage(token: string, params: { pageNo: number; pageSize: number; userId?: number; resignationType?: number; status?: number }) { return request<PageResult<Resignation>>(`/hrm/resignation/page${query(params)}`, { header: header(token) }); }
export function getResignation(token: string, id: number) { return request<Resignation>(`/hrm/resignation/get${query({ id })}`, { header: header(token) }); }
export function createResignation(token: string, data: Resignation) { return request<number>("/hrm/resignation/create", { method: "POST", data, header: header(token) }); }
export function updateResignation(token: string, data: Resignation) { return request<boolean>("/hrm/resignation/update", { method: "PUT", data, header: header(token) }); }
export function deleteResignation(token: string, id: number) { return request<boolean>(`/hrm/resignation/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function submitResignation(token: string, id: number, processDefinitionKey: string) { return request<boolean>(`/hrm/resignation/submit${query({ id, processDefinitionKey })}`, { method: "POST", header: header(token) }); }
export function getResignationProcesses(token: string) { return request<ApproveProcess[]>("/hrm/resignation/approve-process-definition-list", { header: header(token) }); }
export function updateResignationHandover(token: string, data: { id: number; handoverStatus: number }) { return request<boolean>("/hrm/resignation/handover", { method: "PUT", data, header: header(token) }); }
 
export function getOvertimePage(token: string, params: { pageNo: number; pageSize: number; userId?: number; overtimeType?: number; status?: number }) { return request<PageResult<Overtime>>(`/hrm/overtime/page${query(params)}`, { header: header(token) }); }
export function getOvertime(token: string, id: number) { return request<Overtime>(`/hrm/overtime/get${query({ id })}`, { header: header(token) }); }
export function getCurrentOvertimeApplicant(token: string) { return request<Partial<Overtime>>("/hrm/overtime/current-applicant", { header: header(token) }); }
export function createOvertime(token: string, data: Overtime) { return request<number>("/hrm/overtime/create", { method: "POST", data, header: header(token) }); }
export function updateOvertime(token: string, data: Overtime) { return request<boolean>("/hrm/overtime/update", { method: "PUT", data, header: header(token) }); }
export function deleteOvertime(token: string, id: number) { return request<boolean>(`/hrm/overtime/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function submitOvertime(token: string, id: number, processDefinitionKey: string) { return request<boolean>(`/hrm/overtime/submit${query({ id, processDefinitionKey })}`, { method: "POST", header: header(token) }); }
export function cancelOvertime(token: string, id: number) { return request<boolean>(`/hrm/overtime/cancel${query({ id })}`, { method: "POST", header: header(token) }); }
export function getOvertimeProcesses(token: string) { return request<ApproveProcess[]>("/hrm/overtime/approve-process-definition-list", { header: header(token) }); }
 
// HRM management modules
export interface HrmRow { id?: number; [key: string]: unknown }
export interface Shift extends HrmRow { name?: string; startTime?: string; endTime?: string; workHours?: number; crossDay?: boolean; color?: string; status?: number; remark?: string }
export interface Holiday extends HrmRow { name?: string; startDate?: string; endDate?: string; type?: number; typeName?: string; isLegal?: number; remark?: string }
export interface AttendanceSummary extends HrmRow { userId?: number; userName?: string; deptId?: number; deptName?: string; yearMonth?: string; workDays?: number; actualDays?: number; lateCount?: number; earlyCount?: number; absentCount?: number; overtimeHours?: number; leaveHours?: number; remark?: string }
export interface AttendanceException extends HrmRow { userId?: number; userName?: string; deptName?: string; date?: string; exceptionType?: number; exceptionTypeName?: string; reason?: string; blobIds?: number[]; attachmentList?: HrmAttachment[]; status?: number; processInstanceId?: string; remark?: string; createTime?: string }
export interface EmployeeSchedule extends HrmRow { employeeId?: number; employeeName?: string; employeeNo?: string; date?: string; shiftId?: number; shiftName?: string; shiftColor?: string; remark?: string }
export interface SalaryStructure extends HrmRow { name?: string; overtimePayRatio?: number; restDayOvertimePayRatio?: number; legalHolidayOvertimePayRatio?: number; status?: number; remark?: string }
export interface SocialSecurityScheme extends HrmRow { name?: string; effectiveDate?: string; pensionCompanyRatio?: number; pensionPersonalRatio?: number; medicalCompanyRatio?: number; medicalPersonalRatio?: number; unemploymentCompanyRatio?: number; unemploymentPersonalRatio?: number; workInjuryRatio?: number; maternityRatio?: number; housingFundCompanyRatio?: number; housingFundPersonalRatio?: number; status?: number; remark?: string }
export interface TaxRateConfig extends HrmRow { name?: string; effectiveDate?: string; level?: number; minAmount?: number; maxAmount?: number; taxRate?: number; quickDeduction?: number }
export interface LeaveTypeConfig extends HrmRow { leaveType?: number; name?: string; deductionRatio?: number; remark?: string; status?: number }
export interface EmployeeSocialSecurity extends HrmRow { userId?: number; userName?: string; deptName?: string; socialSecuritySchemeId?: number; schemeName?: string; socialSecurityBase?: number; housingFundBase?: number; effectiveDate?: string; status?: number; remark?: string }
export interface SalaryCalculation extends HrmRow { no?: string; period?: string; userId?: number; userName?: string; deptId?: number; deptName?: string; baseSalary?: number; performanceSalary?: number; overtimePay?: number; mealAllowance?: number; transportAllowance?: number; otherAllowance?: number; socialSecurityDeduction?: number; housingFundDeduction?: number; taxDeduction?: number; otherDeduction?: number; leaveDeduction?: number; actualSalary?: number; workDays?: number; overtimeHours?: number; totalWorkHours?: number; status?: number; statusName?: string; remark?: string; createTime?: string }
export interface SalaryPayment extends HrmRow { no?: string; period?: string; totalAmount?: number; totalCount?: number; paymentMethod?: number; paymentTime?: string; status?: number; blobIds?: number[]; attachmentList?: HrmAttachment[]; remark?: string; createTime?: string }
export interface SalaryPaymentDetail extends SalaryCalculation { paymentId?: number; calculationId?: number; paymentTime?: string }
 
export function getShiftPage(token: string, params: Record<string, unknown>) { return request<PageResult<Shift>>(`/hrm/shift/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getShiftList(token: string) { return request<Shift[]>("/hrm/shift/list", { header: header(token) }); }
export function getShift(token: string, id: number) { return request<Shift>(`/hrm/shift/get${query({ id })}`, { header: header(token) }); }
export function createShift(token: string, data: Shift) { return request<number>("/hrm/shift/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function updateShift(token: string, data: Shift) { return request<boolean>("/hrm/shift/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteShift(token: string, id: number) { return request<boolean>(`/hrm/shift/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getEmployeeScheduleList(token: string, params: { yearMonth: string; deptId?: number; employeeId?: number }) { return request<EmployeeSchedule[]>(`/hrm/employee-schedule/list${query(params)}`, { header: header(token) }); }
export function saveEmployeeSchedule(token: string, data: Array<{ employeeId: number; date: string; shiftId?: number | null; remark?: string }>) { return request<boolean>("/hrm/employee-schedule/save", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) }); }
 
export function getAttendanceRulePage(token: string, params: Record<string, unknown>) { return request<PageResult<AttendanceRule>>(`/hrm/attendance/rule/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getAttendanceRule(token: string, id: number) { return request<AttendanceRule>(`/hrm/attendance/rule/get${query({ id })}`, { header: header(token) }); }
export function createAttendanceRule(token: string, data: AttendanceRule) { return request<number>("/hrm/attendance/rule/create", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) }); }
export function updateAttendanceRule(token: string, data: AttendanceRule) { return request<boolean>("/hrm/attendance/rule/update", { method: "PUT", data: data as unknown as Record<string, unknown>, header: header(token) }); }
export function deleteAttendanceRule(token: string, id: number) { return request<boolean>(`/hrm/attendance/rule/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getAttendanceRecordPage(token: string, params: Record<string, unknown>) { return request<PageResult<AttendanceRecord>>(`/hrm/attendance/record/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getHolidayPage(token: string, params: Record<string, unknown>) { return request<PageResult<Holiday>>(`/hrm/attendance/holiday/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getHoliday(token: string, id: number) { return request<Holiday>(`/hrm/attendance/holiday/get${query({ id })}`, { header: header(token) }); }
export function createHoliday(token: string, data: Holiday) { return request<number>("/hrm/attendance/holiday/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function updateHoliday(token: string, data: Holiday) { return request<boolean>("/hrm/attendance/holiday/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteHoliday(token: string, id: number) { return request<boolean>(`/hrm/attendance/holiday/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getAttendanceSummaryPage(token: string, params: Record<string, unknown>) { return request<PageResult<AttendanceSummary>>(`/hrm/attendance/summary/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function generateAttendanceSummary(token: string, params: { yearMonth: string; deptId?: number; userId?: number }) { return request<boolean>(`/hrm/attendance/summary/generate${query(params)}`, { method: "POST", header: header(token) }); }
export function getAttendanceExceptionPage(token: string, params: Record<string, unknown>) { return request<PageResult<AttendanceException>>(`/hrm/attendance/exception/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getAttendanceException(token: string, id: number) { return request<AttendanceException>(`/hrm/attendance/exception/get${query({ id })}`, { header: header(token) }); }
export function createAttendanceException(token: string, data: AttendanceException) { return request<number>("/hrm/attendance/exception/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function submitAttendanceException(token: string, id: number, processDefinitionKey: string) { return request<boolean>(`/hrm/attendance/exception/submit${query({ id, processDefinitionKey })}`, { method: "POST", header: header(token) }); }
export function getAttendanceExceptionProcesses(token: string) { return request<ApproveProcess[]>("/hrm/attendance/exception/approve-process-list", { header: header(token) }); }
 
export function getSalaryStructureRows(token: string, params: { name?: string; status?: number } = {}) { return request<SalaryStructure[]>(`/hrm/salary/structure/list${query(params)}`, { header: header(token) }); }
export function createSalaryStructure(token: string, data: SalaryStructure) { return request<number>("/hrm/salary/structure/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function updateSalaryStructure(token: string, data: SalaryStructure) { return request<boolean>("/hrm/salary/structure/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteSalaryStructure(token: string, id: number) { return request<boolean>(`/hrm/salary/structure/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getSocialSecuritySchemeList(token: string, params: { name?: string; status?: number } = {}) { return request<SocialSecurityScheme[]>(`/hrm/salary/social-security-scheme/list${query(params)}`, { header: header(token) }); }
export function createSocialSecurityScheme(token: string, data: SocialSecurityScheme) { return request<number>("/hrm/salary/social-security-scheme/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function updateSocialSecurityScheme(token: string, data: SocialSecurityScheme) { return request<boolean>("/hrm/salary/social-security-scheme/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteSocialSecurityScheme(token: string, id: number) { return request<boolean>(`/hrm/salary/social-security-scheme/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getTaxRateConfigList(token: string) { return request<TaxRateConfig[]>("/hrm/salary/tax-rate-config/list", { header: header(token) }); }
export function createTaxRateConfigList(token: string, data: TaxRateConfig[]) { return request<number>("/hrm/salary/tax-rate-config/create-list", { method: "POST", data: data as unknown as Record<string, unknown>, header: header(token) }); }
export function updateTaxRateConfig(token: string, data: TaxRateConfig) { return request<boolean>("/hrm/salary/tax-rate-config/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteTaxRateConfig(token: string, id: number) { return request<boolean>(`/hrm/salary/tax-rate-config/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getLeaveTypeConfigList(token: string) { return request<LeaveTypeConfig[]>("/hrm/leave-type-config/list", { header: header(token) }); }
export function createLeaveTypeConfig(token: string, data: LeaveTypeConfig) { return request<number>("/hrm/leave-type-config/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function updateLeaveTypeConfig(token: string, data: LeaveTypeConfig) { return request<boolean>("/hrm/leave-type-config/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteLeaveTypeConfig(token: string, id: number) { return request<boolean>(`/hrm/leave-type-config/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getEmployeeSocialSecurityPage(token: string, params: Record<string, unknown>) { return request<PageResult<EmployeeSocialSecurity>>(`/hrm/salary/employee-social-security/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getEmployeeSocialSecurityHistory(token: string, userId: number) { return request<EmployeeSocialSecurity[]>(`/hrm/salary/employee-social-security/list-by-user${query({ userId })}`, { header: header(token) }); }
export function createEmployeeSocialSecurity(token: string, data: EmployeeSocialSecurity) { return request<number>("/hrm/salary/employee-social-security/create", { method: "POST", data: data as Record<string, unknown>, header: header(token) }); }
export function updateEmployeeSocialSecurity(token: string, data: EmployeeSocialSecurity) { return request<boolean>("/hrm/salary/employee-social-security/update", { method: "PUT", data: data as Record<string, unknown>, header: header(token) }); }
export function deleteEmployeeSocialSecurity(token: string, id: number) { return request<boolean>(`/hrm/salary/employee-social-security/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getSalaryCalculationPage(token: string, params: Record<string, unknown>) { return request<PageResult<SalaryCalculation>>(`/hrm/salary/calculation/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function calculateSalary(token: string, params: { period: string; deptId?: number }) { return request<boolean>(`/hrm/salary/calculation/calculate${query(params)}`, { method: "POST", header: header(token) }); }
export function confirmSalary(token: string, ids: number[]) { return request<boolean>("/hrm/salary/calculation/confirm", { method: "POST", data: { ids }, header: header(token) }); }
export function revokeSalary(token: string, ids: number[]) { return request<boolean>("/hrm/salary/calculation/revoke", { method: "POST", data: { ids }, header: header(token) }); }
export function deleteSalaryCalculation(token: string, id: number) { return request<boolean>(`/hrm/salary/calculation/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }
export function getSalaryPaymentPage(token: string, params: Record<string, unknown>) { return request<PageResult<SalaryPayment>>(`/hrm/salary/payment/page${query(params as Record<string, string | number | boolean | undefined>)}`, { header: header(token) }); }
export function getSalaryPaymentDetails(token: string, paymentId: number) { return request<SalaryPaymentDetail[]>(`/hrm/salary/payment/detail/list${query({ paymentId })}`, { header: header(token) }); }
export function generateSalaryPayment(token: string, period: string) { return request<number>(`/hrm/salary/payment/generate${query({ period })}`, { method: "POST", header: header(token) }); }
export function paySalary(token: string, id: number) { return request<boolean>(`/hrm/salary/payment/pay${query({ id })}`, { method: "POST", header: header(token) }); }
export function paySalaryDetails(token: string, detailIds: number[]) { return request<boolean>("/hrm/salary/payment/pay-detail", { method: "POST", data: { detailIds }, header: header(token) }); }
export function revokeSalaryPaymentDetails(token: string, detailIds: number[]) { return request<boolean>("/hrm/salary/payment/revoke-detail", { method: "POST", data: { detailIds }, header: header(token) }); }
export function deleteSalaryPayment(token: string, id: number) { return request<boolean>(`/hrm/salary/payment/delete${query({ id })}`, { method: "DELETE", header: header(token) }); }