Accept Merge Request #22: (su -> mark)

Merge Request: 刷新历史订单结算价
Created By: @苏尹岚
Accepted By: @徐建华
URL: https://rosydev.coding.net/p/jx-callback/d/jx-callback/git/merge/22
This commit is contained in:
徐建华
2019-11-08 15:35:41 +08:00
5 changed files with 193 additions and 33 deletions

View File

@@ -613,23 +613,78 @@ func (c *OrderManager) UpdateOrderFields(order *model.GoodsOrder, fieldList []st
return err
}
func (c *OrderManager) RefreshHistoryOrdersEarningPrice(ctx *jxcontext.Context, vendorOrderID string, vendorIDs []int, storeID int, fromDate string, toDate string, isAsync, isContinueWhenError bool) (hint string, err error) {
func (c *OrderManager) RefreshHistoryOrdersEarningPrice(ctx *jxcontext.Context, vendorOrderID string, actID int, vendorIDs []int, storeID int, fromDate, toDate string, isAsync, isContinueWhenError bool) (hint string, err error) {
var (
orderList []*model.GoodsOrder
fromDateParam time.Time
toDateParam time.Time
beginAt time.Time
endAt time.Time
)
db := dao.GetDB()
fromDateParam := utils.Str2Time(fromDate)
toDateParam := utils.Str2Time(toDate)
//若时间间隔大于10天则不允许查询
if math.Ceil(toDateParam.Sub(fromDateParam).Hours()/24) > 10 {
return "", errors.New(fmt.Sprintf("查询间隔时间不允许大于10天时间范围[%v] 至 [%v]", fromDate, toDate))
if actID > 0 {
if fromDate != "" && toDate != "" {
fromDateParam = utils.Str2Time(fromDate)
toDateParam = utils.Str2Time(toDate)
actList, _ := dao.QueryActs(db, actID, 0, math.MaxInt32, 0, "", 0, nil, nil, nil, 0, 0, 0, time.Time{}, time.Time{}, time.Time{}, time.Time{})
if len(actList.Data) > 0 {
actBeginAt := actList.Data[0].BeginAt
actEndAt := actList.Data[0].EndAt
if fromDateParam.Sub(actBeginAt) > 0 && fromDateParam.Sub(actEndAt) > 0 {
return "", errors.New(fmt.Sprintf("结算活动有效时间范围与订单创建时间范围不一致!,活动时间范围:[%v] 至 [%v] ,订单创建时间范围 [%v] 至 [%v]", actBeginAt, actEndAt, fromDateParam, toDateParam))
}
if actBeginAt.Sub(toDateParam) > 0 && actEndAt.Sub(toDateParam) > 0 {
return "", errors.New(fmt.Sprintf("结算活动有效时间范围与订单创建时间范围不一致!,活动时间范围:[%v] 至 [%v] ,订单创建时间范围 [%v] 至 [%v]", actBeginAt, actEndAt, fromDateParam, toDateParam))
}
if fromDateParam.Sub(actBeginAt) > 0 {
beginAt = fromDateParam
if toDateParam.Sub(actEndAt) > 0 {
endAt = actEndAt
} else {
endAt = toDateParam
}
} else {
beginAt = actBeginAt
if toDateParam.Sub(actEndAt) > 0 {
endAt = actEndAt
} else {
endAt = toDateParam
}
}
orderList, _ = dao.QueryOrders(db, vendorOrderID, actID, vendorIDs, storeID, beginAt, endAt)
} else {
return "", errors.New(fmt.Sprintf("未查询到相关结算活动活动ID[%d]", actID))
}
} else if fromDate == "" && toDate == "" {
actList, _ := dao.QueryActs(db, actID, 0, math.MaxInt32, 0, "", 0, nil, nil, nil, 0, 0, 0, time.Time{}, time.Time{}, time.Time{}, time.Time{})
if len(actList.Data) > 0 {
orderList, _ = dao.QueryOrders(db, vendorOrderID, actID, vendorIDs, storeID, actList.Data[0].BeginAt, actList.Data[0].EndAt)
} else {
return "", errors.New(fmt.Sprintf("未查询到相关结算活动活动ID[%d]", actID))
}
} else {
return "", errors.New(fmt.Sprintf("间隔时间必须完整!时间范围:[%v] 至 [%v]", fromDate, toDate))
}
} else {
if fromDate != "" && toDate != "" {
fromDateParam = utils.Str2Time(fromDate)
toDateParam = utils.Str2Time(toDate)
//若未传入活动ID,且时间间隔大于10天则不允许查询
if math.Ceil(toDateParam.Sub(fromDateParam).Hours()/24) > 10 {
return "", errors.New(fmt.Sprintf("查询间隔时间不允许大于10天时间范围[%v] 至 [%v]", fromDate, toDate))
}
orderList, _ = dao.QueryOrders(db, vendorOrderID, actID, vendorIDs, storeID, fromDateParam, toDateParam)
} else {
return "", errors.New(fmt.Sprintf("若不按活动查询则间隔时间必须完整!时间范围:[%v] 至 [%v]", fromDate, toDate))
}
}
orderList, _ := dao.QueryOrders(db, vendorOrderID, vendorIDs, storeID, fromDateParam, toDateParam)
if len(orderList) <= 0 {
return "", errors.New(fmt.Sprintf("未查询到订单!,vendorOrderID : %s, 时间范围:[%v] 至 [%v]", vendorOrderID, fromDate, toDate))
return "", errors.New(fmt.Sprintf("未查询到订单!,vendorOrderID : %s, actID : %d, 时间范围:[%v] 至 [%v]", vendorOrderID, actID, fromDate, toDate))
}
task := tasksch.NewParallelTask("刷新历史订单结算价", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx,
func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) {
v := batchItemList[0].(*model.GoodsOrder)
order := batchItemList[0].(*model.GoodsOrder)
db := dao.GetDB()
order, _ := c.loadOrder(v.VendorOrderID, "", v.VendorID)
updateSingleOrderEarningPrice(order, db)
dao.Begin(db)
defer func() {

View File

@@ -1169,7 +1169,7 @@ func (c *OrderManager) AmendMissingOrders(ctx *jxcontext.Context, vendorIDs []in
if err = err2; err != nil && !isContinueWhenError {
return "", err
}
localOrders, err2 := dao.QueryOrders(db, "", vendorIDs, storeID, fromDate, toDate.Add(24*time.Hour-time.Second))
localOrders, err2 := dao.QueryOrders(db, "", 0, vendorIDs, storeID, fromDate, toDate.Add(24*time.Hour-time.Second))
if err = err2; err != nil {
return "", err
}

View File

@@ -542,15 +542,14 @@ func CheckSkuDiffBetweenJxAndVendor(ctx *jxcontext.Context, vendorIDList []int,
storeID := jxStoreInfoListValue.ID
storeIDStr := utils.Int2Str(storeID)
storeName := jxStoreInfoListValue.Name
jxSkuInfoDataSingle := &StoreSkuNamesInfo{}
jxSkuInfoDataMulti := &StoreSkuNamesInfo{}
if jxStoreInfoListValue.StoreMaps != nil {
var filterJxSkuInfoMapSingle map[int]*StoreSkuNameExt
var filterJxSkuInfoMapMulti map[int]*StoreSkuNameExt
for _, vendorListValue := range jxStoreInfoListValue.StoreMaps {
vendorID := int(utils.MustInterface2Int64(vendorListValue["vendorID"]))
//京西的门店商品只取一次
flag := false
jxSkuInfoDataSingle := &StoreSkuNamesInfo{}
jxSkuInfoDataMulti := &StoreSkuNamesInfo{}
var flag = false
if partner.IsMultiStore(vendorID) {
if flag == false {
jxSkuInfoDataMulti, _ = GetStoreSkus(ctx, storeID, filterJxDepotUnSaleSkuIds, true, "", true, false, map[string]interface{}{}, 0, -1)

View File

@@ -36,34 +36,139 @@ type OrderSkuWithActualPayPrice struct {
PayPercentage int `json:"payPercentage"`
}
func QueryOrders(db *DaoDB, vendorOrderID string, vendorIDs []int, storeID int, orderCreatedAtBegin, orderCreatedAtEnd time.Time) (orderList []*model.GoodsOrder, err error) {
type tGoodsAndOrder struct {
model.GoodsOrder
OrderSkuID int64 `orm:"column(order_sku_id)" json:"orderSkuID"`
StoreSubID int `orm:"column(store_sub_id)" json:"storeSubID"` // 当前这个字段被当成结算活动ID用
StoreSubName string `orm:"size(64)" json:"storeSubName"` // 当前这个字段被用作vendorActType
Count int `json:"count"`
VendorSkuID string `orm:"column(vendor_sku_id);size(48)" json:"vendorSkuID"`
SkuID int `orm:"column(sku_id)" json:"skuID"` // 外部系统里记录的 jxskuid
JxSkuID int `orm:"column(jx_sku_id)" json:"jxSkuID"` // 根据VendorSkuID在本地系统里查询出来的 jxskuid
SkuName string `orm:"size(255)" json:"skuName"`
SkuShopPrice int64 `json:"shopPrice"` // 京西价
SkuVendorPrice int64 `json:"vendorPrice"` // 平台价
SkuSalePrice int64 `json:"salePrice"` // 售卖价
SkuEarningPrice int64 `json:"earningPrice"` // 活动商品设置结算给门店老板的钱如果结算活动ID为0是按结算比例算的否则就是结算表中的值
Weight int `json:"weight"` // 单位为克
SkuType int `json:"skuType"` // 当前如果为gift就为1否则缺省为0
PromotionType int `json:"promotionType"` // todo 当前是用于记录京东的PromotionType(生成jxorder用),没有做转换
}
//actID指结算活动的id
func QueryOrders(db *DaoDB, vendorOrderID string, actID int, vendorIDs []int, storeID int, fromDate, toDate time.Time) (orderList []*model.GoodsOrder, err error) {
sqlParams := []interface{}{}
var (
orderNewList []*tGoodsAndOrder
orderNewMap map[string][]*model.OrderSku
)
sql := `
SELECT t1.*
FROM goods_order t1
WHERE t1.order_created_at >= ?`
sqlParams := []interface{}{
orderCreatedAtBegin,
SELECT a.*,
b.id order_sku_id, b.store_sub_id, b.store_sub_name, b.count, b.vendor_sku_id, b.sku_id, b.jx_sku_id, b.sku_name, b.shop_price sku_shop_price,
b.vendor_price sku_vendor_price, b.sale_price sku_sale_price, b.earning_price sku_earning_price, b.weight, b.sku_type, b.promotion_type
FROM goods_order a
JOIN order_sku b ON a.vendor_order_id = b.vendor_order_id
`
if actID > 0 {
sql += `
JOIN ( SELECT t4.vendor_order_id, t4.vendor_id
FROM act t1
JOIN act_store_sku t2 ON t2.act_id = t1.id
JOIN order_sku t3 ON t3.sku_id = t2.sku_id
JOIN goods_order t4 ON t4.vendor_order_id = t3.vendor_order_id
AND t4.vendor_id = t3.vendor_id
AND t2.store_id = IF(t4.jx_store_id <> 0, t4.jx_store_id, t4.store_id)
AND t4.order_created_at BETWEEN t1.begin_at AND t1.end_at
WHERE t1.status = 1
AND t1.type = ?
AND t1.id = ?
GROUP BY 1,2
)s ON s.vendor_order_id = a.vendor_order_id AND s.vendor_id = a.vendor_id
`
sqlParams = append(sqlParams, model.ActSkuFake, actID)
}
sql += `
WHERE 1=1
`
if vendorOrderID != "" {
sql += " AND t1.vendor_order_id = ?"
sql += " AND a.vendor_order_id = ?"
sqlParams = append(sqlParams, vendorOrderID)
}
if len(vendorIDs) > 0 {
sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sql += " AND a.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
sqlParams = append(sqlParams, vendorIDs)
}
if storeID > 0 {
sql += " AND IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ?"
sql += " AND IF(a.jx_store_id <> 0, a.jx_store_id, a.store_id) = ?"
sqlParams = append(sqlParams, storeID)
}
if !utils.IsTimeZero(orderCreatedAtEnd) {
sql += " AND t1.order_created_at <= ?"
sqlParams = append(sqlParams, orderCreatedAtEnd)
if !utils.IsTimeZero(fromDate) && !utils.IsTimeZero(toDate) {
sql += " AND a.order_created_at BETWEEN ? and ?"
sqlParams = append(sqlParams, fromDate, toDate)
}
// sql += " ORDER BY t1.order_created_at DESC, t1.id DESC;"
return orderList, GetRows(db, &orderList, sql, sqlParams...)
err = GetRows(db, &orderNewList, sql, sqlParams...)
if len(orderNewList) > 0 {
orderNewMap = make(map[string][]*model.OrderSku)
for _, v := range orderNewList {
if orderNewMap[v.VendorOrderID] == nil {
orderList = append(orderList, &v.GoodsOrder)
}
orderNewMap[v.VendorOrderID] = append(orderNewMap[v.VendorOrderID], &model.OrderSku{
ID: v.OrderSkuID,
VendorOrderID: v.VendorOrderID,
VendorID: v.VendorID,
StoreSubID: v.StoreSubID,
StoreSubName: v.StoreSubName,
Count: v.Count,
VendorSkuID: v.VendorSkuID,
SkuID: v.SkuID,
JxSkuID: v.JxSkuID,
SkuName: v.SkuName,
ShopPrice: v.SkuShopPrice,
VendorPrice: v.SkuVendorPrice,
SalePrice: v.SkuSalePrice,
EarningPrice: v.SkuEarningPrice,
Weight: v.Weight,
SkuType: v.SkuType,
PromotionType: v.PromotionType,
})
}
for _, v := range orderList {
v.Skus = orderNewMap[v.VendorOrderID]
}
}
return orderList, err
}
// func QueryOrders(db *DaoDB, vendorOrderID string, vendorIDs []int, storeID int, orderCreatedAtBegin, orderCreatedAtEnd time.Time) (orderList []*model.GoodsOrder, err error) {
// sql := `
// SELECT t1.*
// FROM goods_order t1
// WHERE t1.order_created_at >= ?`
// sqlParams := []interface{}{
// orderCreatedAtBegin,
// }
// if vendorOrderID != "" {
// sql += " AND t1.vendor_order_id = ?"
// sqlParams = append(sqlParams, vendorOrderID)
// }
// if len(vendorIDs) > 0 {
// sql += " AND t1.vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")"
// sqlParams = append(sqlParams, vendorIDs)
// }
// if storeID > 0 {
// sql += " AND IF(t1.jx_store_id <> 0, t1.jx_store_id, t1.store_id) = ?"
// sqlParams = append(sqlParams, storeID)
// }
// if !utils.IsTimeZero(orderCreatedAtEnd) {
// sql += " AND t1.order_created_at <= ?"
// sqlParams = append(sqlParams, orderCreatedAtEnd)
// }
// // sql += " ORDER BY t1.order_created_at DESC, t1.id DESC;"
// return orderList, GetRows(db, &orderList, sql, sqlParams...)
// }
func GetStoreOrderAfterTime(db *DaoDB, storeID int, orderTime time.Time, lastOrderSeqID int64) (orderList []*model.GoodsOrderExt, err error) {
sql := `
SELECT t1.*,

View File

@@ -744,12 +744,13 @@ func (c *OrderController) AmendMissingOrders() {
// @Title 同步刷新历史订单的结算价按订单
// @Description 同步刷新历史订单的结算价按订单
// @Param token header string true "认证token"
// @Param fromTime formData string true "订单起始时间 (yyyy-mm-dd hh:ms:ss)"
// @Param toTime formData string true "订单结束时间 (yyyy-mm-dd hh:ms:ss)"
// @Param fromTime formData string false "订单起始时间 (yyyy-mm-dd hh:ms:ss)"
// @Param toTime formData string false "订单结束时间 (yyyy-mm-dd hh:ms:ss)"
// @Param vendorOrderID formData string false "订单号"
// @Param vendorIDs formData string false "平台ID列表[0,1,3]"
// @Param actID formData int false "活动ID"
// @Param storeID formData int false "门店ID"
// @Param isAsync formData bool true "是否异步操作"
// @Param isAsync formData bool false "是否异步操作"
// @Param isContinueWhenError formData bool false "单个失败是否继续缺省true"
// @Success 200 {object} controllers.CallResult
// @Failure 200 {object} controllers.CallResult
@@ -758,7 +759,7 @@ func (c *OrderController) RefreshHistoryOrdersEarningPrice() {
c.callRefreshHistoryOrdersEarningPrice(func(params *tOrderRefreshHistoryOrdersEarningPriceParams) (retVal interface{}, errCode string, err error) {
var vendorIDList []int
if err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDList); err == nil {
retVal, err = orderman.FixedOrderManager.RefreshHistoryOrdersEarningPrice(params.Ctx, params.VendorOrderID, vendorIDList, params.StoreID, params.FromTime, params.ToTime, params.IsAsync, params.IsContinueWhenError)
retVal, err = orderman.FixedOrderManager.RefreshHistoryOrdersEarningPrice(params.Ctx, params.VendorOrderID, params.ActID, vendorIDList, params.StoreID, params.FromTime, params.ToTime, params.IsAsync, params.IsContinueWhenError)
}
return retVal, "", err
})