- record order ok.

This commit is contained in:
gazebo
2018-07-10 19:06:51 +08:00
parent a76213e8f0
commit c6a3066daf
14 changed files with 143 additions and 83 deletions

View File

@@ -2,8 +2,10 @@ package elm
import (
"fmt"
"math"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/baseapi/platformapi/elmapi"
"git.rosy.net.cn/baseapi/utils"
@@ -15,10 +17,6 @@ type OrderController struct {
controller.OrderController
}
var (
api *elmapi.API
)
func (c *OrderController) OnOrderStatusMsg(msg *elmapi.CallbackOrderStatusMsg) (retVal *elmapi.CallbackResponse) {
controller.RoutinePool.CallFun(func() {
retVal = c.onOrderStatusMsg(msg)
@@ -94,37 +92,41 @@ func (c *OrderController) onOrderCancelRefundMsg(msg *elmapi.CallbackOrderCancel
return retVal
}
func (c *OrderController) getOrderInfo(msg *elmapi.CallbackOrderStatusMsg) (order *model.Order, orderSkus []*model.OrderSku, err error) {
result, err := api.GetOrder(msg.OrderID)
func (c *OrderController) getOrderInfo(msg *elmapi.CallbackOrderStatusMsg) (order *model.GoodsOrder, orderSkus []*model.OrderSku, err error) {
result, err := api.ElmAPI.GetOrder(msg.OrderID)
if err == nil {
phoneList := result["phoneList"].([]interface{})
consigneeMobile := ""
if len(phoneList) > 0 {
consigneeMobile = phoneList[0].(string)
}
order = &model.Order{
// globals.SugarLogger.Debug(result)
order = &model.GoodsOrder{
VendorOrderID: msg.OrderID,
VendorID: controller.VendorIDELM,
VendorStoreID: result["shopId"].(string),
StoreID: int(utils.Str2Int64(result["openId"].(string))),
VendorStoreID: utils.Int64ToStr(utils.MustInterface2Int64(result["shopId"])),
StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(result["openId"]), 0)),
StoreName: result["shopName"].(string),
ConsigneeName: result["consignee"].(string),
ConsigneeMobile: consigneeMobile,
VendorStatus: msg.State,
OrderCreatedAt: utils.Str2Time(result["createdAt"].(string)),
OriginalData: string(utils.MustMarshal(result)),
}
orderSkus = []*model.OrderSku{}
for _, group := range result["groups"].([]map[string]interface{}) {
for _, product := range group["items"].([]map[string]interface{}) {
for _, group2 := range result["groups"].([]interface{}) {
group := group2.(map[string]interface{})
for _, product2 := range group["items"].([]interface{}) {
product := product2.(map[string]interface{})
sku := &model.OrderSku{
VendorOrderID: msg.OrderID,
VendorID: controller.VendorIDJD,
Count: int(utils.MustInterface2Int64(product["quantity"])),
SkuID: int(utils.Str2Int64(product["extendCode"].(string))),
VendorSkuID: product["skuId"].(string),
SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product["extendCode"]), 0)),
VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(product["skuId"])),
SkuName: product["name"].(string),
SalePrice: utils.MustInterface2Int64(product["userPrice"]),
SalePrice: int64(math.Round(utils.MustInterface2Float64(product["userPrice"]) * 100)),
OrderCreatedAt: order.OrderCreatedAt,
}
orderSkus = append(orderSkus, sku)
@@ -202,10 +204,10 @@ func (c *OrderController) onOrderOtherCancelRefundStatus(msg *elmapi.CallbackOrd
}
// PurchasePlatformHandler
func (c *OrderController) AcceptOrRefuseOrder(order *model.Order, isAcceptIt bool) {
func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) {
if isAcceptIt {
api.ConfirmOrder(order.VendorOrderID)
api.ElmAPI.ConfirmOrder(order.VendorOrderID)
} else {
api.CancelOrder(order.VendorOrderID, elmapi.CancelOrderTypeOthers, "")
api.ElmAPI.CancelOrder(order.VendorOrderID, elmapi.CancelOrderTypeOthers, "")
}
}

View File

@@ -5,16 +5,14 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/controller"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
)
type OrderController struct {
controller.OrderController
}
var (
api *jdapi.API
)
func (c *OrderController) OnOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi.CallbackResponse) {
controller.RoutinePool.CallFun(func() {
retVal = c.onOrderMsg(msg)
@@ -57,29 +55,32 @@ func (c *OrderController) onOrderMsg(msg *jdapi.CallbackOrderMsg) (retVal *jdapi
return retVal
}
func (c *OrderController) getOrderInfo(msg *jdapi.CallbackOrderMsg) (order *model.Order, orderSkus []*model.OrderSku, err error) {
result, err := api.QuerySingleOrder(msg.BillID)
func (c *OrderController) getOrderInfo(msg *jdapi.CallbackOrderMsg) (order *model.GoodsOrder, orderSkus []*model.OrderSku, err error) {
result, err := api.JdAPI.QuerySingleOrder(msg.BillID)
// globals.SugarLogger.Info(result)
if err == nil {
order = &model.Order{
order = &model.GoodsOrder{
VendorOrderID: msg.BillID,
VendorID: controller.VendorIDJD,
VendorStoreID: result["produceStationNo"].(string),
StoreID: int(utils.MustInterface2Int64(result["produceStationNoIsv"])),
StoreID: int(utils.Str2Int64WithDefault(utils.Interface2String(result["produceStationNoIsv"]), 0)),
StoreName: result["produceStationName"].(string),
ConsigneeName: result["buyerFullName"].(string),
ConsigneeMobile: result["buyerMobile"].(string),
VendorStatus: msg.StatusID,
OrderCreatedAt: utils.Str2Time(result["orderPurchaseTime"].(string)),
OriginalData: string(utils.MustMarshal(result)),
}
// discounts := result["discount"].(map[string]interface{})
orderSkus = []*model.OrderSku{}
for _, product := range result["product"].([]map[string]interface{}) {
for _, product2 := range result["product"].([]interface{}) {
product := product2.(map[string]interface{})
sku := &model.OrderSku{
VendorOrderID: msg.BillID,
VendorID: controller.VendorIDJD,
Count: int(utils.MustInterface2Int64(product["skuCount"])),
SkuID: int(utils.Str2Int64(product["skuIdIsv"].(string))),
VendorSkuID: product["skuId"].(string),
SkuID: int(utils.Str2Int64WithDefault(utils.Interface2String(product["skuIdIsv"]), 0)),
VendorSkuID: utils.Int64ToStr(utils.MustInterface2Int64(product["skuId"])),
SkuName: product["skuName"].(string),
SalePrice: utils.MustInterface2Int64(product["skuJdPrice"]),
OrderCreatedAt: order.OrderCreatedAt,
@@ -98,6 +99,8 @@ func (c *OrderController) onOrderNew(msg *jdapi.CallbackOrderMsg) (response *jda
order, orderSkus, err := c.getOrderInfo(msg)
if err == nil {
err = c.OnOrderNew(c, order, orderSkus)
} else {
globals.SugarLogger.Debugf("get order error:%v", err)
}
return jdapi.Err2CallbackResponse(err, "jd onOrderNew")
}
@@ -139,6 +142,6 @@ func (c *OrderController) onOrderOtherStatus(msg *jdapi.CallbackOrderMsg) *jdapi
}
// PurchasePlatformHandler
func (c *OrderController) AcceptOrRefuseOrder(order *model.Order, isAcceptIt bool) {
api.OrderAcceptOperate(order.VendorOrderID, isAcceptIt)
func (c *OrderController) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool) {
api.JdAPI.OrderAcceptOperate(order.VendorOrderID, isAcceptIt)
}

View File

@@ -19,15 +19,29 @@ func (c *WaybillController) OnWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal
return retVal
}
func (c *WaybillController) OnWaybillExcept(msg *mtpsapi.CallbackOrderExceptionMsg) (retVal *mtpsapi.CallbackResponse) {
controller.RoutinePool.CallFun(func() {
status := &model.OrderStatus{
VendorOrderID: msg.MtPeisongID,
VendorID: controller.VendorIDMTPS,
OrderType: controller.OrderTypeWaybill,
VendorStatus: utils.Int2Str(msg.ExceptionCode),
StatusTime: utils.Timestamp2Time(int64(msg.Timestamp)),
}
retVal = mtpsapi.Err2CallbackResponse(c.OnWaybillFailed(status), "mtps OnWaybillExcept")
}, msg.MtPeisongID)
return retVal
}
func (c *WaybillController) callbackMsg2Status(msg *mtpsapi.CallbackOrderMsg) *model.OrderStatus {
orderStatus := &model.OrderStatus{
status := &model.OrderStatus{
VendorOrderID: msg.MtPeisongID,
VendorID: controller.VendorIDMTPS,
OrderType: controller.OrderTypeWaybill,
VendorStatus: utils.Int2Str(msg.Status),
StatusTime: utils.Timestamp2Time(int64(msg.Timestamp)),
}
return orderStatus
return status
}
func (c *WaybillController) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *mtpsapi.CallbackResponse) {

View File

@@ -32,7 +32,7 @@ const (
)
type PurchasePlatformHandler interface {
AcceptOrRefuseOrder(order *model.Order, isAcceptIt bool)
AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool)
}
var (
@@ -46,7 +46,7 @@ func init() {
type OrderController struct {
}
func (c *OrderController) OnOrderNew(purchasePlatform PurchasePlatformHandler, order *model.Order, orderSkus []*model.OrderSku) (err error) {
func (c *OrderController) OnOrderNew(purchasePlatform PurchasePlatformHandler, order *model.GoodsOrder, orderSkus []*model.OrderSku) (err error) {
db := orm.NewOrm()
c.handleAutoAcceptOrder(order.VendorOrderID, order.VendorID, order.ConsigneeMobile, order.StoreID, db, func(isAccept bool) {
// purchasePlatform.AcceptOrRefuseOrder(order, isAccept)
@@ -62,6 +62,7 @@ func (c *OrderController) OnOrderNew(purchasePlatform PurchasePlatformHandler, o
err = c.updateOrderSkuOtherInfo(orderSkus, db)
if err == nil {
db.Begin()
// globals.SugarLogger.Debugf("new order:%v", order)
created, _, err2 := db.ReadOrCreate(order, "VendorOrderID", "VendorID")
err = err2
if err == nil {
@@ -71,17 +72,18 @@ func (c *OrderController) OnOrderNew(purchasePlatform PurchasePlatformHandler, o
params := []interface{}{}
for _, sku := range orderSkus {
if sql == "" {
sql = "INSERT INTO order_sku(vendor_order_id, vendor_id, count, sku_id, vendor_sku_id, sku_name, shop_price, sale_price) VALUES(?, ?, ?, ?, ?, ?, ?, ?)"
sql = "INSERT INTO order_sku(vendor_order_id, vendor_id, count, sku_id, vendor_sku_id, sku_name, shop_price, sale_price, order_created_at) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)"
} else {
sql += ",(?, ?, ?, ?, ?, ?, ?, ?)"
sql += ",(?, ?, ?, ?, ?, ?, ?, ?, ?)"
}
params = append(params, sku.VendorOrderID, sku.VendorID, sku.Count, sku.SkuID, sku.VendorSkuID, sku.SkuName, sku.ShopPrice, sku.SalePrice)
params = append(params, sku.VendorOrderID, sku.VendorID, sku.Count, sku.SkuID, sku.VendorSkuID, sku.SkuName, sku.ShopPrice, sku.SalePrice, order.OrderCreatedAt)
}
sql += ";"
_, err = db.Raw(sql, params...).Exec()
if err != nil {
db.Rollback()
baseapi.SugarLogger.Infof("insert order_sku error:%v", err)
} else {
db.Commit()
}
@@ -91,26 +93,28 @@ func (c *OrderController) OnOrderNew(purchasePlatform PurchasePlatformHandler, o
}
} else {
db.Rollback()
globals.SugarLogger.Warnf("create order:%v, error:%v", order, err)
}
}
}
return err
}
func (c *OrderController) OnOrderAdjust(purchasePlatform PurchasePlatformHandler, order *model.Order, orderSkus []*model.OrderSku) (err error) {
func (c *OrderController) OnOrderAdjust(purchasePlatform PurchasePlatformHandler, order *model.GoodsOrder, orderSkus []*model.OrderSku) (err error) {
db := orm.NewOrm()
err = utils.CallFuncLogError(func() error {
_, err := db.Raw("DELETE FROM order_sku WHERE vendor_order_id=? AND vendor_id=?", order.VendorOrderID, order.VendorID).Exec()
_, err := db.Raw("DELETE FROM order_sku WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID).Exec()
return err
}, "OnAdjustOrder delete order_sku")
}, "OnAdjustOrder delete order")
if err != nil {
return err
}
err = utils.CallFuncLogError(func() error {
_, err := db.Raw("DELETE FROM order WHERE vendor_order_id=? AND vendor_id=?", order.VendorOrderID, order.VendorID).Exec()
_, err := db.Raw("DELETE FROM goods_order WHERE vendor_order_id = ? AND vendor_id = ?", order.VendorOrderID, order.VendorID).Exec()
return err
}, "OnAdjustOrder delete order")
}, "OnAdjustOrder delete order_sku")
if err != nil {
return err
}
@@ -175,7 +179,7 @@ func (c *OrderController) updateOrderSkuOtherInfo(orderSkus []*model.OrderSku, d
return nil
}
func (c *OrderController) updateOrderOtherInfo(order *model.Order, db orm.Ormer) (err error) {
func (c *OrderController) updateOrderOtherInfo(order *model.GoodsOrder, db orm.Ormer) (err error) {
return nil
}
@@ -214,14 +218,14 @@ func (c *OrderController) handleAutoAcceptOrder(orderID string, vendorID int, us
}
func (c *OrderController) addOrderStatus(msg *model.OrderStatus) (err error) {
order := &model.Order{
order := &model.GoodsOrder{
VendorOrderID: msg.VendorOrderID,
VendorID: msg.VendorID,
}
db := orm.NewOrm()
value, ok := OrderMap.Load(ComposeUniversalOrderID(msg.VendorOrderID, msg.VendorID))
if !ok {
globals.SugarLogger.Warnf("can not get order:%v, from cache", order)
// globals.SugarLogger.Infof("can not get order:%v, from cache", order)
err = db.Read(order, "VendorOrderID", "VendorID")
} else {
order.ID = value.(int64)

View File

@@ -21,6 +21,7 @@ const (
)
type WaybillController struct {
OrderController
}
var (
@@ -36,6 +37,8 @@ func (w *WaybillController) OnWaybillNew(bill *model.Waybill) (err error) {
if !created {
baseapi.SugarLogger.Warnf("duplicated waybill:%v msg received", bill)
}
} else {
globals.SugarLogger.Warnf("create bill:%v, error:%v", bill, err)
}
return err
}
@@ -83,7 +86,7 @@ func (w *WaybillController) addWaybillStatus(msg *model.OrderStatus) (err error)
db := orm.NewOrm()
value, ok := OrderMap.Load(ComposeUniversalOrderID(msg.VendorOrderID, msg.VendorID))
if !ok {
globals.SugarLogger.Warnf("can not get order:%v, from cache", order)
// globals.SugarLogger.Infof("can not get order:%v, from cache", order)
err = db.Read(order, "VendorWaybillID", "WaybillVendorID")
} else {
order.ID = value.(int64)

View File

@@ -7,7 +7,7 @@ type ModelTimeInfo struct {
UpdatedAt time.Time `orm:"auto_now;type(datetime)"`
}
type Order struct {
type GoodsOrder struct {
ID int64 `orm:"column(id)"`
VendorOrderID string `orm:"column(vendor_order_id);size(48)"`
VendorID int `orm:"column(vendor_id)"`
@@ -26,14 +26,14 @@ type Order struct {
VendorStatus string `orm:"size(16)"`
LockStatus int
CancelApplyReason string `orm:"size(255);null;default(null)"` // null表示没有申请不为null表示用户正在取消申请
WaybillVendorID int `orm:"column(waybill_vendor_id)"`
WaybillVendorID int `orm:"column(waybill_vendor_id);default(-1)"`
OriginalData string `orm:"type(text)"`
OrderCreatedAt time.Time `orm:"type(datetime);index"`
OrderFinishedAt time.Time `orm:"type(datetime)"`
OrderFinishedAt time.Time `orm:"type(datetime);null;default(null)"`
ModelTimeInfo
}
func (o *Order) TableUnique() [][]string {
func (o *GoodsOrder) TableUnique() [][]string {
return [][]string{
[]string{"VendorOrderID", "VendorID"},
}
@@ -44,7 +44,7 @@ type OrderSku struct {
VendorOrderID string `orm:"column(vendor_order_id);size(48)"`
VendorID int `orm:"column(vendor_id)"`
Count int
VendorSkuID string `orm:"column(vendor_sku_id),size(48)"`
VendorSkuID string `orm:"column(vendor_sku_id);size(48)"`
SkuID int `orm:"column(sku_id)"` // 外部系统里记录的 jxskuid
JxSkuID int `orm:"column(jx_sku_id)"` // 根据VendorSkuID在本地系统里查询出来的 jxskuid
SkuName string `orm:"size(255)"`
@@ -53,7 +53,9 @@ type OrderSku struct {
OrderCreatedAt time.Time `orm:"type(datetime);index"`
}
func (o *OrderSku) TableUnique() [][]string {
// 同样商品在一个定单中可能重复出现(比如搞活动时,相同商品价格不一样,第一个有优惠)
// 所以这里不能用唯一索引
func (o *OrderSku) TableIndex() [][]string {
return [][]string{
[]string{"VendorOrderID", "SkuID", "VendorID"},
}
@@ -72,7 +74,7 @@ type Waybill struct {
VendorStatus string `orm:"size(16)"`
ActualFee int64
WaybillCreatedAt time.Time `orm:"type(datetime);index"`
WaybillFinishedAt time.Time `orm:"type(datetime)"`
WaybillFinishedAt time.Time `orm:"type(datetime);null;default(null)"`
ModelTimeInfo
}