正在显示
11 个修改的文件
包含
357 行增加
和
27 行删除
@@ -3,6 +3,7 @@ package adapter | @@ -3,6 +3,7 @@ package adapter | ||
3 | //综合评估的周期列表 | 3 | //综合评估的周期列表 |
4 | 4 | ||
5 | type CycleList struct { | 5 | type CycleList struct { |
6 | - CycleId int `json:"cycleId,string"` //周期id | ||
7 | - CycleName string `json:"cycleName"` // | 6 | + CycleId string `json:"cycleId"` //周期id |
7 | + CycleName string `json:"cycleName"` // | ||
8 | + ExecutorId string `json:"executorId "` | ||
8 | } | 9 | } |
1 | package service | 1 | package service |
2 | 2 | ||
3 | +import ( | ||
4 | + "github.com/linmadan/egglib-go/core/application" | ||
5 | + "github.com/linmadan/egglib-go/utils/tool_funs" | ||
6 | + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/factory" | ||
7 | + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/summary_evaluation/adapter" | ||
8 | + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/application/summary_evaluation/command" | ||
9 | + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/domain" | ||
10 | + "gitlab.fjmaimaimai.com/allied-creation/performance/pkg/infrastructure/dao" | ||
11 | +) | ||
12 | + | ||
3 | type SummaryEvaluationServeice struct { | 13 | type SummaryEvaluationServeice struct { |
4 | } | 14 | } |
5 | 15 | ||
@@ -8,9 +18,218 @@ func NewStaffAssessServeice() *SummaryEvaluationServeice { | @@ -8,9 +18,218 @@ func NewStaffAssessServeice() *SummaryEvaluationServeice { | ||
8 | return newService | 18 | return newService |
9 | } | 19 | } |
10 | 20 | ||
21 | +// GetCycleList | ||
11 | // 获取周期列表 | 22 | // 获取周期列表 |
12 | -func (srv SummaryEvaluationServeice) GetCycleList() (map[string]interface{}, error) { | ||
13 | - return nil, nil | 23 | +func (srv *SummaryEvaluationServeice) GetCycleList(param *command.QueryCycleList) (map[string]interface{}, error) { |
24 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
25 | + if err != nil { | ||
26 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
27 | + } | ||
28 | + if err := transactionContext.StartTransaction(); err != nil { | ||
29 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
30 | + } | ||
31 | + defer func() { | ||
32 | + _ = transactionContext.RollbackTransaction() | ||
33 | + }() | ||
34 | + evaluationDao := dao.NewSummaryEvaluationDao(map[string]interface{}{ | ||
35 | + "transactionContext": transactionContext, | ||
36 | + }) | ||
37 | + limit := 300 | ||
38 | + offset := 0 | ||
39 | + if param.PageSize > 0 { | ||
40 | + limit = param.PageSize | ||
41 | + } | ||
42 | + if param.PageNumber > 0 { | ||
43 | + offset = (param.PageNumber - 1) * param.PageSize | ||
44 | + } | ||
45 | + | ||
46 | + cycleData, err := evaluationDao.GetPersonalCycleList(param.UserId, offset, limit) | ||
47 | + if err != nil { | ||
48 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, "获取周期列表"+err.Error()) | ||
49 | + } | ||
50 | + | ||
51 | + cnt, err := evaluationDao.CountPersonalCycleList(param.UserId) | ||
52 | + if err != nil { | ||
53 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
54 | + } | ||
55 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
56 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
57 | + } | ||
58 | + cycleList := []adapter.CycleList{} | ||
59 | + for _, v := range cycleData { | ||
60 | + m := adapter.CycleList{ | ||
61 | + CycleId: v.CycleId, | ||
62 | + CycleName: v.CycleName, | ||
63 | + ExecutorId: v.ExecutorId, | ||
64 | + } | ||
65 | + cycleList = append(cycleList, m) | ||
66 | + } | ||
67 | + return tool_funs.SimpleWrapGridMap(int64(cnt), cycleList), nil | ||
14 | } | 68 | } |
15 | 69 | ||
16 | -// 获取自评信息 | 70 | +// GetMenu |
71 | +// 根据周期获取菜单显示 | ||
72 | +func (srv *SummaryEvaluationServeice) GetMenu(param *command.QueryMenu) (map[string]interface{}, error) { | ||
73 | + transactionContext, err := factory.CreateTransactionContext(nil) | ||
74 | + if err != nil { | ||
75 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
76 | + } | ||
77 | + if err := transactionContext.StartTransaction(); err != nil { | ||
78 | + return nil, application.ThrowError(application.TRANSACTION_ERROR, err.Error()) | ||
79 | + } | ||
80 | + defer func() { | ||
81 | + _ = transactionContext.RollbackTransaction() | ||
82 | + }() | ||
83 | + evaluationRepo := factory.CreateSummaryEvaluationRepository(map[string]interface{}{ | ||
84 | + "transactionContext": transactionContext, | ||
85 | + }) | ||
86 | + | ||
87 | + //查找我的绩效 | ||
88 | + _, selfEvaluation, err := evaluationRepo.Find(map[string]interface{}{ | ||
89 | + "types": int(domain.EvaluationSelf), | ||
90 | + "executorId": param.UserId, | ||
91 | + "limit": 1, | ||
92 | + }) | ||
93 | + if err != nil { | ||
94 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
95 | + } | ||
96 | + //查找360评估,统计未完成的 | ||
97 | + cnt360, _, err := evaluationRepo.Find(map[string]interface{}{ | ||
98 | + "types": int(domain.Evaluation360), | ||
99 | + "executorId": param.UserId, | ||
100 | + "limit": 1, | ||
101 | + "status": string(domain.EvaluationUncompleted), | ||
102 | + }) | ||
103 | + if err != nil { | ||
104 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
105 | + } | ||
106 | + //查询上级评估,统计未完成 | ||
107 | + cntSuper, _, err := evaluationRepo.Find(map[string]interface{}{ | ||
108 | + "types": int(domain.EvaluationSelf), | ||
109 | + "executorId": param.UserId, | ||
110 | + "limit": 1, | ||
111 | + "status": string(domain.EvaluationUncompleted), | ||
112 | + }) | ||
113 | + if err != nil { | ||
114 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
115 | + } | ||
116 | + //查询人资评估,统计未完成 | ||
117 | + cntHrbp, _, err := evaluationRepo.Find(map[string]interface{}{ | ||
118 | + "types": int(domain.EvaluationHrbp), | ||
119 | + "executorId": param.UserId, | ||
120 | + "limit": 1, | ||
121 | + "status": string(domain.EvaluationUncompleted), | ||
122 | + }) | ||
123 | + | ||
124 | + if err := transactionContext.CommitTransaction(); err != nil { | ||
125 | + return nil, application.ThrowError(application.INTERNAL_SERVER_ERROR, err.Error()) | ||
126 | + } | ||
127 | + | ||
128 | + menuList := []adapter.MenuList{} | ||
129 | + | ||
130 | + //模块-我的绩效 | ||
131 | + menu1 := adapter.MenuList{ | ||
132 | + CycleId: 0, | ||
133 | + NodeName: "我的绩效", | ||
134 | + StatusName: "", | ||
135 | + Types: "", | ||
136 | + Child: []adapter.MenuList{}, | ||
137 | + } | ||
138 | + menu1_1 := adapter.MenuList{ | ||
139 | + CycleId: param.CycleId, | ||
140 | + NodeName: "填写综合自评", | ||
141 | + StatusName: "", | ||
142 | + Types: "填写综合自评", | ||
143 | + } | ||
144 | + menu1_2 := adapter.MenuList{ | ||
145 | + CycleId: param.CycleId, | ||
146 | + NodeName: "查看综合自评", | ||
147 | + StatusName: "", | ||
148 | + Types: "查看综合自评", | ||
149 | + } | ||
150 | + if len(selfEvaluation) > 0 { | ||
151 | + if selfEvaluation[0].Status == domain.EvaluationCompleted { | ||
152 | + menu1_1.StatusName = "已完成" | ||
153 | + } else { | ||
154 | + menu1_1.StatusName = "未完成" | ||
155 | + } | ||
156 | + if selfEvaluation[0].CheckResult == domain.EvaluationCheckCompleted { | ||
157 | + menu1_2.StatusName = "已完成" | ||
158 | + } else { | ||
159 | + menu1_2.StatusName = "未完成" | ||
160 | + } | ||
161 | + } | ||
162 | + menu1.Child = append(menu1.Child, menu1_1, menu1_2) | ||
163 | + menuList = append(menuList, menu1) | ||
164 | + menu2 := adapter.MenuList{ | ||
165 | + CycleId: 0, | ||
166 | + NodeName: "给他人评估", | ||
167 | + StatusName: "", | ||
168 | + Types: "", | ||
169 | + Child: []adapter.MenuList{}, | ||
170 | + } | ||
171 | + menu2_1 := adapter.MenuList{ | ||
172 | + CycleId: param.CycleId, | ||
173 | + NodeName: "360综评", | ||
174 | + StatusName: "", | ||
175 | + Types: "360综评", | ||
176 | + } | ||
177 | + if cnt360 > 0 { | ||
178 | + menu2_1.StatusName = "未完成" | ||
179 | + } else { | ||
180 | + menu2_1.StatusName = "已完成" | ||
181 | + } | ||
182 | + menu2.Child = append(menu2.Child, menu2_1) | ||
183 | + menuList = append(menuList, menu2) | ||
184 | + menu3 := adapter.MenuList{ | ||
185 | + CycleId: 0, | ||
186 | + NodeName: "人资评估", | ||
187 | + StatusName: "", | ||
188 | + Types: "", | ||
189 | + Child: []adapter.MenuList{}, | ||
190 | + } | ||
191 | + menu3_1 := adapter.MenuList{ | ||
192 | + CycleId: param.CycleId, | ||
193 | + NodeName: "上级综评", | ||
194 | + StatusName: "", | ||
195 | + Types: "上级综评", | ||
196 | + } | ||
197 | + if cntHrbp > 0 { | ||
198 | + menu3_1.StatusName = "未完成" | ||
199 | + } else { | ||
200 | + menu3_1.StatusName = "已完成" | ||
201 | + } | ||
202 | + menu3.Child = append(menu3.Child, menu3_1) | ||
203 | + | ||
204 | + menuList = append(menuList, menu3) | ||
205 | + menu4 := adapter.MenuList{ | ||
206 | + CycleId: 0, | ||
207 | + NodeName: "我的团队绩效", | ||
208 | + StatusName: "", | ||
209 | + Types: "", | ||
210 | + Child: []adapter.MenuList{}, | ||
211 | + } | ||
212 | + menu4_1 := adapter.MenuList{ | ||
213 | + CycleId: param.CycleId, | ||
214 | + NodeName: "上级综评", | ||
215 | + StatusName: "", | ||
216 | + Types: "上级综评", | ||
217 | + } | ||
218 | + if cntSuper > 0 { | ||
219 | + menu4_1.StatusName = "未完成" | ||
220 | + } else { | ||
221 | + menu4_1.StatusName = "已完成" | ||
222 | + } | ||
223 | + menu4.Child = append(menu4.Child, menu4_1) | ||
224 | + menuList = append(menuList, menu4) | ||
225 | + result := map[string]interface{}{ | ||
226 | + "menus": menuList, | ||
227 | + } | ||
228 | + return result, nil | ||
229 | +} | ||
230 | + | ||
231 | +// 获取综合自评详情 | ||
232 | +func (srv *SummaryEvaluationServeice) GetEvaluationSelf() {} | ||
233 | + | ||
234 | +// 编辑综合自评详情 | ||
235 | +func (srv *SummaryEvaluationServeice) EditEvaluationSelf() {} |
@@ -5,23 +5,23 @@ import "time" | @@ -5,23 +5,23 @@ import "time" | ||
5 | // 周综合评估 | 5 | // 周综合评估 |
6 | type SummaryEvaluation struct { | 6 | type SummaryEvaluation struct { |
7 | Id int | 7 | Id int |
8 | - CompanyId int //公司id | ||
9 | - EvaluationProjectId int //对应的项目id | ||
10 | - EvaluationProjectName string //对应的项目名称 | ||
11 | - CycleId int64 //对应的周期id | ||
12 | - CycleName string //对应的周期名称 | ||
13 | - TargetUser StaffDesc //被评估的目标用户,被执行的 | ||
14 | - TargetDepartment []StaffDepartment //被评估的目标用户所在的部门 | ||
15 | - Executor StaffDesc //填写评估的用户,执行人 | ||
16 | - Types EvaluationType //评估类型 | ||
17 | - Status EvaluationStatus //评估的填写状态 | ||
18 | - CheckResult int //被执行的人确认评估结果 | ||
19 | - BeginTime time.Time //开始时间 | ||
20 | - EndTime time.Time //截止时间 | ||
21 | - TotalScore string //最终上级评估得分. | ||
22 | - CreatedAt time.Time //数据创建时间 | ||
23 | - UpdatedAt time.Time //数据更新时间 | ||
24 | - DeletedAt *time.Time //数据删除时间 | 8 | + CompanyId int //公司id |
9 | + EvaluationProjectId int //对应的项目id | ||
10 | + EvaluationProjectName string //对应的项目名称 | ||
11 | + CycleId int64 //对应的周期id | ||
12 | + CycleName string //对应的周期名称 | ||
13 | + TargetUser StaffDesc //被评估的目标用户,被执行的 | ||
14 | + TargetDepartment []StaffDepartment //被评估的目标用户所在的部门 | ||
15 | + Executor StaffDesc //填写评估的用户,执行人 | ||
16 | + Types EvaluationType //评估类型 | ||
17 | + Status EvaluationStatus //评估的填写状态 | ||
18 | + CheckResult EvaluationCheckResult //被执行的人确认评估结果 | ||
19 | + BeginTime time.Time //开始时间 | ||
20 | + EndTime time.Time //截止时间 | ||
21 | + TotalScore string //最终上级评估得分. | ||
22 | + CreatedAt time.Time //数据创建时间 | ||
23 | + UpdatedAt time.Time //数据更新时间 | ||
24 | + DeletedAt *time.Time //数据删除时间 | ||
25 | } | 25 | } |
26 | 26 | ||
27 | type EvaluationType int //综合评估类型 | 27 | type EvaluationType int //综合评估类型 |
1 | +package dao | ||
2 | + | ||
3 | +import ( | ||
4 | + "github.com/go-pg/pg/v10" | ||
5 | + pgTransaction "github.com/linmadan/egglib-go/transaction/pg" | ||
6 | +) | ||
7 | + | ||
8 | +type SummaryEvaluationDao struct { | ||
9 | + transactionContext *pgTransaction.TransactionContext | ||
10 | +} | ||
11 | + | ||
12 | +func NewSummaryEvaluationDao(options map[string]interface{}) *SummaryEvaluationDao { | ||
13 | + var transactionContext *pgTransaction.TransactionContext | ||
14 | + if value, ok := options["transactionContext"]; ok { | ||
15 | + transactionContext = value.(*pgTransaction.TransactionContext) | ||
16 | + } | ||
17 | + return &SummaryEvaluationDao{ | ||
18 | + transactionContext: transactionContext, | ||
19 | + } | ||
20 | +} | ||
21 | + | ||
22 | +type PersonalCycle struct { | ||
23 | + ExecutorId string `pg:"executor_id" ` // | ||
24 | + CycleId string `pg:"cycle_id" ` // | ||
25 | + CycleName string `pg:"cycle_name"` // | ||
26 | +} | ||
27 | + | ||
28 | +// GetPersonalCycleList 获取执行人拥有的周期列表 | ||
29 | +func (d *SummaryEvaluationDao) GetPersonalCycleList(executorId int, offset int, limit int) ([]PersonalCycle, error) { | ||
30 | + sqlStr := `select | ||
31 | + distinct | ||
32 | + summary_evaluation.cycle_id , | ||
33 | + summary_evaluation.cycle_name , | ||
34 | + summary_evaluation.executor ->>'userId' as executor_id | ||
35 | + from summary_evaluation | ||
36 | + where summary_evaluation.executor ->>'userId'='?' | ||
37 | + offset ? limit ?` | ||
38 | + | ||
39 | + tx := d.transactionContext.PgTx | ||
40 | + condition := []interface{}{ | ||
41 | + executorId, offset, limit, | ||
42 | + } | ||
43 | + result := []PersonalCycle{} | ||
44 | + _, err := tx.Query(&result, sqlStr, condition...) | ||
45 | + return result, err | ||
46 | +} | ||
47 | + | ||
48 | +// CountPersonalCycleList 统计执行人拥有的周期列表 | ||
49 | +func (d *SummaryEvaluationDao) CountPersonalCycleList(executorId int) (int, error) { | ||
50 | + sqlStr := `select count( | ||
51 | + distinct summary_evaluation.cycle_id | ||
52 | + ) as cnt | ||
53 | + from summary_evaluation | ||
54 | + where summary_evaluation.executor ->>'userId'='?' ` | ||
55 | + | ||
56 | + tx := d.transactionContext.PgTx | ||
57 | + condition := []interface{}{ | ||
58 | + executorId, | ||
59 | + } | ||
60 | + var cnt int | ||
61 | + _, err := tx.QueryOne(pg.Scan(&cnt), sqlStr, condition...) | ||
62 | + return cnt, err | ||
63 | +} |
@@ -46,6 +46,9 @@ func init() { | @@ -46,6 +46,9 @@ func init() { | ||
46 | &models.StaffAssessTask{}, | 46 | &models.StaffAssessTask{}, |
47 | &models.StaffAssessContent{}, | 47 | &models.StaffAssessContent{}, |
48 | &models.StaffAssessCache{}, | 48 | &models.StaffAssessCache{}, |
49 | + &models.EvaluationItemUsed{}, | ||
50 | + &models.SummaryEvaluation{}, | ||
51 | + &models.SummaryEvaluationValue{}, | ||
49 | } | 52 | } |
50 | for _, model := range tables { | 53 | for _, model := range tables { |
51 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ | 54 | err := DB.Model(model).CreateTable(&orm.CreateTableOptions{ |
@@ -20,7 +20,7 @@ type SummaryEvaluation struct { | @@ -20,7 +20,7 @@ type SummaryEvaluation struct { | ||
20 | Executor domain.StaffDesc //填写评估的用户,执行人 | 20 | Executor domain.StaffDesc //填写评估的用户,执行人 |
21 | Types int //评估类型 | 21 | Types int //评估类型 |
22 | Status string //评估的填写状态 | 22 | Status string //评估的填写状态 |
23 | - CheckResult int //被执行的人确认评估结果 | 23 | + CheckResult string //被执行的人确认评估结果 |
24 | BeginTime time.Time //开始时间 | 24 | BeginTime time.Time //开始时间 |
25 | EndTime time.Time //截止时间 | 25 | EndTime time.Time //截止时间 |
26 | TotalScore string //最终上级评估得分. | 26 | TotalScore string //最终上级评估得分. |
@@ -4,7 +4,7 @@ import "time" | @@ -4,7 +4,7 @@ import "time" | ||
4 | 4 | ||
5 | // 周期综合评估填写的内容 | 5 | // 周期综合评估填写的内容 |
6 | type SummaryEvaluationValue struct { | 6 | type SummaryEvaluationValue struct { |
7 | - tableName struct{} `comment:"周期综合评估填写的内容" pg:"summary_evaluation"` | 7 | + tableName struct{} `comment:"周期综合评估填写的内容" pg:"summary_evaluation_value"` |
8 | Id int // | 8 | Id int // |
9 | EvaluationItemId int //评估条目的id | 9 | EvaluationItemId int //评估条目的id |
10 | SummaryEvaluationId int //综合评估任务(SummaryEvaluation)的id | 10 | SummaryEvaluationId int //综合评估任务(SummaryEvaluation)的id |
@@ -34,7 +34,7 @@ func (repo *SummaryEvaluationRepository) TransformToDomain(d *models.SummaryEval | @@ -34,7 +34,7 @@ func (repo *SummaryEvaluationRepository) TransformToDomain(d *models.SummaryEval | ||
34 | Executor: d.Executor, | 34 | Executor: d.Executor, |
35 | Types: domain.EvaluationType(d.Types), | 35 | Types: domain.EvaluationType(d.Types), |
36 | Status: domain.EvaluationStatus(d.Status), | 36 | Status: domain.EvaluationStatus(d.Status), |
37 | - CheckResult: d.CheckResult, | 37 | + CheckResult: domain.EvaluationCheckResult(d.CheckResult), |
38 | BeginTime: d.BeginTime, | 38 | BeginTime: d.BeginTime, |
39 | EndTime: d.EndTime, | 39 | EndTime: d.EndTime, |
40 | TotalScore: d.TotalScore, | 40 | TotalScore: d.TotalScore, |
@@ -57,7 +57,7 @@ func (repo *SummaryEvaluationRepository) Save(param *domain.SummaryEvaluation) e | @@ -57,7 +57,7 @@ func (repo *SummaryEvaluationRepository) Save(param *domain.SummaryEvaluation) e | ||
57 | Executor: param.Executor, | 57 | Executor: param.Executor, |
58 | Types: int(param.Types), | 58 | Types: int(param.Types), |
59 | Status: string(param.Status), | 59 | Status: string(param.Status), |
60 | - CheckResult: param.CheckResult, | 60 | + CheckResult: string(param.CheckResult), |
61 | BeginTime: param.BeginTime, | 61 | BeginTime: param.BeginTime, |
62 | EndTime: param.EndTime, | 62 | EndTime: param.EndTime, |
63 | TotalScore: param.TotalScore, | 63 | TotalScore: param.TotalScore, |
@@ -114,13 +114,33 @@ func (repo *SummaryEvaluationRepository) Find(queryOptions map[string]interface{ | @@ -114,13 +114,33 @@ func (repo *SummaryEvaluationRepository) Find(queryOptions map[string]interface{ | ||
114 | tx := repo.transactionContext.PgTx | 114 | tx := repo.transactionContext.PgTx |
115 | var m []*models.SummaryEvaluation | 115 | var m []*models.SummaryEvaluation |
116 | query := tx.Model(&m). | 116 | query := tx.Model(&m). |
117 | - Where("deleted_at isnull").Limit(20) | 117 | + Where("deleted_at isnull"). |
118 | + Limit(20) | ||
119 | + | ||
118 | if v, ok := queryOptions["limit"].(int); ok { | 120 | if v, ok := queryOptions["limit"].(int); ok { |
119 | query.Limit(v) | 121 | query.Limit(v) |
120 | } | 122 | } |
123 | + | ||
121 | if v, ok := queryOptions["offset"].(int); ok { | 124 | if v, ok := queryOptions["offset"].(int); ok { |
122 | query.Offset(v) | 125 | query.Offset(v) |
123 | } | 126 | } |
127 | + | ||
128 | + if v, ok := queryOptions["types"]; ok { | ||
129 | + query.Where("types=?", v) | ||
130 | + } | ||
131 | + | ||
132 | + if v, ok := queryOptions["status"]; ok { | ||
133 | + query.Where("status=?", v) | ||
134 | + } | ||
135 | + if v, ok := queryOptions["targetUserId"]; ok { | ||
136 | + query.Where(`summary_evaluation.target_user->>'userId'='?'`, v) | ||
137 | + } | ||
138 | + | ||
139 | + if v, ok := queryOptions["executorId"]; ok { | ||
140 | + query.Where(`summary_evaluation.executor->>'userId'='?'`, v) | ||
141 | + } | ||
142 | + | ||
143 | + query.Order("id desc") | ||
124 | count, err := query.SelectAndCount() | 144 | count, err := query.SelectAndCount() |
125 | if err != nil { | 145 | if err != nil { |
126 | return 0, nil, err | 146 | return 0, nil, err |
-
请 注册 或 登录 后发表评论