소스 검색

is_recommend

胡轶钦 6 년 전
부모
커밋
97479b38cb
5개의 변경된 파일232개의 추가작업 그리고 13개의 파일을 삭제
  1. 9
    7
      controllers/book/book.go
  2. 26
    6
      models/book/book.go
  3. 59
    0
      service/book/book.go
  4. 63
    0
      utils/core.go
  5. 75
    0
      utils/scheduleTask.go

+ 9
- 7
controllers/book/book.go 파일 보기

@@ -6,6 +6,7 @@ import (
6 6
 	"spaceofcheng/services/models/model"
7 7
 	"spaceofcheng/services/service/book"
8 8
 	"strings"
9
+	"time"
9 10
 
10 11
 	"github.com/tealeg/xlsx"
11 12
 )
@@ -289,12 +290,13 @@ func (c *BookController) GetBookById() {
289 290
 	c.ResponseJSON(list)
290 291
 }
291 292
 
292
-// type Kernel struct {
293
-// 	schedules map[string]ScheduleTask
294
-// }
293
+func (c *BookController) SendMessageToCustomer() time.Duration {
294
+	var timeNext time.Duration
295
+	return timeNext
296
+}
295 297
 
296
-// func NewKernel() *Kernel {
297
-// 	return &Kernel{
298
-// 		schedules: make(map[string]ScheduleTask),
299
-// 	}
298
+// func (c *BookController) ScheduleTask() {
299
+// 	kernel := utils.NewKernel()
300
+// 	kernel.SetTask("refresh-token", SendMessageToCustomer)
301
+// 	kernel.StartTask("refresh-token")
300 302
 // }

+ 26
- 6
models/book/book.go 파일 보기

@@ -97,6 +97,7 @@ func (m *BookDAO) EditBook(book model.TaBook) (*model.TaBook, error) {
97 97
 		"publisher",
98 98
 		"price",
99 99
 		"book_description",
100
+		"is_recommend",
100 101
 	}
101 102
 	_, err := m.db.Cols(cols...).Where("book_id = ?", book.BookId).Update(book)
102 103
 	return &book, err
@@ -431,13 +432,20 @@ func (m *BookDAO) GetCustomerByCustomerInfo(customerInfo string) (*model.TaCusto
431 432
 
432 433
 }
433 434
 
435
+type TimeList struct {
436
+	model.TaBookBorrowRecord `xorm:"extends"`
437
+	BookName                 string
438
+}
439
+
434 440
 // GetAllOneWeekRecord 获取时间还剩一周过期的借阅记录
435
-func (m *BookDAO) GetAllOneWeekRecord() ([]model.TaBookBorrowRecord, error) {
436
-	var record []model.TaBookBorrowRecord
441
+func (m *BookDAO) GetAllOneWeekRecord() ([]TimeList, error) {
442
+	var record []TimeList
437 443
 	sql := `SELECT
438
-	a.* 
444
+	a.*,
445
+	b.book_name
439 446
 FROM
440 447
 	ta_book_borrow_record a 
448
+	inner join ta_book b on a.book_id = b.book_id
441 449
 WHERE
442 450
 	DATE_FORMAT( a.end_date, "%Y-%m-%d" ) = DATE_FORMAT( ( SELECT date_add( now( ), INTERVAL 1 WEEK ) ), "%Y-%m-%d" )
443 451
 	and a.borrow_status = '` + models.BORROW_TYPE_BORROWED + `'`
@@ -446,12 +454,14 @@ WHERE
446 454
 }
447 455
 
448 456
 // GetAllLateRecord 获取过期两天的借阅记录
449
-func (m *BookDAO) GetAllLateRecord() ([]model.TaBookBorrowRecord, error) {
450
-	var record []model.TaBookBorrowRecord
457
+func (m *BookDAO) GetAllLateRecord() ([]TimeList, error) {
458
+	var record []TimeList
451 459
 	sql := `SELECT
452
-	a.* 
460
+	a.*,
461
+	b.book_name
453 462
 FROM
454 463
 	ta_book_borrow_record a 
464
+	inner join ta_book b on a.book_id = b.book_id
455 465
 WHERE
456 466
 	DATE_FORMAT( now(), "%Y-%m-%d" ) = DATE_FORMAT( ( SELECT date_add( a.end_date, INTERVAL 2 DAY ) ), "%Y-%m-%d" )
457 467
 	and a.borrow_status = '` + models.BORROW_TYPE_LATE + `'`
@@ -470,3 +480,13 @@ func (m *BookDAO) DeleteBook(bookId string) error {
470 480
 	_, err := m.db.Cols(cols...).Where("book_id = ?", book.BookId).Update(book)
471 481
 	return err
472 482
 }
483
+
484
+func (m *BookDAO) GetUserMappingById(customerId string) (*model.TaUserMapping, error) {
485
+	var userMap []model.TaUserMapping
486
+	sql := `select * from ta_user_mapping where user_id = '` + customerId + `'`
487
+	err := m.db.Sql(sql).Find(&userMap)
488
+	if len(userMap) <= 0 {
489
+		return nil, err
490
+	}
491
+	return &userMap[0], err
492
+}

+ 59
- 0
service/book/book.go 파일 보기

@@ -395,5 +395,64 @@ func (s *BookServ) DeleteBook(bookId string) error {
395 395
 		return errors.New("删除失败")
396 396
 	}
397 397
 	return nil
398
+}
398 399
 
400
+func (s *BookServ) SendMessageToCustomer() error {
401
+	weekList, err := s.dao.GetAllOneWeekRecord()
402
+	if err != nil {
403
+		utils.LogError("发送消息失败失败: " + err.Error())
404
+		return errors.New("发送消息失败失败")
405
+	}
406
+	lateList, err := s.dao.GetAllLateRecord()
407
+	if err != nil {
408
+		utils.LogError("发送消息失败失败: " + err.Error())
409
+		return errors.New("发送消息失败失败")
410
+	}
411
+	if len(weekList) > 0 {
412
+		for i := 0; i < len(weekList); i++ {
413
+			userMap, err := s.dao.GetUserMappingById(weekList[i].CustomerId)
414
+			if err != nil {
415
+				utils.LogError("发送消息失败失败: " + err.Error())
416
+				return errors.New("发送消息失败失败")
417
+			}
418
+			message := utils.Message{
419
+				To: utils.ClientID{ID: userMap.Openid},
420
+				Data: map[string]interface{}{
421
+					"orgid": weekList[i].OrgId,
422
+					"tplid": "",
423
+					"data": map[string]string{
424
+						"first":    "还书提醒",
425
+						"keyword1": weekList[i].BookName,
426
+						"keyword2": weekList[i].EndDate.Format("2006-01-02"),
427
+						// "remark":   fmt.Sprintf(remarkTpl, recored.ValidateEnd.Format("2006-01-02"), caseName),
428
+					},
429
+				},
430
+			}
431
+			go utils.SendWechat(message)
432
+		}
433
+	}
434
+	if len(lateList) > 0 {
435
+		for i := 0; i < len(lateList); i++ {
436
+			userMap, err := s.dao.GetUserMappingById(lateList[i].CustomerId)
437
+			if err != nil {
438
+				utils.LogError("发送消息失败失败: " + err.Error())
439
+				return errors.New("发送消息失败失败")
440
+			}
441
+			message := utils.Message{
442
+				To: utils.ClientID{ID: userMap.Openid},
443
+				Data: map[string]interface{}{
444
+					"orgid": lateList[i].OrgId,
445
+					"tplid": "",
446
+					"data": map[string]string{
447
+						"first":    "逾期提醒",
448
+						"keyword1": lateList[i].BookName,
449
+						"keyword2": lateList[i].EndDate.Format("2006-01-02"),
450
+						// "remark":   fmt.Sprintf(remarkTpl, recored.ValidateEnd.Format("2006-01-02"), caseName),
451
+					},
452
+				},
453
+			}
454
+			go utils.SendWechat(message)
455
+		}
456
+	}
457
+	return nil
399 458
 }

+ 63
- 0
utils/core.go 파일 보기

@@ -0,0 +1,63 @@
1
+package utils
2
+
3
+import (
4
+	"time"
5
+)
6
+
7
+// API API 接口信息
8
+type API struct {
9
+	Method       string
10
+	URI          string
11
+	ResponseType string
12
+}
13
+
14
+// Kernel 默认核心类
15
+type Kernel struct {
16
+	schedules map[string]ScheduleTask
17
+}
18
+
19
+const (
20
+	// ResponseJSON 返回类型 json
21
+	ResponseJSON = "json"
22
+
23
+	// ResponseXML 返回类型 xml
24
+	ResponseXML = "xml"
25
+)
26
+
27
+// NewKernel 初始化
28
+func NewKernel() *Kernel {
29
+	return &Kernel{
30
+		schedules: make(map[string]ScheduleTask),
31
+	}
32
+}
33
+
34
+// SetScheduleTask 设置定时任务
35
+func (t *Kernel) SetScheduleTask(id string, schedule ScheduleTask) {
36
+	t.schedules[id] = schedule
37
+}
38
+
39
+// SetTask 设置任务
40
+func (t *Kernel) SetTask(id string, task Task) {
41
+	schedule, ok := t.schedules[id]
42
+	if !ok {
43
+		schedule = NewDefaultScheduleServer()
44
+		t.schedules[id] = schedule
45
+	}
46
+
47
+	taskServer, _ := schedule.(*DefaultScheduleServer)
48
+	taskServer.SetTask(task)
49
+}
50
+
51
+// StartTask 启动
52
+func (t *Kernel) StartTask(id string, delay ...time.Duration) {
53
+	if schedule, ok := t.schedules[id]; ok {
54
+		schedule.Start(delay...)
55
+	}
56
+}
57
+
58
+// StopTask 关闭任务
59
+func (t *Kernel) StopTask(id string) {
60
+	if schedule, ok := t.schedules[id]; ok {
61
+		schedule.Stop()
62
+	}
63
+}

+ 75
- 0
utils/scheduleTask.go 파일 보기

@@ -0,0 +1,75 @@
1
+package utils
2
+
3
+import (
4
+	"time"
5
+)
6
+
7
+// ScheduleTask 定时任务
8
+type ScheduleTask interface {
9
+	// Start 启动服务
10
+	Start(delay ...time.Duration)
11
+
12
+	// Stop 停止服务
13
+	Stop()
14
+}
15
+
16
+// Task 任务, 返回下次执行的时间间隔
17
+type Task func() time.Duration
18
+
19
+// DefaultScheduleServer 默认 access_token 获取服务
20
+type DefaultScheduleServer struct {
21
+	done chan bool
22
+	task Task
23
+}
24
+
25
+// NewDefaultScheduleServer 构造默认 Token Server
26
+func NewDefaultScheduleServer() *DefaultScheduleServer {
27
+	return &DefaultScheduleServer{
28
+		done: make(chan bool),
29
+	}
30
+}
31
+
32
+// SetTask 设置定时任务
33
+func (t *DefaultScheduleServer) SetTask(task Task) {
34
+	t.task = task
35
+}
36
+
37
+// Stop 停止服务
38
+func (t *DefaultScheduleServer) Stop() {
39
+	t.done <- true
40
+}
41
+
42
+// Start 启动服务
43
+func (t *DefaultScheduleServer) Start(delay ...time.Duration) {
44
+	go t.start(delay...)
45
+}
46
+
47
+/**
48
+* 定时任务
49
+* 不依赖文件系统 或者 DB, 依据每次调用反馈的结果,进行下一次任务定时设置
50
+ */
51
+
52
+func (t *DefaultScheduleServer) start(delay ...time.Duration) {
53
+	go func() {
54
+		if delay != nil && len(delay) > 0 {
55
+			time.Sleep(delay[0])
56
+		}
57
+
58
+		d := t.task() // 上次任务, 返回下一次的执行周期
59
+		for {
60
+			time.Sleep(d)
61
+			d = t.task()
62
+		}
63
+	}()
64
+
65
+	for {
66
+		select {
67
+		case done := <-t.done:
68
+			if done {
69
+				return
70
+			}
71
+		}
72
+	}
73
+}
74
+
75
+var _ ScheduleTask = &DefaultScheduleServer{}