diff --git a/.gitignore b/.gitignore index 853248244..f26d0d277 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ jx-callback commentsRouter_* swagger/ debug +.DS_Store \ No newline at end of file diff --git a/business/jd/controller/controller.go b/business/jd/controller/controller.go new file mode 100644 index 000000000..d7ea65597 --- /dev/null +++ b/business/jd/controller/controller.go @@ -0,0 +1,17 @@ +package controller + +import ( + "git.rosy.net.cn/baseapi/platform/jdapi" + "go.uber.org/zap" +) + +var ( + gJdapi *jdapi.JDAPI + sugarLogger *zap.SugaredLogger +) + +func init() { + logger, _ := zap.NewDevelopment() + sugarLogger = logger.Sugar() + gJdapi = jdapi.NewJDAPI("91633f2a-c5f5-4982-a925-a220d19095c3", "1dba76d40cac446ca500c0391a0b6c9d", "a88d031a1e7b462cb1579f12e97fe7f4", logger) +} diff --git a/business/jd/controller/order.go b/business/jd/controller/order.go new file mode 100644 index 000000000..70c6f7278 --- /dev/null +++ b/business/jd/controller/order.go @@ -0,0 +1,71 @@ +package controller + +import ( + "encoding/json" + "strconv" + + "git.rosy.net.cn/jx-callback/business/jd/models" + "git.rosy.net.cn/jx-callback/compat/corm" + "github.com/astaxie/beego/orm" + _ "github.com/go-sql-driver/mysql" // import your used driver +) + +var errChecker corm.DBErrorChecker + +func init() { + errChecker = new(corm.MysqlErrorChecker) + + // set default database + orm.RegisterDataBase("default", "mysql", "root:WebServer@1@tcp(127.0.0.1:3306)/jx-callback?charset=utf8&loc=Local", 30) + + // register model + orm.RegisterModel(new(models.Jdorder)) + + // create table + orm.RunSyncdb("default", false, true) +} + +type OrderControler struct { +} + +func (c *OrderControler) NewOrder(order *models.NewOrderMsg) *models.OrderMsgResponse { + db := orm.NewOrm() + jdorderid, _ := strconv.ParseInt(order.BillId, 10, 64) + status, _ := strconv.Atoi(order.StatusId) + rec := &models.Jdorder{ + JdOrderId: jdorderid, + OrderStatus: status, + } + + if created, _, err := db.ReadOrCreate(rec, "Jdorderid"); err == nil { + if created { + c.AcceptOrder(order) + result, err := gJdapi.LegacyQuerySingleOrder(order.BillId) + if err != nil { + sugarLogger.Warnf("error when query jd order:%s, error:%v", order.BillId, err) + } else { + rec.Code = result.Code + rec.Msg = result.Msg + rec.Success = 1 + rec.CityName = "all" + rec.OrderStatus = result.OrderStatus + rec.OrderStatusTime = result.OrderStatusTime + result.Msg = "成功" + resultByteArr, _ := json.Marshal(result) + rec.Data = string(resultByteArr) + db.Update(rec, "Data", "Code", "Msg", "Success", "CityName", "OrderStatus", "OrderStatusTime") + } + + } else { + sugarLogger.Warnf("duplicated jd orderid:%s", order.BillId) + sugarLogger.Debug(rec) + } + } else { + sugarLogger.Errorf("error when calling ReadOrCreate:%v", err) + } + + return &models.OrderMsgResponse{"0", "success", ""} +} + +func (c *OrderControler) AcceptOrder(order *models.NewOrderMsg) { +} diff --git a/business/jd/models/order.go b/business/jd/models/order.go new file mode 100644 index 000000000..4315c318a --- /dev/null +++ b/business/jd/models/order.go @@ -0,0 +1,33 @@ +package models + +// type CommonCallbackMsgFields struct { +// Id int +// Status int `orm:default(0)` +// Count int `orm:default(1)` +// CreatedAt time.Time `orm:"auto_now_add;type(datetime)"` +// UpdatedAt time.Time `orm:"auto_now;type(datetime)"` +// } + +type OrderMsgResponse struct { + Code string + Msg string + Data string +} + +type NewOrderMsg struct { + BillId string + StatusId string + Timestamp string +} + +type Jdorder struct { + Id int + Code string `orm:"size(2)"` + Msg string `orm:"size(100)"` + Data string `orm:"type(text)"` + Success int8 + JdOrderId int64 `orm:"unique;column(jdorderid)"` + CityName string `orm:"size(20);column(cityname)"` + OrderStatus int `orm:"column(orderstatus)"` + OrderStatusTime string `orm:"size(50);column(orderstatustime)"` +} diff --git a/compat/corm/corm.go b/compat/corm/corm.go new file mode 100644 index 000000000..baab6e02c --- /dev/null +++ b/compat/corm/corm.go @@ -0,0 +1,5 @@ +package corm + +type DBErrorChecker interface { + ErrorIsDuplicate(error) bool +} diff --git a/compat/corm/corm_mysql.go b/compat/corm/corm_mysql.go new file mode 100644 index 000000000..3a9855b1b --- /dev/null +++ b/compat/corm/corm_mysql.go @@ -0,0 +1,17 @@ +package corm + +import ( + "github.com/go-sql-driver/mysql" +) + +type MysqlErrorChecker struct { +} + +func (c MysqlErrorChecker) ErrorIsDuplicate(err error) bool { + if err == nil { + return false + } + + realErr := err.(*mysql.MySQLError) + return realErr.Number == 1062 +} diff --git a/controllers/jd_order.go b/controllers/jd_order.go new file mode 100644 index 000000000..ca7696e21 --- /dev/null +++ b/controllers/jd_order.go @@ -0,0 +1,42 @@ +package controllers + +import ( + "encoding/json" + + "github.com/astaxie/beego/logs" + + "git.rosy.net.cn/jx-callback/business/jd/controller" + "git.rosy.net.cn/jx-callback/business/jd/models" + "github.com/astaxie/beego" +) + +const JD_PARAM_JSON = "jd_param_json" + +// Operations about JDOrder +type JDOrderController struct { + beego.Controller +} + +func (c *JDOrderController) URLMapping() { + c.Mapping("NewOrder", c.NewOrder) +} + +// @Title Create +// @Description create object +// @Param jd_param_json formData string true "应用级别输入参数" +// @Success 200 {string} models.Object.Id +// @Failure 403 body is empty +// @router /NewOrder [post] +func (c *JDOrderController) NewOrder() { + var ob models.NewOrderMsg + jd_param_json := c.GetString(JD_PARAM_JSON) + err := json.Unmarshal([]byte(jd_param_json), &ob) + if err != nil { + logs.Error(err) + c.Data["json"] = models.OrderMsgResponse{"10015", "jd_param_json format is wrong", jd_param_json} + } else { + cc := controller.OrderControler{} + c.Data["json"] = cc.NewOrder(&ob) + } + c.ServeJSON() +} diff --git a/routers/router.go b/routers/router.go index 392dafa3a..8dc9b4433 100644 --- a/routers/router.go +++ b/routers/router.go @@ -25,6 +25,11 @@ func init() { &controllers.UserController{}, ), ), + beego.NSNamespace("/djsw", + beego.NSInclude( + &controllers.JDOrderController{}, + ), + ), ) beego.AddNamespace(ns) }