meegle/
structs.rs

1use derive_builder::Builder;
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5#[derive(Clone, Debug, Deserialize, Serialize)]
6pub struct Business {
7    pub id: String,
8    pub name: String,
9    pub project: String,
10    pub labels: Vec<String>,
11    pub role_owners: std::collections::HashMap<String, RoleOwner>,
12    pub watchers: Vec<String>,
13    pub order: i64,
14    pub super_masters: Vec<String>,
15    pub parent: String,
16    pub disabled: bool,
17    pub level_id: i64,
18    pub children: Option<Vec<Business>>,
19}
20
21#[derive(Clone, Debug, Deserialize, Serialize)]
22pub struct Comment {
23    pub id: i64,
24    pub work_item_id: i64,
25    pub work_item_type_key: String,
26    pub created_at: i64,
27    pub operator: String,
28    pub content: String,
29}
30
31#[derive(Clone, Debug, Deserialize, Serialize)]
32#[allow(non_snake_case)]
33pub struct CompInfo {
34    pub ID: String,
35    pub name: String,
36    pub ViewScopeKey: Option<String>,
37    pub WorkItemTypeKey: String,
38    pub ProjectKey: String,
39    pub CreatedBy: String,
40    pub CreatedAt: i64,
41    pub SearchHit: Vec<String>,
42}
43
44#[derive(Clone, Debug, Deserialize, Serialize)]
45pub struct ConfirmForm {
46    pub action: i64,
47    pub state_key: String,
48}
49
50#[derive(Clone, Debug, Deserialize, Serialize)]
51pub struct Connection {
52    pub source_state_key: String,
53    pub target_state_key: String,
54    pub transition_id: Option<i64>,
55}
56
57#[derive(Clone, Debug, Deserialize, Serialize)]
58pub struct DefaultValue {
59    pub default_appear: i64,
60    // TODO: interface{} 类型
61    pub value: Option<Value>,
62}
63
64#[derive(Clone, Debug, Deserialize, Serialize)]
65pub struct Deliverable {
66    pub deliverable_uuid: String,
67    pub deliverable_type: String,
68    pub deliverable_info: DeliverableInfo,
69}
70
71#[derive(Clone, Debug, Deserialize, Serialize)]
72pub struct DeliverableInfo {
73    pub name: String,
74    pub work_item_id: i64,
75    pub associated_deliverables_template: i64,
76    pub template_resources: bool,
77    pub template_type: String,
78    pub deleted: bool,
79    pub delivery_related_info: DeliveryRelatedInfo,
80}
81
82#[derive(Clone, Debug, Deserialize, Serialize)]
83pub struct DeliveryRelatedInfo {
84    pub root_work_item: DeliveryRelatedInfoItem,
85    pub source_work_item: DeliveryRelatedInfoItem,
86}
87
88#[derive(Clone, Debug, Deserialize, Serialize)]
89pub struct DeliveryRelatedInfoItem {
90    pub project_key: String,
91    pub work_item_id: i64,
92    pub work_item_type_key: String,
93    pub name: String,
94}
95
96#[derive(Clone, Debug, Deserialize, Serialize)]
97pub struct ExPand {
98    pub need_workflow: Option<bool>,
99    pub need_multi_text: Option<bool>,
100    pub relation_fields_detail: Option<bool>,
101    pub need_union_deliverable: Option<bool>,
102    pub need_wbs_relation_chain_entity: Option<bool>,
103    pub need_wbs_relation_chain_path: Option<bool>,
104}
105
106#[derive(Clone, Debug, Deserialize, Serialize)]
107pub struct FieldConf {
108    pub is_required: i64,
109    pub is_visibility: i64,
110    pub is_validity: i64,
111    pub role_assign: Option<Vec<RoleAssign>>,
112    pub field_name: String,
113    pub field_key: String,
114    pub field_type_key: String,
115    pub default_value: Option<DefaultValue>,
116    pub label: Option<String>,
117    pub options: Option<Vec<OptionConf>>,
118    pub compound_fields: Option<Vec<FieldConf>>,
119}
120
121#[derive(Clone, Debug, Deserialize, Serialize)]
122pub struct FieldValue {
123    pub value: String,
124    pub label: String,
125    pub disabled: i64,
126    pub action: i64,
127    pub children: Vec<FieldValue>,
128    pub config_order: i64,
129    pub parent_value: String,
130}
131
132#[derive(Builder, Clone, Debug, Deserialize, Default, Serialize)]
133#[builder(setter(into, strip_option), default)]
134pub struct FieldValuePair {
135    pub field_key: Option<String>,
136    pub field_alias: Option<String>,
137    // TODO: Object 类型
138    pub field_value: Value,
139    pub field_type_key: Option<String>,
140    pub target_state: Option<TargetState>,
141}
142
143#[derive(Clone, Debug, Deserialize, Serialize)]
144pub struct FinishhedInfo {
145    pub project_key: String,
146    pub work_item_id: i64,
147    pub finished_infos: Vec<FinishedInfoItem>,
148}
149
150#[derive(Clone, Debug, Deserialize, Serialize)]
151pub struct FinishedInfoItem {
152    pub node_id: String,
153    pub summary_mode: String,
154    pub opinion: Option<FinishedOpinionInfo>,
155    pub conclusion: Option<FinishedConclusionInfo>,
156}
157
158#[derive(Clone, Debug, Deserialize, Serialize)]
159pub struct FinishedOpinionInfo {
160    pub finished_opinion_result: Option<String>,
161    pub owners_finished_opinion_result: Option<Vec<FinishedOwnerOpinionInfo>>,
162}
163
164#[derive(Clone, Debug, Deserialize, Serialize)]
165pub struct FinishedConclusionOption {
166    pub node_id: String,
167    pub finished_conclusion_option: Vec<FinishedConclusionResultItem>,
168    pub finished_owners_conclusion_option: Vec<FinishedConclusionResultItem>,
169    pub finished_overall_conclusion_option: Vec<FinishedConclusionResultItem>,
170}
171
172#[derive(Clone, Debug, Deserialize, Serialize)]
173pub struct FinishedConclusionResultItem {
174    pub key: String,
175    pub label: String,
176    pub origin_label: String,
177}
178
179#[derive(Clone, Debug, Deserialize, Serialize)]
180pub struct FinishedOwnerOpinionInfo {
181    pub owner: String,
182    pub finished_opinion_result: Option<String>,
183}
184
185#[derive(Clone, Debug, Deserialize, Serialize)]
186pub struct FinishedConclusionInfo {
187    pub finished_conclusion_result: Option<FinishedConclusionInfoItem>,
188    pub owners_finished_conclusion_result: Option<Vec<FinishedOwnerConclusionInfo>>,
189}
190
191#[derive(Clone, Debug, Deserialize, Serialize)]
192pub struct FinishedConclusionInfoItem {
193    pub key: String,
194    pub label: String,
195    pub origin_label: String,
196}
197
198#[derive(Clone, Debug, Deserialize, Serialize)]
199pub struct FinishedOwnerConclusionInfo {
200    pub owner: String,
201    pub finished_conclusion_result: Option<FinishedConclusionInfoItem>,
202}
203
204#[derive(Clone, Debug, Deserialize, Serialize)]
205pub struct FixView {
206    pub view_id: String,
207    pub name: String,
208    pub created_by: String,
209    pub created_at: i64,
210    pub modified_by: String,
211    pub work_item_id_list: Vec<i64>,
212    pub editable: bool,
213}
214
215#[derive(Clone, Debug, Deserialize, Serialize)]
216pub struct MultiText {
217    pub field_key: String,
218    pub doc_text: MultiTextDetail,
219}
220
221#[derive(Clone, Debug, Deserialize, Serialize)]
222pub struct MultiTextDetail {
223    pub doc: Value,      // TODO: doc 类型
224    pub doc_text: Value, // TODO: doc_text 类型
225    pub is_empty: bool,
226    pub notify_user_list: Vec<String>,
227    pub notify_user_type: String,
228}
229
230#[derive(Clone, Debug, Deserialize, Serialize)]
231pub struct MultiSignal {
232    pub status: String,
233    pub detail: Vec<MultiSignalDetail>,
234}
235
236#[derive(Clone, Debug, Deserialize, Serialize)]
237pub struct MultiSignalDetail {
238    pub id: String,
239    pub title: String,
240    pub status: String,
241    pub view_link: String,
242    pub query_link: QueryLink,
243}
244
245#[derive(Clone, Debug, Deserialize, Serialize)]
246pub struct NodeTask {
247    pub id: String,
248    pub state_key: String,
249    pub sub_tasks: Vec<SubTask>,
250}
251
252#[derive(Clone, Debug, Deserialize, Serialize)]
253pub struct NodeBasicInfo {
254    pub id: String,
255    pub name: String,
256    pub owners: Vec<String>,
257}
258
259#[derive(Clone, Debug, Deserialize, Serialize)]
260pub struct NodesConnections {
261    pub workflow_nodes: Option<Vec<WorkflowNode>>,
262    pub connections: Vec<Connection>,
263    pub state_flow_nodes: Option<Vec<StateFlowNode>>,
264}
265
266#[derive(Clone, Debug, Deserialize, Serialize)]
267pub struct FieldOption {
268    pub label: String,
269    pub value: String,
270    pub children: Option<Vec<FieldOption>>,
271}
272
273#[derive(Clone, Debug, Deserialize, Serialize)]
274pub struct OptionConf {
275    pub label: String,
276    pub value: String,
277    pub is_visibility: i64,
278    pub is_disabled: i64,
279    pub children: Option<Vec<OptionConf>>,
280}
281
282#[derive(Clone, Debug, Deserialize, Serialize)]
283pub struct PagedWorkItemIds {
284    pub work_item_ids: Vec<i64>,
285    pub page_num: i64,
286    pub page_size: i64,
287    pub total: i64,
288}
289
290#[derive(Clone, Debug, Deserialize, Serialize)]
291pub struct Project {
292    pub project_key: String,
293    pub name: String,
294    pub simple_name: String,
295    pub administrators: Vec<String>,
296}
297
298#[derive(Clone, Debug, Deserialize, Serialize)]
299pub struct ProjectRelationInstance {
300    pub work_item_id: i64,
301    pub work_item_name: String,
302    pub instances: Vec<RelationInstance>,
303}
304
305#[derive(Clone, Debug, Deserialize, Serialize)]
306pub struct ProjectRelationRule {
307    pub remote_project_key: String,
308    pub remote_project_name: String,
309    pub rules: Vec<RelationRule>,
310}
311
312#[derive(Clone, Debug, Deserialize, Serialize)]
313pub struct QueryLink {
314    pub url: String,
315    pub method: String,
316    // TODO: interface{} 类型
317    pub headers: Value,
318    // TODO: interface{} 类型
319    pub body: Value,
320    // TODO: interface{} 类型
321    pub params: Value,
322}
323
324#[derive(Clone, Debug, Deserialize, Serialize)]
325pub struct RoleOwner {
326    pub role: String,
327    pub name: Option<String>,
328    pub owners: Vec<String>,
329}
330
331#[derive(Clone, Debug, Deserialize, Serialize)]
332pub struct RoleAssign {
333    pub role: String,
334    pub name: String,
335    pub default_appear: i64,
336    pub deletable: i64,
337    pub member_assign: i64,
338    pub members: Option<Vec<String>>,
339}
340
341#[derive(Clone, Debug, Deserialize, Serialize)]
342pub struct RoleConfDetail {
343    pub id: String,
344    pub name: String,
345    pub is_owner: bool,
346    pub role_appear_mode: i64,
347    pub deletable: bool,
348    pub auto_enter_group: bool,
349    pub member_assign_mode: i64,
350    pub members: Option<Vec<String>>,
351    pub is_member_multi: bool,
352}
353
354#[derive(Clone, Debug, Deserialize, Serialize)]
355pub struct RelationRule {
356    pub id: String,
357    pub name: String,
358    pub disabled: i64,
359    pub work_item_relation_id: String,
360    pub work_item_relation_name: String,
361    pub current_work_item_type_key: String,
362    pub current_work_item_type_name: String,
363    pub remote_work_item_type_key: String,
364    pub remote_work_item_type_name: String,
365    pub chat_group_merge: i64,
366}
367
368#[derive(Builder, Clone, Debug, Deserialize, Default, Serialize)]
369#[builder(setter(into, strip_option), default)]
370pub struct RelationDetail {
371    pub work_item_type_key: String,
372    pub work_item_type_name: Option<String>,
373    pub project_key: String,
374    pub project_name: Option<String>,
375}
376
377#[derive(Clone, Debug, Deserialize, Serialize)]
378pub struct RelationInstance {
379    pub relation_work_item_id: i64,
380    pub relation_work_item_name: String,
381    pub relation_work_item_type_name: String,
382    pub relation_work_item_type_key: String,
383    pub project_relation_rule_id: String,
384    pub project_relation_rule_name: String,
385    pub relation_project_key: String,
386    pub relation_project_name: String,
387}
388
389#[derive(Clone, Debug, Deserialize, Serialize)]
390pub struct RelationBindInstance {
391    pub work_item_id: i64,
392    pub chat_group_merge: i64,
393}
394
395#[derive(Builder, Clone, Debug, Deserialize, Default, Serialize)]
396#[builder(setter(into, strip_option), default)]
397pub struct Schedule {
398    pub owners: Option<Vec<String>>,
399    pub estimate_start_date: Option<i64>,
400    pub estimate_end_date: Option<i64>,
401    pub points: Option<f64>,
402    pub is_auto: Option<bool>,
403    pub actual_work_time: Option<f64>,
404}
405
406#[derive(Clone, Debug, Deserialize, Serialize)]
407pub struct SearchUser {
408    pub user_keys: Vec<String>,
409    pub field_key: String,
410    pub role: String,
411}
412
413#[derive(Clone, Debug, Default, Deserialize, Serialize)]
414pub struct SearchParam {
415    pub param_key: String,
416    // TODO: interface{} 类型
417    pub value: Value,
418    pub operator: String,
419}
420
421#[derive(Clone, Debug, Default, Deserialize, Serialize)]
422pub struct SearchGroup {
423    pub search_params: Vec<SearchParam>,
424    pub conjunction: String,
425    pub search_groups: Vec<SearchGroup>,
426}
427
428#[derive(Clone, Debug, Deserialize, Serialize)]
429pub struct SimpleField {
430    pub field_key: String,
431    pub field_alias: String,
432    pub field_type_key: String,
433    pub field_name: String,
434    pub is_custom_field: bool,
435    pub options: Option<Vec<FieldOption>>,
436    pub relation_id: Option<String>,
437    pub compound_fields: Option<Vec<SimpleField>>,
438}
439
440#[derive(Clone, Debug, Deserialize, Serialize)]
441pub struct SubTask {
442    pub id: String,
443    pub name: String,
444    pub schedules: Option<Vec<Schedule>>,
445    pub order: Option<f64>,
446    pub passed: Option<bool>,
447    pub owners: Option<Vec<String>>,
448    pub note: Option<String>,
449    pub actual_begin_time: Option<String>,
450    pub actual_finish_time: Option<String>,
451    pub assignee: Option<Vec<String>>,
452    pub role_assignee: Option<Vec<RoleOwner>>,
453    pub deliverable: Option<Vec<FieldValuePair>>,
454    pub fields: Option<Vec<FieldValuePair>>,
455}
456
457#[derive(Clone, Debug, Deserialize, Serialize)]
458pub struct SubStatus {
459    pub checked_time: i64,
460    pub owner: String,
461    pub status: i64,
462}
463
464#[derive(Clone, Debug, Deserialize, Serialize)]
465pub struct SubDetail {
466    pub work_item_id: i64,
467    pub work_item_name: String,
468    pub node_id: String,
469    pub sub_task: SubTask,
470}
471
472#[derive(Clone, Debug, Deserialize, Serialize)]
473pub struct StateTime {
474    pub state_key: String,
475    pub start_time: i64,
476    pub end_time: i64,
477    pub name: String,
478}
479
480#[derive(Clone, Debug, Deserialize, Serialize)]
481pub struct StateFlowConf {
482    pub state_key: String,
483    pub name: String,
484    pub state_type: i64,
485    pub authorized_roles: Vec<String>,
486}
487
488#[derive(Clone, Debug, Deserialize, Serialize)]
489pub struct StateFlowNode {
490    pub id: String,
491    pub name: String,
492    pub status: i64,
493    pub owners: Option<Vec<RoleOwner>>,
494    pub fields: Option<Vec<FieldValuePair>>,
495    pub actual_begin_time: String,
496    pub actual_finish_time: String,
497}
498
499#[derive(Clone, Debug, Deserialize, Serialize)]
500pub struct TargetState {
501    pub state_key: String,
502    pub transition_id: i64,
503}
504
505#[derive(Clone, Debug, Deserialize, Serialize)]
506pub struct TaskConf {
507    pub action: i64,
508    pub name: String,
509    pub id: String,
510    pub deliverable_field_id: String,
511    pub pass_mode: i64,
512    pub node_pass_required_mode: i64,
513}
514
515#[derive(Clone, Debug, Deserialize, Serialize)]
516pub struct Team {
517    pub team_id: i64,
518    pub team_name: String,
519    pub user_keys: Vec<String>,
520    pub administrators: Vec<String>,
521}
522
523#[derive(Clone, Debug, Deserialize, Serialize)]
524pub struct TemplateDetail {
525    pub workflow_confs: Option<Vec<WorkflowConf>>,
526    pub state_flow_confs: Option<Vec<StateFlowConf>>,
527    pub connections: Option<Vec<Connection>>,
528    pub template_id: i64,
529    pub template_name: String,
530    pub version: i64,
531    pub is_disabled: i64,
532}
533
534#[derive(Clone, Debug, Deserialize, Serialize)]
535pub struct TemplateConf {
536    pub template_id: String,
537    pub template_name: String,
538    pub is_disabled: i64,
539    pub version: i64,
540}
541
542#[derive(Clone, Debug, Deserialize, Serialize)]
543pub struct TimeInterval {
544    pub start: i64,
545    pub end: i64,
546}
547
548#[derive(Clone, Debug, Deserialize, Serialize)]
549pub struct ViewConf {
550    pub view_id: String,
551    pub view_url: String,
552    pub name: String,
553    pub view_type: i64,
554    pub auth: i64,
555    pub system_view: i64,
556    pub collaborators: Vec<String>,
557    pub created_at: i64,
558    pub created_by: String,
559}
560
561#[derive(Clone, Debug, Deserialize, Serialize)]
562pub struct WBSWorkItem {
563    pub node_uuid: String,
564    pub work_item_id: i64,
565    pub r#type: String,
566    pub wbs_status: String,
567    pub sub_work_item: Vec<WBSWorkItem>,
568    pub name: String,
569    pub deliverable: Vec<FieldValuePair>,
570    pub wbs_status_map: std::collections::HashMap<String, String>,
571    pub schedule: Schedule,
572    pub schedules: Option<Vec<Schedule>>,
573    pub points: f64,
574    pub role_owners: Option<Vec<RoleOwner>>,
575    pub union_deliverable: UnionDeliverable,
576}
577
578#[derive(Clone, Debug, Deserialize, Serialize)]
579pub struct UnionDeliverable {
580    pub field_deliverables: Vec<FieldDeliverableItem>,
581    pub instance_deliverables: Vec<InstanceDeliverableItem>,
582}
583
584#[derive(Clone, Debug, Deserialize, Serialize)]
585pub struct FieldDeliverableItem {
586    pub field_info: FieldValuePair,
587    pub placeholder: String,
588    pub remark: String,
589    pub status: i64,
590}
591
592#[derive(Clone, Debug, Deserialize, Serialize)]
593pub struct InstanceDeliverableItem {
594    pub name: String,
595    pub work_item_id: i64,
596    pub deletable: bool,
597    pub must_complete: bool,
598    pub state_key: String,
599    pub state_name: String,
600    pub owners: Option<Vec<String>>,
601    pub remark: String,
602}
603
604#[derive(Clone, Debug, Deserialize, Serialize)]
605pub struct WbsViewResponse {
606    pub template_key: String,
607    pub related_sub_work_items: Vec<WBSWorkItem>,
608    pub relation_chain_path: WBSRelationChainPath,
609    pub relation_chain_entity: WBSRelationChainEntity,
610}
611
612#[derive(Clone, Debug, Deserialize, Serialize)]
613pub struct WBSRelationChainPath {
614    pub workitem_id: i64,
615    pub wbs_relation_chain_path: Vec<WBSRelationChainPathItem>,
616}
617
618#[derive(Clone, Debug, Deserialize, Serialize)]
619pub struct WBSRelationChainPathItem {
620    pub project_key: String,
621    pub workitem_type_key: String,
622    pub r#type: String,
623    pub name: String,
624    pub level: i64,
625    pub node_name: String,
626}
627
628#[derive(Clone, Debug, Deserialize, Serialize)]
629pub struct WBSRelationChainEntity {
630    pub workitem_id: i64,
631    pub wbs_relation_chain_entity: Vec<WBSRelationChainEntityItem>,
632}
633
634#[derive(Clone, Debug, Deserialize, Serialize)]
635pub struct WBSRelationChainEntityItem {
636    pub project_key: String,
637    pub workitem_type_key: String,
638    pub workitem_id: i64,
639    pub r#type: String,
640    pub workitem_name: String,
641    pub state_key: String,
642    pub node_name: String,
643    pub sub_task_name: String,
644    pub sub_task_id: i64,
645    pub level: i64,
646}
647
648#[derive(Clone, Debug, Deserialize, Serialize)]
649pub enum WFStateStatus {
650    Unreach = 1, // 未开始
651    Reached = 2, // 进行中
652    Passed = 3,  // 已完成
653}
654
655#[derive(Clone, Debug, Deserialize, Serialize)]
656pub struct WorkflowConf {
657    pub action: Option<i64>,
658    pub state_key: String,
659    pub name: String,
660    pub tags: Option<Vec<String>>,
661    pub pre_node_state_key: Option<Vec<String>>,
662    pub owner_usage_mode: Option<i64>,
663    pub owner_roles: Option<Vec<String>>,
664    pub owners: Option<Vec<String>>,
665    pub need_schedule: Option<bool>,
666    pub different_schedule: Option<bool>,
667    pub visibility_usage_mode: Option<i64>,
668    pub completion_tips: Option<String>,
669    pub deletable: Option<bool>,
670    pub deletable_operation_role: Option<Vec<String>>,
671    pub pass_mode: Option<i64>,
672    pub is_limit_node: Option<bool>,
673    pub done_operation_role: Option<Vec<String>>,
674    pub done_schedule: Option<bool>,
675    pub done_allocate_owner: Option<bool>,
676    pub task_confs: Option<Vec<TaskConf>>,
677}
678
679#[derive(Clone, Debug, Deserialize, Serialize)]
680pub struct WorkItemInfo {
681    pub id: i64,
682    pub name: String,
683    pub work_item_type_key: String,
684    pub project_key: String,
685    pub template_id: i64,
686    pub template_type: String,
687    pub pattern: String,
688    pub sub_stage: String,
689    pub current_nodes: Option<Vec<NodeBasicInfo>>,
690    pub created_by: String,
691    pub updated_by: String,
692    pub deleted_by: String,
693    pub created_at: i64,
694    pub updated_at: i64,
695    pub deleted_at: i64,
696    pub fields: Vec<FieldValuePair>,
697    pub work_item_status: WorkItemStatus,
698}
699
700#[derive(Clone, Debug, Deserialize, Serialize)]
701pub struct WorkItemKeyType {
702    pub type_key: String,
703    pub name: String,
704    pub api_name: String,
705    pub is_disable: i64,
706}
707
708#[derive(Clone, Debug, Deserialize, Serialize)]
709pub struct WorkflowNode {
710    pub id: String,
711    pub state_key: String,
712    pub name: String,
713    pub status: i64,
714    pub fields: Option<Vec<FieldValuePair>>,
715    pub owners: Option<Vec<String>>,
716    pub node_schedule: Option<Schedule>,
717    pub schedules: Option<Vec<Schedule>>,
718    pub sub_tasks: Option<Vec<SubTask>>,
719    pub actual_begin_time: Option<String>,
720    pub actual_finish_time: Option<String>,
721    pub role_assignee: Option<Vec<RoleOwner>>,
722}
723
724#[derive(Clone, Debug, Deserialize, Serialize)]
725pub struct WorkItemRelation {
726    pub id: String,
727    pub name: String,
728    pub disabled: bool,
729    pub work_item_type_key: String,
730    pub work_item_type_name: String,
731    pub relation_details: Vec<RelationDetail>,
732    pub relation_type: i64,
733}
734
735#[derive(Clone, Debug, Deserialize, Serialize)]
736pub struct WorkItemStatus {
737    pub state_key: String,
738    pub is_archived_state: bool,
739    pub is_init_state: bool,
740    pub updated_at: i64,
741    pub updated_by: String,
742}
743
744#[derive(Builder, Clone, Debug, Default, Serialize)]
745#[builder(setter(into, strip_option))]
746#[builder(default)]
747pub struct CreateWorkingHourRecord {
748    pub resource_type: String,
749    pub resource_id: String,
750    pub work_time: i64,
751    pub work_description: String,
752}
753
754#[derive(Builder, Clone, Debug, Default, Serialize)]
755#[builder(setter(into, strip_option))]
756#[builder(default)]
757pub struct UpdateWorkingHourRecord {
758    pub id: i64,
759    pub work_time: i64,
760    pub work_description: String,
761}