diff --git a/business/jxcallback/orderman/order.go b/business/jxcallback/orderman/order.go index 2606fa229..696dbc0e2 100644 --- a/business/jxcallback/orderman/order.go +++ b/business/jxcallback/orderman/order.go @@ -752,6 +752,64 @@ func RefreshOrdersWithoutJxStoreID(ctx *jxcontext.Context, fromDate, toDate stri return hint, err } +func GetOrdersSupplement(ctx *jxcontext.Context, storIDs, vendorIDs []int, vendorOrderID, fromTime, toTime string, status, stype, IsReverse, offset, pageSize int) (pageInfo *model.PagedInfo, err error) { + var ( + db = dao.GetDB() + fromTimeP time.Time + toTimeP time.Time + ) + if fromTime != "" { + fromTimeP = utils.Str2Time(fromTime) + } + if toTime != "" { + toTimeP = utils.Str2Time(toTime) + } + if fromTimeP.After(toTimeP) { + return nil, fmt.Errorf("时间范围不合法!开始时间:[%v],结束时间:[%v]", fromTimeP, toTimeP) + } + result, totalCount, err := dao.GetOrdersSupplement(db, storIDs, vendorIDs, vendorOrderID, fromTimeP, toTimeP, status, stype, IsReverse, offset, pageSize) + pageInfo = &model.PagedInfo{ + Data: result, + TotalCount: totalCount, + } + return pageInfo, err +} + +func AddUpdateOrdersSupplement(ctx *jxcontext.Context, ordersSupplement *model.OrderSupplementFee) (num int64, err error) { + var ( + db = dao.GetDB() + id = ordersSupplement.ID + ) + now := time.Now() + ordersSupplement.SupplementTime = &now + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + if id > 0 { + if ordersSupplement.Status == 1 { + return 0, fmt.Errorf("已结账的扣款信息不允许修改!门店ID:[%v],订单号:[%v]", ordersSupplement.StoreID, ordersSupplement.VendorOrderID) + } + ordersSupplement.UpdatedAt = time.Now() + ordersSupplement.LastOperator = ctx.GetUserName() + if ordersSupplement.Status == -1 { + ordersSupplement.DeletedAt = time.Now() + } else { + ordersSupplement.DeletedAt = utils.DefaultTimeValue + } + num, err = dao.UpdateEntity(db, ordersSupplement) + } else { + dao.WrapAddIDCULDEntity(ordersSupplement, ctx.GetUserName()) + err = dao.CreateEntity(db, ordersSupplement) + } + dao.Commit(db) + return num, err +} + func RefreshOrdersPriceInfo(ctx *jxcontext.Context, fromTime, toTime time.Time, isAsync, isContinueWhenError bool) (hint string, err error) { if utils.IsTimeZero(fromTime) { return "", fmt.Errorf("必须指定起始时间") diff --git a/business/jxstore/cms/cms.go b/business/jxstore/cms/cms.go index 506e8ee62..b73f2649d 100644 --- a/business/jxstore/cms/cms.go +++ b/business/jxstore/cms/cms.go @@ -140,6 +140,7 @@ func InitServiceInfo(version string, buildTime time.Time, gitCommit string) { "refundStatusName": model.RefundStatusName, "autoReplyTypeName": model.AutoReplyTypeName, "complaintReasons": model.ComplaintReasons, + "supplementType": model.SupplementTypeName, }, } } diff --git a/business/jxstore/cms/store.go b/business/jxstore/cms/store.go index be11f8cfa..07ee953e6 100644 --- a/business/jxstore/cms/store.go +++ b/business/jxstore/cms/store.go @@ -2595,7 +2595,7 @@ func CreateStorePriceScore(ctx *jxcontext.Context) (err error) { } } }() - priceReferSnapshotDeleteHis := &model.StorePriceScoreSnapshot{SnapshotAt: snapshotAt.AddDate(0, -1, 0)} + priceReferSnapshotDeleteHis := &model.StorePriceScoreSnapshot{SnapshotAt: snapshotAt.AddDate(0, 0, -7)} priceReferSnapshotDelete := &model.StorePriceScoreSnapshot{SnapshotAt: snapshotAt} dao.DeleteEntity(db, priceReferSnapshotDeleteHis, "SnapshotAt") dao.DeleteEntity(db, priceReferSnapshotDelete, "SnapshotAt") diff --git a/business/jxstore/cms/store_sku.go b/business/jxstore/cms/store_sku.go index e9bbcebce..0207aa87f 100644 --- a/business/jxstore/cms/store_sku.go +++ b/business/jxstore/cms/store_sku.go @@ -154,6 +154,11 @@ type DataLock struct { locker sync.RWMutex } +type tUpdateStoresSkus struct { + StoreID int + SkuBindInfos []*StoreSkuBindInfo +} + const ( maxStoreNameBind = 10000 // 最大门店SkuName bind个数 maxStoreNameBind2 = 10000 // 最大门店乘SkuName个数 @@ -2243,9 +2248,9 @@ func GetTopSkusByCityCode(ctx *jxcontext.Context, cityCode, storeID int) (skuNam } for _, v := range skuNameAndPlace { if skuNameMap[v.ID] != nil { - midPrice, _ := dao.GetMidPriceByNameID(db, cityCode, v.ID, utils.Time2Date(time.Now().AddDate(0, 0, -1))) - if midPrice != 0 { - v.Price = midPrice + priceReferList, _, _ := dao.GetPriceReferSnapshot(db, []int{cityCode}, nil, v.ID, utils.Time2Date(time.Now().AddDate(0, 0, -1)), 0, 9999) + if len(priceReferList) > 0 { + v.Price = priceReferList[0].MidUnitPrice } v.Type = skuNameMap[v.ID].BrandID skuNameAndPlaceList = append(skuNameAndPlaceList, v) @@ -2310,7 +2315,39 @@ func GetTopCategoriesByStoreIDs(ctx *jxcontext.Context, storeIDs []int) (skuCate func RefershStoreSkusMidPrice(ctx *jxcontext.Context, storeIDs []int) (err error) { db := dao.GetDB() - _, err = dao.RefershStoreSkusMidPrice(db, storeIDs) + if len(storeIDs) == 0 { + return err + } + for _, v := range storeIDs { + var skuBindInfos []*StoreSkuBindInfo + store, err := dao.GetStoreDetail(db, v, -1) + if err != nil { + return err + } + var payPercentage int + if store.PayPercentage < 50 { + payPercentage = 70 + } else { + payPercentage = store.PayPercentage + } + storeSkuList, err := dao.GetStoresSkusInfo(db, []int{v}, nil) + for _, storeSku := range storeSkuList { + priceReferList, err := dao.GetPriceReferSnapshotNoPage(db, []int{store.CityCode}, []int{storeSku.SkuID}, nil, utils.Time2Date(time.Now().AddDate(0, 0, -1))) + if err != nil { + return err + } + if len(priceReferList) > 0 { + if storeSku.UnitPrice > priceReferList[0].MidUnitPrice*payPercentage/100 { + skuBindInfo := &StoreSkuBindInfo{ + NameID: priceReferList[0].NameID, + UnitPrice: priceReferList[0].MidUnitPrice * payPercentage / 100, + } + skuBindInfos = append(skuBindInfos, skuBindInfo) + } + } + } + updateStoresSkusWithoutSync(ctx, db, []int{v}, skuBindInfos, false) + } if err == nil { CreateStorePriceScore(ctx) } @@ -2760,22 +2797,20 @@ func FocusStoreSkusByExcel(ctx *jxcontext.Context, files []*multipart.FileHeader func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync, isContinueWhenError bool) (hint string, err error) { var ( - skuMap = make(map[int]int) - skuNameMap = make(map[int]int) - skuBindInfos []*StoreSkuBindInfo - db = dao.GetDB() - storeIDs []int - skuIDs []int + skuMap = make(map[int]int) + db = dao.GetDB() + skuIDs []int + result1 []interface{} ) sheetParam := &SheetParam{ OutSkuIDCol: 1, SkuPriceCol: 3, SkuRow: 1, } - // xlsx, err := excelize.OpenFile("111.xlsx") taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { switch step { case 0: + // xlsx, err := excelize.OpenFile("111.xlsx") xlsx, err := excelize.OpenReader(reader) if err != nil { return result, err @@ -2792,43 +2827,72 @@ func FocusStoreSkusByExcelBin(ctx *jxcontext.Context, reader io.Reader, isAsync, skuIDs = append(skuIDs, k) } skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) + storeList, err := dao.GetStoreList(db, nil, nil, "") if err != nil && len(skuList) == 0 { return result, err } - for _, v := range skuList { + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + store := batchItemList[0].(*model.Store) var ( - price int - specQuality float64 + skuBindInfos []*StoreSkuBindInfo + skuNameMap = make(map[int]int) + skuInfoMap = make(map[int][]*StoreSkuBindSkuInfo) ) - if v.Unit == model.SpecialUnit { - if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { - specQuality = float64(v.SpecQuality) * 1000 + for _, v := range skuList { + var ( + price int + specQuality float64 + ) + focusList, _ := dao.GetStoreSkuBindByNameID(db, store.ID, v.NameID, model.StoreSkuBindStatusNormal) + //有关注过 + if len(focusList) > 0 { + price = focusList[0].UnitPrice + skuInfoMap[v.NameID] = append(skuInfoMap[v.NameID], &StoreSkuBindSkuInfo{ + SkuID: v.ID, + IsSale: 1, + }) + skuNameMap[v.NameID] = price } else { - specQuality = float64(v.SpecQuality) + if v.Unit == model.SpecialUnit { + if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { + specQuality = float64(v.SpecQuality) * 1000 + } else { + specQuality = float64(v.SpecQuality) + } + price = int(utils.Float64TwoInt64(utils.Int2Float64(model.SpecialSpecQuality) / specQuality * utils.Int2Float64(skuMap[v.ID]))) + } else { + price = skuMap[v.ID] + } + if skuNameMap[v.NameID] < price { + skuNameMap[v.NameID] = price + } } - price = int(utils.Float64TwoInt64(utils.Int2Float64(model.SpecialSpecQuality) / specQuality * utils.Int2Float64(skuMap[v.ID]))) - } else { - price = skuMap[v.ID] } - if skuNameMap[v.NameID] < price { - skuNameMap[v.NameID] = price + for k, v := range skuNameMap { + skuBindInfo := &StoreSkuBindInfo{ + NameID: k, + UnitPrice: v, + IsFocus: 1, + IsSale: 1, + Skus: skuInfoMap[k], + } + skuBindInfos = append(skuBindInfos, skuBindInfo) } - } - for k, v := range skuNameMap { - skuBindInfo := &StoreSkuBindInfo{ - NameID: k, - UnitPrice: v, - IsFocus: 1, - IsSale: 1, + tUpdate := &tUpdateStoresSkus{ + StoreID: store.ID, + SkuBindInfos: skuBindInfos, } - skuBindInfos = append(skuBindInfos, skuBindInfo) - } - storeList, err := dao.GetStoreList(db, nil, nil, "") - for _, v := range storeList { - storeIDs = append(storeIDs, v.ID) + retVal = []*tUpdateStoresSkus{tUpdate} + return retVal, err } + taskParallel := tasksch.NewParallelTask("根据skuID关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList) + tasksch.HandleTask(taskParallel, task, true).Run() + result1, _ = taskParallel.GetResult(0) case 2: - UpdateStoresSkus(ctx, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError) + for _, v := range result1 { + tUpdate := v.(*tUpdateStoresSkus) + UpdateStoresSkus(ctx, []int{tUpdate.StoreID}, tUpdate.SkuBindInfos, false, isAsync, isContinueWhenError) + } } return result, err } @@ -2861,9 +2925,9 @@ func GetCellForFocusStoreSkus(db *dao.DaoDB, rowNum int, row []string, sheetPara func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { var ( - skuBindInfos []*StoreSkuBindInfo - skuNameMap = make(map[int][]*StoreSkuBindSkuInfo) - storeIDs []int + skuNameMap = make(map[int][]*StoreSkuBindSkuInfo) + storeIDs []int + result1 []interface{} ) db := dao.GetDB() skuList, err := dao.GetSkus(db, skuIDs, nil, nil, nil) @@ -2883,26 +2947,42 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin case 1: taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { store := batchItemList[0].(*model.Store) + var skuBindInfos []*StoreSkuBindInfo for k, v := range skuNameMap { - midPrice, _ := dao.GetMidPriceByNameID(db, store.CityCode, k, utils.Time2Date(time.Now().AddDate(0, 0, -1))) + var price int + focusList, _ := dao.GetStoreSkuBindByNameID(db, store.ID, k, model.StoreSkuBindStatusNormal) + //有关注过 + if len(focusList) > 0 { + price = focusList[0].UnitPrice + } else { + priceReferList, _, _ := dao.GetPriceReferSnapshot(db, []int{store.CityCode}, nil, k, utils.Time2Date(time.Now().AddDate(0, 0, -1)), 0, 9999) + if len(priceReferList) > 0 { + price = priceReferList[0].MidUnitPrice + } + } skuBindInfo := &StoreSkuBindInfo{ NameID: k, - UnitPrice: midPrice, + UnitPrice: price, IsFocus: 1, Skus: v, } - retVal = []*StoreSkuBindInfo{skuBindInfo} + skuBindInfos = append(skuBindInfos, skuBindInfo) } + tUpdate := &tUpdateStoresSkus{ + StoreID: store.ID, + SkuBindInfos: skuBindInfos, + } + retVal = []*tUpdateStoresSkus{tUpdate} return retVal, err } taskParallel := tasksch.NewParallelTask("根据skuID部分关注商品", tasksch.NewParallelConfig().SetIsContinueWhenError(isContinueWhenError), ctx, taskFunc, storeList) tasksch.HandleTask(taskParallel, task, true).Run() - result1, _ := taskParallel.GetResult(0) - for _, v := range result1 { - skuBindInfos = append(skuBindInfos, v.(*StoreSkuBindInfo)) - } + result1, _ = taskParallel.GetResult(0) case 2: - UpdateStoresSkus(ctx, storeIDs, skuBindInfos, false, isAsync, isContinueWhenError) + for _, v := range result1 { + tUpdate := v.(*tUpdateStoresSkus) + UpdateStoresSkus(ctx, []int{tUpdate.StoreID}, tUpdate.SkuBindInfos, false, isAsync, isContinueWhenError) + } } return result, err } @@ -2917,6 +2997,63 @@ func FocusStoreSkusBySku(ctx *jxcontext.Context, skuIDs []int, isAsync, isContin return hint, err } +func AutoFocusStoreSkusWithoutFocus(ctx *jxcontext.Context, skuIDs []int, isSync bool) (err error) { + var ( + nameMap = make(map[int]*StoreSkuBindInfo) + ) + db := dao.GetDB() + storeList, err := dao.GetStoreList(db, nil, nil, "") + for _, v := range storeList { + storeSkuList, _ := dao.GetStoreSkusAndSkuName(db, []int{v.ID}, skuIDs, nil) + for _, vv := range storeSkuList { + if nameMap[vv.ID] != nil { + nameMap[vv.ID].Skus = append(nameMap[vv.ID].Skus, &StoreSkuBindSkuInfo{ + SkuID: vv.SkuID, + }) + } else { + skuBindInfo := &StoreSkuBindInfo{ + UnitPrice: vv.UnitPrice, + NameID: vv.ID, + StoreID: v.ID, + Skus: []*StoreSkuBindSkuInfo{}, + } + nameMap[vv.ID] = skuBindInfo + } + } + } + for _, v := range nameMap { + var skuBindInfoList []*StoreSkuBindInfo + skuBindInfoResult := &StoreSkuBindInfo{ + NameID: v.NameID, + UnitPrice: v.UnitPrice, + IsFocus: 1, + } + var skuBindSkuList []*StoreSkuBindSkuInfo + skuMap := make(map[int]int) + skuList, _ := dao.GetSkus(db, nil, []int{v.NameID}, nil, nil) + if len(v.Skus) != len(skuList) { + for _, skus := range v.Skus { + skuMap[skus.SkuID] = 1 + } + for _, vv := range skuList { + if skuMap[vv.ID] != 1 { + continue + } + skuBindSkuList = append(skuBindSkuList, &StoreSkuBindSkuInfo{ + SkuID: vv.ID, + IsSale: 0, + }) + } + } + skuBindInfoList = append(skuBindInfoList, skuBindInfoResult) + if isSync { + UpdateStoreSkus(ctx, v.StoreID, skuBindInfoList, true, true) + } else { + updateStoresSkusWithoutSync(ctx, db, []int{v.StoreID}, skuBindInfoList, false) + } + } + return err +} func UpdateStoreSkuNamePrice(ctx *jxcontext.Context, storeID, nameID, unitPrice int, isAsync bool) (hint string, err error) { // db := dao.GetDB() // skuList, err := dao.GetSkus(db, nil, []int{nameID}, nil, nil) diff --git a/business/jxstore/event/event.go b/business/jxstore/event/event.go new file mode 100644 index 000000000..4a9713f86 --- /dev/null +++ b/business/jxstore/event/event.go @@ -0,0 +1,9 @@ +package event + +func AddOperateEvent() { + +} + +func AddOperateEventDetail() { + +} diff --git a/business/jxstore/misc/misc.go b/business/jxstore/misc/misc.go index 0e667ec28..fa1b06226 100644 --- a/business/jxstore/misc/misc.go +++ b/business/jxstore/misc/misc.go @@ -141,7 +141,7 @@ func Init() { cms.CurVendorSync.ChangeStoreSkuSaleStatus(jxcontext.AdminCtx, 0, true, true) }, ChangeStoreSkuSaleStatusList) ScheduleTimerFunc("BeginSavePriceRefer", func() { - report.BeginSavePriceRefer(jxcontext.AdminCtx, nil, nil) + report.BeginSavePriceRefer(jxcontext.AdminCtx, nil, nil, true, true) }, priceReferTimeList) ScheduleTimerFunc("CreateStorePriceScore", func() { cms.CreateStorePriceScore(jxcontext.AdminCtx) diff --git a/business/jxstore/report/report.go b/business/jxstore/report/report.go index cc78fbe71..997dcce74 100644 --- a/business/jxstore/report/report.go +++ b/business/jxstore/report/report.go @@ -4,9 +4,10 @@ import ( "errors" "fmt" "math" + "sort" "time" - "git.rosy.net.cn/jx-callback/globals" + "git.rosy.net.cn/jx-callback/business/jxutils/tasksch" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils/jxcontext" @@ -14,6 +15,14 @@ import ( "git.rosy.net.cn/jx-callback/business/model/dao" ) +type tStoreSkuBindAndSkuName struct { + CityCode int + StoreID int `orm:"column(store_id)"` + NameID int `orm:"column(name_id)"` + UnitPrice int + UnitPriceList []int +} + func GetStatisticsReportForOrders(ctx *jxcontext.Context, storeIDs []int, fromDate string, toDate string) (statisticsReportForOrdersList []*dao.StatisticsReportForOrdersList, err error) { db := dao.GetDB() fromDateParm := utils.Str2Time(fromDate) @@ -44,7 +53,7 @@ func StatisticsReportForStoreSkusPrice(ctx *jxcontext.Context, cityCodes, skuIDs if snapDate != "" { snapDateParam = utils.Str2Time(snapDate) } - priceReferSnapshot, totalCount, err := dao.GetPriceReferSnapshot(db, cityCodes, skuIDs, snapDateParam, offset, pageSize) + priceReferSnapshot, totalCount, err := dao.GetPriceReferSnapshot(db, cityCodes, skuIDs, 0, snapDateParam, offset, pageSize) pagedInfo = &model.PagedInfo{ Data: priceReferSnapshot, TotalCount: totalCount, @@ -52,33 +61,179 @@ func StatisticsReportForStoreSkusPrice(ctx *jxcontext.Context, cityCodes, skuIDs return } -func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int) (err error) { +func BeginSavePriceRefer(ctx *jxcontext.Context, cityCodes, skuIDs []int, isAsync, isContinueWhenError bool) (hint string, err error) { + var priceReferSnapshotList []*model.PriceReferSnapshot db := dao.GetDB() snapshotAt := utils.Time2Date(time.Now().AddDate(0, 0, -1)) - priceReferSnapshot, err := dao.GetStatisticsReportForStoreSkusPrice(db, cityCodes, skuIDs) - if len(priceReferSnapshot) > 0 { - dao.Begin(db) - defer func() { - if r := recover(); r != nil || err != nil { - dao.Rollback(db) - if r != nil { - panic(r) + taskSeqFunc := func(task *tasksch.SeqTask, step int, params ...interface{}) (result interface{}, err error) { + switch step { + case 0: + priceReferSnapshot, err := dao.GetStatisticsReportForStoreSkusPrice(db, cityCodes, skuIDs) + if len(priceReferSnapshot) > 0 { + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + dao.DeletePriceReferHistory(db, utils.Time2Date(snapshotAt.AddDate(0, 0, -7))) + priceReferSnapshotDelete := &model.PriceReferSnapshot{SnapshotAt: snapshotAt} + dao.DeleteEntity(db, priceReferSnapshotDelete, "SnapshotAt") + taskFunc := func(task *tasksch.ParallelTask, batchItemList []interface{}, params ...interface{}) (retVal interface{}, err error) { + v := batchItemList[0].(*model.PriceReferSnapshot) + dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) + v.SnapshotAt = snapshotAt + err = dao.CreateEntity(db, v) + return retVal, err + } + taskParallel := tasksch.NewParallelTask("生成价格统计", tasksch.NewParallelConfig(), ctx, taskFunc, priceReferSnapshot) + tasksch.HandleTask(taskParallel, task, true).Run() + _, err = taskParallel.GetResult(0) + dao.Commit(db) + } + case 1: + priceReferSnapshotList, err = dao.GetPriceReferSnapshotNoPage(db, nil, nil, nil, snapshotAt) + var ( + citySkuMap = make(map[int]map[int][]int) + resultMap = make(map[int]map[int]*model.PriceReferSnapshot) + ) + storeList, err := dao.GetStoreList(db, nil, nil, "") + if err != nil { + return result, err + } + for _, v := range storeList { + var tList []*tStoreSkuBindAndSkuName + sql := ` + SELECT DISTINCT b.city_code, a.store_id, Round(a.unit_price/IF(b.pay_percentage < 50 , 70, b.pay_percentage) * 100) AS unit_price, c.name_id + FROM store_sku_bind a + JOIN store b ON b.id = a.store_id AND b.deleted_at = ? AND b.status != ? + JOIN sku c ON c.id = a.sku_id + WHERE a.store_id = ? + AND c.name_id NOT IN( + SELECT b.name_id + FROM store_sku_bind a + JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? + WHERE a.deleted_at = ? + AND a.store_id = ? + AND b.name_id NOT IN(SELECT DISTINCT b.name_id + FROM store_sku_bind a + JOIN sku b ON a.sku_id = b.id AND b.deleted_at = ? + WHERE a.deleted_at = ? + AND a.store_id = ? + AND a.status = ?) + ) + AND a.deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + model.StoreStatusDisabled, + v.ID, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + v.ID, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + v.ID, + model.StoreSkuBindStatusNormal, + utils.DefaultTimeValue, + } + dao.GetRows(db, &tList, sql, sqlParams...) + skuNameMap := make(map[int][]int) + if len(tList) > 0 { + for _, vv := range tList { + skuNameMap[vv.NameID] = append(skuNameMap[vv.NameID], vv.UnitPrice) + } + if citySkuMap[v.CityCode] != nil { + for nameID, unitPriceList := range skuNameMap { + if citySkuMap[v.CityCode][nameID] != nil { + citySkuMap[v.CityCode][nameID] = append(citySkuMap[v.CityCode][nameID], unitPriceList...) + } else { + citySkuMap[v.CityCode][nameID] = unitPriceList + } + } + } else { + citySkuMap[v.CityCode] = skuNameMap + } } } - }() - priceReferSnapshotDeleteHis := &model.PriceReferSnapshot{SnapshotAt: snapshotAt.AddDate(0, -1, 0)} - priceReferSnapshotDelete := &model.PriceReferSnapshot{SnapshotAt: snapshotAt} - dao.DeleteEntity(db, priceReferSnapshotDeleteHis, "SnapshotAt") - dao.DeleteEntity(db, priceReferSnapshotDelete, "SnapshotAt") - for _, v := range priceReferSnapshot { - dao.WrapAddIDCULDEntity(v, ctx.GetUserName()) - v.SnapshotAt = snapshotAt - if err = dao.CreateEntity(db, v); err != nil { - return err + for k1, v := range citySkuMap { + skuNameMap := make(map[int]*model.PriceReferSnapshot) + for k2, _ := range v { + var midUnitPrice int + var avgUnitPrice int + sort.Ints(v[k2]) + if len(v[k2])%2 == 0 { + midUnitPrice = v[k2][len(v[k2])/2-1] + } else { + midUnitPrice = v[k2][len(v[k2])/2] + } + for _, vv := range v[k2] { + avgUnitPrice += vv + } + skuNameMap[k2] = &model.PriceReferSnapshot{ + MidUnitPrice: midUnitPrice, + MaxUnitPrice: v[k2][len(v[k2])-1], + MinUnitPrice: v[k2][0], + AvgUnitPrice: avgUnitPrice / len(v[k2]), + } + } + resultMap[k1] = skuNameMap } + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + if len(priceReferSnapshotList) > 0 { + for _, v := range priceReferSnapshotList { + if resultMap[v.CityCode][v.NameID] != nil { + v.MidUnitPrice = resultMap[v.CityCode][v.NameID].MidUnitPrice + v.MaxUnitPrice = resultMap[v.CityCode][v.NameID].MaxUnitPrice + v.AvgUnitPrice = resultMap[v.CityCode][v.NameID].AvgUnitPrice + v.MinUnitPrice = resultMap[v.CityCode][v.NameID].MinUnitPrice + dao.UpdateEntity(db, v, "MidUnitPrice", "MaxUnitPrice", "MinUnitPrice", "AvgUnitPrice") + } + } + } + dao.Commit(db) + case 2: + dao.Begin(db) + defer func() { + if r := recover(); r != nil || err != nil { + dao.Rollback(db) + if r != nil { + panic(r) + } + } + }() + if len(priceReferSnapshotList) > 0 { + for _, v := range priceReferSnapshotList { + result, _ := dao.GetPriceReferPrice(db, v.CityCode, v.SkuID, snapshotAt) + v.MaxPrice = result.MaxPrice + v.MinPrice = result.MinPrice + v.AvgPrice = result.AvgPrice + v.MidPrice = result.MidPrice + dao.UpdateEntity(db, v, "MidPrice", "MaxPrice", "MinPrice", "AvgPrice") + } + } + dao.Commit(db) } - dao.Commit(db) - globals.SugarLogger.Debugf("CreatePriceRefer") + return result, err } - return err + taskSeq := tasksch.NewSeqTask2("生成每日价格统计", ctx, isContinueWhenError, taskSeqFunc, 3) + tasksch.HandleTask(taskSeq, nil, true).Run() + if !isAsync { + _, err = taskSeq.GetResult(0) + hint = "1" + } else { + hint = taskSeq.GetID() + } + return hint, err } diff --git a/business/model/const.go b/business/model/const.go index 8ffff9d36..1e60f5772 100644 --- a/business/model/const.go +++ b/business/model/const.go @@ -100,6 +100,11 @@ var ( ComplaintReasons71: "骑手提前点击取货/送达", } + SupplementTypeName = map[int]string{ + BadAppraiseSupplement: "差评退款", + Coupon: "优惠券", + } + MultiStoresVendorMap = map[int]int{ VendorIDJD: 1, VendorIDMTWM: 0, @@ -231,6 +236,11 @@ const ( ComplaintReasons71 = 71 //"骑手提前点击取货/送达", ) +const ( + BadAppraiseSupplement = 1 //差评退款 + Coupon = 2 //优惠券 +) + const ( WaybillStatusRefuseFailedGetGoods = -70 WaybillStatusUnknown = 0 diff --git a/business/model/dao/dao_order.go b/business/model/dao/dao_order.go index 1ae767e6d..321ca7d9a 100644 --- a/business/model/dao/dao_order.go +++ b/business/model/dao/dao_order.go @@ -1053,7 +1053,7 @@ func GetWayBillByOrderID(db *DaoDB, orderStatus, vendorID, waybillVendorID int, return wayBillList, err } -func GetOrdersSupplement(db *DaoDB, storIDs, vendorIDs []int, vendorOrderID string, fromTime, toTime time.Time, status, stype, offset, pageSize int) (orderSupplementFee []*model.OrderSupplementFee, totalCount int, err error) { +func GetOrdersSupplement(db *DaoDB, storIDs, vendorIDs []int, vendorOrderID string, fromTime, toTime time.Time, status, stype, IsReverse, offset, pageSize int) (orderSupplementFee []*model.OrderSupplementFee, totalCount int, err error) { sql := ` SELECT SQL_CALC_FOUND_ROWS * FROM order_supplement_fee @@ -1076,7 +1076,7 @@ func GetOrdersSupplement(db *DaoDB, storIDs, vendorIDs []int, vendorOrderID stri sqlParams = append(sqlParams, storIDs) } if len(vendorIDs) > 0 { - sql += " AND store_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" + sql += " AND vendor_id IN (" + GenQuestionMarks(len(vendorIDs)) + ")" sqlParams = append(sqlParams, vendorIDs) } if vendorOrderID != "" { @@ -1087,10 +1087,15 @@ func GetOrdersSupplement(db *DaoDB, storIDs, vendorIDs []int, vendorOrderID stri sql += " AND status = ?" sqlParams = append(sqlParams, status) } - if stype >= 0 { + if stype > 0 { sql += " AND type = ?" sqlParams = append(sqlParams, stype) } + if IsReverse == -1 { + sql += " AND link_id = 0" + } else if IsReverse == 1 { + sql += " AND link_id <> 0" + } sql += ` LIMIT ? OFFSET ?` sqlParams = append(sqlParams, pageSize, offset) diff --git a/business/model/dao/report.go b/business/model/dao/report.go index 316e5b1ed..e65873b69 100644 --- a/business/model/dao/report.go +++ b/business/model/dao/report.go @@ -36,8 +36,11 @@ type StatisticsReportForOrdersList struct { type PriceReferSnapshotExt struct { model.PriceReferSnapshot - CityName string `json:"cityName"` - SkuName string `json:"skuName"` + CityName string `json:"cityName"` + SkuName string `json:"skuName"` + SpecQuality float32 + Unit string + SpecUnit string } //查询统计订单信息 @@ -187,11 +190,7 @@ func GetGetStatisticsReportForAfsOrders(db *DaoDB, storeIDs []int, fromDate time func GetStatisticsReportForStoreSkusPrice(db *DaoDB, cityCodes, skuIDs []int) (priceReferSnapshot []*model.PriceReferSnapshot, err error) { sql := ` - SELECT b.city_code,a.sku_id, - ROUND(MAX(a.price/IF(b.pay_percentage=0,100,b.pay_percentage)*100)) max_price, - ROUND(MIN(a.price/IF(b.pay_percentage=0,100,b.pay_percentage)*100)) min_price, - ROUND(AVG(a.price/IF(b.pay_percentage=0,100,b.pay_percentage)*100)) avg_price, - ROUND(SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT((a.price/IF(b.pay_percentage=0,100,b.pay_percentage))*100 ORDER BY (a.price/IF(b.pay_percentage=0,100,b.pay_percentage))*100),',',Count(1)/2),',',-1)) mid_price, + SELECT b.city_code,a.sku_id,c.name_id, MAX(a.jd_price) max_jd_price, MIN(a.jd_price) min_jd_price, ROUND(AVG(a.jd_price)) avg_jd_price, @@ -212,6 +211,7 @@ func GetStatisticsReportForStoreSkusPrice(db *DaoDB, cityCodes, skuIDs []int) (p t1.avg_vendor_price FROM store_sku_bind a JOIN store b ON a.store_id = b.id AND b.deleted_at = ? AND b.status != ? + JOIN sku c ON a.sku_id = c.id LEFT JOIN ( SELECT SUM(t1.count),t1.sku_id,MAX(t1.sale_price) max_sale_price,MIN(t1.sale_price) min_sale_price,ROUND(AVG(t1.sale_price)) avg_sale_price,MAX(t1.vendor_price) max_vendor_price,MIN(t1.vendor_price) min_vendor_price,ROUND(AVG(t1.vendor_price)) avg_vendor_price FROM order_sku t1 @@ -219,14 +219,12 @@ func GetStatisticsReportForStoreSkusPrice(db *DaoDB, cityCodes, skuIDs []int) (p GROUP BY 2 )t1 ON t1.sku_id = a.sku_id WHERE a.deleted_at = ? - AND a.status = ? ` sqlParams := []interface{}{ utils.DefaultTimeValue, model.StoreStatusDisabled, time.Now().AddDate(0, -1, 0), utils.DefaultTimeValue, - model.SkuStatusNormal, } if len(skuIDs) > 0 { sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" @@ -236,14 +234,14 @@ func GetStatisticsReportForStoreSkusPrice(db *DaoDB, cityCodes, skuIDs []int) (p sql += " AND b.city_code IN (" + GenQuestionMarks(len(cityCodes)) + ")" sqlParams = append(sqlParams, cityCodes) } - sql += " GROUP BY 1,2" + sql += " GROUP BY 1,2,3" if err = GetRows(db, &priceReferSnapshot, sql, sqlParams...); err == nil { return priceReferSnapshot, nil } return nil, err } -func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, snapDate time.Time, offset, pageSize int) (priceReferSnapshot []*PriceReferSnapshotExt, totalCount int, err error) { +func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, skuNameID int, snapDate time.Time, offset, pageSize int) (priceReferSnapshot []*PriceReferSnapshotExt, totalCount int, err error) { sql := ` SELECT SQL_CALC_FOUND_ROWS a.*,b.name city_name FROM price_refer_snapshot a @@ -254,6 +252,10 @@ func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, snapDate time.Tim sqlParams := []interface{}{ utils.DefaultTimeValue, } + if skuNameID > 0 { + sql += " AND a.name_id = ?" + sqlParams = append(sqlParams, skuNameID) + } if len(skuIDs) > 0 { sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" sqlParams = append(sqlParams, skuIDs) @@ -284,3 +286,44 @@ func GetPriceReferSnapshot(db *DaoDB, cityCodes, skuIDs []int, snapDate time.Tim } return priceReferSnapshot, totalCount, err } + +func GetPriceReferSnapshotNoPage(db *DaoDB, cityCodes, skuIDs, skuNameIDs []int, snapDate time.Time) (priceReferSnapshot []*model.PriceReferSnapshot, err error) { + sql := ` + SELECT a.* + FROM price_refer_snapshot a + WHERE 1=1 + AND a.deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + } + if len(skuNameIDs) > 0 { + sql += " AND a.name_id IN (" + GenQuestionMarks(len(skuNameIDs)) + ")" + sqlParams = append(sqlParams, skuNameIDs) + } + if len(skuIDs) > 0 { + sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + if len(cityCodes) > 0 { + sql += " AND a.city_code IN (" + GenQuestionMarks(len(cityCodes)) + ")" + sqlParams = append(sqlParams, cityCodes) + } + if !utils.IsTimeZero(snapDate) { + sql += " AND a.snapshot_at = ?" + sqlParams = append(sqlParams, snapDate) + } + err = GetRows(db, &priceReferSnapshot, sql, sqlParams...) + return priceReferSnapshot, err +} + +func DeletePriceReferHistory(db *DaoDB, snapDate time.Time) (num int64, err error) { + sql := ` + DELETE FROM price_refer_snapshot + WHERE snapshot_at <= ? + ` + sqlParams := []interface{}{ + snapDate, + } + return ExecuteSQL(db, sql, sqlParams...) +} diff --git a/business/model/dao/store.go b/business/model/dao/store.go index dd1f14c98..84e39ad41 100644 --- a/business/model/dao/store.go +++ b/business/model/dao/store.go @@ -504,7 +504,7 @@ func GetStorePriceScore(db *DaoDB, storeIDs, vendorIDs []int, fromScore, toScore FROM store_price_score_snapshot a JOIN store b ON b.id = a.store_id JOIN place e ON e.code = b.city_code - JOIN (SELECT a.store_id, count(d.type = ? OR NULL) direct_down_count, count(d.type = ? OR NULL) sec_kill_count + LEFT JOIN (SELECT a.store_id, count(d.type = ? OR NULL) direct_down_count, count(d.type = ? OR NULL) sec_kill_count FROM store_sku_bind a LEFT JOIN act_store_sku b ON a.store_id = b.store_id AND b.sku_id = a.sku_id LEFT JOIN act_map c ON c.act_id = b.act_id @@ -567,16 +567,15 @@ func GetStorePriceScore(db *DaoDB, storeIDs, vendorIDs []int, fromScore, toScore func GetStorePriceScoreSnapshot(db *DaoDB, snapDate time.Time) (storePriceScoreSnapshot []*model.StorePriceScoreSnapshot, err error) { sql := ` - SELECT c.store_id,ROUND(count(c.price <= a.mid_price or NULL)/count(*)*100,2) score + SELECT c.store_id,ROUND(count(c.unit_price/IF(d.pay_percentage < 50 , 70, d.pay_percentage) <= a.mid_unit_price or NULL)/count(*)*100,2) score FROM price_refer_snapshot a - JOIN store_sku_bind c ON c.sku_id = a.sku_id AND c.status = 1 AND c.deleted_at = ? + JOIN store_sku_bind c ON c.sku_id = a.sku_id AND c.status = ? AND c.deleted_at = ? JOIN store d ON c.store_id = d.id AND d.city_code = a.city_code AND d.deleted_at = ? AND d.status != ? WHERE 1=1 ` sqlParams := []interface{}{ - utils.DefaultTimeValue, - utils.DefaultTimeValue, - model.StoreStatusDisabled, + model.StoreSkuBindStatusNormal, utils.DefaultTimeValue, + utils.DefaultTimeValue, model.StoreStatusDisabled, } if !utils.IsTimeZero(snapDate) { sql += " AND a.snapshot_at = ?" diff --git a/business/model/dao/store_sku.go b/business/model/dao/store_sku.go index a4d88e54e..55d7956ee 100644 --- a/business/model/dao/store_sku.go +++ b/business/model/dao/store_sku.go @@ -132,6 +132,7 @@ type StoreSkuNameExt struct { PendingOpType int8 `json:"pendingOpType"` // 取值同 StoreOpRequest.Type PendingUnitPrice int `json:"pendingUnitPrice"` // 这个是待审核的价格申请 + Status int } // GetStoreSkus用 @@ -1228,30 +1229,6 @@ func GetStoreSkuCategories(db *DaoDB, storeID, parentID int) (catList []*model.S return catList, err } -func RefershStoreSkusMidPrice(db *DaoDB, storeIDs []int) (count int64, err error) { - sql := ` - UPDATE store_sku_bind a - JOIN store d ON d.id = a.store_id - JOIN price_refer_snapshot b ON a.sku_id = b.sku_id AND b.snapshot_at = ? AND d.city_code = b.city_code - SET a.price = (b.mid_price*IF(d.pay_percentage=0,100,d.pay_percentage))/100 - WHERE 1=1 - ` - sqlParams := []interface{}{ - utils.Time2Date(time.Now().AddDate(0, 0, -1)), - } - if len(storeIDs) > 0 { - sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" - sqlParams = append(sqlParams, storeIDs) - } - sql += ` - AND (a.price/IF(d.pay_percentage=0,100,d.pay_percentage))*100 > b.mid_price - AND a.deleted_at = ? - AND a.status = ? - ` - sqlParams = append(sqlParams, utils.DefaultTimeValue, model.SkuStatusNormal) - return ExecuteSQL(db, sql, sqlParams) -} - func GetStoreSkuNamePrice(db *DaoDB) (storeSkuNamePriceList []*model.StoreSkuNamePrice, err error) { sql := ` SELECT * @@ -1390,49 +1367,103 @@ func GetDeletedStoreSkuBind(db *DaoDB, storeID, skuID int) (storeSkuBind *model. return storeSkuBind } -func GetMidPriceByNameID(db *DaoDB, cityCode, skuNameID int, snapDate time.Time) (midPrice int, err error) { +func GetStoreSkuBindByNameID(db *DaoDB, storeID, nameID, status int) (storeSkuBind []*model.StoreSkuBind, err error) { + sql := ` + SELECT c.* + FROM sku a + JOIN store_sku_bind c ON c.sku_id = a.id + WHERE c.store_id = ? + AND a.name_id = ? + AND c.deleted_at = ? + AND a.deleted_at = ? + AND c.status = ? + ` + sqlParams := []interface{}{ + storeID, + nameID, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + status, + } + err = GetRows(db, &storeSkuBind, sql, sqlParams...) + return storeSkuBind, err +} + +func GetPriceReferPrice(db *DaoDB, cityCode int, skuID int, snapDate time.Time) (result *PriceReferSnapshotExt, err error) { var ( - sku []*model.SkuAndName - skuMap = make(map[int]int) + pRefer *PriceReferSnapshotExt + priceRefer = &PriceReferSnapshotExt{} ) sql := ` - SELECT a.mid_price price, a.sku_id id, b.spec_quality, c.unit, b.spec_unit + SELECT a.max_unit_price, a.min_unit_price, a.avg_unit_price, a.mid_unit_price, a.sku_id id, b.spec_quality, c.unit, b.spec_unit FROM price_refer_snapshot a JOIN sku b ON a.sku_id = b.id JOIN sku_name c ON c.id = b.name_id - WHERE c.id = ? + WHERE 1=1 AND a.snapshot_at = ? AND a.city_code = ? ` sqlParams := []interface{}{ - skuNameID, snapDate, cityCode, } - err = GetRows(db, &sku, sql, sqlParams...) - if err != nil { - return 0, err + if skuID > 0 { + sql += " AND a.sku_id = ?" + sqlParams = append(sqlParams, skuID) } - if len(sku) > 0 { - for _, v := range sku { - var ( - price int - specQuality float64 - ) - if v.Unit == model.SpecialUnit { - if v.SpecUnit == model.SpecUnitNames[1] || v.SpecUnit == model.SpecUnitNames[2] { - specQuality = float64(v.SpecQuality) * 1000 - } else { - specQuality = float64(v.SpecQuality) - } - price = int(utils.Float64TwoInt64(utils.Int2Float64(model.SpecialSpecQuality) / specQuality * utils.Int2Float64(v.Price))) + err = GetRow(db, &pRefer, sql, sqlParams...) + if err != nil { + return nil, err + } + if pRefer != nil { + var ( + specQuality float64 + ) + if pRefer.Unit == model.SpecialUnit { + if pRefer.SpecUnit == model.SpecUnitNames[1] || pRefer.SpecUnit == model.SpecUnitNames[2] { + specQuality = float64(pRefer.SpecQuality) * 1000 } else { - price = v.Price - } - if skuMap[skuNameID] < price { - skuMap[skuNameID] = price + specQuality = float64(pRefer.SpecQuality) } + priceRefer.MaxPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.MaxUnitPrice))) + priceRefer.MinPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.MinUnitPrice))) + priceRefer.AvgPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.AvgUnitPrice))) + priceRefer.MidPrice = int(utils.Float64TwoInt64(specQuality / utils.Int2Float64(model.SpecialSpecQuality) * utils.Int2Float64(pRefer.MidUnitPrice))) + } else { + priceRefer.MaxPrice = pRefer.MaxUnitPrice + priceRefer.MinPrice = pRefer.MinUnitPrice + priceRefer.AvgPrice = pRefer.AvgUnitPrice + priceRefer.MidPrice = pRefer.MidUnitPrice } } - return skuMap[skuNameID], err + return priceRefer, err +} + +func GetStoreSkusAndSkuName(db *DaoDB, storeIDs, skuIDs, nameIDs []int) (storeSkuNameExt []*StoreSkuNameExt, err error) { + sql := ` + SELECT a.*,c.id + FROM store_sku_bind a + JOIN sku b ON b.id = a.sku_id AND b.deleted_at = ? + JOIN sku_name c ON c.id = b.name_id AND c.deleted_at = ? + WHERE a.deleted_at = ? + ` + sqlParams := []interface{}{ + utils.DefaultTimeValue, + utils.DefaultTimeValue, + utils.DefaultTimeValue, + } + if len(storeIDs) > 0 { + sql += " AND a.store_id IN (" + GenQuestionMarks(len(storeIDs)) + ")" + sqlParams = append(sqlParams, storeIDs) + } + if len(skuIDs) > 0 { + sql += " AND a.sku_id IN (" + GenQuestionMarks(len(skuIDs)) + ")" + sqlParams = append(sqlParams, skuIDs) + } + if len(nameIDs) > 0 { + sql += " AND b.name_id IN (" + GenQuestionMarks(len(nameIDs)) + ")" + sqlParams = append(sqlParams, nameIDs) + } + err = GetRows(db, &storeSkuNameExt, sql, sqlParams...) + return storeSkuNameExt, err } diff --git a/business/model/event.go b/business/model/event.go new file mode 100644 index 000000000..9a5a8cb9f --- /dev/null +++ b/business/model/event.go @@ -0,0 +1,35 @@ +package model + +import "time" + +type OperateEvent struct { + ID int64 `orm:"column(id)" json:"id"` + CreatedAt time.Time `orm:"auto_now_add;type(datetime)" json:"createdAt"` + LastOperator string `orm:"size(32)" json:"lastOperator"` // 最后操作员 + AccessUUID string `orm:"column(access_uuid)" json:"accessUUID"` + UserID string `orm:"column(user_id)" json:"userID"` + APIFunction string `orm:"column(api_function)" json:"apiFunction"` +} + +func (v *OperateEvent) TableIndex() [][]string { + return [][]string{ + []string{"AccessUUID", "UserID"}, + } +} + +type OperateEventDetail struct { + ID int64 `orm:"column(id)" json:"id"` + OperateType int `json:"operateType"` // 1为修改,2为新增,4为删除 + ThingID int `orm:"column(thing_id)" json:"thingID"` + ThingType int `json:"thingType"` //各字段类型 + StoreID int `orm:"column(store_id)" json:"storeID"` + AccessUUID string `orm:"column(access_uuid)" json:"accessUUID"` + BeforeData string `orm:"size(32)" json:"beforeData"` + AfterData string `orm:"size(32)" json:"afterData"` +} + +func (v *OperateEventDetail) TableIndex() [][]string { + return [][]string{ + []string{"AccessUUID", "ThingID", "StoreID"}, + } +} diff --git a/business/model/order.go b/business/model/order.go index 375f91598..0b1428818 100644 --- a/business/model/order.go +++ b/business/model/order.go @@ -346,7 +346,22 @@ type OrderPayRefund struct { type OrderSupplementFee struct { ModelIDCULD - VendorOrderID string `orm:"column(vendor_order_id);index;size(48)" json:"vendorOrderID"` + StoreID int `orm:"column(store_id)" json:"storeID"` + VendorOrderID *string `orm:"column(vendor_order_id);size(48)" json:"vendorOrderID"` + VendorID *string `orm:"column(vendor_id)" json:"vendorID"` + Status int `json:"status"` //账单状态,若已结账则不允许再修改 ,暂时 0为未结账,1为已结账,-1为作废 + LinkID int `orm:"column(link_id)" json:"linkID"` //作为冲账标志关联某条扣款记录 + SupplementTime *time.Time `orm:"type(datetime);null" json:"supplementTime"` + Type int `json:"type"` //扣款类型,1为差评订单补贴,2为优惠券 + SupplementFee int `json:"supplementFee"` //扣款金额 + BillID string `orm:"column(bill_id);size(48)" json:"billID"` //账单ID + Comment string `orm:"size(255)" json:"comment"` +} + +func (v *OrderSupplementFee) TableIndex() [][]string { + return [][]string{ + []string{"StoreID", "VendorOrderID", "SupplementTime"}, + } } // 判断是否是购买平台自有物流 diff --git a/business/model/store.go b/business/model/store.go index 83467b027..553f564b9 100644 --- a/business/model/store.go +++ b/business/model/store.go @@ -444,10 +444,15 @@ type PriceReferSnapshot struct { SnapshotAt time.Time `orm:"type(datetime)" json:"snapshotAt"` // 这个不同于CreatedAt,SnapshotAt是逻辑上的时间,CreatedAt是实际存储的时间 CityCode int `json:"cityCode"` SkuID int `orm:"column(sku_id)" json:"skuId"` + NameID int `orm:"column(name_id)" json:"nameID"` MaxPrice int `json:"maxPrice"` MinPrice int `json:"minPrice"` AvgPrice int `json:"avgPrice"` MidPrice int `json:"midPrice"` + MaxUnitPrice int `json:"maxUnitPrice"` + MinUnitPrice int `json:"minUnitPrice"` + AvgUnitPrice int `json:"avgUnitPrice"` + MidUnitPrice int `json:"midUnitPrice"` MaxJdPrice int `json:"maxJdPrice"` MinJdPrice int `json:"minJdPrice"` AvgJdPrice int `json:"avgJdPrice"` diff --git a/controllers/jx_order.go b/controllers/jx_order.go index fd9ee8f67..e9372bfab 100644 --- a/controllers/jx_order.go +++ b/controllers/jx_order.go @@ -926,6 +926,49 @@ func (c *OrderController) ComplaintRider() { }) } +// @Title 查询门店订单扣款记录 +// @Description 查询门店订单扣款记录 +// @Param token header string true "认证token" +// @Param storeIDs query string false "门店ID列表" +// @Param vendorOrderID query string false "订单ID" +// @Param vendorIDs query string false "订单所属厂商ID列表" +// @Param fromTime query string false "开始日期(包含),格式(2006-01-02),如果订单号为空此项必须要求" +// @Param toTime query string false "结束日期(包含),格式(2006-01-02),如果订单号为空此项必须要求" +// @Param status query int false "账单状态,0是未结账,1是已结账" +// @Param type query int false "扣款类型,1为差评补贴,2为优惠券" +// @Param isReverse query int false "只查冲账记录,0为默认都查,1为只查冲账,-1为不查冲账" +// @Param offset query int false "结果起始序号(以0开始,缺省为0)" +// @Param pageSize query int false "结果页大小(缺省为50,-1表示全部)" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /GetOrdersSupplement [get] +func (c *OrderController) GetOrdersSupplement() { + var vendorIDList, storeIDList []int + c.callGetOrdersSupplement(func(params *tOrderGetOrdersSupplementParams) (retVal interface{}, errCode string, err error) { + if err = jxutils.Strings2Objs(params.VendorIDs, &vendorIDList, params.StoreIDs, &storeIDList); err == nil { + retVal, err = orderman.GetOrdersSupplement(params.Ctx, storeIDList, vendorIDList, params.VendorOrderID, params.FromTime, params.ToTime, params.Status, params.Type, params.IsReverse, params.Offset, params.PageSize) + } + return retVal, "", err + }) +} + +// @Title 新增修改扣款记录 +// @Description 新增修改扣款记录 +// @Param token header string true "认证token" +// @Param payload formData string true "json数据,格式为OrdersSupplement" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /AddUpdateOrdersSupplement [post] +func (c *OrderController) AddUpdateOrdersSupplement() { + c.callAddUpdateOrdersSupplement(func(params *tOrderAddUpdateOrdersSupplementParams) (retVal interface{}, errCode string, err error) { + ordersSupplement := &model.OrderSupplementFee{} + if err = utils.UnmarshalUseNumber([]byte(params.Payload), ordersSupplement); err == nil { + retVal, err = orderman.AddUpdateOrdersSupplement(params.Ctx, ordersSupplement) + } + return retVal, "", err + }) +} + // @Title 重新计算订单结算信息 // @Description 重新计算订单结算信息 // @Param token header string true "认证token" diff --git a/controllers/jx_report.go b/controllers/jx_report.go index f604dbfc9..7966917de 100644 --- a/controllers/jx_report.go +++ b/controllers/jx_report.go @@ -1,6 +1,7 @@ package controllers import ( + "git.rosy.net.cn/jx-callback/business/jxstore/cms" "git.rosy.net.cn/jx-callback/business/jxstore/report" "git.rosy.net.cn/jx-callback/business/jxutils" "github.com/astaxie/beego" @@ -78,7 +79,20 @@ func (c *ReportController) StatisticsReportForStoreSkusPrice() { // @router /PriceRefer [post] func (c *ReportController) PriceRefer() { c.callPriceRefer(func(params *tReportPriceReferParams) (retVal interface{}, errCode string, err error) { - report.BeginSavePriceRefer(params.Ctx, nil, nil) + report.BeginSavePriceRefer(params.Ctx, nil, nil, true, true) + return retVal, "", err + }) +} + +// @Title 自动关注商品(针对后加的商品规格未关注) +// @Description 自动关注商品(针对后加的商品规格未关注) +// @Param token header string true "认证token" +// @Success 200 {object} controllers.CallResult +// @Failure 200 {object} controllers.CallResult +// @router /AutoFocusStoreSkus [post] +func (c *ReportController) AutoFocusStoreSkus() { + c.callAutoFocusStoreSkus(func(params *tReportAutoFocusStoreSkusParams) (retVal interface{}, errCode string, err error) { + cms.AutoFocusStoreSkusWithoutFocus(params.Ctx, nil, false) return retVal, "", err }) } diff --git a/globals/beegodb/beegodb.go b/globals/beegodb/beegodb.go index 6ac7d068d..5f039f248 100644 --- a/globals/beegodb/beegodb.go +++ b/globals/beegodb/beegodb.go @@ -41,6 +41,9 @@ func Init() { orm.RegisterModel(&model.PriceReferSnapshot{}) orm.RegisterModel(&model.StorePriceScoreSnapshot{}) orm.RegisterModel(&model.StoreSkuNamePrice{}) + orm.RegisterModel(&model.OrderSupplementFee{}) + orm.RegisterModel(&model.OperateEvent{}) + orm.RegisterModel(&model.OperateEventDetail{}) // orm.RegisterModel(&model.ActivityForSku{}) // orm.RegisterModel(&legacymodel.JxBadComments2{}) diff --git a/routers/commentsRouter_controllers.go b/routers/commentsRouter_controllers.go index 2597bd552..579cfa30e 100644 --- a/routers/commentsRouter_controllers.go +++ b/routers/commentsRouter_controllers.go @@ -720,6 +720,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "AddUpdateOrdersSupplement", + Router: `/AddUpdateOrdersSupplement`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "AdjustOrder", @@ -936,6 +945,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], + beego.ControllerComments{ + Method: "GetOrdersSupplement", + Router: `/GetOrdersSupplement`, + AllowHTTPMethods: []string{"get"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:OrderController"], beego.ControllerComments{ Method: "GetPrinterStatus", @@ -1098,6 +1116,15 @@ func init() { Filters: nil, Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ReportController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ReportController"], + beego.ControllerComments{ + Method: "AutoFocusStoreSkus", + Router: `/AutoFocusStoreSkus`, + AllowHTTPMethods: []string{"post"}, + MethodParams: param.Make(), + Filters: nil, + Params: nil}) + beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ReportController"] = append(beego.GlobalControllerRouter["git.rosy.net.cn/jx-callback/controllers:ReportController"], beego.ControllerComments{ Method: "PriceRefer",