zjxpcyc 6 yıl önce
ebeveyn
işleme
fb8b272285

+ 1
- 1
conf/db.conf Dosyayı Görüntüle

@@ -6,7 +6,7 @@ con_protocol = tcp
6 6
 
7 7
 ; 数据库地址,可以使用IP
8 8
 # db_addr      = 192.168.0.122
9
-db_addr      = 192.168.0.122
9
+db_addr      = localhost
10 10
 
11 11
 ; 端口
12 12
 db_port      = 3306

+ 1
- 1
conf/log.conf Dosyayı Görüntüle

@@ -1,4 +1,4 @@
1 1
 [common]
2
-filename="E:\\GoProjects\\src\\spaceofcheng\\services\\log\\common.log"
2
+filename="E:\\GoProject\\src\\spaceofcheng\\services\\log\\common.log"
3 3
 # log level "emergency", "alert", "critical", "error", "warning", "notice", "info", "debug"
4 4
 level="debug"

+ 9
- 0
conf/sms.conf Dosyayı Görüntüle

@@ -5,3 +5,12 @@ contentType = "application/json;charset=UTF-8"
5 5
 
6 6
 [captcha]
7 7
 message = {"code": "0113", "tel": "%s", "params": [%s]}
8
+
9
+[goodsclose]
10
+message = {"code": "0114", "tel": "%s", "params": [%s]}
11
+
12
+[couponclose]
13
+message = {"code": "0115", "tel": "%s", "params": [%s]}
14
+
15
+[orders]
16
+message = {"code": "0116", "tel": "%s", "params": [%s]}

+ 4
- 4
controllers/auth.go Dosyayı Görüntüle

@@ -39,10 +39,10 @@ func (c *BaseController) authenticate() {
39 39
 
40 40
 // SetTokenExipre 设置 token 过期
41 41
 func (c *BaseController) SetTokenExipre() {
42
-	token := c.Context.Get("token")
43
-	if token != nil {
44
-		c.serv.UpdateTokenExpire(token.(string))
45
-	}
42
+	// token := c.Context.Get("token")
43
+	// if token != nil {
44
+	// 	c.serv.UpdateTokenExpire(token.(string))
45
+	// }
46 46
 
47 47
 	c.Context.Set("token", "")
48 48
 }

+ 68
- 0
controllers/card/card.go Dosyayı Görüntüle

@@ -6,6 +6,7 @@ import (
6 6
 	"net/http"
7 7
 	"spaceofcheng/services/controllers"
8 8
 	cardModel "spaceofcheng/services/models/card"
9
+	"spaceofcheng/services/models/model"
9 10
 	"spaceofcheng/services/service/card"
10 11
 	"spaceofcheng/services/utils"
11 12
 	"strings"
@@ -198,3 +199,70 @@ func (c *CardController) GetCustomerCardByID() {
198 199
 
199 200
 	c.ResponseJSON(card)
200 201
 }
202
+
203
+// GetCaseUsableCard 获取案场可用券
204
+func (c *CardController) GetCaseUsableCard() {
205
+	page, _ := c.GetInt("page")
206
+	pageSize, _ := c.GetInt("pagesize")
207
+	cards, err := c.serv.GetCaseUsableCard(page, pageSize)
208
+	if err != nil {
209
+		c.ResponseError(err)
210
+	}
211
+
212
+	c.ResponseJSON(cards)
213
+}
214
+
215
+// ReceiveCard 卡领取
216
+func (c *CardController) ReceiveCard() {
217
+	id := c.GetString(":id")
218
+	saleid := c.GetString("saleid")
219
+	serialcode := c.GetString("serialcode")
220
+	cust := c.Context.Get("customer").(model.TaCustomer)
221
+
222
+	if cust.Phone == "" {
223
+		c.ResponseError(
224
+			errors.New("用户未登录或绑定"),
225
+			http.StatusNotAcceptable,
226
+		)
227
+	}
228
+
229
+	err := c.serv.ReceiveCard(id, saleid, serialcode)
230
+	if err != nil {
231
+		c.ResponseError(err)
232
+	}
233
+
234
+	c.ResponseJSON("领取成功!")
235
+}
236
+
237
+// ChannelReceiveCard 渠道端卡领取
238
+func (c *CardController) ChannelReceiveCard() {
239
+	id := c.GetString(":id")
240
+	cust := c.Context.Get("customer").(model.TaCustomer)
241
+
242
+	if cust.Phone == "" {
243
+		c.ResponseError(
244
+			errors.New("用户未登录或绑定"),
245
+			http.StatusNotAcceptable,
246
+		)
247
+	}
248
+
249
+	err := c.serv.ChannelReceiveCard(id)
250
+	if err != nil {
251
+		c.ResponseError(err)
252
+	}
253
+
254
+	c.ResponseJSON("领取成功!")
255
+}
256
+
257
+// GetCustomerCardByCustomerAndSale 获取我的卡信息
258
+func (c *CardController) GetCustomerCardByCustomerAndSale() {
259
+	customerid := c.GetString(":id")
260
+	page, _ := c.GetInt("page")
261
+	pagesize, _ := c.GetInt("pagesize")
262
+
263
+	cards, err := c.serv.GetCustomerCardByCustomerAndSale(customerid, page, pagesize)
264
+	if err != nil {
265
+		c.ResponseError(err)
266
+	}
267
+	c.ResponseJSON(cards)
268
+}

+ 15
- 7
controllers/cases/signin.go Dosyayı Görüntüle

@@ -19,7 +19,7 @@ func (c *SigninController) Constructor() {
19 19
 	c.dao = cases.NewSigninServ(c.Context)
20 20
 }
21 21
 
22
-// GetOrgCases 获取机构案场
22
+
23 23
 /**
24 24
  条件:
25 25
 				 selectType: 今天,本周,本月,今年,全部
@@ -45,18 +45,26 @@ func (c *SigninController) GetSigninWhere() {
45 45
 
46 46
 // AddSignin 存入签到记录
47 47
 func (c *SigninController) AddSignin() {
48
-	phone := c.GetString("phone");
49
-	openId := c.GetString("openId")
50
-	caseId := c.GetString("caseId")
51
-	activityId := c.GetString("activityId")
48
+	phone := c.GetString("tel");
49
+	// openId := c.GetString("openId")
50
+	caseId := c.GetString("fieldId")
51
+	//println("手机号:"+phone+" 案场:"+caseId)
52
+
53
+	//activityId := c.GetString("activityId")
54
+	activityId := "占位符"
55
+
56
+	userMap := c.Context.Get("userMap").(model.TaUserMapping)
57
+	openId := userMap.Openid
52 58
 
53 59
 	signin := model.TaCheckinRecord{}
54 60
 	signin.Phone = phone
55 61
 	signin.OpenId = openId
56 62
 
57
-	userMapping := c.Context.Get("userMap").(model.TaUserMapping)
63
+  // 机构
64
+	org := c.Context.Get("org").(model.SysOrg)
65
+	signin.OrgId = org.OrgId
58 66
 
59
-	res,err := c.dao.AddSignin(signin,caseId,activityId,&userMapping)
67
+	res,err := c.dao.AddSignin(signin,caseId,activityId,&userMap)
60 68
 
61 69
 	if err != nil {
62 70
 		c.ResponseError(err)

+ 68
- 1
controllers/coupon/coupon.go Dosyayı Görüntüle

@@ -9,6 +9,7 @@ import (
9 9
 	"spaceofcheng/services/service/coupon"
10 10
 	"spaceofcheng/services/utils"
11 11
 	"strings"
12
+	"tolet/models/model"
12 13
 )
13 14
 
14 15
 // CouponController 商品
@@ -77,7 +78,7 @@ func (c *CouponController) GetCouponByID() {
77 78
 		c.ResponseError(errors.New("未指定券"))
78 79
 	}
79 80
 
80
-	cp, err := c.serv.GetCouponByID(id)
81
+	cp, err := c.serv.GetCouponInfoByID(id)
81 82
 	if err != nil {
82 83
 		c.ResponseError(err)
83 84
 	}
@@ -210,3 +211,69 @@ func (c *CouponController) GetCustomerCouponByID() {
210 211
 
211 212
 	c.ResponseJSON(coupon)
212 213
 }
214
+
215
+// GetCaseUsableCoupon 获取案场可用券
216
+func (c *CouponController) GetCaseUsableCoupon() {
217
+	page, _ := c.GetInt("page")
218
+	pageSize, _ := c.GetInt("pagesize")
219
+	coupons, err := c.serv.GetCaseUsableCoupon(page, pageSize)
220
+	if err != nil {
221
+		c.ResponseError(err)
222
+	}
223
+	c.ResponseJSON(coupons)
224
+}
225
+
226
+// ReceiveCoupon 卡领取
227
+func (c *CouponController) ReceiveCoupon() {
228
+	id := c.GetString(":id")
229
+	saleid := c.GetString("saleid")
230
+	serialcode := c.GetString("serialcode")
231
+	cust := c.Context.Get("customer").(model.TaCustomer)
232
+
233
+	if cust.Phone == "" {
234
+		c.ResponseError(
235
+			errors.New("用户未登录或绑定"),
236
+			http.StatusNotAcceptable,
237
+		)
238
+	}
239
+
240
+	err := c.serv.ReceiveCoupon(id, saleid, serialcode)
241
+	if err != nil {
242
+		c.ResponseError(err)
243
+	}
244
+
245
+	c.ResponseJSON("领取成功!")
246
+}
247
+
248
+// ChannelReceiveCoupon 渠道端卡领取
249
+func (c *CouponController) ChannelReceiveCoupon() {
250
+	id := c.GetString(":id")
251
+	cust := c.Context.Get("customer").(model.TaCustomer)
252
+
253
+	if cust.Phone == "" {
254
+		c.ResponseError(
255
+			errors.New("用户未登录或绑定"),
256
+			http.StatusNotAcceptable,
257
+		)
258
+	}
259
+
260
+	err := c.serv.ChannelReceiveCoupon(id)
261
+	if err != nil {
262
+		c.ResponseError(err)
263
+	}
264
+
265
+	c.ResponseJSON("领取成功!")
266
+}
267
+
268
+// GetCustomerCouponByCustomerAndSale 获取我的卡信息
269
+func (c *CouponController) GetCustomerCouponByCustomerAndSale() {
270
+	customerid := c.GetString(":id")
271
+	page, _ := c.GetInt("page")
272
+	pagesize, _ := c.GetInt("pagesize")
273
+
274
+	Coupons, err := c.serv.GetCustomerCouponByCustomerAndSale(customerid, page, pagesize)
275
+	if err != nil {
276
+		c.ResponseError(err)
277
+	}
278
+	c.ResponseJSON(Coupons)
279
+}

+ 18
- 0
controllers/gymcard/gymcard.go Dosyayı Görüntüle

@@ -130,3 +130,21 @@ func (c *GymcardController) VerifyCustomerGymcard() {
130 130
 	}
131 131
 	c.ResponseJSON("核销成功")
132 132
 }
133
+
134
+// GiveGymToCustomer 赠送健身卡给客户
135
+func (c *GymcardController) GiveGymToCustomer() {
136
+	id := c.GetString(":id")
137
+	if id == "" {
138
+		c.ResponseError(errors.New("未指定卡"))
139
+	}
140
+
141
+	uids := c.GetString(":users")
142
+	if uids == "" {
143
+		c.ResponseError(errors.New("未指定赠送人"))
144
+	}
145
+	err := c.dao.GiveCardToCustomer(id, uids)
146
+	if err != nil {
147
+		c.ResponseError(err)
148
+	}
149
+	c.ResponseJSON("赠送成功!")
150
+}

+ 23
- 0
controllers/statistics/cardcoupon.go Dosyayı Görüntüle

@@ -0,0 +1,23 @@
1
+package statistics
2
+
3
+import "spaceofcheng/services/models/model"
4
+
5
+// CardCouponStatistics 获取卡券统计数据
6
+func (c *StatisticsController) CardCouponStatistics() {
7
+	page, _ := c.GetInt("page")
8
+	pagesize, _ := c.GetInt("pagesize")
9
+	caseids := c.GetString("caseid")
10
+	name := c.GetString("name")
11
+	ctype := c.GetString("ctype")
12
+
13
+	if caseids == "" {
14
+		cases := c.Context.Get("cases").([]model.SysUserCase)
15
+		caseids = c.GetCaseIDs(cases)
16
+	}
17
+	list, err := c.serv.CardCouponStatistics(caseids, ctype, name, page, pagesize)
18
+	if err != nil {
19
+		c.ResponseError(err)
20
+	}
21
+
22
+	c.ResponseJSON(list)
23
+}

+ 45
- 0
controllers/statistics/course.go Dosyayı Görüntüle

@@ -0,0 +1,45 @@
1
+package statistics
2
+
3
+import "spaceofcheng/services/models/model"
4
+
5
+// GetCourseOrdersStatistics 获取课程订单统计数据
6
+func (c *StatisticsController) GetCourseOrdersStatistics() {
7
+	page, _ := c.GetInt("page")
8
+	pagesize, _ := c.GetInt("pagesize")
9
+	caseids := c.GetString("caseid")
10
+	name := c.GetString("name")
11
+	typeid := c.GetString("typeid")
12
+	begindate := c.GetString("begindate")
13
+	enddate := c.GetString("enddate")
14
+
15
+	if caseids == "" {
16
+		cases := c.Context.Get("cases").([]model.SysUserCase)
17
+		caseids = c.GetCaseIDs(cases)
18
+	}
19
+	ordersList, err := c.serv.GetCourseOrdersStatistics(typeid, caseids, name, begindate, enddate, page, pagesize)
20
+	if err != nil {
21
+		c.ResponseError(err)
22
+	}
23
+
24
+	c.ResponseJSON(ordersList)
25
+}
26
+
27
+// GetCourseStatistics 获取课程统计数据
28
+func (c *StatisticsController) GetCourseStatistics() {
29
+	page, _ := c.GetInt("page")
30
+	pagesize, _ := c.GetInt("pagesize")
31
+	caseids := c.GetString("caseid")
32
+	name := c.GetString("name")
33
+	typeid := c.GetString("typeid")
34
+
35
+	if caseids == "" {
36
+		cases := c.Context.Get("cases").([]model.SysUserCase)
37
+		caseids = c.GetCaseIDs(cases)
38
+	}
39
+	ordersList, err := c.serv.GetCourseStatistics(typeid, caseids, name, page, pagesize)
40
+	if err != nil {
41
+		c.ResponseError(err)
42
+	}
43
+
44
+	c.ResponseJSON(ordersList)
45
+}

+ 45
- 0
controllers/statistics/goods.go Dosyayı Görüntüle

@@ -0,0 +1,45 @@
1
+package statistics
2
+
3
+import "spaceofcheng/services/models/model"
4
+
5
+// GetGoodsStatistics 获取商品统计数据
6
+func (c *StatisticsController) GetGoodsStatistics() {
7
+	page, _ := c.GetInt("page")
8
+	pagesize, _ := c.GetInt("pagesize")
9
+	caseids := c.GetString("caseid")
10
+	name := c.GetString("name")
11
+	typeid := c.GetString("typeid")
12
+
13
+	if caseids == "" {
14
+		cases := c.Context.Get("cases").([]model.SysUserCase)
15
+		caseids = c.GetCaseIDs(cases)
16
+	}
17
+	goodsList, err := c.serv.GetGoodsStatistics(caseids, typeid, name, page, pagesize)
18
+	if err != nil {
19
+		c.ResponseError(err)
20
+	}
21
+
22
+	c.ResponseJSON(goodsList)
23
+}
24
+
25
+// GetGoodsOrdersStatistics 获取商品订单统计数据
26
+func (c *StatisticsController) GetGoodsOrdersStatistics() {
27
+	page, _ := c.GetInt("page")
28
+	pagesize, _ := c.GetInt("pagesize")
29
+	caseids := c.GetString("caseid")
30
+	status := c.GetString("status")
31
+	usertype := c.GetString("usertype")
32
+	begindate := c.GetString("begindate")
33
+	enddate := c.GetString("enddate")
34
+
35
+	if caseids == "" {
36
+		cases := c.Context.Get("cases").([]model.SysUserCase)
37
+		caseids = c.GetCaseIDs(cases)
38
+	}
39
+	goodsList, err := c.serv.GetGoodsOrdersStatistics(status, usertype, caseids, begindate, enddate, page, pagesize)
40
+	if err != nil {
41
+		c.ResponseError(err)
42
+	}
43
+
44
+	c.ResponseJSON(goodsList)
45
+}

+ 19
- 0
controllers/statistics/statistics.go Dosyayı Görüntüle

@@ -0,0 +1,19 @@
1
+package statistics
2
+
3
+import (
4
+	"spaceofcheng/services/controllers"
5
+	"spaceofcheng/services/service/statistics"
6
+)
7
+
8
+// StatisticsController 商品
9
+type StatisticsController struct {
10
+	serv *statistics.StatisticsServ
11
+	controllers.BaseController
12
+}
13
+
14
+// Constructor 初始化 Controller
15
+// @Title Constructor
16
+// @Description 初始化 Controller, 系统自动调用
17
+func (c *StatisticsController) Constructor() {
18
+	c.serv = statistics.NewStatisticsServ(c.Context)
19
+}

+ 674
- 0
log/common.log Dosyayı Görüntüle

@@ -1,3 +1,677 @@
1
+<<<<<<< HEAD
1 2
 2018/09/15 11:14:40 [E] 获取优惠券失败: a pointer to a pointer is not allowed
2 3
 2018/09/15 11:14:57 [E] 获取优惠券失败: a pointer to a pointer is not allowed
3 4
 2018/09/15 11:15:39 [E] 获取优惠券失败: a pointer to a pointer is not allowed
5
+=======
6
+2018/09/14 16:15:08 [E] 获取发送卡信息失败: Error 1054: Unknown column 'serial_code' in 'field list'
7
+2018/09/14 16:15:08 [E] 获取人员信息失败: 获取人员信息失败
8
+2018/09/14 16:20:29 [E] 获取发送卡信息失败: Error 1054: Unknown column 'serial_code' in 'field list'
9
+2018/09/14 16:20:29 [E] 获取人员信息失败: 获取人员信息失败
10
+2018/09/14 16:21:28 [E] 获取发送卡信息失败: Error 1054: Unknown column 'serial_code' in 'field list'
11
+2018/09/14 16:21:28 [E] 获取人员信息失败: 获取人员信息失败
12
+2018/09/14 17:38:13 [E] 获取用户信息失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM
13
+			sys_user t
14
+		JOIN sys_user_type s ON t.user_id = s.user_id
15
+		JOIN td_use' at line 4
16
+2018/09/14 18:49:55 [E] 解析 Token 失败: token contains an invalid number of segments
17
+2018/09/14 18:51:10 [E] 解析 Token 失败: token contains an invalid number of segments
18
+2018/09/14 18:51:28 [E] 解析 Token 失败: token contains an invalid number of segments
19
+2018/09/14 18:51:50 [E] 解析 Token 失败: token contains an invalid number of segments
20
+2018/09/14 18:51:57 [E] 解析 Token 失败: token contains an invalid number of segments
21
+2018/09/14 18:52:05 [E] 解析 Token 失败: token contains an invalid number of segments
22
+2018/09/14 18:53:02 [E] 用户没有设置默认案场
23
+2018/09/14 18:56:00 [E] 获取优惠券失败: a pointer to a pointer is not allowed
24
+2018/09/14 18:56:01 [E] 获取优惠券失败: a pointer to a pointer is not allowed
25
+2018/09/14 18:57:23 [E] 获取优惠券失败: Error 1146: Table 'spaceofcheng.ta_coupon_coupon' doesn't exist
26
+2018/09/14 18:57:29 [E] 获取优惠券失败: Error 1146: Table 'spaceofcheng.ta_coupon_coupon' doesn't exist
27
+2018/09/14 18:57:55 [E] 获取优惠券失败: 无优惠券信息
28
+2018/09/14 18:57:56 [E] 获取优惠券失败: 无优惠券信息
29
+2018/09/14 18:59:40 [E] 获取人员信息失败: 您没有权限查看此用户的数据!
30
+2018/09/14 19:03:57 [E] 用户没有设置默认案场
31
+2018/09/14 19:04:01 [E] 用户没有设置默认案场
32
+2018/09/14 19:04:04 [E] 用户没有设置默认案场
33
+2018/09/14 19:04:06 [E] 用户没有设置默认案场
34
+2018/09/14 19:04:08 [E] 用户没有设置默认案场
35
+2018/09/14 19:04:12 [E] 用户没有设置默认案场
36
+2018/09/14 19:04:14 [E] 用户没有设置默认案场
37
+2018/09/14 19:04:15 [E] 用户没有设置默认案场
38
+2018/09/14 19:04:15 [E] 用户没有设置默认案场
39
+2018/09/14 19:04:18 [E] 用户没有设置默认案场
40
+2018/09/14 19:04:31 [E] 用户没有设置默认案场
41
+2018/09/14 19:04:33 [E] 用户没有设置默认案场
42
+2018/09/14 19:04:35 [E] 用户没有设置默认案场
43
+2018/09/14 19:04:49 [E] 用户没有设置默认案场
44
+2018/09/14 19:06:08 [E] 用户没有设置默认案场
45
+2018/09/14 19:06:12 [E] 用户没有设置默认案场
46
+2018/09/14 19:06:12 [E] 用户没有设置默认案场
47
+2018/09/14 19:06:13 [E] 用户没有设置默认案场
48
+2018/09/14 19:06:14 [E] 用户没有设置默认案场
49
+2018/09/14 19:33:44 [E] 解密 Base64 字串失败: illegal base64 data at input byte 0
50
+2018/09/14 19:33:44 [E] 获取组织信息失败: 没有查询到机构信息
51
+2018/09/14 19:33:48 [E] 用户没有设置默认案场
52
+2018/09/14 19:33:48 [E] 用户没有设置默认案场
53
+2018/09/14 19:33:48 [E] 用户没有设置默认案场
54
+2018/09/14 19:33:50 [E] 解密 Base64 字串失败: illegal base64 data at input byte 0
55
+2018/09/14 19:33:50 [E] 获取组织信息失败: 没有查询到机构信息
56
+2018/09/14 19:33:55 [E] 解密 Base64 字串失败: illegal base64 data at input byte 0
57
+2018/09/14 19:33:55 [E] 获取组织信息失败: 没有查询到机构信息
58
+2018/09/14 19:41:54 [E] 用户没有设置默认案场
59
+2018/09/14 19:41:54 [E] 用户没有设置默认案场
60
+2018/09/14 19:41:55 [E] 用户没有设置默认案场
61
+2018/09/14 19:42:03 [E] 用户没有设置默认案场
62
+2018/09/14 19:42:03 [E] 用户没有设置默认案场
63
+2018/09/14 19:42:03 [E] 用户没有设置默认案场
64
+2018/09/14 19:42:44 [E] 用户没有设置默认案场
65
+2018/09/14 19:42:44 [E] 用户没有设置默认案场
66
+2018/09/14 19:42:45 [E] 用户没有设置默认案场
67
+2018/09/14 19:43:42 [E] 用户没有设置默认案场
68
+2018/09/14 19:43:42 [E] 用户没有设置默认案场
69
+2018/09/14 19:43:42 [E] 用户没有设置默认案场
70
+2018/09/14 19:43:57 [E] 用户没有设置默认案场
71
+2018/09/14 19:43:57 [E] 用户没有设置默认案场
72
+2018/09/14 19:43:58 [E] 用户没有设置默认案场
73
+2018/09/14 19:44:47 [E] 用户没有设置默认案场
74
+2018/09/14 19:44:47 [E] 用户没有设置默认案场
75
+2018/09/14 19:44:47 [E] 用户没有设置默认案场
76
+2018/09/14 19:45:28 [E] 用户没有设置默认案场
77
+2018/09/14 19:45:28 [E] 用户没有设置默认案场
78
+2018/09/14 19:45:28 [E] 用户没有设置默认案场
79
+2018/09/14 20:11:26 [E] 用户没有设置默认案场
80
+2018/09/14 20:11:28 [E] 用户没有设置默认案场
81
+2018/09/14 20:11:28 [E] 用户没有设置默认案场
82
+2018/09/14 20:11:39 [E] 用户没有设置默认案场
83
+2018/09/14 20:11:39 [E] 用户没有设置默认案场
84
+2018/09/14 20:11:40 [E] 用户没有设置默认案场
85
+2018/09/14 20:11:42 [E] 用户没有设置默认案场
86
+2018/09/14 20:11:42 [E] 用户没有设置默认案场
87
+2018/09/14 20:11:42 [E] 用户没有设置默认案场
88
+2018/09/14 20:11:43 [E] 用户没有设置默认案场
89
+2018/09/14 20:11:43 [E] 用户没有设置默认案场
90
+2018/09/14 20:11:43 [E] 用户没有设置默认案场
91
+2018/09/14 20:11:52 [E] 用户没有设置默认案场
92
+2018/09/14 20:12:02 [E] 用户没有设置默认案场
93
+2018/09/14 20:13:30 [E] 用户没有设置默认案场
94
+2018/09/14 20:13:30 [E] 用户没有设置默认案场
95
+2018/09/14 20:13:30 [E] 用户没有设置默认案场
96
+2018/09/14 20:13:40 [E] 用户没有设置默认案场
97
+2018/09/14 20:13:40 [E] 用户没有设置默认案场
98
+2018/09/14 20:13:46 [E] 用户没有设置默认案场
99
+2018/09/14 20:13:46 [E] 用户没有设置默认案场
100
+2018/09/14 20:13:46 [E] 用户没有设置默认案场
101
+2018/09/14 20:13:55 [E] 用户没有设置默认案场
102
+2018/09/14 20:14:26 [E] 用户没有设置默认案场
103
+2018/09/14 20:14:29 [E] 用户没有设置默认案场
104
+2018/09/14 20:14:29 [E] 用户没有设置默认案场
105
+2018/09/14 20:14:29 [E] 用户没有设置默认案场
106
+2018/09/14 20:14:30 [E] 用户没有设置默认案场
107
+2018/09/14 20:14:30 [E] 用户没有设置默认案场
108
+2018/09/14 20:14:30 [E] 用户没有设置默认案场
109
+2018/09/14 20:14:36 [E] 用户没有设置默认案场
110
+2018/09/14 20:15:35 [E] 用户没有设置默认案场
111
+2018/09/14 20:15:35 [E] 用户没有设置默认案场
112
+2018/09/14 20:15:35 [E] 用户没有设置默认案场
113
+2018/09/14 20:15:41 [E] 用户没有设置默认案场
114
+2018/09/14 20:15:41 [E] 用户没有设置默认案场
115
+2018/09/14 20:15:42 [E] 用户没有设置默认案场
116
+2018/09/14 20:15:42 [E] 用户没有设置默认案场
117
+2018/09/14 20:15:46 [E] 用户没有设置默认案场
118
+2018/09/14 20:24:55 [E] 用户没有设置默认案场
119
+2018/09/14 20:24:55 [E] 用户没有设置默认案场
120
+2018/09/14 20:24:55 [E] 用户没有设置默认案场
121
+2018/09/14 22:08:53 [E] 用户没有设置默认案场
122
+2018/09/14 22:08:56 [E] 用户没有设置默认案场
123
+2018/09/14 22:08:56 [E] 用户没有设置默认案场
124
+2018/09/14 22:08:57 [E] 用户没有设置默认案场
125
+2018/09/14 22:08:57 [E] 用户没有设置默认案场
126
+2018/09/14 22:08:58 [E] 用户没有设置默认案场
127
+2018/09/14 22:10:27 [E] 用户没有设置默认案场
128
+2018/09/14 22:10:28 [E] 用户没有设置默认案场
129
+2018/09/14 22:10:28 [E] 用户没有设置默认案场
130
+2018/09/14 22:10:30 [E] 用户没有设置默认案场
131
+2018/09/14 22:10:32 [E] 用户没有设置默认案场
132
+2018/09/14 22:10:32 [E] 用户没有设置默认案场
133
+2018/09/14 22:10:36 [E] 用户没有设置默认案场
134
+2018/09/14 22:10:37 [E] 用户没有设置默认案场
135
+2018/09/14 22:10:37 [E] 用户没有设置默认案场
136
+2018/09/14 22:10:39 [E] 用户没有设置默认案场
137
+2018/09/14 22:10:42 [E] 用户没有设置默认案场
138
+2018/09/14 22:10:43 [E] 用户没有设置默认案场
139
+2018/09/14 22:11:18 [E] 用户没有设置默认案场
140
+2018/09/14 22:11:18 [E] 用户没有设置默认案场
141
+2018/09/14 22:11:32 [E] 用户没有设置默认案场
142
+2018/09/14 22:11:48 [E] 用户没有设置默认案场
143
+2018/09/14 22:11:56 [E] 用户没有设置默认案场
144
+2018/09/14 22:11:56 [E] 用户没有设置默认案场
145
+2018/09/14 22:13:30 [E] 用户没有设置默认案场
146
+2018/09/14 22:13:32 [E] 用户没有设置默认案场
147
+2018/09/14 22:13:32 [E] 用户没有设置默认案场
148
+2018/09/14 22:15:12 [E] 用户没有设置默认案场
149
+2018/09/14 22:15:12 [E] 用户没有设置默认案场
150
+2018/09/14 22:15:22 [E] 用户没有设置默认案场
151
+2018/09/14 22:15:23 [E] 用户没有设置默认案场
152
+2018/09/14 22:15:24 [E] 用户没有设置默认案场
153
+2018/09/14 22:15:47 [E] 用户没有设置默认案场
154
+2018/09/14 22:15:47 [E] 用户没有设置默认案场
155
+2018/09/14 22:15:52 [E] 用户没有设置默认案场
156
+2018/09/14 22:15:55 [E] 用户没有设置默认案场
157
+2018/09/14 22:15:55 [E] 用户没有设置默认案场
158
+2018/09/14 22:15:57 [E] 用户没有设置默认案场
159
+2018/09/14 22:15:57 [E] 用户没有设置默认案场
160
+2018/09/14 22:16:05 [E] 用户没有设置默认案场
161
+2018/09/14 22:16:06 [E] 用户没有设置默认案场
162
+2018/09/14 22:16:06 [E] 用户没有设置默认案场
163
+2018/09/14 22:16:08 [E] 用户没有设置默认案场
164
+2018/09/14 22:16:08 [E] 用户没有设置默认案场
165
+2018/09/14 22:16:54 [E] 用户没有设置默认案场
166
+2018/09/14 22:16:54 [E] 用户没有设置默认案场
167
+2018/09/14 22:16:55 [E] 用户没有设置默认案场
168
+2018/09/14 22:17:17 [E] 用户没有设置默认案场
169
+2018/09/14 22:17:17 [E] 用户没有设置默认案场
170
+2018/09/14 22:17:18 [E] 用户没有设置默认案场
171
+2018/09/14 22:17:48 [E] 用户没有设置默认案场
172
+2018/09/14 22:17:48 [E] 用户没有设置默认案场
173
+2018/09/14 22:17:49 [E] 用户没有设置默认案场
174
+2018/09/14 22:18:43 [E] 用户没有设置默认案场
175
+2018/09/14 22:18:43 [E] 用户没有设置默认案场
176
+2018/09/14 22:18:43 [E] 用户没有设置默认案场
177
+2018/09/14 22:19:23 [E] 用户没有设置默认案场
178
+2018/09/14 22:19:23 [E] 用户没有设置默认案场
179
+2018/09/14 22:19:24 [E] 用户没有设置默认案场
180
+2018/09/14 22:19:43 [E] 用户没有设置默认案场
181
+2018/09/14 22:19:43 [E] 用户没有设置默认案场
182
+2018/09/14 22:19:44 [E] 用户没有设置默认案场
183
+2018/09/14 22:20:23 [E] 用户没有设置默认案场
184
+2018/09/14 22:20:24 [E] 用户没有设置默认案场
185
+2018/09/14 22:24:13 [E] 用户没有设置默认案场
186
+2018/09/14 22:24:24 [E] 用户没有设置默认案场
187
+2018/09/14 22:24:31 [E] 用户没有设置默认案场
188
+2018/09/14 22:24:31 [E] 用户没有设置默认案场
189
+2018/09/14 22:27:41 [E] 用户没有设置默认案场
190
+2018/09/14 22:27:41 [E] 用户没有设置默认案场
191
+2018/09/14 22:27:44 [E] 用户没有设置默认案场
192
+2018/09/14 22:27:46 [E] 用户没有设置默认案场
193
+2018/09/14 22:27:47 [E] 用户没有设置默认案场
194
+2018/09/14 22:27:49 [E] 用户没有设置默认案场
195
+2018/09/14 22:27:52 [E] 用户没有设置默认案场
196
+2018/09/14 22:27:53 [E] 用户没有设置默认案场
197
+2018/09/14 22:27:54 [E] 用户没有设置默认案场
198
+2018/09/14 22:27:56 [E] 用户没有设置默认案场
199
+2018/09/14 22:27:56 [E] 用户没有设置默认案场
200
+2018/09/14 22:27:58 [E] 用户没有设置默认案场
201
+2018/09/14 22:28:02 [E] 用户没有设置默认案场
202
+2018/09/14 22:28:03 [E] 用户没有设置默认案场
203
+2018/09/14 22:28:03 [E] 用户没有设置默认案场
204
+2018/09/14 22:28:06 [E] 用户没有设置默认案场
205
+2018/09/14 22:28:06 [E] 用户没有设置默认案场
206
+2018/09/14 22:28:10 [E] 用户没有设置默认案场
207
+2018/09/14 22:28:12 [E] 用户没有设置默认案场
208
+2018/09/14 22:28:12 [E] 用户没有设置默认案场
209
+2018/09/14 22:28:14 [E] 用户没有设置默认案场
210
+2018/09/14 22:28:15 [E] 用户没有设置默认案场
211
+2018/09/14 22:28:24 [E] 用户没有设置默认案场
212
+2018/09/14 22:28:24 [E] 用户没有设置默认案场
213
+2018/09/14 22:28:35 [E] 用户没有设置默认案场
214
+2018/09/14 22:30:28 [E] 用户没有设置默认案场
215
+2018/09/14 22:30:28 [E] 用户没有设置默认案场
216
+2018/09/14 22:30:28 [E] 用户没有设置默认案场
217
+2018/09/14 22:30:30 [E] 用户没有设置默认案场
218
+2018/09/14 22:30:32 [E] 用户没有设置默认案场
219
+2018/09/14 22:30:32 [E] 用户没有设置默认案场
220
+2018/09/14 22:31:11 [E] 用户没有设置默认案场
221
+2018/09/14 22:31:11 [E] 用户没有设置默认案场
222
+2018/09/14 22:31:14 [E] 用户没有设置默认案场
223
+2018/09/14 22:31:14 [E] 用户没有设置默认案场
224
+2018/09/14 22:31:17 [E] 用户没有设置默认案场
225
+2018/09/14 22:31:17 [E] 用户没有设置默认案场
226
+2018/09/14 22:31:17 [E] 用户没有设置默认案场
227
+2018/09/14 22:31:20 [E] 用户没有设置默认案场
228
+2018/09/14 22:31:21 [E] 用户没有设置默认案场
229
+2018/09/14 22:31:21 [E] 用户没有设置默认案场
230
+2018/09/14 22:31:22 [E] 用户没有设置默认案场
231
+2018/09/14 22:31:22 [E] 用户没有设置默认案场
232
+2018/09/14 22:31:22 [E] 用户没有设置默认案场
233
+2018/09/14 22:31:25 [E] 用户没有设置默认案场
234
+2018/09/14 22:31:25 [E] 用户没有设置默认案场
235
+2018/09/14 22:31:31 [E] 用户没有设置默认案场
236
+2018/09/14 22:31:34 [E] 用户没有设置默认案场
237
+2018/09/14 22:31:34 [E] 用户没有设置默认案场
238
+2018/09/14 22:31:51 [E] 用户没有设置默认案场
239
+2018/09/14 22:31:51 [E] 课程截止时间必须大于开始时间!
240
+2018/09/14 22:32:05 [E] 用户没有设置默认案场
241
+2018/09/14 22:32:05 [E] 用户没有设置默认案场
242
+2018/09/14 22:32:05 [E] 用户没有设置默认案场
243
+2018/09/14 22:32:19 [E] 用户没有设置默认案场
244
+2018/09/14 22:32:23 [E] 用户没有设置默认案场
245
+2018/09/14 22:32:24 [E] 用户没有设置默认案场
246
+2018/09/14 22:32:37 [E] 用户没有设置默认案场
247
+2018/09/14 22:32:38 [E] 用户没有设置默认案场
248
+2018/09/14 22:32:45 [E] 用户没有设置默认案场
249
+2018/09/14 22:33:03 [E] 用户没有设置默认案场
250
+2018/09/14 22:33:03 [E] 用户没有设置默认案场
251
+2018/09/14 22:33:10 [E] 用户没有设置默认案场
252
+2018/09/14 22:33:11 [E] 用户没有设置默认案场
253
+2018/09/14 22:33:15 [E] 用户没有设置默认案场
254
+2018/09/14 22:33:15 [E] 用户没有设置默认案场
255
+2018/09/14 22:33:18 [E] 用户没有设置默认案场
256
+2018/09/14 22:33:18 [E] 用户没有设置默认案场
257
+2018/09/14 22:33:35 [E] 用户没有设置默认案场
258
+2018/09/14 22:33:35 [E] 用户没有设置默认案场
259
+2018/09/14 22:33:48 [E] 用户没有设置默认案场
260
+2018/09/14 22:33:50 [E] 用户没有设置默认案场
261
+2018/09/14 22:33:52 [E] 用户没有设置默认案场
262
+2018/09/14 22:33:52 [E] 用户没有设置默认案场
263
+2018/09/14 22:33:54 [E] 用户没有设置默认案场
264
+2018/09/14 22:33:54 [E] 用户没有设置默认案场
265
+2018/09/14 22:33:57 [E] 用户没有设置默认案场
266
+2018/09/14 22:33:58 [E] 用户没有设置默认案场
267
+2018/09/14 22:33:58 [E] 用户没有设置默认案场
268
+2018/09/14 22:33:59 [E] 用户没有设置默认案场
269
+2018/09/14 22:34:02 [E] 用户没有设置默认案场
270
+2018/09/14 22:34:38 [E] 用户没有设置默认案场
271
+2018/09/14 22:34:41 [E] 用户没有设置默认案场
272
+2018/09/14 22:35:24 [E] 用户没有设置默认案场
273
+2018/09/14 22:35:24 [E] 接收优惠券信息失败: parsing time """" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "2006"
274
+2018/09/14 22:36:00 [E] 用户没有设置默认案场
275
+2018/09/14 22:36:00 [E] 接收优惠券信息失败: parsing time """" as ""2006-01-02T15:04:05Z07:00"": cannot parse """ as "2006"
276
+2018/09/14 22:39:29 [E] 用户没有设置默认案场
277
+2018/09/14 22:39:36 [E] 用户没有设置默认案场
278
+2018/09/14 22:39:37 [E] 用户没有设置默认案场
279
+2018/09/14 22:39:48 [E] 用户没有设置默认案场
280
+2018/09/14 22:39:49 [E] 用户没有设置默认案场
281
+2018/09/14 22:39:50 [E] 用户没有设置默认案场
282
+2018/09/14 22:39:50 [E] 用户没有设置默认案场
283
+2018/09/14 22:39:51 [E] 用户没有设置默认案场
284
+2018/09/14 22:39:52 [E] 用户没有设置默认案场
285
+2018/09/14 22:39:53 [E] 用户没有设置默认案场
286
+2018/09/14 22:39:53 [E] 用户没有设置默认案场
287
+2018/09/15 11:29:11 [E] 用户没有设置默认案场
288
+2018/09/15 11:29:47 [E] 用户没有设置默认案场
289
+2018/09/15 11:30:22 [E] 用户没有设置默认案场
290
+2018/09/15 11:30:22 [E] 用户没有设置默认案场
291
+2018/09/15 11:30:23 [E] 用户没有设置默认案场
292
+2018/09/15 11:30:23 [E] 用户没有设置默认案场
293
+2018/09/15 11:30:30 [E] 用户没有设置默认案场
294
+2018/09/15 11:30:31 [E] 用户没有设置默认案场
295
+2018/09/15 11:30:31 [E] 用户没有设置默认案场
296
+2018/09/15 11:30:32 [E] 用户没有设置默认案场
297
+2018/09/15 11:30:33 [E] 用户没有设置默认案场
298
+2018/09/15 11:30:33 [E] 用户没有设置默认案场
299
+2018/09/15 11:36:00 [E] 用户没有设置默认案场
300
+2018/09/15 11:36:00 [E] 用户没有设置默认案场
301
+2018/09/15 11:36:10 [E] 用户没有设置默认案场
302
+2018/09/15 11:36:11 [E] 用户没有设置默认案场
303
+2018/09/15 11:36:13 [E] 用户没有设置默认案场
304
+2018/09/15 11:36:13 [E] 用户没有设置默认案场
305
+2018/09/15 11:36:19 [E] 用户没有设置默认案场
306
+2018/09/15 11:36:19 [E] 用户没有设置默认案场
307
+2018/09/15 11:36:50 [E] 用户没有设置默认案场
308
+2018/09/15 11:36:50 [E] 用户没有设置默认案场
309
+2018/09/15 11:36:54 [E] 用户没有设置默认案场
310
+2018/09/15 11:36:54 [E] 用户没有设置默认案场
311
+2018/09/15 11:36:54 [E] 用户没有设置默认案场
312
+2018/09/15 11:37:07 [E] 用户没有设置默认案场
313
+2018/09/15 11:37:08 [E] 用户没有设置默认案场
314
+2018/09/15 11:37:10 [E] 用户没有设置默认案场
315
+2018/09/15 11:37:10 [E] 用户没有设置默认案场
316
+2018/09/15 11:37:10 [E] 用户没有设置默认案场
317
+2018/09/15 11:37:18 [E] 用户没有设置默认案场
318
+2018/09/15 11:37:18 [E] 用户没有设置默认案场
319
+2018/09/15 11:37:23 [E] 用户没有设置默认案场
320
+2018/09/15 11:37:23 [E] 用户没有设置默认案场
321
+2018/09/15 11:37:23 [E] 用户没有设置默认案场
322
+2018/09/15 11:37:32 [E] 用户没有设置默认案场
323
+2018/09/15 11:37:36 [E] 用户没有设置默认案场
324
+2018/09/15 11:45:20 [E] 用户没有设置默认案场
325
+2018/09/15 11:45:22 [E] 用户没有设置默认案场
326
+2018/09/15 11:45:22 [E] 用户没有设置默认案场
327
+2018/09/15 11:46:04 [E] 用户没有设置默认案场
328
+2018/09/15 11:46:04 [E] 用户没有设置默认案场
329
+2018/09/15 11:46:11 [E] 用户没有设置默认案场
330
+2018/09/15 11:46:11 [E] 用户没有设置默认案场
331
+2018/09/15 11:46:16 [E] 用户没有设置默认案场
332
+2018/09/15 11:46:16 [E] 用户没有设置默认案场
333
+2018/09/15 11:46:20 [E] 用户没有设置默认案场
334
+2018/09/15 11:46:23 [E] 用户没有设置默认案场
335
+2018/09/15 11:46:56 [E] 用户没有设置默认案场
336
+2018/09/15 11:47:01 [E] 用户没有设置默认案场
337
+2018/09/15 11:47:25 [E] 用户没有设置默认案场
338
+2018/09/15 11:47:25 [E] 用户没有设置默认案场
339
+2018/09/15 11:47:36 [E] 用户没有设置默认案场
340
+2018/09/15 11:47:36 [E] 用户没有设置默认案场
341
+2018/09/15 13:28:31 [E] 用户没有设置默认案场
342
+2018/09/15 13:28:34 [E] 用户没有设置默认案场
343
+2018/09/15 13:29:21 [E] 用户没有设置默认案场
344
+2018/09/15 13:29:56 [E] 用户没有设置默认案场
345
+2018/09/15 13:30:01 [E] 用户没有设置默认案场
346
+2018/09/15 13:30:04 [E] 用户没有设置默认案场
347
+2018/09/15 13:30:04 [E] 用户没有设置默认案场
348
+2018/09/15 13:30:07 [E] 用户没有设置默认案场
349
+2018/09/15 13:30:10 [E] 用户没有设置默认案场
350
+2018/09/15 13:45:16 [E] 用户没有设置默认案场
351
+2018/09/15 13:45:16 [E] 用户没有设置默认案场
352
+2018/09/15 13:45:18 [E] 用户没有设置默认案场
353
+2018/09/15 13:45:24 [E] 用户没有设置默认案场
354
+2018/09/15 13:45:24 [E] 用户没有设置默认案场
355
+2018/09/15 13:49:03 [E] 用户没有设置默认案场
356
+2018/09/15 13:49:03 [E] 用户没有设置默认案场
357
+2018/09/15 13:49:07 [E] 用户没有设置默认案场
358
+2018/09/15 13:49:08 [E] 用户没有设置默认案场
359
+2018/09/15 13:49:08 [E] 用户没有设置默认案场
360
+2018/09/15 13:49:20 [E] 用户没有设置默认案场
361
+2018/09/15 13:49:20 [E] 用户没有设置默认案场
362
+2018/09/15 13:49:20 [E] 用户没有设置默认案场
363
+2018/09/15 13:49:23 [E] 用户没有设置默认案场
364
+2018/09/15 13:49:27 [E] 用户没有设置默认案场
365
+2018/09/15 13:49:28 [E] 用户没有设置默认案场
366
+2018/09/15 13:49:31 [E] 用户没有设置默认案场
367
+2018/09/15 13:49:31 [E] 用户没有设置默认案场
368
+2018/09/15 13:49:35 [E] 用户没有设置默认案场
369
+2018/09/15 13:49:37 [E] 用户没有设置默认案场
370
+2018/09/15 13:49:37 [E] 用户没有设置默认案场
371
+2018/09/15 13:49:38 [E] 用户没有设置默认案场
372
+2018/09/15 13:49:39 [E] 用户没有设置默认案场
373
+2018/09/15 13:49:40 [E] 用户没有设置默认案场
374
+2018/09/15 13:49:42 [E] 用户没有设置默认案场
375
+2018/09/15 13:49:44 [E] 用户没有设置默认案场
376
+2018/09/15 13:49:44 [E] 用户没有设置默认案场
377
+2018/09/15 13:49:50 [E] 用户没有设置默认案场
378
+2018/09/15 13:49:50 [E] 用户没有设置默认案场
379
+2018/09/15 13:49:54 [E] 用户没有设置默认案场
380
+2018/09/15 13:49:54 [E] 用户没有设置默认案场
381
+2018/09/15 13:49:54 [E] 用户没有设置默认案场
382
+2018/09/15 13:50:04 [E] 用户没有设置默认案场
383
+2018/09/15 13:50:04 [E] 用户没有设置默认案场
384
+2018/09/15 13:50:04 [E] 用户没有设置默认案场
385
+2018/09/15 13:50:06 [E] 用户没有设置默认案场
386
+2018/09/15 13:50:07 [E] 用户没有设置默认案场
387
+2018/09/15 13:50:08 [E] 用户没有设置默认案场
388
+2018/09/15 13:50:15 [E] 用户没有设置默认案场
389
+2018/09/15 13:50:15 [E] 用户没有设置默认案场
390
+2018/09/15 13:50:15 [E] 用户没有设置默认案场
391
+2018/09/15 13:51:50 [E] 用户没有设置默认案场
392
+2018/09/15 13:51:50 [E] 用户没有设置默认案场
393
+2018/09/15 13:51:50 [E] 用户没有设置默认案场
394
+2018/09/15 13:52:55 [E] 用户没有设置默认案场
395
+2018/09/15 13:52:55 [E] 用户没有设置默认案场
396
+2018/09/15 13:52:57 [E] 用户没有设置默认案场
397
+2018/09/15 13:52:57 [E] 用户没有设置默认案场
398
+2018/09/15 13:52:57 [E] 用户没有设置默认案场
399
+2018/09/15 13:52:59 [E] 用户没有设置默认案场
400
+2018/09/15 13:52:59 [E] 用户没有设置默认案场
401
+2018/09/15 13:53:01 [E] 用户没有设置默认案场
402
+2018/09/15 13:53:02 [E] 用户没有设置默认案场
403
+2018/09/15 13:53:02 [E] 用户没有设置默认案场
404
+2018/09/15 13:53:14 [E] 用户没有设置默认案场
405
+2018/09/15 13:53:14 [E] 用户没有设置默认案场
406
+2018/09/15 13:53:14 [E] 用户没有设置默认案场
407
+2018/09/15 13:53:16 [E] 用户没有设置默认案场
408
+2018/09/15 13:53:17 [E] 用户没有设置默认案场
409
+2018/09/15 13:53:17 [E] 用户没有设置默认案场
410
+2018/09/15 13:53:52 [E] 用户没有设置默认案场
411
+2018/09/15 13:53:52 [E] 用户没有设置默认案场
412
+2018/09/15 13:55:00 [E] 用户没有设置默认案场
413
+2018/09/15 13:55:01 [E] 用户没有设置默认案场
414
+2018/09/15 13:56:24 [E] 用户没有设置默认案场
415
+2018/09/15 13:56:24 [E] 用户没有设置默认案场
416
+2018/09/15 13:56:37 [E] 用户没有设置默认案场
417
+2018/09/15 13:56:41 [E] 用户没有设置默认案场
418
+2018/09/15 13:56:41 [E] 用户没有设置默认案场
419
+2018/09/15 13:56:43 [E] 用户没有设置默认案场
420
+2018/09/15 14:13:12 [E] 用户没有设置默认案场
421
+2018/09/15 14:13:13 [E] 用户没有设置默认案场
422
+2018/09/15 14:13:14 [E] 用户没有设置默认案场
423
+2018/09/15 14:13:16 [E] 用户没有设置默认案场
424
+2018/09/15 14:13:16 [E] 用户没有设置默认案场
425
+2018/09/15 14:13:17 [E] 用户没有设置默认案场
426
+2018/09/15 14:13:22 [E] 用户没有设置默认案场
427
+2018/09/15 14:13:27 [E] 用户没有设置默认案场
428
+2018/09/15 14:21:00 [E] 用户没有设置默认案场
429
+2018/09/15 14:21:00 [E] 用户没有设置默认案场
430
+2018/09/15 14:21:01 [E] 用户没有设置默认案场
431
+2018/09/15 14:21:03 [E] 用户没有设置默认案场
432
+2018/09/15 14:21:03 [E] 用户没有设置默认案场
433
+2018/09/15 14:23:36 [E] 用户没有设置默认案场
434
+2018/09/15 14:23:39 [E] 用户没有设置默认案场
435
+2018/09/15 14:23:39 [E] 用户没有设置默认案场
436
+2018/09/15 14:23:42 [E] 用户没有设置默认案场
437
+2018/09/15 14:23:43 [E] 用户没有设置默认案场
438
+2018/09/15 14:23:43 [E] 用户没有设置默认案场
439
+2018/09/15 14:23:44 [E] 用户没有设置默认案场
440
+2018/09/15 14:23:49 [E] 用户没有设置默认案场
441
+2018/09/15 14:23:49 [E] 用户没有设置默认案场
442
+2018/09/15 15:48:21 [E] 用户没有设置默认案场
443
+2018/09/15 15:48:24 [E] 用户没有设置默认案场
444
+2018/09/15 15:48:29 [E] 用户没有设置默认案场
445
+2018/09/15 15:48:29 [E] 用户没有设置默认案场
446
+2018/09/15 15:48:32 [E] 用户没有设置默认案场
447
+2018/09/15 15:48:36 [E] 用户没有设置默认案场
448
+2018/09/15 15:48:36 [E] 用户没有设置默认案场
449
+2018/09/15 17:32:50 [E] 用户没有设置默认案场
450
+2018/09/15 17:32:50 [E] 用户没有设置默认案场
451
+2018/09/15 17:35:31 [E] 用户没有设置默认案场
452
+2018/09/15 17:35:31 [E] 用户没有设置默认案场
453
+2018/09/15 19:53:50 [E] 用户没有设置默认案场
454
+2018/09/15 19:58:02 [E] 用户没有设置默认案场
455
+2018/09/15 19:58:21 [E] 用户没有设置默认案场
456
+2018/09/15 19:59:28 [E] 用户没有设置默认案场
457
+2018/09/15 19:59:28 [E] 用户没有设置默认案场
458
+2018/09/15 20:00:27 [E] 用户没有设置默认案场
459
+2018/09/15 20:00:27 [E] 用户没有设置默认案场
460
+2018/09/15 20:05:23 [E] 用户没有设置默认案场
461
+2018/09/15 20:05:23 [E] 用户没有设置默认案场
462
+2018/09/15 20:05:34 [E] 用户没有设置默认案场
463
+2018/09/15 20:05:34 [E] 用户没有设置默认案场
464
+2018/09/15 20:06:38 [E] 用户没有设置默认案场
465
+2018/09/15 20:08:27 [E] 用户没有设置默认案场
466
+2018/09/15 20:09:25 [E] 用户没有设置默认案场
467
+2018/09/15 20:10:33 [E] 用户没有设置默认案场
468
+2018/09/15 20:10:36 [E] 用户没有设置默认案场
469
+2018/09/15 20:10:36 [E] 获取商品统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lile '%111%' GROUP BY
470
+					e.case_name,
471
+					b.goods_name,
472
+					c.type_name,
473
+			' at line 24
474
+2018/09/15 20:10:59 [E] 用户没有设置默认案场
475
+2018/09/15 20:10:59 [E] 获取商品统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lile '%111%' GROUP BY
476
+					e.case_name,
477
+					b.goods_name,
478
+					c.type_name,
479
+			' at line 24
480
+2018/09/15 20:14:41 [E] 用户没有设置默认案场
481
+2018/09/15 20:14:41 [E] 获取商品统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lile '%111%' GROUP BY
482
+					e.case_name,
483
+					b.goods_name,
484
+					c.type_name,
485
+			' at line 24
486
+2018/09/15 20:15:09 [E] 用户没有设置默认案场
487
+2018/09/15 20:15:09 [E] 获取商品统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'lile '%111%' GROUP BY
488
+					e.case_name,
489
+					b.goods_name,
490
+					c.type_name,
491
+			' at line 24
492
+2018/09/15 20:16:08 [E] 用户没有设置默认案场
493
+2018/09/15 20:16:33 [E] 用户没有设置默认案场
494
+2018/09/15 20:16:33 [E] 用户没有设置默认案场
495
+2018/09/15 20:18:10 [E] 用户没有设置默认案场
496
+2018/09/15 20:18:11 [E] 用户没有设置默认案场
497
+2018/09/15 20:18:16 [E] 用户没有设置默认案场
498
+2018/09/15 20:18:16 [E] 用户没有设置默认案场
499
+2018/09/15 20:18:17 [E] 用户没有设置默认案场
500
+2018/09/15 20:19:05 [E] 用户没有设置默认案场
501
+2018/09/15 20:19:05 [E] 用户没有设置默认案场
502
+2018/09/15 20:19:12 [E] 用户没有设置默认案场
503
+2018/09/15 20:19:19 [E] 用户没有设置默认案场
504
+2018/09/15 20:19:19 [E] 创建VIP卡失败: Error 1054: Unknown column 'sales_id' in 'field list'
505
+2018/09/15 20:20:02 [E] 用户没有设置默认案场
506
+2018/09/15 20:21:40 [E] 用户没有设置默认案场
507
+2018/09/15 20:21:40 [E] 用户没有设置默认案场
508
+2018/09/15 20:21:40 [E] 用户没有设置默认案场
509
+2018/09/15 20:21:55 [E] 用户没有设置默认案场
510
+2018/09/15 20:21:55 [E] 用户没有设置默认案场
511
+2018/09/15 20:22:03 [E] 用户没有设置默认案场
512
+2018/09/15 20:22:23 [E] 用户没有设置默认案场
513
+2018/09/15 20:22:25 [E] 用户没有设置默认案场
514
+2018/09/15 20:22:30 [E] 用户没有设置默认案场
515
+2018/09/15 20:22:36 [E] 课程下单失败: Error 1366: Incorrect decimal value: '' for column 'coupon_amount' at row 1
516
+2018/09/15 20:22:36 [E] 课程下单失败: 下单失败, 请重试
517
+2018/09/15 20:23:41 [E] 用户没有设置默认案场
518
+2018/09/15 20:23:41 [E] 用户没有设置默认案场
519
+2018/09/15 20:23:42 [E] 用户没有设置默认案场
520
+2018/09/15 20:28:39 [E] 用户没有设置默认案场
521
+2018/09/15 20:28:39 [E] 用户没有设置默认案场
522
+2018/09/15 20:30:57 [E] 用户没有设置默认案场
523
+2018/09/15 20:30:57 [E] 用户没有设置默认案场
524
+2018/09/15 20:31:21 [E] 用户没有设置默认案场
525
+2018/09/15 20:31:21 [E] 用户没有设置默认案场
526
+2018/09/15 20:35:30 [E] 用户没有设置默认案场
527
+2018/09/15 20:36:12 [E] 用户没有设置默认案场
528
+2018/09/15 20:36:12 [E] 用户没有设置默认案场
529
+2018/09/15 20:45:17 [E] 用户没有设置默认案场
530
+2018/09/15 20:46:02 [E] 用户没有设置默认案场
531
+2018/09/15 20:46:28 [E] 用户没有设置默认案场
532
+2018/09/15 20:46:41 [E] 用户没有设置默认案场
533
+2018/09/15 20:46:41 [E] 用户没有设置默认案场
534
+2018/09/15 20:47:09 [E] 用户没有设置默认案场
535
+2018/09/15 20:47:09 [E] 用户没有设置默认案场
536
+2018/09/15 20:47:26 [E] 用户没有设置默认案场
537
+2018/09/15 20:47:29 [E] 用户没有设置默认案场
538
+2018/09/15 20:47:29 [E] 用户没有设置默认案场
539
+2018/09/15 20:47:50 [E] 用户没有设置默认案场
540
+2018/09/15 20:48:53 [E] 用户没有设置默认案场
541
+2018/09/15 20:54:06 [E] 用户没有设置默认案场
542
+2018/09/15 20:54:11 [E] 用户没有设置默认案场
543
+2018/09/15 20:54:16 [E] 用户没有设置默认案场
544
+2018/09/15 20:55:29 [E] 用户没有设置默认案场
545
+2018/09/15 20:56:43 [E] 用户没有设置默认案场
546
+2018/09/15 20:56:46 [E] 用户没有设置默认案场
547
+2018/09/15 20:57:08 [E] 用户没有设置默认案场
548
+2018/09/15 20:57:08 [E] 用户没有设置默认案场
549
+2018/09/15 20:57:14 [E] 用户没有设置默认案场
550
+2018/09/15 20:57:17 [E] 用户没有设置默认案场
551
+2018/09/15 20:57:24 [E] 用户没有设置默认案场
552
+2018/09/15 20:58:03 [E] 用户没有设置默认案场
553
+2018/09/15 20:58:42 [E] 用户没有设置默认案场
554
+2018/09/15 21:01:05 [E] 用户没有设置默认案场
555
+2018/09/15 21:03:14 [E] 用户没有设置默认案场
556
+2018/09/15 21:04:55 [E] 用户没有设置默认案场
557
+2018/09/15 21:05:20 [E] 用户没有设置默认案场
558
+2018/09/15 21:07:38 [E] 用户没有设置默认案场
559
+2018/09/15 21:08:00 [E] 用户没有设置默认案场
560
+2018/09/15 21:09:20 [E] 用户没有设置默认案场
561
+2018/09/15 21:09:35 [E] 用户没有设置默认案场
562
+2018/09/15 21:09:35 [E] 用户没有设置默认案场
563
+2018/09/15 21:09:58 [E] 用户没有设置默认案场
564
+2018/09/15 21:10:18 [E] 用户没有设置默认案场
565
+2018/09/15 21:10:18 [E] 用户没有设置默认案场
566
+2018/09/15 21:10:50 [E] 用户没有设置默认案场
567
+2018/09/15 21:11:12 [E] 用户没有设置默认案场
568
+2018/09/15 21:11:20 [E] 用户没有设置默认案场
569
+2018/09/15 21:12:04 [E] 用户没有设置默认案场
570
+2018/09/15 21:12:55 [E] 用户没有设置默认案场
571
+2018/09/15 21:13:03 [E] 用户没有设置默认案场
572
+2018/09/15 21:18:03 [E] 用户没有设置默认案场
573
+2018/09/15 21:18:03 [E] 用户没有设置默认案场
574
+2018/09/15 21:18:09 [E] 用户没有设置默认案场
575
+2018/09/15 21:18:09 [E] 用户没有设置默认案场
576
+2018/09/15 21:18:09 [E] 用户没有设置默认案场
577
+2018/09/15 21:18:49 [E] 用户没有设置默认案场
578
+2018/09/15 21:18:49 [E] 用户没有设置默认案场
579
+2018/09/15 21:18:50 [E] 用户没有设置默认案场
580
+2018/09/15 21:19:33 [E] 用户没有设置默认案场
581
+2018/09/15 21:19:33 [E] 用户没有设置默认案场
582
+2018/09/15 21:19:48 [E] 用户没有设置默认案场
583
+2018/09/15 21:19:48 [E] 用户没有设置默认案场
584
+2018/09/15 21:19:51 [E] 用户没有设置默认案场
585
+2018/09/15 21:40:12 [E] 用户没有设置默认案场
586
+2018/09/15 21:41:19 [E] 用户没有设置默认案场
587
+2018/09/15 21:42:34 [E] 用户没有设置默认案场
588
+2018/09/15 21:43:20 [E] 用户没有设置默认案场
589
+2018/09/15 21:43:20 [E] 获取课程统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
590
+					*
591
+				FROM
592
+					ta_customer_course
593
+				Where d.case_id in ('9c04f91b' at line 34
594
+2018/09/15 21:43:23 [E] 用户没有设置默认案场
595
+2018/09/15 21:43:23 [E] 获取课程统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
596
+					*
597
+				FROM
598
+					ta_customer_course
599
+				Where d.case_id in ('9c04f91b' at line 34
600
+2018/09/15 21:43:59 [E] 用户没有设置默认案场
601
+2018/09/15 21:43:59 [E] 获取课程统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
602
+					*
603
+				FROM
604
+					ta_customer_course
605
+				Where d.case_id in ('9c04f91b' at line 34
606
+2018/09/15 21:44:20 [E] 用户没有设置默认案场
607
+2018/09/15 21:44:20 [E] 用户没有设置默认案场
608
+2018/09/15 21:45:48 [E] 用户没有设置默认案场
609
+2018/09/15 21:45:48 [E] 用户没有设置默认案场
610
+2018/09/15 21:45:48 [E] 获取课程统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM
611
+					ta_course a
612
+				INNER JOIN sys_case d ON a.case_id = d.case_id
613
+				INN' at line 9
614
+2018/09/15 21:48:06 [E] 用户没有设置默认案场
615
+2018/09/15 21:48:06 [E] 用户没有设置默认案场
616
+2018/09/15 21:48:06 [E] 用户没有设置默认案场
617
+2018/09/15 21:48:06 [E] 获取课程统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM
618
+					ta_course a
619
+				INNER JOIN sys_case d ON a.case_id = d.case_id
620
+				INN' at line 9
621
+2018/09/15 21:48:20 [E] 用户没有设置默认案场
622
+2018/09/15 21:48:20 [E] 用户没有设置默认案场
623
+2018/09/15 21:48:20 [E] 用户没有设置默认案场
624
+2018/09/15 21:51:03 [E] 用户没有设置默认案场
625
+2018/09/15 21:51:03 [E] 用户没有设置默认案场
626
+2018/09/15 21:51:11 [E] 用户没有设置默认案场
627
+2018/09/15 21:51:11 [E] 用户没有设置默认案场
628
+2018/09/15 21:51:11 [E] 用户没有设置默认案场
629
+2018/09/15 21:51:33 [E] 用户没有设置默认案场
630
+2018/09/15 21:51:38 [E] 用户没有设置默认案场
631
+2018/09/15 21:51:41 [E] 用户没有设置默认案场
632
+2018/09/15 21:51:41 [E] 用户没有设置默认案场
633
+2018/09/15 21:51:46 [E] 用户没有设置默认案场
634
+2018/09/15 21:51:48 [E] 用户没有设置默认案场
635
+2018/09/15 21:51:50 [E] 用户没有设置默认案场
636
+2018/09/15 21:51:50 [E] 用户没有设置默认案场
637
+2018/09/15 21:51:55 [E] 用户没有设置默认案场
638
+2018/09/15 21:51:55 [E] 用户没有设置默认案场
639
+2018/09/15 22:18:54 [E] 用户没有设置默认案场
640
+2018/09/15 22:18:57 [E] 用户没有设置默认案场
641
+2018/09/15 22:19:59 [E] 用户没有设置默认案场
642
+2018/09/15 22:20:01 [E] 用户没有设置默认案场
643
+2018/09/15 22:20:21 [E] 用户没有设置默认案场
644
+2018/09/15 22:47:00 [E] 用户没有设置默认案场
645
+2018/09/15 22:47:30 [E] 用户没有设置默认案场
646
+2018/09/15 22:48:21 [E] 用户没有设置默认案场
647
+2018/09/15 22:50:03 [E] 用户没有设置默认案场
648
+2018/09/15 22:50:03 [E] 获取卡券统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 47
649
+2018/09/15 22:50:13 [E] 用户没有设置默认案场
650
+2018/09/15 22:50:13 [E] 用户没有设置默认案场
651
+2018/09/15 22:50:13 [E] 获取卡券统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 47
652
+2018/09/15 22:50:43 [E] 用户没有设置默认案场
653
+2018/09/15 22:50:43 [E] 获取卡券统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 47
654
+2018/09/15 22:50:54 [E] 用户没有设置默认案场
655
+2018/09/15 22:50:54 [E] 获取卡券统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 47
656
+2018/09/15 22:51:06 [E] 用户没有设置默认案场
657
+2018/09/15 22:51:06 [E] 获取卡券统计数据失败: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 47
658
+2018/09/15 22:51:06 [E] 用户没有设置默认案场
659
+2018/09/15 22:52:12 [E] 用户没有设置默认案场
660
+2018/09/15 22:52:12 [E] 用户没有设置默认案场
661
+2018/09/15 22:54:10 [E] 用户没有设置默认案场
662
+2018/09/15 22:55:21 [E] 用户没有设置默认案场
663
+2018/09/15 22:57:24 [E] 用户没有设置默认案场
664
+2018/09/15 22:58:36 [E] 用户没有设置默认案场
665
+2018/09/15 22:58:41 [E] 用户没有设置默认案场
666
+2018/09/15 22:58:54 [E] 用户没有设置默认案场
667
+2018/09/15 22:58:59 [E] 用户没有设置默认案场
668
+2018/09/15 22:58:59 [E] 用户没有设置默认案场
669
+2018/09/15 22:59:16 [E] 用户没有设置默认案场
670
+2018/09/15 22:59:16 [E] 用户没有设置默认案场
671
+2018/09/15 22:59:18 [E] 用户没有设置默认案场
672
+2018/09/15 22:59:27 [E] 用户没有设置默认案场
673
+2018/09/15 22:59:27 [E] 用户没有设置默认案场
674
+2018/09/15 22:59:28 [E] 用户没有设置默认案场
675
+2018/09/15 22:59:28 [E] 用户没有设置默认案场
676
+2018/09/15 22:59:31 [E] 用户没有设置默认案场
677
+>>>>>>> 261635f0082f4060d7e426d9b9a13779d3d891e3

+ 67
- 6
models/card/card.go Dosyayı Görüntüle

@@ -108,7 +108,14 @@ func (m *CardDAO) AddCard(card *model.TaCouponCard) error {
108 108
 	return nil
109 109
 }
110 110
 
111
-// UpdateCard 更新优惠券
111
+// GetCardInfoByID 获取卡信息
112
+func (m *CardDAO) GetCardInfoByID(cardid string) (*model.TaCouponCard, error) {
113
+	var card = model.TaCouponCard{}
114
+	_, err := m.db.Where("card_id=?", cardid).Get(&card)
115
+	return &card, err
116
+}
117
+
118
+// UpdateCard 更新体验卡
112 119
 func (m *CardDAO) UpdateCard(card *model.TaCouponCard, cols []string) error {
113 120
 	if card.CardId == "" {
114 121
 		return errors.New("无卡信息")
@@ -216,6 +223,7 @@ func (m *CardDAO) CheckCustCard(custID, CardID string, startDate, endDate time.T
216 223
 type CaseUsableCard struct {
217 224
 	model.TaCouponCard `xorm:"extends"`
218 225
 	CustomerCard       []model.TaCustomerCard
226
+	Share              *model.TaExperienceCardShare
219 227
 }
220 228
 
221 229
 // GetCaseUsableCard 获取案场可用卡信息
@@ -223,18 +231,31 @@ func (m *CardDAO) GetCaseUsableCard(caseid, userid string, page, pageSize int) (
223 231
 	var cards []CaseUsableCard
224 232
 	sql := `select * from ta_coupon_card where case_id=? and status=? and end_date>now() order by create_date limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
225 233
 	err := m.db.Sql(sql, caseid, models.STATUS_NORMAL).Find(&cards)
226
-	if userid != "" {
227
-		for inx, card := range cards {
234
+	for inx, card := range cards {
235
+		if userid != "" {
228 236
 			cCards, err := m.GetCustomerCardByCardAndUser(card.CardId, userid)
229 237
 			if err != nil {
230 238
 				return nil, err
231 239
 			}
232 240
 			cards[inx].CustomerCard = cCards
233 241
 		}
242
+		share, err := m.GetCardShareByCardID(card.CardId)
243
+		if err != nil {
244
+			return nil, err
245
+		}
246
+		cards[inx].Share = share
234 247
 	}
235 248
 	return cards, err
236 249
 }
237 250
 
251
+// GetCaseUsableCardCount 获取案场可用卡数量
252
+func (m *CardDAO) GetCaseUsableCardCount(caseid, userid string) (int, error) {
253
+	var Coupons []CaseUsableCard
254
+	sql := `select * from ta_coupon_card where case_id=? and status=? and end_date>now()`
255
+	err := m.db.Sql(sql, caseid, models.STATUS_NORMAL).Find(&Coupons)
256
+	return len(Coupons), err
257
+}
258
+
238 259
 // GetCustomerCardByCardAndUser 根据卡与用户获取领取的用户信息
239 260
 func (m *CardDAO) GetCustomerCardByCardAndUser(cardid, userid string) ([]model.TaCustomerCard, error) {
240 261
 	var customerCards []model.TaCustomerCard
@@ -275,7 +296,7 @@ func (m *CardDAO) GetCustomerCardByUser(caseid, userid string) ([]model.TaCustom
275 296
 	return customerCards, err
276 297
 }
277 298
 
278
-// GetCardWithCustomer 获取优惠券明细
299
+// GetCardWithCustomer 获取体验卡明细
279 300
 func (m *CardDAO) GetCardWithCustomer(cardid string) (*CaseUsableCard, error) {
280 301
 	var card = new(CaseUsableCard)
281 302
 	sql := `select * from ta_card where coupin_id=?`
@@ -284,7 +305,7 @@ func (m *CardDAO) GetCardWithCustomer(cardid string) (*CaseUsableCard, error) {
284 305
 		return nil, err
285 306
 	}
286 307
 	if card == nil || card.CardId == "" {
287
-		return nil, errors.New("无优惠券信息")
308
+		return nil, errors.New("无体验卡信息")
288 309
 	}
289 310
 	var customerCopons []model.TaCustomerCard
290 311
 	sql = `select * from ta_customer_card where card_id = ? and status>?`
@@ -324,7 +345,7 @@ func (m *CardDAO) GetCardByCustomer(orgid, customerid string) ([]CustomerCardWit
324 345
 // GetCustomerCardByID 获取我的体验卡详情
325 346
 func (m *CardDAO) GetCustomerCardByID(id string) (*CustomerCardWithShare, error) {
326 347
 	if id == "" {
327
-		return nil, errors.New("无优惠券信息")
348
+		return nil, errors.New("无体验卡信息")
328 349
 	}
329 350
 	var customerCard = new(CustomerCardWithShare)
330 351
 	sql := `select * from ta_customer_card where status>? and customer_card_id=?`
@@ -338,3 +359,43 @@ func (m *CardDAO) GetCustomerCardByID(id string) (*CustomerCardWithShare, error)
338 359
 	customerCard.Share = share
339 360
 	return customerCard, err
340 361
 }
362
+
363
+// CheckBySerialCode 根据批次码判断
364
+func (m *CardDAO) CheckBySerialCode(cardid, code string) (bool, error) {
365
+	var customerCards []model.TaCustomerCard
366
+	err := m.db.Where("card_id=?", cardid).And("serial_code=?", code).Find(&customerCards)
367
+	if err != nil {
368
+		return false, err
369
+	}
370
+	if len(customerCards) == 0 {
371
+		return true, nil
372
+	}
373
+	return false, nil
374
+}
375
+
376
+// CheckByCustomer 判断用户是否已领取
377
+func (m *CardDAO) CheckByCustomer(cardid, customerid string) (bool, error) {
378
+	var customerCards []model.TaCustomerCard
379
+	err := m.db.Where("card_id=?", cardid).And("customer_id=?", customerid).Find(&customerCards)
380
+	if err != nil {
381
+		return false, err
382
+	}
383
+	if len(customerCards) == 0 {
384
+		return true, nil
385
+	}
386
+	return false, nil
387
+}
388
+
389
+// GetCustomerCardByCustomerAndSaleCount 获取用户的领取记录
390
+func (m *CardDAO) GetCustomerCardByCustomerAndSaleCount(customerid, saleid string) (int, error) {
391
+	var customerCard []model.TaCustomerCard
392
+	err := m.db.Where("customer_id=?", customerid).And("sales_id=?", saleid).Find(&customerCard)
393
+	return len(customerCard), err
394
+}
395
+
396
+// GetCustomerCardByCustomerAndSale 获取用户的领取记录
397
+func (m *CardDAO) GetCustomerCardByCustomerAndSale(customerid, saleid string, page, pageSize int) ([]model.TaCustomerCard, error) {
398
+	var customerCard []model.TaCustomerCard
399
+	err := m.db.Where("customer_id=?", customerid).And("sales_id=?", saleid).Desc("status").Limit(pageSize, (page-1)*pageSize).Find(&customerCard)
400
+	return customerCard, err
401
+}

+ 8
- 0
models/constant.go Dosyayı Görüntüle

@@ -151,3 +151,11 @@ const (
151 151
 	CARD_COUPON_USED     = "used"
152 152
 	CARD_COUPON_EXPIRE   = "expire"
153 153
 )
154
+
155
+// 领取途径
156
+const (
157
+	RECEIVEING_TYPE_EVENT   = "event"
158
+	RECEIVEING_TYPE_GIVE    = "give"
159
+	RECEIVEING_TYPE_SALES   = "sales"
160
+	RECEIVEING_TYPE_CHANNEL = "channel"
161
+)

+ 71
- 10
models/coupon/coupon.go Dosyayı Görüntüle

@@ -76,15 +76,15 @@ func (m *CouponDAO) GetCouponInfoByID(id string) (*CouponInfo, error) {
76 76
 	}
77 77
 
78 78
 	// 分享
79
-	share := new(model.TaCouponShare)
80
-	if _, err := m.db.Where("coupon_id=?", id).And("status=?", models.STATUS_NORMAL).Get(share); err != nil {
79
+	share, err := m.GetCouponShareByCouponID(id)
80
+	if err != nil {
81 81
 		return nil, err
82 82
 	}
83 83
 
84 84
 	cp.Targets = targes
85 85
 	cp.Images = imgs
86 86
 	cp.Rules = rules
87
-	cp.Share = *share
87
+	cp.Share = share
88 88
 
89 89
 	return cp, nil
90 90
 }
@@ -293,18 +293,39 @@ func (m *CouponDAO) GetCaseUsableCoupon(caseid, userid string, page, pageSize in
293 293
 	var Coupons []CaseCouponDetail
294 294
 	sql := `select * from ta_coupon where case_id=? and status=? and end_date>now() order by create_date limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
295 295
 	err := m.db.Sql(sql, caseid, models.STATUS_NORMAL).Find(&Coupons)
296
-	if userid != "" {
297
-		for inx, Coupon := range Coupons {
298
-			cCoupons, err := m.GetCustomerCouponByCouponAndUser(Coupon.CouponId, userid)
296
+	for inx, coupon := range Coupons {
297
+		if userid != "" {
298
+			cCoupons, err := m.GetCustomerCouponByCouponAndUser(coupon.CouponId, userid)
299 299
 			if err != nil {
300 300
 				return nil, err
301 301
 			}
302 302
 			Coupons[inx].CustomerCoupon = cCoupons
303 303
 		}
304
+		share, err := m.GetCouponShareByCouponID(coupon.CouponId)
305
+		if err != nil {
306
+			return nil, err
307
+		}
308
+		Coupons[inx].Share = share
304 309
 	}
305 310
 	return Coupons, err
306 311
 }
307 312
 
313
+// GetCouponShareByCouponID 根据优惠券信息获取分享信息
314
+func (m *CouponDAO) GetCouponShareByCouponID(couponid string) (*model.TaCouponShare, error) {
315
+	var share = model.TaCouponShare{}
316
+	_, err := m.db.Where("coupon_id=?", couponid).Get(&share)
317
+	return &share, err
318
+}
319
+
320
+// GetCaseUsableCouponCount 获取案场可用优惠券数量
321
+func (m *CouponDAO) GetCaseUsableCouponCount(caseid, userid string) (int, error) {
322
+	var Coupons []CaseCouponDetail
323
+	sql := `select * from ta_coupon where case_id=? and status=? and end_date>now()`
324
+	err := m.db.Sql(sql, caseid, models.STATUS_NORMAL).Find(&Coupons)
325
+
326
+	return len(Coupons), err
327
+}
328
+
308 329
 // GetCustomerCouponByCouponAndUser 根据优惠券与用户获取领取的用户信息
309 330
 func (m *CouponDAO) GetCustomerCouponByCouponAndUser(couponid, userid string) ([]model.TaCustomerCoupon, error) {
310 331
 	var customerCoupons []model.TaCustomerCoupon
@@ -315,8 +336,8 @@ func (m *CouponDAO) GetCustomerCouponByCouponAndUser(couponid, userid string) ([
315 336
 // GetCouponDetail 获取优惠券详情
316 337
 func (m *CouponDAO) GetCouponDetail(couponid string) (*CaseCouponDetail, error) {
317 338
 	var coupon = new(CaseCouponDetail)
318
-	sql := `select * from ta_coupon_Coupon where coupon_id=? and status>?`
319
-	_, err := m.db.Sql(sql, couponid, models.STATUS_DEL).Get(&coupon)
339
+	sql := `select * from ta_coupon where coupon_id=? and status>?`
340
+	_, err := m.db.Sql(sql, couponid, models.STATUS_DEL).Get(coupon)
320 341
 	if err != nil {
321 342
 		return nil, err
322 343
 	}
@@ -399,8 +420,8 @@ func (m *CouponDAO) GetCustomerCouponByID(id string) (*CustomerCouponWithShare,
399 420
 	if err != nil {
400 421
 		return nil, err
401 422
 	}
402
-	share := new(model.TaCouponShare)
403
-	if _, err := m.db.Where("coupon_id=?", id).And("status=?", models.STATUS_NORMAL).Get(share); err != nil {
423
+	share, err := m.GetCouponShareByCouponID(id)
424
+	if err != nil {
404 425
 		return nil, err
405 426
 	}
406 427
 	customerCoupon.Share = share
@@ -450,3 +471,43 @@ func (m *CouponDAO) VerifyCustomerCoupon(id string) error {
450 471
 	_, err := m.db.Cols(cols...).Where("customer_coupon_id=?", id).Update(customerCoupon)
451 472
 	return err
452 473
 }
474
+
475
+// CheckBySerialCode 根据批次码判断
476
+func (m *CouponDAO) CheckBySerialCode(couponid, code string) (bool, error) {
477
+	var customerCoupons []model.TaCustomerCoupon
478
+	err := m.db.Where("coupon_id=?", couponid).And("serial_code=?", code).Find(&customerCoupons)
479
+	if err != nil {
480
+		return false, err
481
+	}
482
+	if len(customerCoupons) == 0 {
483
+		return true, nil
484
+	}
485
+	return false, nil
486
+}
487
+
488
+// CheckCustomerHaveCoupon 判断客户是否已领取
489
+func (m *CouponDAO) CheckCustomerHaveCoupon(couponid, customerid string) (bool, error) {
490
+	var customerCoupons []model.TaCustomerCoupon
491
+	err := m.db.Where("coupon_id=?", couponid).And("customer_id=?", customerid).Find(&customerCoupons)
492
+	if err != nil {
493
+		return false, err
494
+	}
495
+	if len(customerCoupons) == 0 {
496
+		return true, nil
497
+	}
498
+	return false, nil
499
+}
500
+
501
+// GetCustomerCouponByCustomerAndSaleCount 获取用户的领取记录
502
+func (m *CouponDAO) GetCustomerCouponByCustomerAndSaleCount(customerid, saleid string) (int, error) {
503
+	var customerCoupon []model.TaCustomerCoupon
504
+	err := m.db.Where("customer_id=?", customerid).And("sales_id=?", saleid).Find(&customerCoupon)
505
+	return len(customerCoupon), err
506
+}
507
+
508
+// GetCustomerCouponByCustomerAndSale 获取用户的领取记录
509
+func (m *CouponDAO) GetCustomerCouponByCustomerAndSale(customerid, saleid string, page, pageSize int) ([]model.TaCustomerCoupon, error) {
510
+	var customerCoupon []model.TaCustomerCoupon
511
+	err := m.db.Where("customer_id=?", customerid).And("sales_id=?", saleid).Desc("status").Limit(pageSize, (page-1)*pageSize).Find(&customerCoupon)
512
+	return customerCoupon, err
513
+}

+ 2
- 1
models/coupon/types.go Dosyayı Görüntüle

@@ -13,7 +13,7 @@ const (
13 13
 // CouponInfo 优惠券信息
14 14
 type CouponInfo struct {
15 15
 	model.TaCoupon `xorm:"extends"`
16
-	Share          model.TaCouponShare
16
+	Share          *model.TaCouponShare
17 17
 	Targets        []model.TaCouponTarget
18 18
 	Images         []model.TaCouponImage
19 19
 	Rules          []model.TaCouponRule
@@ -23,6 +23,7 @@ type CouponInfo struct {
23 23
 type CaseCouponDetail struct {
24 24
 	model.TaCoupon `xorm:"extends"`
25 25
 	CustomerCoupon []model.TaCustomerCoupon
26
+	Share          *model.TaCouponShare
26 27
 }
27 28
 
28 29
 // CustomerCoupon 用户优惠券

+ 5
- 1
models/course/course.go Dosyayı Görüntüle

@@ -9,6 +9,8 @@ import (
9 9
 	"strings"
10 10
 	"time"
11 11
 
12
+	"github.com/astaxie/beego"
13
+
12 14
 	"github.com/yl10/kit/guid"
13 15
 
14 16
 	"github.com/go-xorm/xorm"
@@ -98,6 +100,7 @@ func (m *CourseDAO) AddCourse(course model.TaCourse) (*model.TaCourse, error) {
98 100
 	course.CourseId = utils.GetGUID()
99 101
 	course.CreateDate = time.Now()
100 102
 	course.Status = STATUS_UNPUBLISH
103
+	course.ScheduleNum = 0
101 104
 	user := m.ctx.Get("user").(model.SysUser)
102 105
 	course.CreateUser = user.UserId
103 106
 	_, err := m.db.Insert(course)
@@ -270,11 +273,12 @@ func (m *CourseDAO) GetDetails(caseid, date, courseid string) ([]DetailInfo, err
270 273
 // GetCourseSchedule 获取需要排课的记录
271 274
 func (m *CourseDAO) GetCourseSchedule(name, caseids, courseid, date string, page, pageSize int) ([]model.TaCourse, error) {
272 275
 	var courses []model.TaCourse
276
+	beego.Error(date)
273 277
 	dao := m.db.Where("status=?", STATUS_UNPUBLISH).And("schedule_num<course_num").And("'" + date + "' BETWEEN begin_date and end_date")
274 278
 	if name != "" {
275 279
 		dao.And("course_name like '%" + name + "%'")
276 280
 	}
277
-
281
+	beego.Error(courseid)
278 282
 	if courseid != "" {
279 283
 		dao.And("course_id=?", courseid)
280 284
 	} else {

+ 1
- 0
models/gymcard/gymcard.go Dosyayı Görüntüle

@@ -278,6 +278,7 @@ func (m *GymcardDAO) SendGymcardToCustomer(gymcard *model.TaGymCard, customerId,
278 278
 	customerGym.Status = models.STATUS_NORMAL
279 279
 	customerGym.SalesId = salesId
280 280
 	customerGym.SalesName = salesName
281
+	customerGym.CardStatus = models.CARD_COUPON_RECEIVED
281 282
 	_, err := m.db.Insert(customerGym)
282 283
 	return &customerGym, err
283 284
 }

+ 1
- 1
models/message/cmscase.go Dosyayı Görüntüle

@@ -98,7 +98,7 @@ func (m *MessageDAO) GetCmsCaseImgs(cmscaseid string) ([]model.TaCmsCaseImage, e
98 98
 // GetCourseByCaseID 根据案场ID获取所有的课程信息
99 99
 func (m *MessageDAO) GetCourseByCaseID(caseid string) ([]course.CourseDetail, error) {
100 100
 	var course []course.CourseDetail
101
-	sql := `select * from ta_course where status>` + strconv.Itoa(models.STATUS_DEL) + ` and case_id=?`
101
+	sql := `select * from ta_course where status = ` + strconv.Itoa(models.STATUS_NORMAL) + ` and case_id=?`
102 102
 	err := m.db.Sql(sql, caseid).Find(&course)
103 103
 	return course, err
104 104
 }

+ 1
- 0
models/model/ta_checkin_record.go Dosyayı Görüntüle

@@ -17,4 +17,5 @@ type TaCheckinRecord struct {
17 17
 	ActivityName string    `xorm:"VARCHAR(64)"`
18 18
 	CreateDate   time.Time `xorm:"DATETIME"`
19 19
 	Status       int       `xorm:"SMALLINT(6)"`
20
+	OrgId				 string    `xorm:"VARCHAR(64)"`
20 21
 }

+ 2
- 0
models/model/ta_customer_card.go Dosyayı Görüntüle

@@ -19,4 +19,6 @@ type TaCustomerCard struct {
19 19
 	CaseId           string    `xorm:"VARCHAR(64)"`
20 20
 	OrgId            string    `xorm:"VARCHAR(64)"`
21 21
 	VerifyStatus     string    `xorm:"VARCHAR(32)"`
22
+	SerialCode       string    `xorm:"VARCHAR(64)"`
23
+	ReceivingType    string    `xorm:"VARCHAR(20)"`
22 24
 }

+ 2
- 0
models/model/ta_customer_coupon.go Dosyayı Görüntüle

@@ -18,4 +18,6 @@ type TaCustomerCoupon struct {
18 18
 	UseDate            time.Time `xorm:"DATETIME"`
19 19
 	CaseId             string    `xorm:"VARCHAR(64)"`
20 20
 	OrgId              string    `xorm:"VARCHAR(64)"`
21
+	SerialCode         string    `xorm:"VARCHAR(64)"`
22
+	ReceivingType      string    `xorm:"VARCHAR(20)"`
21 23
 }

+ 1
- 0
models/model/ta_customer_gym.go Dosyayı Görüntüle

@@ -19,4 +19,5 @@ type TaCustomerGym struct {
19 19
 	GymType         string    `xorm:"VARCHAR(64)"`
20 20
 	CaseId          string    `xorm:"VARCHAR(64)"`
21 21
 	OrgId           string    `xorm:"VARCHAR(64)"`
22
+	ReceivingType   string    `xorm:"VARCHAR(20)"`
22 23
 }

+ 189
- 0
models/statistics/cardcoupon.go Dosyayı Görüntüle

@@ -0,0 +1,189 @@
1
+package statistics
2
+
3
+import (
4
+	"errors"
5
+	"strconv"
6
+	"strings"
7
+	"time"
8
+)
9
+
10
+// CardCouponStatistics 商品统计信息
11
+type CardCouponStatistics struct {
12
+	CaseName   string
13
+	CName      string
14
+	TypeName   string
15
+	SendType   string
16
+	Price      string
17
+	SentCount  int
18
+	UsedCount  int
19
+	CreateDate time.Time
20
+}
21
+
22
+// CardCouponStatistics 获取商品统计信息
23
+func (m *StatisticsDAO) CardCouponStatistics(caseids, ctype, name string, page, pageSize int) ([]CardCouponStatistics, error) {
24
+	var cardCoupons []CardCouponStatistics
25
+	couponsql := `SELECT
26
+		b.case_name,
27
+		b.case_id,
28
+		a.coupon_name AS c_name,
29
+		(
30
+			CASE
31
+			WHEN coupon_type = 'course' THEN
32
+				'课程优惠券'
33
+			ELSE
34
+				'商品优惠券'
35
+			END
36
+		) type_name,
37
+		a.send_type,
38
+		a.price,
39
+		a.sent_count,
40
+		a.used_count,
41
+		a.create_date
42
+	FROM
43
+		ta_coupon a
44
+	INNER JOIN sys_case b ON a.case_id = b.case_id
45
+	where b.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
46
+
47
+	cardsql := `SELECT
48
+		b.case_name,
49
+		b.case_id,
50
+		a.card_name AS c_name,
51
+		'课程体验卡' AS type_name,
52
+		a.send_type,
53
+		a.price,
54
+		a.sent_count,
55
+		a.used_count,
56
+		a.create_date
57
+	FROM
58
+		ta_coupon_card a
59
+	INNER JOIN sys_case b ON a.case_id = b.case_id
60
+	where b.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
61
+
62
+	gymcardsql := `SELECT
63
+		b.case_name,
64
+		b.case_id,
65
+		a.gym_card_name,
66
+		'健身卡' AS type_name,
67
+		a.send_type,
68
+		a.price,
69
+		a.sent_count,
70
+		a.used_count,
71
+		a.create_date
72
+	FROM
73
+		ta_gym_card a
74
+	INNER JOIN sys_case b ON a.case_id = b.case_id
75
+	where b.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
76
+
77
+	sql := ""
78
+	if ctype != "" {
79
+		switch ctype {
80
+		case "card":
81
+			sql = "select * from (" + cardsql + ") tab"
82
+			break
83
+		case "goodscoupon":
84
+			sql = "select * from (" + couponsql + " and a.coupon_type='goods') tab"
85
+			break
86
+		case "coursecoupon":
87
+			sql = "select * from (" + couponsql + " and a.coupon_type='course') tab"
88
+			break
89
+		case "gym":
90
+			sql = "select * from (" + gymcardsql + ") tab"
91
+			break
92
+		default:
93
+			return nil, errors.New("类型不正确")
94
+		}
95
+	} else {
96
+		sql = "select * from (" + cardsql + " union " + couponsql + " union " + gymcardsql + ") tab"
97
+	}
98
+
99
+	if name != "" {
100
+		sql = sql + ` and c_name like '%` + name + `%'`
101
+	}
102
+	sql = sql + ` order by create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
103
+	err := m.db.Sql(sql).Find(&cardCoupons)
104
+	return cardCoupons, err
105
+}
106
+
107
+// CardCouponStatisticsCount 获取总数
108
+func (m *StatisticsDAO) CardCouponStatisticsCount(caseids, ctype, name string) (int, error) {
109
+	var cardCoupons []CardCouponStatistics
110
+	couponsql := `SELECT
111
+		b.case_name,
112
+		b.case_id,
113
+		a.coupon_name AS c_name,
114
+		(
115
+			CASE
116
+			WHEN coupon_type = 'course' THEN
117
+				'课程优惠券'
118
+			ELSE
119
+				'商品优惠券'
120
+			END
121
+		) type_name,
122
+		a.send_type,
123
+		a.price,
124
+		a.sent_count,
125
+		a.used_count,
126
+		a.create_date
127
+	FROM
128
+		ta_coupon a
129
+	INNER JOIN sys_case b ON a.case_id = b.case_id
130
+	where b.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
131
+
132
+	cardsql := `SELECT
133
+		b.case_name,
134
+		b.case_id,
135
+		a.card_name AS c_name,
136
+		'课程体验卡' AS type_name,
137
+		a.send_type,
138
+		a.price,
139
+		a.sent_count,
140
+		a.used_count,
141
+		a.create_date
142
+	FROM
143
+		ta_coupon_card a
144
+	INNER JOIN sys_case b ON a.case_id = b.case_id
145
+	where b.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
146
+
147
+	gymcardsql := `SELECT
148
+		b.case_name,
149
+		b.case_id,
150
+		a.gym_card_name,
151
+		'健身卡' AS type_name,
152
+		a.send_type,
153
+		a.price,
154
+		a.sent_count,
155
+		a.used_count,
156
+		a.create_date
157
+	FROM
158
+		ta_gym_card a
159
+	INNER JOIN sys_case b ON a.case_id = b.case_id
160
+	where b.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
161
+
162
+	sql := ""
163
+	if ctype != "" {
164
+		switch ctype {
165
+		case "card":
166
+			sql = "select * from (" + cardsql + ") tab"
167
+			break
168
+		case "goodscoupon":
169
+			sql = "select * from (" + couponsql + " and a.coupon_type='goods') tab"
170
+			break
171
+		case "coursecoupon":
172
+			sql = "select * from (" + couponsql + " and a.coupon_type='course') tab"
173
+			break
174
+		case "gym":
175
+			sql = "select * from (" + gymcardsql + ") tab"
176
+			break
177
+		default:
178
+			return 0, errors.New("类型不正确")
179
+		}
180
+	} else {
181
+		sql = "select * from (" + cardsql + " union " + couponsql + " union " + gymcardsql + ") tab"
182
+	}
183
+
184
+	if name != "" {
185
+		sql = sql + ` and c_name like '%` + name + `%'`
186
+	}
187
+	err := m.db.Sql(sql).Find(&cardCoupons)
188
+	return len(cardCoupons), err
189
+}

+ 192
- 0
models/statistics/course.go Dosyayı Görüntüle

@@ -0,0 +1,192 @@
1
+package statistics
2
+
3
+import (
4
+	"spaceofcheng/services/models"
5
+	"strconv"
6
+	"strings"
7
+	"time"
8
+)
9
+
10
+// CourseOrdersStatistics 课程订单
11
+type CourseOrdersStatistics struct {
12
+	OrdersId     string
13
+	OrdersNo     string
14
+	CourseName   string
15
+	CaseName     string
16
+	LocationName string
17
+	BeginDate    time.Time
18
+	EndDate      time.Time
19
+	Name         string
20
+	CustomerName string
21
+	Phone        string
22
+	CreateDate   time.Time
23
+}
24
+
25
+// GetCourseOrdersStatistics 获取课程订单统计信息
26
+func (m *StatisticsDAO) GetCourseOrdersStatistics(typeid, caseids, name, begindate, enddate string, page, pageSize int) ([]CourseOrdersStatistics, error) {
27
+	var courseOrders []CourseOrdersStatistics
28
+	sql := `SELECT
29
+					a.orders_id,
30
+					a.orders_no,
31
+					c.course_name,
32
+					b.case_name,
33
+					d.location_name,
34
+					c.begin_date,
35
+					c.end_date,
36
+					e. NAME,
37
+					e.customer_name,
38
+					e.phone,
39
+					a.create_date
40
+				FROM
41
+					ta_course_orders a
42
+				INNER JOIN sys_case b ON a.case_id = b.case_id
43
+				INNER JOIN ta_course c ON a.course_id = c.course_id
44
+				INNER JOIN td_cms_image_location d ON c.location_id = d.location_id
45
+				INNER JOIN ta_customer e ON a.customer_id = e.customer_id 
46
+				Where c.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
47
+	if typeid != "" {
48
+		sql = sql + ` and c.location_id = '` + typeid + `'`
49
+	}
50
+	if name != "" {
51
+		sql = sql + ` and c.course_name like '%` + name + `%'`
52
+	}
53
+	if begindate != "" {
54
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') >= '` + begindate + `'`
55
+	}
56
+	if enddate != "" {
57
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') <= '` + enddate + `'`
58
+	}
59
+	sql = sql + ` order by a.create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
60
+
61
+	err := m.db.Sql(sql).Find(&courseOrders)
62
+	return courseOrders, err
63
+}
64
+
65
+// GetCourseOrdersStatisticsCount 获取课程订单统计数量
66
+func (m *StatisticsDAO) GetCourseOrdersStatisticsCount(typeid, caseids, name, begindate, enddate string) (int, error) {
67
+	var courseOrders []CourseOrdersStatistics
68
+	sql := `SELECT
69
+					a.orders_id,
70
+					a.orders_no,
71
+					c.course_name,
72
+					b.case_name,
73
+					d.location_name,
74
+					c.begin_date,
75
+					c.end_date,
76
+					e. NAME,
77
+					e.customer_name,
78
+					e.phone,
79
+					a.create_date
80
+				FROM
81
+					ta_course_orders a
82
+				INNER JOIN sys_case b ON a.case_id = b.case_id
83
+				INNER JOIN ta_course c ON a.course_id = c.course_id
84
+				INNER JOIN td_cms_image_location d ON c.location_id = d.location_id
85
+				INNER JOIN ta_customer e ON a.customer_id = e.customer_id 
86
+				Where c.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
87
+	if typeid != "" {
88
+		sql = sql + ` and c.location_id = '` + typeid + `'`
89
+	}
90
+	if name != "" {
91
+		sql = sql + ` and c.course_name like '%` + name + `%'`
92
+	}
93
+	if begindate != "" {
94
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') >= '` + begindate + `'`
95
+	}
96
+	if enddate != "" {
97
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') <= '` + enddate + `'`
98
+	}
99
+
100
+	err := m.db.Sql(sql).Find(&courseOrders)
101
+	return len(courseOrders), err
102
+}
103
+
104
+// CourseStatistics 课程统计数据
105
+type CourseStatistics struct {
106
+	CourseId     string
107
+	CaseName     string
108
+	CourseName   string
109
+	LocationName string
110
+	BeginDate    time.Time
111
+	EndDate      time.Time
112
+	Price        string
113
+	Total        int
114
+	JoinTotal    int
115
+}
116
+
117
+// GetCourseStatistics 获取课程统计信息
118
+func (m *StatisticsDAO) GetCourseStatistics(typeid, caseids, name string, page, pageSize int) ([]CourseStatistics, error) {
119
+	var courses []CourseStatistics
120
+	sql := `SELECT
121
+					a.course_id,
122
+					d.case_name,
123
+					a.course_name,
124
+					e.location_name,
125
+					a.begin_date,
126
+					a.end_date,
127
+					a.price,
128
+					b.total,
129
+					c.join_total
130
+				FROM
131
+					ta_course a
132
+				INNER JOIN sys_case d ON a.case_id = d.case_id
133
+				INNER JOIN td_cms_image_location e ON a.location_id = e.location_id
134
+				LEFT JOIN (
135
+					SELECT
136
+						course_id,
137
+						count(1) AS total
138
+					FROM
139
+						ta_customer_course
140
+					GROUP BY
141
+						course_id
142
+				) b ON a.course_id = b.course_id
143
+				LEFT JOIN (
144
+					SELECT
145
+						course_id,
146
+						count(1) AS join_total
147
+					FROM
148
+						ta_customer_course
149
+					WHERE
150
+						join_num > 0
151
+					GROUP BY
152
+						course_id
153
+				) c ON a.course_id = c.course_id
154
+				Where a.status = ` + strconv.Itoa(models.STATUS_NORMAL) + ` and d.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
155
+	if typeid != "" {
156
+		sql = sql + ` and e.location_id = '` + typeid + `'`
157
+	}
158
+	if name != "" {
159
+		sql = sql + ` and a.course_name like '%` + name + `%'`
160
+	}
161
+
162
+	sql = sql + ` order by a.create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
163
+
164
+	err := m.db.Sql(sql).Find(&courses)
165
+	return courses, err
166
+}
167
+
168
+// GetCourseStatisticsCount 获取课程统计信息数量
169
+func (m *StatisticsDAO) GetCourseStatisticsCount(typeid, caseids, name string) (int, error) {
170
+	var courses []CourseStatistics
171
+	sql := `SELECT
172
+					a.course_id,
173
+					d.case_name,
174
+					a.course_name,
175
+					e.location_name,
176
+					a.begin_date,
177
+					a.end_date,
178
+					a.price
179
+				FROM
180
+					ta_course a
181
+				INNER JOIN sys_case d ON a.case_id = d.case_id
182
+				INNER JOIN td_cms_image_location e ON a.location_id = e.location_id
183
+				Where a.status = ` + strconv.Itoa(models.STATUS_NORMAL) + ` and d.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
184
+	if typeid != "" {
185
+		sql = sql + ` and e.location_id = '` + typeid + `'`
186
+	}
187
+	if name != "" {
188
+		sql = sql + ` and a.course_name like '%` + name + `%'`
189
+	}
190
+	err := m.db.Sql(sql).Find(&courses)
191
+	return len(courses), err
192
+}

+ 216
- 0
models/statistics/goods.go Dosyayı Görüntüle

@@ -0,0 +1,216 @@
1
+package statistics
2
+
3
+import (
4
+	"spaceofcheng/services/models/model"
5
+	"strconv"
6
+	"strings"
7
+	"time"
8
+)
9
+
10
+// GoodsStatistics 商品统计信息
11
+type GoodsStatistics struct {
12
+	CaseName    string
13
+	GoodsName   string
14
+	TypeName    string
15
+	Price       string
16
+	Total       int
17
+	FinishTotal int
18
+	Amount      string
19
+}
20
+
21
+// GetGoodsStatistics 获取商品统计信息
22
+func (m *StatisticsDAO) GetGoodsStatistics(caseids, typeid, name string, page, pageSize int) ([]GoodsStatistics, error) {
23
+	var goods []GoodsStatistics
24
+	sql := `SELECT
25
+					e.case_name,
26
+					b.goods_name,
27
+					c.type_name,
28
+					b.price,
29
+					sum(a.number) AS total,
30
+					sum(
31
+						(
32
+							CASE
33
+							WHEN d.make_status = 'finished' THEN
34
+								1
35
+							ELSE
36
+								0
37
+							END
38
+						)
39
+					) AS finishtotal,
40
+					b.price * sum(a.number) AS amount
41
+				FROM
42
+					ta_goods_orders_detail a
43
+				INNER JOIN ta_goods b ON a.goods_id = b.goods_id
44
+				INNER JOIN td_goods_type c ON b.type_id = c.type_id
45
+				INNER JOIN ta_goods_orders d ON a.orders_id = d.orders_id
46
+				inner join sys_case e on b.case_id=e.case_id 
47
+				where e.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
48
+
49
+	if typeid != "" {
50
+		sql = sql + ` and c.type_id='` + typeid + `'`
51
+	}
52
+
53
+	if name != "" {
54
+		sql = sql + ` and b.goods_name like '%` + name + `%'`
55
+	}
56
+	sql = sql + ` GROUP BY
57
+					e.case_name,
58
+					b.goods_name,
59
+					c.type_name,
60
+					b.price limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
61
+	err := m.db.Sql(sql).Find(&goods)
62
+	return goods, err
63
+}
64
+
65
+// GetGoodsStatisticsCount 获取总数
66
+func (m *StatisticsDAO) GetGoodsStatisticsCount(caseids, typeid, name string) (int, error) {
67
+	var goods []GoodsStatistics
68
+	sql := `SELECT
69
+					e.case_name,
70
+					b.goods_name,
71
+					c.type_name,
72
+					b.price,
73
+					sum(a.number) AS total,
74
+					sum(
75
+						(
76
+							CASE
77
+							WHEN d.make_status = 'finished' THEN
78
+								1
79
+							ELSE
80
+								0
81
+							END
82
+						)
83
+					) AS finishtotal,
84
+					b.price * sum(a.number) AS amount
85
+				FROM
86
+					ta_goods_orders_detail a
87
+				INNER JOIN ta_goods b ON a.goods_id = b.goods_id
88
+				INNER JOIN td_goods_type c ON b.type_id = c.type_id
89
+				INNER JOIN ta_goods_orders d ON a.orders_id = d.orders_id
90
+				inner join sys_case e on b.case_id=e.case_id 
91
+				where e.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
92
+
93
+	if typeid != "" {
94
+		sql = sql + ` and c.type_id='` + typeid + `'`
95
+	}
96
+
97
+	if name != "" {
98
+		sql = sql + ` and b.goods_name like '%` + name + `%'`
99
+	}
100
+	sql = sql + ` GROUP BY
101
+					e.case_name,
102
+					b.goods_name,
103
+					c.type_name,
104
+					b.price`
105
+	err := m.db.Sql(sql).Find(&goods)
106
+	return len(goods), err
107
+}
108
+
109
+// GoodsOrdersStatistics 商品订单统计信息
110
+type GoodsOrdersStatistics struct {
111
+	OrdersId     string
112
+	OrdersNo     string
113
+	CaseName     string
114
+	UserType     string
115
+	CreateDate   time.Time
116
+	Status       int
117
+	MakeStatus   string
118
+	AreaName     string
119
+	TableNo      string
120
+	CustomerName string
121
+	Phone        string
122
+	Name         string
123
+	Details      []model.TaGoodsOrdersDetail
124
+}
125
+
126
+// GetGoodsOrderStatistics 获取商品订单
127
+func (m *StatisticsDAO) GetGoodsOrderStatistics(status, usertype, caseids, begindate, enddate string, page, pageSize int) ([]GoodsOrdersStatistics, error) {
128
+	var orders []GoodsOrdersStatistics
129
+	sql := `SELECT
130
+						a.orders_id,
131
+						a.orders_no,
132
+						d.case_name,
133
+						a.user_type,
134
+						a.create_date,
135
+						a.status,
136
+						a.make_status,
137
+						a.area_name,
138
+						a.table_no,
139
+						c.customer_name,
140
+						c. NAME,
141
+						c.phone
142
+					FROM
143
+						ta_goods_orders a
144
+					INNER JOIN ta_customer b ON a.user_id = b.customer_id
145
+					INNER JOIN ta_customer c ON b.customer_id = c.customer_id
146
+					INNER JOIN sys_case d ON a.case_id = d.case_id
147
+					where d.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
148
+
149
+	if usertype != "" {
150
+		sql = sql + ` and a.user_type='` + usertype + `'`
151
+	}
152
+	if begindate != "" {
153
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') >= '` + begindate + `'`
154
+	}
155
+	if enddate != "" {
156
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') <= '` + enddate + `'`
157
+	}
158
+	if status != "" {
159
+		sql = sql + ` and a.make_status='` + status + `'`
160
+	}
161
+	sql = sql + ` order by a.create_date desc limit ` + strconv.Itoa((page-1)*pageSize) + `, ` + strconv.Itoa(pageSize)
162
+
163
+	err := m.db.Sql(sql).Find(&orders)
164
+	if err != nil {
165
+		return nil, err
166
+	}
167
+	for inx, item := range orders {
168
+		var details []model.TaGoodsOrdersDetail
169
+		err := m.db.Where("orders_id=?", item.OrdersId).Find(&details)
170
+		if err != nil {
171
+			return nil, err
172
+		}
173
+		orders[inx].Details = details
174
+	}
175
+	return orders, err
176
+}
177
+
178
+// GetGoodsOrderStatisticsCount 获取商品订单Count
179
+func (m *StatisticsDAO) GetGoodsOrderStatisticsCount(status, usertype, caseids, begindate, enddate string) (int, error) {
180
+	var orders []GoodsOrdersStatistics
181
+	sql := `SELECT
182
+						a.orders_id,
183
+						a.orders_no,
184
+						d.case_name,
185
+						a.user_type,
186
+						a.create_date,
187
+						a.status,
188
+						a.make_status,
189
+						a.area_name,
190
+						a.table_no,
191
+						c.customer_name,
192
+						c. NAME,
193
+						c.phone
194
+					FROM
195
+						ta_goods_orders a
196
+					INNER JOIN ta_customer b ON a.user_id = b.customer_id
197
+					INNER JOIN ta_customer c ON b.customer_id = c.customer_id
198
+					INNER JOIN sys_case d ON a.case_id = d.case_id
199
+					where d.case_id in ('` + strings.Replace(caseids, ",", "','", -1) + `')`
200
+
201
+	if usertype != "" {
202
+		sql = sql + ` and a.user_type='` + usertype + `'`
203
+	}
204
+	if begindate != "" {
205
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') >= '` + begindate + `'`
206
+	}
207
+	if enddate != "" {
208
+		sql = sql + ` and DATE_FORMAT(a.create_date, '%Y-%m-%d') <= '` + enddate + `'`
209
+	}
210
+	if status != "" {
211
+		sql = sql + ` and a.make_status='` + status + `'`
212
+	}
213
+
214
+	err := m.db.Sql(sql).Find(&orders)
215
+	return len(orders), err
216
+}

+ 1
- 3
models/system/user.go Dosyayı Görüntüle

@@ -405,7 +405,6 @@ type UserWithType struct {
405 405
 	model.SysUser `xorm:"extends"`
406 406
 	TypeId        string
407 407
 	TypeName      string
408
-	CaseId        string
409 408
 }
410 409
 
411 410
 // GetUserWithTypeByID 获取用户类型
@@ -413,8 +412,7 @@ func (m *UserDAO) GetUserWithTypeByID(userID string) ([]UserWithType, error) {
413 412
 	query := `
414 413
 		SELECT
415 414
 			t.*, m.type_id,
416
-			m.type_name,
417
-			m.case_id
415
+			m.type_name
418 416
 		FROM
419 417
 			sys_user t
420 418
 		JOIN sys_user_type s ON t.user_id = s.user_id

+ 2
- 2
npm-debug.log Dosyayı Görüntüle

@@ -2,13 +2,13 @@
2 2
 1 verbose cli [ 'D:\\Application\\Node\\node.exe',
3 3
 1 verbose cli   'C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js',
4 4
 1 verbose cli   'run',
5
-1 verbose cli   'build' ]
5
+1 verbose cli   'dev' ]
6 6
 2 info using npm@4.0.5
7 7
 3 info using node@v8.2.1
8 8
 4 verbose stack Error: ENOENT: no such file or directory, open 'E:\GoProject\src\spaceofcheng\services\package.json'
9 9
 5 verbose cwd E:\GoProject\src\spaceofcheng\services
10 10
 6 error Windows_NT 10.0.17134
11
-7 error argv "D:\\Application\\Node\\node.exe" "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js" "run" "build"
11
+7 error argv "D:\\Application\\Node\\node.exe" "C:\\Users\\Administrator\\AppData\\Roaming\\npm\\node_modules\\npm\\bin\\npm-cli.js" "run" "dev"
12 12
 8 error node v8.2.1
13 13
 9 error npm  v4.0.5
14 14
 10 error path E:\GoProject\src\spaceofcheng\services\package.json

+ 10
- 1
routers/common.go Dosyayı Görüntüle

@@ -14,6 +14,7 @@ import (
14 14
 	"spaceofcheng/services/controllers/luckdrawlist"
15 15
 	"spaceofcheng/services/controllers/marketing"
16 16
 	"spaceofcheng/services/controllers/message"
17
+	"spaceofcheng/services/controllers/statistics"
17 18
 	"spaceofcheng/services/controllers/system"
18 19
 	"spaceofcheng/services/controllers/user"
19 20
 	"spaceofcheng/services/controllers/verify"
@@ -178,7 +179,8 @@ func getCommonRoutes() beego.LinkNamespace {
178 179
 		beego.NSRouter("/gymcard/:phone", &gymcard.GymcardController{}, "get:GetCustomerGymByPhone"),
179 180
 		beego.NSRouter("/gymcard", &gymcard.GymcardController{}, "post:SaveGymcard"),
180 181
 		beego.NSRouter("/gymcard", &gymcard.GymcardController{}, "put:SaveGymcard"),
181
-		beego.NSRouter("/gymcard/:customerGymId", &gymcard.GymcardController{}, "put:VerifyCustomerGymcard"),
182
+		beego.NSRouter("/gymcard/:id/to/:users", &gymcard.GymcardController{}, "post:GiveGymToCustomer"),
183
+
182 184
 		// luckdrawlist 抽奖
183 185
 		beego.NSRouter("luckdrawlist", &luckdrawlist.LuckdrawlistController{}, "get:GetLuckdrawList"),
184 186
 		beego.NSRouter("luckdrawlist/:toPhone/:fromPhone", &luckdrawlist.LuckdrawlistController{}, "get:GetLuckShareList"),
@@ -273,5 +275,12 @@ func getCommonRoutes() beego.LinkNamespace {
273 275
 
274 276
 		// websocket
275 277
 		beego.NSRouter("/websocket/:grps/:id", &controllers.BaseController{}, "get:Ws"),
278
+
279
+		// 统计类
280
+		beego.NSRouter("/statistics/goods", &statistics.StatisticsController{}, "get:GetGoodsStatistics"),
281
+		beego.NSRouter("/statistics/goodsorders", &statistics.StatisticsController{}, "get:GetGoodsOrdersStatistics"),
282
+		beego.NSRouter("/statistics/courseorders", &statistics.StatisticsController{}, "get:GetCourseOrdersStatistics"),
283
+		beego.NSRouter("/statistics/courses", &statistics.StatisticsController{}, "get:GetCourseStatistics"),
284
+		beego.NSRouter("/statistics/cardcoupon", &statistics.StatisticsController{}, "get:CardCouponStatistics"),
276 285
 	)
277 286
 }

+ 9
- 0
routers/wechat.go Dosyayı Görüntüle

@@ -24,6 +24,9 @@ func getWechatRoutes() beego.LinkNamespace {
24 24
 		beego.NSRouter("/customer/coupon/:id", &coupon.CouponController{}, "get:GetCustomerCouponByID"),
25 25
 		beego.NSRouter("/customer/card/:id", &card.CardController{}, "get:GetCustomerCardByID"),
26 26
 
27
+		beego.NSRouter("/customer/sales/card/:id", &card.CardController{}, "get:GetCustomerCardByCustomerAndSale"),
28
+		beego.NSRouter("/customer/sales/coupon/:id", &coupon.CouponController{}, "get:GetCustomerCouponByCustomerAndSale"),
29
+
27 30
 		// 下单
28 31
 		beego.NSRouter("/order/goods", &goods.GoodsController{}, "post:PostOrder"),
29 32
 		beego.NSRouter("/order/course", &course.CourseController{}, "post:PostOrder"),
@@ -53,11 +56,17 @@ func getWechatRoutes() beego.LinkNamespace {
53 56
 		beego.NSRouter("/user/detail/:id", &user.UserController{}, "get:GetCaseUserByID"),
54 57
 
55 58
 		// 优惠券
59
+		beego.NSRouter("/coupon", &coupon.CouponController{}, "get:GetCaseUsableCoupon"),
56 60
 		beego.NSRouter("/coupon/:id", &coupon.CouponController{}, "get:GetCouponByID"),
57 61
 		beego.NSRouter("/coupon/detail/:id", &coupon.CouponController{}, "get:GetCouponWithCustomer"),
62
+		beego.NSRouter("/coupon/:id", &coupon.CouponController{}, "post:ReceiveCoupon"),
63
+		beego.NSRouter("/channel/coupon/:id", &coupon.CouponController{}, "post:ChannelReceiveCoupon"),
58 64
 
59 65
 		// 卡
66
+		beego.NSRouter("/card", &card.CardController{}, "get:GetCaseUsableCard"),
60 67
 		beego.NSRouter("/card/:id", &card.CardController{}, "get:GetCardByID"),
61 68
 		beego.NSRouter("/card/detail/:id", &card.CardController{}, "get:GetCardWithCustomer"),
69
+		beego.NSRouter("/card/:id", &card.CardController{}, "post:ReceiveCard"),
70
+		beego.NSRouter("/channel/card/:id", &card.CardController{}, "post:ChannelReceiveCard"),
62 71
 	)
63 72
 }

+ 332
- 15
service/card/card.go Dosyayı Görüntüle

@@ -4,8 +4,11 @@ import (
4 4
 	"errors"
5 5
 	"spaceofcheng/services/models"
6 6
 	"spaceofcheng/services/models/card"
7
+	"spaceofcheng/services/models/course"
7 8
 	"spaceofcheng/services/models/customer"
8 9
 	"spaceofcheng/services/models/model"
10
+	"spaceofcheng/services/models/system"
11
+	"spaceofcheng/services/service"
9 12
 	"spaceofcheng/services/utils"
10 13
 	"strings"
11 14
 	"time"
@@ -15,17 +18,21 @@ import (
15 18
 
16 19
 // CardServ 系统处理
17 20
 type CardServ struct {
18
-	ctx     *utils.Context
19
-	dao     *card.CardDAO
20
-	custDao *customer.CustomerDAO
21
+	ctx       *utils.Context
22
+	dao       *card.CardDAO
23
+	custDao   *customer.CustomerDAO
24
+	userDao   *system.UserDAO
25
+	courseDao *course.CourseDAO
21 26
 }
22 27
 
23 28
 // NewCardServ 初始化
24 29
 func NewCardServ(ctx *utils.Context) *CardServ {
25 30
 	return &CardServ{
26
-		ctx:     ctx,
27
-		dao:     card.NewCardDAO(ctx),
28
-		custDao: customer.NewCustomerDAO(ctx),
31
+		ctx:       ctx,
32
+		dao:       card.NewCardDAO(ctx),
33
+		custDao:   customer.NewCustomerDAO(ctx),
34
+		userDao:   system.NewUserDAO(ctx),
35
+		courseDao: course.NewCourseDAO(ctx),
29 36
 	}
30 37
 }
31 38
 
@@ -214,18 +221,19 @@ func (s *CardServ) GiveCardTo(from *model.SysUser, to *model.TaCustomer, card *c
214 221
 	endDate := card.EndDate
215 222
 
216 223
 	// 检查用户是否已经有了该券
217
-	custcardS, err := s.dao.CheckCustCard(to.CustomerId, card.CardId, startDate, endDate)
218
-	if err != nil {
219
-		utils.LogError("校验客户卡失败: " + err.Error())
220
-		return errors.New("校验客户卡失败")
221
-	}
224
+	// custcardS, err := s.dao.CheckCustCard(to.CustomerId, card.CardId, startDate, endDate)
225
+	// if err != nil {
226
+	// 	utils.LogError("校验客户卡失败: " + err.Error())
227
+	// 	return errors.New("校验客户卡失败")
228
+	// }
222 229
 
223
-	if custcardS != nil && len(custcardS) > 0 {
224
-		return errors.New("客户 " + to.CustomerName + " 已经拥有该券")
225
-	}
230
+	// if custcardS != nil && len(custcardS) > 0 {
231
+	// 	return errors.New("客户 " + to.CustomerName + " 已经拥有该券")
232
+	// }
226 233
 
227 234
 	// 放入我的卡券
228 235
 	custcard := model.TaCustomerCard{
236
+		CustomerCardId:   utils.GetGUID(),
229 237
 		CardId:           card.CardId,
230 238
 		CustomerCardName: card.CardName,
231 239
 		CustomerId:       to.CustomerId,
@@ -234,6 +242,7 @@ func (s *CardServ) GiveCardTo(from *model.SysUser, to *model.TaCustomer, card *c
234 242
 		ReceiveDate:      time.Now().Local(),
235 243
 		CaseId:           card.CaseId,
236 244
 		OrgId:            card.OrgId,
245
+		ReceivingType:    models.RECEIVEING_TYPE_GIVE,
237 246
 	}
238 247
 
239 248
 	// 入库
@@ -242,9 +251,25 @@ func (s *CardServ) GiveCardTo(from *model.SysUser, to *model.TaCustomer, card *c
242 251
 		return errors.New("保存客户卡失败")
243 252
 	}
244 253
 
254
+	// 加入我的课程信息
255
+	err := s.SaveCustomerCourseByCard(&custcard)
256
+	if err != nil {
257
+		return err
258
+	}
259
+
245 260
 	// TODO
246 261
 	// 券库存处理
247
-
262
+	var cardinfo = model.TaCouponCard{
263
+		CardId:    card.CardId,
264
+		SentCount: card.SentCount + 1,
265
+	}
266
+	cols := []string{
267
+		"sent_count",
268
+	}
269
+	if err := s.dao.UpdateCard(&cardinfo, cols); err != nil {
270
+		utils.LogError("回填体验卡信息失败:", err)
271
+		return errors.New("回填体验卡信息失败!")
272
+	}
248 273
 	return nil
249 274
 }
250 275
 
@@ -309,3 +334,295 @@ func (s *CardServ) GetCustomerCardByID(id string) (*card.CustomerCardWithShare,
309 334
 	}
310 335
 	return card, nil
311 336
 }
337
+
338
+// GetCaseUsableCard 获取案场可用卡
339
+func (s *CardServ) GetCaseUsableCard(page, pageSize int) (map[string]interface{}, error) {
340
+
341
+	if pageSize == 0 {
342
+		pageSize = service.PAGENUM
343
+	}
344
+	if page == 0 {
345
+		page = 1
346
+	}
347
+	customer := s.ctx.Get("customer").(model.TaCustomer)
348
+	if customer.UserId == "" {
349
+		return nil, errors.New("您没有权限查看数据")
350
+	}
351
+	userTypes, err := s.userDao.GetUserWithTypeByID(customer.UserId)
352
+	if err != nil {
353
+		utils.LogError("获取用户信息失败: " + err.Error())
354
+		return nil, errors.New("获取用户信息失败")
355
+	}
356
+	if len(userTypes) == 0 {
357
+		return nil, errors.New("您没有权限查看数据")
358
+	}
359
+	caseinfo, err := s.userDao.GetUserBelongCase(customer.UserId)
360
+	if err != nil {
361
+		return nil, errors.New("您没有案场信息!")
362
+	}
363
+	var userid = ""
364
+	if userTypes[0].TypeId != models.USERTYPE_MANAGER {
365
+		userid = customer.UserId
366
+	}
367
+	coupons, err := s.dao.GetCaseUsableCard(caseinfo.CaseId, userid, page, pageSize)
368
+	if err != nil {
369
+		return nil, errors.New("获取数据失败!")
370
+	}
371
+	total, err := s.dao.GetCaseUsableCardCount(caseinfo.CaseId, userid)
372
+	if err != nil {
373
+		utils.LogError("获取卡信息失败: " + err.Error())
374
+		return nil, errors.New("获取卡信息失败")
375
+	}
376
+	return map[string]interface{}{
377
+		"list":     coupons,
378
+		"pagesize": pageSize,
379
+		"pagenum":  total,
380
+		"page":     page,
381
+	}, nil
382
+}
383
+
384
+// ReceiveCard 卡领取
385
+func (s *CardServ) ReceiveCard(id, saleid, serialcode string) error {
386
+	if saleid == "" || serialcode == "" {
387
+		return errors.New("参数不全!不允许领取")
388
+	}
389
+
390
+	// 数据校验
391
+	customer := s.ctx.Get("customer").(model.TaCustomer)
392
+	if customer.Phone == "" {
393
+		return errors.New("用户未绑定手机号!")
394
+	}
395
+	if customer.UserId != "" {
396
+		return errors.New("不允许内部人员领取卡券!")
397
+	}
398
+
399
+	card, err := s.dao.GetCardInfoByID(id)
400
+	if err != nil {
401
+		utils.LogError("领取卡获取卡信息失败:", err)
402
+		return errors.New("领取卡失败!")
403
+	}
404
+	if card.TotalCount <= card.SentCount && card.IsOver == 0 {
405
+		return errors.New("卡券已领完!")
406
+	}
407
+	if card.EndDate.Before(time.Now()) {
408
+		return errors.New("卡券已过期")
409
+	}
410
+
411
+	// 销售校验
412
+	saler, err := s.custDao.GetUserByID(saleid)
413
+	if err != nil {
414
+		utils.LogError("领取卡获取销售信息失败:", err)
415
+		return errors.New("领取卡失败!")
416
+	}
417
+	caseinfo, err := s.userDao.GetUserBelongCase(saleid)
418
+	if err != nil {
419
+		utils.LogError("领取卡获取销售案场信息失败:", err)
420
+		return errors.New("领取卡失败!")
421
+	}
422
+	if caseinfo.CaseId != card.CaseId {
423
+		return errors.New("销售不合法!")
424
+	}
425
+
426
+	// 验证码判断
427
+	isok, err := s.dao.CheckBySerialCode(card.CardId, serialcode)
428
+	if err != nil {
429
+		utils.LogError("获取卡批次码判断失败:", err)
430
+		return errors.New("领取卡失败!")
431
+	}
432
+	if !isok {
433
+		return errors.New("该卡已被领取!")
434
+	}
435
+
436
+	// 领取
437
+	var customerCard = model.TaCustomerCard{
438
+		CustomerCardId:   utils.GetGUID(),
439
+		CardId:           card.CardId,
440
+		CustomerCardName: card.CardName,
441
+		CustomerId:       customer.CustomerId,
442
+		SalesId:          saler.UserId,
443
+		SalesName:        saler.UserName,
444
+		StartDate:        card.StartDate,
445
+		EndDate:          card.EndDate,
446
+		CaseId:           card.CaseId,
447
+		OrgId:            card.OrgId,
448
+		SerialCode:       serialcode,
449
+		ReceivingType:    models.RECEIVEING_TYPE_SALES,
450
+	}
451
+
452
+	err = s.dao.SaveCustomerCard(&customerCard)
453
+	if err != nil {
454
+		utils.LogError("保存用户体验卡信息失败:", err)
455
+		return errors.New("领取卡失败!")
456
+	}
457
+	// 加入我的课程信息
458
+	err = s.SaveCustomerCourseByCard(&customerCard)
459
+	if err != nil {
460
+		return err
461
+	}
462
+	// 回填体验卡信息
463
+	card.SentCount = card.SentCount + 1
464
+	cols := []string{
465
+		"sent_count",
466
+	}
467
+	err = s.dao.UpdateCard(card, cols)
468
+	if err != nil {
469
+		utils.LogError("回填体验卡信息失败:", err)
470
+		return errors.New("领取卡失败!")
471
+	}
472
+	return nil
473
+}
474
+
475
+// SaveCustomerCourseByCard 保存用户的课程信息
476
+func (s *CardServ) SaveCustomerCourseByCard(customerCard *model.TaCustomerCard) error {
477
+	customer, err := s.custDao.GetCustomerByID(customerCard.CustomerId)
478
+	if err != nil {
479
+		utils.LogError("获取客户信息失败:", err)
480
+		return errors.New("获取客户信息失败")
481
+	}
482
+	card, err := s.dao.GetCardByID(customerCard.CardId)
483
+	if err != nil {
484
+		utils.LogError("获取体验卡信息失败:", err)
485
+		return errors.New("领取卡失败!")
486
+	}
487
+	for _, target := range card.Targets {
488
+		course, err := s.courseDao.GetCourseInfo(target.TargetId)
489
+		if err != nil {
490
+			utils.LogError("领取卡时课程获取失败:", err)
491
+			return errors.New("领取卡时课程获取失败!")
492
+		}
493
+		// 我的课程信息
494
+		custCourse := model.TaCustomerCourse{
495
+			CourseId:         course.CourseId,
496
+			CustomerId:       customer.CustomerId,
497
+			OrgId:            card.OrgId,
498
+			CaseId:           card.CaseId,
499
+			CourseName:       course.CourseName,
500
+			LocationId:       course.LocationId,
501
+			Price:            course.Price,
502
+			CourseNum:        course.CourseNum,
503
+			JoinNum:          0,
504
+			CreateDate:       time.Now().Local(),
505
+			CourseObtaimType: models.COURSE_GETBY_CARD,
506
+			SourceId:         customerCard.CustomerCardId,
507
+			IsDone:           models.BOOL_FALSE,
508
+		}
509
+
510
+		custCourseDetails := make([]model.TaCustomerCourseDetail, 0)
511
+
512
+		for _, subCourse := range course.CourseDetail {
513
+			d2 := model.TaCustomerCourseDetail{
514
+				CourseId:     course.CourseId,
515
+				DetailId:     subCourse.DetailId,
516
+				StartDate:    subCourse.BeginDate,
517
+				EndDate:      subCourse.EndDate,
518
+				VerifyStatus: models.VERIFY_USEABLE,
519
+				CaseId:       customerCard.CaseId,
520
+			}
521
+			custCourseDetails = append(custCourseDetails, d2)
522
+		}
523
+
524
+		if err := s.courseDao.SaveCourseOfCustomer(&custCourse, custCourseDetails); err != nil {
525
+			utils.LogError("插入我的课程失败: " + err.Error())
526
+			return errors.New("写入我的课程失败")
527
+		}
528
+	}
529
+	return nil
530
+}
531
+
532
+// ChannelReceiveCard 渠道端卡领取
533
+func (s *CardServ) ChannelReceiveCard(id string) error {
534
+	/// 数据校验
535
+	customer := s.ctx.Get("customer").(model.TaCustomer)
536
+	if customer.Phone == "" {
537
+		return errors.New("用户未绑定手机号!")
538
+	}
539
+	if customer.UserId != "" {
540
+		return errors.New("不允许内部人员领取卡券!")
541
+	}
542
+
543
+	card, err := s.dao.GetCardInfoByID(id)
544
+	if err != nil {
545
+		utils.LogError("领取卡获取卡信息失败:", err)
546
+		return errors.New("领取卡失败!")
547
+	}
548
+	if card.TotalCount <= card.SentCount && card.IsOver == 0 {
549
+		return errors.New("卡券已领完!")
550
+	}
551
+	if card.EndDate.Before(time.Now()) {
552
+		return errors.New("卡券已过期")
553
+	}
554
+
555
+	// 重复性校验
556
+	isok, err := s.dao.CheckByCustomer(id, customer.CustomerId)
557
+	if err != nil {
558
+		utils.LogError("判断是否已领取失败:", err)
559
+		return errors.New("领取卡失败!")
560
+	}
561
+
562
+	if !isok {
563
+		return errors.New("您已领过该卡!")
564
+	}
565
+	// 领取
566
+	var customerCard = model.TaCustomerCard{
567
+		CustomerCardId:   utils.GetGUID(),
568
+		CardId:           card.CardId,
569
+		CustomerCardName: card.CardName,
570
+		CustomerId:       customer.CustomerId,
571
+		StartDate:        card.StartDate,
572
+		EndDate:          card.EndDate,
573
+		CaseId:           card.CaseId,
574
+		OrgId:            card.OrgId,
575
+		ReceivingType:    models.RECEIVEING_TYPE_CHANNEL,
576
+	}
577
+
578
+	err = s.dao.SaveCustomerCard(&customerCard)
579
+	if err != nil {
580
+		utils.LogError("保存用户体验卡信息失败:", err)
581
+		return errors.New("领取卡失败!")
582
+	}
583
+	// 加入我的课程信息
584
+	err = s.SaveCustomerCourseByCard(&customerCard)
585
+	if err != nil {
586
+		return err
587
+	}
588
+	// 回填体验卡信息
589
+	card.SentCount = card.SentCount + 1
590
+	cols := []string{
591
+		"sent_count",
592
+	}
593
+	err = s.dao.UpdateCard(card, cols)
594
+	if err != nil {
595
+		utils.LogError("回填体验卡信息失败:", err)
596
+		return errors.New("领取卡失败!")
597
+	}
598
+	return nil
599
+}
600
+
601
+// GetCustomerCardByCustomerAndSale 根据用户与销售信息获取领取记录
602
+func (s *CardServ) GetCustomerCardByCustomerAndSale(customerid string, page, pageSize int) (map[string]interface{}, error) {
603
+	if pageSize == 0 {
604
+		pageSize = service.PAGENUM
605
+	}
606
+	if page == 0 {
607
+		page = 1
608
+	}
609
+	saler := s.ctx.Get("customer").(model.TaCustomer)
610
+	if saler.UserId == "" {
611
+		return nil, errors.New("您没有权限查看数据")
612
+	}
613
+	cards, err := s.dao.GetCustomerCardByCustomerAndSale(customerid, saler.UserId, page, pageSize)
614
+	if err != nil {
615
+		return nil, err
616
+	}
617
+	total, err := s.dao.GetCustomerCardByCustomerAndSaleCount(customerid, saler.UserId)
618
+	if err != nil {
619
+		utils.LogError("获取用户的领取记录失败: " + err.Error())
620
+		return nil, errors.New("获取用户的领取记录失败")
621
+	}
622
+	return map[string]interface{}{
623
+		"list":     cards,
624
+		"pagesize": pageSize,
625
+		"pagenum":  total,
626
+		"page":     page,
627
+	}, nil
628
+}

+ 22
- 18
service/cases/signin.go Dosyayı Görüntüle

@@ -1,28 +1,29 @@
1 1
 package cases
2 2
 
3 3
 import (
4
+	"encoding/json"
4 5
 	"spaceofcheng/services/models/cases"
5 6
 	"spaceofcheng/services/models/marketing"
6
-	"spaceofcheng/services/utils"
7 7
 	"spaceofcheng/services/models/model"
8
+	"spaceofcheng/services/utils"
9
+
8 10
 	"github.com/astaxie/beego"
9
-	"encoding/json"
10 11
 )
11 12
 
12 13
 // SigninServ 系统处理
13 14
 type SigninServ struct {
14
-	ctx *utils.Context
15
-	dao *cases.SigninDAO
15
+	ctx     *utils.Context
16
+	dao     *cases.SigninDAO
16 17
 	marDao  *marketing.MarketingDAO
17
-	caseDao     *cases.CaseDAO
18
+	caseDao *cases.CaseDAO
18 19
 }
19 20
 
20 21
 // NewSigninServ 初始化
21 22
 func NewSigninServ(ctx *utils.Context) *SigninServ {
22 23
 	return &SigninServ{
23
-		ctx: ctx,
24
-		dao: cases.NewSigninDAO(ctx),
25
-		marDao: marketing.NewMarketingDAO(ctx),
24
+		ctx:     ctx,
25
+		dao:     cases.NewSigninDAO(ctx),
26
+		marDao:  marketing.NewMarketingDAO(ctx),
26 27
 		caseDao: cases.NewCaseDAO(ctx),
27 28
 	}
28 29
 }
@@ -55,7 +56,7 @@ func (s *SigninServ) GetSigninWhere(selectType int, caseids string, page, pageSi
55 56
 }
56 57
 
57 58
 // 添加 签到记录
58
-func (s *SigninServ) AddSignin(signin model.TaCheckinRecord,caseId string,activityId string,userMap *model.TaUserMapping) (*model.TaCheckinRecord,error) {
59
+func (s *SigninServ) AddSignin(signin model.TaCheckinRecord, caseId string, activityId string, userMap *model.TaUserMapping) (*model.TaCheckinRecord, error) {
59 60
 	if signin.OpenId == "" {
60 61
 		return nil, utils.LogError("没有OpenId")
61 62
 	}
@@ -63,17 +64,20 @@ func (s *SigninServ) AddSignin(signin model.TaCheckinRecord,caseId string,activi
63 64
 		return nil, utils.LogError("没有Phone手机号")
64 65
 	}
65 66
 	if caseId == "" {
66
-		return nil,utils.LogError("没有案场ID")
67
+		return nil, utils.LogError("没有案场ID")
68
+	}
69
+	if activityId == "" {
70
+		return nil, utils.LogError("没有活动ID")
67 71
 	}
68
-	if activityId == ""  {
69
-		return nil,utils.LogError("没有活动ID")
72
+	if signin.OrgId == "" {
73
+		return nil, utils.LogError("没有机构ID")
70 74
 	}
71 75
 
72 76
 	// 获取上下文的用户
73 77
 	user := s.ctx.Get("user").(model.SysUser)
74
-	casesInfo,err := s.caseDao.GetCaseByID(caseId)
75
-	activityInfo,err := s.marDao.GetMarketingById(activityId)
76
-	
78
+	casesInfo, err := s.caseDao.GetCaseByID(caseId)
79
+	activityInfo, err := s.marDao.GetMarketingById(activityId)
80
+
77 81
 	// 定义Map
78 82
 	var jsonMap = map[string]string{}
79 83
 	accountInfo := userMap.AccountInfo
@@ -82,7 +86,7 @@ func (s *SigninServ) AddSignin(signin model.TaCheckinRecord,caseId string,activi
82 86
 	jsonErr := json.Unmarshal(jsonBlob, &jsonMap)
83 87
 
84 88
 	if jsonErr != nil {
85
-		return nil,utils.LogError("accountInfo转换json失败")
89
+		return nil, utils.LogError("accountInfo转换json失败")
86 90
 	}
87 91
 	// openId
88 92
 	signin.OpenId = jsonMap["openid"]
@@ -103,8 +107,8 @@ func (s *SigninServ) AddSignin(signin model.TaCheckinRecord,caseId string,activi
103 107
 
104 108
 	info, err := s.dao.AddSignin(signin)
105 109
 	if err != nil {
106
-		return nil,err
110
+		return nil, err
107 111
 	}
108 112
 
109
-	return &info,err
113
+	return &info, err
110 114
 }

+ 245
- 14
service/coupon/coupon.go Dosyayı Görüntüle

@@ -6,12 +6,12 @@ import (
6 6
 	"spaceofcheng/services/models/coupon"
7 7
 	"spaceofcheng/services/models/customer"
8 8
 	"spaceofcheng/services/models/model"
9
+	"spaceofcheng/services/models/system"
10
+	"spaceofcheng/services/service"
9 11
 	"spaceofcheng/services/utils"
10 12
 	"strings"
11 13
 	"time"
12 14
 
13
-	"github.com/astaxie/beego"
14
-
15 15
 	"github.com/yl10/kit/guid"
16 16
 )
17 17
 
@@ -20,6 +20,7 @@ type CouponServ struct {
20 20
 	ctx     *utils.Context
21 21
 	dao     *coupon.CouponDAO
22 22
 	custDao *customer.CustomerDAO
23
+	userDao *system.UserDAO
23 24
 }
24 25
 
25 26
 // NewCouponServ 初始化
@@ -28,6 +29,7 @@ func NewCouponServ(ctx *utils.Context) *CouponServ {
28 29
 		ctx:     ctx,
29 30
 		dao:     coupon.NewCouponDAO(ctx),
30 31
 		custDao: customer.NewCustomerDAO(ctx),
32
+		userDao: system.NewUserDAO(ctx),
31 33
 	}
32 34
 }
33 35
 
@@ -105,7 +107,7 @@ func (s *CouponServ) SaveCoupon(cp *coupon.CouponInfo) error {
105 107
 	share := cp.Share
106 108
 	share.CouponId = cp.CouponId
107 109
 	// cols := []string{"coupon_share_info", "use_rule", "use_instruction"}
108
-	if err := s.dao.SaveCouponShare(&share); err != nil {
110
+	if err := s.dao.SaveCouponShare(share); err != nil {
109 111
 		utils.LogError("保存优惠券分享失败: " + err.Error())
110 112
 		return errors.New("保存优惠券分享失败")
111 113
 	}
@@ -164,7 +166,7 @@ func (s *CouponServ) UpdateCoupon(cp *coupon.CouponInfo) error {
164 166
 	share := cp.Share
165 167
 	share.CouponId = cp.CouponId
166 168
 	cols := []string{"coupon_share_info", "use_rule", "use_instruction"}
167
-	if err := s.dao.UpdateCouponShare(&share, cols); err != nil {
169
+	if err := s.dao.UpdateCouponShare(share, cols); err != nil {
168 170
 		utils.LogError("更新优惠券分享失败: " + err.Error())
169 171
 		return errors.New("更新优惠券分享失败")
170 172
 	}
@@ -269,15 +271,15 @@ func (s *CouponServ) GiveCouponTo(from *model.SysUser, to *model.TaCustomer, cp
269 271
 	}
270 272
 
271 273
 	// 检查用户是否已经有了该券
272
-	custCPS, err := s.dao.CheckCustCoupon(to.CustomerId, cp.CouponId, startDate, endDate)
273
-	if err != nil {
274
-		utils.LogError("校验客户优惠券失败: " + err.Error())
275
-		return errors.New("校验客户优惠券失败")
276
-	}
277
-	beego.Error(custCPS)
278
-	if custCPS != nil && len(custCPS) > 0 {
279
-		return errors.New("客户 " + to.CustomerName + " 已经拥有该券")
280
-	}
274
+	// custCPS, err := s.dao.CheckCustCoupon(to.CustomerId, cp.CouponId, startDate, endDate)
275
+	// if err != nil {
276
+	// 	utils.LogError("校验客户优惠券失败: " + err.Error())
277
+	// 	return errors.New("校验客户优惠券失败")
278
+	// }
279
+	// beego.Error(custCPS)
280
+	// if custCPS != nil && len(custCPS) > 0 {
281
+	// 	return errors.New("客户 " + to.CustomerName + " 已经拥有该券")
282
+	// }
281 283
 
282 284
 	// 放入我的卡券
283 285
 	custCP := model.TaCustomerCoupon{
@@ -336,6 +338,17 @@ func (s *CouponServ) GetCouponByID(cpID string) (*model.TaCoupon, error) {
336 338
 	return cp, nil
337 339
 }
338 340
 
341
+// GetCouponInfoByID 获取详情
342
+func (s *CouponServ) GetCouponInfoByID(cpID string) (*coupon.CouponInfo, error) {
343
+	cp, err := s.dao.GetCouponInfoByID(cpID)
344
+	if err != nil {
345
+		utils.LogError("获取优惠券失败: " + err.Error())
346
+		return nil, errors.New("校验优惠券失败")
347
+	}
348
+
349
+	return cp, nil
350
+}
351
+
339 352
 // GetCouponByIDWithCheck 获取优惠券
340 353
 func (s *CouponServ) GetCouponByIDWithCheck(cpID string) (*coupon.CouponInfo, error) {
341 354
 	cp, err := s.dao.GetCouponInfoByID(cpID)
@@ -404,4 +417,222 @@ func (s *CouponServ) GetCustomerCouponByID(id string) (*coupon.CustomerCouponWit
404 417
 	return coupon, nil
405 418
 }
406 419
 
407
-//
420
+// GetCaseUsableCoupon 获取案场可用券
421
+func (s *CouponServ) GetCaseUsableCoupon(page, pageSize int) (map[string]interface{}, error) {
422
+	if pageSize == 0 {
423
+		pageSize = service.PAGENUM
424
+	}
425
+	if page == 0 {
426
+		page = 1
427
+	}
428
+	customer := s.ctx.Get("customer").(model.TaCustomer)
429
+	if customer.UserId == "" {
430
+		return nil, errors.New("您没有权限查看数据")
431
+	}
432
+	userTypes, err := s.userDao.GetUserWithTypeByID(customer.UserId)
433
+	if err != nil {
434
+		utils.LogError("获取用户信息失败: " + err.Error())
435
+		return nil, errors.New("获取用户信息失败")
436
+	}
437
+	if len(userTypes) == 0 {
438
+		return nil, errors.New("您没有权限查看数据")
439
+	}
440
+	caseinfo, err := s.userDao.GetUserBelongCase(customer.UserId)
441
+	if err != nil {
442
+		return nil, errors.New("您没有案场信息!")
443
+	}
444
+	var userid = ""
445
+	if userTypes[0].TypeId != models.USERTYPE_MANAGER {
446
+		userid = customer.UserId
447
+	}
448
+	coupons, err := s.dao.GetCaseUsableCoupon(caseinfo.CaseId, userid, page, pageSize)
449
+	if err != nil {
450
+		return nil, errors.New("获取数据失败!")
451
+	}
452
+	total, err := s.dao.GetCaseUsableCouponCount(caseinfo.CaseId, userid)
453
+	if err != nil {
454
+		utils.LogError("获取商品规格失败: " + err.Error())
455
+		return nil, errors.New("获取商品规格失败")
456
+	}
457
+	return map[string]interface{}{
458
+		"list":     coupons,
459
+		"pagesize": pageSize,
460
+		"pagenum":  total,
461
+		"page":     page,
462
+	}, nil
463
+}
464
+
465
+// ReceiveCoupon 优惠券领取
466
+func (s *CouponServ) ReceiveCoupon(id, saleid, serialcode string) error {
467
+	if saleid == "" || serialcode == "" {
468
+		return errors.New("参数不全!不允许领取")
469
+	}
470
+
471
+	// 数据校验
472
+	customer := s.ctx.Get("customer").(model.TaCustomer)
473
+	if customer.Phone == "" {
474
+		return errors.New("用户未绑定手机号!")
475
+	}
476
+	if customer.UserId != "" {
477
+		return errors.New("不允许内部人员领取优惠券券!")
478
+	}
479
+
480
+	coupon, err := s.dao.GetCouponByID(id)
481
+	if err != nil {
482
+		utils.LogError("领取优惠券获取优惠券信息失败:", err)
483
+		return errors.New("领取优惠券失败!")
484
+	}
485
+	if coupon.TotalCount <= coupon.SentCount && coupon.IsOver == 0 {
486
+		return errors.New("优惠券券已领完!")
487
+	}
488
+	if coupon.EndDate.Before(time.Now()) {
489
+		return errors.New("优惠券券已过期")
490
+	}
491
+
492
+	// 销售校验
493
+	saler, err := s.custDao.GetUserByID(saleid)
494
+	if err != nil {
495
+		utils.LogError("领取优惠券获取销售信息失败:", err)
496
+		return errors.New("领取优惠券失败!")
497
+	}
498
+	caseinfo, err := s.userDao.GetUserBelongCase(saleid)
499
+	if err != nil {
500
+		utils.LogError("领取优惠券获取销售案场信息失败:", err)
501
+		return errors.New("领取优惠券失败!")
502
+	}
503
+	if caseinfo.CaseId != coupon.CaseId {
504
+		return errors.New("销售不合法!")
505
+	}
506
+
507
+	// 验证码判断
508
+	isok, err := s.dao.CheckBySerialCode(coupon.CouponId, serialcode)
509
+	if err != nil {
510
+		utils.LogError("获取优惠券批次码判断失败:", err)
511
+		return errors.New("领取优惠券失败!")
512
+	}
513
+	if !isok {
514
+		return errors.New("该优惠券已被领取!")
515
+	}
516
+
517
+	// 领取
518
+	var customerCoupon = model.TaCustomerCoupon{
519
+		CouponId:           coupon.CouponId,
520
+		CustomerCouponName: coupon.CouponName,
521
+		CustomerId:         customer.CustomerId,
522
+		SalesId:            saler.UserId,
523
+		SalesName:          saler.UserName,
524
+		StartDate:          coupon.StartDate,
525
+		EndDate:            coupon.EndDate,
526
+		CaseId:             coupon.CaseId,
527
+		OrgId:              coupon.OrgId,
528
+		SerialCode:         serialcode,
529
+	}
530
+
531
+	err = s.dao.SaveCustomerCoupon(&customerCoupon)
532
+	if err != nil {
533
+		utils.LogError("保存用户体验优惠券信息失败:", err)
534
+		return errors.New("领取优惠券失败!")
535
+	}
536
+	// 回填体验优惠券信息
537
+	coupon.SentCount = coupon.SentCount + 1
538
+	cols := []string{
539
+		"sent_count",
540
+	}
541
+	err = s.dao.UpdateCoupon(coupon, cols)
542
+	if err != nil {
543
+		utils.LogError("回填体验优惠券信息失败:", err)
544
+		return errors.New("领取优惠券失败!")
545
+	}
546
+	return nil
547
+}
548
+
549
+// ChannelReceiveCoupon 渠道端优惠券领取
550
+func (s *CouponServ) ChannelReceiveCoupon(id string) error {
551
+	// 数据校验
552
+	customer := s.ctx.Get("customer").(model.TaCustomer)
553
+	if customer.Phone == "" {
554
+		return errors.New("用户未绑定手机号!")
555
+	}
556
+	if customer.UserId != "" {
557
+		return errors.New("不允许内部人员领取优惠券券!")
558
+	}
559
+
560
+	coupon, err := s.dao.GetCouponByID(id)
561
+	if err != nil {
562
+		utils.LogError("领取优惠券获取优惠券信息失败:", err)
563
+		return errors.New("领取优惠券失败!")
564
+	}
565
+	if coupon.TotalCount <= coupon.SentCount && coupon.IsOver == 0 {
566
+		return errors.New("优惠券券已领完!")
567
+	}
568
+	if coupon.EndDate.Before(time.Now()) {
569
+		return errors.New("优惠券券已过期")
570
+	}
571
+
572
+	// 判断是否已领取
573
+	isok, err := s.dao.CheckCustomerHaveCoupon(id, customer.CustomerId)
574
+	if err != nil {
575
+		utils.LogError("判断用户是都已领取失败:", err)
576
+		return errors.New("领取优惠券失败!")
577
+	}
578
+	if !isok {
579
+		return errors.New("您已领取过该优惠券!")
580
+	}
581
+
582
+	// 领取
583
+	var customerCoupon = model.TaCustomerCoupon{
584
+		CouponId:           coupon.CouponId,
585
+		CustomerCouponName: coupon.CouponName,
586
+		CustomerId:         customer.CustomerId,
587
+		StartDate:          coupon.StartDate,
588
+		EndDate:            coupon.EndDate,
589
+		CaseId:             coupon.CaseId,
590
+		OrgId:              coupon.OrgId,
591
+	}
592
+
593
+	err = s.dao.SaveCustomerCoupon(&customerCoupon)
594
+	if err != nil {
595
+		utils.LogError("保存用户体验优惠券信息失败:", err)
596
+		return errors.New("领取优惠券失败!")
597
+	}
598
+	// 回填体验优惠券信息
599
+	coupon.SentCount = coupon.SentCount + 1
600
+	cols := []string{
601
+		"sent_count",
602
+	}
603
+	err = s.dao.UpdateCoupon(coupon, cols)
604
+	if err != nil {
605
+		utils.LogError("回填体验优惠券信息失败:", err)
606
+		return errors.New("领取优惠券失败!")
607
+	}
608
+	return nil
609
+}
610
+
611
+// GetCustomerCouponByCustomerAndSale 根据用户与销售信息获取领取记录
612
+func (s *CouponServ) GetCustomerCouponByCustomerAndSale(customerid string, page, pageSize int) (map[string]interface{}, error) {
613
+	if pageSize == 0 {
614
+		pageSize = service.PAGENUM
615
+	}
616
+	if page == 0 {
617
+		page = 1
618
+	}
619
+	saler := s.ctx.Get("customer").(model.TaCustomer)
620
+	if saler.UserId == "" {
621
+		return nil, errors.New("您没有权限查看数据")
622
+	}
623
+	coupons, err := s.dao.GetCustomerCouponByCustomerAndSale(customerid, saler.UserId, page, pageSize)
624
+	if err != nil {
625
+		return nil, err
626
+	}
627
+	total, err := s.dao.GetCustomerCouponByCustomerAndSaleCount(customerid, saler.UserId)
628
+	if err != nil {
629
+		utils.LogError("获取用户的领取记录失败: " + err.Error())
630
+		return nil, errors.New("获取用户的领取记录失败")
631
+	}
632
+	return map[string]interface{}{
633
+		"list":     coupons,
634
+		"pagesize": pageSize,
635
+		"pagenum":  total,
636
+		"page":     page,
637
+	}, nil
638
+}

+ 4
- 0
service/course/order.go Dosyayı Görüntüle

@@ -131,6 +131,7 @@ func (s *CourseServ) Orders(
131 131
 		}
132 132
 	} else {
133 133
 		couseOrder.PayType = models.CONSUME_COINCHG
134
+		couseOrder.CouponAmount = "0.0"
134 135
 	}
135 136
 
136 137
 	couponAmount, _ := strconv.ParseFloat(couseOrder.CouponAmount, 64)
@@ -167,6 +168,9 @@ func (s *CourseServ) Orders(
167 168
 		return errors.New("下单失败, 请重试")
168 169
 	}
169 170
 
171
+	// 发送短信
172
+	utils.SendSMS("orders", cust.Phone, course.CourseName)
173
+
170 174
 	return nil
171 175
 }
172 176
 

+ 8
- 7
service/goods/orders.go Dosyayı Görüntüle

@@ -284,15 +284,16 @@ func (s *GoodsServ) validOrdersInfo(info *model.TaGoodsOrders) error {
284 284
 					return errors.New("下单人状态不正确, 不能下单")
285 285
 				}
286 286
 
287
-				if ut.CaseId == caseID {
288
-					info.UserType = ut.TypeId
287
+				info.UserType = ut.TypeId
289 288
 
290
-					// 下单人姓名 - 姓名不存在则用昵称
291
-					info.UserName = ut.RealName
292
-					if info.UserName == "" {
293
-						info.UserName = cust.CustomerName
294
-					}
289
+				// 下单人姓名 - 姓名不存在则用昵称
290
+				info.UserName = ut.RealName
291
+				if info.UserName == "" {
292
+					info.UserName = cust.CustomerName
295 293
 				}
294
+				// if ut.CaseId == caseID {
295
+
296
+				// }
296 297
 			}
297 298
 		}
298 299
 

+ 31
- 0
service/gymcard/gymcard.go Dosyayı Görüntüle

@@ -172,6 +172,9 @@ func (s *GymcardServ) SendGymCardToUser(gymcardId, sysuserId string) (*model.TaC
172 172
 		utils.LogError("发送游泳健身卡给客户失败" + err.Error())
173 173
 		return nil, errors.New("发送游泳健身卡给客户失败")
174 174
 	}
175
+	if gymCard.TotalCount-gymCard.SentCount < 1 {
176
+		return nil, errors.New("健身卡剩余数量不足!")
177
+	}
175 178
 	sysuser, err = s.cdao.GetUserByID(sysuserId)
176 179
 	if err != nil {
177 180
 		utils.LogError("发送游泳健身卡给客户失败" + err.Error())
@@ -279,3 +282,31 @@ func (s *GymcardServ) deleteGymCard(gymcardId string) error {
279 282
 	return err
280 283
 
281 284
 }
285
+
286
+// GiveCardToCustomer 赠送健身卡
287
+func (s *GymcardServ) GiveCardToCustomer(gymcardId, uids string) error {
288
+	gymCard, err := s.dao.GetGymcardById(gymcardId)
289
+	if err != nil {
290
+		utils.LogError("发送游泳健身卡给客户失败" + err.Error())
291
+		return errors.New("发送游泳健身卡给客户失败")
292
+	}
293
+	arrUID := strings.Split(uids, ",")
294
+	if gymCard.TotalCount-gymCard.SentCount < len(arrUID) {
295
+		return errors.New("健身卡剩余数量不足!")
296
+	}
297
+
298
+	for _, uid := range arrUID {
299
+		_, err := s.dao.SendGymcardToCustomer(&gymCard.TaGymCard, uid, "", "")
300
+		if err != nil {
301
+			utils.LogError("发送游泳健身卡给客户失败" + err.Error())
302
+			return errors.New("发送游泳健身卡给客户失败")
303
+		}
304
+		gymCard.SentCount = gymCard.SentCount + 1
305
+	}
306
+	err = s.dao.EditGymcard(&gymCard.TaGymCard)
307
+	if err != nil {
308
+		utils.LogError("发送游泳健身卡给客户失败" + err.Error())
309
+		return errors.New("发送游泳健身卡给客户失败")
310
+	}
311
+	return nil
312
+}

+ 39
- 0
service/statistics/cardcoupon.go Dosyayı Görüntüle

@@ -0,0 +1,39 @@
1
+package statistics
2
+
3
+import (
4
+	"errors"
5
+	"spaceofcheng/services/service"
6
+	"spaceofcheng/services/utils"
7
+)
8
+
9
+// CardCouponStatistics 获取卡券统计信息
10
+func (s *StatisticsServ) CardCouponStatistics(caseids, ctype, name string, page, pageSize int) (map[string]interface{}, error) {
11
+	if pageSize == 0 {
12
+		pageSize = service.PAGENUM
13
+	}
14
+	if page == 0 {
15
+		page = 1
16
+	}
17
+
18
+	if caseids == "" {
19
+		return nil, errors.New("请先选择案场信息")
20
+	}
21
+
22
+	list, err := s.dao.CardCouponStatistics(caseids, ctype, name, page, pageSize)
23
+	if err != nil {
24
+		utils.LogError("获取卡券统计数据失败: " + err.Error())
25
+		return nil, errors.New("获取卡券统计数据失败")
26
+	}
27
+	total, err := s.dao.CardCouponStatisticsCount(caseids, ctype, name)
28
+	if err != nil {
29
+		utils.LogError("获取卡券统计数据失败: " + err.Error())
30
+		return nil, errors.New("获取卡券统计数据失败")
31
+	}
32
+
33
+	return map[string]interface{}{
34
+		"list":     list,
35
+		"pagesize": pageSize,
36
+		"pagenum":  total,
37
+		"page":     page,
38
+	}, nil
39
+}

+ 71
- 0
service/statistics/course.go Dosyayı Görüntüle

@@ -0,0 +1,71 @@
1
+package statistics
2
+
3
+import (
4
+	"errors"
5
+	"spaceofcheng/services/service"
6
+	"spaceofcheng/services/utils"
7
+)
8
+
9
+// GetCourseOrdersStatistics 获取课程订单统计信息
10
+func (s *StatisticsServ) GetCourseOrdersStatistics(typeid, caseids, name, begindate, enddate string, page, pageSize int) (map[string]interface{}, error) {
11
+	if pageSize == 0 {
12
+		pageSize = service.PAGENUM
13
+	}
14
+	if page == 0 {
15
+		page = 1
16
+	}
17
+
18
+	if caseids == "" {
19
+		return nil, errors.New("请先选择案场信息")
20
+	}
21
+
22
+	list, err := s.dao.GetCourseOrdersStatistics(typeid, caseids, name, begindate, enddate, page, pageSize)
23
+	if err != nil {
24
+		utils.LogError("获取课程订单统计数据失败: " + err.Error())
25
+		return nil, errors.New("获取课程订单统计数据失败")
26
+	}
27
+	total, err := s.dao.GetCourseOrdersStatisticsCount(typeid, caseids, name, begindate, enddate)
28
+	if err != nil {
29
+		utils.LogError("获取课程订单统计数据失败: " + err.Error())
30
+		return nil, errors.New("获取课程订单统计数据失败")
31
+	}
32
+
33
+	return map[string]interface{}{
34
+		"list":     list,
35
+		"pagesize": pageSize,
36
+		"pagenum":  total,
37
+		"page":     page,
38
+	}, nil
39
+}
40
+
41
+// GetCourseStatistics 获取课程统计信息
42
+func (s *StatisticsServ) GetCourseStatistics(typeid, caseids, name string, page, pageSize int) (map[string]interface{}, error) {
43
+	if pageSize == 0 {
44
+		pageSize = service.PAGENUM
45
+	}
46
+	if page == 0 {
47
+		page = 1
48
+	}
49
+
50
+	if caseids == "" {
51
+		return nil, errors.New("请先选择案场信息")
52
+	}
53
+
54
+	list, err := s.dao.GetCourseStatistics(typeid, caseids, name, page, pageSize)
55
+	if err != nil {
56
+		utils.LogError("获取课程统计数据失败: " + err.Error())
57
+		return nil, errors.New("获取课程统计数据失败")
58
+	}
59
+	total, err := s.dao.GetCourseStatisticsCount(typeid, caseids, name)
60
+	if err != nil {
61
+		utils.LogError("获取课程统计数据失败: " + err.Error())
62
+		return nil, errors.New("获取课程统计数据失败")
63
+	}
64
+
65
+	return map[string]interface{}{
66
+		"list":     list,
67
+		"pagesize": pageSize,
68
+		"pagenum":  total,
69
+		"page":     page,
70
+	}, nil
71
+}

+ 71
- 0
service/statistics/goods.go Dosyayı Görüntüle

@@ -0,0 +1,71 @@
1
+package statistics
2
+
3
+import (
4
+	"errors"
5
+	"spaceofcheng/services/service"
6
+	"spaceofcheng/services/utils"
7
+)
8
+
9
+// GetGoodsStatistics 获取商品统计信息
10
+func (s *StatisticsServ) GetGoodsStatistics(caseids, typeid, name string, page, pageSize int) (map[string]interface{}, error) {
11
+	if pageSize == 0 {
12
+		pageSize = service.PAGENUM
13
+	}
14
+	if page == 0 {
15
+		page = 1
16
+	}
17
+
18
+	if caseids == "" {
19
+		return nil, errors.New("请先选择案场信息")
20
+	}
21
+
22
+	list, err := s.dao.GetGoodsStatistics(caseids, typeid, name, page, pageSize)
23
+	if err != nil {
24
+		utils.LogError("获取商品统计数据失败: " + err.Error())
25
+		return nil, errors.New("获取商品统计数据失败")
26
+	}
27
+	total, err := s.dao.GetGoodsStatisticsCount(caseids, typeid, name)
28
+	if err != nil {
29
+		utils.LogError("获取商品统计数据失败: " + err.Error())
30
+		return nil, errors.New("获取商品统计数据失败")
31
+	}
32
+
33
+	return map[string]interface{}{
34
+		"list":     list,
35
+		"pagesize": pageSize,
36
+		"pagenum":  total,
37
+		"page":     page,
38
+	}, nil
39
+}
40
+
41
+// GetGoodsOrdersStatistics 获取商品订单统计信息
42
+func (s *StatisticsServ) GetGoodsOrdersStatistics(status, usertype, caseids, begindate, enddate string, page, pageSize int) (map[string]interface{}, error) {
43
+	if pageSize == 0 {
44
+		pageSize = service.PAGENUM
45
+	}
46
+	if page == 0 {
47
+		page = 1
48
+	}
49
+
50
+	if caseids == "" {
51
+		return nil, errors.New("请先选择案场信息")
52
+	}
53
+
54
+	list, err := s.dao.GetGoodsOrderStatistics(status, usertype, caseids, begindate, enddate, page, pageSize)
55
+	if err != nil {
56
+		utils.LogError("获取商品订单统计数据失败: " + err.Error())
57
+		return nil, errors.New("获取商品订单统计数据失败")
58
+	}
59
+	total, err := s.dao.GetGoodsOrderStatisticsCount(status, usertype, caseids, begindate, enddate)
60
+	if err != nil {
61
+		utils.LogError("获取商品订单统计数据失败: " + err.Error())
62
+		return nil, errors.New("获取商品订单统计数据失败")
63
+	}
64
+
65
+	return map[string]interface{}{
66
+		"list":     list,
67
+		"pagesize": pageSize,
68
+		"pagenum":  total,
69
+		"page":     page,
70
+	}, nil
71
+}

+ 11
- 1
service/user.go Dosyayı Görüntüle

@@ -481,7 +481,17 @@ func (s *UserServ) SaveForbidUser(userid string, forbidtype string) error {
481 481
 	}
482 482
 
483 483
 	err = s.dao.SaveForbidUser(&forbiduser)
484
-	return err
484
+	if err != nil {
485
+		return err
486
+	}
487
+	// 发送短信
488
+	if forbidtype == models.SYS_RESOURCE_COURSE {
489
+		utils.SendSMS("couponclose", user.Phone)
490
+	} else {
491
+		utils.SendSMS("goodsclose", user.Phone)
492
+	}
493
+
494
+	return nil
485 495
 }
486 496
 
487 497
 // OpenForbidUser 开启禁止人员