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
use crate::client::ParamLanguage;
use serde::{Deserialize, Serialize};

/// 创建用户参数
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct ParamsCreateUser {
    /// 员工唯一标识ID(不可修改),企业内必须唯一。
    /// 长度为1~64个字符,如果不传,将自动生成一个userid。
    #[serde(skip_serializing_if = "Option::is_none")]
    pub userid: Option<String>,
    /// 员工名称,长度最大80个字符
    pub name: String,
    /// 手机号码,企业内必须唯一,不可重复。
    /// 如果是国际号码、中国港澳台地区号码,请使用+xx-xxxxxx的格式。
    /// 如果公司注册地址是非中国大陆地区,则在添加大陆地区用户时,手机号要使用+86-xxxxxx格式。
    pub mobile: String,
    /// 是否号码隐藏:
    /// true:隐藏。隐藏手机号后,手机号在个人资料页隐藏,但仍可对其发DING、发起钉钉免费商务电话。
    /// false:不隐藏
    #[serde(skip_serializing_if = "Option::is_none")]
    pub hide_mobile: Option<bool>,
    /// 分机号,长度最大50个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub telephone: Option<String>,
    /// 员工工号,长度最大为50个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub job_number: Option<String>,
    /// 职位,长度最大为200个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,
    /// 员工个人邮箱,长度最大50个字符
    /// 说明 员工邮箱是唯一的,企业内不能重复
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    /// 员工的企业邮箱,长度最大100个字符
    /// 说明 需满足以下条件,此字段才生效:员工的企业邮箱已开通。
    #[serde(skip_serializing_if = "Option::is_none")]
    pub org_email: Option<String>,
    /// 员工的企业邮箱类型。
    /// profession: 标准版
    /// base:基础版
    #[serde(skip_serializing_if = "Option::is_none")]
    pub org_email_type: Option<String>,
    /// 办公地点,长度最大100个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub work_place: Option<String>,
    /// 备注,长度最大2000个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub remark: Option<String>,
    /// 所属部门id列表,每次调用最多传100个部门ID
    pub dept_id_list: Vec<i64>,
    /// 员工在对应的部门中的排序
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_order_list: Option<Vec<DeptOrder>>,
    /// 员工在对应的部门中的职位
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_title_list: Option<Vec<DeptTitle>>,
    /// 扩展属性,可以设置多种属性,最大长度2000个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extension: Option<String>,
    /// 是否开启高管模式,默认值false
    /// 开启后,手机号码对所有员工隐藏。
    /// 普通员工无法对其发DING、发起钉钉商务电话。
    /// 高管之间可以发DING、发起钉钉商务电话
    #[serde(skip_serializing_if = "Option::is_none")]
    pub senior_mode: Option<bool>,
    /// 入职时间,Unix时间戳,单位毫秒
    #[serde(skip_serializing_if = "Option::is_none")]
    pub hired_date: Option<i64>,
    /// 直属主管的userId
    #[serde(skip_serializing_if = "Option::is_none")]
    pub manager_userid: Option<u64>,
    /// 登录邮箱
    #[serde(skip_serializing_if = "Option::is_none")]
    pub login_email: Option<String>,
}

impl ParamsCreateUser {
    /// 简单初始化
    pub fn new(name: String, mobile: String, dept_id_list: Vec<i64>) -> ParamsCreateUser {
        Self {
            name,
            mobile,
            dept_id_list,
            ..Default::default()
        }
    }
}

#[derive(Debug, Deserialize, Serialize)]
pub struct DeptOrder {
    /// 部门ID
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_id: Option<i64>,
    /// 员工在部门中的排序
    #[serde(skip_serializing_if = "Option::is_none")]
    pub order: Option<i64>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct DeptTitle {
    /// 部门ID
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_id: Option<u64>,
    /// 员工在部门中的职位
    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,
}

#[derive(Debug, Deserialize, Serialize)]
pub struct ParamsUpdateUser {
    /// 员工的userId
    pub userid: String,
    /// 员工名称,长度最大80个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    /// 是否号码隐藏:
    /// true:隐藏
    /// 隐藏手机号后,手机号在个人资料页隐藏,但仍可对其发DING、发起钉钉免费商务电话。
    /// false:不隐藏
    #[serde(skip_serializing_if = "Option::is_none")]
    pub hide_mobile: Option<bool>,
    /// 分机号,长度最大50个字符。
    /// 说明 分机号是唯一的,企业内不能重复
    #[serde(skip_serializing_if = "Option::is_none")]
    pub telephone: Option<String>,
    /// 员工工号,长度最大50个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub job_number: Option<String>,
    /// 直属主管的userId
    #[serde(skip_serializing_if = "Option::is_none")]
    pub manager_userid: Option<String>,
    /// 职位,长度最大200个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub title: Option<String>,
    /// 员工邮箱,长度最大50个字符。
    /// 说明 员工邮箱是唯一的,企业内不能重复
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    /// 员工的企业邮箱。
    /// 说明 需满足以下条件,此字段才生效:员工的企业邮箱已开通
    #[serde(skip_serializing_if = "Option::is_none")]
    pub org_email: Option<String>,
    /// 办公地点,长度最大100个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub work_place: Option<String>,
    /// 备注,长度最大2000个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub remark: Option<String>,
    /// 所属部门ID列表
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_id_list: Option<String>,
    /// 员工在对应的部门中的排序
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_order_list: Option<Vec<DeptOrder>>,
    /// 员工在对应的部门中的职位
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dept_title_list: Option<Vec<DeptTitle>>,
    /// 扩展属性,可以设置多种属性,最大长度2000个字符
    #[serde(skip_serializing_if = "Option::is_none")]
    pub extension: Option<String>,
    /// 是否开启高管模式,默认值false
    /// 开启后,手机号码对所有员工隐藏。
    /// 普通员工无法对其发DING、发起钉钉商务电话。
    /// 高管之间可以发DING、发起钉钉商务电话
    #[serde(skip_serializing_if = "Option::is_none")]
    pub senior_mode: Option<bool>,
    /// 入职时间,Unix时间戳,单位毫秒
    #[serde(skip_serializing_if = "Option::is_none")]
    pub hired_date: Option<i64>,
    /// 通讯录语言,取值。
    /// zh_CN:中文(默认值)。
    /// en_US:英文
    #[serde(skip_serializing_if = "Option::is_none")]
    pub language: Option<ParamLanguage>,
    /// 强制更新的字段,支持清空指定的字段,多个字段之间使用逗号分隔。目前支持字段: manager_userid
    #[serde(skip_serializing_if = "Option::is_none")]
    pub force_update_fields: Option<String>,
}

#[derive(Debug, Deserialize, Serialize, Default)]
pub struct ParamsUserListSimpeByDept {
    /// 部门ID,如果是根部门,该参数传1。
    /// 企业内部应用,可调用获取部门列表获取
    /// 钉钉三方企业应用,可调用获取部门列表获取
    pub dept_id: i64,
    /// 分页查询的游标,最开始传0,后续传返回参数中的next_cursor值。
    pub cursor: i64,
    /// 分页长度,最大值100
    pub size: u64,
    /// 部门成员的排序规则:
    /// entry_asc:代表按照进入部门的时间升序。
    /// entry_desc:代表按照进入部门的时间降序。
    /// modify_asc:代表按照部门信息修改时间升序。
    /// modify_desc:代表按照部门信息修改时间降序。
    /// custom:代表用户定义(未定义时按照拼音)排序。
    /// 默认值:custom。
    #[serde(skip_serializing_if = "Option::is_none")]
    pub order_field: Option<OrderField>,
    /// 是否返回访问受限的员工
    #[serde(skip_serializing_if = "Option::is_none")]
    pub contain_access_limit: Option<bool>,
    /// 通讯录语言,取值。
    /// zh_CN:中文(默认值)。
    /// en_US:英文。
    #[serde(skip_serializing_if = "Option::is_none")]
    pub language: Option<ParamLanguage>,
}

#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum OrderField {
    EntryAsc,
    EntryDesc,
    ModifyAsc,
    ModifyDesc,
    Custom,
}

impl Default for OrderField {
    fn default() -> Self {
        OrderField::Custom
    }
}