You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

518 lines
16 KiB

package service
import (
"bkb-seller/global"
"bkb-seller/model"
"bkb-seller/model/request"
"bkb-seller/utils"
"errors"
"fmt"
"math"
"strings"
"time"
)
func GetSellAnalyses(uuid string, info request.MissionAnalyses) (err error, list model.CoordinateData) {
var (
format string
endTime, startTime time.Time
xList = make([]string, 0)
)
now := time.Now()
switch info.Unit {
case "day": //日
format = "FROM_UNIXTIME(1800*FLOOR(UNIX_TIMESTAMP(`order`.pay_time)/1800),'%H:%i')"
startTime, err = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
if err != nil {
err = errors.New("未知错误")
return
}
endTime = startTime.AddDate(0, 0, 1)
tmp := startTime
for i := 0; i < 48; i++ {
xList = append(xList, tmp.Format("15:04"))
tmp = tmp.Add(30 * time.Minute)
}
case "week": //周
format = "DATE_FORMAT(`order`.pay_time,'%m-%d')"
endTime, _ = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
startTime = endTime.AddDate(0, 0, -6)
var tmp time.Time
tmp = startTime
for i := 0; i < 7; i++ {
xList = append(xList, tmp.Format("01-02"))
tmp = tmp.AddDate(0, 0, 1)
}
case "month": //月
format = "DATE_FORMAT(`order`.pay_time,'%m-%d')"
endTime, _ = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
startTime = endTime.AddDate(0, 0, -29)
var tmp time.Time
tmp = startTime
for i := 0; i < 30; i++ {
xList = append(xList, tmp.Format("01-02"))
tmp = tmp.AddDate(0, 0, 1)
}
case "area":
format = "DATE_FORMAT(`order`.pay_time,'%y-%m-%d')"
if !strings.Contains(info.Value, "|") {
err = errors.New("参数解析错误")
return
}
valueArr := strings.Split(info.Value, "|")
if len(valueArr) == 2 {
var tt = make([]time.Time, 2)
tt[0], err = time.Parse(utils.DateFormat, valueArr[0])
if err != nil {
err = errors.New("参数解析错误")
return
}
tt[1], err = time.Parse(utils.DateFormat, valueArr[1])
if err != nil {
err = errors.New("参数解析错误")
return
}
if tt[0].Unix() > tt[1].Unix() {
startTime = tt[1]
endTime = tt[0].AddDate(0, 0, 1)
} else {
startTime = tt[0]
endTime = tt[1].AddDate(0, 0, 1)
}
numF := endTime.Sub(startTime).Hours() / 24
day := int(math.Ceil(numF))
tmp := startTime
for i := 0; i < day; i++ {
xList = append(xList, tmp.Format("06-01-02"))
tmp = tmp.AddDate(0, 0, 1)
}
} else {
err = errors.New("参数解析错误")
return
}
default:
err = errors.New("单位有误")
return
}
var res []model.Coordinate
var sql string
if info.Type == 1 { //统计个数
sql = "SELECT " + format + " as format,COUNT(1) as `value` "
} else { //统计金额
sql = "SELECT " + format + " as format,SUM(`order`.paid_price) as `value` "
}
sql += fmt.Sprintf(" FROM `order` INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code` INNER JOIN mission ON mission.id = mission_claim.mission_id WHERE mission.create_by = '%v' AND `order`.`status` IN (2,3,4) AND `order`.pay_time BETWEEN '%v' AND '%v' ", uuid, startTime, endTime)
if info.MissionId != 0 {
sql += fmt.Sprintf(" AND mission.id = %v ", info.MissionId)
}
if info.InfluencerId != "" {
sql += fmt.Sprintf(" AND mission_claim.create_by = '%v' ", info.InfluencerId)
}
sql += " GROUP BY `format` ORDER BY `format`"
err = global.MG_DB.Raw(sql).Scan(&res).Error
if err != nil {
return
}
var outData = model.CoordinateData{}
outData.X = xList
outData.Y = make([]float64, 0)
outData.Values = make([]model.Coordinate, 0)
j := 0
for i := 0; i < len(xList); i++ {
var coor model.Coordinate
if len(res)-j != 0 && res[j].Format == xList[i] {
coor = res[j]
j++
} else {
coor.Format = xList[i]
coor.Value = 0
}
outData.Values = append(outData.Values, coor)
}
list = outData
return
}
func GetSellAnalyses1(uuid string, info request.MissionAnalyses) (err error, list model.CoordinateData) {
var (
xFormat string
startTime, endTime time.Time
xList = make([]string, 0)
)
//if info.TimeZone == nil {
// info.TimeZone = time.UTC
//}
now := time.Now()
switch info.Unit {
case "day": //日
xFormat = "15:04"
startTime, err = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
if err != nil {
err = errors.New("未知错误")
return
}
endTime = startTime.AddDate(0, 0, 1)
tmp := startTime
for i := 0; i < 48; i++ {
xList = append(xList, tmp.Format(xFormat))
tmp = tmp.Add(30 * time.Minute)
}
case "week": //周
xFormat = "01-02"
endTime, _ = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
endTime = endTime.AddDate(0, 0, 1)
startTime = endTime.AddDate(0, 0, -7)
var tmp time.Time
tmp = startTime
for i := 0; i < 7; i++ {
xList = append(xList, tmp.Format(xFormat))
tmp = tmp.AddDate(0, 0, 1)
}
case "month": //月
xFormat = "01-02"
endTime, _ = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
endTime = endTime.AddDate(0, 0, 1)
startTime = endTime.AddDate(0, 0, -30)
var tmp time.Time
tmp = startTime
for i := 0; i < 30; i++ {
xList = append(xList, tmp.Format(xFormat))
tmp = tmp.AddDate(0, 0, 1)
}
case "area":
xFormat = "06-01-02"
if !strings.Contains(info.Value, "|") {
err = errors.New("参数解析错误")
return
}
valueArr := strings.Split(info.Value, "|")
if len(valueArr) == 2 {
var tt = make([]time.Time, 2)
tt[0], err = time.Parse(utils.DateFormat, valueArr[0])
if err != nil {
err = errors.New("参数解析错误")
return
}
tt[1], err = time.Parse(utils.DateFormat, valueArr[1])
if err != nil {
err = errors.New("参数解析错误")
return
}
if tt[0].Unix() > tt[1].Unix() {
startTime = tt[1]
endTime = tt[0].AddDate(0, 0, 1)
} else {
startTime = tt[0]
endTime = tt[1].AddDate(0, 0, 1)
}
numF := endTime.Sub(startTime).Hours() / 24
day := int(math.Ceil(numF))
tmp := startTime
for i := 0; i < day; i++ {
xList = append(xList, tmp.Format(xFormat))
tmp = tmp.AddDate(0, 0, 1)
}
} else {
err = errors.New("参数解析错误")
return
}
default:
err = errors.New("单位有误")
return
}
var orderList []model.Order
db := global.MG_DB.Model(&model.Order{}).Select("`order`.id,`order`.order_id,`order`.pay_time,`order`.paid_price").
Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code` INNER JOIN mission ON mission.id = mission_claim.mission_id").
Where("mission.create_by = ? AND `order`.`status` IN (2,3,4) AND `order`.pay_time IS NOT NULL AND `order`.pay_time BETWEEN ? AND ?", uuid, startTime, endTime).Order("`order`.pay_time ASC")
if info.MissionId != 0 {
db = db.Where("mission.id = ?", info.MissionId)
}
if info.InfluencerId != "" {
db = db.Where("mission_claim.create_by = ?", info.InfluencerId)
}
err = db.Find(&orderList).Error
if err != nil {
return
}
var (
res = make([]model.Coordinate, 0)
resMap = make(map[string]int)
)
for i := 0; i < len(orderList); i++ {
var format string
if xFormat == "15:04" {
//format = orderList[i].PayTime.In(info.TimeZone).Format("15")
format = orderList[i].PayTime.Format("15")
if orderList[i].PayTime.Minute() >= 30 {
format += ":30"
} else {
format += ":00"
}
} else {
//format = orderList[i].PayTime.In(info.TimeZone).Format(xFormat)
format = orderList[i].PayTime.Format(xFormat)
}
if info.Type == 1 { // 统计个数
if val, ok := resMap[format]; ok {
res[val].Value += 1
} else {
res = append(res, model.Coordinate{Format: format, Value: 1})
resMap[format] = len(res) - 1
}
} else { // 统计金额
if val, ok := resMap[format]; ok {
res[val].Value += orderList[i].PaidPrice
} else {
res = append(res, model.Coordinate{Format: format, Value: orderList[i].PaidPrice})
resMap[format] = len(res) - 1
}
}
}
var outData = model.CoordinateData{}
outData.X = xList
outData.Y = make([]float64, 0)
outData.Values = make([]model.Coordinate, 0)
j := 0
for i := 0; i < len(xList); i++ {
var coor model.Coordinate
if len(res)-j != 0 && res[j].Format == xList[i] {
coor = res[j]
j++
} else {
coor.Format = xList[i]
coor.Value = 0
}
outData.Values = append(outData.Values, coor)
}
list = outData
return
}
func GetInfluencerSellAnalyses(uuid string, info request.MissionInfluencerAnalyses) (err error, list model.CoordinateObjData) {
var endTime, startTime time.Time
if info.TimeZone == nil {
info.TimeZone = time.UTC
}
now := time.Now()
switch info.Unit {
case "day": //日
startTime, err = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
//startTime, err = time.Parse(utils.DateFormat, "2022-11-03")
if err != nil {
err = errors.New("未知错误")
return
}
endTime = startTime.AddDate(0, 0, 1)
case "week": //周
endTime, _ = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
endTime = endTime.AddDate(0, 0, 1)
startTime = endTime.AddDate(0, 0, -7)
case "month": //月
endTime, _ = time.Parse(utils.DateFormat, now.Format(utils.DateFormat))
endTime = endTime.AddDate(0, 0, 1)
startTime = endTime.AddDate(0, 0, -30)
case "area":
if !strings.Contains(info.Value, "|") {
err = errors.New("参数解析错误")
return
}
valueArr := strings.Split(info.Value, "|")
if len(valueArr) == 2 {
var tt = make([]time.Time, 2)
tt[0], err = time.Parse(utils.DateFormat, valueArr[0])
if err != nil {
err = errors.New("参数解析错误")
return
}
tt[1], err = time.Parse(utils.DateFormat, valueArr[1])
if err != nil {
err = errors.New("参数解析错误")
return
}
if tt[0].Unix() > tt[1].Unix() {
startTime = tt[1]
endTime = tt[0].AddDate(0, 0, 1)
} else {
startTime = tt[0]
endTime = tt[1].AddDate(0, 0, 1)
}
} else {
err = errors.New("参数解析错误")
return
}
default:
err = errors.New("单位有误")
return
}
var res []model.Coordinate
var sql string
if info.Type == 1 { //统计个数
sql = "SELECT mission_claim.create_by as format,COUNT(1) as `value` "
} else { //统计金额
sql = "SELECT mission_claim.create_by as format,SUM(`order`.paid_price) as `value` "
}
sql += fmt.Sprintf(" FROM `order` INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code` INNER JOIN mission ON mission.id = mission_claim.mission_id WHERE mission.create_by = '%v' AND `order`.`status` IN (2,3,4) AND `order`.pay_time IS NOT NULL AND `order`.pay_time BETWEEN '%v' AND '%v' ", uuid, startTime, endTime)
if info.MissionId != 0 {
sql += fmt.Sprintf(" AND mission.id = %v ", info.MissionId)
}
sql += " GROUP BY `format` ORDER BY `format`"
err = global.MG_DB.Raw(sql).Scan(&res).Error
if err != nil {
return
}
var outData = model.CoordinateObjData{}
outData.X = make([]string, 0)
outData.Y = make([]float64, 0)
outData.Values = make([]model.CoordinateObj, 0)
if len(res) != 0 {
for i := 0; i < len(res); i++ {
outData.X = append(outData.X, res[i].Format)
}
var (
users []model.InfluencerUserView
userMap = make(map[string]string)
)
err = global.MG_DB.Model(&model.User{}).Select("uuid,nick_name").Where("uuid IN (?)", outData.X).Find(&users).Error
if err != nil {
return
}
for i := 0; i < len(users); i++ {
userMap[users[i].UUID] = users[i].NickName
}
for i := 0; i < len(res); i++ {
var coor model.CoordinateObj
coor.Format.Key = res[i].Format
coor.Value = res[i].Value
if val, ok := userMap[res[i].Format]; ok {
coor.Format.Label = val
} else {
coor.Format.Label = res[i].Format
}
outData.Values = append(outData.Values, coor)
}
}
list = outData
return
}
func SellRankInfluencer(uuid string, info request.MissionInfluencerRank) (err error, list interface{}, total int64) {
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
var (
selectSql, sql string
res []model.RankData
)
if info.Type == 1 { //统计个数
selectSql = "SELECT mission_claim.create_by as format,COUNT(1) as `value` "
} else { //统计金额
selectSql = "SELECT mission_claim.create_by as format,SUM(`order`.paid_price) as `value` "
}
sql = fmt.Sprintf(" FROM `order` INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code` INNER JOIN mission ON mission.id = mission_claim.mission_id WHERE mission.create_by = '%v' AND `order`.`status` IN (2,3,4) AND `order`.pay_time IS NOT NULL", uuid)
if info.MissionId != 0 {
sql += fmt.Sprintf(" AND mission.id = %v ", info.MissionId)
}
sql += " GROUP BY mission_claim.create_by"
err = global.MG_DB.Raw("SELECT COUNT(1) FROM (SELECT COUNT(1)" + sql + ") as a").Scan(&total).Error
if err != nil {
return
}
err = global.MG_DB.Raw(fmt.Sprintf("SELECT a.*,(@rank := @rank + 1) as `rank` FROM ("+selectSql+sql+" ORDER BY `value` DESC LIMIT %v OFFSET %v", limit, offset) + ") as a,(SELECT@rank:= 0) AS b").Scan(&res).Error
if err != nil {
return
}
var outData []model.RankDataObj
if len(res) != 0 {
var uuids []string
for i := 0; i < len(res); i++ {
uuids = append(uuids, res[i].Format)
}
var (
users []model.InfluencerUserView
userMap = make(map[string]string)
)
err = global.MG_DB.Model(&model.User{}).Select("uuid,nick_name").Where("uuid IN (?)", uuids).Find(&users).Error
if err != nil {
return
}
for i := 0; i < len(users); i++ {
userMap[users[i].UUID] = users[i].NickName
}
for i := 0; i < len(res); i++ {
var coor model.RankDataObj
coor.Rank = res[i].Rank
coor.Format.Key = res[i].Format
coor.Value = res[i].Value
if val, ok := userMap[res[i].Format]; ok {
coor.Format.Label = val
} else {
coor.Format.Label = res[i].Format
}
outData = append(outData, coor)
}
}
list = outData
return
}
func GetMissionOrderCount(uuid string, missionId uint) (total int64) {
db := global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code` INNER JOIN mission ON mission.id = mission_claim.mission_id").
Where("`order`.`status` IN (2,3,4) AND mission.id = ?", missionId)
if uuid != "" {
db = db.Where("mission.create_by = ?", uuid)
}
_ = db.Count(&total).Error
return
}
func getGoodsOrderCount(uuid string, goodsId uint, startTime, endTime *time.Time) (total int64) {
db := global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN tb_goods_specs ON tb_goods_specs.sku_no = `order`.sku_no").
Where("`order`.`status` IN (2,3,4) AND tb_goods_specs.goods_id = ?", goodsId)
if startTime != nil {
db = db.Where("`order`.pay_time >= ?", startTime)
}
_ = db.Count(&total).Error
return
}
func batchGetGoodsOrderCount(uuid string, goodsIds []uint, startTime, endTime *time.Time) (result map[uint]int64) {
var (
err error
list []model.CountMap
)
result = make(map[uint]int64)
db := global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN tb_goods_specs ON tb_goods_specs.sku_no = `order`.sku_no").
Where("`order`.`status` IN (2,3,4) ")
if startTime != nil {
db = db.Where("`order`.pay_time >= ?", startTime)
}
err = db.Select("tb_goods_specs.goods_id as id,COUNT(1) as count").Group("id").Find(&list).Error
if err != nil {
return
}
for i := 0; i < len(list); i++ {
result[list[i].ID] = list[i].Count
}
return
}
func GetMissionClaimSales(claimNo string, startTime, endTime *time.Time) (result model.OrderSummary) {
var (
err error
)
db := global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.code").
Where("`order`.`status` IN (2,3,4) ").Where("`order`.code = ?", claimNo)
if startTime != nil && !startTime.IsZero() {
db = db.Where("`order`.pay_time >= ?", startTime)
}
if endTime != nil && !endTime.IsZero() {
db = db.Where("`order`.pay_time >= ?", startTime)
}
err = db.Select("`order`.code,COUNT(1) as count,sum(paid_price) as sales").Find(&result).Error
fmt.Println(result)
if err != nil {
return
}
return
}