Browse Source

Merge branch 'master' of http://git.shengws.com/zhangbj/scrm-go

xiaoming_global 4 years ago
parent
commit
6bbd6bb5f0

+ 343 - 4
controllers/members/card_controller.go View File

@@ -5,9 +5,11 @@ import (
5 5
 	"SCRM/enums"
6 6
 	"SCRM/models"
7 7
 	"SCRM/service/member_service"
8
-	"time"
9
-
8
+	"SCRM/utils"
9
+	"encoding/json"
10 10
 	"fmt"
11
+	"reflect"
12
+	"time"
11 13
 
12 14
 	"github.com/astaxie/beego"
13 15
 	"github.com/bwmarrin/snowflake"
@@ -15,6 +17,10 @@ import (
15 17
 
16 18
 func CardCtlRegistRouters() {
17 19
 	beego.Router("/api/member/card/edit", &CardAPIController{}, "Put:EditMemberCard")
20
+	beego.Router("/api/membercards", &CardAPIController{}, "Get:GetCards")
21
+	beego.Router("/api/membercard/create", &CardAPIController{}, "Post:CreateCard")
22
+	beego.Router("/api/membercard/edit", &CardAPIController{}, "Put:EditCard")
23
+	beego.Router("/api/membercards/delete", &CardAPIController{}, "Delete:DeleteCard")
18 24
 }
19 25
 
20 26
 type CardAPIController struct {
@@ -79,14 +85,14 @@ func (c *CardAPIController) EditMemberCard() {
79 85
 			}
80 86
 			cardNo := node.Generate()
81 87
 
82
-			userCard.CardId = card.ID
83
-			userCard.CardName = card.CardName
84 88
 			userCard.CustomerId = id
85 89
 			userCard.UserOrgId = adminUserInfo.CurrentOrgId
86 90
 			userCard.CreatedTime = timeNow
87 91
 			userCard.CardNo = fmt.Sprintf("%s", cardNo)
88 92
 		}
89 93
 
94
+		userCard.CardId = card.ID
95
+		userCard.CardName = card.CardName
90 96
 		userCard.UpdatedTime = timeNow
91 97
 		userCard.Status = 1
92 98
 		err = member_service.SaveUserCard(&userCard, member)
@@ -101,3 +107,336 @@ func (c *CardAPIController) EditMemberCard() {
101 107
 	c.ServeSuccessJSON(returnData)
102 108
 	return
103 109
 }
110
+
111
+func (c *CardAPIController) GetCards() {
112
+
113
+	adminUserInfo := c.GetAdminUserInfo()
114
+	cards, _ := member_service.GetCardList(adminUserInfo.CurrentOrgId)
115
+
116
+	returnData := make(map[string]interface{}, 0)
117
+	returnData["cards"] = cards
118
+	c.ServeSuccessJSON(returnData)
119
+	return
120
+}
121
+
122
+func (c *CardAPIController) CreateCard() {
123
+
124
+	adminUserInfo := c.GetAdminUserInfo()
125
+	timeNow := time.Now().Unix()
126
+
127
+	dataBody := make(map[string]interface{}, 0)
128
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
129
+	if err != nil {
130
+		utils.ErrorLog(err.Error())
131
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误")
132
+		return
133
+	}
134
+
135
+	var card models.UserMembershipCard
136
+
137
+	if dataBody["background_type"] == nil || reflect.TypeOf(dataBody["background_type"]).String() != "float64" {
138
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:background_type")
139
+		return
140
+	}
141
+	backgroundType := int64(dataBody["background_type"].(float64))
142
+	if backgroundType != 1 && backgroundType != 2 {
143
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "请选择正确的卡片封面模式")
144
+		return
145
+	}
146
+	card.BackgroundType = backgroundType
147
+
148
+	if dataBody["background"] == nil || reflect.TypeOf(dataBody["background"]).String() != "string" {
149
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:background")
150
+		return
151
+	}
152
+	background, _ := dataBody["background"].(string)
153
+	if len(background) == 0 {
154
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "卡片封面不能为空")
155
+		return
156
+	}
157
+	if backgroundType == 1 && !utils.CheckHexColor(background) {
158
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "背景色格式不正确")
159
+		return
160
+	}
161
+	card.Background = background
162
+
163
+	if dataBody["card_name"] == nil || reflect.TypeOf(dataBody["card_name"]).String() != "string" {
164
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:card_name")
165
+		return
166
+	}
167
+	cardName, _ := dataBody["card_name"].(string)
168
+	if len(cardName) == 0 {
169
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "会员卡名称不能为空")
170
+		return
171
+	}
172
+	card.CardName = cardName
173
+
174
+	if dataBody["use_notice"] != nil && reflect.TypeOf(dataBody["use_notice"]).String() == "string" {
175
+		useNotice, _ := dataBody["use_notice"].(string)
176
+		if len([]rune(useNotice)) > 300 {
177
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "使用须知最多可输入300个字符")
178
+			return
179
+		}
180
+		card.UseNotice = useNotice
181
+	}
182
+
183
+	if dataBody["card_right"] != nil && reflect.TypeOf(dataBody["card_right"]).String() == "string" {
184
+		cardRight, _ := dataBody["card_right"].(string)
185
+		if len([]rune(cardRight)) > 300 {
186
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "会员权益最多可输入300个字符")
187
+			return
188
+		}
189
+		card.CardRight = cardRight
190
+	}
191
+
192
+	if dataBody["service_phone"] != nil && reflect.TypeOf(dataBody["service_phone"]).String() == "string" {
193
+		servicePhone, _ := dataBody["service_phone"].(string)
194
+		if len(servicePhone) > 0 && (!utils.CheckMobile(servicePhone) && !utils.CheckPhone(servicePhone)) {
195
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "客服电话格式不正确")
196
+			return
197
+		}
198
+		card.ServicePhone = servicePhone
199
+	}
200
+
201
+	if dataBody["upgrade_integral"] != nil && reflect.TypeOf(dataBody["upgrade_integral"]).String() == "float64" {
202
+		upgradeIntegral := int64(dataBody["upgrade_integral"].(float64))
203
+		if upgradeIntegral < 0 {
204
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "累积积分不能小于0")
205
+			return
206
+		}
207
+		card.UpgradeIntegral = upgradeIntegral
208
+
209
+	}
210
+	card.UserOrgId = adminUserInfo.CurrentOrgId
211
+	card.Status = 1
212
+	card.CreatedTime = timeNow
213
+	card.UpdatedTime = timeNow
214
+
215
+	oldCard, err := member_service.FindMemberCardByName(adminUserInfo.CurrentOrgId, card.CardName)
216
+	if err != nil {
217
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "添加会员卡失败:("+err.Error()+")")
218
+		return
219
+	}
220
+	if oldCard != nil {
221
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "添加会员卡失败:(已经存在同名的会员卡)")
222
+		return
223
+	}
224
+
225
+	err = member_service.SaveMemberCard(&card)
226
+	if err != nil {
227
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "添加会员卡失败:("+err.Error()+")")
228
+		return
229
+	}
230
+
231
+	returnData := make(map[string]interface{}, 0)
232
+	returnData["card"] = card
233
+	c.ServeSuccessJSON(returnData)
234
+	return
235
+
236
+}
237
+
238
+func (c *CardAPIController) EditCard() {
239
+	id, _ := c.GetInt64("id", 0)
240
+	if id <= 0 {
241
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误:id")
242
+		return
243
+	}
244
+
245
+	adminUserInfo := c.GetAdminUserInfo()
246
+	timeNow := time.Now().Unix()
247
+
248
+	dataBody := make(map[string]interface{}, 0)
249
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
250
+	if err != nil {
251
+		utils.ErrorLog(err.Error())
252
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误")
253
+		return
254
+	}
255
+
256
+	card, err := member_service.FindOnlyMemberCardByID(adminUserInfo.CurrentOrgId, id)
257
+	if err != nil {
258
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑会员卡失败:("+err.Error()+")")
259
+		return
260
+	}
261
+	if card == nil {
262
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑会员卡失败:(会员卡不存在)")
263
+		return
264
+	}
265
+
266
+	if dataBody["background_type"] == nil || reflect.TypeOf(dataBody["background_type"]).String() != "float64" {
267
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:background_type")
268
+		return
269
+	}
270
+	backgroundType := int64(dataBody["background_type"].(float64))
271
+	if backgroundType != 1 && backgroundType != 2 {
272
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "请选择正确的卡片封面模式")
273
+		return
274
+	}
275
+	card.BackgroundType = backgroundType
276
+
277
+	if dataBody["background"] == nil || reflect.TypeOf(dataBody["background"]).String() != "string" {
278
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:background")
279
+		return
280
+	}
281
+	background, _ := dataBody["background"].(string)
282
+	if len(background) == 0 {
283
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "卡片封面不能为空")
284
+		return
285
+	}
286
+	if backgroundType == 1 && !utils.CheckHexColor(background) {
287
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "背景色格式不正确")
288
+		return
289
+	}
290
+	card.Background = background
291
+
292
+	if dataBody["card_name"] == nil || reflect.TypeOf(dataBody["card_name"]).String() != "string" {
293
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:card_name")
294
+		return
295
+	}
296
+	cardName, _ := dataBody["card_name"].(string)
297
+	if len(cardName) == 0 {
298
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "会员卡名称不能为空")
299
+		return
300
+	}
301
+	card.CardName = cardName
302
+
303
+	if dataBody["use_notice"] != nil && reflect.TypeOf(dataBody["use_notice"]).String() == "string" {
304
+		useNotice, _ := dataBody["use_notice"].(string)
305
+		if len([]rune(useNotice)) > 300 {
306
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "使用须知最多可输入300个字符")
307
+			return
308
+		}
309
+		card.UseNotice = useNotice
310
+	}
311
+
312
+	if dataBody["card_right"] != nil && reflect.TypeOf(dataBody["card_right"]).String() == "string" {
313
+		cardRight, _ := dataBody["card_right"].(string)
314
+		if len([]rune(cardRight)) > 300 {
315
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "会员权益最多可输入300个字符")
316
+			return
317
+		}
318
+		card.CardRight = cardRight
319
+	}
320
+
321
+	if dataBody["service_phone"] != nil && reflect.TypeOf(dataBody["service_phone"]).String() == "string" {
322
+		servicePhone, _ := dataBody["service_phone"].(string)
323
+		if len(servicePhone) > 0 && (!utils.CheckMobile(servicePhone) && !utils.CheckPhone(servicePhone)) {
324
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "客服电话格式不正确")
325
+			return
326
+		}
327
+		card.ServicePhone = servicePhone
328
+	}
329
+
330
+	if dataBody["upgrade_integral"] != nil && reflect.TypeOf(dataBody["upgrade_integral"]).String() == "float64" {
331
+		upgradeIntegral := int64(dataBody["upgrade_integral"].(float64))
332
+		if upgradeIntegral < 0 {
333
+			c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "累积积分不能小于0")
334
+			return
335
+		}
336
+		card.UpgradeIntegral = upgradeIntegral
337
+
338
+	}
339
+	card.UpdatedTime = timeNow
340
+
341
+	oldCard, err := member_service.FindMemberCardByName(adminUserInfo.CurrentOrgId, card.CardName)
342
+	if err != nil {
343
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑会员卡失败:("+err.Error()+")")
344
+		return
345
+	}
346
+	if oldCard != nil && oldCard.ID != card.ID {
347
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑会员卡失败:(已经存在同名的会员卡)")
348
+		return
349
+	}
350
+
351
+	err = member_service.SaveMemberCard(card)
352
+	if err != nil {
353
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑会员卡失败:("+err.Error()+")")
354
+		return
355
+	}
356
+
357
+	returnData := make(map[string]interface{}, 0)
358
+	returnData["card"] = card
359
+	c.ServeSuccessJSON(returnData)
360
+	return
361
+
362
+}
363
+
364
+func (c *CardAPIController) DeleteCard() {
365
+	adminUserInfo := c.GetAdminUserInfo()
366
+
367
+	dataBody := make(map[string]interface{}, 0)
368
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
369
+	if err != nil {
370
+		utils.ErrorLog(err.Error())
371
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误")
372
+		return
373
+	}
374
+
375
+	idsInters := dataBody["ids"].([]interface{})
376
+	if len(idsInters) == 0 {
377
+		if err != nil {
378
+			c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:(没有选择会员卡)")
379
+			return
380
+		}
381
+	}
382
+
383
+	ids := make([]int64, 0)
384
+	for _, idsInter := range idsInters {
385
+		id := int64(idsInter.(float64))
386
+		ids = append(ids, id)
387
+	}
388
+
389
+	count, err := member_service.GetMemebrCardCount(adminUserInfo.CurrentOrgId)
390
+	if err != nil {
391
+		c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:("+err.Error()+")")
392
+		return
393
+	}
394
+	if count <= 1 {
395
+		c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:(只有1张会员卡时不能删除)")
396
+		return
397
+	}
398
+	if count-int64(len(ids)) < 1 {
399
+		c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:(至少需要保留1张会员卡)")
400
+		return
401
+	}
402
+
403
+	ccs, err := member_service.GetCardsUserCount(adminUserInfo.CurrentOrgId, ids)
404
+	if err != nil {
405
+		c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:("+err.Error()+")")
406
+		return
407
+	}
408
+
409
+	hadUserIds := make([]int64, 0)
410
+	willIds := make([]int64, 0)
411
+	if len(ccs) > 0 {
412
+		ccsMap := make(map[int64]int64, 0)
413
+		for _, cc := range ccs {
414
+			if cc.MemberCount > 0 {
415
+				hadUserIds = append(hadUserIds, cc.CardID)
416
+				ccsMap[cc.CardID] = cc.MemberCount
417
+			}
418
+		}
419
+		for _, id := range ids {
420
+			if _, exist := ccsMap[id]; !exist {
421
+				willIds = append(willIds, id)
422
+			}
423
+		}
424
+		if len(willIds) == 0 {
425
+			c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:(不能删除有会员的会员卡)")
426
+			return
427
+		}
428
+	}
429
+
430
+	err = member_service.DeleteMemberShipCards(adminUserInfo.CurrentOrgId, ids)
431
+	if err != nil {
432
+		c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除会员卡失败:("+err.Error()+")")
433
+		return
434
+	}
435
+
436
+	returnData := make(map[string]interface{}, 0)
437
+	returnData["delete_ids"] = willIds
438
+	returnData["delete_number"] = len(willIds)
439
+
440
+	c.ServeSuccessJSON(returnData)
441
+	return
442
+}

+ 155 - 1
controllers/members/tags_controller.go View File

@@ -18,6 +18,9 @@ func TagCtlRegistRouters() {
18 18
 	beego.Router("/api/member/tag/edit", &TagAPIController{}, "Post:EditMemberTags")
19 19
 	beego.Router("/api/members/tags/add", &TagAPIController{}, "Post:AddMembersTags")
20 20
 	beego.Router("/api/members/tags", &TagAPIController{}, "Get:GetTags")
21
+	beego.Router("/api/members/tag/create", &TagAPIController{}, "Post:CreateTag")
22
+	beego.Router("/api/members/tag/edit", &TagAPIController{}, "Put:EditTag")
23
+	beego.Router("/api/members/tags/delete", &TagAPIController{}, "Delete:DeleteTag")
21 24
 }
22 25
 
23 26
 type TagAPIController struct {
@@ -232,10 +235,161 @@ func (c *TagAPIController) GetTags() {
232 235
 	}
233 236
 
234 237
 	adminUserInfo := c.GetAdminUserInfo()
235
-	tags, _ := member_service.GetPageTagList(adminUserInfo.CurrentOrgId, page, limit, searchKey)
238
+	tags, total, _ := member_service.GetPageTagList(adminUserInfo.CurrentOrgId, page, limit, searchKey)
236 239
 
237 240
 	returnData := make(map[string]interface{}, 0)
238 241
 	returnData["tags"] = tags
242
+	returnData["total"] = total
243
+	c.ServeSuccessJSON(returnData)
244
+	return
245
+}
246
+
247
+func (c *TagAPIController) CreateTag() {
248
+	adminUserInfo := c.GetAdminUserInfo()
249
+	timeNow := time.Now().Unix()
250
+
251
+	dataBody := make(map[string]interface{}, 0)
252
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
253
+	if err != nil {
254
+		utils.ErrorLog(err.Error())
255
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误")
256
+		return
257
+	}
258
+
259
+	var tag models.UserTags
260
+
261
+	if dataBody["tag_name"] == nil || reflect.TypeOf(dataBody["tag_name"]).String() != "string" {
262
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:标签名")
263
+		return
264
+	}
265
+	tagName, _ := dataBody["tag_name"].(string)
266
+	if len(tagName) == 0 {
267
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "标签名不能为空")
268
+		return
269
+	}
270
+	tag.TagName = tagName
271
+
272
+	oldTag, err := member_service.FindTagByName(adminUserInfo.CurrentOrgId, tagName)
273
+	if err != nil {
274
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "添加标签失败:("+err.Error()+")")
275
+		return
276
+	}
277
+	if oldTag != nil {
278
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "添加标签失败:(已经存在同名的标签)")
279
+		return
280
+	}
281
+	tag.Status = 1
282
+	tag.UserOrgId = adminUserInfo.CurrentOrgId
283
+	tag.CreatedTime = timeNow
284
+	tag.UpdatedTime = timeNow
285
+
286
+	err = member_service.SaveTag(&tag)
287
+	if err != nil {
288
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "添加标签失败:("+err.Error()+")")
289
+		return
290
+	}
291
+
292
+	returnData := make(map[string]interface{}, 0)
293
+	returnData["tag"] = tag
294
+	c.ServeSuccessJSON(returnData)
295
+	return
296
+}
297
+
298
+func (c *TagAPIController) EditTag() {
299
+	id, _ := c.GetInt64("id", 0)
300
+	if id <= 0 {
301
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误:id")
302
+		return
303
+	}
304
+	adminUserInfo := c.GetAdminUserInfo()
305
+	timeNow := time.Now().Unix()
306
+
307
+	dataBody := make(map[string]interface{}, 0)
308
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
309
+	if err != nil {
310
+		utils.ErrorLog(err.Error())
311
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误")
312
+		return
313
+	}
314
+
315
+	tag, err := member_service.FindOnlyTagByID(adminUserInfo.CurrentOrgId, id)
316
+	if err != nil {
317
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑标签失败:("+err.Error()+")")
318
+		return
319
+	}
320
+	if tag == nil {
321
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "编辑标签失败:(标签不存在)")
322
+		return
323
+	}
324
+
325
+	if dataBody["tag_name"] == nil || reflect.TypeOf(dataBody["tag_name"]).String() != "string" {
326
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "缺少参数:标签名")
327
+		return
328
+	}
329
+	tagName, _ := dataBody["tag_name"].(string)
330
+	if len(tagName) == 0 {
331
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "标签名不能为空")
332
+		return
333
+	}
334
+	tag.TagName = tagName
335
+
336
+	oldTag, err := member_service.FindTagByName(adminUserInfo.CurrentOrgId, tagName)
337
+	if err != nil {
338
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "编辑标签失败:("+err.Error()+")")
339
+		return
340
+	}
341
+	if oldTag != nil && oldTag.ID != tag.ID {
342
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "编辑标签失败:(已经存在同名的标签)")
343
+		return
344
+	}
345
+	tag.UpdatedTime = timeNow
346
+
347
+	err = member_service.SaveTag(tag)
348
+	if err != nil {
349
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "编辑标签失败:("+err.Error()+")")
350
+		return
351
+	}
352
+
353
+	returnData := make(map[string]interface{}, 0)
354
+	returnData["tag"] = tag
355
+	c.ServeSuccessJSON(returnData)
356
+	return
357
+}
358
+
359
+func (c *TagAPIController) DeleteTag() {
360
+	adminUserInfo := c.GetAdminUserInfo()
361
+
362
+	dataBody := make(map[string]interface{}, 0)
363
+	err := json.Unmarshal(c.Ctx.Input.RequestBody, &dataBody)
364
+	if err != nil {
365
+		utils.ErrorLog(err.Error())
366
+		c.ServeFailJsonSend(enums.ErrorCodeParamWrong, "参数错误")
367
+		return
368
+	}
369
+
370
+	idsInters := dataBody["ids"].([]interface{})
371
+	if len(idsInters) == 0 {
372
+		if err != nil {
373
+			c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除标签失败:(没有选择标签)")
374
+			return
375
+		}
376
+	}
377
+
378
+	ids := make([]int64, 0)
379
+	for _, idsInter := range idsInters {
380
+		id := int64(idsInter.(float64))
381
+		ids = append(ids, id)
382
+	}
383
+
384
+	err = member_service.DeleteTags(adminUserInfo.CurrentOrgId, ids)
385
+	if err != nil {
386
+		c.ServeFailJsonSend(enums.ErrorCodeDBDelete, "删除标签失败:("+err.Error()+")")
387
+		return
388
+	}
389
+
390
+	returnData := make(map[string]interface{}, 0)
391
+	returnData["msg"] = "ok"
392
+
239 393
 	c.ServeSuccessJSON(returnData)
240 394
 	return
241 395
 }

+ 58 - 1
service/member_service/cards_service.go View File

@@ -9,7 +9,7 @@ import (
9 9
 )
10 10
 
11 11
 func GetCardList(orgID int64) (cards []*models.UserMembershipCard, err error) {
12
-	err = service.UserReadDB().Model(&models.UserMembershipCard{}).Where("status=1 and user_org_id=?", orgID).Order("card_level asc, id asc ").Find(&cards).Error
12
+	err = service.UserReadDB().Model(&models.UserMembershipCard{}).Where("status=1 and user_org_id=?", orgID).Find(&cards).Error
13 13
 	return
14 14
 }
15 15
 
@@ -65,3 +65,60 @@ func SaveUserCard(card *models.UserCard, member *Members) (err error) {
65 65
 
66 66
 	return
67 67
 }
68
+
69
+func FindMemberCardByName(orgID int64, name string) (*models.UserMembershipCard, error) {
70
+	var card models.UserMembershipCard
71
+	var err error
72
+	err = service.UserReadDB().Model(&models.UserMembershipCard{}).Where("card_name = ? AND user_org_id=? AND status=1", name, orgID).First(&card).Error
73
+	if err == gorm.ErrRecordNotFound {
74
+		return nil, nil
75
+	}
76
+	if err != nil {
77
+		return nil, err
78
+	}
79
+	return &card, nil
80
+}
81
+
82
+func SaveMemberCard(card *models.UserMembershipCard) (err error) {
83
+	err = service.UserWriteDB().Save(card).Error
84
+	return
85
+}
86
+
87
+func FindOnlyMemberCardByID(orgID, id int64) (*models.UserMembershipCard, error) {
88
+	var card models.UserMembershipCard
89
+	var err error
90
+	err = service.UserReadDB().Model(&models.UserMembershipCard{}).Where("id = ? AND user_org_id=? AND status=1", id, orgID).First(&card).Error
91
+	if err == gorm.ErrRecordNotFound {
92
+		return nil, nil
93
+	}
94
+	if err != nil {
95
+		return nil, err
96
+	}
97
+	return &card, nil
98
+}
99
+
100
+func GetMemebrCardCount(orgID int64) (count int64, err error) {
101
+	err = service.UserReadDB().Model(&models.UserMembershipCard{}).Where("user_org_id=? AND status=1", orgID).Count(&count).Error
102
+	return
103
+}
104
+
105
+func GetCardUserCount(orgID, id int64) (count int64, err error) {
106
+	err = service.UserReadDB().Table("sgj_user_user_card as uc").Joins("JOIN sgj_user_customer as c ON c.id=uc.customer_id AND uc.user_org_id=? AND c.user_org_id=? AND uc.card_id=?", orgID, orgID, id).Where("uc.card_id=? AND uc.status=1 AND c.status=1", id).Count(&count).Error
107
+
108
+	return
109
+}
110
+
111
+func GetCardsUserCount(orgID int64, ids []int64) (counts []*CardsMemberCount, err error) {
112
+	err = service.UserReadDB().Table("sgj_user_user_card as uc").Joins("JOIN sgj_user_customer as c ON c.id=uc.customer_id AND uc.user_org_id=? AND c.user_org_id=?", orgID, orgID).Where("uc.card_id IN (?) AND uc.status=1 AND c.status=1", ids).Select("uc.card_id, COUNT(uc.card_id) AS member_count").Group("uc.card_id").Scan(&counts).Error
113
+
114
+	return
115
+}
116
+
117
+func DeleteMemberShipCards(orgID int64, ids []int64) (err error) {
118
+	if len(ids) == 1 {
119
+		err = service.UserWriteDB().Model(&models.UserMembershipCard{}).Where("id =? and user_org_id =?", ids[0], orgID).Update(map[string]interface{}{"Status": 0, "UpdatedTime": time.Now().Unix()}).Error
120
+	} else {
121
+		err = service.UserWriteDB().Model(&models.UserMembershipCard{}).Where("id IN (?) and user_org_id =?", ids, orgID).Update(map[string]interface{}{"Status": 0, "UpdatedTime": time.Now().Unix()}).Error
122
+	}
123
+	return
124
+}

+ 5 - 1
service/member_service/models.go View File

@@ -38,7 +38,7 @@ func (CustomerIllness) TableName() string {
38 38
 type Tags struct {
39 39
 	models.UserTags
40 40
 
41
-	MemberCount int64
41
+	MemberCount int64 `json:"member_count"`
42 42
 }
43 43
 
44 44
 func (Tags) TableName() string {
@@ -50,3 +50,7 @@ type TagsMemberCount struct {
50 50
 	TagID       int64 `gorm:"tag_id"`
51 51
 }
52 52
 
53
+type CardsMemberCount struct {
54
+	MemberCount int64 `gorm:"member_count"`
55
+	CardID      int64 `gorm:"card_id"`
56
+}

+ 66 - 7
service/member_service/tags_service.go View File

@@ -6,6 +6,8 @@ import (
6 6
 	"errors"
7 7
 	"strings"
8 8
 	"time"
9
+
10
+	"github.com/jinzhu/gorm"
9 11
 )
10 12
 
11 13
 func GetTagList(orgID int64) (tags []*models.UserTags, err error) {
@@ -90,7 +92,7 @@ func SaveMemberTags(tags []*models.UserTagLinks) (err error) {
90 92
 	return
91 93
 }
92 94
 
93
-func GetPageTagList(orgID, page, limit int64, search string) (tags []*Tags, err error) {
95
+func GetPageTagList(orgID, page, limit int64, search string) (tags []*Tags, total int64, err error) {
94 96
 	db := service.UserReadDB().Model(&models.UserTags{}).Where("user_org_id=? and status=1", orgID)
95 97
 
96 98
 	if len(search) > 0 {
@@ -99,15 +101,72 @@ func GetPageTagList(orgID, page, limit int64, search string) (tags []*Tags, err
99 101
 	}
100 102
 	offset := (page - 1) * limit
101 103
 
102
-	err = service.UserReadDB().Model(&models.UserTags{}).Where("user_org_id=? and status=1", orgID).Order("id desc").Offset(offset).Limit(limit).Find(&tags).Error
104
+	err = db.Count(&total).Order("id desc").Offset(offset).Limit(limit).Find(&tags).Error
103 105
 
104 106
 	if len(tags) > 0 {
105
-		// var tmcs []*TagsMemberCount
106
-		// tagIDs := make([]int64, 0)
107
-		// for _, tag := range tags {
108
-		// 	tagIDs = append(tagIDs, tag.ID)
109
-		// }
107
+		var tmcs []*TagsMemberCount
108
+		tagIDs := make([]int64, 0)
109
+		for _, tag := range tags {
110
+			tagIDs = append(tagIDs, tag.ID)
111
+		}
112
+		err = service.UserReadDB().Table("sgj_user_tag_links as utl").Joins("JOIN sgj_user_tags AS ut ON ut.id=utl.tag_id and utl.user_org_id=? and ut.user_org_id=?", orgID, orgID).Select("utl.tag_id, COUNT(utl.tag_id) AS member_count").Where("utl.tag_id IN (?)", tagIDs).Group("utl.tag_id").Scan(&tmcs).Error
113
+		if err != nil {
114
+			return
115
+		}
116
+		if len(tmcs) > 0 {
117
+			tmcsMap := make(map[int64]int64, 0)
118
+			for _, tmc := range tmcs {
119
+				tmcsMap[tmc.TagID] = tmc.MemberCount
120
+			}
121
+
122
+			for index, tag := range tags {
123
+				if _, exist := tmcsMap[tag.ID]; exist {
124
+					tags[index].MemberCount = tmcsMap[tag.ID]
125
+				}
126
+			}
127
+
128
+		}
129
+
130
+	}
131
+	return
132
+}
133
+
134
+func FindTagByName(orgID int64, name string) (*models.UserTags, error) {
135
+	var tag models.UserTags
136
+	var err error
137
+	err = service.UserReadDB().Model(&models.UserTags{}).Where("tag_name=? and user_org_id=? and status=1", name, orgID).First(&tag).Error
138
+	if err == gorm.ErrRecordNotFound {
139
+		return nil, nil
140
+	}
141
+	if err != nil {
142
+		return nil, err
143
+	}
144
+	return &tag, nil
145
+}
146
+
147
+func SaveTag(tag *models.UserTags) (err error) {
148
+	err = service.UserWriteDB().Save(tag).Error
149
+	return
150
+}
151
+
152
+func FindOnlyTagByID(orgID, id int64) (*models.UserTags, error) {
153
+	var tag models.UserTags
154
+	var err error
155
+	err = service.UserReadDB().Model(&models.UserTags{}).Where("id=? and user_org_id=? and status=1", id, orgID).First(&tag).Error
156
+	if err == gorm.ErrRecordNotFound {
157
+		return nil, nil
158
+	}
159
+	if err != nil {
160
+		return nil, err
161
+	}
162
+	return &tag, nil
163
+}
110 164
 
165
+func DeleteTags(orgID int64, ids []int64) (err error) {
166
+	if len(ids) == 1 {
167
+		err = service.UserWriteDB().Model(&models.UserTags{}).Where("id =? and user_org_id =?", ids[0], orgID).Update(map[string]interface{}{"Status": 0, "UpdatedTime": time.Now().Unix()}).Error
168
+	} else {
169
+		err = service.UserWriteDB().Model(&models.UserTags{}).Where("id IN (?) and user_org_id =?", ids, orgID).Update(map[string]interface{}{"Status": 0, "UpdatedTime": time.Now().Unix()}).Error
111 170
 	}
112 171
 	return
113 172
 }

+ 10 - 0
utils/tools.go View File

@@ -43,6 +43,16 @@ func CheckMobile(mobile string) (match bool) {
43 43
 	return
44 44
 }
45 45
 
46
+func CheckPhone(phone string) (match bool) {
47
+	reg, _ := regexp.MatchString("^0[0-9]{2,3}-?[0-9]{7,8}$", phone)
48
+	return reg
49
+}
50
+
51
+func CheckHexColor(color string) (match bool) {
52
+	reg, _ := regexp.MatchString("^#([0-9a-fA-F]{6})$", color)
53
+	return reg
54
+}
55
+
46 56
 func RandCode(min, max int64) string {
47 57
 	if min >= max || min == 0 || max == 0 {
48 58
 		return strconv.FormatInt(max, 10)