feat(hrm): 薪酬核算新增岗位工资/工龄工资列;核算搜索的员工下拉支持模糊搜索

- 员工管理表单新增「岗位工资」「工龄工资」输入(与基本工资并列,作为核算取数来源)
- 薪酬核算列表新增两列,并支持行内文本编辑
- 核算的「预览数据」表格与「修改」弹窗同步支持这两个字段
- 薪酬核算搜索区「员工」下拉增加 showSearch + 按姓名模糊过滤(原下拉形态不变)
已修改6个文件
64 ■■■■■ 文件已修改
src/api/hrm/employee/index.ts 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/hrm/salary/calculation/index.ts 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/employee/data.ts 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/salary/calculation/data.ts 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/salary/calculation/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/hrm/salary/calculation/modules/form.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/hrm/employee/index.ts
@@ -33,6 +33,10 @@
    sickLeaveBalance?: number;
    salaryStructureId?: number;
    baseSalary?: number;
    /** 岗位工资 */
    postSalary?: number;
    /** 工龄工资 */
    senioritySalary?: number;
    roleIds?: number[];
    roleNames?: string[];
    bankName?: string;
src/api/hrm/salary/calculation/index.ts
@@ -14,6 +14,10 @@
    deptName?: string;
    baseSalary?: number;
    performanceSalary?: number;
    /** 岗位工资 */
    postSalary?: number;
    /** 工龄工资 */
    senioritySalary?: number;
    overtimePay?: number;
    mealAllowance?: number;
    transportAllowance?: number;
src/views/hrm/employee/data.ts
@@ -280,6 +280,28 @@
      },
    },
    {
      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',
src/views/hrm/salary/calculation/data.ts
@@ -34,7 +34,11 @@
        labelField: 'name',
        valueField: 'id',
        allowClear: true,
        placeholder: '请选择员工',
        showSearch: true,
        // 支持按姓名模糊搜索;也可输入员工编号匹配
        filterOption: (input: string, option: any) =>
          `${option?.label ?? ''}`.toLowerCase().includes(input.toLowerCase()),
        placeholder: '请选择员工(可输入姓名搜索)',
      },
    },
    {
@@ -76,6 +80,8 @@
    { 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' } },
@@ -116,6 +122,8 @@
    { 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 },
src/views/hrm/salary/calculation/index.vue
@@ -249,6 +249,8 @@
/** 列表可编辑的数值字段 */
const EDITABLE_NUMBER_FIELDS = [
  'baseSalary',
  'postSalary',
  'senioritySalary',
  'performanceSalary',
  'overtimePay',
  'mealAllowance',
@@ -415,6 +417,26 @@
              @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"
src/views/hrm/salary/calculation/modules/form.vue
@@ -17,6 +17,8 @@
/** 收入项 */
const incomeFields = [
  { key: 'baseSalary', label: '基本工资' },
  { key: 'postSalary', label: '岗位工资' },
  { key: 'senioritySalary', label: '工龄工资' },
  { key: 'performanceSalary', label: '绩效工资' },
  { key: 'overtimePay', label: '加班费' },
  { key: 'mealAllowance', label: '餐补' },