# 考勤公出规则接口文档

本文档覆盖 HRO 管理后台公出规则相关接口，对应页面：

```text
/dhr/attendancePro/admin/pc/home.html#/businessOutDetail   (公出规则组)
/dhr/attendancePro/admin/pc/home.html#/businessOutCategory (公出类别)
```

## 基本信息

本地服务地址：

```text
http://127.0.0.1:8080
```

除 `/api/auth/login` 外，接口需要携带 Bearer Token：

```http
Authorization: Bearer <token>
```

当前公出规则数据为内存数据，服务重启后恢复默认值。

## 通用响应

EHR 旧接口响应：

```json
{
  "code": 0,
  "costTimes": 0,
  "data": {},
  "message": "请求成功"
}
```

## 登录

### POST `/api/auth/login`

请求：

```json
{
  "account": "admin",
  "password": "Admin@123456"
}
```

响应：

```json
{
  "code": 0,
  "message": "请求成功",
  "data": {
    "token": "...",
    "tokenType": "Bearer",
    "expiresAt": "...",
    "user": {}
  }
}
```

## 公出规则组 / officialTemplateGroup

### POST `/dhr/admin/atd/officialTemplateGroup/index`

获取公出规则组编辑页面初始化数据。

请求体可为空 `{}`。

响应：

```json
{
  "code": 0,
  "data": {
    "prefix": "AO",
    "officialTypes": [
      { "id": "9017397430310779028_goOut", "value": "9017397430310779028_goOut", "code": "4865855570653620763", "display": "外出", "name": "外出", "disabled": false },
      { "id": "9017397430310779028_businessTrip", "value": "9017397430310779028_businessTrip", "code": "7263471228370938879", "display": "出差", "name": "出差", "disabled": false }
    ],
    "dateTypes": [
      { "id": "workDay", "value": "workDay", "display": "工作日", "type": "workDay", "disabled": false },
      { "id": "restDay", "value": "restDay", "display": "休息日", "type": "restDay", "disabled": false },
      { "id": "holiday", "value": "holiday", "display": "节假日", "type": "holiday", "disabled": false }
    ],
    "calcTypes": [
      { "id": "natural", "value": "natural", "display": "自然日" },
      { "id": "workDay", "value": "workDay", "display": "工作日" }
    ],
    "convertTypes": [
      { "id": "round", "value": "round", "display": "四舍五入" },
      { "id": "floor", "value": "floor", "display": "向下取整" },
      { "id": "ceil", "value": "ceil", "display": "向上取整" }
    ],
    "roundingModes": [
      { "id": "halfUp", "value": "halfUp", "display": "四舍五入" },
      { "id": "down", "value": "down", "display": "向下取整" },
      { "id": "up", "value": "up", "display": "向上取整" }
    ],
    "classList": [
      { "id": "day", "value": "day", "display": "天", "unitTime": "8", "disabled": false },
      { "id": "hour", "value": "hour", "display": "小时", "unitTime": "1", "disabled": false }
    ]
  }
}
```

### POST `/dhr/admin/atd/officialTemplateGroup/list`

分页查询公出规则组。

请求：

```json
{
  "pageIndex": "1",
  "pageSize": "20",
  "queryParam": [
    {
      "expression": "in",
      "field": "state",
      "value": "0"
    }
  ],
  "sortFields": []
}
```

响应：

```json
{
  "code": 0,
  "data": {
    "dataList": [
      {
        "id": "4711730941682665776",
        "code": "4711730941682665776",
        "prefix": "AO",
        "name": "默认公出规则",
        "mgrOrgId": "9017397430310779031",
        "mgrOrgName": "津冀大区-李璨",
        "mgrOrgType": "department",
        "sourceType": "预置",
        "state": 0,
        "rightType": 0
      }
    ],
    "needTotal": true,
    "pageIndex": 1,
    "pageSize": 20,
    "queryParam": [],
    "sortFields": [],
    "total": 1
  }
}
```

支持按 `state`（精确匹配）和 `name`（模糊匹配）筛选。

### POST `/dhr/admin/atd/officialTemplateGroup/save`

新建公出规则组。

请求：

```json
{
  "officialTemplateGroup": {
    "code": "编码（可选，为空自动生成）",
    "name": "规则组名称",
    "prefix": "AO",
    "mgrOrg": [
      {
        "id": "9017397430310779030",
        "name": "瑞鹤医疗测试",
        "typeFlag": "company"
      }
    ],
    "mgrOrgId": "9017397430310779030",
    "mgrOrgName": "瑞鹤医疗测试",
    "mgrOrgType": "company",
    "state": 0,
    "rightType": 0
  },
  "officialTemplateMap": {
    "9017397430310779028_businessTrip": {
      "calcType": "natural",
      "convertType": "round",
      "dateTypeIds": ["workDay", "restDay", "holiday"],
      "defaultClassId": "day",
      "officialTypeId": "9017397430310779028_businessTrip",
      "officialTypeName": "出差",
      "roundingMode": "halfUp",
      "scale": "0",
      "unit": "day",
      "unitTime": "8"
    },
    "9017397430310779028_goOut": {
      "calcType": "natural",
      "convertType": "round",
      "dateTypeIds": ["workDay", "restDay", "holiday"],
      "defaultClassId": "day",
      "officialTypeId": "9017397430310779028_goOut",
      "officialTypeName": "外出",
      "roundingMode": "halfUp",
      "scale": "0",
      "unit": "day",
      "unitTime": "8"
    }
  }
}
```

- 新建的规则组 `sourceType` 为"自定义"，更新时保留原有 `sourceType`（除非请求显式覆盖）。
- `officialTemplateMap` 以公出类别 id 为 key，可部分传递。

响应返回保存后的 `officialTemplateGroup` 字段。

### GET `/dhr/admin/atd/officialTemplateGroup/detail?id=...`

查询公出规则组详情，同时返回模板映射。

响应：

```json
{
  "code": 0,
  "data": {
    "officialTemplateGroup": {},
    "officialTemplateMap": {}
  }
}
```

### POST `/dhr/admin/atd/officialTemplateGroup/update`

更新公出规则组，请求格式与 save 一致。行为和 save 相同（幂等保存）。

### POST `/dhr/admin/atd/officialTemplateGroup/delete`

删除公出规则组（同时清除对应模板映射）。

请求：

```json
{
  "ids": ["4711730941682665776"]
}
```

响应 `data` 为 `true`。

## 公出类别 / officialType

### POST `/dhr/admin/atd/officialType/index`

获取公出类别编辑页面初始化数据。

请求体可为空 `{}`。

响应：

```json
{
  "code": 0,
  "data": {
    "prefix": "AM",
    "dateTypes": [],
    "classList": []
  }
}
```

### POST `/dhr/admin/atd/officialType/list`

分页查询公出类别。

请求：

```json
{
  "pageIndex": "1",
  "pageSize": "20",
  "queryParam": [],
  "sortFields": []
}
```

响应默认包含"外出"和"出差"两条。

### POST `/dhr/admin/atd/officialType/save`

新建公出类别。请求体为直接 JSON（无嵌套包装）。

请求：

```json
{
  "code": "编码（可选，为空自动生成）",
  "name": "类别名称",
  "prefix": "AM",
  "dateType": "workDay",
  "dateTypeName": "工作日",
  "defaultClassId": "day",
  "defaultClassName": "天",
  "state": 0
}
```

新建的类别 `sourceType` 为"自定义"，更新时保留原有 `sourceType`（除非请求显式覆盖）。

### POST `/dhr/admin/atd/officialType/update`

更新公出类别，请求格式与 save 一致。行为和 save 相同（幂等保存）。

### POST `/dhr/admin/atd/officialType/delete`

删除公出类别。

请求：

```json
{
  "ids": ["9017397430310779028_goOut"]
}
```

响应 `data` 为 `true`。
