feat(hrm): 薪酬核算新增岗位工资/工龄工资列;核算搜索的员工下拉支持模糊搜索
- 员工管理表单新增「岗位工资」「工龄工资」输入(与基本工资并列,作为核算取数来源)
- 薪酬核算列表新增两列,并支持行内文本编辑
- 核算的「预览数据」表格与「修改」弹窗同步支持这两个字段
- 薪酬核算搜索区「员工」下拉增加 showSearch + 按姓名模糊过滤(原下拉形态不变)
| | |
| | | sickLeaveBalance?: number; |
| | | salaryStructureId?: number; |
| | | baseSalary?: number; |
| | | /** 岗位工资 */ |
| | | postSalary?: number; |
| | | /** 工龄工资 */ |
| | | senioritySalary?: number; |
| | | roleIds?: number[]; |
| | | roleNames?: string[]; |
| | | bankName?: string; |
| | |
| | | deptName?: string; |
| | | baseSalary?: number; |
| | | performanceSalary?: number; |
| | | /** 岗位工资 */ |
| | | postSalary?: number; |
| | | /** 工龄工资 */ |
| | | senioritySalary?: number; |
| | | overtimePay?: number; |
| | | mealAllowance?: number; |
| | | transportAllowance?: number; |
| | |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'postSalary', |
| | | label: '岗位工资', |
| | | component: 'InputNumber', |
| | | componentProps: { |
| | | placeholder: '请输入岗位工资', |
| | | min: 0, |
| | | precision: 2, |
| | | style: { width: '100%' }, |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'senioritySalary', |
| | | label: '工龄工资', |
| | | component: 'InputNumber', |
| | | componentProps: { |
| | | placeholder: '请输入工龄工资', |
| | | min: 0, |
| | | precision: 2, |
| | | style: { width: '100%' }, |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'bankName', |
| | | label: '开户银行', |
| | | component: 'Input', |
| | |
| | | labelField: 'name', |
| | | valueField: 'id', |
| | | allowClear: true, |
| | | placeholder: '请选择员工', |
| | | showSearch: true, |
| | | // 支持按姓名模糊搜索;也可输入员工编号匹配 |
| | | filterOption: (input: string, option: any) => |
| | | `${option?.label ?? ''}`.toLowerCase().includes(input.toLowerCase()), |
| | | placeholder: '请选择员工(可输入姓名搜索)', |
| | | }, |
| | | }, |
| | | { |
| | |
| | | { field: 'userName', title: '员工姓名', minWidth: 100 }, |
| | | { field: 'deptName', title: '部门', minWidth: 120 }, |
| | | { field: 'baseSalary', title: '基本工资', width: 120, slots: { default: 'editableCell' } }, |
| | | { field: 'postSalary', title: '岗位工资', width: 110, slots: { default: 'editableCell' } }, |
| | | { field: 'senioritySalary', title: '工龄工资', width: 110, slots: { default: 'editableCell' } }, |
| | | { field: 'performanceSalary', title: '绩效工资', width: 120, slots: { default: 'editableCell' } }, |
| | | { field: 'overtimePay', title: '加班费', width: 120, slots: { default: 'editableCell' } }, |
| | | { field: 'mealAllowance', title: '餐补', width: 110, slots: { default: 'editableCell' } }, |
| | |
| | | { title: '员工姓名', dataIndex: 'userName', width: 100, fixed: 'left' }, |
| | | { title: '部门', dataIndex: 'deptName', width: 120 }, |
| | | { title: '基本工资', dataIndex: 'baseSalary', width: 110 }, |
| | | { title: '岗位工资', dataIndex: 'postSalary', width: 110 }, |
| | | { title: '工龄工资', dataIndex: 'senioritySalary', width: 110 }, |
| | | { title: '绩效工资', dataIndex: 'performanceSalary', width: 110 }, |
| | | { title: '加班费', dataIndex: 'overtimePay', width: 110 }, |
| | | { title: '餐补', dataIndex: 'mealAllowance', width: 100 }, |
| | |
| | | /** 列表可编辑的数值字段 */ |
| | | const EDITABLE_NUMBER_FIELDS = [ |
| | | 'baseSalary', |
| | | 'postSalary', |
| | | 'senioritySalary', |
| | | 'performanceSalary', |
| | | 'overtimePay', |
| | | 'mealAllowance', |
| | |
| | | @change="(val: number) => updateFieldValue(record, 'performanceSalary', val)" |
| | | /> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'postSalary'"> |
| | | <InputNumber |
| | | v-model:value="record.postSalary" |
| | | :min="0" |
| | | :precision="2" |
| | | size="small" |
| | | style="width: 90px" |
| | | @change="(val: number) => updateFieldValue(record, 'postSalary', val)" |
| | | /> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'senioritySalary'"> |
| | | <InputNumber |
| | | v-model:value="record.senioritySalary" |
| | | :min="0" |
| | | :precision="2" |
| | | size="small" |
| | | style="width: 90px" |
| | | @change="(val: number) => updateFieldValue(record, 'senioritySalary', val)" |
| | | /> |
| | | </template> |
| | | <template v-else-if="column.dataIndex === 'overtimePay'"> |
| | | <InputNumber |
| | | v-model:value="record.overtimePay" |
| | |
| | | /** 收入项 */ |
| | | const incomeFields = [ |
| | | { key: 'baseSalary', label: '基本工资' }, |
| | | { key: 'postSalary', label: '岗位工资' }, |
| | | { key: 'senioritySalary', label: '工龄工资' }, |
| | | { key: 'performanceSalary', label: '绩效工资' }, |
| | | { key: 'overtimePay', label: '加班费' }, |
| | | { key: 'mealAllowance', label: '餐补' }, |