update
							parent
							
								
									b17b595948
								
							
						
					
					
						commit
						8c697dc874
					
				|  | @ -13,8 +13,8 @@ import ( | |||
| 
 | ||||
| func ApiUpdateEmail(c *gin.Context) { | ||||
| 	data := struct { | ||||
| 		ID    string `json:"id"` | ||||
| 		Email string `json:"email"` | ||||
| 		ID    string `json:"id" binding:"required"` | ||||
| 		Email string `json:"email" binding:"required,email"` | ||||
| 	}{} | ||||
| 	if err := c.ShouldBindJSON(&data); err != nil { | ||||
| 		panic(err) | ||||
							
								
								
									
										29
									
								
								api_join.go
								
								
								
								
							
							
						
						
									
										29
									
								
								api_join.go
								
								
								
								
							|  | @ -30,22 +30,21 @@ func Follow(event *linebot.Event) { | |||
| 		log.Debug().Str("user", uid).Msg("user unblocked.") | ||||
| 	} | ||||
| 
 | ||||
| 	// Welcome and ask for
 | ||||
| 	// Welcome and ask for profile
 | ||||
| 	msg := linebot.NewTextMessage("歡迎使用台新人壽智慧聊天服務! 請您協助核對您的身分。") | ||||
| 
 | ||||
| 	template := linebot.NewCarouselTemplate( | ||||
| 		linebot.NewCarouselColumn( | ||||
| 			"https://imgs.gotrip.hk/wp-content/uploads/2017/08/brown-innocent_19545495235b69335e17060.jpg", | ||||
| 			"Profile A", "A 很帥 A 很棒", | ||||
| 			linebot.NewPostbackAction("選擇", "select=a", "我是A", ""), | ||||
| 		), | ||||
| 		linebot.NewCarouselColumn( | ||||
| 			"https://imgs.gotrip.hk/wp-content/uploads/2017/08/brown-innocent_19545495235b69335e17060.jpg", | ||||
| 			"Profile B", "B 很帥 B 很棒", | ||||
| 			linebot.NewPostbackAction("選擇", "select=b", "我是B", ""), | ||||
| 		), | ||||
| 	) | ||||
| 	profiles := linebot.NewTemplateMessage("請使用手機讀取", template) | ||||
| 	// get profiles
 | ||||
| 	var profs []Profile | ||||
| 	DB.Limit(10).Find(&profs) | ||||
| 	columns := make([]*linebot.CarouselColumn, len(profs)) | ||||
| 	for i, prof := range profs { | ||||
| 		columns[i] = linebot.NewCarouselColumn( | ||||
| 			prof.Img, prof.Name, prof.Brief, | ||||
| 			linebot.NewPostbackAction("我是"+prof.Name, "select="+prof.Name, "我是"+prof.Name, ""), | ||||
| 		) | ||||
| 	} | ||||
| 	template := linebot.NewCarouselTemplate(columns...) | ||||
| 	profiles := linebot.NewTemplateMessage("請核對您的身分", template) | ||||
| 
 | ||||
| 	if _, err := SendMessage(event.ReplyToken, uid, msg, profiles); err != nil { | ||||
| 		panic(err) | ||||
|  | @ -72,7 +71,7 @@ func ApiSelectProfile(event *linebot.Event) { | |||
| 	} | ||||
| 
 | ||||
| 	go func(uid string) { | ||||
| 		time.Sleep(time.Second * 10) | ||||
| 		time.Sleep(time.Second * 5) | ||||
| 		if _, err := SendMessage("", uid, DefaultMsg()); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  |  | |||
|  | @ -45,6 +45,8 @@ func postback(event *linebot.Event) { | |||
| 	switch { | ||||
| 	case strings.HasPrefix(data, "select="): | ||||
| 		ApiSelectProfile(event) | ||||
| 	case strings.HasPrefix(data, "claim="): | ||||
| 		ApiPrepareClaim(event) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -67,6 +69,7 @@ func controller(event *linebot.Event) { | |||
| 	case msg.Text == "我的保單": | ||||
| 		ApiMyOrders(event) | ||||
| 	case strings.HasPrefix(msg.Text, "我是"): | ||||
| 	case strings.HasPrefix(msg.Text, "我要理賠"): | ||||
| 
 | ||||
| 	case strings.HasPrefix(msg.Text, "幫我介紹"): | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,43 @@ | |||
| package main | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/line/line-bot-sdk-go/v7/linebot" | ||||
| ) | ||||
| 
 | ||||
| func ApiPrepareClaim(event *linebot.Event) { | ||||
| 	data := event.Postback.Data | ||||
| 	data = strings.TrimPrefix(data, "claim=") | ||||
| 	prod := &Product{} | ||||
| 	if err := DB.First(prod, "name = ?", data).Error; err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	order := &Order{} | ||||
| 	if err := DB.First(order, "product_id = ? and user_id = ?", prod.ID, event.Source.UserID); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 	DB.Model(order).Update("status", OrderClaiming) | ||||
| 
 | ||||
| 	for _, cat := range prod.Categories { | ||||
| 		if cat.Name == "旅平" { | ||||
| 			url := "https://bot.ework.tw/claim" | ||||
| 			button := linebot.NewButtonsTemplate("", "", "請上傳收據", | ||||
| 				linebot.NewURIAction("開啟上傳頁面", url)) | ||||
| 			msg := linebot.NewTemplateMessage(fmt.Sprintf("請前往 %v 上傳收據", url), button) | ||||
| 			if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	msg := linebot.NewTextMessage("我們收到您的申請囉! 稍後將由專人致電為您服務!") | ||||
| 	sticker := linebot.NewStickerMessage("6632", "11825397") | ||||
| 
 | ||||
| 	if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg, sticker); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  | @ -6,7 +6,7 @@ func ApiListProduct(event *linebot.Event) { | |||
| 	leftBtn := linebot.NewMessageAction("修改資料", "修改資料") | ||||
| 	rightBtn := linebot.NewMessageAction("我的保單", "我的保單") | ||||
| 	template := linebot.NewConfirmTemplate("請問想辦理甚麼服務?", leftBtn, rightBtn) | ||||
| 	msg := linebot.NewTemplateMessage("電腦版不支援此訊息, 請至手機上讀取", template) | ||||
| 	msg := linebot.NewTemplateMessage("請問想辦理甚麼服務?", template) | ||||
| 	if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  |  | |||
|  | @ -3,10 +3,10 @@ package main | |||
| import "github.com/line/line-bot-sdk-go/v7/linebot" | ||||
| 
 | ||||
| func ApiMe(event *linebot.Event) { | ||||
| 	leftBtn := linebot.NewMessageAction("修改資料", "修改資料") | ||||
| 	leftBtn := linebot.NewURIAction("修改資料", "https://bot.ework.tw/profile") | ||||
| 	rightBtn := linebot.NewMessageAction("我的保單", "我的保單") | ||||
| 	template := linebot.NewConfirmTemplate("請問想辦理甚麼服務?", leftBtn, rightBtn) | ||||
| 	msg := linebot.NewTemplateMessage("電腦版不支援此訊息, 請至手機上讀取", template) | ||||
| 	msg := linebot.NewTemplateMessage("請問想辦理甚麼服務?", template) | ||||
| 	if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | @ -14,11 +14,33 @@ func ApiMe(event *linebot.Event) { | |||
| 
 | ||||
| func ApiMyOrders(event *linebot.Event) { | ||||
| 	var orders []Order | ||||
| 	DB.Find(&orders, "user_id = ?", event.Source.UserID) | ||||
| 	DB.Order("product_id").Find(&orders, "user_id = ?", event.Source.UserID) | ||||
| 
 | ||||
| 	if len(orders) == 0 { | ||||
| 		msg := linebot.NewTextMessage("您目前沒有保單, 歡迎前往「我要投保」專區選取保單。") | ||||
| 
 | ||||
| 		msg := linebot.NewTextMessage("您目前沒有保單, 歡迎前往「我想投保」專區選取保單。") | ||||
| 		if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	} else { | ||||
| 		pids := make([]uint, len(orders)) | ||||
| 		for i := range orders { | ||||
| 			pids[i] = orders[i].ProductID | ||||
| 		} | ||||
| 		var products []Product | ||||
| 		if err := DB.Preload("Categories").Order("id").Find(&products, "id in ?", pids).Error; err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		columns := make([]*linebot.CarouselColumn, len(products)) | ||||
| 		for i, prod := range products { | ||||
| 			columns[i] = linebot.NewCarouselColumn( | ||||
| 				prod.Img, prod.Name, prod.Brief, | ||||
| 				linebot.NewURIAction("保單詳細", "https://bot.ework.tw/product"), | ||||
| 				linebot.NewPostbackAction("我要理賠", "claim="+prod.Name, "我要理賠", ""), | ||||
| 				// linebot.NewPostbackAction("我是"+prof.Name, "select="+prof.Name, "我是"+prof.Name, ""),
 | ||||
| 			) | ||||
| 		} | ||||
| 		template := linebot.NewCarouselTemplate(columns...) | ||||
| 		msg := linebot.NewTemplateMessage("您的保單資訊", template) | ||||
| 		if _, err := SendMessage(event.ReplyToken, event.Source.UserID, msg); err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
|  |  | |||
|  | @ -0,0 +1,11 @@ | |||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>核身</title> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>HI</h1> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,11 @@ | |||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>上傳收據</title> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>上傳收據</h1> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,11 @@ | |||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>保單詳細</title> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>保單細項</h1> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,11 @@ | |||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
|     <title>修改基本資料</title> | ||||
| </head> | ||||
| <body> | ||||
|     <h1>基本資料</h1> | ||||
| </body> | ||||
| </html> | ||||
|  | @ -0,0 +1,15 @@ | |||
| package main | ||||
| 
 | ||||
| import _ "embed" | ||||
| 
 | ||||
| //go:embed assets/check.html
 | ||||
| var check_web []byte | ||||
| 
 | ||||
| //go:embed assets/profile.html
 | ||||
| var profile_web []byte | ||||
| 
 | ||||
| //go:embed assets/claim.html
 | ||||
| var claim_web []byte | ||||
| 
 | ||||
| //go:embed assets/product.html
 | ||||
| var product_web []byte | ||||
							
								
								
									
										13
									
								
								main.go
								
								
								
								
							
							
						
						
									
										13
									
								
								main.go
								
								
								
								
							|  | @ -70,6 +70,19 @@ func main() { | |||
| 	// setup route
 | ||||
| 	server.GET("/", func(c *gin.Context) { OK(c, "ok") }) | ||||
| 
 | ||||
| 	server.GET("/check", func(c *gin.Context) { | ||||
| 		c.Writer.Write(check_web) | ||||
| 	}) | ||||
| 	server.GET("/profile", func(c *gin.Context) { | ||||
| 		c.Writer.Write(profile_web) | ||||
| 	}) | ||||
| 	server.GET("/claim", func(c *gin.Context) { | ||||
| 		c.Writer.Write(claim_web) | ||||
| 	}) | ||||
| 	server.GET("/product", func(c *gin.Context) { | ||||
| 		c.Writer.Write(product_web) | ||||
| 	}) | ||||
| 
 | ||||
| 	// setup api
 | ||||
| 	api := server.Group("api") | ||||
| 	api.POST("/email", ApiUpdateEmail) | ||||
|  |  | |||
							
								
								
									
										16
									
								
								model.go
								
								
								
								
							
							
						
						
									
										16
									
								
								model.go
								
								
								
								
							|  | @ -29,6 +29,7 @@ type Profile struct { | |||
| 
 | ||||
| 	Name  string | ||||
| 	Brief string | ||||
| 	Img   string | ||||
| 
 | ||||
| 	CreatedAt time.Time | ||||
| 	UpdatedAt time.Time | ||||
|  | @ -38,6 +39,7 @@ type Product struct { | |||
| 	ID uint `gorm:"primaryKey"` | ||||
| 
 | ||||
| 	Categories  []Category `gorm:"many2many:product_categories;"` | ||||
| 	Img         string | ||||
| 	Name        string | ||||
| 	Brief       string | ||||
| 	Description string | ||||
|  | @ -50,6 +52,15 @@ type Category struct { | |||
| 	Name string `gorm:"primaryKey"` | ||||
| } | ||||
| 
 | ||||
| const ( | ||||
| 	OrderReceived    = "RECEIVED" | ||||
| 	OrderPrepared    = "PREPARED" | ||||
| 	OrderClaiming    = "CLAIMING" | ||||
| 	OrderClaimAccept = "CLAIM_ACCEPT" | ||||
| 	OrderClaimReject = "CLAIM_REJECT" | ||||
| 	OrderClaimPaid   = "CLAIM_PAID" | ||||
| ) | ||||
| 
 | ||||
| type Order struct { | ||||
| 	ID string | ||||
| 
 | ||||
|  | @ -59,8 +70,8 @@ type Order struct { | |||
| 	Start      time.Time | ||||
| 	End        time.Time | ||||
| 	Attachment string | ||||
| 
 | ||||
| 	Price float32 | ||||
| 	Price      float32 | ||||
| 	Status     string | ||||
| 
 | ||||
| 	CreatedAt time.Time | ||||
| 	UpdatedAt time.Time | ||||
|  | @ -100,5 +111,6 @@ func (o *Order) BeforeCreate(tx *gorm.DB) (err error) { | |||
| 	if o.ID == "" { | ||||
| 		o.ID = xid.New().String() | ||||
| 	} | ||||
| 	o.Status = OrderReceived | ||||
| 	return | ||||
| } | ||||
|  |  | |||
|  | @ -70,15 +70,7 @@ func middleware(c *gin.Context) { | |||
| 
 | ||||
| func skip(c *gin.Context) bool { | ||||
| 	switch filepath.Ext(c.Request.URL.Path) { | ||||
| 	case ".css": | ||||
| 		fallthrough | ||||
| 	case ".woff2": | ||||
| 		fallthrough | ||||
| 	case ".map": | ||||
| 		fallthrough | ||||
| 	case ".ico": | ||||
| 		fallthrough | ||||
| 	case ".js": | ||||
| 	case ".css", ".woff2", ".map", ".ico", ".js": | ||||
| 		return true | ||||
| 	default: | ||||
| 		return false | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue