Files
jx-callback/business/partner/purchase/jdshop/order.go
2020-09-15 15:43:59 +08:00

244 lines
9.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package jdshop
import (
"fmt"
"net/http"
"strings"
"time"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/baseapi"
"git.rosy.net.cn/baseapi/platformapi"
"git.rosy.net.cn/baseapi/platformapi/jdshopapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/jxutils/jxcontext"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/partner"
"git.rosy.net.cn/jx-callback/globals/api"
)
func (p *PurchaseHandler) AcceptOrRefuseFailedGetOrder(ctx *jxcontext.Context, order *model.GoodsOrder, isAcceptIt bool) (err error) {
return err
}
func (p *PurchaseHandler) Map2Order(orderData map[string]interface{}) (order *model.GoodsOrder) {
result := &jdshopapi.AllOrdersResult{}
utils.Map2StructByJson(orderData, &result, false)
jdsOrder := result.OrderList[0]
order = &model.GoodsOrder{
VendorOrderID: utils.Int64ToStr(jdsOrder.OrderID),
VendorID: model.VendorIDJDShop,
BaseFreightMoney: jxutils.StandardPrice2Int(jdsOrder.Freight),
VendorStatus: utils.Int2Str(jdsOrder.OrderStatus),
VendorUserID: jdsOrder.UserPin,
BuyerComment: jdsOrder.UserRemark,
PickDeadline: utils.DefaultTimeValue,
OriginalData: string(utils.MustMarshal(jdsOrder)),
}
return order
}
func (p *PurchaseHandler) GetOrder(vendorOrgCode, vendorOrderID string) (order *model.GoodsOrder, err error) {
resultOrders, err := api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
OrderID: vendorOrderID,
Current: 1,
PageSize: 1,
})
return p.Map2Order(utils.Struct2FlatMap(resultOrders)), err
}
func (p *PurchaseHandler) GetOrderStatus(vendorOrgCode, vendorOrderID string) (status int, err error) {
jdsOrder, err := GetJdsOrder(vendorOrderID)
return status2Jxstatus(jdsOrder.OrderState), err
}
func (p *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptIt bool, userName string) (err error) {
var status int
if isAcceptIt {
status = model.OrderStatusAccepted
} else {
status = model.OrderStatusCanceled
}
return ChangeOrderStatus(order.VendorOrderID, status, "")
}
func (p *PurchaseHandler) PickupGoods(order *model.GoodsOrder, isSelfDelivery bool, userName string) (err error) {
status, err := p.GetOrderStatus("", order.VendorOrderID2)
//说明此时该订单在平台上已经取消了
if status == model.OrderStatusCanceled {
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, "订单在京东商城已被取消!")
} else {
err = ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinishedPickup, "自动拣货完成")
err = p.OrderExport(jxcontext.AdminCtx, order.VendorOrderID, order.VendorWaybillID, true)
}
return err
}
func (p *PurchaseHandler) CallCourier(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) {
return err
} // 取货失败后再次招唤平台配送
func (p *PurchaseHandler) ConfirmReceiveGoods(ctx *jxcontext.Context, order *model.GoodsOrder) (err error) {
return err
} // 投递失败后确认收到退货
func (p *PurchaseHandler) CanSwitch2SelfDeliver(order *model.GoodsOrder) (isCan bool, err error) {
return isCan, err
}
func (p *PurchaseHandler) Swtich2SelfDeliver(order *model.GoodsOrder, userName string) (err error) {
return err
}
func (p *PurchaseHandler) Swtich2SelfDelivered(order *model.GoodsOrder, userName string) (err error) {
return err
}
func (p *PurchaseHandler) SelfDeliverDelivering(order *model.GoodsOrder, userName string) (err error) {
ChangeOrderStatus(order.VendorOrderID, model.OrderStatusDelivering, "")
return err
}
func (p *PurchaseHandler) SelfDeliverDelivered(order *model.GoodsOrder, userName string) (err error) {
ChangeOrderStatus(order.VendorOrderID, model.OrderStatusFinished, "")
return err
}
func (p *PurchaseHandler) GetOrderRealMobile(ctx *jxcontext.Context, order *model.GoodsOrder) (mobile string, err error) {
return mobile, err
}
func (p *PurchaseHandler) ReplyOrderComment(ctx *jxcontext.Context, vendorOrgCode string, orderComment *model.OrderComment, replyComment string) (err error) {
return err
}
func (p *PurchaseHandler) AgreeOrRefuseCancel(ctx *jxcontext.Context, order *model.GoodsOrder, isAgree bool, reason string) (err error) {
return err
}
func (p *PurchaseHandler) CancelOrder(ctx *jxcontext.Context, order *model.GoodsOrder, reason string) (err error) {
ChangeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, reason)
if order.EclpOutID != "" {
_, err = api.JdEclpAPI.CancelOrder(order.EclpOutID)
}
return err
}
func (p *PurchaseHandler) AdjustOrder(ctx *jxcontext.Context, order *model.GoodsOrder, removedSkuList []*model.OrderSku, reason string) (err error) {
var (
db = dao.GetDB()
diffShopPrice int64
diffSalePrice int64
)
if order.Status >= model.OrderStatusDelivering {
return fmt.Errorf("配送中以后的订单无法进行售前退款!")
}
//1、删除原order_sku 中售前调整的商品
for _, sku := range removedSkuList {
sql := `DELETE FROM order_sku WHERE vendor_order_id = ? AND vendor_id = ? AND sku_id = ?`
sqlParams := []interface{}{order.VendorOrderID, order.VendorID, sku.SkuID}
dao.ExecuteSQL(db, sql, sqlParams)
diffShopPrice += sku.ShopPrice
diffSalePrice += sku.SalePrice
}
//2、修改goods_order 中的shopprice,若是扣点的订单还要改new_earning_price和total_shop_money
order.AdjustCount += 1
order.ShopPrice = order.ShopPrice - diffShopPrice
if order.EarningType == model.EarningTypePoints {
order.TotalShopMoney = utils.Float64TwoInt64(float64(float64(order.TotalShopMoney)/jdshopapi.JdsPayPercentage-float64(diffSalePrice)) * jdshopapi.JdsPayPercentage)
jxutils.RefreshOrderEarningPrice2(order, order.OrderPayPercentage)
partner.CurOrderManager.UpdateOrderFields(order, []string{"TotalShopMoney", "NewEarningPrice"})
}
partner.CurOrderManager.UpdateOrderFields(order, []string{"AdjustCount", "ShopPrice"})
return err
}
func (p *PurchaseHandler) GetJdsOrders(ctx *jxcontext.Context, orderCreatedStart, orderCreatedEnd string, current, pageSize int) (orderResult *jdshopapi.AllOrdersResult, err error) {
orderResult, err = api.JdShopAPI.AllOrders(&jdshopapi.AllOrdersParam{
Current: current,
PageSize: pageSize,
OrderCreateDateRange: []string{orderCreatedStart, orderCreatedEnd},
})
return orderResult, err
}
func ChangeOrderStatus(vendorOrderID string, status int, remark string) (err error) {
orderStatus := &model.OrderStatus{
VendorOrderID: vendorOrderID,
VendorID: model.VendorIDJDShop,
OrderType: model.OrderTypeOrder,
RefVendorOrderID: vendorOrderID,
RefVendorID: model.VendorIDJDShop,
VendorStatus: utils.Int2Str(status),
Status: status,
StatusTime: time.Now(),
Remark: remark,
}
jxutils.CallMsgHandlerAsync(func() {
err = partner.CurOrderManager.OnOrderStatusChanged("", orderStatus)
}, jxutils.ComposeUniversalOrderID(vendorOrderID, model.VendorIDJDShop))
return err
}
func (p *PurchaseHandler) OrderExport(ctx *jxcontext.Context, vendorOrderID, vendorWaybillID string, isAuto bool) (err error) {
companyID := jdshopapi.JdsDeliveryCompany3rd
//表示是门店手动发京东
if !isAuto {
companyID = jdshopapi.JdsDeliveryCompanyJD
}
err = api.JdShopAPI.OrderShipment(utils.Str2Int64(vendorOrderID[:12]), companyID, vendorWaybillID)
return err
}
func (p *PurchaseHandler) OrderTransfer(ctx *jxcontext.Context, vendorOrderID, vendorWaybillID string, isAuto bool) (err error) {
companyID := jdshopapi.JdsDeliveryCompany3rd
//表示是门店手动发京东
if !isAuto {
companyID = jdshopapi.JdsDeliveryCompanyJD
}
err = api.JdShopAPI.UpdateWaybill(vendorOrderID[:12], companyID, vendorOrderID)
return err
}
func status2Jxstatus(status string) (statusJx int) {
if status == jdshopapi.OrderStatusPopPause || status == jdshopapi.OrderStatusPause {
statusJx = model.OrderStatusNew
} else if status == jdshopapi.OrderStatusWait {
statusJx = model.OrderStatusAccepted
} else if status == jdshopapi.OrderStatusCancel {
statusJx = model.OrderStatusCanceled
}
return statusJx
}
const (
ProdURL = "http://116.196.82.188:8080/v2/"
)
func apiToYd(url string, params map[string]interface{}) (retVal map[string]interface{}, err error) {
cl := &http.Client{}
err = platformapi.AccessPlatformAPIWithRetry(cl,
func() *http.Request {
request, _ := http.NewRequest(http.MethodPost, ProdURL+url, strings.NewReader(utils.Map2URLValues(params).Encode()))
request.Header.Set("Content-Type", "application/x-www-form-urlencoded")
return request
},
nil,
func(response *http.Response, bodyStr string, jsonResult1 map[string]interface{}) (errLevel string, err error) {
if jsonResult1 == nil {
return platformapi.ErrLevelRecoverableErr, fmt.Errorf("mapData is nil")
}
if err == nil {
if jsonResult1["code"] != nil {
if utils.Interface2Int64WithDefault(jsonResult1["code"], 0) != 0 {
errLevel = platformapi.ErrLevelGeneralFail
err = utils.NewErrorCode(jsonResult1["desc"].(string), jsonResult1["code"].(string))
baseapi.SugarLogger.Debugf("yd AccessAPI failed, jsonResult1:%s", utils.Format4Output(jsonResult1, true))
}
}
retVal = jsonResult1
}
return errLevel, err
})
return retVal, err
}
func GetJdsOrder(vendorOrderID string) (jdsOrder *jdshopapi.GetOrderResult, err error) {
params := make(map[string]interface{})
params["orderID"] = vendorOrderID
params["token"] = jdshopapi.JdsYdToken
result, err := apiToYd("order/GetJdsOrder", params)
jdsOrder2 := &jdshopapi.GetOrderResult{}
err = utils.UnmarshalUseNumber([]byte(strings.ReplaceAll(result["data"].(string), "\\", "")), &jdsOrder2)
return jdsOrder2, err
}