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
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
|
|
}
|
|
|