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

This commit is contained in:
Rosy-zhudan
2019-09-29 18:33:38 +08:00
6 changed files with 151 additions and 118 deletions

View File

@@ -5,6 +5,7 @@ import (
"git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/jxcallback/scheduler" "git.rosy.net.cn/jx-callback/business/jxcallback/scheduler"
"git.rosy.net.cn/jx-callback/business/jxutils"
"git.rosy.net.cn/jx-callback/business/model" "git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao" "git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals" "git.rosy.net.cn/jx-callback/globals"
@@ -84,6 +85,7 @@ func (w *OrderManager) onWaybillNew(bill2 *model.Waybill, db *dao.DaoDB) (isDupl
func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) { func (w *OrderManager) OnWaybillStatusChanged(bill *model.Waybill) (err error) {
var isDuplicated bool var isDuplicated bool
bill.CourierMobile = jxutils.FormalizeMobile(bill.CourierMobile)
db := dao.GetDB() db := dao.GetDB()
dao.Begin(db) dao.Begin(db)
defer func() { defer func() {

View File

@@ -69,9 +69,8 @@ type WatchOrderInfo struct {
storeDeliveryType int storeDeliveryType int
isDeliveryCompetition bool isDeliveryCompetition bool
pmWaybillCreatedAt time.Time
isNeedCreate3rdWaybill bool isNeedCreate3rdWaybill bool
isAddWaybillTipDisabled bool watchWabillStartAt *time.Time
waybills map[int]*model.Waybill // 这个waybills里的状态信息是不真实的只使用id相关的信息 waybills map[int]*model.Waybill // 这个waybills里的状态信息是不真实的只使用id相关的信息
@@ -224,6 +223,8 @@ func init() {
}, },
TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) { TimeoutAction: func(savedOrderInfo *WatchOrderInfo, bill *model.Waybill) (err error) {
if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore && savedOrderInfo.order.DeliveryType != model.OrderDeliveryTypeSelfTake { // 自配送商家使用 if savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore && savedOrderInfo.order.DeliveryType != model.OrderDeliveryTypeSelfTake { // 自配送商家使用
// 启动抢单TIMER
sch.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, savedOrderInfo.order.StatusTime)
return sch.createWaybillOn3rdProviders(savedOrderInfo, 0, nil) return sch.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
} }
return nil return nil
@@ -431,23 +432,10 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order) err = partner.CurOrderManager.UpdateOrderStatusAndDeliveryFlag(order)
} }
} }
// 只有购物平台的新运单消息会启动抢单TIMER // 购物平台的新运单消息会启动抢单TIMER
if model.IsWaybillPlatformOwn(bill) { if model.IsWaybillPlatformOwn(bill) {
s.resetTimer(savedOrderInfo, bill, isPending) s.resetTimer(savedOrderInfo, bill, isPending)
isFirst := utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) s.saveDeliveryFeeFromAndStartWatch(savedOrderInfo, bill.StatusTime)
savedOrderInfo.pmWaybillCreatedAt = bill.StatusTime
savedOrderInfo.isAddWaybillTipDisabled = false
if isFirst {
duration := savedOrderInfo.pmWaybillCreatedAt.Add(minAddWaybillTipMinute * time.Minute).Sub(time.Now())
if duration <= 0 {
duration = 1 * time.Second
}
utils.AfterFuncWithRecover(duration, func() {
jxutils.CallMsgHandlerAsync(func() {
s.handleWaybillTip(savedOrderInfo)
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
})
}
} }
} else { } else {
isBillExist := s.updateBillsInfo(savedOrderInfo, bill) isBillExist := s.updateBillsInfo(savedOrderInfo, bill)
@@ -471,7 +459,6 @@ func (s *DefScheduler) OnWaybillStatusChanged(bill *model.Waybill, isPending boo
s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime) s.cancelOtherWaybillsCheckOrderDeliveryFlag(savedOrderInfo, bill, partner.CancelWaybillReasonNotAcceptIntime, partner.CancelWaybillReasonStrNotAcceptIntime)
if model.IsWaybillPlatformOwn(bill) { if model.IsWaybillPlatformOwn(bill) {
savedOrderInfo.isAddWaybillTipDisabled = true
if bill.Status == model.WaybillStatusDelivering { if bill.Status == model.WaybillStatusDelivering {
// 强制将订单状态置为配送中? // 强制将订单状态置为配送中?
order.Status = model.OrderStatusDelivering order.Status = model.OrderStatusDelivering
@@ -619,7 +606,7 @@ func (s *DefScheduler) createWaybillOn3rdProviders(savedOrderInfo *WatchOrderInf
return nil return nil
} }
if maxDeliveryFee == 0 { if maxDeliveryFee == 0 {
maxDeliveryFee = s.getMaxDeliveryFee(savedOrderInfo) maxDeliveryFee = getMaxDeliveryFee(order)
} }
if err = s.canOrderCreateWaybillNormally(order); err == nil { if err = s.canOrderCreateWaybillNormally(order); err == nil {
if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 { if (order.DeliveryFlag & model.OrderDeliveryFlagMaskScheduleDisabled) == 0 {
@@ -1001,14 +988,9 @@ func (s *DefScheduler) autoPickupGood(savedOrderInfo *WatchOrderInfo) (err error
return err return err
} }
func (s *DefScheduler) getWaybillTip(savedOrderInfo *WatchOrderInfo) (tipFee int64) { func getWaybillTip(order *model.GoodsOrder) (tipFee int64) {
order := savedOrderInfo.order if !utils.IsPtrTimeZero(order.DeliveryFeeFrom) {
if order.Status == model.OrderStatusFinishedPickup && startTime := order.DeliveryFeeFrom.Add(minAddWaybillTipMinute * time.Minute)
!utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) {
startTime := savedOrderInfo.pmWaybillCreatedAt.Add(minAddWaybillTipMinute * time.Minute)
// if order.DeliveryFlag&model.OrderDeliveryFlagMaskAutoPickup != 0 {
// startTime = startTime.Add(5 * time.Minute)
// }
timeGap1 := time.Now().Sub(startTime) timeGap1 := time.Now().Sub(startTime)
if timeGap1 > 0 { if timeGap1 > 0 {
timeGap := int64(timeGap1/(addWaybillTipGap*time.Minute)) + 1 timeGap := int64(timeGap1/(addWaybillTipGap*time.Minute)) + 1
@@ -1021,24 +1003,59 @@ func (s *DefScheduler) getWaybillTip(savedOrderInfo *WatchOrderInfo) (tipFee int
return tipFee return tipFee
} }
func (s *DefScheduler) getMaxDeliveryFee(savedOrderInfo *WatchOrderInfo) (maxDeliveryFee int64) { func getMaxDeliveryFee(order *model.GoodsOrder) (maxDeliveryFee int64) {
maxDeliveryFee = baseWaybillFee + savedOrderInfo.order.DistanceFreightMoney + s.getWaybillTip(savedOrderInfo) maxDeliveryFee = baseWaybillFee + order.DistanceFreightMoney + getWaybillTip(order)
return maxDeliveryFee return maxDeliveryFee
} }
func (s *DefScheduler) handleWaybillTip(savedOrderInfo *WatchOrderInfo) { func isNeedWatchWaybillTip(order *model.GoodsOrder) bool {
if savedOrderInfo.storeDeliveryType != scheduler.StoreDeliveryTypeByStore && return order.DeliveryFlag&model.OrderDeliveryFlagMaskPurcahseDisabled == 0 && // 没有转出
savedOrderInfo.isDeliveryCompetition { order.DeliveryType == model.OrderDeliveryTypePlatform && // 订单配送类型为平台
!utils.IsPtrTimeZero(order.DeliveryFeeFrom) // 已经有了开始计费时间
}
func isNeedWatch3rdWaybill(order *model.GoodsOrder) bool {
return (order.Status >= model.OrderStatusFinishedPickup && order.Status < model.OrderStatusDelivering) && // 订单状态
order.DeliveryFlag&model.OrderDeliveryFlagMaskScheduleDisabled == 0 && // 没有禁止调度
!model.IsOrderHaveWaybill(order) // 没有有效运单
}
func (s *DefScheduler) setWatchOrderWaybills(savedOrderInfo *WatchOrderInfo, duration time.Duration) {
if utils.IsPtrTimeZero(savedOrderInfo.watchWabillStartAt) {
savedOrderInfo.watchWabillStartAt = utils.Time2Pointer(time.Now())
utils.AfterFuncWithRecover(5*time.Minute, func() {
jxutils.CallMsgHandlerAsync(func() {
savedOrderInfo.watchWabillStartAt = nil
s.watchOrderWaybills(savedOrderInfo)
}, jxutils.ComposeUniversalOrderID(savedOrderInfo.order.VendorOrderID, savedOrderInfo.order.VendorID))
})
}
}
func (s *DefScheduler) saveDeliveryFeeFromAndStartWatch(savedOrderInfo *WatchOrderInfo, statusTime time.Time) {
order := savedOrderInfo.order
if utils.IsPtrTimeZero(order.DeliveryFeeFrom) {
order.DeliveryFeeFrom = utils.Time2Pointer(statusTime)
partner.CurOrderManager.UpdateOrderFields(order, []string{"DeliveryFeeFrom"})
}
duration := order.DeliveryFeeFrom.Add(minAddWaybillTipMinute * time.Minute).Sub(time.Now())
if duration <= 0 {
duration = 5 * time.Second
}
s.setWatchOrderWaybills(savedOrderInfo, duration)
}
func (s *DefScheduler) watchOrderWaybills(savedOrderInfo *WatchOrderInfo) {
if savedOrderInfo.storeDeliveryType != scheduler.StoreDeliveryTypeByStore && savedOrderInfo.isDeliveryCompetition ||
savedOrderInfo.storeDeliveryType == scheduler.StoreDeliveryTypeByStore {
order2 := savedOrderInfo.order order2 := savedOrderInfo.order
if order, err := partner.CurOrderManager.LoadOrder(order2.VendorOrderID, order2.VendorID); err == nil { if order, err := partner.CurOrderManager.LoadOrder(order2.VendorOrderID, order2.VendorID); err == nil {
savedOrderInfo.SetOrder(order) savedOrderInfo.SetOrder(order)
if order.Status == model.OrderStatusFinishedPickup && if isNeedWatch3rdWaybill(order) {
order.DeliveryFlag&model.OrderDeliveryFlagMaskScheduleDisabled == 0 { if isNeedWatchWaybillTip(order) {
if !utils.IsTimeZero(savedOrderInfo.pmWaybillCreatedAt) &&
!savedOrderInfo.isAddWaybillTipDisabled {
if tipFee := s.getWaybillTip(savedOrderInfo); tipFee > 0 {
if handler, ok := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).(partner.IAddWaybillTip); ok && handler != nil { if handler, ok := partner.GetPurchaseOrderHandlerFromVendorID(order.VendorID).(partner.IAddWaybillTip); ok && handler != nil {
var remark string var remark string
tipFee := getWaybillTip(order)
vendorStatus := fmt.Sprintf("设置小费:%s", jxutils.IntPrice2StandardCurrencyString(tipFee)) vendorStatus := fmt.Sprintf("设置小费:%s", jxutils.IntPrice2StandardCurrencyString(tipFee))
if curTipFee, err := handler.GetWaybillTip(jxcontext.AdminCtx, order); err == nil { if curTipFee, err := handler.GetWaybillTip(jxcontext.AdminCtx, order); err == nil {
tipFee2Add := tipFee - curTipFee tipFee2Add := tipFee - curTipFee
@@ -1062,16 +1079,11 @@ func (s *DefScheduler) handleWaybillTip(savedOrderInfo *WatchOrderInfo) {
} }
partner.CurOrderManager.OnOrderMsg(order, vendorStatus, remark) partner.CurOrderManager.OnOrderMsg(order, vendorStatus, remark)
} }
}
if savedOrderInfo.isNeedCreate3rdWaybill { if savedOrderInfo.isNeedCreate3rdWaybill {
s.createWaybillOn3rdProviders(savedOrderInfo, 0, nil) s.createWaybillOn3rdProviders(savedOrderInfo, 0, nil)
} }
} s.setWatchOrderWaybills(savedOrderInfo, 5*time.Minute)
}
utils.AfterFuncWithRecover(5*time.Minute, func() {
jxutils.CallMsgHandlerAsync(func() {
s.handleWaybillTip(savedOrderInfo)
}, jxutils.ComposeUniversalOrderID(order.VendorOrderID, order.VendorID))
})
} }
} }
} }

View File

@@ -74,6 +74,7 @@ func init() {
func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) { func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Act, vendorIDs []int, actStoreSku []*ActStoreSkuParam) (validVendorIDs []int, actStoreSkuList []*model.ActStoreSku, actStoreSkuMapList []*model.ActStoreSkuMap, err error) {
wholeValidVendorMap := make(map[int]int) wholeValidVendorMap := make(map[int]int)
wholeValidVendorMap[model.VendorIDJX] = 1
if len(actStoreSku) > 0 { if len(actStoreSku) > 0 {
storeIDMap := make(map[int]int) storeIDMap := make(map[int]int)
skuIDMap := make(map[int]int) skuIDMap := make(map[int]int)
@@ -161,6 +162,8 @@ func ActStoreSkuParam2Model(ctx *jxcontext.Context, db *dao.DaoDB, act *model.Ac
dao.WrapAddIDCULDEntity(actSkuMap, ctx.GetUserName()) dao.WrapAddIDCULDEntity(actSkuMap, ctx.GetUserName())
actStoreSkuMapList = append(actStoreSkuMapList, actSkuMap) actStoreSkuMapList = append(actStoreSkuMapList, actSkuMap)
} }
} else {
globals.SugarLogger.Debugf("ActStoreSkuParam2Model storeID:%d, skuID:%d没有关注", v.StoreID, v.SkuID)
} }
} }
wholeValidVendorMap[vendorID] = 1 wholeValidVendorMap[vendorID] = 1
@@ -339,6 +342,10 @@ func PreCreateAct(ctx *jxcontext.Context, act *model.Act, vendorIDs []int, actRu
if err != nil { if err != nil {
return nil, err return nil, err
} }
if len(validVendorIDs) == 0 {
dao.Rollback(db)
return nil, fmt.Errorf("没有一个合法平台可以创建活动")
}
preCreateActInfo = &tPreCreateActInfo{ preCreateActInfo = &tPreCreateActInfo{
ValidVendorIDs: validVendorIDs, ValidVendorIDs: validVendorIDs,

View File

@@ -59,7 +59,7 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
district.name district_name, district.name district_name,
city.name city_name city.name city_name
FROM store t1 FROM store t1
JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ? LEFT JOIN store_map t2 ON t1.id = t2.store_id AND t2.vendor_id = ? AND t2.deleted_at = ?
LEFT JOIN place city ON city.code = t1.city_code LEFT JOIN place city ON city.code = t1.city_code
LEFT JOIN place district ON district.code = t1.district_code LEFT JOIN place district ON district.code = t1.district_code
LEFT JOIN new_config t3 ON t3.key = t2.price_percentage_pack AND t3.type = ? AND t3.deleted_at = ? LEFT JOIN new_config t3 ON t3.key = t2.price_percentage_pack AND t3.type = ? AND t3.deleted_at = ?
@@ -72,6 +72,9 @@ func getStoreDetail(db *DaoDB, storeID, vendorID int, vendorStoreID string) (sto
utils.DefaultTimeValue, utils.DefaultTimeValue,
utils.DefaultTimeValue, utils.DefaultTimeValue,
} }
if vendorID != model.VendorIDJX {
sql += " AND t2.id IS NOT NULL"
}
if storeID > 0 { if storeID > 0 {
sql += " AND t1.id = ?" sql += " AND t1.id = ?"
sqlParams = append(sqlParams, storeID) sqlParams = append(sqlParams, storeID)

View File

@@ -63,6 +63,7 @@ type GoodsOrder struct {
OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"` OrderFinishedAt time.Time `orm:"type(datetime)" json:"orderFinishedAt"`
StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time StatusTime time.Time `orm:"type(datetime)" json:"statusTime"` // last status time
PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"` PickDeadline time.Time `orm:"type(datetime);null" json:"pickDeadline"`
DeliveryFeeFrom *time.Time `orm:"type(datetime);null" json:"deliveryFeeFrom,omitempty"` // 三方配置费计算的开始基准时间
ModelTimeInfo `json:"-"` ModelTimeInfo `json:"-"`
Flag int `json:"flag"` //非运单调整相关的其它状态 Flag int `json:"flag"` //非运单调整相关的其它状态

View File

@@ -300,9 +300,17 @@ func (c *PurchaseHandler) AcceptOrRefuseOrder(order *model.GoodsOrder, isAcceptI
globals.SugarLogger.Debugf("jd AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt) globals.SugarLogger.Debugf("jd AcceptOrRefuseOrder orderID:%s, isAcceptIt:%t", order.VendorOrderID, isAcceptIt)
if globals.EnableStoreWrite { if globals.EnableStoreWrite {
err = getAPI("").OrderAcceptOperate(order.VendorOrderID, isAcceptIt, userName) err = getAPI("").OrderAcceptOperate(order.VendorOrderID, isAcceptIt, userName)
} else { if isAcceptIt && err == nil {
c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore) c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore)
} }
} else {
if isAcceptIt {
c.postFakeMsg(order.VendorOrderID, jdapi.StatusIDWaitOutStore)
} else {
c.postFakeMsg(order.VendorOrderID, jdapi.OrderStatusCanceled)
}
}
return err return err
} }