zjxpcyc 6 年之前
父節點
當前提交
459679d3ef

+ 1
- 1
conf/log.conf 查看文件

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

+ 169
- 0
controllers/coupon/coupon.go 查看文件

@@ -0,0 +1,169 @@
1
+package coupon
2
+
3
+import (
4
+	"encoding/json"
5
+	"errors"
6
+	"net/http"
7
+	"spaceofcheng/services/controllers"
8
+	cpModel "spaceofcheng/services/models/coupon"
9
+	"spaceofcheng/services/service/coupon"
10
+	"spaceofcheng/services/utils"
11
+	"strings"
12
+)
13
+
14
+// CouponController 商品
15
+type CouponController struct {
16
+	serv *coupon.CouponServ
17
+	controllers.BaseController
18
+}
19
+
20
+// Constructor 初始化 Controller
21
+// @Title Constructor
22
+// @Description 初始化 Controller, 系统自动调用
23
+func (c *CouponController) Constructor() {
24
+	c.serv = coupon.NewCouponServ(c.Context)
25
+}
26
+
27
+// ListByCase 获取券列表
28
+func (c *CouponController) ListByCase() {
29
+	caseID := c.GetString("caseid")
30
+
31
+	page, _ := c.GetInt("page")
32
+	pagesize, _ := c.GetInt("pagesize")
33
+	if page < 0 {
34
+		page = 1
35
+	}
36
+
37
+	if pagesize <= 0 {
38
+		pagesize = 10
39
+	}
40
+
41
+	list, total, err := c.serv.GetCouponList(caseID, page, pagesize)
42
+	if err != nil {
43
+		c.ResponseError(err)
44
+	}
45
+
46
+	c.ResponseJSON(map[string]interface{}{
47
+		"list":     list,
48
+		"page":     page,
49
+		"pagesize": pagesize,
50
+		"pagenum":  total,
51
+	})
52
+}
53
+
54
+// GetCouponByIDForAdmin 获取优惠券
55
+// 管理端
56
+func (c *CouponController) GetCouponByIDForAdmin() {
57
+	id := c.GetString(":id")
58
+	if id == "" {
59
+		c.ResponseError(errors.New("未指定券"))
60
+	}
61
+
62
+	cp, err := c.serv.GetCouponByIDWithCheck(id)
63
+	if err != nil {
64
+		c.ResponseError(err)
65
+	}
66
+
67
+	c.ResponseJSON(map[string]interface{}{
68
+		"coupon": cp,
69
+	})
70
+}
71
+
72
+// GetCouponByID 获取优惠券
73
+// 微信端
74
+func (c *CouponController) GetCouponByID() {
75
+	id := c.GetString(":id")
76
+	if id == "" {
77
+		c.ResponseError(errors.New("未指定券"))
78
+	}
79
+
80
+	cp, err := c.serv.GetCouponByID(id)
81
+	if err != nil {
82
+		c.ResponseError(err)
83
+	}
84
+
85
+	c.ResponseJSON(map[string]interface{}{
86
+		"coupon": cp,
87
+	})
88
+}
89
+
90
+// SaveCoupon 保存优惠券
91
+func (c *CouponController) SaveCoupon() {
92
+	jsnStr := c.GetString("info")
93
+	if jsnStr == "" {
94
+		c.ResponseError(errors.New("未接收到保存内容"))
95
+	}
96
+
97
+	cp := cpModel.CouponInfo{}
98
+
99
+	if err := json.Unmarshal([]byte(jsnStr), &cp); err != nil {
100
+		utils.LogError("接收优惠券信息失败: " + err.Error())
101
+		c.ResponseError(errors.New("接收参数失败"), http.StatusInternalServerError)
102
+	}
103
+
104
+	// TODO
105
+	// 校验各字段不能为空
106
+
107
+	// 入库
108
+	cp.CouponId = ""
109
+	if err := c.serv.SaveCoupon(&cp); err != nil {
110
+		c.ResponseError(err)
111
+	}
112
+
113
+	c.ResponseJSON(map[string]interface{}{
114
+		"coupon": cp,
115
+	})
116
+}
117
+
118
+// UpdateCoupon 更新优惠券
119
+func (c *CouponController) UpdateCoupon() {
120
+	jsnStr := c.GetString("info")
121
+	if jsnStr == "" {
122
+		c.ResponseError(errors.New("未接收到更新内容"))
123
+	}
124
+
125
+	id := c.GetString(":id")
126
+	if id == "" {
127
+		c.ResponseError(errors.New("未指定券"))
128
+	}
129
+
130
+	cp := cpModel.CouponInfo{}
131
+
132
+	if err := json.Unmarshal([]byte(jsnStr), &cp); err != nil {
133
+		utils.LogError("接收优惠券信息失败: " + err.Error())
134
+		c.ResponseError(errors.New("接收参数失败"), http.StatusInternalServerError)
135
+	}
136
+
137
+	// TODO
138
+	// 校验各字段不能为空
139
+
140
+	// 入库
141
+	cp.CouponId = id
142
+	if err := c.serv.UpdateCoupon(&cp); err != nil {
143
+		c.ResponseError(err)
144
+	}
145
+
146
+	c.ResponseJSON(map[string]interface{}{
147
+		"coupon": cp,
148
+	})
149
+}
150
+
151
+// GiveCoupon 赠送优惠券
152
+func (c *CouponController) GiveCoupon() {
153
+	id := c.GetString(":id")
154
+	if id == "" {
155
+		c.ResponseError(errors.New("未指定券"))
156
+	}
157
+
158
+	uids := c.GetString(":users")
159
+	if uids == "" {
160
+		c.ResponseError(errors.New("未指定赠送人"))
161
+	}
162
+
163
+	err := c.serv.GiveCoupon(id, strings.Split(uids, ","))
164
+	if err != nil {
165
+		c.ResponseError(err)
166
+	}
167
+
168
+	c.ResponseJSON("ok")
169
+}

+ 22
- 2699
log/common.log
文件差異過大導致無法顯示
查看文件


+ 7
- 0
models/constant.go 查看文件

@@ -124,3 +124,10 @@ const (
124 124
 	GYM_CARD_QUARTER = "quarter"
125 125
 	GYM_CARD_YEAR    = "year"
126 126
 )
127
+
128
+// 系统资源
129
+// 可用于卡券关联内容选择
130
+const (
131
+	SYS_RESOURCE_COURSE = "course"
132
+	SYS_RESOURCE_GOODS  = "goods"
133
+)

+ 1
- 0
models/coupon/coupon.go 查看文件

@@ -96,6 +96,7 @@ func (m *CouponDAO) GetCouponList(filters []string, limit []int) ([]model.TaCoup
96 96
 	filterString := ""
97 97
 	if len(filters) > 0 {
98 98
 		filterString = strings.Join(filters, " and ")
99
+		filterString += " and "
99 100
 	}
100 101
 
101 102
 	sql := `select * from ta_coupon where %s status = 1 order by create_date desc`

+ 8
- 0
models/coupon/target.go 查看文件

@@ -1,6 +1,7 @@
1 1
 package coupon
2 2
 
3 3
 import (
4
+	"errors"
4 5
 	"spaceofcheng/services/models/model"
5 6
 )
6 7
 
@@ -11,6 +12,13 @@ func (m *CouponDAO) UpdateTarget(targets []model.TaCouponTarget, couponID string
11 12
 	}
12 13
 
13 14
 	for i := range targets {
15
+		if targets[i].TargetId == "" {
16
+			return errors.New("关联内容不能为空")
17
+		}
18
+
19
+		// TODO
20
+		// 校验关联内容是否有效
21
+
14 22
 		targets[i].CouponId = couponID
15 23
 	}
16 24
 

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

@@ -8,7 +8,7 @@ type TaCoupon struct {
8 8
 	CouponId     string    `xorm:"not null pk VARCHAR(64)"`
9 9
 	CouponName   string    `xorm:"VARCHAR(255)"`
10 10
 	CouponTypeId string    `xorm:"VARCHAR(64)"`
11
-	SendType     int       `xorm:"comment('0案场 1渠道') SMALLINT(6)"`
11
+	SendType     string    `xorm:"VARCHAR(20)"`
12 12
 	VideoUrl     string    `xorm:"TEXT"`
13 13
 	CoverUrl     string    `xorm:"TEXT"`
14 14
 	Price        string    `xorm:"DECIMAL(64)"`

+ 1
- 0
models/model/ta_coupon_target.go 查看文件

@@ -1,6 +1,7 @@
1 1
 package model
2 2
 
3 3
 type TaCouponTarget struct {
4
+	TargetType string `xorm:"not null pk VARCHAR(20)"`
4 5
 	TargetId   string `xorm:"not null pk VARCHAR(64)"`
5 6
 	CouponId   string `xorm:"VARCHAR(64)"`
6 7
 	TargetName string `xorm:"VARCHAR(255)"`

+ 7
- 0
routers/common.go 查看文件

@@ -4,6 +4,7 @@ import (
4 4
 	"spaceofcheng/services/controllers"
5 5
 	"spaceofcheng/services/controllers/cases"
6 6
 	"spaceofcheng/services/controllers/channel"
7
+	"spaceofcheng/services/controllers/coupon"
7 8
 	"spaceofcheng/services/controllers/course"
8 9
 	"spaceofcheng/services/controllers/customer"
9 10
 	"spaceofcheng/services/controllers/goods"
@@ -214,6 +215,12 @@ func getCommonRoutes() beego.LinkNamespace {
214 215
 		beego.NSRouter("/order/goods/finish/:id", &goods.GoodsController{}, "put:FinishMake"),
215 216
 		beego.NSRouter("/order/goods/cancel/:id", &goods.GoodsController{}, "put:CancelMake"),
216 217
 
218
+		// 优惠券
219
+		beego.NSRouter("/coupon", &coupon.CouponController{}, "get:ListByCase"),
220
+		beego.NSRouter("/coupon", &coupon.CouponController{}, "post:SaveCoupon"),
221
+		beego.NSRouter("/coupon/:id", &coupon.CouponController{}, "put:UpdateCoupon"),
222
+		beego.NSRouter("/coupon/:id/to/:users", &coupon.CouponController{}, "post:GiveCoupon"),
223
+
217 224
 		// 文件
218 225
 		beego.NSRouter("/file", &controllers.BaseController{}, "post:FileUpload"),
219 226
 

+ 124
- 54
service/coupon/coupon.go 查看文件

@@ -7,6 +7,7 @@ import (
7 7
 	"spaceofcheng/services/models/customer"
8 8
 	"spaceofcheng/services/models/model"
9 9
 	"spaceofcheng/services/utils"
10
+	"strings"
10 11
 	"time"
11 12
 
12 13
 	"github.com/yl10/kit/guid"
@@ -30,19 +31,34 @@ func NewCouponServ(ctx *utils.Context) *CouponServ {
30 31
 
31 32
 // GetCouponList 获取优惠券列表
32 33
 func (s *CouponServ) GetCouponList(caseID string, pagenavi ...int) ([]model.TaCoupon, int64, error) {
33
-	if caseID == "" {
34
-		return nil, 0, errors.New("未指定案场")
35
-	}
34
+	filters := []string{}
36 35
 
37
-	if err := utils.NewAuthEngine(s.ctx).CheckCase(caseID); err != nil {
38
-		return nil, 0, err
39
-	}
36
+	if caseID != "" {
37
+		if err := utils.NewAuthEngine(s.ctx).CheckCase(caseID); err != nil {
38
+			return nil, 0, err
39
+		}
40 40
 
41
-	limit := utils.GetPageNaviLimit(pagenavi...)
42
-	filters := []string{
43
-		"case_id='" + caseID + "'",
41
+		filters = []string{
42
+			"case_id='" + caseID + "'",
43
+		}
44
+	} else {
45
+		casesRaw := s.ctx.Get("cases")
46
+		if casesRaw == nil {
47
+			return nil, 0, errors.New("请设置过滤案场")
48
+		}
49
+
50
+		cases := casesRaw.([]model.SysUserCase)
51
+		caseIDs := []string{}
52
+		for _, cs := range cases {
53
+			caseIDs = append(caseIDs, cs.CaseId)
54
+		}
55
+
56
+		filters = []string{
57
+			"case_id in ('" + strings.Join(caseIDs, "','") + "')",
58
+		}
44 59
 	}
45 60
 
61
+	limit := utils.GetPageNaviLimit(pagenavi...)
46 62
 	res, total, err := s.dao.GetCouponList(filters, limit)
47 63
 	if err != nil {
48 64
 		utils.LogError("查询优惠券列表失败: " + err.Error())
@@ -176,17 +192,6 @@ func (s *CouponServ) GiveCoupon(couponID string, uids []string) error {
176 192
 		}
177 193
 	}
178 194
 
179
-	// 计算卡券有效期
180
-	startDate := cp.StartDate
181
-	endDate := cp.EndDate
182
-	if cp.ValidDays > 0 {
183
-		startDate = now
184
-		hs := int64(cp.ValidDays * 24)
185
-		endDate = now.Add(time.Hour * time.Duration(hs))
186
-	}
187
-
188
-	cps := make([]model.TaCustomerCoupon, 0)
189
-	recs := make([]model.TaCouponGiveRecord, 0)
190 195
 	for _, uid := range uids {
191 196
 		// 获取客户信息
192 197
 		cust, err := s.custDao.GetCustomerByID(uid)
@@ -195,56 +200,121 @@ func (s *CouponServ) GiveCoupon(couponID string, uids []string) error {
195 200
 			return errors.New("校验客户信息失败")
196 201
 		}
197 202
 
198
-		// 检查用户是否已经有了该券
199
-		custCPS, err := s.dao.CheckCustCoupon(uid, cp.CouponId, startDate, endDate)
200
-		if err != nil {
201
-			utils.LogError("校验客户优惠券失败: " + err.Error())
202
-			return errors.New("校验客户优惠券失败")
203
+		if err := s.GiveCouponTo(&user, cust, cp); err != nil {
204
+			return err
203 205
 		}
206
+	}
204 207
 
205
-		if custCPS != nil && len(custCPS) > 0 {
206
-			return errors.New("客户 " + cust.CustomerName + " 已经拥有该券")
207
-		}
208
+	return nil
209
+}
208 210
 
209
-		// 放入我的卡券
210
-		custCP := model.TaCustomerCoupon{
211
-			CouponId:           cp.CouponId,
212
-			CustomerCouponName: cp.CouponName,
213
-			CustomerId:         uid,
214
-			StartDate:          startDate,
215
-			EndDate:            endDate,
216
-			ReceiveDate:        now,
217
-			CaseId:             cp.CaseId,
218
-			OrgId:              cp.OrgId,
219
-		}
211
+// GiveCouponTo 赠送优惠券
212
+// 本方法会被多出调用, 方法内使用 Context 将是不安全的
213
+func (s *CouponServ) GiveCouponTo(from *model.SysUser, to *model.TaCustomer, cp *model.TaCoupon) error {
214
+	if from.UserId == "" {
215
+		return errors.New("必须指定赠送人")
216
+	}
217
+
218
+	if to.CustomerId == "" {
219
+		return errors.New("必须指定接收人")
220
+	}
220 221
 
221
-		cps = append(cps, custCP)
222
-
223
-		// 放入赠送记录
224
-		rec := model.TaCouponGiveRecord{
225
-			GiftType:   models.GIVE_GIFT_COUPON,
226
-			GiftId:     cp.CouponId,
227
-			GiftName:   cp.CouponName,
228
-			FromId:     user.UserId,
229
-			FromName:   user.UserName,
230
-			ToId:       cust.CustomerId,
231
-			ToName:     cust.CustomerName,
232
-			CreateDate: now,
222
+	// 优惠券必须状态正常
223
+	if cp.CouponId == "" || cp.Status != models.STATUS_NORMAL {
224
+		return errors.New("优惠券已失效或者不存在")
225
+	}
226
+
227
+	now := time.Now().Local()
228
+	if cp.ValidDays <= 0 {
229
+		if cp.EndDate.Before(now) {
230
+			return errors.New("优惠券已失效")
233 231
 		}
232
+	}
233
+
234
+	// 计算卡券有效期
235
+	startDate := cp.StartDate
236
+	endDate := cp.EndDate
237
+	if cp.ValidDays > 0 {
238
+		startDate = now
239
+		hs := int64(cp.ValidDays * 24)
240
+		endDate = now.Add(time.Hour * time.Duration(hs))
241
+	}
234 242
 
235
-		recs = append(recs, rec)
243
+	// 检查用户是否已经有了该券
244
+	custCPS, err := s.dao.CheckCustCoupon(to.CustomerId, cp.CouponId, startDate, endDate)
245
+	if err != nil {
246
+		utils.LogError("校验客户优惠券失败: " + err.Error())
247
+		return errors.New("校验客户优惠券失败")
248
+	}
249
+
250
+	if custCPS != nil && len(custCPS) > 0 {
251
+		return errors.New("客户 " + to.CustomerName + " 已经拥有该券")
252
+	}
253
+
254
+	// 放入我的卡券
255
+	custCP := model.TaCustomerCoupon{
256
+		CouponId:           cp.CouponId,
257
+		CustomerCouponName: cp.CouponName,
258
+		CustomerId:         to.CustomerId,
259
+		StartDate:          startDate,
260
+		EndDate:            endDate,
261
+		ReceiveDate:        now,
262
+		CaseId:             cp.CaseId,
263
+		OrgId:              cp.OrgId,
264
+	}
265
+
266
+	// 放入赠送记录
267
+	rec := model.TaCouponGiveRecord{
268
+		GiftType:   models.GIVE_GIFT_COUPON,
269
+		GiftId:     cp.CouponId,
270
+		GiftName:   cp.CouponName,
271
+		FromId:     from.UserId,
272
+		FromName:   from.UserName,
273
+		ToId:       to.CustomerId,
274
+		ToName:     to.CustomerName,
275
+		CreateDate: now,
236 276
 	}
237 277
 
238 278
 	// 入库
239
-	if err := s.dao.SaveCustomerCoupons(cps); err != nil {
279
+	if err := s.dao.SaveCustomerCoupons([]model.TaCustomerCoupon{custCP}); err != nil {
240 280
 		utils.LogError("保存客户优惠券失败: " + err.Error())
241 281
 		return errors.New("保存客户优惠券失败")
242 282
 	}
243 283
 
244
-	if err := s.dao.SaveCouponRecoreds(recs); err != nil {
284
+	if err := s.dao.SaveCouponRecoreds([]model.TaCouponGiveRecord{rec}); err != nil {
245 285
 		utils.LogError("保存优惠券赠送记录失败: " + err.Error())
246 286
 		return errors.New("保存优惠券赠送记录失败")
247 287
 	}
248 288
 
289
+	// TODO
290
+	// 券库存处理
291
+
249 292
 	return nil
250 293
 }
294
+
295
+// GetCouponByID 获取优惠券
296
+// 未进行权限校验, 非安全的
297
+func (s *CouponServ) GetCouponByID(cpID string) (*model.TaCoupon, error) {
298
+	cp, err := s.dao.GetCouponByID(cpID)
299
+	if err != nil {
300
+		utils.LogError("获取优惠券失败: " + err.Error())
301
+		return nil, errors.New("校验优惠券失败")
302
+	}
303
+
304
+	return cp, nil
305
+}
306
+
307
+// GetCouponByIDWithCheck 获取优惠券
308
+func (s *CouponServ) GetCouponByIDWithCheck(cpID string) (*model.TaCoupon, error) {
309
+	cp, err := s.dao.GetCouponByID(cpID)
310
+	if err != nil {
311
+		utils.LogError("获取优惠券失败: " + err.Error())
312
+		return nil, errors.New("校验优惠券失败")
313
+	}
314
+
315
+	if err := utils.NewAuthEngine(s.ctx).CheckCase(cp.CaseId); err != nil {
316
+		return nil, err
317
+	}
318
+
319
+	return cp, nil
320
+}

+ 4
- 2
service/customer/customer.go 查看文件

@@ -140,7 +140,8 @@ func (s *CustomerServ) BindWechatUser(userMap *model.TaUserMapping, phone string
140 140
 	}
141 141
 
142 142
 	// triggerRegiteEvent 触发注册事件
143
-	utils.EmitEvent(events.EvtRegiste, *cust)
143
+	evtEngID := utils.EngineIDBy(cust.OrgId, cust.RecommendCase)
144
+	utils.EventEngineBus(evtEngID).EmitEvent(events.EvtRegiste, *cust)
144 145
 
145 146
 	// if cust.CustomerId == userMap.UserId {
146 147
 	// 	return cust, nil
@@ -243,7 +244,8 @@ func (s *CustomerServ) BindWechatCust(userMap *model.TaUserMapping, phone, caseI
243 244
 	}
244 245
 
245 246
 	// triggerRegiteEvent 触发注册事件
246
-	utils.EmitEvent(events.EvtRegiste, *cust)
247
+	evtEngID := utils.EngineIDBy(cust.OrgId, cust.RecommendCase)
248
+	utils.EventEngineBus(evtEngID).EmitEvent(events.EvtRegiste, *cust)
247 249
 
248 250
 	// 更新用户映射信息
249 251
 	userMap.UserId = cust.CustomerId

+ 52
- 33
service/events/events.go 查看文件

@@ -2,6 +2,9 @@ package events
2 2
 
3 3
 import (
4 4
 	"fmt"
5
+	"spaceofcheng/services/models"
6
+	"spaceofcheng/services/models/model"
7
+	"spaceofcheng/services/utils"
5 8
 	"sync"
6 9
 
7 10
 	"github.com/zjxpcyc/tinyevent"
@@ -19,45 +22,61 @@ var EvtActions = map[string]tinyevent.Action{
19 22
 }
20 23
 
21 24
 // ListenAllEvent 监听所有事件
22
-func ListenAllEvent() {
25
+func ListenAllEvent(orgID, caseID string) {
23 26
 	mtx.Lock()
24 27
 	defer mtx.Unlock()
25 28
 
26
-	// // 所有需要执行的事件
27
-	// allEvts, err := getAllEvents()
28
-	// if err != nil {
29
-	// 	utils.LogError(err)
30
-	// }
31
-
32
-	// // 刷新中控中心
33
-	// utils.ResetEvtBus()
34
-
35
-	// for evt, acts := range allEvts {
36
-	// 	for _, actKey := range acts {
37
-	// 		act, ok := EvtActions[actKey]
38
-	// 		if ok {
39
-	// 			utils.ListenEvent(evt, act)
40
-	// 		}
41
-	// 	}
42
-	// }
29
+	evtEngID := utils.EngineIDBy(orgID, caseID)
30
+	evtEngine := utils.ResetEventEngineBus(evtEngID)
31
+
32
+	// 所有需要执行的事件
33
+	allEvts, err := getAllEvents(orgID, caseID)
34
+	if err != nil {
35
+		utils.LogError(err)
36
+	}
37
+
38
+	// 刷新中控中心
39
+	for evt, acts := range allEvts {
40
+		for _, actKey := range acts {
41
+			act, ok := EvtActions[actKey]
42
+			if ok {
43
+				evtEngine.ListenEvent(evt, act)
44
+			}
45
+		}
46
+	}
43 47
 }
44 48
 
45 49
 // getAllEvents 获取数据库配置
46
-func getAllEvents() (map[string][]string, error) {
47
-	// db := models.DBEngine
48
-
49
-	// var evts []model.SysActivity
50
-	// if err := db.Where("status=?", models.STATUS_NORMAL).Find(&evts); err != nil {
51
-	// 	return nil, err
52
-	// }
53
-
54
-	// TODO
55
-	return map[string][]string{
56
-		EvtRegiste: []string{
57
-			ActTest,
58
-			ActGiveCoupon,
59
-		},
60
-	}, nil
50
+func getAllEvents(orgID, caseID string) (map[string][]string, error) {
51
+	db := models.DBEngine
52
+
53
+	var evts []model.SysActivity
54
+	var acts []model.SysActivityAction
55
+
56
+	if err := db.Where("org_id=?", orgID).
57
+		And("case_id=?", caseID).
58
+		And("status=?", models.STATUS_NORMAL).
59
+		Find(&evts); err != nil {
60
+		utils.LogError("查询营销活动配置表失败: " + err.Error())
61
+		return nil, err
62
+	}
63
+
64
+	res := make(map[string][]string)
65
+	for _, evtSetting := range evts {
66
+		res[evtSetting.ActivityType] = make([]string, 0)
67
+		acts = make([]model.SysActivityAction, 0)
68
+
69
+		if err := db.Where("activity_id=?", evtSetting.ActivityId).Find(&acts); err != nil {
70
+			utils.LogError("查询营销活动配置明细失败: " + err.Error())
71
+			return nil, err
72
+		}
73
+
74
+		for _, act := range acts {
75
+			res[evtSetting.ActivityType] = append(res[evtSetting.ActivityType], act.ActiveType)
76
+		}
77
+	}
78
+
79
+	return res, nil
61 80
 }
62 81
 
63 82
 var tsAction = func(e tinyevent.Event) error {

+ 66
- 8
service/events/giveCoupon.go 查看文件

@@ -1,22 +1,80 @@
1 1
 package events
2 2
 
3 3
 import (
4
+	"errors"
5
+	"spaceofcheng/services/models"
6
+	"spaceofcheng/services/models/model"
7
+	"spaceofcheng/services/service/coupon"
8
+	"spaceofcheng/services/utils"
9
+
4 10
 	"github.com/zjxpcyc/tinyevent"
5 11
 )
6 12
 
7 13
 // giveCoupon 赠送卡券
8 14
 // Event.Payload.customer  = model.TaCustomer
9
-// Event.Payload.caseId  = 案场ID
10 15
 var giveCoupon = func(e tinyevent.Event) error {
11
-	// db := models.DBEngine
16
+	hasDBError := false
17
+	ctx := NewContext()
18
+	defer DestroyContext(ctx, hasDBError)
19
+
20
+	if e.Payload == nil {
21
+		hasDBError = true
22
+		utils.LogError("注册送券失败, 没有用户信息")
23
+		return errors.New("注册送券失败, 没有用户信息")
24
+	}
25
+	dtRaw := e.Payload.(map[string]interface{})
26
+
27
+	cust := dtRaw["customer"].(model.TaCustomer)
28
+	caseID := cust.RecommendCase
29
+	orgID := cust.OrgId
30
+
31
+	query := `
32
+		SELECT
33
+			t.*
34
+		FROM
35
+			sys_activity_action t
36
+		JOIN sys_activity s ON t.activity_id = s.activity_id
37
+		WHERE
38
+			s.org_id = ?
39
+		AND s.case_id = ?
40
+		AND s.status = ?
41
+		AND t.active_type = ?
42
+	`
43
+
44
+	var gifts []model.SysActivityAction
45
+	if err := models.DBEngine.SQL(query, orgID, caseID, models.STATUS_NORMAL, e.Name).Find(&gifts); err != nil {
46
+		hasDBError = true
47
+		utils.LogError("检查营销活动失败: " + err.Error())
48
+		return errors.New("检查营销活动失败")
49
+	}
50
+
51
+	fromUser := model.SysUser{
52
+		UserId:   "SYSTEM",
53
+		UserName: "system",
54
+	}
55
+
56
+	cpServ := coupon.NewCouponServ(ctx)
12 57
 
13
-	// if e.Payload == nil {
14
-	// 	utils.LogError("注册送券失败, 没有用户信息")
15
-	// }
16
-	// dtRaw := e.Payload.(map[string]interface{})
58
+	for _, gift := range gifts {
59
+		switch gift.ResourceType {
60
+		case models.GIVE_GIFT_COUPON:
61
+			cpID := gift.ResourceDesc
62
+			cp, err := cpServ.GetCouponByID(cpID)
63
+			if err != nil {
64
+				utils.LogError("获取优惠券失败: " + err.Error())
65
+				hasDBError = true
66
+				return errors.New("校验优惠券失败")
67
+			}
17 68
 
18
-	// cust := dtRaw["customer"].(model.TaCustomer)
19
-	// caseID := dtRaw["caseId"].(string)
69
+			if err := cpServ.GiveCouponTo(&fromUser, &cust, cp); err != nil {
70
+				hasDBError = true
71
+				return err
72
+			}
73
+		case models.GIVE_GIFT_EXPERIENCECARD:
74
+		case models.GIVE_GIFT_GYM:
75
+		default:
76
+		}
77
+	}
20 78
 
21 79
 	return nil
22 80
 }

+ 25
- 0
service/events/utils.go 查看文件

@@ -0,0 +1,25 @@
1
+package events
2
+
3
+import (
4
+	"spaceofcheng/services/models"
5
+	"spaceofcheng/services/utils"
6
+)
7
+
8
+// NewContext 初始化 ctx 实例
9
+func NewContext() *utils.Context {
10
+	ctx := utils.NewContext(models.DBEngine, nil)
11
+	ctx.Ready()
12
+
13
+	return ctx
14
+}
15
+
16
+// DestroyContext 注销 ctx
17
+func DestroyContext(ctx *utils.Context, hasError bool) {
18
+	if !hasError {
19
+		ctx.DB.Commit()
20
+	} else {
21
+		ctx.DB.Rollback()
22
+	}
23
+
24
+	ctx.Destroy()
25
+}

+ 2
- 2
service/sys.go 查看文件

@@ -75,7 +75,7 @@ func (s *SysServ) SetCustomer(id string) error {
75 75
 func (s *SysServ) SaveNewCustomer(wxInfo map[string]interface{}, userMap *model.TaUserMapping) (*model.TaCustomer, error) {
76 76
 	// 微信相关字段
77 77
 	nickyName := wxInfo["nickname"].(string)
78
-	sex := wxInfo["sex"].(int)
78
+	sex := wxInfo["sex"].(float64)
79 79
 	headimgurl := wxInfo["headimgurl"].(string)
80 80
 
81 81
 	org := s.ctx.Get("org").(model.SysOrg)
@@ -83,7 +83,7 @@ func (s *SysServ) SaveNewCustomer(wxInfo map[string]interface{}, userMap *model.
83 83
 	cust := model.TaCustomer{
84 84
 		CustomerName: nickyName,
85 85
 		Name:         nickyName,
86
-		Sex:          sex,
86
+		Sex:          int(sex),
87 87
 		Headimgurl:   headimgurl,
88 88
 		OrgId:        org.OrgId,
89 89
 	}

+ 60
- 36
utils/event.go 查看文件

@@ -1,49 +1,73 @@
1 1
 package utils
2 2
 
3
-// type EventEngine struct {
4
-// 	ID     string
5
-// 	engine *tinyevent.DefaultBus
6
-// }
3
+import "github.com/zjxpcyc/tinyevent"
7 4
 
8
-// var evtBus map[string]*EventEngine
5
+// EventEngine Event Engine
6
+type EventEngine struct {
7
+	ID     string
8
+	engine *tinyevent.DefaultBus
9
+}
9 10
 
10
-// func NewEventEngineBus(id string) *EventEngine {
11
-// 	if evtBus == nil {
12
-// 		evtBus = make(map[string]*EventEngine)
13
-// 	}
11
+var evtBus map[string]*EventEngine
14 12
 
15
-// 	if id == "" {
16
-// 		return nil
17
-// 	}
13
+// EventEngineBus 初始化实例
14
+func EventEngineBus(id string) *EventEngine {
15
+	if evtBus == nil {
16
+		evtBus = make(map[string]*EventEngine)
17
+	}
18 18
 
19
-// 	evtEngine := &EventEngine{
20
-// 		ID:     id,
21
-// 		engine: new(tinyevent.DefaultBus),
22
-// 	}
19
+	if id == "" {
20
+		return nil
21
+	}
23 22
 
24
-// 	evtBus[id] = evtEngine
23
+	if evtBus[id] == nil {
24
+		evtEngine := &EventEngine{
25
+			ID:     id,
26
+			engine: new(tinyevent.DefaultBus),
27
+		}
25 28
 
26
-// 	return evtEngine
27
-// }
29
+		evtBus[id] = evtEngine
30
+	}
28 31
 
29
-// // EmitEvent 执行事件
30
-// func (t EventEngine) EmitEvent(evt string, payload interface{}) {
31
-// 	e := tinyevent.Event{
32
-// 		Name:    evt,
33
-// 		Payload: payload,
34
-// 	}
32
+	return evtBus[id]
33
+}
35 34
 
36
-// 	t.engine.Emit(e)
37
-// }
35
+// ResetEventEngineBus 重设事件管理引擎
36
+func ResetEventEngineBus(id string) *EventEngine {
37
+	if id == "" || evtBus[id] == nil {
38
+		return nil
39
+	}
38 40
 
39
-// // ListenEvent 注册监听
40
-// func (t EventEngine) ListenEvent(evt string, act tinyevent.Action) string {
41
-// 	return t.engine.On(evt, act)
42
-// }
41
+	evtEngine := &EventEngine{
42
+		ID:     id,
43
+		engine: new(tinyevent.DefaultBus),
44
+	}
43 45
 
44
-// // UnListenEvt 取消监听
45
-// func (t EventEngine) UnListenEvt(id string) {
46
-// 	t.engine.Off(id)
47
-// }
46
+	evtBus[id] = evtEngine
47
+	return evtEngine
48
+}
48 49
 
49
-func EmitEvent(evt string, payload interface{}) {}
50
+// EmitEvent 执行事件
51
+func (t EventEngine) EmitEvent(evt string, payload interface{}) {
52
+	e := tinyevent.Event{
53
+		Name:    evt,
54
+		Payload: payload,
55
+	}
56
+
57
+	t.engine.Emit(e)
58
+}
59
+
60
+// ListenEvent 注册监听
61
+func (t EventEngine) ListenEvent(evt string, act tinyevent.Action) string {
62
+	return t.engine.On(evt, act)
63
+}
64
+
65
+// UnListenEvt 取消监听
66
+func (t EventEngine) UnListenEvt(id string) {
67
+	t.engine.Off(id)
68
+}
69
+
70
+// EngineIDBy 获取 Engine Id
71
+func EngineIDBy(orgID, caseID string) string {
72
+	return orgID + caseID
73
+}