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.
451 lines
16 KiB
451 lines
16 KiB
package service
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"pure-admin/global"
|
|
"pure-admin/model"
|
|
"pure-admin/model/request"
|
|
"pure-admin/model/response"
|
|
"pure-admin/utils"
|
|
"sync/atomic"
|
|
"time"
|
|
)
|
|
|
|
func GetOrderList(info *request.SearchOrderList) (error, interface{}, int64) {
|
|
var (
|
|
err error
|
|
result []model.OrderList
|
|
total int64
|
|
orderIds []string
|
|
customers []string
|
|
)
|
|
limit := info.PageSize
|
|
offset := info.PageSize * (info.Page - 1)
|
|
db := global.MG_DB.Model(&model.Order{})
|
|
if info.Status != 0 {
|
|
db = db.Where("`order`.status = ?", info.Status)
|
|
}
|
|
if info.OrderID != "" {
|
|
db = db.Where("`order`.order_id = ?", info.OrderID)
|
|
}
|
|
if info.GoodsID != 0 {
|
|
db = db.Where("`order`.commod_id=?", info.GoodsID)
|
|
}
|
|
if info.SpuNo != "" {
|
|
db = db.Joins("LEFT JOIN order_goods ON order_goods.order_id = `order`.order_id").Where("order_goods.spu_no = ?", info.SpuNo)
|
|
}
|
|
if info.Name != "" {
|
|
db = db.Joins("INNER JOIN order_address on order_address.order_id=`order`.order_id").Where("CONCAT(order_address.first_name,order_address.last_name) LIKE ? OR CONCAT(order_address.first_name,' ',order_address.last_name) LIKE ?", "%"+info.Name+"%", "%"+info.Name+"%")
|
|
}
|
|
if info.Phone != "" {
|
|
db = db.Joins("inner join order_address b on b.phone=? and b.order_id=`order`.order_id", info.Phone)
|
|
}
|
|
if info.CreatedAtStart != "" {
|
|
db.Where("`order`.created_at >= ?", info.CreatedAtStart)
|
|
}
|
|
if info.CreatedAtEnd != "" {
|
|
db.Where("`order`.created_at < ?", info.CreatedAtEnd)
|
|
}
|
|
if info.Code != "" {
|
|
db = db.Where("`order`.code=?", info.Code)
|
|
}
|
|
if info.CreatedAt != "" {
|
|
db = db.Where("`order`.created_at>=?", info.CreatedAt)
|
|
}
|
|
if info.UserId != "" {
|
|
db = db.Where("`order`.user_id = ?", info.UserId)
|
|
}
|
|
if info.InfluenceId != "" || info.MissionTitle != "" {
|
|
db = db.Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code`")
|
|
if info.InfluenceId != "" {
|
|
db = db.Where("mission_claim.create_by = ?", info.InfluenceId)
|
|
}
|
|
if info.MissionTitle != "" {
|
|
db = db.Joins("INNER JOIN mission ON mission.id = mission_claim.mission_id").Where("mission.title LIKE ?", "%"+info.MissionTitle+"%")
|
|
}
|
|
}
|
|
if info.StoreNo != "" {
|
|
db = db.Where("`order`.store_no = ?", info.StoreNo)
|
|
}
|
|
_ = db.Count(&total).Error
|
|
err = db.Order("`order`.id desc").Offset(offset).Limit(limit).Find(&result).Error
|
|
if err != nil {
|
|
return errors.New("获取订单失败"), result, total
|
|
}
|
|
if len(result) == 0 {
|
|
return nil, result, total
|
|
}
|
|
for v := range result {
|
|
orderIds = append(orderIds, result[v].OrderID)
|
|
}
|
|
var (
|
|
orderGoodsList []model.OrderGoodsDetail
|
|
goodsMap = make(map[string]model.OrderGoodsDetail)
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderGoods{}).Where("order_id IN (?)", orderIds).Find(&orderGoodsList).Error
|
|
if err != nil {
|
|
return errors.New("获取订单商品信息失败"), result, total
|
|
}
|
|
for _, goods := range orderGoodsList {
|
|
goodsMap[goods.OrderID] = goods
|
|
}
|
|
var (
|
|
addressList []model.OrderAddress
|
|
addressMap = make(map[string]model.OrderAddress)
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderAddress{}).Where("order_id in (?)", orderIds).Find(&addressList).Error
|
|
if err != nil {
|
|
return errors.New("获取订单地址信息失败"), result, total
|
|
}
|
|
for _, address := range addressList {
|
|
addressMap[address.OrderID] = address
|
|
}
|
|
var (
|
|
delivers []model.OrderDeliver
|
|
deliverMap = make(map[string]model.OrderDeliver)
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderDeliver{}).Where("order_id in (?)", orderIds).Find(&delivers).Error
|
|
if err != nil {
|
|
return errors.New("获取订单发货信息失败"), result, total
|
|
}
|
|
for _, deliver := range delivers {
|
|
deliverMap[deliver.OrderID] = deliver
|
|
}
|
|
var codes []string
|
|
for v := range result {
|
|
if val, ok := goodsMap[result[v].OrderID]; ok {
|
|
result[v].Goods = val
|
|
}
|
|
if val, ok := addressMap[result[v].OrderID]; ok {
|
|
result[v].Address = val
|
|
}
|
|
|
|
if val, ok := deliverMap[result[v].OrderID]; ok {
|
|
result[v].Deliver = val
|
|
}
|
|
if result[v].Code != "" {
|
|
codes = append(codes, result[v].Code)
|
|
}
|
|
customers = append(customers, result[v].UserID)
|
|
}
|
|
var (
|
|
missionMap = make(map[string]model.MissionClaimInfo)
|
|
influencerMap = make(map[string]model.InfluencerUserClaimView)
|
|
)
|
|
if len(codes) > 0 {
|
|
var (
|
|
missions []model.MissionClaimInfo
|
|
influencerList []model.InfluencerUserClaimView
|
|
)
|
|
err = global.MG_DB.Select("mission_claim.claim_no,mission_claim.mission_id,b.hire_type,b.hire_money,b.hire_ratio").Model(&model.MissionClaim{}).Joins("inner join mission b on mission_claim.mission_id=b.id").Where("claim_no in (?)", codes).Scan(&missions).Error
|
|
if err != nil {
|
|
return errors.New("获取任务详情失败"), result, total
|
|
}
|
|
for _, mission := range missions {
|
|
missionMap[mission.ClaimNo] = mission
|
|
}
|
|
err = global.MG_DB.Select("`user`.uuid,`user`.nick_name,`user`.phone,mission_claim.claim_no").Model(&model.MissionClaim{}).Joins("inner join `user` on mission_claim.create_by=`user`.uuid").Where("mission_claim.claim_no in (?)", codes).Scan(&influencerList).Error
|
|
if err != nil {
|
|
return errors.New("获取任务网红失败"), result, total
|
|
}
|
|
for _, influencer := range influencerList {
|
|
influencerMap[influencer.ClaimNo] = influencer
|
|
}
|
|
}
|
|
var customerMap = make(map[string]model.UserSimple)
|
|
if len(customers) > 0 {
|
|
var customerList []model.UserSimple
|
|
customerList, err = getUserSimpleList("customer", customers)
|
|
if err != nil {
|
|
return errors.New("获取买家详情失败"), result, total
|
|
}
|
|
for _, user := range customerList {
|
|
customerMap[user.UUID.String()] = user
|
|
}
|
|
}
|
|
for v := range result {
|
|
if result[v].Code != "" {
|
|
if val, ok := missionMap[result[v].Code]; ok {
|
|
if val.HireType == 1 {
|
|
amount := val.HireMoney * float64(result[v].Number)
|
|
result[v].InfluencerAmount = utils.FormatFloatToString(amount)
|
|
result[v].SellerAmount = utils.FormatFloatToString(result[v].PaidPrice - amount)
|
|
} else {
|
|
amount := result[v].PaidPrice * val.HireRatio / 100
|
|
result[v].InfluencerAmount = utils.FormatFloatToString(amount)
|
|
result[v].SellerAmount = utils.FormatFloatToString(result[v].PaidPrice - amount)
|
|
}
|
|
}
|
|
if val, ok := influencerMap[result[v].Code]; ok {
|
|
result[v].InfluencerUser = val
|
|
}
|
|
} else {
|
|
result[v].SellerAmount = utils.FormatFloatToString(result[v].PaidPrice)
|
|
}
|
|
if val, ok := customerMap[result[v].UserID]; ok {
|
|
result[v].CustomerPhone = utils.HideStar(val.Phone)
|
|
}
|
|
}
|
|
return nil, result, total
|
|
}
|
|
|
|
func GetOrderDetail(info *request.SearchOrderDetail) (error, interface{}) {
|
|
var (
|
|
err error
|
|
result model.OrderDetail
|
|
missions model.MissionClaimInfo
|
|
)
|
|
db := global.MG_DB.Model(&model.Order{}).Where("`order`.order_id = ?", info.OrderID)
|
|
err = db.Find(&result).Error
|
|
if err != nil {
|
|
return errors.New("获取订单失败"), result
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderAddress{}).Where("order_id = ?", info.OrderID).Find(&result.Address).Error
|
|
if err != nil {
|
|
return errors.New("获取订单地址失败"), result
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderGoods{}).Where("order_id = ?", info.OrderID).Find(&result.Goods).Error
|
|
if err != nil {
|
|
return errors.New("获取订单商品信息失败"), result
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderDeliver{}).Where("order_id = ?", info.OrderID).Find(&result.Deliver).Error
|
|
if err != nil {
|
|
return errors.New("获取发货信息失败"), result
|
|
}
|
|
if result.Code != "" {
|
|
err = global.MG_DB.Select("mission_claim.claim_no,mission_claim.mission_id,b.hire_type,b.hire_money,b.hire_ratio").Model(&model.MissionClaim{}).Joins("inner join mission b on mission_claim.mission_id=b.id").Where("claim_no=?", result.Code).Scan(&missions).Error
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return errors.New("获取任务详情失败"), result
|
|
}
|
|
if missions.HireType == 1 {
|
|
amount := missions.HireMoney * float64(result.Number)
|
|
result.InfluencerAmount = utils.FormatFloatToString(amount)
|
|
result.SellerAmount = utils.FormatFloatToString((result.PaidPrice - amount))
|
|
} else {
|
|
amount := result.PaidPrice * missions.HireRatio / 100
|
|
result.InfluencerAmount = utils.FormatFloatToString(amount)
|
|
result.SellerAmount = utils.FormatFloatToString(result.PaidPrice - amount)
|
|
}
|
|
}
|
|
result.Chain = model.Chain{Address: "b714e5508531a7b50d0696abdc83d2333bd896db24f68eb1470bb9529390ef3e"}
|
|
return nil, result
|
|
}
|
|
|
|
func getStatisticsOrderList(values []string, unit, relationId string) ([]model.DtStatisticOrder, error) {
|
|
var (
|
|
err error
|
|
result []model.DtStatisticOrder
|
|
)
|
|
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Where("`value` IN (?) AND `unit` = ?", values, unit)
|
|
if relationId != "" {
|
|
db = db.Where("`relation_id` = ?", relationId)
|
|
}
|
|
err = db.Find(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
func getStatisticsOrderByValues(values []string, unit, t, relationId string) (model.DtStatisticOrder, error) {
|
|
var (
|
|
err error
|
|
result model.DtStatisticOrder
|
|
)
|
|
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Where("`unit` = ?", unit).
|
|
Select("SUM(order_num) as order_num,SUM(order_done_num) as order_done_num,SUM(order_money) as order_money,SUM(sale_volume) as sale_volume,SUM(settle_reward) as settle_reward,SUM(order_cancel_num) as order_cancel_num,SUM(order_cancel_money) as order_cancel_money")
|
|
if len(values) != 0 {
|
|
db = db.Where("`value` IN (?) ", values)
|
|
}
|
|
if t != "" {
|
|
db = db.Where("`type` = ?", t)
|
|
}
|
|
if relationId != "" {
|
|
db = db.Where("`relation_id` = ?", relationId)
|
|
}
|
|
err = db.First(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
func getStatisticsOrderByValuesRelationIds(values []string, unit, t string, relationIds []string) (model.DtStatisticOrder, error) {
|
|
var (
|
|
err error
|
|
result model.DtStatisticOrder
|
|
)
|
|
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Where("`unit` = ?", unit).
|
|
Select("SUM(order_num) as order_num,SUM(order_done_num) as order_done_num,SUM(order_money) as order_money,SUM(sale_volume) as sale_volume,SUM(settle_reward) as settle_reward,SUM(order_cancel_num) as order_cancel_num,SUM(order_cancel_money) as order_cancel_money")
|
|
if len(values) != 0 {
|
|
db = db.Where("`value` IN (?) ", values)
|
|
}
|
|
if t != "" {
|
|
db = db.Where("`type` = ?", t)
|
|
}
|
|
if len(relationIds) != 0 {
|
|
db = db.Where("`relation_id` IN (?)", relationIds)
|
|
}
|
|
err = db.First(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
// 获取退款数据
|
|
func getOrderPostSaleCount(info *request.SearchOrderPostSale) (int64, error) {
|
|
var (
|
|
err error
|
|
result int64
|
|
)
|
|
db := global.MG_DB.Model(&model.OrderPostSale{}).Where("`status` != 4")
|
|
if info.OrderId != "" {
|
|
db = db.Where("order_id = ?", info.OrderId)
|
|
}
|
|
if info.Status != 0 {
|
|
db = db.Where("`status` = ?", info.Status)
|
|
}
|
|
if info.UserId != "" {
|
|
db = db.Where("user_id = ?", info.UserId)
|
|
}
|
|
if info.CreatedAtStart != "" {
|
|
db = db.Where("created_at >= ?", info.CreatedAtStart)
|
|
}
|
|
if info.CreatedAtEnd != "" {
|
|
db = db.Where("created_at < ?", info.CreatedAtEnd)
|
|
}
|
|
err = db.Count(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
func getOrderPostSaleCountList(info *request.SearchOrderPostSale) (map[string]int64, error) {
|
|
var (
|
|
err error
|
|
list []model.CountMap
|
|
result = make(map[string]int64)
|
|
)
|
|
db := global.MG_DB.Model(&model.OrderPostSale{}).Where("`status` != 4")
|
|
if info.OrderId != "" {
|
|
db = db.Where("order_id = ?", info.OrderId)
|
|
}
|
|
if info.Status != 0 {
|
|
db = db.Where("`status` = ?", info.Status)
|
|
}
|
|
if len(info.UserIds) != 0 {
|
|
db = db.Where("user_id IN (?)", info.UserIds)
|
|
}
|
|
if info.CreatedAtStart != "" {
|
|
db = db.Where("created_at >= ?", info.CreatedAtStart)
|
|
}
|
|
if info.CreatedAtEnd != "" {
|
|
db = db.Where("created_at < ?", info.CreatedAtEnd)
|
|
}
|
|
err = db.Group("user_id").Select("user_id as `key`,COUNT(1) as value").Scan(&list).Error
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
for _, countMap := range list {
|
|
result[countMap.Key] = countMap.Value
|
|
}
|
|
return result, err
|
|
}
|
|
|
|
func GetStatisticData() (response.DataStatistics, error) {
|
|
var (
|
|
err error
|
|
result response.DataStatistics
|
|
)
|
|
now := time.Now()
|
|
{
|
|
// 用户数据
|
|
statistic, _ := getStatisticOrderSum(&request.Statistic{T: 0, RelationId: "bkb"}, "order_num", "order_money", "new_order_num")
|
|
// 总销售额
|
|
result.User.Money.Value1 = fmt.Sprintf("%.2f", statistic.OrderMoney)
|
|
// 人均支付金额
|
|
result.User.Money.Value2 = fmt.Sprintf("%.2f", statistic.OrderMoney/float64(statistic.OrderNum))
|
|
// 访问量
|
|
goods, yesterdayGoods := GetGoodsVisitCount()
|
|
result.User.Visit.Value1 = fmt.Sprintf("%v", goods)
|
|
// 昨天访问量
|
|
result.User.Visit.Value2 = fmt.Sprintf("%v", yesterdayGoods)
|
|
// 支付笔数
|
|
result.User.PayNum.Value1 = fmt.Sprintf("%v", statistic.OrderNum)
|
|
// 昨日支付笔数
|
|
yesterday, _ := getStatisticOrderSum(&request.Statistic{Values: []string{now.AddDate(0, 0, -1).Format("060102") + "0000"}, Unit: "", T: 0, RelationId: "bkb"}, "order_num", "new_order_num")
|
|
result.User.PayNum.Value2 = fmt.Sprintf("%v", yesterday.OrderNum)
|
|
// 订单数
|
|
result.User.OrderNum.Value1 = fmt.Sprintf("%v", statistic.NewOrderNum)
|
|
// 昨日订单数
|
|
result.User.OrderNum.Value2 = fmt.Sprintf("%v", yesterday.NewOrderNum)
|
|
}
|
|
_, missionData := GetMissionStatisticData("", "total")
|
|
_, yesterdayMissionData := GetMissionStatisticData(now.AddDate(0, 0, -1).Format(utils.DateFormat), "daily")
|
|
{
|
|
// 网红数据
|
|
// 接任务数
|
|
result.Influence.MissionNum.Value1 = fmt.Sprintf("%v", missionData.ClaimNum)
|
|
// 昨日接任务数
|
|
result.Influence.MissionNum.Value2 = fmt.Sprintf("%v", yesterdayMissionData.ClaimNum)
|
|
// 发布第三方平台数
|
|
result.Influence.PlatformNum.Value1 = fmt.Sprintf("%v", missionData.WorksNum)
|
|
// 昨日发布数
|
|
result.Influence.PlatformNum.Value2 = fmt.Sprintf("%v", yesterdayMissionData.WorksNum)
|
|
// 在途佣金额
|
|
statistic, _ := getStatisticOrderSum(&request.Statistic{T: 2}, "transit_reward")
|
|
result.Influence.TransitReward.Value1 = fmt.Sprintf("%.2f", statistic.TransitReward)
|
|
// 昨日在途佣金
|
|
yesterday, _ := getStatisticOrderSum(&request.Statistic{Values: []string{now.AddDate(0, 0, -1).Format("060102") + "0000"}, Unit: "", T: 2}, "transit_reward")
|
|
result.Influence.TransitReward.Value2 = fmt.Sprintf("%.2f", yesterday.TransitReward)
|
|
// 可用佣金额
|
|
result.Influence.UsedReward.Value1 = ""
|
|
// 昨天可用佣金数
|
|
result.Influence.UsedReward.Value2 = ""
|
|
}
|
|
{
|
|
// 商家数据
|
|
|
|
// 发布任务数
|
|
result.Store.MissionNum.Value1 = fmt.Sprintf("%v", missionData.ReleaseNum)
|
|
// 昨日发布任务数
|
|
result.Store.MissionNum.Value2 = fmt.Sprintf("%v", yesterdayMissionData.ReleaseNum)
|
|
|
|
goods, yesterdayGoods := GetGoodsCount()
|
|
// 发布商品数
|
|
result.Store.GoodsNum.Value1 = fmt.Sprintf("%v", goods)
|
|
// 昨日发布商品数
|
|
result.Store.GoodsNum.Value2 = fmt.Sprintf("%v", yesterdayGoods)
|
|
// 在途金额
|
|
statistic, _ := getStatisticOrderSum(&request.Statistic{T: 3}, "transit_reward")
|
|
result.Store.TransitReward.Value1 = fmt.Sprintf("%.2f", statistic.TransitReward)
|
|
// 昨日在订单金额
|
|
yesterday, _ := getStatisticOrderSum(&request.Statistic{Values: []string{now.AddDate(0, 0, -1).Format("060102") + "0000"}, Unit: "", T: 3}, "transit_reward")
|
|
result.Store.TransitReward.Value2 = fmt.Sprintf("%.2f", yesterday.TransitReward)
|
|
// 可提金额
|
|
result.Store.UsedCash.Value1 = ""
|
|
// 昨天可用佣金额
|
|
result.Store.UsedCash.Value2 = ""
|
|
}
|
|
return result, err
|
|
}
|
|
|
|
// 生成24位订单号
|
|
// 前面17位代表时间精确到毫秒,中间3位代表进程id,最后4位代表序号
|
|
var num int64
|
|
|
|
func generate() string {
|
|
t := time.Now()
|
|
s := t.Format(utils.Continuity)
|
|
m := t.UnixNano()/1e6 - t.UnixNano()/1e9*1e3
|
|
ms := sup(m, 3)
|
|
p := os.Getpid() % 1000
|
|
ps := sup(int64(p), 3)
|
|
i := atomic.AddInt64(&num, 1)
|
|
r := i % 10000
|
|
rs := sup(r, 4)
|
|
n := fmt.Sprintf("%s%s%s%s", s, ms, ps, rs)
|
|
return n
|
|
}
|
|
|
|
// 对长度不足n的数字前面补0
|
|
func sup(i int64, n int) string {
|
|
m := fmt.Sprintf("%d", i)
|
|
for len(m) < n {
|
|
m = fmt.Sprintf("0%s", m)
|
|
}
|
|
return m
|
|
}
|
|
|