|
@@ -1,58 +1,284 @@
|
1
|
1
|
package statistics
|
2
|
2
|
|
3
|
3
|
import (
|
|
4
|
+ "errors"
|
|
5
|
+ "sort"
|
4
|
6
|
"spaceofcheng/services/models/model"
|
5
|
7
|
"spaceofcheng/services/utils"
|
6
|
|
- "strings"
|
|
8
|
+ "time"
|
7
|
9
|
)
|
8
|
10
|
|
9
|
11
|
// StaDashboard 控制板统计
|
10
|
|
-func (s *StatisticsServ) StaDashboard() ([]map[string]interface{}, error) {
|
11
|
|
- // user := s.ctx.Get("user").(model.SysUser)
|
12
|
|
- // userTypes, err := s.dao.GetUserTypes(user.UserId)
|
13
|
|
- // if err != nil {
|
14
|
|
- // utils.LogError("获取用户类型失败: " + err.Error())
|
15
|
|
- // return nil, errors.New("获取用户类型失败")
|
16
|
|
- // }
|
17
|
|
-
|
18
|
|
- // tps := make([]string, 0)
|
19
|
|
- // if userTypes != nil {
|
20
|
|
- // for _, tp := range userTypes {
|
21
|
|
- // tps = append(tps, tp.TypeId)
|
22
|
|
- // }
|
23
|
|
- // }
|
24
|
|
-
|
25
|
|
- // settings, err := s.dao.GetDashboardSetting(user.UserId, tps)
|
26
|
|
- // if err != nil {
|
27
|
|
- // utils.LogError("获取用户 Dashboard 配置失败: " + err.Error())
|
28
|
|
- // return nil, errors.New("获取用户 Dashboard 配置失败")
|
29
|
|
- // }
|
30
|
|
-
|
31
|
|
- // comps := s.distinctDashSettings(settings)
|
32
|
|
-
|
33
|
|
- return nil, nil
|
34
|
|
-}
|
|
12
|
+func (s *StatisticsServ) StaDashboard(caseIDs []string) ([]interface{}, error) {
|
|
13
|
+ // 人员及类型
|
|
14
|
+ user := s.ctx.Get("user").(model.SysUser)
|
|
15
|
+ userTypes, err := s.dao.GetUserTypes(user.UserId)
|
|
16
|
+ if err != nil {
|
|
17
|
+ utils.LogError("获取用户类型失败: " + err.Error())
|
|
18
|
+ return nil, errors.New("获取用户类型失败")
|
|
19
|
+ }
|
|
20
|
+
|
|
21
|
+ tps := make([]string, 0)
|
|
22
|
+ if userTypes != nil {
|
|
23
|
+ for _, tp := range userTypes {
|
|
24
|
+ tps = append(tps, tp.TypeId)
|
|
25
|
+ }
|
|
26
|
+ }
|
35
|
27
|
|
36
|
|
-// distinctDashSettings 去重 dashboard 配置
|
37
|
|
-func (s *StatisticsServ) distinctDashSettings(settings []model.TaDashboardSetting) []string {
|
38
|
|
- comps := make([]string, 0)
|
|
28
|
+ // 统计配置
|
|
29
|
+ settings, err := s.dao.GetDashboardSetting(user.UserId, tps)
|
|
30
|
+ if err != nil {
|
|
31
|
+ utils.LogError("获取用户 Dashboard 配置失败: " + err.Error())
|
|
32
|
+ return nil, errors.New("获取用户 Dashboard 配置失败")
|
|
33
|
+ }
|
39
|
34
|
|
40
|
|
- if settings == nil || len(settings) == 0 {
|
41
|
|
- return comps
|
|
35
|
+ if settings == nil {
|
|
36
|
+ return nil, nil
|
42
|
37
|
}
|
43
|
38
|
|
44
|
|
- for _, s := range settings {
|
45
|
|
- comps = append(comps, s.CompList)
|
|
39
|
+ // 系统内置支持的组件
|
|
40
|
+ comps, err := s.dao.GetAllFrontComponents()
|
|
41
|
+ if err != nil {
|
|
42
|
+ utils.LogError("获取支持组件失败: " + err.Error())
|
|
43
|
+ return nil, errors.New("")
|
|
44
|
+ }
|
|
45
|
+ compMapType := make(map[string]model.TdStatisticsComps)
|
|
46
|
+ for _, cmp := range comps {
|
|
47
|
+ compMapType[cmp.CompId] = cmp
|
46
|
48
|
}
|
47
|
49
|
|
48
|
|
- allComps := strings.Split(strings.Join(comps, ","), ",")
|
|
50
|
+ // 机构与案场
|
|
51
|
+ org := s.ctx.Get("org").(model.SysOrg)
|
|
52
|
+ // curcase := s.ctx.Get("currentCase").(model.SysUserCase)
|
49
|
53
|
|
50
|
|
- res := make([]string, 0)
|
51
|
|
- for _, cmp := range allComps {
|
52
|
|
- if utils.StrSliceIndexOf(res, cmp) == -1 {
|
53
|
|
- res = append(res, cmp)
|
|
54
|
+ if caseIDs == nil || len(caseIDs) > 0 {
|
|
55
|
+ allCases := s.ctx.Get("cases").([]model.SysUserCase)
|
|
56
|
+ caseIDs = []string{}
|
|
57
|
+ for _, cs := range allCases {
|
|
58
|
+ caseIDs = append(caseIDs, cs.CaseId)
|
54
|
59
|
}
|
55
|
60
|
}
|
56
|
61
|
|
57
|
|
- return res
|
|
62
|
+ // 日期
|
|
63
|
+ now := time.Now().Local()
|
|
64
|
+ y, m, d := now.Date()
|
|
65
|
+ wd := int(now.Weekday())
|
|
66
|
+ if wd == 0 {
|
|
67
|
+ wd = 7
|
|
68
|
+ }
|
|
69
|
+
|
|
70
|
+ // 今天
|
|
71
|
+ td := time.Date(y, m, d, 0, 0, 0, 0, time.Local)
|
|
72
|
+ // 明天
|
|
73
|
+ nd := td.Add(24 * time.Hour)
|
|
74
|
+ // 后天
|
|
75
|
+ ntd := nd.Add(24 * time.Hour)
|
|
76
|
+ // 本周
|
|
77
|
+ // tw := td.Add(time.Duration((1-wd)*24) * time.Hour)
|
|
78
|
+ // 本月
|
|
79
|
+ tm := time.Date(y, m, 1, 0, 0, 0, 0, time.Local)
|
|
80
|
+ // 下个月
|
|
81
|
+ // nm := time.Date(y, m+1, 1, 0, 0, 0, 0, time.Local)
|
|
82
|
+
|
|
83
|
+ // 统计结果
|
|
84
|
+ res := make(map[string][]interface{})
|
|
85
|
+
|
|
86
|
+ // 表配置顺序即为输出顺序
|
|
87
|
+ for _, setting := range settings {
|
|
88
|
+ cmp := compMapType[setting]
|
|
89
|
+ data := map[string]interface{}{
|
|
90
|
+ "type": cmp.CompType,
|
|
91
|
+ "remark": cmp.TypeName,
|
|
92
|
+ "title": cmp.CompName,
|
|
93
|
+ }
|
|
94
|
+
|
|
95
|
+ switch setting {
|
|
96
|
+
|
|
97
|
+ // -------
|
|
98
|
+ // 运营
|
|
99
|
+
|
|
100
|
+ // 统计会员总数
|
|
101
|
+ case STA_TOTALCUSTOMER:
|
|
102
|
+ dt, err := s.dao.GetCustomerNumber(org.OrgId, caseIDs, nil, nil)
|
|
103
|
+ if err != nil {
|
|
104
|
+ utils.LogError("统计会员总数失败: " + err.Error())
|
|
105
|
+ return nil, errors.New("统计会员总数失败")
|
|
106
|
+ }
|
|
107
|
+ data["value"] = dt
|
|
108
|
+
|
|
109
|
+ // 课程预约
|
|
110
|
+ case STA_TOTALCOURSEORDER:
|
|
111
|
+ dt, err := s.dao.GetCourseOrderNumber(org.OrgId, caseIDs, nil, nil)
|
|
112
|
+ if err != nil {
|
|
113
|
+ utils.LogError("统计课程预约失败: " + err.Error())
|
|
114
|
+ return nil, errors.New("统计课程预约失败")
|
|
115
|
+ }
|
|
116
|
+ data["value"] = dt
|
|
117
|
+
|
|
118
|
+ // 商品下单
|
|
119
|
+ case STA_TOTALGOODS:
|
|
120
|
+ dt, err := s.dao.GetOrderGoodsNumber(org.OrgId, caseIDs, nil, nil)
|
|
121
|
+ if err != nil {
|
|
122
|
+ utils.LogError("统计商品下单失败: " + err.Error())
|
|
123
|
+ return nil, errors.New("统计商品下单失败")
|
|
124
|
+ }
|
|
125
|
+ data["value"] = dt
|
|
126
|
+
|
|
127
|
+ // 今日数据
|
|
128
|
+ case STA_TODAYDATA:
|
|
129
|
+ list := make([]map[string]interface{}, 0)
|
|
130
|
+
|
|
131
|
+ // 会员新增
|
|
132
|
+ dt, err := s.dao.GetCustomerNumber(org.OrgId, caseIDs, &td, nil)
|
|
133
|
+ if err != nil {
|
|
134
|
+ utils.LogError("统计会员新增失败: " + err.Error())
|
|
135
|
+ return nil, errors.New("统计会员新增失败")
|
|
136
|
+ }
|
|
137
|
+ list = append(list, map[string]interface{}{
|
|
138
|
+ "title": "推荐会员新增",
|
|
139
|
+ "value": dt,
|
|
140
|
+ })
|
|
141
|
+
|
|
142
|
+ // 课程数
|
|
143
|
+ dt, err = s.dao.GetCourseNumber(org.OrgId, caseIDs, &td, &nd)
|
|
144
|
+ if err != nil {
|
|
145
|
+ utils.LogError("统计课程数失败: " + err.Error())
|
|
146
|
+ return nil, errors.New("统计课程数失败")
|
|
147
|
+ }
|
|
148
|
+ list = append(list, map[string]interface{}{
|
|
149
|
+ "title": "课程数",
|
|
150
|
+ "value": dt,
|
|
151
|
+ })
|
|
152
|
+
|
|
153
|
+ // 预约数
|
|
154
|
+ dt, err = s.dao.GetCourseOrderNumber(org.OrgId, caseIDs, &td, &nd)
|
|
155
|
+ if err != nil {
|
|
156
|
+ utils.LogError("统计预约数失败: " + err.Error())
|
|
157
|
+ return nil, errors.New("统计预约数失败")
|
|
158
|
+ }
|
|
159
|
+ list = append(list, map[string]interface{}{
|
|
160
|
+ "title": "预约数",
|
|
161
|
+ "value": dt,
|
|
162
|
+ })
|
|
163
|
+
|
|
164
|
+ // 到场人次
|
|
165
|
+ dt, err = s.dao.GetArrivedCustomerNumber(org.OrgId, caseIDs, &td, nil)
|
|
166
|
+ if err != nil {
|
|
167
|
+ utils.LogError("统计到场人次失败: " + err.Error())
|
|
168
|
+ return nil, errors.New("统计到场人次失败")
|
|
169
|
+ }
|
|
170
|
+ list = append(list, map[string]interface{}{
|
|
171
|
+ "title": "到场人次",
|
|
172
|
+ "value": dt,
|
|
173
|
+ })
|
|
174
|
+
|
|
175
|
+ data["value"] = list
|
|
176
|
+
|
|
177
|
+ // 明日课程
|
|
178
|
+ // TODO
|
|
179
|
+
|
|
180
|
+ // -------
|
|
181
|
+ // 运营
|
|
182
|
+
|
|
183
|
+ // 今日预约人数
|
|
184
|
+ case STA_TODAYCOURSECUSTOMER:
|
|
185
|
+ dt, err := s.dao.GetCourseCardCustomer(org.OrgId, caseIDs, &td, &nd)
|
|
186
|
+ if err != nil {
|
|
187
|
+ utils.LogError("统计今日预约人数失败: " + err.Error())
|
|
188
|
+ return nil, errors.New("统计今日预约人数失败")
|
|
189
|
+ }
|
|
190
|
+ data["value"] = dt
|
|
191
|
+
|
|
192
|
+ // 今日到场人数
|
|
193
|
+ case STA_TODAY_ARRIVED:
|
|
194
|
+ dt, err := s.dao.GetArrivedCustomerNumber(org.OrgId, caseIDs, &td, nil)
|
|
195
|
+ if err != nil {
|
|
196
|
+ utils.LogError("统计到场人次失败: " + err.Error())
|
|
197
|
+ return nil, errors.New("统计到场人次失败")
|
|
198
|
+ }
|
|
199
|
+ data["value"] = dt
|
|
200
|
+
|
|
201
|
+ // 明日预约人数
|
|
202
|
+ case STA_TOMORROWCOURSECUSTOMER:
|
|
203
|
+ dt, err := s.dao.GetCourseCardCustomer(org.OrgId, caseIDs, &nd, &ntd)
|
|
204
|
+ if err != nil {
|
|
205
|
+ utils.LogError("统计今日预约人数失败: " + err.Error())
|
|
206
|
+ return nil, errors.New("统计今日预约人数失败")
|
|
207
|
+ }
|
|
208
|
+ data["value"] = dt
|
|
209
|
+
|
|
210
|
+ // 本月卡券总数
|
|
211
|
+ case STA_MONTHCOUPONCARD:
|
|
212
|
+ dt, err := s.dao.GetCouponCardNumber(org.OrgId, caseIDs, &tm, nil)
|
|
213
|
+ if err != nil {
|
|
214
|
+ utils.LogError("统计卡券总数失败: " + err.Error())
|
|
215
|
+ return nil, errors.New("统计卡券总数失败")
|
|
216
|
+ }
|
|
217
|
+ data["value"] = dt
|
|
218
|
+
|
|
219
|
+ // 本月客户已使用
|
|
220
|
+ case STA_MONTHUSEDCOUPONCARD:
|
|
221
|
+ dt, err := s.dao.GetUsedCouponCardNumber(org.OrgId, caseIDs, &tm, nil)
|
|
222
|
+ if err != nil {
|
|
223
|
+ utils.LogError("统计客户使用数失败: " + err.Error())
|
|
224
|
+ return nil, errors.New("统计客户使用数失败")
|
|
225
|
+ }
|
|
226
|
+ data["value"] = dt
|
|
227
|
+
|
|
228
|
+ // 本月已发放
|
|
229
|
+ case STA_MONTHUNUSEDCOUPONCARD:
|
|
230
|
+ dt, err := s.dao.GetCustomerCouponCardNumber(org.OrgId, caseIDs, &tm, nil)
|
|
231
|
+ if err != nil {
|
|
232
|
+ utils.LogError("统计已发放卡券数失败: " + err.Error())
|
|
233
|
+ return nil, errors.New("统计已发放卡券数失败")
|
|
234
|
+ }
|
|
235
|
+ data["value"] = dt
|
|
236
|
+
|
|
237
|
+ // 本月饮品数
|
|
238
|
+ case STA_MONTHGOODS:
|
|
239
|
+ dt, err := s.dao.GetOrderGoodsNumber(org.OrgId, caseIDs, &tm, nil)
|
|
240
|
+ if err != nil {
|
|
241
|
+ utils.LogError("统计商品下单失败: " + err.Error())
|
|
242
|
+ return nil, errors.New("统计商品下单失败")
|
|
243
|
+ }
|
|
244
|
+ data["value"] = dt
|
|
245
|
+
|
|
246
|
+ // 今天饮品数
|
|
247
|
+ case STA_TODAYGOODS:
|
|
248
|
+ dt, err := s.dao.GetOrderGoodsNumber(org.OrgId, caseIDs, &td, nil)
|
|
249
|
+ if err != nil {
|
|
250
|
+ utils.LogError("统计商品下单失败: " + err.Error())
|
|
251
|
+ return nil, errors.New("统计商品下单失败")
|
|
252
|
+ }
|
|
253
|
+ data["value"] = dt
|
|
254
|
+
|
|
255
|
+ default:
|
|
256
|
+ // 暂不支持的统计
|
|
257
|
+ data["value"] = nil
|
|
258
|
+ }
|
|
259
|
+
|
|
260
|
+ typeData, exists := res[cmp.CompType]
|
|
261
|
+ if !exists {
|
|
262
|
+ typeData = make([]interface{}, 0)
|
|
263
|
+ }
|
|
264
|
+
|
|
265
|
+ typeData = append(typeData, data)
|
|
266
|
+ res[cmp.CompType] = typeData
|
|
267
|
+ }
|
|
268
|
+
|
|
269
|
+ // 对 comp-type 进行字典排序
|
|
270
|
+ // 因为 数据库没有设置序号字段,所以约定 comp-type 按照字典顺序进行命名
|
|
271
|
+ typeIDs := []string{}
|
|
272
|
+ for k := range res {
|
|
273
|
+ typeIDs = append(typeIDs, k)
|
|
274
|
+ }
|
|
275
|
+
|
|
276
|
+ sort.Strings(typeIDs)
|
|
277
|
+
|
|
278
|
+ staDatas := make([]interface{}, 0)
|
|
279
|
+ for _, k := range typeIDs {
|
|
280
|
+ staDatas = append(staDatas, res[k])
|
|
281
|
+ }
|
|
282
|
+
|
|
283
|
+ return staDatas, nil
|
58
|
284
|
}
|