package bidding import ( "errors" "git.rosy.net.cn/baseapi/platformapi/ali_logistics_query" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxcallback/orderman" "git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/partner" "git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals/api" "time" ) func LoadingLogistics(paramLogistic []*model.UpdateMaterialLogistic) []error { var param []*model.UpdateMaterialLogistic if len(paramLogistic) == 0 || paramLogistic == nil { param = GetLogisticOrder() } else { param = paramLogistic } var db = dao.GetDB() var errList = make([]error, 0, 0) for _, logistics := range param { // 获取当前订单物流状态 statusList, err := orderman.FixedOrderManager.GetLogisticsOrderStatusList(logistics.OrderId, logistics.LogisticId, 9) if err != nil { errList = append(errList, err) continue } // 获取当前订单三方配送物流 logisticsList, err := api.LogisticsApi.GetLogisticsInfo(logistics.LogisticId) if err != nil { errList = append(errList, err) continue } // 新订单,本地暂无物流信息,全部更新远端物流信息到本地 if len(logisticsList.Info[0].LogisticsTraceDetailList) == model.NO { errList = append(errList, errors.New("运单号[%s]:已经过期/新订单暂无物流推送信息")) continue } var orderStatus = make([]*model.OrderStatus, 0, 0) goodsOrderStatus := 0 for _, v := range logisticsList.Info[0].LogisticsTraceDetailList { orderStatusToLocal := &model.OrderStatus{ VendorOrderID: logisticsList.Info[0].MailNo, VendorID: model.VendorIDTotalWl, OrderType: model.OrderTypeWaybill, RefVendorOrderID: logistics.OrderId, RefVendorID: model.VendorIDJX, VendorStatus: v.SubLogisticsStatus, StatusTime: time.Time{}, DuplicatedCount: 0, Remark: v.Desc, ModelTimeInfo: model.ModelTimeInfo{CreatedAt: time.Now(), UpdatedAt: time.Now()}, } switch v.SubLogisticsStatus { case ali_logistics_query.LogisticsStatusRECEVIE: orderStatusToLocal.Status = model.WaybillStatusNew // 新订单 goodsOrderStatus = model.OrderStatusNew // 新订单 case ali_logistics_query.LogisticsStatusWAIT_ACCEPT: orderStatusToLocal.Status = model.WaybillStatusAccepted // 分配骑手 goodsOrderStatus = model.OrderStatusAccepted // 拣货完成等待骑手 case ali_logistics_query.LogisticsStatusACCEPT: orderStatusToLocal.Status = model.WaybillStatusCourierArrived // 兼容骑手取货状态 goodsOrderStatus = model.OrderStatusFinishedPickup case ali_logistics_query.LogisticsStatusTRANSPORT, ali_logistics_query.LogisticsStatusSEND_ON, ali_logistics_query.LogisticsStatusARRIVE_CITY, ali_logistics_query.LogisticsStatusDELIVERING: orderStatusToLocal.Status = model.WaybillStatusDelivering // 配送中 goodsOrderStatus = model.OrderStatusDelivering case ali_logistics_query.LogisticsStatusAGENT_SIGN, ali_logistics_query.LogisticsStatusSIGN, ali_logistics_query.LogisticsStatusSTA_SIGN: orderStatusToLocal.Status = model.WaybillStatusDelivered // 配送结束 goodsOrderStatus = model.OrderStatusFinished default: // 剩余状态全部为异常状态,除非新加状态 orderStatusToLocal.Status = model.WaybillStatusUnknown // 异常配送 goodsOrderStatus = model.OrderStatusDeliverFailed // 投递失败 } orderStatusToLocal.StatusTime = utils.Timestamp2Time(v.Time) orderStatus = append(orderStatus, orderStatusToLocal) } if len(statusList) == 0 || statusList == nil { // 本地订单状态为空不存在 for _, v := range orderStatus { if err := dao.CreateEntity(db, v); err != nil { errList = append(errList, err) continue } } } else { for _, v := range orderStatus { if statusList[len(statusList)-1].StatusTime.Unix() > v.StatusTime.Unix() && checkOrderStatus(statusList[len(statusList)-1].VendorStatus) { continue } if err := dao.CreateEntity(db, v); err != nil { errList = append(errList, err) continue } } } // 获取当前订单运单状态 wayBill, err := dao.GetWaybills(db, logistics.OrderId, nil) if err != nil { errList = append(errList, err) continue } status := orderStatus[len(orderStatus)-1].Status vendorStatus := orderStatus[len(orderStatus)-1].VendorStatus statusTime := orderStatus[len(orderStatus)-1].StatusTime if len(wayBill) == 0 || wayBill == nil { wayBillObj := &model.Waybill{ VendorWaybillID: logistics.LogisticId, WaybillVendorID: model.VendorIDTotalWl, VendorOrderID: logistics.OrderId, OrderVendorID: model.VendorIDJX, CourierName: logisticsList.Info[0].Courier, CourierMobile: logisticsList.Info[0].CourierPhone, Status: status, VendorStatus: vendorStatus, ActualFee: logistics.LogisticFee, DesiredFee: logistics.LogisticFee, DeliveryFlag: model.OrderDeliveryFlagMaskScheduleDisabled, WaybillCreatedAt: time.Now(), StatusTime: statusTime, ModelTimeInfo: model.ModelTimeInfo{CreatedAt: time.Now(), UpdatedAt: time.Now()}, WaybillFinishedAt: time.Now(), } if err := dao.CreateEntity(db, wayBillObj); err != nil { errList = append(errList, err) continue } } else { wayBill[0].UpdatedAt = time.Now() wayBill[0].Status = status wayBill[0].VendorStatus = vendorStatus wayBill[0].StatusTime = statusTime wayBill[0].WaybillFinishedAt = time.Now() if _, err := dao.UpdateEntity(db, wayBill[0], "Status", "UpdatedAt", "VendorStatus", "StatusTime"); err != nil { errList = append(errList, err) continue } } // 更新订单状态 goodsOrder, err := partner.CurOrderManager.LoadOrder(logistics.OrderId, model.VendorIDJX) if err != nil { errList = append(errList, err) continue } goodsOrder.Status = goodsOrderStatus goodsOrder.VendorStatus = vendorStatus goodsOrder.StatusTime = statusTime if orderStatus[len(orderStatus)-1].Status >= model.OrderStatusEndBegin { goodsOrder.OrderFinishedAt = time.Now() } if _, err := dao.UpdateEntity(db, goodsOrder, "Status", "VendorStatus", "StatusTime", "OrderFinishedAt"); err != nil { errList = append(errList, err) continue } } return errList } func checkOrderStatus(orderStatus string) bool { switch orderStatus { case ali_logistics_query.LogisticsStatusRECEVIE: return true case ali_logistics_query.LogisticsStatusWAIT_ACCEPT: return true case ali_logistics_query.LogisticsStatusACCEPT: return true case ali_logistics_query.LogisticsStatusTRANSPORT, ali_logistics_query.LogisticsStatusSEND_ON, ali_logistics_query.LogisticsStatusARRIVE_CITY, ali_logistics_query.LogisticsStatusDELIVERING: return true case ali_logistics_query.LogisticsStatusAGENT_SIGN, ali_logistics_query.LogisticsStatusSIGN, ali_logistics_query.LogisticsStatusSTA_SIGN: return true case ali_logistics_query.LogisticsStatusSTA_INBOUND, ali_logistics_query.LogisticsStatusRETURN_SIGN, ali_logistics_query.LogisticsStatusFAILED, ali_logistics_query.LogisticsStatusREFUSE_SIGN, ali_logistics_query.LogisticsStatusDELIVER_ABNORMAL: return true case ali_logistics_query.LogisticsStatusRETENTION, ali_logistics_query.LogisticsStatusISSUE, ali_logistics_query.LogisticsStatusRETURN, ali_logistics_query.LogisticsStatusDAMAGE, ali_logistics_query.LogisticsStatusCANCEL_ORDER: return true default: return false } } // GetLogisticOrder 查询未完成的物料订单,更新物流信息 func GetLogisticOrder() []*model.UpdateMaterialLogistic { var ( timeNow = time.Now() startTime = timeNow.AddDate(0, -1, 0) endTime = timeNow goodsList = make([]*model.GoodsOrder, 0, 0) ) sql := ` SELECT * FROM goods_order g WHERE g.order_created_at >= ? AND g.order_created_at < ? AND g.store_id = ? AND order_type = ? AND g.status < ? ` // 一个月内状态未完成的订单 sqlParam := []interface{}{ startTime, endTime, "666666", 1, model.OrderStatusEndBegin, } if err := dao.GetRows(dao.GetDB(), &goodsList, sql, sqlParam...); err != nil { globals.SugarLogger.Debugf("loading jx material order err :%s", err) return nil } if len(goodsList) == 0 { return nil } logisticsList := make([]*model.UpdateMaterialLogistic, 0, len(goodsList)) for _, v := range goodsList { logistics := &model.UpdateMaterialLogistic{ OrderId: v.VendorOrderID, LogisticId: v.VendorWaybillID, LogisticFee: v.BaseFreightMoney, } logisticsList = append(logisticsList, logistics) } return logisticsList }