Files
jx-callback/business/bidding/mt_activity.go
邹宗楠 29de059c4f 1
2026-03-30 17:24:04 +08:00

195 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package bidding
import (
"fmt"
"git.rosy.net.cn/baseapi/platformapi/mtwmapi"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-callback/business/model"
"git.rosy.net.cn/jx-callback/business/model/dao"
"git.rosy.net.cn/jx-callback/globals"
"git.rosy.net.cn/jx-callback/globals/api"
"sort"
"strconv"
"strings"
"time"
)
func GetMTInfo() {
// 获取当前一月有效订单的门店信息
effectiveStores, err := dao.StoreInformationStatistics()
if err != nil {
return
}
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 {
globals.SugarLogger.Debugf("门店评分获取错误:%v", err)
}
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 {
statistics.BusinessHours = err.Error()
}
statistics.DeliveryFee2 = utils.Float64ToStr(detail[0].ShippingFee)
}
}
}
// 获取门店折扣活动商品数量
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 >= 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 合并重叠/相邻区间(如 [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
}