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.

452 lines
16 KiB

9 months ago
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
}