{
  "version": "hr-0.3.0",
  "forms": [
    {
      "code": "HR-F01",
      "version": "hr-0.3.0",
      "title": "人员建档与核验",
      "grain": "一名人员一条名册记录",
      "api": "GET / POST / PATCH / DELETE /personnel/people",
      "table": "personnel_people",
      "entry": "people.html",
      "relation": "一人可有多次派遣；被业务引用后归档保留，不硬删。",
      "fields": [
        {
          "key": "personnelCode",
          "label": "人员编号",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_people.personnel_code",
          "rule": "必填；公司内唯一，不用姓名代替关联编号。"
        },
        {
          "key": "legalName",
          "label": "法定姓名",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_people.legal_name",
          "rule": "必填；修改已核验姓名需要重新核验。"
        },
        {
          "key": "displayName",
          "label": "显示姓名",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_people.display_name",
          "rule": "必填；用于现场识别。"
        },
        {
          "key": "phone",
          "label": "联系电话",
          "kind": "事实",
          "type": "电话",
          "mapping": "personnel_people.phone",
          "rule": "选填；只作联系信息。"
        },
        {
          "key": "roleName",
          "label": "岗位",
          "kind": "规则",
          "type": "文本",
          "mapping": "personnel_people.role_name",
          "rule": "必填；派遣岗位必须与订单匹配。"
        },
        {
          "key": "skills",
          "label": "技能",
          "kind": "事实",
          "type": "列表",
          "mapping": "personnel_people.skills_json",
          "rule": "选填；数组保存。"
        },
        {
          "key": "identityStatus",
          "label": "身份核验结果",
          "kind": "审批",
          "type": "枚举",
          "mapping": "personnel_people.identity_status",
          "rule": "待核验、已核验、未通过；审核人员操作。"
        },
        {
          "key": "identityMethod",
          "label": "身份核验方式",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_people.identity_method",
          "rule": "核验时记录依据和方式。"
        },
        {
          "key": "identityReference",
          "label": "核验凭据参考",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_people.identity_reference_masked",
          "rule": "仅保留脱敏末四位；不保存完整证件号。"
        },
        {
          "key": "qualificationStatus",
          "label": "岗位资格核验",
          "kind": "审批",
          "type": "枚举",
          "mapping": "personnel_people.qualification_status",
          "rule": "派遣前须已核验。"
        },
        {
          "key": "availability",
          "label": "可派遣情况",
          "kind": "规则",
          "type": "枚举",
          "mapping": "personnel_people.availability",
          "rule": "可派遣或不可派遣，另校验时间冲突。"
        },
        {
          "key": "status",
          "label": "在册状态",
          "kind": "规则",
          "type": "枚举",
          "mapping": "personnel_people.status",
          "rule": "在册或归档；归档不抹去历史。"
        },
        {
          "key": "notes",
          "label": "人员备注",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_people.notes",
          "rule": "选填，不放完整证件。"
        },
        {
          "key": "id",
          "label": "人员记录编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_people.id",
          "rule": "服务端生成，派遣引用此编号。"
        },
        {
          "key": "version",
          "label": "记录修订号",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_people.version",
          "rule": "更新必须提交此前读取的版本。"
        },
        {
          "key": "identityVerifiedBy",
          "label": "核验人",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_people.verified_by",
          "rule": "服务端记录审核者。"
        },
        {
          "key": "identityVerifiedAt",
          "label": "核验时间",
          "kind": "系统",
          "type": "日期时间",
          "mapping": "personnel_people.verified_at",
          "rule": "服务端时间。"
        }
      ]
    },
    {
      "code": "HR-F02",
      "version": "hr-0.3.0",
      "title": "班次标准",
      "grain": "一种班次的一版标准",
      "api": "GET / POST / PATCH /personnel/shifts",
      "table": "personnel_shifts",
      "entry": "shifts.html",
      "relation": "订单引用班次并保存快照；班次后续修订不改变旧订单。",
      "fields": [
        {
          "key": "code",
          "label": "班次编号",
          "kind": "规则",
          "type": "文本",
          "mapping": "personnel_shifts.code",
          "rule": "必填；稳定且唯一。"
        },
        {
          "key": "name",
          "label": "班次名称",
          "kind": "规则",
          "type": "文本",
          "mapping": "personnel_shifts.name",
          "rule": "必填；例如三小时白班。"
        },
        {
          "key": "startTime",
          "label": "计划上工时间",
          "kind": "规则",
          "type": "时间",
          "mapping": "personnel_shifts.start_time",
          "rule": "必填；津巴布韦当地时间。"
        },
        {
          "key": "endTime",
          "label": "计划下工时间",
          "kind": "规则",
          "type": "时间",
          "mapping": "personnel_shifts.end_time",
          "rule": "必填；早于开始表示次日，相等无效。"
        },
        {
          "key": "breaks",
          "label": "计划休息区间",
          "kind": "规则",
          "type": "区间列表",
          "mapping": "personnel_shifts.breaks_json",
          "rule": "每项开始、结束；班次内且不重叠；不代表实际休息。"
        },
        {
          "key": "standardMinutes",
          "label": "标准工作分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_shifts.standard_minutes",
          "rule": "计划跨度减计划休息，由系统计算。"
        },
        {
          "key": "notes",
          "label": "班次说明",
          "kind": "规则",
          "type": "长文本",
          "mapping": "personnel_shifts.notes",
          "rule": "选填，记录约定。"
        },
        {
          "key": "status",
          "label": "班次状态",
          "kind": "规则",
          "type": "枚举",
          "mapping": "personnel_shifts.status",
          "rule": "有效或归档；已引用记录保持快照。"
        },
        {
          "key": "id",
          "label": "班次记录编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_shifts.id",
          "rule": "服务端生成。"
        },
        {
          "key": "version",
          "label": "班次修订号",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_shifts.version",
          "rule": "版本化更新。"
        }
      ]
    },
    {
      "code": "HR-F03",
      "version": "hr-0.3.0",
      "title": "客户服务订单",
      "grain": "一个客户、一天、一个班次及岗位的一项需求",
      "api": "GET / POST / PATCH /personnel/orders",
      "table": "personnel_orders",
      "entry": "company.html",
      "relation": "一份订单对应多名派遣人员、多条履约记录和至多一份锁定结算。",
      "fields": [
        {
          "key": "clientName",
          "label": "客户名称",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_orders.client_name",
          "rule": "必填；当前客户按文本记录，尚未独立客户主档。"
        },
        {
          "key": "contractRef",
          "label": "合同编号",
          "kind": "引用",
          "type": "文本",
          "mapping": "personnel_orders.contract_ref",
          "rule": "必填；关联商务约定。"
        },
        {
          "key": "site",
          "label": "服务地点",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_orders.site",
          "rule": "必填。"
        },
        {
          "key": "serviceDate",
          "label": "服务日期",
          "kind": "事实",
          "type": "日期",
          "mapping": "personnel_orders.service_date",
          "rule": "必填；班次开始所在日期。"
        },
        {
          "key": "shiftTemplateId",
          "label": "班次标准",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_orders.shift_template_id",
          "rule": "必填；选择有效班次，不手输班次名称。"
        },
        {
          "key": "requestedPeople",
          "label": "需求人数",
          "kind": "规则",
          "type": "整数",
          "mapping": "personnel_orders.requested_people",
          "rule": "必填且大于零；派遣人数必须一致。"
        },
        {
          "key": "roleName",
          "label": "需求岗位",
          "kind": "规则",
          "type": "文本",
          "mapping": "personnel_orders.role_name",
          "rule": "必填；与名册岗位匹配。"
        },
        {
          "key": "currency",
          "label": "结算币种",
          "kind": "规则",
          "type": "文本",
          "mapping": "personnel_orders.currency",
          "rule": "必填；不同币种不得相加。"
        },
        {
          "key": "clientHourRate",
          "label": "客户每小时费率",
          "kind": "规则",
          "type": "金额",
          "mapping": "personnel_orders.client_hour_rate_minor",
          "rule": "必填非负；录入元，存储最小货币单位。"
        },
        {
          "key": "labourHourCost",
          "label": "人工每小时成本",
          "kind": "规则",
          "type": "金额",
          "mapping": "personnel_orders.labour_hour_cost_minor",
          "rule": "必填非负；与客户费率分开。"
        },
        {
          "key": "budgetAmount",
          "label": "订单预算",
          "kind": "规则",
          "type": "金额",
          "mapping": "personnel_orders.budget_amount_minor",
          "rule": "必填非负；不自动等于结算金额。"
        },
        {
          "key": "notes",
          "label": "需求备注",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_orders.notes",
          "rule": "选填。"
        },
        {
          "key": "plannedStartAt",
          "label": "计划开始",
          "kind": "计算",
          "type": "日期时间",
          "mapping": "personnel_orders.planned_start_at",
          "rule": "服务日期与班次落为具体带时区的时间。"
        },
        {
          "key": "plannedEndAt",
          "label": "计划结束",
          "kind": "计算",
          "type": "日期时间",
          "mapping": "personnel_orders.planned_end_at",
          "rule": "支持次日。"
        },
        {
          "key": "standardMinutes",
          "label": "每人标准分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_orders.standard_minutes",
          "rule": "创建时的班次标准快照。"
        },
        {
          "key": "shiftTemplateVersion",
          "label": "班次来源版本",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_orders.shift_template_version",
          "rule": "保留创建时版本。"
        },
        {
          "key": "shiftSnapshot",
          "label": "班次快照",
          "kind": "系统",
          "type": "对象",
          "mapping": "personnel_orders.shift_snapshot_json",
          "rule": "规则和计划休息快照；不随模板修改。"
        },
        {
          "key": "ruleVersion",
          "label": "计算规范版本",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_orders.rule_version",
          "rule": "新记录 hr-0.3.0；历史记录明确标记。"
        },
        {
          "key": "status",
          "label": "订单状态",
          "kind": "系统",
          "type": "枚举",
          "mapping": "personnel_orders.status",
          "rule": "由业务操作推进，不手工随意改值。"
        },
        {
          "key": "id",
          "label": "订单编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_orders.id",
          "rule": "所有履约记录引用它。"
        },
        {
          "key": "version",
          "label": "订单修订号",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_orders.version",
          "rule": "每次操作带原版本防止覆盖。"
        }
      ]
    },
    {
      "code": "HR-F04",
      "version": "hr-0.3.0",
      "title": "人员派遣与排班",
      "grain": "一个订单下的一人一次排班",
      "api": "POST /personnel/orders/:id/dispatch",
      "table": "personnel_assignments",
      "entry": "company.html#dispatch",
      "relation": "订单与人员通过派遣关联；出勤和绩效引用派遣编号。",
      "fields": [
        {
          "key": "personId",
          "label": "所选人员",
          "kind": "引用",
          "type": "多选",
          "mapping": "personnel_assignments.person_id",
          "rule": "从合格名册选择；每人产生一条派遣记录。"
        },
        {
          "key": "orderId",
          "label": "所选订单",
          "kind": "引用",
          "type": "编号",
          "mapping": "personnel_assignments.order_id",
          "rule": "上下文选择，不是新增表单。"
        },
        {
          "key": "plannedStartAt",
          "label": "排班开始",
          "kind": "计算",
          "type": "日期时间",
          "mapping": "personnel_assignments.planned_start_at",
          "rule": "继承订单具体计划；禁止同一人员排班重叠。"
        },
        {
          "key": "plannedEndAt",
          "label": "排班结束",
          "kind": "计算",
          "type": "日期时间",
          "mapping": "personnel_assignments.planned_end_at",
          "rule": "保留跨日的完整日期。"
        },
        {
          "key": "standardMinutes",
          "label": "标准分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_assignments.standard_minutes",
          "rule": "此人此派遣的标准额度。"
        },
        {
          "key": "schedule",
          "label": "排班依据",
          "kind": "系统",
          "type": "对象",
          "mapping": "personnel_assignments.schedule_json",
          "rule": "保留班次与来源信息。"
        },
        {
          "key": "personnelCode",
          "label": "人员编号快照",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_assignments.personnel_code",
          "rule": "派遣时保留。"
        },
        {
          "key": "displayName",
          "label": "姓名快照",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_assignments.display_name",
          "rule": "人员改名不改历史派遣。"
        },
        {
          "key": "roleName",
          "label": "岗位快照",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_assignments.role_name",
          "rule": "派遣时岗位。"
        },
        {
          "key": "status",
          "label": "派遣状态",
          "kind": "系统",
          "type": "枚举",
          "mapping": "personnel_assignments.status",
          "rule": "已派遣、已替换等。"
        },
        {
          "key": "id",
          "label": "派遣编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_assignments.id",
          "rule": "出勤、绩效关联键。"
        }
      ]
    },
    {
      "code": "HR-F05",
      "version": "hr-0.3.0",
      "title": "出勤与实际休息",
      "grain": "一名派遣人员的一段工作区间或一条缺勤说明",
      "api": "POST /personnel/orders/:id/timesheets",
      "table": "personnel_timesheets",
      "entry": "company.html#timesheet",
      "relation": "同一派遣可有多段不重叠出勤；累计扣减同一班次标准，不能分段规避加班。",
      "fields": [
        {
          "key": "assignmentId",
          "label": "派遣人员",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_timesheets.assignment_id",
          "rule": "必填；只能选当前订单有效派遣。"
        },
        {
          "key": "attendance",
          "label": "出勤情况",
          "kind": "事实",
          "type": "枚举",
          "mapping": "personnel_timesheets.attendance",
          "rule": "出勤或缺勤；缺勤不产生工时。"
        },
        {
          "key": "startedAt",
          "label": "实际上工",
          "kind": "事实",
          "type": "日期时间",
          "mapping": "personnel_timesheets.started_at",
          "rule": "出勤必填；津巴布韦时间输入，UTC 保存。"
        },
        {
          "key": "endedAt",
          "label": "实际下工",
          "kind": "事实",
          "type": "日期时间",
          "mapping": "personnel_timesheets.ended_at",
          "rule": "出勤必填；完整日期，晚于上工。"
        },
        {
          "key": "breaks",
          "label": "实际休息区间",
          "kind": "事实",
          "type": "区间列表",
          "mapping": "personnel_timesheets.breaks_json",
          "rule": "每项 startedAt、endedAt；工作区间内且不重叠。"
        },
        {
          "key": "noBreakConfirmed",
          "label": "确认本段无休息",
          "kind": "事实",
          "type": "确认",
          "mapping": "personnel_timesheets.no_break_confirmed",
          "rule": "无休息区间时必须明确确认，缺失不能默认为零。"
        },
        {
          "key": "replacementNote",
          "label": "出勤说明",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_timesheets.replacement_note",
          "rule": "异常、缺勤等说明。"
        },
        {
          "key": "breakMinutes",
          "label": "实际休息分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_timesheets.break_minutes",
          "rule": "实际休息各区间时长之和；不可手填。"
        },
        {
          "key": "effectiveMinutes",
          "label": "实际净工作分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_timesheets.effective_minutes",
          "rule": "下工减上工减休息。"
        },
        {
          "key": "regularMinutes",
          "label": "正常工作分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_timesheets.regular_minutes",
          "rule": "min(本段净工时,max(0,标准工时−此前净工时))。"
        },
        {
          "key": "overtimeMinutes",
          "label": "超出标准分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_timesheets.overtime_minutes",
          "rule": "本段净工时减本段正常工时；不是审核结果。"
        },
        {
          "key": "overtimeStatus",
          "label": "加班审核状态",
          "kind": "审批",
          "type": "枚举",
          "mapping": "personnel_timesheets.overtime_status",
          "rule": "有加班自动待审核；另由 HR-F07 决定。"
        },
        {
          "key": "standardMinutes",
          "label": "标准额度快照",
          "kind": "系统",
          "type": "分钟",
          "mapping": "personnel_timesheets.standard_minutes",
          "rule": "引用排班标准，旧记录不补造。"
        },
        {
          "key": "ruleVersion",
          "label": "计算规范",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_timesheets.rule_version",
          "rule": "记录使用的计算规则。"
        },
        {
          "key": "id",
          "label": "出勤记录编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_timesheets.id",
          "rule": "加班审核引用。"
        },
        {
          "key": "version",
          "label": "出勤修订号",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_timesheets.version",
          "rule": "审核并发控制。"
        }
      ]
    },
    {
      "code": "HR-F06",
      "version": "hr-0.3.0",
      "title": "绩效与服务结果",
      "grain": "一名派遣人员的一次成果记录",
      "api": "POST /personnel/orders/:id/performance",
      "table": "personnel_performance",
      "entry": "company.html#performance",
      "relation": "绩效引用派遣，与工时分别记录，不把评分当工时。",
      "fields": [
        {
          "key": "assignmentId",
          "label": "派遣人员",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_performance.assignment_id",
          "rule": "当前订单有效派遣。"
        },
        {
          "key": "quantity",
          "label": "完成数量",
          "kind": "事实",
          "type": "数值",
          "mapping": "personnel_performance.quantity",
          "rule": "非负，必须连同单位解释。"
        },
        {
          "key": "unit",
          "label": "数量单位",
          "kind": "规则",
          "type": "文本",
          "mapping": "personnel_performance.unit",
          "rule": "必填；不同单位不能直接相加。"
        },
        {
          "key": "qualityScore",
          "label": "质量评分",
          "kind": "事实",
          "type": "数值",
          "mapping": "personnel_performance.quality_score",
          "rule": "0–100；评价事实，不自动代表产量。"
        },
        {
          "key": "evidenceBasis",
          "label": "评价依据",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_performance.evidence_basis",
          "rule": "必填，可注明附件编号。"
        },
        {
          "key": "reworkOrIncident",
          "label": "返工与异常",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_performance.rework_or_incident",
          "rule": "选填。"
        },
        {
          "key": "id",
          "label": "绩效记录编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_performance.id",
          "rule": "服务端生成。"
        }
      ]
    },
    {
      "code": "HR-F07",
      "version": "hr-0.3.0",
      "title": "加班审核",
      "grain": "一条出勤中待审核加班的一次决定",
      "api": "POST /personnel/timesheets/:id/overtime",
      "table": "personnel_timesheets",
      "entry": "management.html",
      "relation": "读取 HR-F05 计算的加班事实；审批改变计费资格，不改事实时长。",
      "fields": [
        {
          "key": "id",
          "label": "出勤记录",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_timesheets.id",
          "rule": "所选出勤编号。"
        },
        {
          "key": "status",
          "label": "加班决定",
          "kind": "审批",
          "type": "枚举",
          "mapping": "personnel_timesheets.overtime_status",
          "rule": "批准或拒绝；本期整段审核，不提供部分批准。"
        },
        {
          "key": "timesheetVersion",
          "label": "出勤版本",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_timesheets.version",
          "rule": "提交当前版本，冲突需重新读取。"
        },
        {
          "key": "overtimeDecidedBy",
          "label": "审核人",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_timesheets.overtime_decided_by",
          "rule": "从登录会话记录。"
        },
        {
          "key": "overtimeDecidedAt",
          "label": "审核时间",
          "kind": "系统",
          "type": "日期时间",
          "mapping": "personnel_timesheets.overtime_decided_at",
          "rule": "服务端时间。"
        }
      ]
    },
    {
      "code": "HR-F08",
      "version": "hr-0.3.0",
      "title": "客户验收",
      "grain": "一份订单的一次客户验收意见",
      "api": "POST /personnel/orders/:id/acceptance",
      "table": "personnel_acceptance",
      "entry": "management.html",
      "relation": "订单提交后方可验收；退回进入返工，接受后才可结算。",
      "fields": [
        {
          "key": "decision",
          "label": "验收决定",
          "kind": "审批",
          "type": "枚举",
          "mapping": "personnel_acceptance.decision",
          "rule": "接受、拒绝、争议、退回。"
        },
        {
          "key": "reviewerName",
          "label": "客户验收人",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_acceptance.reviewer_name",
          "rule": "必填；系统另记录操作人。"
        },
        {
          "key": "reason",
          "label": "验收说明",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_acceptance.reason",
          "rule": "记录决定依据。"
        },
        {
          "key": "orderId",
          "label": "订单编号",
          "kind": "引用",
          "type": "编号",
          "mapping": "personnel_acceptance.order_id",
          "rule": "与服务订单关联。"
        },
        {
          "key": "id",
          "label": "验收记录编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_acceptance.id",
          "rule": "保留历次意见，不覆盖。"
        }
      ]
    },
    {
      "code": "HR-F09",
      "version": "hr-0.3.0",
      "title": "结算核对与锁定",
      "grain": "一份订单的一份锁定结算",
      "api": "POST /personnel/orders/:id/settlement-preview ; POST /personnel/orders/:id/transition",
      "table": "personnel_settlements",
      "entry": "management.html",
      "relation": "必须已接受且无待审核加班、未完成附件；锁定后不能覆盖，修改应走后续独立调整流程。",
      "fields": [
        {
          "key": "orderId",
          "label": "服务订单",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_settlements.order_id",
          "rule": "读取订单及其履约记录。"
        },
        {
          "key": "regularMinutes",
          "label": "正常分钟合计",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_settlements.regular_minutes",
          "rule": "同一订单正常工时求和。"
        },
        {
          "key": "approvedOvertimeMinutes",
          "label": "批准加班分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_settlements.approved_overtime_minutes",
          "rule": "只计已批准加班。"
        },
        {
          "key": "billableMinutes",
          "label": "本期结算分钟",
          "kind": "计算",
          "type": "分钟",
          "mapping": "personnel_settlements.billable_minutes",
          "rule": "正常分钟＋已批准加班。"
        },
        {
          "key": "currency",
          "label": "结算币种",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_settlements.currency",
          "rule": "订单币种快照。"
        },
        {
          "key": "revenueMinor",
          "label": "客户服务收入",
          "kind": "计算",
          "type": "最小货币单位",
          "mapping": "personnel_settlements.revenue_minor",
          "rule": "结算分钟×客户时费率÷60，按货币最小单位四舍五入。"
        },
        {
          "key": "directLabourCostMinor",
          "label": "直接人工成本",
          "kind": "计算",
          "type": "最小货币单位",
          "mapping": "personnel_settlements.direct_labour_cost_minor",
          "rule": "本期采用相同结算分钟×人工时费率÷60。"
        },
        {
          "key": "grossDifferenceMinor",
          "label": "收入减直接人工",
          "kind": "计算",
          "type": "最小货币单位",
          "mapping": "personnel_settlements.gross_difference_minor",
          "rule": "不含其他费用，不称净利润。"
        },
        {
          "key": "snapshot",
          "label": "结算依据快照",
          "kind": "系统",
          "type": "对象",
          "mapping": "personnel_settlements.snapshot_json",
          "rule": "保存来源与结果，锁定后不随上游变动。"
        },
        {
          "key": "locked",
          "label": "锁定结果",
          "kind": "系统",
          "type": "确认",
          "mapping": "personnel_settlements.locked",
          "rule": "通过服务端验收条件后置为锁定。"
        },
        {
          "key": "id",
          "label": "结算编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_settlements.id",
          "rule": "唯一关联订单。"
        },
        {
          "key": "version",
          "label": "结算版本",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_settlements.version",
          "rule": "保留锁定版本。"
        }
      ]
    },
    {
      "code": "HR-F10",
      "version": "hr-0.3.0",
      "title": "照片、视频与证据",
      "grain": "一个订单阶段的一份附件",
      "api": "POST /personnel/media/init ; PUT /personnel/media/:id",
      "table": "personnel_media",
      "entry": "company.html#media",
      "relation": "D1 存元数据；R2 存字节；运营按订单、阶段和附件编号检索。不是另建一份孤立图库。",
      "fields": [
        {
          "key": "orderId",
          "label": "关联订单",
          "kind": "引用",
          "type": "编号",
          "mapping": "personnel_media.order_id",
          "rule": "当前订单。"
        },
        {
          "key": "stage",
          "label": "采集环节",
          "kind": "事实",
          "type": "选择",
          "mapping": "personnel_media.stage",
          "rule": "派遣、到场、出勤、绩效、验收。"
        },
        {
          "key": "purpose",
          "label": "附件用途",
          "kind": "事实",
          "type": "文本",
          "mapping": "personnel_media.purpose",
          "rule": "必填，例如到场确认。"
        },
        {
          "key": "description",
          "label": "现场说明",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_media.description",
          "rule": "必填；模拟材料必须标明模拟。"
        },
        {
          "key": "capturedAt",
          "label": "拍摄时间",
          "kind": "事实",
          "type": "日期时间",
          "mapping": "personnel_media.captured_at",
          "rule": "可选；不能拿上传时间冒充拍摄时间。"
        },
        {
          "key": "originalName",
          "label": "文件名",
          "kind": "事实",
          "type": "文件",
          "mapping": "personnel_media.original_name",
          "rule": "浏览器读取文件名称。"
        },
        {
          "key": "contentType",
          "label": "文件类型",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_media.content_type",
          "rule": "图像或视频白名单；服务端校验。"
        },
        {
          "key": "sizeBytes",
          "label": "申报文件大小",
          "kind": "系统",
          "type": "字节",
          "mapping": "personnel_media.size_bytes",
          "rule": "浏览器读取；当前每份不超过 25 MiB。"
        },
        {
          "key": "durationSeconds",
          "label": "视频时长",
          "kind": "系统",
          "type": "秒",
          "mapping": "personnel_media.duration_seconds",
          "rule": "浏览器读取视频元数据；服务端验证数值，不宣称已做云端转码校验。"
        },
        {
          "key": "byteCount",
          "label": "实收字节",
          "kind": "系统",
          "type": "字节",
          "mapping": "personnel_media.byte_count",
          "rule": "服务端从真实文件计算。"
        },
        {
          "key": "contentHash",
          "label": "内容校验值",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_media.content_hash",
          "rule": "服务端计算，用于一致性。"
        },
        {
          "key": "status",
          "label": "上传状态",
          "kind": "系统",
          "type": "枚举",
          "mapping": "personnel_media.status",
          "rule": "待上传、已上传、失败、已删除。"
        },
        {
          "key": "failureReason",
          "label": "失败原因",
          "kind": "系统",
          "type": "文本",
          "mapping": "personnel_media.failure_reason",
          "rule": "运营排障用。"
        },
        {
          "key": "objectKey",
          "label": "对象存储位置",
          "kind": "系统",
          "type": "私有文本",
          "mapping": "personnel_media.object_key",
          "rule": "服务端私有，不向页面暴露；按附件编号授权访问。"
        },
        {
          "key": "id",
          "label": "附件编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_media.id",
          "rule": "业务关联标识。"
        },
        {
          "key": "version",
          "label": "附件修订号",
          "kind": "系统",
          "type": "整数",
          "mapping": "personnel_media.version",
          "rule": "删除或变更使用版本校验。"
        }
      ]
    },
    {
      "code": "HR-F11",
      "version": "hr-0.3.0",
      "title": "派遣替换",
      "grain": "一名原派遣与一名替代人员的关系",
      "api": "POST /personnel/orders/:id/assignments/replacement",
      "table": "personnel_assignments",
      "entry": "company.html#replacement",
      "relation": "原派遣保留为已替换，新记录指向原记录。本期只支持原人员尚未记录出勤的替换。",
      "fields": [
        {
          "key": "originalAssignmentId",
          "label": "原派遣人员",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_assignments.replaced_assignment_id",
          "rule": "选当前有效派遣；有出勤时禁止直接替换。"
        },
        {
          "key": "personId",
          "label": "替代人员",
          "kind": "引用",
          "type": "选择",
          "mapping": "personnel_assignments.person_id",
          "rule": "需合格、可用且无排班冲突。"
        },
        {
          "key": "reason",
          "label": "替换原因",
          "kind": "事实",
          "type": "长文本",
          "mapping": "personnel_assignments.replacement_reason",
          "rule": "必填；原记录保留。"
        },
        {
          "key": "id",
          "label": "新派遣编号",
          "kind": "系统",
          "type": "编号",
          "mapping": "personnel_assignments.id",
          "rule": "服务端生成。"
        }
      ]
    }
  ],
  "common": [
    {
      "key": "expectedVersion",
      "meaning": "变更已有记录必须附带此前读取的记录版本；冲突后重新读取，不覆盖。"
    },
    {
      "key": "Idempotency-Key",
      "meaning": "每次新提交使用独立请求编号；网络重试沿用原编号，防止重复建单。"
    },
    {
      "key": "created_at / updated_at / created_by",
      "meaning": "服务端审计事实；不是现场自行输入。"
    }
  ],
  "kinds": {
    "事实": "人或设备观察到的事件、数值、时间，不凭公式臆造。",
    "引用": "选择已存在的业务记录，保存编号。",
    "规则": "商业约定或班次标准，有来源和生效版本。",
    "计算": "由事实及规则计算，页面只读，服务端重算。",
    "审批": "授权人员作出的决定，保留人和时间。",
    "系统": "编号、版本、审计及保存状态，由服务端维护。"
  }
}
