- remove useless legacy codes.

- refactor models
This commit is contained in:
gazebo
2018-10-16 10:47:44 +08:00
parent df19812e97
commit d7de24715b
39 changed files with 93 additions and 1248 deletions

View File

@@ -5,8 +5,8 @@ import (
"fmt"
"git.rosy.net.cn/jx-callback/business/jxcallback/auth"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
)
const (
@@ -21,7 +21,7 @@ func init() {
}
func (a *Auther) Login(uname, password string) (err error) {
user := &model.JxBackendUser{
user := &legacymodel.JxBackendUser{
UName: uname,
}
if err = dao.GetEntity(nil, user, "UName"); err == nil {

View File

@@ -9,8 +9,8 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/auth"
"git.rosy.net.cn/jx-callback/business/jxcallback/auth/mobile"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego/orm"
@@ -67,7 +67,7 @@ func GetUserInfo(code string, state string) (token *UserInfoExt, err error) {
func (a *Auther) Login(openid, password string) (err error) {
if value := globals.Cacher.Get(openid); value != nil {
if password == value.(string) {
// wxUser := &model.WeiXins{
// wxUser := &legacymodel.WeiXins{
// OpenID: openid,
// }
// if err = dao.GetEntity(nil, wxUser, "OpenID"); err == nil {
@@ -89,7 +89,7 @@ func BindMobile(token, mobileNum, code, nickname string) (err error) {
loginInfo := new(auth.LoginInfo)
if err = globals.Cacher.GetAs(token, loginInfo); err == nil {
if mobile.VerifyCode(mobileNum, code) {
user := &model.WeiXins{
user := &legacymodel.WeiXins{
OpenID: loginInfo.ID,
Tel: mobileNum,
NickName: nickname,

View File

@@ -110,9 +110,6 @@ func (c *OrderManager) OnOrderStatusChanged(orderStatus *model.OrderStatus) (err
isDuplicated, err := c.addOrderStatus(orderStatus, nil)
if err == nil && !isDuplicated {
err = scheduler.CurrentScheduler.OnOrderStatusChanged(orderStatus, false)
if globals.GenerateLegacyJxOrder {
c.legacyJxOrderStatusChanged(orderStatus, nil)
}
}
return err
}
@@ -159,9 +156,6 @@ func (c *OrderManager) saveOrder(order *model.GoodsOrder, isAdjust bool, db orm.
baseapi.SugarLogger.Infof("saveOrder insert order:%v, order_sku error:%v", order, err)
} else {
db.Commit()
if globals.GenerateLegacyJxOrder {
c.legacyWriteJxOrder(order, db, isAdjust)
}
}
} else {
isDuplicated = true

View File

@@ -1,315 +0,0 @@
package orderman
import (
"strings"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
)
// legacy
const (
JX_ORDER_STATUS_WAIT_TO_ACCEPT = -1 //未接单(41000)
JX_ORDER_STATUS_PICKING = 0 //拣货(32000->或定时召唤达达)
JX_ORDER_STATUS_WAIT_FOR_DELIVERY = 1 //待配送(2->或转商家自送)
JX_ORDER_STATUS_DELIVERING = 2 //配送中(33040)
JX_ORDER_STATUS_DELIVERY_DONE = 3 //已完成(33060->90000)
JX_ORDER_STATUS_EXCEPTION_APPLY = 4 //异常申请
JX_ORDER_STATUS_NOT_DELIVER = 5 //不配送
JX_ORDER_STATUS_AFTER_SALE = 6 //售后单
JX_ORDER_STATUS_CANCEL = 7 //已取消
JX_ORDER_STATUS_ADJUST = 8 //调整单
JX_DELIVERY_STATUS_NOT_DELIVERY = -1 //尚未申请配送
JX_DELIVERY_STATUS_WAIT_TO_GRAB = 0 //等待抢单
JX_DELIVERY_STATUS_GRAB_DONE = 1 //已抢单
JX_DELIVERY_STATUS_FAIL_TO_GET_GOODS = 2 //取货失败
JX_DELIVERY_STATUS_FAIL_TO_GET_GOODS_WAIT_TO_CONFIRM = 3 //取货失败待审核
JX_DELIVERY_STATUS_GET_GOODS_DONE = 4 //取货完成
JX_DELIVERY_STATUS_DELIVERY_FAIL = 5 //投递失败
JX_DELIVERY_STATUS_DELIVERY_DONE = 6 //已完成
JX_DELIVERY_STATUS_DELIVERY_CANCEL = 7 //已取消
JX_STATUS_UNKNOWN = -100
)
const (
DD_CARRIER_NO = "9966"
SELLER_CARRIER_NO = "2938"
MTPS_CARRIER_NO = "1123"
DDDELIVERY_CARRIER_NO = "3465"
EME_SELF_CARRIER_NO = "9999"
)
var (
VENDOR_ID2CARRIER_NO = map[int]string{
model.VendorIDJD: DD_CARRIER_NO,
model.VendorIDELM: EME_SELF_CARRIER_NO,
model.VendorIDDada: DDDELIVERY_CARRIER_NO,
model.VendorIDMTPS: MTPS_CARRIER_NO,
}
CARRIERS_NAMES = map[string]string{
DD_CARRIER_NO: "达达专送",
SELLER_CARRIER_NO: "门店自送",
MTPS_CARRIER_NO: "美团配送",
DDDELIVERY_CARRIER_NO: "达达众包",
EME_SELF_CARRIER_NO: "饿了么蜂鸟",
}
BUSINESS_TAGS_MAP = map[string]string{
"one_dingshida": "0",
"dj_aging_nextday": "1",
"dj_aging_immediately": "2",
"lengcang": "3",
"lengdong": "3",
}
)
func legacyMapCoordinateType(coordType int) (jxorderCoordType int) {
if coordType == model.CoordinateTypeMars {
return 2
}
return 0
}
func legacyMapOrderStatus(orderStatus int) (retVal int8) {
switch orderStatus {
case model.OrderStatusNew:
retVal = JX_ORDER_STATUS_WAIT_TO_ACCEPT
case model.OrderStatusAccepted:
retVal = JX_ORDER_STATUS_PICKING
case model.OrderStatusDelivering:
retVal = JX_ORDER_STATUS_DELIVERING
case model.OrderStatusDelivered, model.OrderStatusFinished:
retVal = JX_ORDER_STATUS_DELIVERY_DONE
case model.OrderStatusAdjust:
retVal = JX_ORDER_STATUS_ADJUST
case model.OrderStatusApplyCancel:
retVal = JX_ORDER_STATUS_EXCEPTION_APPLY
case model.OrderStatusCanceled:
retVal = JX_ORDER_STATUS_CANCEL
case model.OrderStatusFinishedPickup:
retVal = JX_ORDER_STATUS_WAIT_FOR_DELIVERY
default:
retVal = JX_STATUS_UNKNOWN
}
return retVal
}
func legacyMapWaybillStatus(status int) (retVal int8) {
switch status {
case model.WaybillStatusNew:
retVal = JX_DELIVERY_STATUS_WAIT_TO_GRAB
case model.WaybillStatusAccepted:
retVal = JX_DELIVERY_STATUS_GRAB_DONE
case model.WaybillStatusCourierArrived:
retVal = JX_DELIVERY_STATUS_GET_GOODS_DONE
case model.WaybillStatusDelivering:
retVal = JX_DELIVERY_STATUS_GET_GOODS_DONE
case model.WaybillStatusDelivered:
retVal = JX_DELIVERY_STATUS_DELIVERY_DONE
case model.WaybillStatusCanceled:
retVal = JX_DELIVERY_STATUS_DELIVERY_CANCEL
case model.WaybillStatusFailed:
retVal = JX_DELIVERY_STATUS_DELIVERY_FAIL
default:
retVal = JX_STATUS_UNKNOWN
}
return retVal
}
func (c *OrderManager) legacyWriteJxOrder(order *model.GoodsOrder, db orm.Ormer, isDelFirst bool) (err error) {
var result map[string]interface{}
businessTags := ""
if order.VendorID == model.VendorIDJD && utils.UnmarshalUseNumber([]byte(order.OriginalData), &result) == nil {
tagList := strings.Split(result["businessTag"].(string), ";")
list := []string{}
for _, v := range tagList {
if tag, ok := BUSINESS_TAGS_MAP[v]; ok {
list = append(list, tag)
}
}
businessTags = strings.Join(list, "|") + "|"
}
db.Begin()
if isDelFirst {
db.Raw("DELETE FROM "+globals.JxorderTableName+" WHERE order_id = ?", utils.Str2Int64(order.VendorOrderID)).Exec()
db.Raw("DELETE FROM "+globals.JxorderskuTableName+" WHERE order_id = ?", utils.Str2Int64(order.VendorOrderID)).Exec()
}
orderStatus := legacyMapOrderStatus(order.Status)
if orderStatus < JX_ORDER_STATUS_PICKING {
orderStatus = JX_ORDER_STATUS_PICKING
}
jxorder := &legacymodel.Jxorder2{
VenderId: int8(order.VendorID),
OrderId: utils.Str2Int64(order.VendorOrderID),
JxStoreId: utils.Int2Str(jxutils.GetJxStoreIDFromOrder(order)),
JxStoreName: order.StoreName,
OrderNum: order.OrderSeq,
OrderStatus: orderStatus,
OrderStatusTime: utils.Time2Str(order.StatusTime),
BusinessTag: businessTags,
SkuCount: order.SkuCount,
OrderBuyerRemark: order.BuyerComment,
BuyerFullName: order.ConsigneeName,
BuyerFullAddress: order.ConsigneeAddress,
BuyerMobile: order.ConsigneeMobile,
BuyerCoordType: legacyMapCoordinateType(order.CoordinateType),
BuyerLng: jxutils.IntCoordinate2Standard(order.ConsigneeLng),
BuyerLat: jxutils.IntCoordinate2Standard(order.ConsigneeLat),
CityName: "all",
OrderStartTime: utils.Time2Str(order.StatusTime),
JdStoreId: order.VendorStoreID,
OrderTotalMoney: int(order.SalePrice),
OrderDiscountMoney: int(order.SalePrice - order.ActualPayPrice),
OrderBuyerPayableMoney: int(order.ActualPayPrice),
// DeliveryPackageWeight: float64(jxutils.IntWeight2Float(order.Weight)),
}
if order.VendorID == model.VendorIDELM {
jxorder.OrderStatus = JX_ORDER_STATUS_WAIT_FOR_DELIVERY
}
if order.ExpectedDeliveredTime.Sub(utils.DefaultTimeValue) > 0 {
jxorder.OrderPreEndDelivTime = utils.Time2Str(order.ExpectedDeliveredTime)
}
_, err = db.Insert(jxorder)
if err != nil {
db.Rollback()
globals.SugarLogger.Infof("insert jxorder:%v error:%v", jxorder, err)
return err
}
sql := "INSERT INTO " + globals.JxorderskuTableName + "(vender_id, order_id, jx_sku_id, sku_name, jx_store_id, sku_price, sku_count, is_gift, promotion_type, sku_plat_discount, sku_vender_discount, sku_img) VALUES"
params := []interface{}{}
for _, sku := range order.Skus {
sql += "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?),"
params = append(params, sku.VendorID, sku.VendorOrderID, sku.JxSkuID, sku.SkuName, jxutils.GetJxStoreIDFromOrder(order), sku.SalePrice, sku.Count, sku.SkuType, sku.PromotionType, 0, 0, "")
}
sql = sql[:len(sql)-1] + ";"
if _, err = db.Raw(sql, params...).Exec(); err != nil {
db.Rollback()
baseapi.SugarLogger.Infof("insert jxordersku jxorder:%v error:%v", jxorder, err)
} else {
db.Commit()
vendorOrderID := utils.Str2Int64(order.VendorOrderID)
utils.CallFuncLogError(func() error {
_, err = db.Raw(`
UPDATE `+globals.JxorderTableName+` t1
JOIN jxstore t2 ON t2.storeid = t1.jx_store_id
SET t1.store_lng = t2.lng,
t1.store_lat = t2.lat
WHERE t1.order_id = ?;
`, vendorOrderID /*, vendorOrderID*/).Exec()
return err
}, "update jxorder")
utils.CallFuncLogError(func() error {
_, err = db.Raw(`
UPDATE `+globals.JxorderskuTableName+` t1
JOIN jx_sku t2 ON t2.id = t1.jx_sku_id
JOIN jx_sku_name t3 ON t3.id = t2.nameid
SET t1.sku_img = t3.img
WHERE t1.order_id = ?;
`, vendorOrderID /*, vendorOrderID*/).Exec()
return err
}, "update jxordersku")
}
return err
}
func (c *OrderManager) legacyJxOrderStatusChanged(status *model.OrderStatus, db orm.Ormer) (err error) {
orderStatus := legacyMapOrderStatus(status.Status)
if orderStatus != JX_STATUS_UNKNOWN {
if status.VendorID == model.VendorIDELM {
if orderStatus < JX_ORDER_STATUS_WAIT_FOR_DELIVERY {
orderStatus = JX_ORDER_STATUS_WAIT_FOR_DELIVERY
}
}
if db == nil {
db = orm.NewOrm()
}
jxorder := &legacymodel.Jxorder2{
OrderId: utils.Str2Int64(status.VendorOrderID),
}
if err = db.Read(jxorder, "OrderId"); err == nil {
utils.CallFuncLogError(func() error {
jxorder.OrderStatus = orderStatus
jxorder.OrderStatusTime = utils.Time2Str(status.StatusTime)
updateFields := []string{
"OrderStatus",
"OrderStatusTime",
}
if status.Status >= model.OrderStatusEndBegin {
jxorder.DeliveryFinishTime = utils.Time2Str(status.StatusTime)
updateFields = append(updateFields, "DeliveryFinishTime")
}
_, err = db.Update(jxorder, updateFields...)
if orderStatus == JX_ORDER_STATUS_DELIVERY_DONE || orderStatus == JX_ORDER_STATUS_DELIVERING {
db.Raw(`
UPDATE `+globals.JxorderTableName+` t1
JOIN waybill t2 ON t2.vendor_order_id = t1.order_id AND t2.status = 105
SET t1.delivery_price = IF(t2.waybill_vendor_id = 102, t2.desired_fee/100, t1.delivery_price),
t1.delivery_price1 = IF(t2.waybill_vendor_id = 101, t2.desired_fee/100, t1.delivery_price1)
WHERE t1.order_id = ?
`, jxorder.OrderId).Exec()
}
return err
}, "legacyJxOrderStatusChanged")
} else {
globals.SugarLogger.Infof("read legacyJxOrder orderID:%d error:%v, ", jxorder.OrderId, err)
}
}
return err
}
func (c *OrderManager) legacyWaybillStatusChanged(bill *model.Waybill, db orm.Ormer) (err error) {
deliveryStatus := legacyMapWaybillStatus(bill.Status)
if deliveryStatus != JX_STATUS_UNKNOWN {
if db == nil {
db = orm.NewOrm()
}
jxorder := &legacymodel.Jxorder2{
OrderId: utils.Str2Int64(bill.VendorOrderID),
}
if err = db.Read(jxorder, "OrderId"); err == nil {
utils.CallFuncLogError(func() error {
updateFields := []string{
"DeliveryCarrierNo",
"DeliveryCarrierName",
"DeliveryManNo",
"DeliveryManName",
"DeliveryManPhone",
"DeliveryBillNo",
"DeliveryStatus",
}
// jxorder.DeliveryPackageWeight
jxorder.DeliveryCarrierNo = VENDOR_ID2CARRIER_NO[bill.WaybillVendorID]
jxorder.DeliveryCarrierName = CARRIERS_NAMES[jxorder.DeliveryCarrierNo]
jxorder.DeliveryManNo = bill.CourierMobile
jxorder.DeliveryManName = bill.CourierName
jxorder.DeliveryManPhone = bill.CourierMobile
jxorder.DeliveryBillNo = bill.VendorWaybillID
jxorder.DeliveryStatus = deliveryStatus
// jxorder.DeliveryConfirmTime
if bill.Status == model.WaybillStatusNew {
updateFields = append(updateFields, "DeliveryStartTime")
jxorder.DeliveryStartTime = utils.Time2Str(bill.StatusTime)
} else if bill.Status >= model.WaybillStatusEndBegin {
jxorder.DeliveryFinishTime = utils.Time2Str(bill.StatusTime)
updateFields = append(updateFields, "DeliveryFinishTime")
}
_, err = db.Update(jxorder, updateFields...)
return err
}, "legacyJxOrderStatusChanged")
} else {
globals.SugarLogger.Infof("read legacyJxOrder, orderID:%d error:%v", jxorder.OrderId, err)
}
}
return err
}

View File

@@ -83,9 +83,6 @@ func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
}
if err == nil && !isDuplicated {
scheduler.CurrentScheduler.OnWaybillStatusChanged(bill, false)
if globals.GenerateLegacyJxOrder {
w.legacyWaybillStatusChanged(bill, db)
}
}
return err
}

View File

@@ -3,8 +3,8 @@ package basesch
import (
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"

View File

@@ -11,8 +11,8 @@ import (
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler/basesch"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"

View File

@@ -9,6 +9,7 @@ import (
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
)
@@ -349,7 +350,7 @@ func TmpGetJxBadCommentsByStoreId(storeID, page, size, commentType int) (retVal
sql += " AND status = 0"
}
sql += " ORDER BY createtime DESC LIMIT ? OFFSET ?"
var commentList []*model.JxBadComments
var commentList []*legacymodel.JxBadComments
dao.Begin(db)
defer func() {
dao.Rollback(db)

View File

@@ -4,17 +4,17 @@ import (
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
)
type StoreUserInfo struct {
model.WeiXins
ParentMobile string `json:"parentMobile"`
Members []*model.WeiXins `orm:"-" json:"members"`
MembersStr string `json:"-"`
legacymodel.WeiXins
ParentMobile string `json:"parentMobile"`
Members []*legacymodel.WeiXins `orm:"-" json:"members"`
MembersStr string `json:"-"`
}
func GetStoreUsers(storeID int) (storeUserInfos []*StoreUserInfo, err error) {
@@ -77,7 +77,7 @@ func GetSelfInfo(openID string) (storeUserInfo *StoreUserInfo, err error) {
}
func UnbindMobile(mobile string) (num int64, err error) {
return dao.UpdateEntityByKV(nil, &model.WeiXins{}, map[string]interface{}{
return dao.UpdateEntityByKV(nil, &legacymodel.WeiXins{}, map[string]interface{}{
"JxStoreID": nil,
"ParentID": -1,
}, map[string]interface{}{
@@ -104,7 +104,7 @@ func BindMobile2Store(mobile string, storeID int) (num int64, err error) {
func AddMobile2Mobile(parentMobile, mobile string) (num int64, err error) {
db := dao.GetDB()
parentUser := &model.WeiXins{}
parentUser := &legacymodel.WeiXins{}
parentUser.Tel = parentMobile
if err = dao.GetEntity(db, parentUser, "Tel"); err == nil {
if parentUser.ParentID == -1 {
@@ -130,15 +130,15 @@ func AddMobile2Mobile(parentMobile, mobile string) (num int64, err error) {
}
func ChangeMobile(curMobile, expectedMobile string) (num int64, err error) {
return dao.UpdateEntityByKV(nil, &model.WeiXins{}, map[string]interface{}{
return dao.UpdateEntityByKV(nil, &legacymodel.WeiXins{}, map[string]interface{}{
"Tel": expectedMobile,
}, map[string]interface{}{
"Tel": curMobile,
})
}
func verifyMobileIsBlank(db *dao.DaoDB, mobile string) (user *model.WeiXins, err error) {
user = &model.WeiXins{
func verifyMobileIsBlank(db *dao.DaoDB, mobile string) (user *legacymodel.WeiXins, err error) {
user = &legacymodel.WeiXins{
Tel: mobile,
}
if err = dao.GetEntity(db, user, "Tel"); err == nil {
@@ -165,7 +165,7 @@ func verifyMobileHasNoMembers(db *dao.DaoDB, mobile string) (err error) {
return err
}
func createUserAndSetOpenIDNull(db *dao.DaoDB, user *model.WeiXins) (err error) {
func createUserAndSetOpenIDNull(db *dao.DaoDB, user *legacymodel.WeiXins) (err error) {
dao.Begin(db)
if err = dao.CreateEntity(db, user); err != nil {
dao.Rollback(db)

View File

@@ -13,8 +13,8 @@ import (
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/tasksch"
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/qiniu/api.v7/storage"
@@ -66,7 +66,7 @@ func SendFilesToStores(files []*multipart.FileHeader, isAsync bool, userName str
globals.SugarLogger.Debugf("SendFilesToStores upload file:%s error:%v", fileHeader.Filename, err)
if err == nil {
db := dao.GetDB()
billRec := &model.StoreBill{
billRec := &legacymodel.StoreBill{
Date: time.Now(),
Url: jxutils.ComposeQiniuResURL(ret.Key),
StoreId: storeID,

View File

@@ -8,6 +8,7 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"github.com/astaxie/beego/orm"
@@ -211,7 +212,7 @@ func NotifyWaybillStatus(bill *model.Waybill, order *model.GoodsOrder) error {
return nil
}
func PushJDBadCommentToWeiXin(comment *model.JxBadComments) (err error) {
func PushJDBadCommentToWeiXin(comment *legacymodel.JxBadComments) (err error) {
globals.SugarLogger.Debugf("PushJDBadCommentToWeiXin orderID:%s", comment.OrderId)
sb := new(strings.Builder)
@@ -283,7 +284,7 @@ func FormatDeliveryTime(order *model.GoodsOrder) string {
return fmt.Sprintf("请于%s前送达剩余时间%d小时%d分钟", utils.Time2Str(tmpTime), leftHours, leftMinutes)
}
func genJdCommentRemark(comment *model.JxBadComments) string {
func genJdCommentRemark(comment *legacymodel.JxBadComments) string {
sb := new(strings.Builder)
sb.WriteString("差评标签:")
sb.WriteString(comment.Vendertags)

View File

@@ -0,0 +1,20 @@
package legacymodel
type JxBackendUser struct {
UID int `orm:"pk;column(uid)"`
UName string `orm:"column(uname);size(64);index"`
UPass string `orm:"column(upass);size(64)"`
Tel string `orm:"size(32);index"`
Position string `orm:"size(255)"`
Enabled int8 `orm:"default(1)"`
SkuWidget int `orm:"default(0)"`
StoreWidget int `orm:"default(0)"`
UserWidget int `orm:"default(0)"`
BillinfoWidget int `orm:"default(0)"`
GroupWidget int `orm:"default(0)"`
CategoryWidget int `orm:"default(0)"`
}
func (*JxBackendUser) TableName() string {
return "jxbackenduser"
}

View File

@@ -1,38 +1,4 @@
package model
import "time"
type WeiXins struct {
ID int `orm:"column(id)" json:"id"`
JxStoreID int `orm:"column(jxstoreid)" json:"storeID"`
OpenID string `orm:"column(openid);size(70);unique;null" json:"openID"`
Tel string `orm:"size(15);unique" json:"tel"`
ParentID int `orm:"column(parentid);default(-1)" json:"parentID"`
NickName string `orm:"column(nickname);size(30)" json:"nickname"`
}
func (*WeiXins) TableName() string {
return "weixins"
}
type JxBackendUser struct {
UID int `orm:"pk;column(uid)"`
UName string `orm:"column(uname);size(64);index"`
UPass string `orm:"column(upass);size(64)"`
Tel string `orm:"size(32);index"`
Position string `orm:"size(255)"`
Enabled int8 `orm:"default(1)"`
SkuWidget int `orm:"default(0)"`
StoreWidget int `orm:"default(0)"`
UserWidget int `orm:"default(0)"`
BillinfoWidget int `orm:"default(0)"`
GroupWidget int `orm:"default(0)"`
CategoryWidget int `orm:"default(0)"`
}
func (*JxBackendUser) TableName() string {
return "jxbackenduser"
}
package legacymodel
type JxBadComments struct {
Id int `json:"id" orm:"column(id)"`
@@ -58,21 +24,3 @@ type JxBadComments struct {
func (*JxBadComments) TableName() string {
return "jx_bad_comments"
}
type StoreBill struct {
Id int `orm:"column(id);auto"`
Date time.Time `orm:"column(date);type(datetime)"`
Url string `orm:"column(url);size(255)"`
StoreId int `orm:"column(store_id)"`
BillName string `orm:"column(bill_name);size(30)"`
}
func (t *StoreBill) TableName() string {
return "store_bill"
}
func (*StoreBill) TableIndex() [][]string {
return [][]string{
[]string{"StoreId", "Date"},
}
}

View File

@@ -0,0 +1,21 @@
package legacymodel
import "time"
type StoreBill struct {
Id int `orm:"column(id);auto"`
Date time.Time `orm:"column(date);type(datetime)"`
Url string `orm:"column(url);size(255)"`
StoreId int `orm:"column(store_id)"`
BillName string `orm:"column(bill_name);size(30)"`
}
func (t *StoreBill) TableName() string {
return "store_bill"
}
func (*StoreBill) TableIndex() [][]string {
return [][]string{
[]string{"StoreId", "Date"},
}
}

View File

@@ -0,0 +1,14 @@
package legacymodel
type WeiXins struct {
ID int `orm:"column(id)" json:"id"`
JxStoreID int `orm:"column(jxstoreid)" json:"storeID"`
OpenID string `orm:"column(openid);size(70);unique;null" json:"openID"`
Tel string `orm:"size(15);unique" json:"tel"`
ParentID int `orm:"column(parentid);default(-1)" json:"parentID"`
NickName string `orm:"column(nickname);size(30)" json:"nickname"`
}
func (*WeiXins) TableName() string {
return "weixins"
}

View File

@@ -10,8 +10,8 @@ import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"

View File

@@ -1,44 +0,0 @@
package elm
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
)
// 为了兼容之前的表,造出原来需要的数据
func (c *PurchaseHandler) legacyWriteElmOrder(order *model.GoodsOrder) (err error) {
db := orm.NewOrm()
_, msgType := c.spliltCompositeState(order.VendorStatus)
legacyOrder := &legacymodel.Elemeorder2{
Orderid: order.VendorOrderID,
Type: msgType,
Consignee: order.ConsigneeName,
Mobile: order.ConsigneeMobile,
OrderCreatedAt: utils.Time2Str(order.StatusTime),
}
_, err = db.Insert(legacyOrder)
if err != nil {
globals.SugarLogger.Infof("legacyWriteElmOrder orderID:%s insert error:%v", order.VendorOrderID, err)
}
return err
}
func (c *PurchaseHandler) legacyElmOrderStatusChanged(status *model.OrderStatus) (err error) {
db := orm.NewOrm()
legacyOrder := &legacymodel.Elemeorder2{
Orderid: status.VendorOrderID,
}
if err = db.Read(legacyOrder, "Orderid"); err == nil {
_, legacyOrder.Type = c.spliltCompositeState(status.VendorStatus)
utils.CallFuncLogError(func() error {
_, err = db.Update(legacyOrder, "Type")
return err
}, "legacyWriteElmOrder status:%v", status)
} else {
globals.SugarLogger.Infof("legacyElmOrderStatusChanged db.Read status:%v, error:%v", status, err)
}
return err
}

View File

@@ -1,49 +0,0 @@
package jd
import (
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
)
// 为了兼容之前的表,造出原来需要的数据
func (c *PurchaseHandler) legacyWriteJdOrder(order *model.GoodsOrder, delOldFirst bool) (err error) {
db := orm.NewOrm()
if delOldFirst {
db.Raw("DELETE FROM jdorder2 WHERE jdorderid = ?", utils.Str2Int64(order.VendorOrderID)).Exec()
}
legacyOrder := &legacymodel.Jdorder2{
Code: "0",
Jdorderid: utils.Str2Int64(order.VendorOrderID),
Orderstatus: int(utils.Str2Int64(order.VendorStatus)),
Orderstatustime: utils.Time2Str(order.StatusTime),
Success: 1,
Cityname: "all",
}
_, err = db.Insert(legacyOrder)
if err != nil {
globals.SugarLogger.Infof("legacyWriteJdOrder orderID:%s insert error:%v", order.VendorOrderID, err)
}
return err
}
func (c *PurchaseHandler) legacyJdOrderStatusChanged(status *model.OrderStatus) (err error) {
db := orm.NewOrm()
legacyOrder := &legacymodel.Jdorder2{
Jdorderid: utils.Str2Int64(status.VendorOrderID),
}
if err = db.Read(legacyOrder, "Jdorderid"); err == nil {
utils.CallFuncLogError(func() error {
legacyOrder.Orderstatus = int(utils.Str2Int64(status.VendorStatus))
legacyOrder.Orderstatustime = utils.Time2Str(status.StatusTime)
_, err = db.Update(legacyOrder, "Orderstatus", "Orderstatustime")
return err
}, "legacyJdOrderStatusChanged, status:%v", status)
} else {
globals.SugarLogger.Infof("legacyJdOrderStatusChanged db.Read status:%v, error:%v", status, err)
}
return err
}

View File

@@ -10,6 +10,7 @@ import (
"git.rosy.net.cn/jx-callback/business/jxutils/weixinmsg"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
@@ -75,7 +76,7 @@ func (c *PurchaseHandler) onOrderComment(msg *jdapi.CallbackOrderMsg) (err error
result, err := api.JdAPI.GetCommentByOrderId(intOrderID)
if err == nil {
globals.SugarLogger.Debugf("onOrderComment comment:%s", utils.Format4Output(result, true))
comment := &model.JxBadComments{
comment := &legacymodel.JxBadComments{
OrderId: msg.BillID,
}
db := dao.GetDB()

View File

@@ -1,8 +1,8 @@
package beegodb
import (
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego"
"github.com/astaxie/beego/orm"
@@ -13,30 +13,22 @@ func Init() {
orm.RegisterDataBase("default", "mysql", beego.AppConfig.String("dbConnectStr"), 30)
orm.RegisterModel(new(legacymodel.Config))
orm.RegisterModel(new(legacymodel.BlackClient))
orm.RegisterModel(new(model.JxBadComments))
orm.RegisterModel(new(model.StoreBill))
orm.RegisterModel(new(legacymodel.JxBadComments))
orm.RegisterModel(new(legacymodel.StoreBill))
orm.RegisterModel(new(legacymodel.Jxstorefeature))
orm.RegisterModel(new(legacymodel.TempLog))
orm.RegisterModel(new(legacymodel.WeiXins), new(legacymodel.JxBackendUser))
orm.RegisterModel(new(model.GoodsOrder))
orm.RegisterModel(new(model.OrderSku))
orm.RegisterModel(new(model.Waybill))
orm.RegisterModel(new(model.OrderStatus))
orm.RegisterModel(new(legacymodel.Jxstorefeature))
orm.RegisterModel(new(legacymodel.TempLog))
if globals.GenerateLegacyJxOrder {
orm.RegisterModel(new(legacymodel.Jxorder2))
orm.RegisterModel(new(legacymodel.Jxordersku2))
}
if globals.EnableStore {
orm.RegisterModel(&model.Place{})
orm.RegisterModel(&model.Store{}, &model.StoreSub{}, &model.StoreMap{}, &model.StoreCourierMap{})
orm.RegisterModel(&model.SkuVendorCategory{}, &model.StoreSkuCategoryMap{}, &model.SkuName{}, &model.Sku{}, &model.SkuNamePlaceBind{}, &model.StoreSkuBind{})
// db.Set("gorm:table_options", "CHARSET=utf8mb4").AutoMigrate(&model.SkuCategory{})
orm.RegisterModel(&model.SkuCategory{})
orm.RegisterModel(&model.WeiXins{}, &model.JxBackendUser{})
// orm.RegisterModel(&model.DurableTask{}, &model.DurableTaskItem{})
orm.RegisterModel(&model.Promotion{})

View File

@@ -1,46 +0,0 @@
package controllers
import (
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/globals"
"github.com/astaxie/beego/orm"
)
const (
JD_VENDORID = 0
ELM_VENDORID = 2
)
func OnNewOrder(orderID string, vendorID int, userMobile string, jxStoreID int, db orm.Ormer, handler func(accepted bool)) int {
handleType := 0
if userMobile != "" {
if db == nil {
db = orm.NewOrm()
}
user := &legacymodel.BlackClient{
Mobile: userMobile,
}
if err := db.Read(user, "Mobile"); err != nil {
if err != orm.ErrNoRows {
globals.SugarLogger.Errorf("read data error:%v, data:%v, vendorID:%d", err, user, vendorID)
}
// 在访问数据库出错的情况下,也需要自动接单
handleType = 1
} else {
// 强制拒单
globals.SugarLogger.Infof("force reject order:%s, vendorID:%d", orderID, vendorID)
handleType = -1
}
} else {
globals.SugarLogger.Infof("order:%s, vendorID:%d, mobile is empty, should accept it", orderID, vendorID)
handleType = 1
}
if handleType == 1 {
handler(true)
} else if handleType == -1 {
handler(false)
}
return handleType
}

View File

@@ -1,20 +0,0 @@
package controller
import (
"git.rosy.net.cn/baseapi/platformapi/dadaapi"
"git.rosy.net.cn/jx-callback/legacy/freshfood"
)
type OrderController struct {
}
func Error2Response(err error) *dadaapi.CallbackResponse {
if err != nil {
return dadaapi.FailedResponse
}
return dadaapi.SuccessResponse
}
func (o *OrderController) OrderStatusChanged(msg *dadaapi.CallbackMsg) *dadaapi.CallbackResponse {
return Error2Response(freshfood.FreshFoodAPI.DadaOrderStatusChanged(msg))
}

View File

@@ -1,151 +0,0 @@
package controller
import (
"strings"
"time"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/platformapi/elmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/jx-callback/legacy"
"git.rosy.net.cn/jx-callback/legacy/controllers"
"git.rosy.net.cn/jx-callback/legacy/elm/models"
"git.rosy.net.cn/jx-callback/legacy/freshfood"
"github.com/astaxie/beego/orm"
)
var (
errResponseInternal = &elmapi.CallbackResponse{Message: "internal error"}
errResponseDataError = &elmapi.CallbackResponse{Message: "elm data error"}
errResponseDBError = &elmapi.CallbackResponse{Message: "DB error"}
errResponseCallELMAPIError = &elmapi.CallbackResponse{Message: "call ELM API error"}
)
type OrderController struct {
}
func (o *OrderController) OrderMessage(msg *elmapi.CallbackMsg) (retVal *elmapi.CallbackResponse) {
var innerMsg map[string]interface{}
err := utils.UnmarshalUseNumber([]byte(msg.Message), &innerMsg)
if err != nil {
return errResponseDataError
}
retVal = elmapi.SuccessResponse
orderID := innerMsg["orderId"].(string)
legacy.RoutinePool.CallFun(func() {
if msg.Type == elmapi.MsgTypeOrderValid {
userMobile := ""
if phoneList, ok := innerMsg["phoneList"].([]interface{}); ok && len(phoneList) >= 1 {
userMobile = phoneList[0].(string)
} else {
baseapi.SugarLogger.Warnf("elm can not get mobile info from %v, error:%v", msg, err)
}
retVal = o.NewOrder(msg, orderID, userMobile)
} else if msg.Type >= elmapi.MsgTypeOrderAccepted && msg.Type <= elmapi.MsgTypeOrderFinished {
retVal = o.OrderStatusChanged(msg, orderID, innerMsg)
} else {
retVal = o.OrderOtherMsg(msg, orderID, innerMsg)
}
}, orderID)
return retVal
}
func OnNewOrder(orderID string, userMobile string) {
controllers.OnNewOrder(orderID, controllers.ELM_VENDORID, userMobile, 0, nil, func(acceptIt bool) {
if acceptIt {
time.AfterFunc(4*time.Minute, func() {
api.ElmAPI.ConfirmOrder(orderID)
})
} else {
api.ElmAPI.CancelOrder(orderID, elmapi.CancelOrderTypeOthers, "")
}
})
}
func (o *OrderController) NewOrder(msg *elmapi.CallbackMsg, orderId string, userMobile string) *elmapi.CallbackResponse {
db := orm.NewOrm()
rec := &models.ELMOrder{
OrderId: orderId,
Type: msg.Type,
}
retVal := elmapi.SuccessResponse
created, _, err := db.ReadOrCreate(rec, "OrderId")
if err != nil {
globals.SugarLogger.Warnf("error when calling ReadOrCreate, error:%v, rec:%v", err, rec)
retVal = errResponseDBError
} else {
if created || rec.Type < msg.Type {
result, err := api.ElmAPI.GetOrder(orderId)
if err != nil {
retVal = errResponseCallELMAPIError
} else {
rec.Data = utils.FilterMb4(string(utils.MustMarshal(result)))
rec.Consignee = result["consignee"].(string)
rec.Mobile = userMobile
if createdAt, ok := result["createdAt"].(string); ok {
rec.OrderCreatedAt = strings.Replace(createdAt, "T", " ", 1)
}
num, err := db.Update(rec, "Data", "Consignee", "Mobile", "OrderCreatedAt")
if err != nil || num != 1 {
globals.SugarLogger.Warnf("error in updating order data:%v, error:%v, num:%d", msg, err, num)
retVal = errResponseDataError
} else {
err = freshfood.FreshFoodAPI.NewELMOrder(result)
if err != nil {
retVal = errResponseInternal
}
}
}
OnNewOrder(orderId, userMobile)
} else {
globals.SugarLogger.Infof("duplicate elm msg received:%v", msg)
}
}
return retVal
}
func (o *OrderController) OrderStatusChanged(msg *elmapi.CallbackMsg, orderId string, innerMsg map[string]interface{}) *elmapi.CallbackResponse {
db := orm.NewOrm()
rec := &models.ELMOrder{
OrderId: orderId,
}
err := db.Read(rec, "OrderId")
if err != nil {
globals.SugarLogger.Warnf("error when calling ReadOrCreate, error:%v, rec:%v", err, rec)
} else {
if rec.Type < msg.Type {
err = freshfood.FreshFoodAPI.ELMOrderStatus(orderId, msg.Type, utils.GetCurTimeStr())
if err == nil {
rec.Type = msg.Type
err = utils.CallFuncLogError(func() error {
_, err := db.Update(rec, "Type")
return err
}, globals.ErrStrAccessDB)
}
} else {
globals.SugarLogger.Infof("duplicate elm msg received:%v", msg)
}
}
if err != nil {
return errResponseInternal
}
return elmapi.SuccessResponse
}
func (o *OrderController) OrderOtherMsg(msg *elmapi.CallbackMsg, orderId string, innerMsg map[string]interface{}) *elmapi.CallbackResponse {
var err error
if msg.Type == elmapi.MsgTypeUserUrgeOrder {
err = freshfood.FreshFoodAPI.ELMClientUrgeOrder(orderId)
}
if err != nil {
return errResponseInternal
}
return elmapi.SuccessResponse
}

View File

@@ -1,18 +0,0 @@
package models
type ELMOrder struct {
Id int
OrderId string `orm:"size(50);unique;null;column(orderid)"`
Consignee string `orm:"size(32)"`
Mobile string `orm:"size(32)"`
Data string `orm:"type(text);null"`
Type int `orm:"null"`
OrderCreatedAt string `orm:"size(50);index"`
// CreatedAt time.Time `orm:"auto_now_add;type(datetime);null"`
// UpdatedAt time.Time `orm:"auto_now;type(datetime);null"`
// StatusTime string `orm:"size(50)"`
}
func (e *ELMOrder) TableName() string {
return "elemeorder"
}

View File

@@ -6,89 +6,14 @@ import (
"net/url"
"time"
"git.rosy.net.cn/baseapi/platformapi/dadaapi"
"github.com/astaxie/beego"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/legacy/controllers"
"git.rosy.net.cn/jx-callback/legacy/jd/models"
)
const (
URL_FRESHFOOD_ORDER_CREATE_JDDJ = "order"
URL_FRESHFOOD_ORDER_STATUS = "order/status"
URL_FRESHFOOD_ORDER_COMMENT = "comments/pushJdBadComments"
URL_FRESHFOOD_DELIVERY_STATUS = "delivery/status"
URL_FRESHFOOD_ORDER_MODIFY = "order/modify"
URL_FRESHFOOD_ELEME_TOKENUPDATE = "eleme/token/update"
URL_FRESHFOOD_ORDER_CREATE_ELEME = "order/eleme"
URL_FRESHFOOD_ELEME_USER_URGE_ORDER = "reminders/pushElmSmsReminders"
URL_FRESHFOOD_MTPS_DELIVERYSTATUS = "mtps/status"
URL_FRESHFOOD_MTPS_EXCEPTION = "mtps/except"
)
const (
URL_FRESHFOOD_PARA_JDORDER = "jdOrder"
URL_FRESHFOOD_PARA_VENDORID = "venderId"
URL_FRESHFOOD_PARA_ORDERID = "orderId"
URL_FRESHFOOD_PARA_ORDERSTATUS = "orderStatus"
URL_FRESHFOOD_PARA_ORDERSTATUSTIME = "orderStatusTime"
URL_FRESHFOOD_PARA_CITYNAME = "cityName"
URL_FRESHFOOD_PARA_BILLID = "billId"
URL_FRESHFOOD_PARA_STATUSID = "statusId"
URL_FRESHFOOD_PARA_DELIVERYSTATUS = "deliveryStatus"
URL_FRESHFOOD_PARA_DLIVERYSTATUSTIME = "deliveryStatusTime"
URL_FRESHFOOD_PARA_DELIVERYCARRIERNO = "deliveryCarrierNo"
URL_FRESHFOOD_PARA_DELIVERYCARRIERNAME = "deliveryCarrierName"
URL_FRESHFOOD_PARA_DELIVERYMANNO = "deliveryManNo"
URL_FRESHFOOD_PARA_DELIVERYMANNAME = "deliveryManName"
URL_FRESHFOOD_PARA_DELIVERYMANPHONE = "deliveryManPhone"
URL_FRESHFOOD_PARA_ELEMEORDER = "elemeOrder"
)
const (
URL_FRESHFOOD_PARA_DELIVERYID = "deliveryId"
URL_FRESHFOOD_PARA_MTPEISONID = "mtPeisongId"
// URL_FRESHFOOD_PARA_ORDERID = "orderId"
URL_FRESHFOOD_PARA_STATUS = "status"
URL_FRESHFOOD_PARA_COURIERNAME = "courierName"
URL_FRESHFOOD_PARA_COURIERPHONE = "courierPhone"
URL_FRESHFOOD_PARA_CANCELREASONID = "cancelReasonId"
URL_FRESHFOOD_PARA_CANCELREASON = "cancelReason"
URL_FRESHFOOD_PARA_APPKEY = "appkey"
URL_FRESHFOOD_PARA_TIMESTAMP = "timestamp"
URL_FRESHFOOD_PARA_SIGN = "sign"
//转发美团配送异常消息
URL_FRESHFOOD_PARA_EXCEPTIONID = "exceptionId"
URL_FRESHFOOD_PARA_EXCEPTIONCODE = "exceptionCode"
URL_FRESHFOOD_PARA_EXCEPTIONDESC = "exceptionDesc"
URL_FRESHFOOD_PARA_EXCEPTIONTIME = "exceptionTime"
)
const (
//转发美团配送配送状态
URL_FRESHFOOD_DADADELIVERY_STATUS = "dadadelivery/status"
URL_FRESHFOOD_PARA_CLIENTID = "clientId"
URL_FRESHFOOD_PARA_CANCELFROM = "cancelFrom"
URL_FRESHFOOD_PARA_UPDATETIME = "updateTime"
URL_FRESHFOOD_PARA_DMID = "dmId"
URL_FRESHFOOD_PARA_DMNAME = "dmName"
URL_FRESHFOOD_PARA_DMMOBILE = "dmMobile"
)
const (
URL_WX_UPDATE_ACCESSTOKEN = "weixin/accesstoken/update"
URL_WX_UPDATE_ACCESSTOKEN = "weixin/accesstoken/update"
URL_FRESHFOOD_ELEME_TOKENUPDATE = "eleme/token/update"
)
const (
@@ -146,134 +71,6 @@ func (f *API) AccessFreshFood(apiStr string, params url.Values) error {
return nil
}
// jd api
func (f *API) NewJDOrder(jdorder *models.Jdorder, isNew bool) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_JDORDER, string(utils.MustMarshal(jdorder)))
if isNew {
return f.AccessFreshFood(URL_FRESHFOOD_ORDER_CREATE_JDDJ, params)
}
return f.AccessFreshFood(URL_FRESHFOOD_ORDER_MODIFY, params)
}
func (f *API) JDOrderStatus(msg *jdapi.CallbackOrderMsg) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.JD_VENDORID))
params.Set(URL_FRESHFOOD_PARA_ORDERID, msg.BillID)
params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, msg.StatusID)
params.Set(URL_FRESHFOOD_PARA_ORDERSTATUSTIME, msg.Timestamp)
params.Set(URL_FRESHFOOD_PARA_CITYNAME, "all")
return f.AccessFreshFood(URL_FRESHFOOD_ORDER_STATUS, params)
}
func (f *API) JDOrderComment(msg *jdapi.CallbackOrderMsg) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_BILLID, msg.BillID)
params.Set(URL_FRESHFOOD_PARA_STATUSID, msg.StatusID)
return f.AccessFreshFood(URL_FRESHFOOD_ORDER_COMMENT, params)
}
func (f *API) JDOrderDeliveryStatus(jdOrderDeliveryStatusMsg *jdapi.CallbackDeliveryStatusMsg) error {
params := make(url.Values)
cityName := "all"
params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.JD_VENDORID))
params.Set(URL_FRESHFOOD_PARA_ORDERID, jdOrderDeliveryStatusMsg.OrderID)
params.Set(URL_FRESHFOOD_PARA_DELIVERYSTATUS, jdOrderDeliveryStatusMsg.DeliveryStatus)
params.Set(URL_FRESHFOOD_PARA_DLIVERYSTATUSTIME, jdOrderDeliveryStatusMsg.DeliveryStatusTime)
params.Set(URL_FRESHFOOD_PARA_DELIVERYCARRIERNO, jdOrderDeliveryStatusMsg.DeliveryCarrierNo)
params.Set(URL_FRESHFOOD_PARA_DELIVERYCARRIERNAME, jdOrderDeliveryStatusMsg.DeliveryCarrierName)
params.Set(URL_FRESHFOOD_PARA_DELIVERYMANNO, jdOrderDeliveryStatusMsg.DeliveryManNo)
params.Set(URL_FRESHFOOD_PARA_DELIVERYMANNAME, jdOrderDeliveryStatusMsg.DeliveryManName)
params.Set(URL_FRESHFOOD_PARA_DELIVERYMANPHONE, jdOrderDeliveryStatusMsg.DeliveryManPhone)
params.Set(URL_FRESHFOOD_PARA_CITYNAME, cityName)
return f.AccessFreshFood(URL_FRESHFOOD_DELIVERY_STATUS, params)
}
// elm api
func (f *API) NewELMOrder(order map[string]interface{}) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_ELEMEORDER, string(utils.MustMarshal(order)))
return f.AccessFreshFood(URL_FRESHFOOD_ORDER_CREATE_ELEME, params)
}
func (f *API) ELMOrderStatus(orderId string, status int, statusTime string) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.ELM_VENDORID))
params.Set(URL_FRESHFOOD_PARA_ORDERID, orderId)
params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, utils.Int2Str(status))
params.Set(URL_FRESHFOOD_PARA_ORDERSTATUSTIME, statusTime)
return f.AccessFreshFood(URL_FRESHFOOD_ORDER_STATUS, params)
}
func (f *API) ELMClientUrgeOrder(orderId string) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_VENDORID, utils.Int2Str(controllers.ELM_VENDORID))
params.Set(URL_FRESHFOOD_PARA_ORDERID, orderId)
return f.AccessFreshFood(URL_FRESHFOOD_ELEME_USER_URGE_ORDER, params)
}
// mtps api
func (f *API) MtpsOrderStatusChanged(order *mtpsapi.CallbackOrderMsg) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_DELIVERYID, utils.Int64ToStr(order.DeliveryID))
params.Set(URL_FRESHFOOD_PARA_MTPEISONID, order.MtPeisongID)
params.Set(URL_FRESHFOOD_PARA_ORDERID, order.OrderID)
params.Set(URL_FRESHFOOD_PARA_STATUS, utils.Int2Str(order.Status))
params.Set(URL_FRESHFOOD_PARA_COURIERNAME, order.CourierName)
params.Set(URL_FRESHFOOD_PARA_COURIERPHONE, order.CourierPhone)
params.Set(URL_FRESHFOOD_PARA_CANCELREASONID, utils.Int2Str(order.CancelReasonId))
params.Set(URL_FRESHFOOD_PARA_CANCELREASON, order.CancelReason)
params.Set(URL_FRESHFOOD_PARA_APPKEY, order.AppKey)
params.Set(URL_FRESHFOOD_PARA_TIMESTAMP, utils.Int64ToStr(order.Timestamp))
params.Set(URL_FRESHFOOD_PARA_SIGN, order.Sign)
return f.AccessFreshFood(URL_FRESHFOOD_MTPS_DELIVERYSTATUS, params)
}
func (f *API) MtpsOrderException(order *mtpsapi.CallbackOrderExceptionMsg) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_DELIVERYID, utils.Int64ToStr(order.DeliveryID))
params.Set(URL_FRESHFOOD_PARA_MTPEISONID, order.MtPeisongID)
params.Set(URL_FRESHFOOD_PARA_ORDERID, order.OrderID)
params.Set(URL_FRESHFOOD_PARA_EXCEPTIONID, utils.Int64ToStr(order.ExceptionID))
params.Set(URL_FRESHFOOD_PARA_EXCEPTIONCODE, utils.Int2Str(order.ExceptionCode))
params.Set(URL_FRESHFOOD_PARA_EXCEPTIONDESC, order.ExceptionDescr)
params.Set(URL_FRESHFOOD_PARA_EXCEPTIONTIME, utils.Int64ToStr(order.ExceptionTime))
params.Set(URL_FRESHFOOD_PARA_COURIERNAME, order.CourierName)
params.Set(URL_FRESHFOOD_PARA_COURIERPHONE, order.CourierPhone)
params.Set(URL_FRESHFOOD_PARA_APPKEY, order.AppKey)
params.Set(URL_FRESHFOOD_PARA_TIMESTAMP, utils.Int64ToStr(order.Timestamp))
params.Set(URL_FRESHFOOD_PARA_SIGN, order.Sign)
return f.AccessFreshFood(URL_FRESHFOOD_MTPS_EXCEPTION, params)
}
// dada
func (f *API) DadaOrderStatusChanged(msg *dadaapi.CallbackMsg) error {
params := make(url.Values)
params.Set(URL_FRESHFOOD_PARA_CLIENTID, msg.ClientID)
params.Set(URL_FRESHFOOD_PARA_ORDERID, msg.OrderID)
params.Set(URL_FRESHFOOD_PARA_ORDERSTATUS, utils.Int2Str(msg.OrderStatus))
params.Set(URL_FRESHFOOD_PARA_CANCELREASON, msg.CancelReason)
params.Set(URL_FRESHFOOD_PARA_CANCELFROM, utils.Int2Str(msg.CancelFrom))
params.Set(URL_FRESHFOOD_PARA_UPDATETIME, utils.Int2Str(msg.UpdateTime))
params.Set(URL_FRESHFOOD_PARA_DMID, utils.Int2Str(msg.DmID))
params.Set(URL_FRESHFOOD_PARA_DMNAME, msg.DmName)
params.Set(URL_FRESHFOOD_PARA_DMMOBILE, msg.DmMobile)
return f.AccessFreshFood(URL_FRESHFOOD_DADADELIVERY_STATUS, params)
}
func (f *API) RefreshWeixinToken() error {
return f.AccessFreshFood(URL_WX_UPDATE_ACCESSTOKEN, nil)
}

View File

@@ -1,232 +0,0 @@
package controller
import (
"encoding/json"
"git.rosy.net.cn/baseapi/platformapi/jdapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/jx-callback/legacy/controllers"
"git.rosy.net.cn/jx-callback/legacy/freshfood"
"git.rosy.net.cn/jx-callback/legacy/jd/models"
"github.com/astaxie/beego/orm"
)
const (
MsgNotHandledCode = "NH"
)
var (
orderMsgChan chan jdapi.CallbackOrderMsg
)
type OrderController struct {
}
func InitOrder() {
orderMsgChan = make(chan jdapi.CallbackOrderMsg, 128)
go orderMsgHandlerRoutine()
// 另外当前这个模式可能会出现同一个订单的消息虽然远程推送过来顺序是对的但经过处理后推送到freshfood时乱序因为每个消息的处理时间是不确定的
handlePendingOrderMsg()
}
func handlePendingOrderMsg() {
var ordersInfo []models.Jdorder
db := orm.NewOrm()
_, err := db.Raw("SELECT * FROM jdorder WHERE orderstatustime >= DATE_FORMAT(DATE_ADD(NOW(), interval -1 day), '%Y-%m-%d %H:%i:%s') AND code = ?", MsgNotHandledCode).QueryRows(&ordersInfo)
if err != nil {
globals.SugarLogger.Errorf("can not get jdorder from db, error:%v", err)
} else {
for _, jdOrderInfo := range ordersInfo {
orderMsg := &jdapi.CallbackOrderMsg{
ID: jdOrderInfo.ID,
BillID: utils.Int64ToStr(jdOrderInfo.JdOrderID),
StatusID: utils.Int2Str(jdOrderInfo.OrderStatus),
Timestamp: jdOrderInfo.OrderStatusTime,
}
addOrderMsg(orderMsg)
}
}
}
func orderMsgHandlerRoutine() {
for {
msg := <-orderMsgChan
globals.SugarLogger.Debugf("orderMsgHandlerRoutine:%v", msg)
go handleOrderMsg(&msg)
}
}
func addOrderMsg(msg *jdapi.CallbackOrderMsg) {
globals.SugarLogger.Debugf("addOrderMsg:%v", msg)
orderMsgChan <- *msg
}
func handleOrderMsg(msg *jdapi.CallbackOrderMsg) {
globals.SugarLogger.Debugf("handleOrderMsg:%v", msg)
switch msg.StatusID {
case jdapi.OrderStatusNew:
newOrder(msg)
case jdapi.OrderStatusAdjust:
adjustOrder(msg)
default:
normalOrderStatus(msg)
}
}
// --------------
func (c *OrderController) OrderStatus(msg *jdapi.CallbackOrderMsg) *jdapi.CallbackResponse {
if msg.StatusID != jdapi.OrderStatusNew && msg.StatusID != jdapi.OrderStatusAdjust {
err := normalOrderStatus(msg)
if err != nil {
return jdapi.Err2CallbackResponse(err, "")
}
} else {
db := orm.NewOrm()
jdorderid := utils.Str2Int64(msg.BillID)
status := int(utils.Str2Int64(msg.StatusID))
rec := &models.Jdorder{
Code: MsgNotHandledCode,
JdOrderID: jdorderid,
OrderStatus: status,
OrderStatusTime: msg.Timestamp,
}
if created, _, err := db.ReadOrCreate(rec, "JdOrderID"); err == nil {
msg.ID = rec.ID
if created {
if msg.StatusID != jdapi.OrderStatusNew && msg.StatusID != jdapi.OrderStatusAdjust {
globals.SugarLogger.Warnf("order:%v get before create", msg)
oldStatusID := msg.StatusID
msg.StatusID = jdapi.OrderStatusNew
addOrderMsg(msg)
msg.StatusID = oldStatusID
}
addOrderMsg(msg)
} else {
if rec.OrderStatus != status {
if msg.StatusID == jdapi.OrderStatusNew {
globals.SugarLogger.Warnf("order:%v get after some other message:%d", msg, rec.OrderStatus)
} else {
rec.OrderStatus = status
rec.OrderStatusTime = msg.Timestamp
rec.Code = MsgNotHandledCode
utils.CallFuncLogError(func() error {
_, err := db.Update(rec, "OrderStatus", "OrderStatusTime", "Code")
return err
}, globals.ErrStrAccessDB)
addOrderMsg(msg)
}
} else {
globals.SugarLogger.Warnf("duplicated jd order msg:%v", msg)
}
}
} else {
globals.SugarLogger.Errorf("error when calling ReadOrCreate:%v", err)
return jdapi.Err2CallbackResponse(err, "")
}
}
return jdapi.SuccessResponse
}
func (c *OrderController) OrderDeliveryStatus(jdOrderDeliveryStatusMsg *jdapi.CallbackDeliveryStatusMsg) *jdapi.CallbackResponse {
if err := freshfood.FreshFoodAPI.JDOrderDeliveryStatus(jdOrderDeliveryStatusMsg); err != nil {
return jdapi.Err2CallbackResponse(err, "")
}
return jdapi.SuccessResponse
}
//-----------
func OnNewOrder(msg *jdapi.CallbackOrderMsg, userMobile string, db orm.Ormer) {
controllers.OnNewOrder(msg.BillID, controllers.JD_VENDORID, userMobile, 0, db, func(acceptIt bool) {
globals.SugarLogger.Infof("OrderAcceptOperate billid:%v, acceptIt:%v", msg.BillID, acceptIt)
api.JdAPI.OrderAcceptOperate(msg.BillID, acceptIt, "")
})
}
func newOrder(msg *jdapi.CallbackOrderMsg) error {
result, err := api.JdAPI.LegacyQuerySingleOrder(msg.BillID)
userMobile := ""
var db orm.Ormer
if err == nil {
rec := &models.Jdorder{
ID: msg.ID,
}
rec.Code, _ = result["code"].(string)
rec.Msg, _ = result["msg"].(string)
rec.Success, _ = result["success"].(bool)
rec.CityName = "all"
data := result["data"].(map[string]interface{})
dataResult := data["result"].(map[string]interface{})
resultList, ok := dataResult["resultList"].([]interface{})
if ok && len(resultList) == 1 {
resultList0 := resultList[0].(map[string]interface{})
orderStatus, _ := resultList0["orderStatus"].(json.Number).Int64()
rec.JdOrderID = utils.Str2Int64(msg.BillID)
rec.OrderStatus = int(orderStatus)
rec.OrderStatusTime = resultList0["orderStatusTime"].(string)
resultByteArr := utils.MustMarshal(data)
rec.Data = utils.FilterMb4(string(resultByteArr))
rec.Data4Json = data
userMobile = resultList0["buyerMobile"].(string)
err = utils.CallFuncLogError(func() error {
db = orm.NewOrm()
_, err := db.Update(rec, "Data", "Code", "Msg", "Success", "CityName", "OrderStatus", "OrderStatusTime")
return err
}, globals.ErrStrAccessDB)
freshfood.FreshFoodAPI.NewJDOrder(rec, msg.StatusID == jdapi.OrderStatusNew)
} else {
globals.SugarLogger.Errorf("can not get jdorder info:%v", msg.BillID)
}
}
OnNewOrder(msg, userMobile, db)
return err
}
func adjustOrder(msg *jdapi.CallbackOrderMsg) error {
return newOrder(msg)
}
func normalOrderStatus(msg *jdapi.CallbackOrderMsg) (err error) {
if msg.StatusID == jdapi.OrderStatusAddComment || msg.StatusID == jdapi.OrderStatusModifyComment {
err = freshfood.FreshFoodAPI.JDOrderComment(msg)
} else {
db := orm.NewOrm()
rec := &models.Jdorder{
JdOrderID: utils.Str2Int64(msg.BillID),
}
err = db.Read(rec, "JdOrderId")
if err != nil {
if err == orm.ErrNoRows {
err = nil // 如果没有查到,不当成错误
} else {
globals.SugarLogger.Warnf("error when accessing db err:%v, rec:%v", err, rec)
}
} else {
if rec.OrderStatus == int(utils.Str2Int64(msg.StatusID)) {
globals.SugarLogger.Infof("Duplicate message msg:%v", msg)
} else {
if msg.StatusID != jdapi.OrderStatusWaitOutStore { // 老系统没有处理OrderStatusWaitOutStore不转发
if err = freshfood.FreshFoodAPI.JDOrderStatus(msg); err == nil {
rec.OrderStatus = int(utils.Str2Int64(msg.StatusID))
rec.OrderStatusTime = msg.Timestamp
rec.Code = "0"
err = utils.CallFuncLogError(func() error {
_, err := db.Update(rec, "OrderStatus", "OrderStatusTime", "Code")
return err
}, globals.ErrStrAccessDB)
}
}
}
}
}
return err
}

View File

@@ -1,14 +0,0 @@
package models
type Jdorder struct {
ID int `orm:"column(id)" json:"-"`
Code string `orm:"size(2);null" json:"code"`
Msg string `orm:"size(100);null" json:"msg"`
Data string `orm:"type(text)" json:"-"`
Data4Json map[string]interface{} `orm:"-" json:"data"`
Success bool `orm:"null" json:"success"`
JdOrderID int64 `orm:"unique;size(19);column(jdorderid);null" json:"jdOrderId"`
CityName string `orm:"size(20);column(cityname)" json:"cityName"`
OrderStatus int `orm:"column(orderstatus);null" json:"orderStatus"`
OrderStatusTime string `orm:"size(50);column(orderstatustime);null" json:"orderStatusTime"`
}

View File

@@ -1,13 +0,0 @@
package models
import (
elmmodels "git.rosy.net.cn/jx-callback/legacy/elm/models"
jdmodels "git.rosy.net.cn/jx-callback/legacy/jd/models"
"github.com/astaxie/beego/orm"
)
func RegisterModels() {
// register model
orm.RegisterModel(new(jdmodels.Jdorder))
orm.RegisterModel(new(elmmodels.ELMOrder))
}

View File

@@ -1,26 +0,0 @@
package controller
import (
"git.rosy.net.cn/baseapi/platformapi/mtpsapi"
"git.rosy.net.cn/jx-callback/legacy/freshfood"
)
type OrderController struct {
}
func Error2Response(err error) *mtpsapi.CallbackResponse {
if err != nil {
return &mtpsapi.CallbackResponse{
Code: -1,
}
}
return mtpsapi.SuccessResponse
}
func (c *OrderController) OrderStatusChanged(order *mtpsapi.CallbackOrderMsg) *mtpsapi.CallbackResponse {
return Error2Response(freshfood.FreshFoodAPI.MtpsOrderStatusChanged(order))
}
func (c *OrderController) OrderException(order *mtpsapi.CallbackOrderExceptionMsg) *mtpsapi.CallbackResponse {
return Error2Response(freshfood.FreshFoodAPI.MtpsOrderException(order))
}

View File

@@ -1,13 +0,0 @@
package models
type MtpsOrder struct {
DeliveryId int64
MtPeisongId string `orm:"size(64);unique"`
OrderId string `orm:"size(64);unique"`
Status int
OperateTime int
CourierName string `orm:"size(16)"`
CourierPhone string `orm:"size(16)"`
CancelReasonId int
CancelReason string `orm:"size(256)"`
}

View File

@@ -4,7 +4,7 @@ import (
"fmt"
"time"
"git.rosy.net.cn/jx-callback/business/legacymodel"
"git.rosy.net.cn/jx-callback/business/model/legacymodel"
"git.rosy.net.cn/jx-callback/globals/api"
"git.rosy.net.cn/baseapi/utils"