244 lines
9.5 KiB
Go
244 lines
9.5 KiB
Go
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.VendorOrderID, 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
|
||
}
|