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 }