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.

460 lines
16 KiB

9 months ago
package service
import (
"encoding/json"
"errors"
"fmt"
"os"
"strings"
"sync/atomic"
"time"
"github.com/plutov/paypal"
"github.com/w3liu/go-common/constant/timeformat"
"pure/dto"
"pure/global"
"pure/model"
"pure/model/request"
"pure/utils"
)
func GetOrderData(userId string, info *request.SceneParams) (dto.OrderData, error) {
var (
// err error
result dto.OrderData
)
// TODO 全部数据包含哪些状态
switch info.Scene {
case "my":
result.Unship, _ = getOrderCount(userId, &request.SearchOrderList{Status: 2})
result.Shipped, _ = getOrderCount(userId, &request.SearchOrderList{Status: 3})
result.Finished, _ = getOrderCount(userId, &request.SearchOrderList{Status: 4})
result.Cancel, _ = getOrderCount(userId, &request.SearchOrderList{Status: 5})
default:
result.All, _ = getOrderCount(userId, &request.SearchOrderList{Status: 0})
result.Unship, _ = getOrderCount(userId, &request.SearchOrderList{Status: 2})
result.Shipped, _ = getOrderCount(userId, &request.SearchOrderList{Status: 3})
result.Finished, _ = getOrderCount(userId, &request.SearchOrderList{Status: 4})
result.Cancel, _ = getOrderCount(userId, &request.SearchOrderList{Status: 5})
}
return result, nil
}
func getOrderCount(userId string, info *request.SearchOrderList) (int64, error) {
var (
err error
result int64
)
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,5) AND mission_claim.create_by = ?", userId)
if info.Status != 0 {
db = db.Where("`order`.status = ?", info.Status)
}
if info.Code != "" {
db = db.Where("`order`.`code` = ?", info.Code)
}
switch info.Group {
case "user": // 下单人数
db = db.Group("`order`.user_id")
err = db.Count(&result).Error
default:
err = db.Count(&result).Error
}
return result, err
}
func GetOrderList(userId string, info *request.SearchOrderList) (error, any, int64) {
var (
err error
data []model.OrderList
total int64
)
limit := info.PageSize
offset := info.PageSize * (info.Page - 1)
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,5) AND mission_claim.create_by = ?", userId)
if info.Status != 0 {
db = db.Where("`order`.`status` = ?", info.Status)
}
if info.Code != "" {
db = db.Where("`order`.`code` = ?", info.Code)
}
err = db.Order("order.id desc").Offset(offset).Limit(limit).Find(&data).Error
if err != nil {
return errors.New("获取订单失败"), data, total
}
if len(data) == 0 {
return nil, data, total
}
var orderIds, userIds, claimNos, platforms []string
for _, val := range data {
orderIds = append(orderIds, val.OrderID)
userIds = append(userIds, val.UserID)
if val.Code != "" {
claimNos = append(claimNos, val.Code)
}
if val.Platform != "" {
platforms = append(platforms, val.Platform)
}
}
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("获取订单商品信息失败"), data, total
}
for _, goods := range orderGoodsList {
goodsMap[goods.OrderID] = goods
}
var (
users []model.UserSimple
userMap = make(map[string]model.UserSimple)
)
err = global.MG_DB.Model(&model.User{}).Where("`type` = 'customer' AND uuid IN (?)", userIds).Find(&users).Error
if err != nil {
return errors.New("获取订单用户信息失败"), data, total
}
for _, user := range users {
userMap[user.UUID.String()] = user
}
var (
missions []model.MissionClaimInfo
hireRatioMap = make(map[string]float64)
)
err = global.MG_DB.Model(&model.MissionClaim{}).Select("mission_claim.claim_no,mission_claim.mission_id,b.hire_type,b.hire_money,b.hire_ratio").
Joins("inner join mission b on mission_claim.mission_id=b.id").Where("claim_no IN (?) AND b.hire_type = 2", claimNos).Find(&missions).Error
if err != nil {
return errors.New("获取任务详情失败"), data, total
}
for _, val := range missions {
hireRatioMap[val.ClaimNo] = val.HireRatio
}
dictMap := getDictMap("release_channel", platforms)
for v := range data {
if val, ok := goodsMap[data[v].OrderID]; ok {
data[v].Goods = val
}
if val, ok := userMap[data[v].UserID]; ok {
data[v].User = val
}
if val, ok := hireRatioMap[data[v].Code]; ok {
data[v].InfluencerAmount = utils.FormatFloatToString(data[v].PaidPrice * val / 100)
}
if val, ok := dictMap[data[v].Platform]; ok {
data[v].Platform = val
}
}
return nil, data, total
}
func GetOrderDetail(userId string, info *request.GetOrderParams) (error, model.OrderDetail) {
var (
err error
data model.OrderDetail
tCommod model.TbGoods
)
err = global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code`").
Where("mission_claim.create_by = ? AND order_id = ?", userId, info.OrderID).Find(&data).Error
if err != nil {
return errors.New("获取订单失败"), data
}
err = global.MG_DB.Model(&model.OrderAddress{}).Where("order_id=?", info.OrderID).Find(&data.Address).Error
if err != nil {
return errors.New("获取订单地址失败"), data
}
err = global.MG_DB.Model(&model.OrderGoods{}).Where("order_id=?", info.OrderID).Find(&data.Goods).Error
if err != nil {
return errors.New("获取订单商品信息失败"), data
}
err = global.MG_DB.Model(&model.OrderDeliver{}).Where("order_id=?", info.OrderID).Find(&data.Deliver).Error
if err != nil {
return errors.New("获取发货信息失败"), data
}
if data.Code != "" {
var mission model.MissionClaimInfo
_ = global.MG_DB.Model(&model.MissionClaim{}).Joins("inner join mission b on mission_claim.mission_id=b.id").
Select("mission_claim.claim_no,mission_claim.mission_id,b.hire_type,b.hire_money,b.hire_ratio").Where("claim_no = ? AND b.hire_type = 2", data.Code).First(&mission)
if mission.MissionId != 0 {
amount := data.PaidPrice * mission.HireRatio / 100
data.InfluencerAmount = utils.FormatFloatToString(amount)
}
}
if data.Platform != "" {
data.Platform = GetSysDictDataLabel("release_channel", data.Platform)
}
global.MG_DB.Model(&model.TbGoods{}).Where("id=?", data.CommodID).Find(&tCommod)
global.MG_DB.Model(&model.SellerStore{}).Select("store_no,`type`,email").Where("store_no = ?", tCommod.StoreNo).Find(&data.Store)
_ = global.MG_DB.Model(&model.OrderPostSale{}).Select("id,order_id,status,remark,examine_time,refund_time,refund_status,created_at").Where("order_id = ? AND status IN (1,2,3)", data.OrderID).First(&data.PostSale).Error
if data.PayTime != nil {
data.Bill, _ = getBillView(data.OrderID)
}
data.Chain = model.Chain{Address: "b714e5508531a7b50d0696abdc83d2333bd896db24f68eb1470bb9529390ef3e"}
return nil, data
}
func GetOrderGoods(userId string, info *request.GetOrderParams) (error, model.OrderGoodsDetail) {
var (
err error
order model.Order
result model.OrderGoodsDetail
)
err = global.MG_DB.Model(&model.Order{}).Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code`").
Where("mission_claim.create_by = ? AND order_id = ?", userId, info.OrderID).Find(&order).Error
if err != nil {
return errors.New("获取订单失败"), result
}
err = global.MG_DB.Model(&model.OrderGoods{}).Where("order_id = ?", info.OrderID).Find(&result).Error
if err != nil {
return errors.New("获取订单商品信息失败"), result
}
err = global.MG_DB.Model(&model.OrderGoodsSpecs{}).Where("order_goods_id = ?", result.ID).Find(&result.GoodsSpecs).Error
if err != nil {
return errors.New("获取订单商品规格信息失败"), result
}
attributeValues := make(map[uint]*model.TbAttributeValueJson)
for i := 0; i < len(result.GoodsSpecs); i++ {
var attributeList []model.TbAttributeDetail
err = json.Unmarshal([]byte(result.GoodsSpecs[i].Specs), &attributeList)
if err != nil {
return err, result
}
if i == 0 {
var attributes []uint
for j := 0; j < len(attributeList); j++ {
attributes = append(attributes, attributeList[j].AttributeId)
}
orderSql := "FIELD(id"
for _, attribute := range attributes {
orderSql += fmt.Sprintf(",'%v'", attribute)
}
orderSql += ")"
err = global.MG_DB.Model(&model.TbAttribute{}).Select("id,`name`").Where("id IN (?)", attributes).Order(orderSql).Find(&result.Attributes).Error
if err != nil {
return err, result
}
}
for _, attribute := range attributeList {
if _, ok := attributeValues[attribute.AttributeId]; ok {
if !strings.Contains(attributeValues[attribute.AttributeId].Str, attribute.Value) {
attributeValues[attribute.AttributeId].Str += attribute.Value + ","
attributeValues[attribute.AttributeId].Items = append(attributeValues[attribute.AttributeId].Items, model.TbAttributeValueItem{Id: attribute.ValueId, Name: attribute.Value, Image: result.GoodsSpecs[i].Image})
}
} else {
attributeValues[attribute.AttributeId] = &model.TbAttributeValueJson{Items: []model.TbAttributeValueItem{{Id: attribute.ValueId, Name: attribute.Value, Image: result.GoodsSpecs[i].Image}}, Str: attribute.Value + ","}
}
}
}
for i := 0; i < len(result.Attributes); i++ {
if val, ok := attributeValues[result.Attributes[i].ID]; ok {
result.Attributes[i].Values = val.Items
}
}
return err, result
}
// 用户提现
func CreatePayOutPayer(paypalName, amount, withdID string) (error, *paypal.PayoutResponse) {
var (
err error
c *paypal.Client
)
if global.MG_CONFIG.Paypal.Env == "SandBox" {
c, err = paypal.NewClient(global.MG_CONFIG.Paypal.ClientID, global.MG_CONFIG.Paypal.Secret, paypal.APIBaseSandBox)
if err != nil {
return err, nil
}
} else {
c, err = paypal.NewClient(global.MG_CONFIG.Paypal.ClientID, global.MG_CONFIG.Paypal.Secret, paypal.APIBaseLive)
if err != nil {
return err, nil
}
}
_, err = c.GetAccessToken()
if err != nil {
return err, nil
}
payout := paypal.Payout{}
send := &paypal.SenderBatchHeader{
SenderBatchID: withdID,
}
item := make([]paypal.PayoutItem, 1)
fmt.Println(amount)
item[0] = paypal.PayoutItem{
RecipientType: "EMAIL",
Receiver: paypalName,
Amount: &paypal.AmountPayout{
Currency: "USD", // 收款类型
Value: amount, // 收款数量
},
Note: "打款",
}
payout.SenderBatchHeader = send
payout.Items = item
fmt.Println(payout.Items[0].Amount)
resp, err := c.CreateSinglePayout(payout)
if err != nil {
fmt.Println(err.Error())
fmt.Println(resp)
return err, nil
}
return err, resp
}
// 生成24位订单号
// 前面17位代表时间精确到毫秒,中间3位代表进程id,最后4位代表序号
var num int64
func Generate() string {
t := time.Now()
s := t.Format(timeformat.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
}
func GetOrderTotalList(info *request.SearchOrderList) (error, any) {
var (
err error
data model.OrderTotal
)
if info.Code == "" {
return errors.New("任务码不可为空"), nil
}
db := global.MG_DB.Model(&model.Order{})
if info.Status != 0 {
db = db.Where("status=?", info.Status)
}
if info.Code != "" {
db = db.Where("code=?", info.Code)
}
err = db.Select("sum(case when `status`=2 then 1 else 0 end) status2,sum(case when `status`=3 then 1 else 0 end) status3,sum(case when `status`=4 then 1 else 0 end) status4").Scan(&data).Error
if err != nil {
return errors.New("获取订单失败"), data
}
return nil, data
}
func GetMissionOrderStatistic(userId, claimNo string) (dto.MissionOrderStatistic, error) {
var (
err error
claim model.MissionClaim
statistic model.DtStatisticOrder
result dto.MissionOrderStatistic
)
err, claim = getMissionClaim(userId, claimNo)
if err != nil {
return result, err
}
statistic, _ = getStatisticsOrderByValues([]string{}, "", "2", claimNo)
visits := GetGoodsVisit(claimNo)
result = dto.MissionOrderStatistic{
OrderNum: statistic.OrderNum,
OrderDoneNum: statistic.OrderDoneNum,
OrderMoney: statistic.OrderMoney,
SettleReward: claim.RewardFinished,
TransitReward: claim.RewardUnfinished,
RewardRatio: 0.1,
Uv: visits,
SellNum: claim.AchieveNum,
}
result.OrderUserNum, _ = getOrderCount(userId, &request.SearchOrderList{Group: "user", Code: claimNo})
return result, nil
}
func getStatisticsOrder(value, unit, relationId string) (model.DtStatisticOrder, error) {
var (
err error
result model.DtStatisticOrder
)
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Where("`value` = ? AND `unit` = ?", value, unit)
if relationId != "" {
db = db.Where("`relation_id` = ?", relationId)
}
err = db.First(&result).Error
return result, err
}
// 累计销量 "all","all","goods_id"
// 30天销量 "day","30","goods_id"
func GetStatisticsOrderByValues(unit string, value int, relationId string) (model.DtStatisticOrder, error) {
if value < 0 {
return model.DtStatisticOrder{}, errors.New("value error")
}
var values = make([]string, 0)
now := time.Now()
switch unit {
case "day":
if value == 0 {
values = append(values, now.Format("20060102"))
} else {
tmp := now.AddDate(0, 0, -value)
for i := 0; i < value; i++ {
values = append(values, tmp.Format("20060102"))
tmp = tmp.AddDate(0, 0, 1)
}
}
case "month":
}
return getStatisticsOrderByValues(values, "day", "", relationId)
}
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 getStatisticsOrderInfluence(uuid, unit string, timeArea []string) (model.DtStatisticOrder, error) {
var (
err error
result model.DtStatisticOrder
)
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Joins("INNER JOIN mission_claim ON mission_claim.claim_no = dt_statistic_order.relation_id").
Where("dt_statistic_order.`type` = 2 AND mission_claim.create_by = ? AND dt_statistic_order.`unit` = ?", uuid, unit)
if len(timeArea) == 2 {
db = db.Where("dt_statistic_order.created_at >= ? AND dt_statistic_order.created_at < ?", timeArea[0], timeArea[1])
}
err = db.Select("SUM(dt_statistic_order.order_num) as order_num,SUM(dt_statistic_order.order_done_num) as order_done_num,SUM(dt_statistic_order.order_money) as order_money,SUM(dt_statistic_order.sale_volume) as sale_volume,SUM(dt_statistic_order.settle_reward) as settle_reward,SUM(dt_statistic_order.order_cancel_num) as order_cancel_num,SUM(dt_statistic_order.order_cancel_money) as order_cancel_money").First(&result).Error
return result, err
}
func GetGoodsVisit(claimNo string) (count int64) {
global.MG_DB.Model(&model.GoodsVisit{}).Where("claim_no=?", claimNo).Count(&count)
return count
}