diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index d07b1ba47..7bb29ce3f 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -290,8 +290,7 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao } } - order.ConsigneeName = utils.LimitUTF8StringLen2(order.ConsigneeName, 32) - order.ConsigneeAddress = utils.LimitUTF8StringLen2(order.ConsigneeAddress, 255) + filterOrderInfo(order) created, _, err2 := db.Db.ReadOrCreate(order, "VendorOrderID", "VendorID") if err = err2; err == nil { originalOrder := &model.GoodsOrderOriginal{ @@ -321,6 +320,12 @@ func (c *OrderManager) SaveOrder(order *model.GoodsOrder, isAdjust bool, db *dao return isDuplicated, err } +func filterOrderInfo(order *model.GoodsOrder) { + order.ConsigneeName = utils.LimitUTF8StringLen2(order.ConsigneeName, 32) + order.ConsigneeAddress = utils.LimitUTF8StringLen2(order.ConsigneeAddress, 255) + order.ConsigneeAddress = strings.ReplaceAll(order.ConsigneeAddress, "·", "") +} + func (c *OrderManager) updateOrderSkuOtherInfo(order *model.GoodsOrder, db *dao.DaoDB, storePayPercentage, changePriceType int) (err error) { globals.SugarLogger.Debugf("updateOrderSkuOtherInfo orderID:%s, VendorStoreID:%s", order.VendorOrderID, order.VendorStoreID) jxStoreID := jxutils.GetShowStoreIDFromOrder(order) @@ -503,6 +508,11 @@ func (c *OrderManager) updateOrderOtherInfo(order *model.GoodsOrder, db *dao.Dao order.JxStoreID = storeDetail.Store.ID payPercentage = storeDetail.PayPercentage changePriceType = int(storeDetail.ChangePriceType) + if payPercentage < 50 { + order.EarningType = model.EarningTypePoints + } else { + order.EarningType = model.EarningTypeQuote + } } if err = c.updateOrderSkuOtherInfo(order, db, payPercentage, changePriceType); err == nil { jxutils.RefreshOrderSkuRelated(order) @@ -602,6 +612,14 @@ func (c *OrderManager) loadOrderSku(db *dao.DaoDB, vendorOrderID string, vendorI return orderSkus } +func (c *OrderManager) LoadStoreDetail(storeID, vendorID int) (storeDetail *dao.StoreDetail, err error) { + var ( + db = dao.GetDB() + ) + storeDetail, err = dao.GetStoreDetail(db, storeID, vendorID) + return storeDetail, err +} + func (c *OrderManager) loadOrder(vendorOrderID, vendorOrderID2 string, vendorID int) (order *model.GoodsOrder, err error) { db1 := dao.GetDB() db := db1.Db @@ -1139,6 +1157,16 @@ func result2Orders(ctx *jxcontext.Context, result *jdshopapi.AllOrdersResult) (o } else { globals.SugarLogger.Errorf("未知的京东商城订单状态!status : %v", jdsOrder.OrderStatus) } + + //结算类型 + storeDetail, _ := dao.GetStoreDetail(dao.GetDB(), order.StoreID, model.VendorIDJDShop) + if storeDetail != nil { + if storeDetail.PayPercentage < 50 { + order.EarningType = model.EarningTypePoints + } else { + order.EarningType = model.EarningTypeQuote + } + } setJdsOrderSeq(order) for _, v := range jdsOrder.OrderItems { sku := &model.OrderSku{ @@ -1282,6 +1310,12 @@ func TransferJdsOrder(ctx *jxcontext.Context, vendorOrderID string, storeID int) } } } + //结算类型 + if stores[0].PayPercentage < 50 { + order.EarningType = model.EarningTypePoints + } else { + order.EarningType = model.EarningTypeQuote + } } else { return "", fmt.Errorf("未查询到该门店对应的平台信息!门店:[%v]", order.StoreID) } diff --git a/business/jxcallback/scheduler/defsch/defsch.go b/business/jxcallback/scheduler/defsch/defsch.go index 833cb763c..312212392 100644 --- a/business/jxcallback/scheduler/defsch/defsch.go +++ b/business/jxcallback/scheduler/defsch/defsch.go @@ -726,28 +726,8 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf if !savedOrderInfo.isDeliveryCompetition { globals.SugarLogger.Debugf("createWaybillOn3rdProviders orderID:%s门店没有设置配送竞争", order.VendorOrderID) } - //TODO 2020-07-21 发单时间要在门店的营业时间内 - if savedOrderInfo.storeDetail.OpenTime1 != 0 && savedOrderInfo.storeDetail.CloseTime1 != 0 { - time1 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime1, time.Now()) - time2 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime1, time.Now()) - if time.Now().Sub(time1) < 0 || time.Now().Sub(time2) > 0 { - if savedOrderInfo.storeDetail.OpenTime2 != 0 && savedOrderInfo.storeDetail.CloseTime2 != 0 { - time3 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime2, time.Now()) - time4 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime2, time.Now()) - if time.Now().Sub(time3) < 0 || time.Now().Sub(time4) > 0 { - partner.CurOrderManager.OnOrderMsg(order, "自动创建三方运单失败", "不在门店营业时间范围内!") - globals.SugarLogger.Warnf("createWaybillOn3rdProviders return orderID: %s,不在门店营业时间范围内1!", order.VendorOrderID) - return fmt.Errorf("不在门店营业时间范围内!") - } - } else { - partner.CurOrderManager.OnOrderMsg(order, "自动创建三方运单失败", "不在门店营业时间范围内!") - globals.SugarLogger.Warnf("createWaybillOn3rdProviders return orderID: %s,不在门店营业时间范围内2!", order.VendorOrderID) - return fmt.Errorf("不在门店营业时间范围内!") - } - } - } globals.SugarLogger.Debugf("createWaybillOn3rdProviders, orderID:%s, status:%d, maxDeliveryFee:%d, excludeBill:%v", order.VendorOrderID, order.Status, maxDeliveryFee, excludeBill) - if err = s.canOrderCreateWaybillNormally(order); err == nil { + if err = s.canOrderCreateWaybillNormally(order, savedOrderInfo); err == nil { if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { if savedOrderInfo.retryCount <= maxWaybillRetryCount { savedOrderInfo.isNeedCreate3rdWaybill = true @@ -1197,6 +1177,12 @@ func (s *DefScheduler) updateOrderByBill(order *model.GoodsOrder, bill *model.Wa } else { order.WaybillVendorID = bill.WaybillVendorID order.VendorWaybillID = bill.VendorWaybillID + if bill.Status == model.WaybillStatusDelivered { + storeDetail, _ := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(order), order.VendorID) + if storeDetail != nil { + jxutils.RefreshOrderEarningPrice2(order, storeDetail.PayPercentage) + } + } } if revertStatus { order.Status = model.OrderStatusFinishedPickup diff --git a/business/jxcallback/scheduler/defsch/defsch_ext.go b/business/jxcallback/scheduler/defsch/defsch_ext.go index 9acf53a29..8dd8af124 100644 --- a/business/jxcallback/scheduler/defsch/defsch_ext.go +++ b/business/jxcallback/scheduler/defsch/defsch_ext.go @@ -81,12 +81,32 @@ func (s *DefScheduler) SelfDeliveringAndUpdateStatus(ctx *jxcontext.Context, ven return err } -func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder) (err error) { +func (s *DefScheduler) canOrderCreateWaybillNormally(order *model.GoodsOrder, savedOrderInfo *WatchOrderInfo) (err error) { if !(order.LockStatus != model.OrderStatusLocked && order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusEndBegin) { err = fmt.Errorf("当前订单%s没有处于拣货完成且没有结束没有锁定的订单才能进行召唤配送操作", order.VendorOrderID) } else if model.IsOrderHaveWaybill(order) { err = fmt.Errorf("当前订单%s已经有了有效的承运人%s了", order.VendorOrderID, jxutils.GetVendorName(order.WaybillVendorID)) } + if savedOrderInfo != nil { + //TODO 2020-07-21 发单时间要在门店的营业时间内 + if savedOrderInfo.storeDetail.OpenTime1 != 0 && savedOrderInfo.storeDetail.CloseTime1 != 0 { + time1 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime1, time.Now()) + time2 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime1, time.Now()) + if time.Now().Sub(time1) < 0 || time.Now().Sub(time2) > 0 { + if savedOrderInfo.storeDetail.OpenTime2 != 0 && savedOrderInfo.storeDetail.CloseTime2 != 0 { + time3 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.OpenTime2, time.Now()) + time4 := jxutils.JxOperationTime2TimeByDate(savedOrderInfo.storeDetail.CloseTime2, time.Now()) + if time.Now().Sub(time3) < 0 || time.Now().Sub(time4) > 0 { + globals.SugarLogger.Warnf("createWaybillOn3rdProviders return orderID: %s,不在门店营业时间范围内1!", order.VendorOrderID) + return fmt.Errorf("不在门店营业时间范围内!") + } + } else { + globals.SugarLogger.Warnf("createWaybillOn3rdProviders return orderID: %s,不在门店营业时间范围内2!", order.VendorOrderID) + return fmt.Errorf("不在门店营业时间范围内!") + } + } + } + } return err } @@ -112,7 +132,7 @@ func (s *DefScheduler) isPossibleSwitch2SelfDelivery(order *model.GoodsOrder) (e func (s *DefScheduler) CreateWaybillOnProviders4SavedOrder(ctx *jxcontext.Context, savedOrderInfo *WatchOrderInfo, courierVendorIDs, excludeCourierVendorIDs []int, forceCreate bool, maxDeliveryFee int64) (bills []*model.Waybill, err error) { order := savedOrderInfo.order if !forceCreate { - err = s.canOrderCreateWaybillNormally(order) + err = s.canOrderCreateWaybillNormally(order, nil) } if err == nil { if forceCreate { diff --git a/business/jxstore/cms/sync.go b/business/jxstore/cms/sync.go index 0e8afaca8..19dd6dfd9 100644 --- a/business/jxstore/cms/sync.go +++ b/business/jxstore/cms/sync.go @@ -1116,45 +1116,45 @@ func (v *VendorSync) SyncJdsStoresSkus(ctx *jxcontext.Context, storeIDs []int, i } func syncJdsStoreStock(ctx *jxcontext.Context, db *dao.DaoDB, parentTask tasksch.ITask, storeSkus []*model.StoreSkuBind, storeMap *model.StoreMap, isAsync, isContinueWhenError bool) (err error) { - for _, storeSku := range storeSkus { - stock := 0 - storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID}) - if storeSku.JdsID != 0 { - if len(storeSku2) > 0 { - if storeSku2[0].Status == model.StoreSkuBindStatusNormal { - stock = 9999 - } - if storeMap.VendorStoreID != "" { - err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID)) - } - } else { - err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID)) - } - } - } - // task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(1).SetBatchSize(20), ctx, - // func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { - // storeSku := batchItemList[0].(*model.StoreSkuBind) - // stock := 0 - // storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID}) - // if storeSku.JdsID != 0 { - // if len(storeSku2) > 0 { - // if storeSku2[0].Status == model.StoreSkuBindStatusNormal { - // stock = 9999 - // } - // if storeMap.VendorStoreID != "" { - // err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID)) - // } - // } else { - // err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID)) + // for _, storeSku := range storeSkus { + // stock := 0 + // storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID}) + // if storeSku.JdsID != 0 { + // if len(storeSku2) > 0 { + // if storeSku2[0].Status == model.StoreSkuBindStatusNormal && storeSku.Status == model.StoreSkuBindStatusNormal { + // stock = 9999 // } + // if storeMap.VendorStoreID != "" { + // err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID)) + // } + // } else { + // err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID)) // } - // return retVal, err - // }, storeSkus) - // tasksch.HandleTask(task, parentTask, true).Run() - // if !isAsync { - // _, err = task.GetResult(0) + // } // } + task := tasksch.NewParallelTask("syncJdsStoreStock", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError).SetParallelCount(1), ctx, + func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + storeSku := batchItemList[0].(*model.StoreSkuBind) + stock := 0 + storeSku2, _ := dao.GetStoresSkusInfo(db, []int{storeMap.StoreID}, []int{storeSku.SkuID}) + if storeSku.JdsID != 0 { + if len(storeSku2) > 0 { + if storeSku2[0].Status == model.StoreSkuBindStatusNormal && storeSku.Status == model.StoreSkuBindStatusNormal { + stock = 9999 + } + if storeMap.VendorStoreID != "" { + err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, stock, utils.Str2Int(storeMap.VendorStoreID)) + } + } else { + err = api.JdShopAPI.UpdateSkuSiteStock(storeSku.JdsID, 0, utils.Str2Int(storeMap.VendorStoreID)) + } + } + return retVal, err + }, storeSkus) + tasksch.HandleTask(task, parentTask, true).Run() + if !isAsync { + _, err = task.GetResult(0) + } return err } diff --git a/business/jxstore/cms/sync_store_sku.go b/business/jxstore/cms/sync_store_sku.go index 553638b66..739ef94a4 100644 --- a/business/jxstore/cms/sync_store_sku.go +++ b/business/jxstore/cms/sync_store_sku.go @@ -297,8 +297,13 @@ func formalizeStoreSkuList(inSkuList []*dao.StoreSkuSyncInfo) []*dao.StoreSkuSyn skuItem.SkuName = jxutils.ComposeSkuNameSync(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0, skuItem.ExPrefix, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) skuItem.SkuNameOrigin = jxutils.ComposeSkuNameOriginal(skuItem.Prefix, skuItem.Name, skuItem.Comment, skuItem.Unit, skuItem.SpecQuality, skuItem.SpecUnit, 0) if skuItem.ImgWatermark != "" { - downLoad, _ := uploadImgStandard(skuItem.ImgWatermark) - skuItem.ImgMix = jxutils.MixWatermarkImg(downLoad, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixBegin) >= 0 && utils.Time2Date(time.Now()).Sub(*skuItem.ExPrefixEnd) <= 0 { + downLoad, _ := uploadImgStandard(skuItem.ImgWatermark) + skuItem.ImgMix = jxutils.MixWatermarkImg(downLoad, skuItem.ImgOrigin, skuItem.ExPrefixBegin, skuItem.ExPrefixEnd) + } + if utils.Time2Date(time.Now().Add(6*time.Hour)).Sub(*skuItem.ExPrefixEnd) > 0 { + skuItem.ImgMix = "" + } } } } diff --git a/business/jxutils/jxutils.go b/business/jxutils/jxutils.go index c12e1cfac..327f28075 100644 --- a/business/jxutils/jxutils.go +++ b/business/jxutils/jxutils.go @@ -589,8 +589,12 @@ func RefreshOrderSkuRelated(order *model.GoodsOrder) *model.GoodsOrder { } func RefreshOrderEarningPrice2(order *model.GoodsOrder, payPercentage int) *model.GoodsOrder { - if payPercentage <= 50 { - order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage/2)) / 100 + if order.EarningType == model.EarningTypePoints { + if order.VendorID == model.VendorIDJDShop || order.VendorID == model.VendorIDJX { + order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage/2)) / 100 + } else { + order.NewEarningPrice = order.TotalShopMoney * int64((100 - payPercentage)) / 100 + } } else { order.NewEarningPrice = order.EarningPrice } diff --git a/business/model/order.go b/business/model/order.go index a1a3cd677..f2176f548 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -21,6 +21,9 @@ const ( RefundStatusNo = 0 RefundStatusYes = 1 RefundStatusFailed = 2 + + EarningTypeQuote = 1 //报价模式 + EarningTypePoints = 2 //扣点模式 ) var ( @@ -107,6 +110,7 @@ type GoodsOrder struct { FromStoreID int `orm:"column(from_store_id)" json:"fromStoreID"` //物料配送门店 EclpOutID string `orm:"column(eclp_out_id)" json:"eclpOutID"` //物料配送的出库单号 AddressID int64 `orm:"column(address_id)" json:"addressID"` //配送地址ID + EarningType int `json:"earningType"` //订单结算方式,2为扣点,1为报价 // 以下只是用于传递数据 OriginalData string `orm:"-" json:"-"` diff --git a/business/partner/partner.go b/business/partner/partner.go index 8be8aa7a4..bd4e9d041 100644 --- a/business/partner/partner.go +++ b/business/partner/partner.go @@ -105,6 +105,7 @@ type IOrderManager interface { UpdateOrderStatusAndDeliveryFlag(order *model.GoodsOrder) (err error) UpdateOrderFields(order *model.GoodsOrder, fieldList []string) (err error) + LoadStoreDetail(storeID, vendorID int) (storeDetail *dao.StoreDetail, err error) LoadWaybill(vendorWaybillID string, waybillVendorID int) (bill *model.Waybill, err error) OnOrderComments(orderCommentList []*model.OrderComment) (err error) diff --git a/business/partner/purchase/jd/order.go b/business/partner/purchase/jd/order.go index 57c14ba0c..d6b301726 100644 --- a/business/partner/purchase/jd/order.go +++ b/business/partner/purchase/jd/order.go @@ -159,12 +159,13 @@ func updateOrderBySettleMent(order *model.GoodsOrder, orderSettlement *jdapi.Ord order.TotalShopMoney = orderSettlement.SettlementAmount order.PmSubsidyMoney = orderSettlement.PlatOrderGoodsDiscountMoney + orderSettlement.PlatSkuGoodsDiscountMoney if order.TotalShopMoney > 0 { - stores, _ := dao.GetStoreList(dao.GetDB(), []int{order.StoreID}, nil, nil, nil, "") - if len(stores) > 0 { - if stores[0].PayPercentage <= 50 { - order.NewEarningPrice = order.TotalShopMoney * int64((100 - stores[0].PayPercentage/2)) / 100 + order2, err := partner.CurOrderManager.LoadOrder(order.VendorOrderID, order.VendorID) + if order2 != nil && err == nil { + storeDetail, err := partner.CurOrderManager.LoadStoreDetail(jxutils.GetSaleStoreIDFromOrder(order2), order.VendorID) + if storeDetail != nil && err == nil { + jxutils.RefreshOrderEarningPrice2(order, storeDetail.PayPercentage) } else { - order.NewEarningPrice = order.EarningPrice + globals.SugarLogger.Warnf("updateOrderBySettleMent,%v,%v,%v", order.VendorOrderID, orderSettlement.SettlementAmount) } } } else { diff --git a/business/partner/purchase/jdshop/store_sku.go b/business/partner/purchase/jdshop/store_sku.go index 7bbf19c26..911648a78 100644 --- a/business/partner/purchase/jdshop/store_sku.go +++ b/business/partner/purchase/jdshop/store_sku.go @@ -659,7 +659,7 @@ func buildCreateWareParam(storeSku *dao.StoreSkuSyncInfo) (createSkuParamWare *j } attrBzq := &jdshopapi.CreateSkuParamAttrs{ AttrID: utils.Int2Str(attrIDs["保质期"]), - AttrValues: []string{"5"}, + AttrValues: []string{"5天"}, } attrsProp = append(attrsProp, attrZctj) attrsProp = append(attrsProp, attrJhl) diff --git a/business/partner/purchase/jx/localjx/order.go b/business/partner/purchase/jx/localjx/order.go index a9283f3b8..56315d974 100644 --- a/business/partner/purchase/jx/localjx/order.go +++ b/business/partner/purchase/jx/localjx/order.go @@ -110,6 +110,7 @@ type JxOrderInfo struct { StoreName string `json:"storeName"` Weight int `json:"weight"` FromStoreID int `json:"fromStoreID"` + EarningType int `json:"earningType"` } type DeliveryTimeItem struct { @@ -481,6 +482,13 @@ func generateOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, addressID int64 return nil, nil, fmt.Errorf("当前送货地址不在门店%s的配送范围", storeDetail.Name) } + //结算类型 + if storeDetail.PayPercentage < 50 { + jxOrder.EarningType = model.EarningTypePoints + } else { + jxOrder.EarningType = model.EarningTypeQuote + } + // 营业状态及时间检查 if storeDetail.Status != model.StoreStatusOpened { // model.StoreStatusDisabled { return nil, nil, fmt.Errorf("门店:%s状态是:%s", storeDetail.Name, model.StoreStatusName[storeDetail.Status]) @@ -820,6 +828,7 @@ func jxOrder2GoodsOrder(ctx *jxcontext.Context, jxOrder *JxOrderInfo, deliveryAd DeliveryType: model.OrderDeliveryTypeStoreSelf, StatusTime: time.Now(), + EarningType: jxOrder.EarningType, } if userID == "" { order.UserID = ctx.GetUserID()