You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

89 lines
2.5 KiB

package main
import (
"database/sql"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
"log"
"net/http"
)
var DB *sql.DB
func init() {
db, err := sql.Open("mysql", "root:mashibing@tcp(192.168.177.131:3306)/tcc?charset=utf8mb4&parseTime=True&loc=Local")
if err != nil {
log.Fatalln(err)
}
DB = db
}
type Req struct {
Quantity int `json:"quantity"`
Id int `json:"id"`
TxId string `json:"tx_id"`
}
func main() {
r := gin.Default()
r.POST("/order-create-try", func(c *gin.Context) {
req := &Req{}
if err := c.BindJSON(req); err != nil {
log.Fatalln(err)
}
// 完成业务逻辑校验
// 本例中不需要校验,在库存服务检测库存即可
// 我们选择,先生成订单记录,订单状态为等待确认。若分布式事务校验通过,则更新订单状态为已确认,同时创建订单和商品关联记录,否则更新订单状态为未确认。
query := "insert into orders values (null, ?, 'confirming', 1024)"
if _, err := DB.Exec(query, req.TxId); err != nil {
c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"})
return
}
c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"})
})
r.POST("/order-create-confirm", func(c *gin.Context) {
// 确认,生成订单信息,插入 orders 和 order_products 表记录,本例中,仅使用 order_products 表
req := &Req{}
if err := c.BindJSON(req); err != nil {
log.Fatalln(err)
}
orderId := 0
query := "select id from orders where tx_id=?"
if err := DB.QueryRow(query, req.TxId).Scan(&orderId); err != nil {
log.Fatalln(err)
}
query = "update orders set status='confirmed' where id=?"
if _, err := DB.Exec(query, orderId); err != nil {
c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"})
return
}
query = "insert into order_products values (?, ?, ?, 99)"
if _, err := DB.Exec(query, orderId, req.Id, req.Quantity); err != nil {
c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"})
return
}
c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"})
})
r.POST("/order-create-cancel", func(c *gin.Context) {
// 取消,更新订单状态未确认 not confirmed
req := &Req{}
if err := c.BindJSON(req); err != nil {
log.Fatalln(err)
}
query := "update orders set status='not confirmed' where tx_id=?"
if _, err := DB.Exec(query, req.TxId); err != nil {
c.JSON(http.StatusOK, gin.H{"dtm_result": "FAILURE"})
return
}
c.JSON(http.StatusOK, gin.H{"dtm_result": "SUCCESS"})
})
r.Run(":8081")
}