Merge remote-tracking branch 'origin/mark' into su

This commit is contained in:
苏尹岚
2020-03-24 10:58:50 +08:00
10 changed files with 337 additions and 93 deletions

View File

@@ -45,7 +45,8 @@ const (
wxAppID = "wx4b5930c13f8b1170"
autoCancelOrderReason = "支付超时,系统自动取消!"
autoCancelOrderReason = "支付超时,系统自动取消!"
cancelMatterOrderReason = "失败重发!"
)
type JxSkuInfo struct {
@@ -198,6 +199,9 @@ func CreateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64,
if err != nil {
return nil, err
}
if fromStoreID != 0 {
checkMatterDeliveryAddress(deliveryAddress)
}
if createType != OrderCreateTypePre {
if outJxOrder.TotalPrice != jxOrder.TotalPrice {
return nil, fmt.Errorf("商品或配送信息发生改变,请重新下单")
@@ -775,6 +779,7 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd
order.FromStoreID = jxOrder.FromStoreID
order.WaybillVendorID = model.VendorIDJDWL
order.DeliveryFlag = model.OrderDeliveryFlagMaskScheduleDisabled
order.ConsigneeAddress = deliveryAddress.Address
order.Flag = 1
}
return order, err
@@ -863,23 +868,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
}
dao.CreateEntity(db, waybill)
} else { //如果重量超过5kg则需要进行拆单分包商品分包规则。最后一个包不超过5kg,其他包不超过3kg
jxOrder := &JxOrderInfo{}
jxOrder.StoreID = order.StoreID
weight := 0
var skus []*JxSkuInfo
for _, v := range orderSkus {
weight += v.Weight * v.Count
sku := &JxSkuInfo{}
sku.SkuID = v.SkuID
sku.SalePrice = v.SalePrice
sku.Name = v.SkuName
sku.Weight = v.Weight
sku.Count = v.Count
skus = append(skus, sku)
}
jxOrder.Skus = skus
jxOrder.Weight = weight
outOrders, _, _ := tryToSplitMatterOrder(jxOrder)
outOrders, _, _ := tryToSplitMatterOrder(buildJxOrderInfo(order, orderSkus))
//以下为仿照CreateOrder改了一些参数
for k, v := range outOrders {
outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, v, order.AddressID, order.FromStoreID, order.UserID)
@@ -888,6 +877,7 @@ func orderSolutionForWuLiao(order *model.GoodsOrder) (err error) {
}
//分包后的子订单ID默认是后面加两位目前的规则要改的话要注意取消订单那的判断
outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + int64(k+1)
checkMatterDeliveryAddress(deliveryAddress)
order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID)
if err = err2; err == nil {
order2.AddressID = order.AddressID
@@ -976,10 +966,7 @@ func CancelMatterOrder(db *dao.DaoDB, order *model.GoodsOrder, reason string) (e
}
_, err = api.JdEclpAPI.CancelOrder(order.EclpOutID)
} else {
var goodsList []*model.GoodsOrder
sql := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ?"
sqlParams := []interface{}{order.VendorOrderID + "0%", order.VendorOrderID + "1%", model.VendorIDJX}
err = dao.GetRows(db, &goodsList, sql, sqlParams)
goodsList, err := dao.GetMatterChildOrders(db, order.VendorOrderID)
if err == nil && len(goodsList) > 0 {
for _, v := range goodsList {
_, err = api.JdEclpAPI.CancelOrder(v.EclpOutID)
@@ -1230,49 +1217,58 @@ func GetHalfHoursList() (strs []string) {
return strs
}
func RefreshAllMatterOrderStatus() (err error) {
func RefreshAllMatterOrderStatus(ctx *jxcontext.Context) (err error) {
var (
db = dao.GetDB()
goodsList []*model.GoodsOrder
realTime time.Time
)
realTime = time.Now().AddDate(0, 0, -3)
realTime = time.Now().AddDate(0, 0, -7)
//有分包的主订单
sql := `
SELECT * FROM goods_order WHERE store_id = 666666 AND order_created_at >= ? AND status <> ? AND vendor_id = ? AND eclp_out_id = '' AND LENGTH(vendor_order_id) = 14
SELECT * FROM goods_order WHERE store_id = 666666 AND order_created_at >= ? AND status <> ? AND vendor_id = ? AND LENGTH(vendor_order_id) = 14
`
sqlParams := []interface{}{realTime, model.OrderStatusFinished, model.VendorIDJX}
err = dao.GetRows(db, &goodsList, sql, sqlParams)
for _, v := range goodsList {
var (
goodsList2 []*model.GoodsOrder
finishedCount int
)
sql2 := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ? AND eclp_out_id <> '' AND LENGTH(vendor_order_id) = 16"
sqlParams2 := []interface{}{v.VendorOrderID + "0%", v.VendorOrderID + "1%", model.VendorIDJX}
err = dao.GetRows(db, &goodsList2, sql2, sqlParams2)
for _, vv := range goodsList2 {
if vv.Status != model.OrderStatusFinished {
queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(vv.EclpOutID)
if len(queryOrderStatus.OrderStatusList) > 0 {
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
if v.EclpOutID == "" {
var (
goodsList2 []*model.GoodsOrder
cancelCount int
deliveringCount int
)
sql2 := "SELECT * FROM goods_order WHERE vendor_order_id LIKE ? OR vendor_order_id LIKE ? AND vendor_id = ? AND eclp_out_id <> '' AND LENGTH(vendor_order_id) = 16"
sqlParams2 := []interface{}{v.VendorOrderID + "0%", v.VendorOrderID + "1%", model.VendorIDJX}
err = dao.GetRows(db, &goodsList2, sql2, sqlParams2)
for _, vv := range goodsList2 {
if vv.Status < model.OrderStatusFinished {
queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(vv.EclpOutID)
if len(queryOrderStatus.OrderStatusList) > 0 {
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
vv.Status = model.OrderStatusFinished
dao.UpdateEntity(db, vv, "Status")
waybills, err := dao.GetWaybills(db, vv.VendorOrderID)
if err == nil && len(waybills) > 0 {
waybills[0].Status = model.WaybillStatusDelivered
dao.UpdateEntity(db, waybills[0], "Status")
}
}()
vv.Status = model.OrderStatusFinished
dao.UpdateEntity(db, vv, "Status")
finishedCount++
dao.Commit(db)
dao.Commit(db)
changeOrderStatus(vv.VendorOrderID, model.OrderStatusFinished, "")
} else {
deliveringCount++
}
}
} else if vv.Status == model.OrderStatusCanceled {
cancelCount++
}
} else {
finishedCount++
}
}
if finishedCount == len(goodsList2) {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
@@ -1280,9 +1276,38 @@ func RefreshAllMatterOrderStatus() (err error) {
panic(r)
}
}()
v.Status = model.OrderStatusFinished
if deliveringCount == 0 {
v.Status = model.OrderStatusFinished
} else {
if cancelCount == len(goodsList2) {
v.Status = model.OrderStatusCanceled
}
}
dao.UpdateEntity(db, v, "Status")
dao.Commit(db)
changeOrderStatus(v.VendorOrderID, v.Status, "")
} else {
queryOrderStatus, _ := api.JdEclpAPI.QueryOrderStatus(v.EclpOutID)
if len(queryOrderStatus.OrderStatusList) > 0 {
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10034 {
dao.Begin(db)
defer func() {
if r := recover(); r != nil {
dao.Rollback(db)
panic(r)
}
}()
v.Status = model.OrderStatusFinished
dao.UpdateEntity(db, v, "Status")
waybills, err := dao.GetWaybills(db, v.VendorOrderID)
if err == nil && len(waybills) > 0 {
waybills[0].Status = model.WaybillStatusDelivered
dao.UpdateEntity(db, waybills[0], "Status")
}
dao.Commit(db)
changeOrderStatus(v.VendorOrderID, model.OrderStatusFinished, "")
}
}
}
}
return err
@@ -1342,7 +1367,13 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result
}()
order.Status = model.OrderStatusFinished
dao.UpdateEntity(db, order, "Status")
waybills, err := dao.GetWaybills(db, vendorOrderID)
if err == nil && len(waybills) > 0 {
waybills[0].Status = model.WaybillStatusDelivered
dao.UpdateEntity(db, waybills[0], "Status")
}
dao.Commit(db)
changeOrderStatus(vendorOrderID, model.OrderStatusFinished, "")
}
}
if len(getTrackMessagePlusByOrderResult.ResultData) > 0 {
@@ -1360,9 +1391,7 @@ func GetMatterOrderStatus(ctx *jxcontext.Context, vendorOrderID string) (result
break
}
}
sql := "SELECT * FROM waybill WHERE vendor_order_id = ?"
sqlParams := []interface{}{vendorOrderID}
err = dao.GetRows(db, &waybills, sql, sqlParams)
waybills, err = dao.GetWaybills(db, vendorOrderID)
if len(waybills) > 0 {
waybills[0].VendorWaybillID = waybillCode
waybills[0].CourierName = cName
@@ -1486,3 +1515,110 @@ func buildOutOrderSkus(weightp *JxSkuInfo2, outOrder *JxOrderInfo) {
outOrder.Skus = append(outOrder.Skus, jxOrderChange(weightp))
}
}
func checkMatterDeliveryAddress(deliveryAddress *dao.UserDeliveryAddressEx) {
var (
db = dao.GetDB()
)
if !strings.Contains(deliveryAddress.Address, "区") {
deliveryAddress.Address = deliveryAddress.DistrictName + deliveryAddress.Address
}
if !strings.Contains(deliveryAddress.Address, "市") {
deliveryAddress.Address = deliveryAddress.CityName + deliveryAddress.Address
}
if !strings.Contains(deliveryAddress.Address, "省") {
if place1, err := dao.GetPlaceByCode(db, deliveryAddress.CityCode); err == nil {
if place2, err2 := dao.GetPlaceByCode(db, place1.ParentCode); err2 == nil {
deliveryAddress.Address = place2.Name + deliveryAddress.Address
}
}
}
}
func SendFailedMatterOrder(ctx *jxcontext.Context, vendorOrderID string) (err error) {
var (
db = dao.GetDB()
)
order, err := partner.CurOrderManager.LoadOrder(vendorOrderID, model.VendorIDJX)
if err != nil {
return err
}
if order == nil || order.StoreID != model.MatterStoreID || order.FromStoreID == 0 {
return fmt.Errorf("只允许物料店重发物料订单调用此接口!")
}
queryOrderStatus, err := api.JdEclpAPI.QueryOrderStatus(order.EclpOutID)
if len(queryOrderStatus.OrderStatusList) > 0 {
if queryOrderStatus.OrderStatusList[len(queryOrderStatus.OrderStatusList)-1].SoStatusCode == jdeclpapi.SoStatusCode10022 { //表示该订单在京东物流为暂停
if len(order.VendorOrderID) == 14 && order.EclpOutID != "" { //这是不分包的订单
_, err = createMatterOrder(buildJxOrderInfo(order, order.Skus), order, int64(00))
err = CancelMatterOrder(db, order, cancelMatterOrderReason)
changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason)
for _, v := range order.Skus {
cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID)
}
} else if len(order.VendorOrderID) == 14 && order.EclpOutID == "" { //这是分包的主订单
goodsList, err := dao.GetMatterChildOrders(db, order.VendorOrderID)
if err != nil {
return err
}
if len(goodsList) > 0 {
for _, v := range goodsList {
cOrder, err := partner.CurOrderManager.LoadOrder(v.VendorOrderID, model.VendorIDJX)
if err != nil {
return err
}
suffix := utils.Str2Int64(cOrder.VendorOrderID[len(cOrder.VendorOrderID)-2:]) + int64(len(goodsList))
_, err = createMatterOrder(buildJxOrderInfo(cOrder, cOrder.Skus), cOrder, suffix)
for _, v := range cOrder.Skus {
cms.RefreshMatterStock(jxcontext.AdminCtx, v.SkuID)
}
}
}
err = CancelMatterOrder(db, order, cancelMatterOrderReason)
changeOrderStatus(order.VendorOrderID, model.OrderStatusCanceled, cancelMatterOrderReason)
} else if len(order.VendorOrderID) == 16 && order.EclpOutID != "" { // 这是分包的子订单
return fmt.Errorf("请重发主订单!主订单号:[%v]", order.VendorOrderID[len(order.VendorOrderID)-2:])
}
} else {
return fmt.Errorf("只允许物流订单为暂停才能调用此接口!")
}
}
return err
}
func createMatterOrder(jxOrder *JxOrderInfo, order *model.GoodsOrder, newOrderIDSuffix int64) (order2 *model.GoodsOrder, err error) {
outJxOrder, deliveryAddress, err := generateOrder(jxcontext.AdminCtx, jxOrder, order.AddressID, order.FromStoreID, order.UserID)
if err != nil {
return nil, err
}
outJxOrder.OrderID = utils.Str2Int64(order.VendorOrderID)*100 + newOrderIDSuffix
checkMatterDeliveryAddress(deliveryAddress)
order2, err2 := jxOrder2GoodsOrder(jxcontext.AdminCtx, outJxOrder, deliveryAddress, order.UserID)
if err = err2; err == nil {
order2.AddressID = order.AddressID
order2.Status = model.OrderStatusDelivering
err = partner.CurOrderManager.OnOrderNew(order2, model.Order2Status(order2))
err = orderSolutionForWuLiao(order2)
}
return order2, err
}
func buildJxOrderInfo(order *model.GoodsOrder, orderSkus []*model.OrderSku) (jxOrder *JxOrderInfo) {
jxOrder = &JxOrderInfo{}
jxOrder.StoreID = order.StoreID
weight := 0
var skus []*JxSkuInfo
for _, v := range orderSkus {
weight += v.Weight * v.Count
sku := &JxSkuInfo{}
sku.SkuID = v.SkuID
sku.SalePrice = v.SalePrice
sku.Name = v.SkuName
sku.Weight = v.Weight
sku.Count = v.Count
skus = append(skus, sku)
}
jxOrder.Skus = skus
jxOrder.Weight = weight
return jxOrder
}