232 lines
6.7 KiB
Go
232 lines
6.7 KiB
Go
package bidding
|
||
|
||
import (
|
||
"fmt"
|
||
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
|
||
"git.rosy.net.cn/jx-callback/business/model"
|
||
"git.rosy.net.cn/jx-callback/business/model/dao"
|
||
"sort"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
// GetStatisticsList 京西数据查询
|
||
//func GetStatisticsList(start, end time.Time, storeIds []int, offset, pageSize int) (*model.PagedInfo, error) {
|
||
// return dao.GetStatistics(dao.GetDB(), start, end, storeIds, offset, pageSize)
|
||
//}
|
||
|
||
// GetMTInfo 更新美团门店信息
|
||
//func GetMTInfo() []error {
|
||
// var db = dao.GetDB()
|
||
// var errList = make([]error, 0, 0)
|
||
// // 获取当前一月有效订单的门店信息
|
||
// effectiveStores, err := dao.StoreInformationStatistics(db)
|
||
// if err != nil {
|
||
// return append(errList, err)
|
||
// }
|
||
//
|
||
// var mtApi *mtwmapi.API
|
||
// for _, v := range effectiveStores {
|
||
// if v.VendorOrgCode == globals.Mtwm2Code {
|
||
// mtApi = api.Mtwm2API
|
||
// mtApi.SetToken(v.MtwmToken)
|
||
// } else {
|
||
// mtApi = api.MtwmAPI
|
||
// }
|
||
//
|
||
// statistics := &model.ActivityStation{
|
||
// StoreID: v.JxStoreID,
|
||
// VendorID: model.VendorIDMTWM,
|
||
// VendorStoreID: v.VendorStoreID,
|
||
// BrandID: v.VendorOrgCode,
|
||
// //Activity1: 0,
|
||
// //Activity2: 0,
|
||
// //Activity: 0,
|
||
// //StoreSkuNum: 0,
|
||
// //StoreRating: 0,
|
||
// //DeliveryFee: "",
|
||
// //DeliveryFee2: "",
|
||
// PromotionFee: "暂无法获取",
|
||
// //BusinessHours: "",
|
||
// }
|
||
// dao.WrapAddIDCULEntity(statistics, "system")
|
||
// down, up := getActivityCount(mtApi, v.VendorStoreID)
|
||
// statistics.Activity1 = int64(down)
|
||
// statistics.Activity2 = int64(up)
|
||
// statistics.Activity = int64(down + up)
|
||
// score, err := mtApi.CommentScore(v.VendorStoreID)
|
||
// if err != nil {
|
||
// errList = append(errList, fmt.Errorf("%s获取评分错误:%s", v.VendorStoreID, err.Error()))
|
||
// }
|
||
// if score != nil {
|
||
// statistics.StoreRating = score.AvgPoiScore
|
||
// } else {
|
||
// statistics.StoreRating = 0
|
||
// }
|
||
//
|
||
// // 获取门店营业时长
|
||
// detail, _ := mtApi.PoiMGet([]string{v.VendorStoreID})
|
||
// if detail != nil {
|
||
// statistics.BusinessHours, err = getStoreShippingTime(detail[0].ShippingTime)
|
||
// if err != nil {
|
||
// errList = append(errList, fmt.Errorf("%s获取营业时长错误:%s", v.VendorStoreID, err.Error()))
|
||
// statistics.BusinessHours = err.Error()
|
||
// }
|
||
// statistics.DeliveryFee2 = utils.Float64ToStr(detail[0].ShippingFee)
|
||
// }
|
||
// // 获取门店起送价
|
||
// result, err := mtApi.ShippingList(v.VendorStoreID)
|
||
// if err != nil {
|
||
// errList = append(errList, fmt.Errorf("%s获取起送价错误:%s", v.VendorStoreID, err.Error()))
|
||
// statistics.DeliveryFee = err.Error()
|
||
// }
|
||
// shippingList := make([]ShippingList, 0, 0)
|
||
// for _, v2 := range result {
|
||
// shippingList = append(shippingList, ShippingList{
|
||
// TimeRange: utils.Interface2String(v2["time_range"]),
|
||
// MinPrice: utils.MustInterface2Float64(v2["min_price"]),
|
||
// ShippingFee: utils.MustInterface2Float64(v2["shipping_fee"]),
|
||
// })
|
||
// }
|
||
// statistics.DeliveryFee = utils.Format4Output(shippingList, false)
|
||
// if len(result) == 0 {
|
||
// statistics.DeliveryFee = ""
|
||
// }
|
||
//
|
||
// dao.CreateEntity(db, statistics)
|
||
// }
|
||
//
|
||
// return errList
|
||
//}
|
||
|
||
// 获取门店折扣活动商品数量
|
||
func getActivityCount(api *mtwmapi.API, vendorStoreId string) (int, int) {
|
||
threefoldDown := 0 // 0-3 折活动数量
|
||
threefoldUp := 0 // 3.01-9 折活动
|
||
// 获取美团活动
|
||
directList, _ := api.RetailDiscountList(vendorStoreId, mtwmapi.RetailActTypeDirectDown) // 折扣活动
|
||
for _, v := range directList {
|
||
if v.ActPrice/v.OriginalPrice*10 >= 3.01 {
|
||
threefoldUp++
|
||
} else {
|
||
threefoldDown++
|
||
}
|
||
}
|
||
secKillList, _ := api.RetailDiscountList(vendorStoreId, mtwmapi.RetailActTypeSecKill) // 爆品活动
|
||
if secKillList != nil {
|
||
threefoldDown = threefoldDown + len(secKillList)
|
||
}
|
||
|
||
return threefoldDown, threefoldUp
|
||
}
|
||
|
||
func getStoreShippingTime(storeTime string) (string, error) {
|
||
time2 := strings.Split(storeTime, ";")
|
||
aa := int(time.Now().Weekday())
|
||
if aa == 0 {
|
||
aa = 7
|
||
}
|
||
if len(time2) == 1 {
|
||
aa = 1
|
||
}
|
||
intervals, err := parseIntervals(time2[aa-1])
|
||
if err != nil {
|
||
fmt.Printf("解析错误: %v\n", err)
|
||
return "", err
|
||
}
|
||
|
||
merged := mergeIntervals(intervals)
|
||
|
||
totalMinutes := 0
|
||
for _, iv := range merged {
|
||
totalMinutes += iv.end - iv.start
|
||
}
|
||
return fmt.Sprintf("%.2f", float64(totalMinutes)/float64(60)), err
|
||
}
|
||
|
||
// timeToMinutes 将 "HH:MM" 转为当天第几分钟(0 ~ 1439)
|
||
func timeToMinutes(t string) (int, error) {
|
||
parts := strings.Split(t, ":")
|
||
if len(parts) != 2 {
|
||
return 0, fmt.Errorf("invalid time format: %s", t)
|
||
}
|
||
h, err := strconv.Atoi(parts[0])
|
||
if err != nil || h < 0 || h > 23 {
|
||
return 0, fmt.Errorf("invalid hour in %s", t)
|
||
}
|
||
m, err := strconv.Atoi(parts[1])
|
||
if err != nil || m < 0 || m > 59 {
|
||
return 0, fmt.Errorf("invalid minute in %s", t)
|
||
}
|
||
return h*60 + m, nil
|
||
}
|
||
|
||
// parseIntervals 解析 "00:00-01:00,01:05-23:59" → []interval
|
||
type interval struct {
|
||
start, end int // minutes since 00:00
|
||
}
|
||
|
||
func parseIntervals(s string) ([]interval, error) {
|
||
var intervals []interval
|
||
for _, seg := range strings.Split(s, ",") {
|
||
seg = strings.TrimSpace(seg)
|
||
if seg == "" {
|
||
continue
|
||
}
|
||
parts := strings.Split(seg, "-")
|
||
if len(parts) != 2 {
|
||
return nil, fmt.Errorf("invalid interval format: %s", seg)
|
||
}
|
||
startMins, err := timeToMinutes(strings.TrimSpace(parts[0]))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
endMins, err := timeToMinutes(strings.TrimSpace(parts[1]))
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if startMins > endMins {
|
||
return nil, fmt.Errorf("start after end in interval: %s", seg)
|
||
}
|
||
intervals = append(intervals, interval{start: startMins, end: endMins})
|
||
}
|
||
return intervals, nil
|
||
}
|
||
|
||
// mergeIntervals "git.rosy.net.cn/重叠/相邻区间(如 [0,60], [65,1439] → 保留两个;若 [0,60], [60,120] → 可合并为 [0,120])
|
||
func mergeIntervals(ints []interval) []interval {
|
||
if len(ints) == 0 {
|
||
return ints
|
||
}
|
||
// 排序
|
||
sort.Slice(ints, func(i, j int) bool {
|
||
return ints[i].start < ints[j].start
|
||
})
|
||
|
||
merged := make([]interval, 0, len(ints))
|
||
curr := ints[0]
|
||
for i := 1; i < len(ints); i++ {
|
||
if ints[i].start <= curr.end { // 重叠或紧邻(如 end=60, next.start=60 → 合并)
|
||
if ints[i].end > curr.end {
|
||
curr.end = ints[i].end
|
||
}
|
||
} else {
|
||
merged = append(merged, curr)
|
||
curr = ints[i]
|
||
}
|
||
}
|
||
merged = append(merged, curr)
|
||
return merged
|
||
}
|
||
|
||
type ShippingList struct {
|
||
TimeRange string `json:"time_range"` // 配送生效时间范围
|
||
MinPrice float64 `json:"min_price"` // 最小起送价
|
||
ShippingFee float64 `json:"shipping_fee"` // 配送费
|
||
}
|
||
|
||
func StatisticsOrderCount(startTime, endTime time.Time, storeId []int, vendorId []int, offset, pageSize int) (*model.PagedInfo, error) {
|
||
return dao.StatisticsOrderCount(dao.GetDB(), startTime, endTime, storeId, vendorId, offset, pageSize)
|
||
}
|