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.
1048 lines
33 KiB
1048 lines
33 KiB
package service
|
|
|
|
import (
|
|
"bkb-seller/global"
|
|
"bkb-seller/initialize/api"
|
|
"bkb-seller/model"
|
|
"bkb-seller/model/request"
|
|
"bkb-seller/utils"
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"gorm.io/gorm"
|
|
"mime/multipart"
|
|
"os"
|
|
"sync/atomic"
|
|
"time"
|
|
|
|
"github.com/360EntSecGroup-Skylar/excelize/v2"
|
|
"github.com/w3liu/go-common/constant/timeformat"
|
|
)
|
|
|
|
func GetUserOrderList(storeNo string, 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{}).Where("`order`.store_no = ?", storeNo)
|
|
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.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 != "" {
|
|
db = db.Joins("INNER JOIN mission_claim ON mission_claim.claim_no = `order`.`code`").Where("mission_claim.create_by = ?", info.InfluenceId)
|
|
}
|
|
if info.SpuNo != "" {
|
|
db = db.Joins("INNER JOIN order_goods ON order_goods.order_id = `order`.order_id").Where("order_goods.spu_no = ?", info.SpuNo)
|
|
}
|
|
_ = 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("`user`.`type` = 'influencer' AND 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 {
|
|
if val.Phone != "" {
|
|
result[v].CustomerPhone = utils.HideStar(val.Phone)
|
|
}
|
|
}
|
|
}
|
|
return nil, result, total
|
|
}
|
|
|
|
func GetUserOrderDetail(storeNo string, info *request.SearchOrderDetail) (error, interface{}) {
|
|
var (
|
|
err error
|
|
result model.OrderDetail
|
|
missions model.MissionClaimInfo
|
|
)
|
|
err = global.MG_DB.Model(&model.Order{}).Where("`order`.store_no = ? AND `order`.order_id = ?", storeNo, info.OrderID).First(&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 SendOrder(storeNo string, info *request.SendOrder) error {
|
|
var (
|
|
err error
|
|
courier model.Courier
|
|
order model.Order
|
|
)
|
|
// 校验物流信息
|
|
err = global.MG_DB.Model(&model.Courier{}).Where("`name` = ?", info.Courier).First(&courier).Error
|
|
if err != nil {
|
|
return errors.New("courier company name is failed or not currently supported")
|
|
}
|
|
err = global.MG_DB.Model(&model.Order{}).Where("order_id=?", info.OrderID).Find(&order).Error
|
|
if err != nil {
|
|
return errors.New("获取订单数据失败")
|
|
}
|
|
if order.Status != 2 {
|
|
return errors.New("订单状态不允许发货")
|
|
}
|
|
var trackId uint
|
|
trackId, err = CreateTrack(info.CourierNumber, courier.Code)
|
|
if err != nil {
|
|
fmt.Println("提交物流单号:", err.Error())
|
|
return errors.New("物流单号有误,发货失败")
|
|
}
|
|
tx := global.MG_DB.Begin()
|
|
var deliver model.OrderDeliver
|
|
deliver.OrderID = info.OrderID
|
|
deliver.Courier = info.Courier
|
|
deliver.CourierNumber = info.CourierNumber
|
|
deliver.CourierLink = info.CourierLink
|
|
err = tx.Create(&deliver).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return errors.New("发货失败")
|
|
}
|
|
err = tx.Model(&model.Order{}).Where("order_id = ?", info.OrderID).Updates(map[string]interface{}{"send_time": time.Now(), "status": 3}).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return errors.New("发货失败")
|
|
}
|
|
err = tx.Model(&model.OrderDeliver{}).Where("order_id = ?", info.OrderID).Update("track_id", trackId).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return nil
|
|
}
|
|
tx.Commit()
|
|
global.MG_DB.Model(&model.BatchDeliver{}).Where("user_id=? and order_id=?", storeNo, info.OrderID).Update("status", 1)
|
|
return nil
|
|
}
|
|
|
|
func SendOrderBatch(storeNo string, info model.PutDeliver) error {
|
|
var (
|
|
err error
|
|
order model.Order
|
|
orderIds []string
|
|
courierNames []string
|
|
couriers []model.Courier
|
|
courierMap = make(map[string]string)
|
|
)
|
|
//删除批量发货记录
|
|
for _, val := range info.Data {
|
|
orderIds = append(orderIds, val.OrderID)
|
|
courierNames = append(courierNames, val.Courier)
|
|
}
|
|
err = global.MG_DB.Model(&model.Courier{}).Where("`name` IN (?)", courierNames).Select("`name`,`code`").Find(&couriers).Error
|
|
if err != nil {
|
|
return errors.New("get courier info error")
|
|
}
|
|
for _, courier := range couriers {
|
|
courierMap[courier.Name] = courier.Code
|
|
}
|
|
global.MG_DB.Model(&model.BatchDeliver{}).Where("order_id in (?)", orderIds).Delete(&model.BatchDeliver{})
|
|
for _, val := range info.Data {
|
|
var courierCode string
|
|
// 校验物流信息
|
|
if v, ok := courierMap[val.Courier]; ok {
|
|
courierCode = v
|
|
} else {
|
|
var bDeliver model.BatchDeliver
|
|
bDeliver.UserID = storeNo
|
|
bDeliver.Courier = val.Courier
|
|
bDeliver.CourierNumber = val.CourierNumber
|
|
bDeliver.CourierLink = val.CourierLink
|
|
bDeliver.OrderID = val.OrderID
|
|
bDeliver.Status = 2
|
|
bDeliver.Remark = "物流公司暂不支持或输入错误"
|
|
global.MG_DB.Create(&bDeliver)
|
|
continue
|
|
}
|
|
err = global.MG_DB.Model(&model.Order{}).Where("order_id = ?", val.OrderID).Find(&order).Error
|
|
if err != nil {
|
|
var bDeliver model.BatchDeliver
|
|
bDeliver.UserID = storeNo
|
|
bDeliver.Courier = val.Courier
|
|
bDeliver.CourierNumber = val.CourierNumber
|
|
bDeliver.CourierLink = val.CourierLink
|
|
bDeliver.OrderID = val.OrderID
|
|
bDeliver.Status = 2
|
|
bDeliver.Remark = "获取订单失败"
|
|
global.MG_DB.Create(&bDeliver)
|
|
continue
|
|
}
|
|
if order.Status != 2 || order.CaptureID == "" {
|
|
var bDeliver model.BatchDeliver
|
|
bDeliver.UserID = storeNo
|
|
bDeliver.Courier = val.Courier
|
|
bDeliver.CourierNumber = val.CourierNumber
|
|
bDeliver.CourierLink = val.CourierLink
|
|
bDeliver.OrderID = val.OrderID
|
|
bDeliver.Status = 2
|
|
bDeliver.Remark = "订单状态不允许发货"
|
|
global.MG_DB.Create(&bDeliver)
|
|
continue
|
|
}
|
|
var trackId uint
|
|
trackId, err = CreateTrack(val.CourierNumber, courierCode)
|
|
if err != nil {
|
|
return errors.New("物流单号:" + val.CourierNumber + "有误,发货失败。")
|
|
}
|
|
tx := global.MG_DB.Begin()
|
|
err = tx.Model(&model.OrderDeliver{}).Where("order_id = ?", val.OrderID).Delete(&model.OrderDeliver{}).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
continue
|
|
}
|
|
var deliver model.OrderDeliver
|
|
deliver.OrderID = val.OrderID
|
|
deliver.Courier = val.Courier
|
|
deliver.CourierNumber = val.CourierNumber
|
|
deliver.CourierLink = val.CourierLink
|
|
err = tx.Create(&deliver).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
var bDeliver model.BatchDeliver
|
|
bDeliver.UserID = storeNo
|
|
bDeliver.Courier = deliver.Courier
|
|
bDeliver.CourierNumber = deliver.CourierNumber
|
|
bDeliver.CourierLink = val.CourierLink
|
|
bDeliver.OrderID = deliver.OrderID
|
|
bDeliver.Status = 2
|
|
bDeliver.Remark = "订单发货失败"
|
|
global.MG_DB.Create(&bDeliver)
|
|
continue
|
|
}
|
|
err = tx.Model(&model.Order{}).Where("order_id=?", val.OrderID).Updates(map[string]interface{}{"send_time": time.Now(), "status": 3}).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
var bDeliver model.BatchDeliver
|
|
bDeliver.UserID = storeNo
|
|
bDeliver.Courier = deliver.Courier
|
|
bDeliver.CourierNumber = deliver.CourierNumber
|
|
bDeliver.CourierLink = val.CourierLink
|
|
bDeliver.OrderID = deliver.OrderID
|
|
bDeliver.Status = 2
|
|
bDeliver.Remark = "订单发货失败"
|
|
global.MG_DB.Create(&bDeliver)
|
|
continue
|
|
}
|
|
var bDeliver model.BatchDeliver
|
|
bDeliver.UserID = storeNo
|
|
bDeliver.Courier = deliver.Courier
|
|
bDeliver.CourierNumber = deliver.CourierNumber
|
|
bDeliver.CourierLink = val.CourierLink
|
|
bDeliver.OrderID = deliver.OrderID
|
|
bDeliver.Status = 1
|
|
tx.Create(&bDeliver)
|
|
err = tx.Model(&model.OrderDeliver{}).Where("order_id = ?", val.OrderID).Update("track_id", trackId).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
continue
|
|
}
|
|
tx.Commit()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// 生成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 ImportSendOrderExcel(fileBuf multipart.File, fileName string) (error, interface{}) {
|
|
var (
|
|
err error
|
|
flag bool
|
|
orderD []model.OrderDeliver
|
|
)
|
|
f, err := excelize.OpenReader(fileBuf)
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
// Get all the rows in the Sheet1.
|
|
list := f.GetSheetList()
|
|
rows, err := f.GetRows(list[0])
|
|
if err != nil {
|
|
return err, nil
|
|
}
|
|
for i, row := range rows {
|
|
flag = false
|
|
for _, cell := range row {
|
|
fmt.Println(cell)
|
|
}
|
|
if i >= 1 {
|
|
var deliver model.OrderDeliver
|
|
for j, cell := range row {
|
|
switch j {
|
|
case 0:
|
|
if cell == "" {
|
|
flag = true
|
|
}
|
|
deliver.OrderID = cell
|
|
case 1:
|
|
if cell == "" {
|
|
flag = true
|
|
}
|
|
deliver.CourierNumber = cell
|
|
case 2:
|
|
if cell == "" {
|
|
flag = true
|
|
}
|
|
deliver.Courier = cell
|
|
case 3:
|
|
if cell == "" {
|
|
flag = true
|
|
}
|
|
deliver.CourierLink = cell
|
|
}
|
|
if flag {
|
|
break
|
|
}
|
|
// fmt.Print(cell)
|
|
}
|
|
if !flag {
|
|
orderD = append(orderD, deliver)
|
|
}
|
|
}
|
|
if flag {
|
|
break
|
|
}
|
|
}
|
|
return nil, orderD
|
|
}
|
|
|
|
func GetBatchSendList(storeNo string, info *request.SearchBatchList) (error, interface{}, int64) {
|
|
var (
|
|
err error
|
|
data []model.BatchDeliverList
|
|
limit int
|
|
offset int
|
|
total int64
|
|
)
|
|
limit = info.PageSize
|
|
offset = info.PageSize * (info.Page - 1)
|
|
db := global.MG_DB.Model(&model.BatchDeliver{})
|
|
if info.Status != 0 {
|
|
db = db.Where("status=?", info.Status)
|
|
}
|
|
db = db.Where("user_id = ?", storeNo)
|
|
err = db.Count(&total).Error
|
|
if err != nil {
|
|
return errors.New("获取总数失败"), data, total
|
|
}
|
|
err = db.Offset(offset).Limit(limit).Find(&data).Error
|
|
if err != nil {
|
|
return errors.New("获取订单失败"), data, total
|
|
}
|
|
return nil, data, total
|
|
}
|
|
|
|
func GetBatchSendListTotal(storeNo string) (error, interface{}) {
|
|
var (
|
|
err error
|
|
data model.BatchDeliverTotal
|
|
)
|
|
db := global.MG_DB.Model(&model.BatchDeliver{})
|
|
db = db.Select("count(*) total,sum(case when status=1 then 1 else 0 end) status1,sum(case when status=2 then 1 else 0 end) status2")
|
|
err = db.Where("user_id=?", storeNo).Scan(&data).Error
|
|
if err != nil {
|
|
return errors.New("获取发货统计失败"), data
|
|
}
|
|
return nil, data
|
|
}
|
|
|
|
func getOrderDetail(id string) (model.OrderDetail, error) {
|
|
var (
|
|
err error
|
|
result model.OrderDetail
|
|
)
|
|
err = global.MG_DB.Model(&model.Order{}).Where("order_id = ?", id).Find(&result).Error
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderGoods{}).Where("order_id = ?", id).Find(&result.Goods).Error
|
|
if err != nil {
|
|
return result, errors.New("获取订单商品信息失败")
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderAddress{}).Where("order_id = ?", id).Find(&result.Address).Error
|
|
if err != nil {
|
|
return result, errors.New("获取订单商品信息失败")
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderDeliver{}).Where("order_id = ?", id).Find(&result.Deliver).Error
|
|
if err != nil {
|
|
return result, errors.New("获取订单发货信息失败")
|
|
}
|
|
//result.Customer, _ = getUserSimple("customer", result.UserID)
|
|
{
|
|
statistics, _ := getStatisticsOrderGoods(result.Goods.SkuNo, "", nil)
|
|
result.Goods.Sales = statistics.SaleVolume
|
|
}
|
|
{
|
|
var timeArea = make([]string, 2)
|
|
now := time.Now()
|
|
timeArea[0] = now.AddDate(0, 0, -29).Format(utils.DateFormat)
|
|
timeArea[1] = now.AddDate(0, 0, 1).Format(utils.DateFormat)
|
|
statistics, _ := getStatisticsOrderGoods(result.Goods.SkuNo, "", timeArea)
|
|
result.Goods.Sales30 = statistics.SaleVolume
|
|
}
|
|
return result, nil
|
|
}
|
|
func getOrderDetailList(ids []string) ([]model.OrderDetail, error) {
|
|
var (
|
|
err error
|
|
result []model.OrderDetail
|
|
)
|
|
err = global.MG_DB.Model(&model.Order{}).Where("order_id IN (?)", ids).Find(&result).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var (
|
|
orderGoodsList []model.OrderGoodsDetail
|
|
orderGoodsMap = make(map[string]model.OrderGoodsDetail)
|
|
addressList []model.OrderAddress
|
|
addressMap = make(map[string]model.OrderAddress)
|
|
delivers []model.OrderDeliver
|
|
deliverMap = make(map[string]model.OrderDeliver)
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderGoods{}).Where("order_id IN (?)", ids).Find(&orderGoodsList).Error
|
|
if err != nil {
|
|
return nil, errors.New("获取订单商品信息失败")
|
|
}
|
|
for _, goodsDetail := range orderGoodsList {
|
|
orderGoodsMap[goodsDetail.OrderID] = goodsDetail
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderAddress{}).Where("order_id in (?)", ids).Find(&addressList).Error
|
|
if err != nil {
|
|
return nil, errors.New("获取订单商品信息失败")
|
|
}
|
|
for _, address := range addressList {
|
|
addressMap[address.OrderID] = address
|
|
}
|
|
err = global.MG_DB.Model(&model.OrderDeliver{}).Where("order_id in (?)", ids).Find(&delivers).Error
|
|
if err != nil {
|
|
return nil, errors.New("获取订单发货信息失败")
|
|
}
|
|
for _, deliver := range delivers {
|
|
deliverMap[deliver.OrderID] = deliver
|
|
}
|
|
var (
|
|
uuids []string
|
|
userMap = make(map[string]model.UserSimple)
|
|
)
|
|
for i := 0; i < len(result); i++ {
|
|
uuids = append(uuids, result[i].UserID)
|
|
if val, ok := orderGoodsMap[result[i].OrderID]; ok {
|
|
result[i].Goods = val
|
|
}
|
|
if val, ok := addressMap[result[i].OrderID]; ok {
|
|
result[i].Address = val
|
|
}
|
|
if val, ok := deliverMap[result[i].OrderID]; ok {
|
|
result[i].Deliver = val
|
|
}
|
|
}
|
|
{
|
|
userList, _ := getUserSimpleList("customer", uuids)
|
|
for _, user := range userList {
|
|
userMap[user.UUID.String()] = user
|
|
}
|
|
}
|
|
for i := 0; i < len(result); i++ {
|
|
if val, ok := userMap[result[i].UserID]; ok {
|
|
result[i].Customer = val
|
|
}
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func GetOrderPostSale(storeNo string, info *request.IdReq) (error, model.OrderPostSaleDetail) {
|
|
var (
|
|
err error
|
|
result model.OrderPostSaleDetail
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderPostSale{}).Where("store_no = ? AND id = ?", storeNo, info.ID).
|
|
First(&result).Error
|
|
if err != nil {
|
|
return err, result
|
|
}
|
|
result.Order, err = getOrderDetail(result.OrderID)
|
|
return err, result
|
|
}
|
|
|
|
func GetOrderPostSaleList(storeNo string, info *request.SearchOrderPostSale) (error, []model.OrderPostSaleDetail, int64) {
|
|
var (
|
|
err error
|
|
total int64
|
|
result []model.OrderPostSaleDetail
|
|
)
|
|
limit := info.PageSize
|
|
offset := info.PageSize * (info.Page - 1)
|
|
db := global.MG_DB.Model(&model.OrderPostSale{}).Joins("INNER JOIN `order` ON `order`.order_id = order_post_sale.order_id").Where("order_post_sale.store_no = ?", storeNo)
|
|
if info.OrderId != "" {
|
|
db = db.Where("`order`.order_id = ?", info.OrderId)
|
|
}
|
|
switch info.Status {
|
|
case 1:
|
|
db = db.Where("order_post_sale.status = 1")
|
|
case 2:
|
|
db = db.Where("order_post_sale.status = 2 AND order_post_sale.refund_status = 0")
|
|
case 3:
|
|
db = db.Where("order_post_sale.status = 2 AND order_post_sale.refund_status = 1")
|
|
case 4:
|
|
db = db.Where("order_post_sale.status = 2 AND order_post_sale.refund_status = 2")
|
|
}
|
|
if info.ConfirmTimeStart != "" {
|
|
db = db.Where("`order`.confirm_time >= ?", info.ConfirmTimeStart)
|
|
}
|
|
if info.ConfirmTimeEnd != "" {
|
|
db = db.Where("`order`.confirm_time < ?", info.ConfirmTimeEnd)
|
|
}
|
|
_ = db.Count(&total).Error
|
|
err = db.Order("order_post_sale.id desc").Offset(offset).Limit(limit).Find(&result).Error
|
|
if err != nil {
|
|
return err, nil, 0
|
|
}
|
|
var (
|
|
orderIds []string
|
|
reasonValues []string
|
|
orderList []model.OrderDetail
|
|
orderMap = make(map[string]model.OrderDetail)
|
|
)
|
|
for _, detail := range result {
|
|
reasonValues = append(reasonValues, detail.Reason)
|
|
orderIds = append(orderIds, detail.OrderID)
|
|
}
|
|
orderList, err = getOrderDetailList(orderIds)
|
|
if err != nil {
|
|
return err, result, total
|
|
}
|
|
for _, detail := range orderList {
|
|
orderMap[detail.OrderID] = detail
|
|
}
|
|
dictDataMap, _ := getSysDictDataMap("return_goods_reason", reasonValues...)
|
|
for i := 0; i < len(result); i++ {
|
|
if val, ok := orderMap[result[i].OrderID]; ok {
|
|
result[i].Order = val
|
|
}
|
|
if val, ok := dictDataMap[result[i].Reason]; ok {
|
|
result[i].ReasonDesc = val
|
|
}
|
|
}
|
|
return err, result, total
|
|
}
|
|
|
|
func ExamineOrderPostSale(storeNo string, info *request.ExamineOrderPostSale) error {
|
|
var (
|
|
err error
|
|
updateM = make(map[string]interface{})
|
|
postSale model.OrderPostSale
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderPostSale{}).Where("store_no = ? AND id = ?", storeNo, info.Id).First(&postSale).Error
|
|
if err != nil {
|
|
return errors.New("get post sale record error")
|
|
}
|
|
updateM["examine_time"] = time.Now()
|
|
if info.Status == 1 { // 审核通过
|
|
updateM["status"] = 2 // 已审核
|
|
updateM["refund_status"] = 1 // 退款中
|
|
} else if info.Status == 2 { // 审核不通过
|
|
updateM["status"] = 3 // 已拒绝
|
|
updateM["remark"] = info.Remark
|
|
} else {
|
|
return errors.New("status incorrect value")
|
|
}
|
|
tx := global.MG_DB.Begin()
|
|
err = tx.Model(&model.OrderPostSale{}).Where("id = ?", info.Id).Updates(&updateM).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
// 将订单状态更改为已取消
|
|
err = tx.Model(&model.Order{}).Where("order_id = ?", postSale.OrderID).Update("status", "5").Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
tx.Commit()
|
|
if info.Status == 1 {
|
|
if orderCancelSettle(postSale.OrderID) != nil {
|
|
fmt.Println("退款审核结算失败:", err.Error())
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func orderCancelSettle(orderId string) error {
|
|
var (
|
|
err error
|
|
order model.Order
|
|
)
|
|
err = global.MG_DB.Model(&model.Order{}).Where("order_id = ?", orderId).First(&order).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if order.Status == 2 || order.Status == 3 { // 已付款且未确认收货
|
|
// 查询订单相关 网红及商家收益
|
|
var billList []model.Bill
|
|
err = global.MG_DB.Model(&model.Bill{}).Where("order_id = ? AND (platform = 'influencer' OR platform = 'seller') AND status = 2", orderId).Find(&billList).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
tx := global.MG_DB.Begin()
|
|
for _, bill := range billList {
|
|
var tmpBill model.Bill
|
|
tmpBill.UserID = bill.UserID
|
|
tmpBill.Type = "1"
|
|
tmpBill.OrderID = bill.OrderID
|
|
tmpBill.Price = bill.Price
|
|
tmpBill.Status = 1
|
|
tmpBill.Receipt = 1
|
|
tmpBill.Platform = bill.Platform
|
|
switch bill.Platform {
|
|
case "influencer":
|
|
// 扣除网红佣金
|
|
var wallet model.Wallet
|
|
err, wallet = getWallet("influencer", bill.UserID)
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return errors.New("获取网红钱包失败")
|
|
}
|
|
err = tx.Model(&model.Wallet{}).Where("id = ?", wallet.ID).Update("transit_balance", gorm.Expr("transit_balance - ?", bill.Price)).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
tmpBill.Balance = wallet.Balance
|
|
tmpBill.Title = "退回-" + bill.Title
|
|
tmpBill.TransactionId = "T" + Generate()
|
|
err = tx.Create(&tmpBill).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
case "seller":
|
|
// 扣除商家收入
|
|
var wallet model.Wallet
|
|
err, wallet = getWallet("seller", bill.UserID)
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return errors.New("获取商家钱包失败")
|
|
}
|
|
err = tx.Model(&model.Wallet{}).Where("id = ?", wallet.ID).Update("transit_balance", gorm.Expr("transit_balance - ?", bill.Price)).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
tmpBill.Balance = wallet.Balance
|
|
tmpBill.Title = "退回-" + bill.Title
|
|
tmpBill.TransactionId = "T" + Generate()
|
|
err = tx.Create(&tmpBill).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
}
|
|
err = tx.Create(&tmpBill).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return errors.New("添加网红账单失败")
|
|
}
|
|
}
|
|
tx.Commit()
|
|
} else if order.Status == 4 { // 已确认收货
|
|
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func RefundOrderPostSale(storeNo string, info *request.IdReq) error {
|
|
var (
|
|
err error
|
|
postSale model.OrderPostSale
|
|
)
|
|
err = global.MG_DB.Model(&model.OrderPostSale{}).Where("store_no = ? AND id = ?", storeNo, info.ID).First(&postSale).Error
|
|
if err != nil {
|
|
return errors.New("get post sale record error")
|
|
}
|
|
if postSale.Status != 2 { // 未审核通过
|
|
return errors.New("post sale examine not passed")
|
|
}
|
|
if postSale.RefundStatus != 1 { // 是否未退款
|
|
return errors.New("post sale in progress")
|
|
}
|
|
ok, err := global.MG_REDIS.SetNX("postSaleRefund-"+storeNo, "used", 0).Result()
|
|
if !ok || err != nil {
|
|
return errors.New("post sale refund in progress")
|
|
}
|
|
var (
|
|
order model.Order
|
|
bill model.Bill
|
|
)
|
|
err = global.MG_DB.Model(&model.Order{}).Where("order_id = ?", postSale.OrderID).First(&order).Error
|
|
if err != nil {
|
|
return errors.New("get order record error")
|
|
}
|
|
tx := global.MG_DB.Begin()
|
|
bill.UserID = order.UserID
|
|
bill.Type = "2"
|
|
bill.Title = "订单退款-" + order.OrderID
|
|
bill.OrderID = order.OrderID
|
|
bill.Price = postSale.Amount
|
|
bill.Status = 2
|
|
bill.Receipt = 2
|
|
bill.Platform = "customer"
|
|
bill.TransactionId = "R" + Generate()
|
|
err = tx.Create(&bill).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
attach, _ := json.Marshal(map[string]string{"order_id": order.OrderID, "transaction_id": bill.TransactionId})
|
|
params := api.RefundRequest{
|
|
Appid: "bkb5918273465092837",
|
|
Mchid: "11000001",
|
|
OutTradeNo: postSale.OrderID,
|
|
PayId: order.PaypalID,
|
|
Attach: string(attach),
|
|
NotifyUrl: global.MG_CONFIG.Paypal.NotifyUrl + "/base/payment/payback",
|
|
Amount: postSale.Amount,
|
|
Description: "订单申请退款-" + order.OrderID,
|
|
}
|
|
_, err = api.NewGreeterClient(global.PAY_CONN).RefundBill(context.Background(), ¶ms)
|
|
if err != nil {
|
|
fmt.Println(err.Error())
|
|
return errors.New("refund failed:" + postSale.OrderID)
|
|
}
|
|
tx.Commit()
|
|
return nil
|
|
}
|
|
|
|
func calculateFinishMissionClaimStatistics(info request.OrderStatistic) error {
|
|
var err error
|
|
now := time.Now().Format("060102") + "0000"
|
|
tx := global.MG_DB.Begin()
|
|
if info.ClaimNo != "" {
|
|
// 网红维度统计
|
|
var influenceOrder model.DtStatisticOrder
|
|
_ = global.MG_DB.Model(&model.DtStatisticOrder{}).Where("`value` = ? AND relation_id = ? AND `type` = 2", now, info.ClaimNo).First(&influenceOrder).Error
|
|
if influenceOrder.ID == 0 {
|
|
influenceOrder.Value = now
|
|
influenceOrder.Unit = ""
|
|
influenceOrder.Type = 2
|
|
influenceOrder.RelationId = info.ClaimNo
|
|
influenceOrder.SettleReward = info.Reward
|
|
err = tx.Model(&model.DtStatisticOrder{}).Create(&influenceOrder).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
} else {
|
|
var updateMap = make(map[string]interface{})
|
|
updateMap["settle_reward"] = gorm.Expr("settle_reward + ?", info.Reward)
|
|
err = tx.Model(&model.DtStatisticOrder{}).Where("id = ?", influenceOrder.ID).Updates(&updateMap).Error
|
|
if err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
tx.Commit()
|
|
return 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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
// 累计销量 "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, 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).
|
|
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")
|
|
if relationId != "" {
|
|
db = db.Where("`relation_id` = ?", relationId)
|
|
}
|
|
err = db.First(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
// 获取订单统计数据-任务维度
|
|
func getStatisticsOrderClaim(claimNo, unit string, timeArea []string) (model.DtStatisticOrder, error) {
|
|
var (
|
|
err error
|
|
result model.DtStatisticOrder
|
|
)
|
|
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Where("dt_statistic_order.`type` = 2 AND dt_statistic_order.relation_id = ? AND dt_statistic_order.`unit` = ?", claimNo, 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(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").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(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").First(&result).Error
|
|
return result, err
|
|
}
|
|
|
|
// 获取订单统计数据-商品维度
|
|
func getStatisticsOrderGoods(spuNo, unit string, timeArea []string) (model.DtStatisticOrder, error) {
|
|
var (
|
|
err error
|
|
result model.DtStatisticOrder
|
|
)
|
|
db := global.MG_DB.Model(&model.DtStatisticOrder{}).Joins("INNER JOIN tb_goods_specs ON tb_goods_specs.sku_no = dt_statistic_order.relation_id INNER JOIN tb_goods ON tb_goods.id = tb_goods_specs.goods_id").
|
|
Where("dt_statistic_order.`type` = 4 AND tb_goods.spu_no = ? AND dt_statistic_order.`unit` = ?", spuNo, 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(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").First(&result).Error
|
|
return result, err
|
|
}
|
|
|