generated from NSObjects/go-template
/
department.go
133 lines (113 loc) · 3.48 KB
/
department.go
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
/*
*
* department.go
* biz
*
* Created by lintao on 2023/11/21 10:47
* Copyright © 2020-2023 LINTAO. All rights reserved.
*
*/
package biz
import (
"context"
"fmt"
"github.com/NSObjects/echo-admin/internal/api/data/model"
"github.com/NSObjects/echo-admin/internal/api/data/query"
"github.com/NSObjects/echo-admin/internal/api/service/param"
"github.com/NSObjects/echo-admin/internal/code"
"github.com/google/martian/log"
"github.com/marmotedu/errors"
"github.com/samber/lo"
"gorm.io/gen"
)
type DepartmentHandler struct {
q *query.Query
}
func NewDepartmentHandler(q *query.Query) *DepartmentHandler {
return &DepartmentHandler{q: q}
}
func (d *DepartmentHandler) Get(ctx context.Context, id uint) (*model.Department, error) {
dep, err := d.q.Department.WithContext(ctx).
//Preload(d.q.Department.Principal).
Where(d.q.Department.ID.Eq(id)).First()
if err != nil {
return nil, err
}
return dep, nil
}
func (d *DepartmentHandler) Create(ctx context.Context, department param.Department) error {
return d.q.Transaction(func(tx *query.Query) error {
selection, m := department.Data()
if err := d.q.Department.WithContext(ctx).Select(selection...).Create(&m); err != nil {
return errors.WrapC(err, code.ErrDatabase, fmt.Sprintf("创建部门失败 %v", department))
}
return nil
})
}
func (d *DepartmentHandler) List(ctx context.Context, q param.DepartmentQuery) ([]*model.Department, int64, error) {
var cd []gen.Condition
if q.Name != "" {
cd = append(cd, d.q.Department.Name.Eq(q.Name))
}
if q.Status != 0 {
cd = append(cd, d.q.Department.Where(d.q.Department.Status.Eq(q.Status)))
}
deps, err := d.q.Department.WithContext(ctx).
//Preload(d.q.Department.Departments).
Where(d.q.Department.ParentID.IsNull()).
Where(cd...).Offset(q.Offset()).Limit(q.Limit()).Find()
if err != nil {
return nil, 0, err
}
for _, td := range deps {
td.Departments, err = d.GetAllDepartments(td.ID)
if err != nil {
log.Errorf("get all departments error: %v", err)
}
}
total, err := d.q.Department.WithContext(ctx).Where(cd...).Count()
if err != nil {
return nil, 0, err
}
return deps, total, nil
}
func (d *DepartmentHandler) GetAllDepartments(parentID uint) ([]model.Department, error) {
if parentID == 0 {
return nil, nil
}
departments, err := d.q.Department.Where(d.q.Department.ParentID.Eq(int64(parentID))).
Preload(d.q.Department.Departments).Find()
if err != nil {
return nil, err
}
for i, department := range departments {
children, err := d.GetAllDepartments(department.ID)
if err != nil {
return nil, err
}
departments[i].Departments = children
}
return lo.Map(departments, func(item *model.Department, index int) model.Department {
return *item
}), nil
}
func (d *DepartmentHandler) Delete(ctx context.Context, id uint) error {
return d.q.Transaction(func(tx *query.Query) error {
_, err := d.q.Department.WithContext(ctx).Where(d.q.Department.ID.Eq(id)).Delete()
if err != nil {
return errors.WrapC(err, code.ErrDatabase, fmt.Sprintf("删除部门失败 %v", id))
}
return nil
})
}
func (d *DepartmentHandler) Update(ctx context.Context, id uint, department param.Department) error {
return d.q.Transaction(func(tx *query.Query) error {
selection, m := department.Data()
if _, err := d.q.Department.WithContext(ctx).Select(selection...).
Where(d.q.Department.ID.Eq(id)).
Updates(&m); err != nil {
return errors.WrapC(err, code.ErrDatabase, fmt.Sprintf("更新部门失败 %v", department))
}
return nil
})
}