修改蜂鸟配送
This commit is contained in:
@@ -147,7 +147,7 @@ func RefreshFnToken() (err error) {
|
|||||||
if globals.IsMainProductEnv() {
|
if globals.IsMainProductEnv() {
|
||||||
if tokenInfo, err := api.FnAPI.GetAccessToken(); err == nil {
|
if tokenInfo, err := api.FnAPI.GetAccessToken(); err == nil {
|
||||||
globals.SugarLogger.Debugf("RefreshFnToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
globals.SugarLogger.Debugf("RefreshFnToken tokenInfo:%s", utils.Format4Output(tokenInfo, true))
|
||||||
token = tokenInfo.AccessToken
|
token = tokenInfo.BusinessDataObj.AccessToken
|
||||||
} else {
|
} else {
|
||||||
globals.SugarLogger.Errorf("RefreshFnToken RefreshToken failed with error:%v", err)
|
globals.SugarLogger.Errorf("RefreshFnToken RefreshToken failed with error:%v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -312,18 +312,18 @@ const (
|
|||||||
WaybillStatusRefuseFailedGetGoods = -70
|
WaybillStatusRefuseFailedGetGoods = -70
|
||||||
WaybillStatusUnknown = 0
|
WaybillStatusUnknown = 0
|
||||||
|
|
||||||
WaybillStatusNew = 5
|
WaybillStatusNew = 5 // 新建订单
|
||||||
WaybillStatusPending = 7
|
WaybillStatusPending = 7 //
|
||||||
WaybillStatusAcceptCanceled = 8
|
WaybillStatusAcceptCanceled = 8 // 取消运单
|
||||||
WaybillStatusAccepted = 10
|
WaybillStatusAccepted = 10 // 分配骑手,正在接单
|
||||||
WaybillStatusCourierAssigned = 12 //已分配骑手
|
WaybillStatusCourierAssigned = 12 //已分配骑手
|
||||||
WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态
|
WaybillStatusCourierArrived = 15 // 此状态是可选的,明确写出来是因为还是较重要的状态,但业务逻辑不应依赖此状态
|
||||||
|
|
||||||
WaybillStatusApplyFailedGetGoods = 17 // 取货失败待审核
|
WaybillStatusApplyFailedGetGoods = 17 // 取货失败待审核
|
||||||
WaybillStatusAgreeFailedGetGoods = 18 // 取货失败
|
WaybillStatusAgreeFailedGetGoods = 18 // 取货失败
|
||||||
|
|
||||||
WaybillStatusDelivering = 20
|
WaybillStatusDelivering = 20 // 配送中
|
||||||
WaybillStatusDeliverFailed = 22
|
WaybillStatusDeliverFailed = 22 // 配送中失败
|
||||||
|
|
||||||
WaybillStatusEndBegin = 100 // 以下的状态就是结束状态
|
WaybillStatusEndBegin = 100 // 以下的状态就是结束状态
|
||||||
WaybillStatusDelivered = 105 // todo 这个应该改为110,与订单对应
|
WaybillStatusDelivered = 105 // todo 这个应该改为110,与订单对应
|
||||||
|
|||||||
@@ -39,9 +39,9 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
StoreAuditStatusCreated = 1
|
StoreAuditStatusCreated = 1 // 创建成功 ,修改审核通过
|
||||||
StoreAuditStatusOnline = 0
|
StoreAuditStatusOnline = 0 // 上线可发单, 修改审核通过
|
||||||
StoreAuditStatusRejected = -1
|
StoreAuditStatusRejected = -1 // 审核驳回 , 修改审核驳回
|
||||||
StoreAuditStatusUpdated = 2
|
StoreAuditStatusUpdated = 2
|
||||||
StoreAuditStatusAll = -9
|
StoreAuditStatusAll = -9
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,72 @@
|
|||||||
package fn
|
package fn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
|
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
|
||||||
"git.rosy.net.cn/jx-callback/business/model"
|
"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/dao"
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
"git.rosy.net.cn/jx-callback/business/partner"
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
auditStatusMap = map[int]int{
|
||||||
|
// 创建
|
||||||
|
fnpsapi.ShopCreateStatusAuditRejected: model.StoreAuditStatusCreated,
|
||||||
|
fnpsapi.ShopCreateStatusAuditPassed: model.StoreAuditStatusRejected,
|
||||||
|
fnpsapi.ShopCreateStatusAuditCreated: model.StoreAuditStatusCreated,
|
||||||
|
fnpsapi.ShopCreateStatusAuditOnline: model.StoreAuditStatusOnline,
|
||||||
|
fnpsapi.ShopCreateStatusAuditUpdateRejected: model.StoreAuditStatusOnline,
|
||||||
|
|
||||||
|
// 修改
|
||||||
|
fnpsapi.ShopUpdateStatusAuditRejected: model.StoreAuditStatusCreated,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func getAuditStatus(vendorAuditStatus int) int {
|
||||||
|
if auditStatus, ok := auditStatusMap[vendorAuditStatus]; ok {
|
||||||
|
return auditStatus
|
||||||
|
}
|
||||||
|
return model.StoreAuditStatusCreated
|
||||||
|
}
|
||||||
|
|
||||||
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
|
func (c *DeliveryHandler) CreateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (vendorStoreID string, status int, err error) {
|
||||||
err = api.FnAPI.CreateStore(&fnpsapi.CreateStoreParam{
|
// 获取品牌名称
|
||||||
ChainStoreCode: utils.Int2Str(storeDetail.ID),
|
brandInfo, err := dao.GetBrands(dao.GetDB(), "", storeDetail.BrandID, "", false, "")
|
||||||
ChainStoreName: globals.StoreName + "-" + storeDetail.Name,
|
if err != nil {
|
||||||
|
return "", 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
createStore := &fnpsapi.CreateStoreBaseInfo{
|
||||||
ContactPhone: storeDetail.Tel1,
|
ContactPhone: storeDetail.Tel1,
|
||||||
Address: storeDetail.Address,
|
Address: storeDetail.Address,
|
||||||
|
Longitude: utils.Int2Float64(storeDetail.Lng) / 1000000,
|
||||||
|
Latitude: utils.Int2Float64(storeDetail.Lat) / 1000000,
|
||||||
PositionSource: 3,
|
PositionSource: 3,
|
||||||
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
OutShopCode: utils.Int2Str(storeDetail.ID),
|
||||||
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
CategoryID: "51",
|
||||||
})
|
OwnerName: storeDetail.IDName,
|
||||||
if err == nil {
|
OwnerIDNum: storeDetail.IDCode,
|
||||||
vendorStoreID = utils.Int2Str(storeDetail.ID)
|
HandheldLicencePicHash: "暂不需要(手持身份证、营业执照图片)",
|
||||||
|
OwnerIDPicFrontHash: "暂不需要(省份证正)",
|
||||||
|
OwnerIDPicBackHash: "暂不需要(身份证反)",
|
||||||
|
CreditCode: storeDetail.LicenceCode,
|
||||||
|
BusinessLicencePicHash: storeDetail.Licence,
|
||||||
}
|
}
|
||||||
return vendorStoreID, status, err
|
if len(brandInfo) >= 0 {
|
||||||
|
createStore.HeadShopName = brandInfo[0].Name + "-" + storeDetail.Name
|
||||||
|
} else {
|
||||||
|
createStore.HeadShopName = storeDetail.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
fnShopId, err := api.FnAPI.CreateStore(createStore)
|
||||||
|
if err != nil {
|
||||||
|
return "", 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return fnShopId, status, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func shopStatus2JX(status int) (jxStatus int) {
|
func shopStatus2JX(status int) (jxStatus int) {
|
||||||
@@ -65,20 +105,68 @@ func (c *DeliveryHandler) IsErrStoreNotExist(err error) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
|
func (c *DeliveryHandler) UpdateStore(ctx *jxcontext.Context, storeDetail *dao.StoreDetail2) (err error) {
|
||||||
params := &fnpsapi.CreateStoreParam{
|
// 获取品牌名称
|
||||||
ChainStoreCode: utils.Int2Str(storeDetail.ID),
|
brandInfo, err := dao.GetBrands(dao.GetDB(), "", storeDetail.BrandID, "", false, "")
|
||||||
// ChainStoreName: globals.StoreName + "-" + storeDetail.Name,
|
if err != nil {
|
||||||
ContactPhone: storeDetail.Tel1,
|
|
||||||
Address: storeDetail.Address,
|
|
||||||
PositionSource: 3,
|
|
||||||
Longitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lng)),
|
|
||||||
Latitude: utils.Float64ToStr(jxutils.IntCoordinate2Standard(storeDetail.Lat)),
|
|
||||||
}
|
|
||||||
if !strings.Contains(storeDetail.Name, globals.StoreName+"-") {
|
|
||||||
params.ChainStoreName = globals.StoreName + "-" + storeDetail.Name
|
|
||||||
} else {
|
|
||||||
params.ChainStoreName = storeDetail.Name
|
|
||||||
}
|
|
||||||
err = api.FnAPI.UpdateStore(params)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateStore := &fnpsapi.UpdateStoreParam{
|
||||||
|
ChainStoreID: "",
|
||||||
|
HeadShopName: brandInfo[0].Name + "-" + storeDetail.Name,
|
||||||
|
ContactPhone: storeDetail.Tel1,
|
||||||
|
Address: storeDetail.Address,
|
||||||
|
Longitude: utils.Int2Float64(storeDetail.Lng) / 1000000,
|
||||||
|
Latitude: utils.Int2Float64(storeDetail.Lat) / 1000000,
|
||||||
|
PositionSource: 3,
|
||||||
|
OutShopCode: utils.Int2Str(storeDetail.ID),
|
||||||
|
CategoryID: "51",
|
||||||
|
OwnerName: storeDetail.IDName,
|
||||||
|
OwnerIDNum: storeDetail.IDCode,
|
||||||
|
HandheldLicencePicHash: "暂不需要(手持身份证、营业执照图片)",
|
||||||
|
OwnerIDPicFrontHash: "暂不需要(省份证正)",
|
||||||
|
OwnerIDPicBackHash: "暂不需要(身份证反)",
|
||||||
|
CreditCode: storeDetail.LicenceCode,
|
||||||
|
BusinessLicencePicHash: storeDetail.Licence,
|
||||||
|
}
|
||||||
|
if len(brandInfo) >= 0 {
|
||||||
|
updateStore.HeadShopName = brandInfo[0].Name + "-" + storeDetail.Name
|
||||||
|
} else {
|
||||||
|
updateStore.HeadShopName = storeDetail.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
return api.FnAPI.UpdateStore(updateStore)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 蜂鸟门店状态改变
|
||||||
|
func OnStoreStatus(msg map[string]interface{}) (retVal *fnpsapi.CallbackResponse) {
|
||||||
|
return curDeliveryHandler.OnStoreStatus(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修改本地门店审核状态
|
||||||
|
func (c *DeliveryHandler) OnStoreStatus(msg map[string]interface{}) (retVal *fnpsapi.CallbackResponse) {
|
||||||
|
var status int = 0
|
||||||
|
if storeStatus, ok := msg["status"]; ok && storeStatus != 0 {
|
||||||
|
status = int(utils.ForceInterface2Int64(storeStatus))
|
||||||
|
} else {
|
||||||
|
status = int(utils.ForceInterface2Int64(msg["modify_status"]))
|
||||||
|
}
|
||||||
|
err := partner.CurStoreManager.OnCourierStoreStatusChanged(
|
||||||
|
jxcontext.AdminCtx,
|
||||||
|
utils.Interface2String(msg["out_shop_code"]),
|
||||||
|
model.VendorIDFengNiao,
|
||||||
|
getAuditStatus(status),
|
||||||
|
utils.Interface2String(msg["remark"]),
|
||||||
|
)
|
||||||
|
retVal = fnpsapi.Err2CallbackResponse(err, "mtps OnStoreStatus")
|
||||||
|
return retVal
|
||||||
|
}
|
||||||
|
|
||||||
|
type ChainstoreParam struct {
|
||||||
|
MerchantId string `json:"merchant_id"` // 商户id
|
||||||
|
ChainStoreId string `json:"chain_store_id"` // 蜂鸟门店id
|
||||||
|
OutShopCode string `json:"out_shop_code"` // 外部门店编码
|
||||||
|
Status string `json:"status"` // 门店认证状态
|
||||||
|
ModifyStatus string `json:"modify_status"` // 门店修改状态
|
||||||
|
Remark string `json:"remark "` // 门店认证、修改等驳回时返回原因
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,12 +2,11 @@ package fn
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
"git.rosy.net.cn/baseapi/utils"
|
||||||
"github.com/astaxie/beego/client/orm"
|
"github.com/astaxie/beego/client/orm"
|
||||||
beego "github.com/astaxie/beego/server/web"
|
beego "github.com/astaxie/beego/server/web"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/jxutils"
|
"git.rosy.net.cn/jx-callback/business/jxutils"
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
"git.rosy.net.cn/jx-callback/business/partner/delivery"
|
||||||
@@ -65,17 +64,18 @@ func (c *DeliveryHandler) GetVendorID() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
func (c *DeliveryHandler) CancelWaybill(bill *model.Waybill, cancelReasonID int, cancelReason string) (err error) {
|
||||||
err = api.FnAPI.CancelOrder(&fnpsapi.CancelOrderParam{
|
parameter := &fnpsapi.CancelOrderReq{
|
||||||
PartnerOrderCode: bill.VendorOrderID,
|
|
||||||
OrderCancelReasonCode: 1, //用户取消
|
|
||||||
OrderCancelCode: fnpsapi.OrderCancelReson9,
|
OrderCancelCode: fnpsapi.OrderCancelReson9,
|
||||||
OrderCancelTime: time.Now().UnixNano() / 1e6,
|
OrderCancelRole: 2,
|
||||||
})
|
}
|
||||||
if err != nil {
|
parameter.PartnerOrderCode = bill.VendorOrderID
|
||||||
|
|
||||||
|
if err = api.FnAPI.CancelOrder(parameter); err != nil {
|
||||||
if strings.Contains(err.Error(), "运单暂未生成") {
|
if strings.Contains(err.Error(), "运单暂未生成") {
|
||||||
err = nil
|
err = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bill.Status = model.WaybillStatusCanceled
|
bill.Status = model.WaybillStatusCanceled
|
||||||
bill.Remark = cancelReason
|
bill.Remark = cancelReason
|
||||||
partner.CurOrderManager.OnWaybillStatusChanged(bill)
|
partner.CurOrderManager.OnWaybillStatusChanged(bill)
|
||||||
@@ -90,7 +90,6 @@ func (c *DeliveryHandler) ComplaintRider(bill *model.Waybill, resonID int, reson
|
|||||||
// 创建蜂鸟配送订单
|
// 创建蜂鸟配送订单
|
||||||
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee int64) (bill *model.Waybill, err error) {
|
||||||
db := dao.GetDB()
|
db := dao.GetDB()
|
||||||
|
|
||||||
// 检查配送平台是否被禁用
|
// 检查配送平台是否被禁用
|
||||||
vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery)
|
vendorOrgCode, err := dao.GetVendorOrgCode(db, model.VendorIDFengNiao, "", model.VendorOrgTypeDelivery)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -100,84 +99,56 @@ func (c *DeliveryHandler) CreateWaybill(order *model.GoodsOrder, maxDeliveryFee
|
|||||||
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
|
return nil, fmt.Errorf("此平台配送已被系统关闭,暂不发配送 [%v]", vendorOrgCode[0].Comment)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 购物平台信息
|
// 蜂鸟入参结构体
|
||||||
storeDetail, err := dao.GetStoreDetail(db, order.StoreID, order.VendorID, order.VendorOrgCode)
|
parameter := &fnpsapi.CreateOrderReqParam{
|
||||||
// 自定义配送费
|
PartnerOrderCode: order.VendorOrderID,
|
||||||
deliveryFee, _, err := delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
OrderType: 1,
|
||||||
if err != nil {
|
PositionSource: 3,
|
||||||
return nil, err
|
ReceiverAddress: order.ConsigneeAddress,
|
||||||
}
|
ReceiverLongitude: utils.Int2Float64(order.ConsigneeLng) / 1000000,
|
||||||
if err = delivery.CallCreateWaybillPolicy(deliveryFee, maxDeliveryFee, order, model.VendorIDFengNiao); err != nil {
|
ReceiverLatitude: utils.Int2Float64(order.ConsigneeLat) / 1000000,
|
||||||
return nil, err
|
GoodsTotalAmountCent: order.SalePrice,
|
||||||
|
GoodsActualAmountCent: order.ActualPayPrice,
|
||||||
|
GoodsWeight: utils.Int2Float64(order.Weight) / 1000,
|
||||||
|
GoodsCount: order.GoodsCount,
|
||||||
|
GoodsItemList: nil,
|
||||||
|
ReceiverName: order.ConsigneeName,
|
||||||
|
ReceiverPrimaryPhone: order.ConsigneeName,
|
||||||
|
OutShopCode: utils.Int2Str(order.StoreID),
|
||||||
|
ChainStoreId: "",
|
||||||
}
|
}
|
||||||
|
|
||||||
// 蜂鸟入参结构体
|
var goodsList []*fnpsapi.GoodsItemsList
|
||||||
params := &fnpsapi.CreateOrderParam{
|
|
||||||
PartnerOrderCode: order.VendorOrderID,
|
|
||||||
NotifyURL: globals.FnNotifyURL,
|
|
||||||
ChainStoreCode: utils.Int2Str(jxutils.GetSaleStoreIDFromOrder(order)),
|
|
||||||
OrderType: 1, //即时达
|
|
||||||
TransportInfo: &fnpsapi.TransportInfo{
|
|
||||||
TransportName: order.StoreName,
|
|
||||||
TransportAddress: storeDetail.Address,
|
|
||||||
TransportLongitude: jxutils.IntCoordinate2Standard(storeDetail.Lng),
|
|
||||||
TransportLatitude: jxutils.IntCoordinate2Standard(storeDetail.Lat),
|
|
||||||
PositionSource: 3,
|
|
||||||
TransportTel: storeDetail.Tel1,
|
|
||||||
},
|
|
||||||
OrderAddTime: order.OrderCreatedAt.UnixNano() / 1e6,
|
|
||||||
OrderTotalAmount: jxutils.IntPrice2Standard(order.SalePrice),
|
|
||||||
OrderActualAmount: jxutils.IntPrice2Standard(order.ActualPayPrice),
|
|
||||||
OrderWeight: float64(jxutils.IntWeight2Float(order.Weight)),
|
|
||||||
OrderRemark: utils.FilterMb4("客户电话:" + order.ConsigneeMobile + "," + order.BuyerComment + ",取货失败或配送遇到问题请联系18048531223,禁止未配送直接完成定单!"),
|
|
||||||
IsInvoiced: 0,
|
|
||||||
OrderPaymentStatus: 1,
|
|
||||||
OrderPaymentMethod: 1,
|
|
||||||
IsAgentPayment: 0,
|
|
||||||
GoodsCount: order.GoodsCount,
|
|
||||||
ReceiverInfo: &fnpsapi.ReceiverInfo{
|
|
||||||
ReceiverName: order.ConsigneeName,
|
|
||||||
ReceiverAddress: order.ConsigneeAddress,
|
|
||||||
ReceiverLongitude: jxutils.IntCoordinate2Standard(order.ConsigneeLng),
|
|
||||||
ReceiverLatitude: jxutils.IntCoordinate2Standard(order.ConsigneeLat),
|
|
||||||
ReceiverPrimaryPhone: order.ConsigneeMobile,
|
|
||||||
ReceiverSecondPhone: order.ConsigneeMobile2,
|
|
||||||
PositionSource: 3,
|
|
||||||
},
|
|
||||||
SerialNumber: model.VendorNames[order.VendorID] + " #" + utils.Int2Str(order.OrderSeq),
|
|
||||||
}
|
|
||||||
var skuInfo []*fnpsapi.ItemsJSON
|
|
||||||
for _, v := range order.Skus {
|
for _, v := range order.Skus {
|
||||||
skuInfo = append(skuInfo, &fnpsapi.ItemsJSON{
|
goodsList = append(goodsList, &fnpsapi.GoodsItemsList{
|
||||||
ItemID: utils.Int2Str(v.SkuID),
|
|
||||||
ItemName: v.SkuName,
|
ItemName: v.SkuName,
|
||||||
ItemQuantity: v.Count,
|
ItemQuantity: v.Count,
|
||||||
ItemPrice: jxutils.IntPrice2Standard(v.SalePrice),
|
ItemAmountCent: v.SalePrice,
|
||||||
ItemActualPrice: jxutils.IntPrice2Standard(v.SalePrice),
|
ItemActualAmountCent: v.SalePrice,
|
||||||
|
ItemId: utils.Int2Str(v.SkuID),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
params.ItemsJSON = skuInfo
|
parameter.GoodsItemList = goodsList
|
||||||
|
|
||||||
//要求饿百的订单要传来源
|
//要求饿百的订单要传来源
|
||||||
if order.VendorID == model.VendorIDEBAI {
|
if order.VendorID == model.VendorIDEBAI {
|
||||||
params.OrderSource = "109"
|
parameter.OrderSource = "109"
|
||||||
params.ChannelOrderCode = order.VendorOrderID
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建蜂鸟订单
|
// 创建蜂鸟订单
|
||||||
err = api.FnAPI.CreateOrder(params)
|
if err = api.FnAPI.CreateOrder(parameter); err != nil {
|
||||||
if err != nil {
|
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, parameter, err)
|
||||||
globals.SugarLogger.Debugf("CreateWaybill failed, orderID:%s, billParams:%v, error:%v", order.VendorOrderID, params, err)
|
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询订单获取配送费
|
||||||
bill = &model.Waybill{
|
bill = &model.Waybill{
|
||||||
VendorOrderID: order.VendorOrderID,
|
VendorOrderID: order.VendorOrderID,
|
||||||
OrderVendorID: order.VendorID,
|
OrderVendorID: order.VendorID,
|
||||||
VendorWaybillID: "",
|
VendorWaybillID: "",
|
||||||
VendorWaybillID2: "",
|
VendorWaybillID2: "",
|
||||||
WaybillVendorID: model.VendorIDFengNiao,
|
WaybillVendorID: model.VendorIDFengNiao,
|
||||||
DesiredFee: deliveryFee,
|
DesiredFee: GetDesiredFee(order.VendorOrderID),
|
||||||
}
|
}
|
||||||
delivery.OnWaybillCreated(bill)
|
delivery.OnWaybillCreated(bill)
|
||||||
return bill, err
|
return bill, err
|
||||||
@@ -199,55 +170,90 @@ func (c *DeliveryHandler) getMTPSShopID(order *model.GoodsOrder, db *dao.DaoDB)
|
|||||||
return retVal, nil
|
return retVal, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 预下单获取配送费
|
||||||
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
|
func (c *DeliveryHandler) GetWaybillFee(order *model.GoodsOrder) (deliveryFeeInfo *partner.WaybillFeeInfo, err error) {
|
||||||
db := dao.GetDB()
|
preCreateOrder := &fnpsapi.PreCreateOrder{
|
||||||
deliveryFeeInfo = &partner.WaybillFeeInfo{}
|
PartnerOrderCode: order.VendorOrderID,
|
||||||
deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = delivery.CalculateOrderDeliveryFee(order, time.Now(), db)
|
OrderType: 1,
|
||||||
if err == nil {
|
PositionSource: 3,
|
||||||
if _, err = c.getMTPSShopID(order, db); err == nil {
|
ReceiverAddress: order.ConsigneeAddress,
|
||||||
deliveryFeeInfo.DeliveryFee = deliveryFeeInfo.RefDeliveryFee
|
ReceiverLongitude: utils.Int2Float64(order.ConsigneeLng) / 1000000,
|
||||||
|
ReceiverLatitude: utils.Int2Float64(order.ConsigneeLat) / 1000000,
|
||||||
|
GoodsTotalAmountCent: order.SalePrice,
|
||||||
|
GoodsActualAmountCent: order.ActualPayPrice,
|
||||||
|
GoodsWeight: utils.Int2Float64(order.Weight) / 1000,
|
||||||
|
GoodsCount: order.GoodsCount,
|
||||||
|
GoodsItemList: nil,
|
||||||
|
OutShopCode: utils.Int2Str(order.StoreID),
|
||||||
}
|
}
|
||||||
|
var goodsList []*fnpsapi.GoodsItemsList
|
||||||
|
for _, v := range order.Skus {
|
||||||
|
goodsList = append(goodsList, &fnpsapi.GoodsItemsList{
|
||||||
|
ItemName: v.SkuName,
|
||||||
|
ItemQuantity: v.Count,
|
||||||
|
ItemAmountCent: v.SalePrice,
|
||||||
|
ItemActualAmountCent: v.SalePrice,
|
||||||
|
ItemId: utils.Int2Str(v.SkuID),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
preCreateOrder.GoodsItemList = goodsList
|
||||||
|
deliveryFeeInfo.RefDeliveryFee, deliveryFeeInfo.RefAddFee, err = api.FnAPI.PreCreateByShopFn(preCreateOrder)
|
||||||
return deliveryFeeInfo, err
|
return deliveryFeeInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func OnWaybillMsg(msg *fnpsapi.WayBillInfo) {
|
func OnWaybillMsg(msg map[string]interface{}) (resp *fnpsapi.CallbackResponse) {
|
||||||
order := &model.Waybill{
|
order := &model.Waybill{
|
||||||
VendorWaybillID: utils.Int64ToStr(msg.OpenOrderCode),
|
VendorWaybillID: utils.Interface2String(msg["open_order_code"]),
|
||||||
VendorWaybillID2: msg.PartnerOrderCode,
|
VendorWaybillID2: utils.Interface2String(msg["partner_order_code"]),
|
||||||
WaybillVendorID: model.VendorIDFengNiao,
|
WaybillVendorID: model.VendorIDFengNiao,
|
||||||
CourierName: msg.CarrierDriverName,
|
CourierName: utils.Interface2String(msg["carrier_driver_name"]),
|
||||||
CourierMobile: msg.CarrierDriverPhone,
|
CourierMobile: utils.Interface2String(msg["carrier_driver_phone"]),
|
||||||
VendorStatus: utils.Int2Str(msg.OrderStatus),
|
VendorStatus: utils.Interface2String(msg["order_status"]),
|
||||||
StatusTime: utils.Timestamp2Time(msg.PushTime),
|
StatusTime: utils.Timestamp2Time(utils.MustInterface2Int64(msg["push_time"])),
|
||||||
Remark: msg.Description,
|
Remark: utils.Interface2String(msg["description"]),
|
||||||
}
|
}
|
||||||
order.VendorOrderID, order.OrderVendorID = jxutils.SplitUniversalOrderID(msg.PartnerOrderCode)
|
order.VendorOrderID, order.OrderVendorID = jxutils.SplitUniversalOrderID(order.VendorWaybillID2)
|
||||||
switch msg.OrderStatus {
|
orderStatus, err := strconv.Atoi(order.VendorStatus)
|
||||||
case fnpsapi.OrderStatusAccept:
|
if err != nil {
|
||||||
order.Status = model.WaybillStatusNew
|
globals.SugarLogger.Debugf("FNPS strconv.Atoi fail :[%s]", err)
|
||||||
case fnpsapi.OrderStatusAssigned:
|
return fnpsapi.Err2CallbackResponse(err, "")
|
||||||
|
}
|
||||||
|
switch orderStatus {
|
||||||
|
case fnpsapi.OrderStatusAcceptCreate: // 0 创建订单
|
||||||
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
||||||
order.Status = model.WaybillStatusAccepted
|
order.Status = model.WaybillStatusNew //5 带调度
|
||||||
|
case fnpsapi.OrderStatusAccept: // 1 新运单
|
||||||
|
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
||||||
|
order.Status = model.WaybillStatusNew //5 带调度
|
||||||
|
case fnpsapi.OrderStatusAssigned: //20分配骑手
|
||||||
|
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
||||||
|
order.Status = model.WaybillStatusAccepted //10
|
||||||
order.Remark = order.CourierName + "," + order.CourierMobile
|
order.Remark = order.CourierName + "," + order.CourierMobile
|
||||||
case fnpsapi.OrderStatusArrived:
|
case fnpsapi.OrderStatusArrived: // 80 到店
|
||||||
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
order.DesiredFee = GetDesiredFee(order.VendorOrderID)
|
||||||
order.Status = model.WaybillStatusCourierArrived
|
order.Status = model.WaybillStatusCourierArrived
|
||||||
case fnpsapi.OrderStatusDelivering:
|
case fnpsapi.OrderStatusDelivering: // 2 配送中
|
||||||
order.Status = model.WaybillStatusDelivering
|
order.Status = model.WaybillStatusDelivering
|
||||||
case fnpsapi.OrderStatusDelivered:
|
case fnpsapi.OrderStatusDelivered: // 3 已经送达
|
||||||
order.Status = model.WaybillStatusDelivered
|
order.Status = model.WaybillStatusDelivered
|
||||||
case fnpsapi.OrderStatusException:
|
case fnpsapi.OrderStatusAcceptCacle: // 4取消订单
|
||||||
order.Status = model.WaybillStatusDeliverFailed
|
order.Status = model.WaybillStatusAcceptCanceled
|
||||||
|
case fnpsapi.OrderStatusException: // 5 异常
|
||||||
|
order.Status = model.WaybillStatusDeliverFailed // 22
|
||||||
default:
|
default:
|
||||||
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
|
globals.SugarLogger.Warnf("onWaybillMsg unknown msg:%v", msg)
|
||||||
}
|
}
|
||||||
partner.CurOrderManager.OnWaybillStatusChanged(order)
|
if err := partner.CurOrderManager.OnWaybillStatusChanged(order); err != nil {
|
||||||
|
globals.SugarLogger.Debugf("FNPS partner.CurOrderManager.OnWaybillStatusChanged fail :[%s]", err)
|
||||||
|
return fnpsapi.Err2CallbackResponse(err, "")
|
||||||
|
}
|
||||||
|
return fnpsapi.Err2CallbackResponse(nil, "")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询订单配送费
|
||||||
func GetDesiredFee(vendorOrderID string) (desiredFee int64) {
|
func GetDesiredFee(vendorOrderID string) (desiredFee int64) {
|
||||||
if result, err := api.FnAPI.QueryOrder(vendorOrderID); err == nil {
|
if result, err := api.FnAPI.QueryOrder(vendorOrderID); err == nil {
|
||||||
return jxutils.StandardPrice2Int(result.OrderTotalDeliveryCost)
|
return result.OrderActualAmountCent
|
||||||
}
|
}
|
||||||
return desiredFee
|
return desiredFee
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,7 +91,6 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误"))
|
return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误"))
|
||||||
}
|
}
|
||||||
//order.DesiredFee, _ = delivery.CalculateBillDeliveryFee(order) // 美团外卖可能会丢失新运单事件,这里补一下
|
|
||||||
order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100)
|
order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100)
|
||||||
order.Status = model.WaybillStatusNew
|
order.Status = model.WaybillStatusNew
|
||||||
case mtpsapi.OrderStatusAccepted:
|
case mtpsapi.OrderStatusAccepted:
|
||||||
@@ -100,7 +99,6 @@ func (c *DeliveryHandler) onWaybillMsg(msg *mtpsapi.CallbackOrderMsg) (retVal *m
|
|||||||
return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误"))
|
return mtpsapi.Err2CallbackResponse(err, fmt.Sprintf("%s", "获取订单状态错误"))
|
||||||
}
|
}
|
||||||
order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100)
|
order.DesiredFee = utils.Float64TwoInt64(utils.MustInterface2Float64(data["delivery_fee"]) * 100)
|
||||||
//order.DesiredFee, _ = delivery.CalculateBillDeliveryFee(order) // 美团外卖可能会丢失新运单事件,这里补一下
|
|
||||||
order.Status = model.WaybillStatusAccepted
|
order.Status = model.WaybillStatusAccepted
|
||||||
order.Remark = order.CourierName + "," + order.CourierMobile
|
order.Remark = order.CourierName + "," + order.CourierMobile
|
||||||
case mtpsapi.OrderStatusPickedUp:
|
case mtpsapi.OrderStatusPickedUp:
|
||||||
|
|||||||
@@ -186,9 +186,10 @@ dadaIsProd = false
|
|||||||
dadaCallbackURL = "http://callback.test.jxc4.com/dadadelivery/msg"
|
dadaCallbackURL = "http://callback.test.jxc4.com/dadadelivery/msg"
|
||||||
dadaSourceID = "73753"
|
dadaSourceID = "73753"
|
||||||
|
|
||||||
fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c"
|
fnAppID = "6705486294797503379"
|
||||||
fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d"
|
fnAppSecret = "c1e6c280-e618-4103-9d0a-673bc54fb22e"
|
||||||
fnMerchantId = "20200818"
|
fnMerchantId = "5375691"
|
||||||
|
fnCode = "cabrXQf9eFMVWVYg4hNlwu"
|
||||||
fnCallbackURL = "http://callback.jxc4.com/fn/msg"
|
fnCallbackURL = "http://callback.jxc4.com/fn/msg"
|
||||||
|
|
||||||
weixinAppID = "wxbf235770edaabc5c"
|
weixinAppID = "wxbf235770edaabc5c"
|
||||||
@@ -302,9 +303,10 @@ pushAppKey = "iFrkUDmR2g5eqQpfh2kQ57"
|
|||||||
pushAppSecret = "WTn53qd6WAAdLMXfmXvzb7"
|
pushAppSecret = "WTn53qd6WAAdLMXfmXvzb7"
|
||||||
pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47"
|
pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47"
|
||||||
|
|
||||||
fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c"
|
fnAppID = "6705486294797503379"
|
||||||
fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d"
|
fnAppSecret = "c1e6c280-e618-4103-9d0a-673bc54fb22e"
|
||||||
fnMerchantId = "20200818"
|
fnMerchantId = "5375691"
|
||||||
|
fnCode = "cabrXQf9eFMVWVYg4hNlwu"
|
||||||
fnCallbackURL = "http://callback.jxc4.com/fn/msg"
|
fnCallbackURL = "http://callback.jxc4.com/fn/msg"
|
||||||
|
|
||||||
jxPrintAppID = "1000"
|
jxPrintAppID = "1000"
|
||||||
@@ -570,6 +572,7 @@ pushMasterSecret= "dGZcR0XGGg7H5Pd7FR3n47"
|
|||||||
fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c"
|
fnAppID = "6a3e2073-1850-413b-9eb7-6c342ec36e1c"
|
||||||
fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d"
|
fnAppSecret = "a8248088-a742-4c33-a0db-03aeae00ca7d"
|
||||||
fnMerchantId = "20200818"
|
fnMerchantId = "20200818"
|
||||||
|
fnCode = "cabrXQf9eFMVWVYg4hNlwu"
|
||||||
fnCallbackURL = "http://callback.beta.jxc4.com/fn/msg"
|
fnCallbackURL = "http://callback.beta.jxc4.com/fn/msg"
|
||||||
|
|
||||||
jxPrintAppID = "1000"
|
jxPrintAppID = "1000"
|
||||||
|
|||||||
@@ -1,17 +1,11 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"git.rosy.net.cn/baseapi/platformapi/fnpsapi"
|
||||||
|
|
||||||
"git.rosy.net.cn/baseapi/utils"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals"
|
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/business/partner/delivery/fn"
|
"git.rosy.net.cn/jx-callback/business/partner/delivery/fn"
|
||||||
|
|
||||||
"git.rosy.net.cn/jx-callback/globals/api"
|
"git.rosy.net.cn/jx-callback/globals/api"
|
||||||
|
|
||||||
"github.com/astaxie/beego/server/web"
|
"github.com/astaxie/beego/server/web"
|
||||||
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
type FnController struct {
|
type FnController struct {
|
||||||
@@ -20,12 +14,32 @@ type FnController struct {
|
|||||||
|
|
||||||
func (c *FnController) Msg() {
|
func (c *FnController) Msg() {
|
||||||
if c.Ctx.Input.Method() == http.MethodPost {
|
if c.Ctx.Input.Method() == http.MethodPost {
|
||||||
msg := api.FnAPI.GetOrderCallbackMsg(c.Ctx.Input.RequestBody)
|
msg, callbackResponse := api.FnAPI.GetChainstoreStatusNotify(c.Ctx.Request)
|
||||||
if msg != nil {
|
if callbackResponse.Code != 1 {
|
||||||
globals.SugarLogger.Debugf("%v", string(utils.MustMarshal(msg)))
|
c.Data["json"] = callbackResponse
|
||||||
fn.OnWaybillMsg(msg)
|
c.ServeJSON()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
c.Data["json"] = ""
|
|
||||||
|
switch msg["callback_business_type"] {
|
||||||
|
case fnpsapi.ChainstoreStatus: // 门店状态变更回调
|
||||||
|
callbackResponse = fn.OnStoreStatus(msg)
|
||||||
|
break
|
||||||
|
case fnpsapi.AbnormalStatus: // 异常报备回调
|
||||||
|
case fnpsapi.CookingFinishStatus: // 商户出餐回调
|
||||||
|
break
|
||||||
|
case fnpsapi.ChainstoreServiceStatus: // 门店采购服务变更回调
|
||||||
|
break
|
||||||
|
case fnpsapi.NoServiceStatus: // 城市屏蔽区域调整回调通知
|
||||||
|
break
|
||||||
|
case fnpsapi.OrderStatus: // 订单状态回调
|
||||||
|
fn.OnWaybillMsg(msg)
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
c.Data["json"] = callbackResponse
|
||||||
c.ServeJSON()
|
c.ServeJSON()
|
||||||
} else {
|
} else {
|
||||||
c.Abort("404")
|
c.Abort("404")
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ func Init() {
|
|||||||
AliPayAPI = alipayapi.New(alipayAppID, []byte(beego.AppConfig.DefaultString("alipayPrivateKey", "")))
|
AliPayAPI = alipayapi.New(alipayAppID, []byte(beego.AppConfig.DefaultString("alipayPrivateKey", "")))
|
||||||
}
|
}
|
||||||
|
|
||||||
FnAPI = fnpsapi.New(beego.AppConfig.DefaultString("fnAppID", ""), beego.AppConfig.DefaultString("fnAppSecret", ""))
|
FnAPI = fnpsapi.New(beego.AppConfig.DefaultString("fnAppID", ""), beego.AppConfig.DefaultString("fnAppSecret", ""), beego.AppConfig.DefaultString("fnMerchantId", ""), beego.AppConfig.DefaultString("fnCode", ""))
|
||||||
FeieAPI = feieapi.New(beego.AppConfig.DefaultString("feieUser", ""), beego.AppConfig.DefaultString("feieKey", ""))
|
FeieAPI = feieapi.New(beego.AppConfig.DefaultString("feieUser", ""), beego.AppConfig.DefaultString("feieKey", ""))
|
||||||
XiaoWMAPI = xiaowmapi.New(beego.AppConfig.DefaultInt("xiaoWMAppID", 0), beego.AppConfig.DefaultString("xiaoWMAppKey", ""))
|
XiaoWMAPI = xiaowmapi.New(beego.AppConfig.DefaultInt("xiaoWMAppID", 0), beego.AppConfig.DefaultString("xiaoWMAppKey", ""))
|
||||||
YilianyunAPI = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID", ""), beego.AppConfig.DefaultString("yilianyunClientSecret", ""))
|
YilianyunAPI = yilianyunapi.New(beego.AppConfig.DefaultString("yilianyunClientID", ""), beego.AppConfig.DefaultString("yilianyunClientSecret", ""))
|
||||||
|
|||||||
Reference in New Issue
Block a user