wangfei 6 年前
父节点
当前提交
8263f29bce

+ 1
- 0
controllers/file.go 查看文件

@@ -50,6 +50,7 @@ func (c *BaseController) uploadFileToOSS(field string) (string, error) {
50 50
 }
51 51
 
52 52
 // SaveToExcel 保存文件到 excel
53
+// 文件不落地, 对内存开销比较大, 如果文件过大, 服务可能会崩掉
53 54
 func (c *BaseController) SaveToExcel(fn string, excel *utils.TinyXLSXEngine) {
54 55
 	var buf bytes.Buffer
55 56
 	if err := excel.Write(&buf); err != nil {

+ 3
- 2
controllers/verify/verify.go 查看文件

@@ -2,6 +2,7 @@ package verify
2 2
 
3 3
 import (
4 4
 	"spaceofcheng/services/controllers"
5
+	"spaceofcheng/services/models"
5 6
 	"spaceofcheng/services/models/model"
6 7
 	"spaceofcheng/services/service/verify"
7 8
 )
@@ -68,8 +69,8 @@ func (c *VerifyController) VerifyCourse() {
68 69
 		if err != nil {
69 70
 			c.ResponseError(err)
70 71
 		}
71
-		if customerCard.VerifyStatus == "usable" {
72
-			customerCard.VerifyStatus = "used"
72
+		if customerCard.VerifyStatus == models.VERIFY_USEABLE {
73
+			customerCard.VerifyStatus = models.VERIFY_USED
73 74
 			err := c.dao.UpdateCustomerCard(customerCard)
74 75
 			if err != nil {
75 76
 				c.ResponseError(err)

+ 1
- 1
models/card/card.go 查看文件

@@ -267,7 +267,7 @@ func (m *CardDAO) GetCustomerCardByCardAndUser(cardid, userid string) ([]model.T
267 267
 func (m *CardDAO) GetCardDetail(cardid string) (*CaseUsableCard, error) {
268 268
 	var card = new(CaseUsableCard)
269 269
 	sql := `select * from ta_coupon_card where card_id=? and status>?`
270
-	_, err := m.db.Sql(sql, cardid, models.STATUS_DEL).Get(&card)
270
+	_, err := m.db.Sql(sql, cardid, models.STATUS_DEL).Get(card)
271 271
 	if err != nil {
272 272
 		return nil, err
273 273
 	}

+ 3
- 0
models/course/course.go 查看文件

@@ -452,6 +452,9 @@ func (m *CourseDAO) SaveCourseOfCustomer(course *model.TaCustomerCourse, details
452 452
 		d.CustomerDetailId = guid.NewGUIDString()
453 453
 		d.CustomerCourseId = course.CustomerCourseId
454 454
 		d.Status = models.STATUS_NORMAL
455
+		d.CustomerId = course.CustomerId
456
+		d.OrgId = course.OrgId
457
+		d.CourseName = course.CourseName
455 458
 
456 459
 		details[i] = d
457 460
 	}

+ 2
- 1
models/model/ta_dashboard_setting.go 查看文件

@@ -3,8 +3,9 @@ package model
3 3
 type TaDashboardSetting struct {
4 4
 	SettingId   string `xorm:"not null pk VARCHAR(64)"`
5 5
 	SettingName string `xorm:"VARCHAR(255)"`
6
-	CompList    string `xorm:"TEXT"`
6
+	CompId      string `xorm:"VARCHAR(64)"`
7 7
 	Owner       string `xorm:"VARCHAR(64)"`
8 8
 	ForType     string `xorm:"VARCHAR(100)"`
9 9
 	Status      int    `xorm:"SMALLINT(6)"`
10
+	SortNo      int    `xorm:"SMALLINT(6)"`
10 11
 }

+ 8
- 0
models/model/td_statistics_comps.go 查看文件

@@ -0,0 +1,8 @@
1
+package model
2
+
3
+type TdStatisticsComps struct {
4
+	CompId   string `xorm:"not null pk VARCHAR(64)"`
5
+	CompName string `xorm:"VARCHAR(255)"`
6
+	CompType string `xorm:"VARCHAR(64)"`
7
+	TypeName string `xorm:"VARCHAR(255)"`
8
+}

+ 23
- 4
models/statistics/other.go 查看文件

@@ -21,7 +21,7 @@ func (m *StatisticsDAO) GetUserTypes(id string) ([]model.SysUserType, error) {
21 21
 }
22 22
 
23 23
 // GetDashboardSetting 获取人员 dashboard 设置
24
-func (m *StatisticsDAO) GetDashboardSetting(userID string, userTypes []string) ([]model.TaDashboardSetting, error) {
24
+func (m *StatisticsDAO) GetDashboardSetting(userID string, userTypes []string) ([]string, error) {
25 25
 	filters := make([]string, 0)
26 26
 	if userID != "" {
27 27
 		filters = append(filters, "(for_type='"+models.DASH_SETTING_FOR_USER+"' AND owner='"+userID+"')")
@@ -35,11 +35,30 @@ func (m *StatisticsDAO) GetDashboardSetting(userID string, userTypes []string) (
35 35
 		return nil, nil
36 36
 	}
37 37
 
38
-	var settings []model.TaDashboardSetting
39
-	query := `select * from ta_dashboard_setting where (` + strings.Join(filters, " OR ") + ") AND status = ?"
40
-	if err := m.db.SQL(query, models.STATUS_NORMAL).Find(&settings); err != nil {
38
+	sql := `select DISTINCT comp_id from ta_dashboard_setting where (` + strings.Join(filters, " OR ") + ") AND status = ? order by sort_no asc"
39
+	res, err := m.db.Query(sql, models.STATUS_NORMAL)
40
+	if err != nil {
41 41
 		return nil, err
42 42
 	}
43 43
 
44
+	if res == nil || len(res) == 0 {
45
+		return nil, nil
46
+	}
47
+
48
+	settings := make([]string, 0)
49
+	for _, r := range res {
50
+		settings = append(settings, string(r["comp_id"]))
51
+	}
52
+
44 53
 	return settings, nil
45 54
 }
55
+
56
+// GetAllFrontComponents 获取所有前端支持组件
57
+func (m *StatisticsDAO) GetAllFrontComponents() ([]model.TdStatisticsComps, error) {
58
+	var comps []model.TdStatisticsComps
59
+	if err := m.db.Find(&comps); err != nil {
60
+		return nil, err
61
+	}
62
+
63
+	return comps, nil
64
+}

+ 63
- 68
models/statistics/statistics.go 查看文件

@@ -1,11 +1,10 @@
1 1
 package statistics
2 2
 
3 3
 import (
4
-	"spaceofcheng/services/models"
5
-	"spaceofcheng/services/models/model"
6 4
 	"spaceofcheng/services/utils"
7 5
 	"strconv"
8 6
 	"strings"
7
+	"time"
9 8
 
10 9
 	"github.com/go-xorm/xorm"
11 10
 )
@@ -24,87 +23,83 @@ func NewStatisticsDAO(ctx *utils.Context) *StatisticsDAO {
24 23
 	}
25 24
 }
26 25
 
27
-// GetCustomerCount 获取会员总数
28
-func (m *StatisticsDAO) GetCustomerCount(orgid string) (int, error) {
29
-	var customers []model.TaCustomer
30
-	err := m.db.Where("org_id=?", orgid).And("status>" + strconv.Itoa(models.STATUS_DEL)).Find(&customers)
31
-	if err != nil {
32
-		return 0, err
33
-	}
34
-	return len(customers), nil
26
+// GetCustomerNumber 获取会员数量
27
+func (m *StatisticsDAO) GetCustomerNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
28
+	return m.execMySQLFunc("fun_total_customer", orgID, caseIDs, start, end)
35 29
 }
36 30
 
37
-// GetCourseOrderCount 获取课程预约总量
38
-func (m *StatisticsDAO) GetCourseOrderCount(caseids string) (int64, error) {
39
-	var courses = new(model.TaCustomerCourse)
40
-	total, err := m.db.Where("case_id in ('"+strings.Replace(caseids, ",", "','", -1)+"')").And("status>"+strconv.Itoa(models.STATUS_DEL)).SumInt(courses, "course_num")
41
-	if err != nil {
42
-		return 0, err
43
-	}
44
-	return total, nil
31
+// GetCourseOrderNumber 获取课程预约 - 统计课程
32
+func (m *StatisticsDAO) GetCourseOrderNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
33
+	return m.execMySQLFunc("fun_course_order", orgID, caseIDs, start, end)
45 34
 }
46 35
 
47
-// GetGoodsOrderCount 获取商品下单总量
48
-func (m *StatisticsDAO) GetGoodsOrderCount(caseids string) (int64, error) {
49
-	var goodsorder = new(model.TaGoodsOrders)
50
-	total, err := m.db.Where("case_id in ('"+strings.Replace(caseids, ",", "','", -1)+"')").And("status>"+strconv.Itoa(models.STATUS_DEL)).SumInt(goodsorder, "orders_num")
51
-	if err != nil {
52
-		return 0, err
53
-	}
54
-	return total, nil
36
+// GetCourseOrderCustomer 获取课程预约 - 统计人员
37
+func (m *StatisticsDAO) GetCourseOrderCustomer(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
38
+	return m.execMySQLFunc("fun_course_order_customer", orgID, caseIDs, start, end)
55 39
 }
56 40
 
57
-// GetCustomerCountByDate 根据时间获取新增会员数量
58
-func (m *StatisticsDAO) GetCustomerCountByDate(caseids, begindate, enddate string) (int, error) {
59
-	var customers []model.TaCustomer
60
-	err := m.db.Where("recommend_case in ('" + strings.Replace(caseids, ",", "','", -1) + "')").And("binding_date BETWEEN '" + begindate + "' AND '" + enddate + "'").And("status>" + strconv.Itoa(models.STATUS_DEL)).Find(&customers)
61
-	if err != nil {
62
-		return 0, err
63
-	}
64
-	return len(customers), nil
41
+// GetOrderGoodsNumber 获取商品下单数量
42
+func (m *StatisticsDAO) GetOrderGoodsNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
43
+	return m.execMySQLFunc("fun_order_goods_num", orgID, caseIDs, start, end)
65 44
 }
66 45
 
67
-// GetCoursesCountByDate 根据时间获取课程数
68
-func (m *StatisticsDAO) GetCoursesCountByDate(caseids, begindate, enddate string) (int, error) {
69
-	var details []model.TaCourseDetail
70
-	sql := `select a.* from ta_course_detail a inner join ta_course b on a.course_id=b.course_id where b.status=` + strconv.Itoa(models.STATUS_NORMAL)
71
-	sql += ` and a.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `') and a.begin_date  BETWEEN '` + begindate + `' AND '` + enddate + `'`
72
-	err := m.db.Sql(sql).Find(&details)
73
-	if err != nil {
74
-		return 0, err
75
-	}
76
-	return len(details), nil
46
+// GetCourseNumber 获取课程数量
47
+func (m *StatisticsDAO) GetCourseNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
48
+	return m.execMySQLFunc("fun_total_course", orgID, caseIDs, start, end)
77 49
 }
78 50
 
79
-// GetCourseOrderCountByDate 根据时间获取课程预约数量
80
-func (m *StatisticsDAO) GetCourseOrderCountByDate(caseids, begindate, enddate string) (int64, error) {
81
-	courses := new(model.TaCustomerCourse)
82
-	total, err := m.db.Where("case_id in ('"+strings.Replace(caseids, ",", "','", -1)+"')").And("status>"+strconv.Itoa(models.STATUS_DEL)).And("create_date BETWEEN '"+begindate+"' AND '"+enddate+"'").SumInt(courses, "course_num")
83
-	if err != nil {
84
-		return 0, err
85
-	}
86
-	return total, nil
51
+// GetArrivedCustomerNumber 获取到场人数
52
+func (m *StatisticsDAO) GetArrivedCustomerNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
53
+	return m.execMySQLFunc("fun_arrived_customer", orgID, caseIDs, start, end)
87 54
 }
88 55
 
89
-// GetCourseVerifyCountByDate 根据时间获取课程核销人数
90
-func (m *StatisticsDAO) GetCourseVerifyCountByDate(caseids, begindate, enddate string) ([]model.TaCourseVerifcation, error) {
91
-	var courseVerify []model.TaCourseVerifcation
92
-	err := m.db.Where("case_id in ('" + strings.Replace(caseids, ",", "','", -1) + "')").And("status>" + strconv.Itoa(models.STATUS_DEL)).And("create_date BETWEEN '" + begindate + "' AND '" + enddate + "'").Find(&courseVerify)
93
-	return courseVerify, err
56
+// GetCourseCardCustomer 获取预约人数 - 含健身卡
57
+func (m *StatisticsDAO) GetCourseCardCustomer(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
58
+	return m.execMySQLFunc("fun_course_card_customer", orgID, caseIDs, start, end)
94 59
 }
95 60
 
96
-// GetGymVerifyCountByDate 根据时间获取健身卡核销人数
97
-func (m *StatisticsDAO) GetGymVerifyCountByDate(caseids, begindate, enddate string) ([]model.TaGymCardUsage, error) {
98
-	var gyms []model.TaGymCardUsage
99
-	err := m.db.Where("status>" + strconv.Itoa(models.STATUS_DEL)).And("use_case_id in ('" + strings.Replace(caseids, ",", "','", -1) + "')").And("create_date BETWEEN '" + begindate + "' AND '" + enddate + "'").Find(&gyms)
100
-	return gyms, err
61
+// GetCouponCardNumber 获取卡券总数
62
+func (m *StatisticsDAO) GetCouponCardNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
63
+	return m.execMySQLFunc("fun_total_coupon_card", orgID, caseIDs, start, end)
101 64
 }
102 65
 
103
-// GetGoodsOrderCountByDate 根据时间获取商品下单
104
-func (m *StatisticsDAO) GetGoodsOrderCountByDate(caseids, begindate, enddate string) ([]model.TaGoodsOrders, error) {
105
-	var goodsorder []model.TaGoodsOrders
106
-	err := m.db.Where("case_id in ('" + strings.Replace(caseids, ",", "','", -1) + "')").And("create_date BETWEEN '" + begindate + "' AND '" + enddate + "'").And("status>" + strconv.Itoa(models.STATUS_DEL)).Find(&goodsorder)
107
-	return goodsorder, err
66
+// GetUsedCouponCardNumber 获取已使用卡券
67
+func (m *StatisticsDAO) GetUsedCouponCardNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
68
+	return m.execMySQLFunc("fun_used_coupon_card", orgID, caseIDs, start, end)
108 69
 }
109 70
 
110
-//
71
+// GetCustomerCouponCardNumber 获取已发放卡券总数
72
+func (m *StatisticsDAO) GetCustomerCouponCardNumber(orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
73
+	return m.execMySQLFunc("fun_total_customer_coupon_card", orgID, caseIDs, start, end)
74
+}
75
+
76
+// execMySQLFunc 执行 mysql 函数
77
+func (m *StatisticsDAO) execMySQLFunc(funName, orgID string, caseIDs []string, start, end *time.Time) (int64, error) {
78
+	csids := ""
79
+	if caseIDs == nil && len(caseIDs) == 0 {
80
+		csids = strings.Join(caseIDs, ",")
81
+	}
82
+
83
+	startDate := ""
84
+	endDate := ""
85
+
86
+	if start != nil {
87
+		startDate = start.Format("2006-01-02 15:04:05")
88
+	}
89
+	if end != nil {
90
+		endDate = end.Format("2006-01-02 15:04:05")
91
+	}
92
+
93
+	sql := "select " + funName + "(?,?,?,?) as total"
94
+	res, err := m.db.Query(sql, orgID, csids, startDate, endDate)
95
+	if err != nil {
96
+		return 0, err
97
+	}
98
+
99
+	if res == nil || len(res) == 0 {
100
+		return 0, nil
101
+	}
102
+
103
+	total, _ := strconv.ParseInt(string(res[0]["total"]), 10, 64)
104
+	return total, nil
105
+}

+ 1
- 9
models/verify/verify.go 查看文件

@@ -26,10 +26,8 @@ func NewVerifyDAO(ctx *utils.Context) *VerifyDAO {
26 26
 type MyCourse struct {
27 27
 	model.TaCustomerCourseDetail `xorm:"extends"`
28 28
 	CaseName                     string
29
-	CourseName                   string
30 29
 	DetailName                   string
31 30
 	LocationName                 string
32
-	CustomerId                   string
33 31
 }
34 32
 
35 33
 func (m *VerifyDAO) GetCustomerCourseDetailById(id string) (*model.TaCustomerCourseDetail, error) {
@@ -50,10 +48,8 @@ func (m *VerifyDAO) GetCustomerCourseList(customerCourseId, caseids string, page
50 48
 	sql := `SELECT
51 49
 	a.*,
52 50
 	d.case_name,
53
-	b.course_name,	
54 51
 	c.detail_name,
55
-	f.location_name,
56
-	b.customer_id
52
+	f.location_name
57 53
 	FROM
58 54
 	ta_customer_course_detail a
59 55
 	INNER JOIN ta_customer_course b ON a.customer_course_id = b.customer_course_id
@@ -74,7 +70,6 @@ func (m *VerifyDAO) GetCustomerCourseListCount(customerCourseId, caseids string)
74 70
 	sql := `SELECT
75 71
 	a.*,
76 72
 	d.case_name,
77
-	b.course_name,	
78 73
 	c.detail_name
79 74
 	FROM
80 75
 	ta_customer_course_detail a
@@ -105,9 +100,7 @@ func (m *VerifyDAO) GetCustomerCourseListByTel(tel, caseids string, page, pageSi
105 100
 	sql := `SELECT
106 101
 	a.*,
107 102
 	d.case_name,
108
-	b.course_name,
109 103
 	c.detail_name,
110
-	b.customer_id,
111 104
 	f.location_name
112 105
 	FROM
113 106
 	ta_customer_course_detail a
@@ -131,7 +124,6 @@ func (m *VerifyDAO) GetCustomerCourseListByTelCount(tel, caseids string) (int, e
131 124
 	sql := `SELECT
132 125
 	a.*,
133 126
 	d.case_name,
134
-	b.course_name,
135 127
 	c.detail_name
136 128
 FROM
137 129
 	ta_customer_course_detail a

+ 3
- 0
service/course/order.go 查看文件

@@ -345,11 +345,14 @@ func (s *CourseServ) SaveOrder(order *model.TaCourseOrders, course *course.Cours
345 345
 
346 346
 		d2 := model.TaCustomerCourseDetail{
347 347
 			CourseId:     course.CourseId,
348
+			CourseName:   course.CourseName,
349
+			CustomerId:   order.CustomerId,
348 350
 			DetailId:     subCourse.DetailId,
349 351
 			StartDate:    subCourse.BeginDate,
350 352
 			EndDate:      subCourse.EndDate,
351 353
 			VerifyStatus: models.VERIFY_USEABLE,
352 354
 			CaseId:       order.CaseId,
355
+			OrgId:        order.OrgId,
353 356
 		}
354 357
 		custCourseDetails = append(custCourseDetails, d2)
355 358
 	}

+ 265
- 39
service/statistics/dashboard.go 查看文件

@@ -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
 }

+ 41
- 9
service/statistics/setting.go 查看文件

@@ -1,13 +1,45 @@
1 1
 package statistics
2 2
 
3 3
 const (
4
-	STA_TOTAL_CUSTOMER = "total-customer"
5
-	// STA_TOTAL_CUSTOMER = "total-customer"
6
-	// STA_TOTAL_CUSTOMER = "total-customer"
7
-	// STA_TOTAL_CUSTOMER = "total-customer"
8
-)
4
+	// 总会员
5
+	STA_TOTALCUSTOMER = "total_customer"
6
+
7
+	// 总课程预约
8
+	STA_TOTALCOURSEORDER = "total_course_order"
9
+
10
+	// 总商品
11
+	STA_TOTALGOODS = "total_goods"
12
+
13
+	// 今日数据
14
+	STA_TODAYDATA = "today_data"
15
+
16
+	// 今日课程
17
+	STA_TODAYCOURSE = "today_course"
18
+
19
+	// 明日课程预约
20
+	STA_TOMORROWCOURSEORDER = "tomorrow_course_order"
21
+
22
+	// 今日预约人数
23
+	STA_TODAYCOURSECUSTOMER = "today_course_customer"
9 24
 
10
-// StaticMapFrontComponent 每种统计映射的前端组件名称
11
-var StaticMapFrontComponent = map[string]string{
12
-	"total": "",
13
-}
25
+	// 今日到场人数
26
+	STA_TODAY_ARRIVED = "today_arrived"
27
+
28
+	// 明日预约人数
29
+	STA_TOMORROWCOURSECUSTOMER = "tomorrow_course_customer"
30
+
31
+	// 本月商品下单
32
+	STA_MONTHGOODS = "month_goods"
33
+
34
+	// 今日商品下单
35
+	STA_TODAYGOODS = "today_goods"
36
+
37
+	// 本月卡券总数
38
+	STA_MONTHCOUPONCARD = "month_coupon_card"
39
+
40
+	// 本月已发送卡券
41
+	STA_MONTHUNUSEDCOUPONCARD = "month_used_coupon_card"
42
+
43
+	// 本月客户已使用
44
+	STA_MONTHUSEDCOUPONCARD = "month_unused_coupon_card"
45
+)