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.

1006 lines
30 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package order
import (
"fmt"
"git.oa00.com/go/mysql"
"recook/internal/api/mobile/pay/alipay"
"recook/internal/api/mobile/pay/public"
"recook/internal/api/mobile/pay/recookpay"
"recook/internal/api/mobile/pay/unionpay"
"recook/internal/api/mobile/pay/wxh5innerpay"
"recook/internal/api/mobile/pay/wxh5pay"
"recook/internal/api/mobile/pay/wxminipay"
"recook/internal/api/mobile/pay/wxpay"
"recook/internal/back"
"recook/internal/dbc"
"recook/internal/model/aftersales"
"recook/internal/model/goods"
"recook/internal/model/official"
"recook/internal/model/order"
"recook/internal/model/user"
"recook/internal/service/comFunc"
"recook/internal/v2/hook"
"recook/internal/v2/lib/common"
"recook/internal/v2/model/recook/after"
"recook/tools"
"strconv"
"time"
"github.com/astaxie/beego"
"github.com/gin-gonic/gin"
"github.com/golangkit/formatime"
"github.com/jinzhu/gorm"
"github.com/shopspring/decimal"
)
// 0正常1等待商家审核 2审核被拒绝 3审核成功 4买家已填写退货物流信息 5收到退货确认退款完成 6退货被拒绝
func QueryAfterSalesGoodsCount(c *gin.Context) {
var allCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Count(&allCount)
var needCheckCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where("return_status = 1 and is_closed <>1").Count(&needCheckCount)
var buyerShipCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where("return_status = 3 and is_closed <>1").Count(&buyerShipCount)
var needShipCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where("return_status = 4 and is_closed <>1").Count(&needShipCount)
var finishCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where("return_status = 5 and is_closed <>1").Count(&finishCount)
var rejectCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where("(return_status = 2) OR (return_status = 6) and is_closed <>1").Count(&rejectCount)
var colosedCount uint
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where("is_closed = 1").Count(&colosedCount)
back.Suc(c, "操作成功", gin.H{
"allCount": allCount,
"needCheckCount": needCheckCount,
"buyerShipCount": buyerShipCount,
"needShipCount": needShipCount,
"finishCount": finishCount,
"rejectCount": rejectCount,
"colosedCount": colosedCount,
})
}
type queryAfterGoodsParam struct {
Page uint `json:"page"` // 分页
Limit uint `json:"limit"`
Status uint `json:"status"`
AsID uint `json:"asId"`
AssType uint `json:"assType"`
ExpressSn string `json:"expressSn"`
OrderSn string `json:"orderSn"`
StartDate string `json:"startDate"`
EndDate string `json:"endDate"`
SkuCode string `json:"skuCode"`
}
type queryAfterGoodsResp struct {
aftersales.Goods
PurchasePrice decimal.Decimal `json:"purchasePrice"`
UnitPrice decimal.Decimal `json:"unitPrice"`
Address order.Addr `json:"address"`
AfterType string `json:"afterType"` //未发货仅退款、部分退款、退货退款
}
func QueryAfterSalesGoodsList(c *gin.Context) {
var p queryAfterGoodsParam
if err := tools.Params(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
var limit uint = 10
if p.Limit > 0 {
limit = p.Limit
}
where := fmt.Sprintf("return_status = %d", p.Status)
if p.Status == 2 || p.Status == 6 {
where = "(return_status = 2) OR (return_status = 6)"
} else if p.Status == 0 {
where = "1=1"
}
//搜索条件的where情况
whereSearch := " 1=1 "
if p.Status == 7 {
where = ""
whereSearch = " is_closed = 1 "
}
if p.AssType != 0 {
whereSearch += " and ass_type = " + string(strconv.Itoa(int(p.AssType)))
}
if p.OrderSn != "" {
whereSearch += " and order_id = '" + p.OrderSn + "'"
}
if p.ExpressSn != "" {
whereSearch += " and express_no = '" + p.ExpressSn + "'"
}
if p.StartDate != "" && p.EndDate != "" {
whereSearch += " and created_at > '" + p.StartDate + " 00:00:00' and created_at < '" + p.EndDate + " 23:59:59'"
}
if p.SkuCode != "" {
whereSearch += " and sku_code = '" + p.SkuCode + "'"
}
var total uint
asGoodsList := make([]aftersales.Goods, 0, 0)
dbc.DB.Limit(limit).Offset(limit*p.Page).Where(where).Where(whereSearch).Find(&asGoodsList, aftersales.Goods{
ID: p.AsID,
})
dbc.DB.Table((&aftersales.Goods{}).TableName()).Where(where).Where(whereSearch).Where(aftersales.Goods{
ID: p.AsID,
}).Count(&total)
list := make([]queryAfterGoodsResp, 0, 0)
var sku goods.Sku
var det order.GoodsDetail
for i, v := range asGoodsList {
var address order.Addr
dbc.DB.First(&address, "order_id = ?", v.OrderID)
dbc.DB.Select("purchase_price").Where("code = ?", v.SkuCode).First(&sku)
dbc.DB.Select("unit_price").Where("id = ?", v.OrderGoodsID).First(&det)
//获取售后类型
var afterType = ""
if v.IsShip == 0 && v.AssType == 1 {
afterType = "未发货仅退款"
}
if v.IsShip == 1 && v.AssType == 1 {
afterType = "部分退款"
}
if v.AssType == 2 {
afterType = "退货退款"
}
list = append(list, queryAfterGoodsResp{
Goods: asGoodsList[i],
PurchasePrice: sku.PurchasePrice,
UnitPrice: det.UnitPrice,
Address: address,
AfterType: afterType,
})
det = order.GoodsDetail{}
sku = goods.Sku{}
}
back.Suc(c, "", gin.H{
"total": total,
"list": list,
})
}
// ******************* ******************* ******************* ******************* *******************
// ******************* ******************* ******************* ******************* *******************
// ******************* ******************* *****更新操作******* ******************* *******************
// ******************* ******************* ******************* ******************* *******************
// ******************* ******************* ******************* ******************* *******************
type updateOrderCheckStatusParam struct {
AsID uint `json:"asId" binding:"required"`
Opinion uint `json:"opinion" binding:"required"` // 审核意见 1可以退货 2 拒绝退货
RejectReason string `json:"rejectReason" binding:"required"` // 拒绝理由
}
// @Summary 同意或拒绝商品退货/退款
// @Description
// @Tags 订单
// @Version 1.0
// @Accept json
// @Produce json
// @Param params body order.updateOrderCheckStatusParam true "参数"
// @Router /manage/order/return/goods/status/update [POST]
// @Success 200 {object}
func UpdateAfterSalesGoodsCheckStatus(c *gin.Context) {
var p updateOrderCheckStatusParam
if err := tools.Params(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
if p.Opinion == 2 && len(p.RejectReason) == 0 {
back.Fail(c, "必须填写拒绝理由")
return
}
var asGoods aftersales.Goods
if err := dbc.DB.First(&asGoods, p.AsID).Error; err != nil {
back.Err(c, err.Error())
return
}
var orderInfo order.Information
if err := dbc.DB.First(&orderInfo, asGoods.OrderID).Error; err != nil {
back.Err(c, err.Error())
return
}
userLog, _ := common.GetManageUser(c)
// 0正常1等待商家审核 2审核被拒绝 3审核成功 4买家已填写退货物流信息 5收到退货确认退款完成 6退货被拒绝
if asGoods.AssType == 2 { // 退货 退款
if p.Opinion == 1 {
tx := dbc.DB.Begin()
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 3,
CheckTime: formatime.NewSecondNow(),
}).Error; err != nil {
tx.Rollback()
back.Err(c, err.Error())
return
}
if !refundRecord(tx, orderInfo, asGoods) {
tx.Rollback()
back.Err(c, "流水保存错误1")
return
}
//这边增加一个让买家填写单号的通知
var userNotice = &user.Notice{
Type: 4,
UserID: asGoods.UserID,
Content: "您的售后已通过,尽快填写退回的快递单号",
CreatTime: formatime.NewSecondNow(),
}
tx.Create(userNotice)
//这里插入日志
var addr official.ReturnAddress
dbc.DB.Last(&addr)
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台同意退货",
Content: "平台同意买家退货买家须在48小时内上传物流信息否则系统将自动关闭退货请求。|<address>寄回地址:" + addr.Address + " " + " " + addr.Name + addr.Mobile + "</address>",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
tx.Commit()
} else { // 拒绝的话将原来的订单商品ass_type标记下
tx := dbc.DB.Begin()
{
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 2,
RejectReason: p.RejectReason,
FinishTime: formatime.NewSecondNow(),
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
if err := tx.Model(&order.GoodsDetail{ID: asGoods.OrderGoodsID}).Updates(map[string]interface{}{
"ass_type": 0,
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
//这里插入日志
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台拒绝退货",
Content: "拒绝买家退货申请,如有疑问,请联系客服",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
tx.Commit()
}
} else { // 只是退款
tx := dbc.DB.Begin()
{
if p.Opinion == 1 {
if asGoods.IsShip == 1 && asGoods.RefundAmount.IsZero() {
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 5,
RefundStatus: 1,
CheckTime: formatime.NewSecondNow(),
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
salesGoodsModel := after.RecookAfterSalesGoodsModel{Id: asGoods.ID}
mysql.Db.First(&salesGoodsModel)
if err := hook.AfterHook.Finish(&salesGoodsModel); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
//这里插入日志
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台同意退款",
Content: "同意买家退款平台将在24小时内处理退款。",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
aftersalesLog1 := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "退款成功",
Content: "退款金额<black>¥" + asGoods.RefundAmount.String() + "</black>将原路退回至您的<black>付款账户</black>,请及时关注到账情况。|退回瑞币<black>" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "</black>已返回至您的<black>瑞币账户</black>,请及时合适。|<gray>若3天内未收到退款/瑞币,请联系客服咨询。</gray>",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog1)
if err := public.SyncRefundSuccessCallback(tx, &asGoods); err != nil {
tx.Rollback()
back.Err(c, "退款失败")
return
}
tx.Commit()
} else {
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 5,
RefundStatus: 1,
CheckTime: formatime.NewSecondNow(),
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
salesGoodsModel := after.RecookAfterSalesGoodsModel{Id: asGoods.ID}
mysql.Db.First(&salesGoodsModel)
if err := hook.AfterHook.Finish(&salesGoodsModel); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
if orderInfo.PayMethod == 0 {
if err := recookpay.Refund(tx, &asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 1 {
if err := wxpay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 2 {
if err := alipay.Refund(tx, &asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 4 {
if err := wxminipay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.AlipayH5ForOrderInfo {
if err := alipay.Refund(tx, &asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.WechatH5PayForOrderInfo {
if err := wxh5pay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.WechatH5InnerForOrderInfo {
if err := wxh5innerpay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.UnionPay {
if err := unionpay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
//这里插入日志
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台同意退款",
Content: "同意买家退款平台将在24小时内处理退款。",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
aftersalesLog1 := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "退款成功",
Content: "退款金额<black>¥" + asGoods.RefundAmount.String() + "</black>将原路退回至您的<black>付款账户</black>,请及时关注到账情况。|退回瑞币<black>" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "</black>已返回至您的<black>瑞币账户</black>,请及时合适。|<gray>若3天内未收到退款/瑞币,请联系客服咨询。</gray>",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog1)
// 瑞比退款
if !refundRecord(tx, orderInfo, asGoods) {
tx.Rollback()
back.Err(c, "流水保存错误2")
return
}
tx.Commit()
if orderInfo.PayMethod == order.UnionPay {
if err := unionpay.RefundSucc(&asGoods); err != nil {
}
}
}
} else { // 拒绝的话将原来的订单商品ass_type标记下
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 2,
RejectReason: p.RejectReason,
FinishTime: formatime.NewSecondNow(),
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
if err := tx.Model(&order.GoodsDetail{ID: asGoods.OrderGoodsID}).Updates(map[string]interface{}{
"ass_type": 0,
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
//这里插入日志
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台拒绝退款",
Content: "拒绝买家退款申请,如有疑问,请联系客服",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
aftersalesLog1 := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "退款关闭",
Content: "系统自动关闭",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog1)
tx.Commit()
}
}
}
back.Suc(c, "", &asGoods)
}
type updateReturnSuccessParam struct {
AsID uint `json:"asId" binding:"required"`
Opinion uint `json:"opinion"` // 1同意退款退货 2拒绝
RejectReason string `json:"rejectReason"`
}
func UpdateAfterSalesGoodsExpressStatus(c *gin.Context) {
var p updateReturnSuccessParam
if err := tools.Params(&p, c); err != nil {
back.Fail(c, err.Error())
return
}
var asGoods aftersales.Goods
if err := dbc.DB.First(&asGoods, p.AsID).Error; err != nil {
back.Err(c, err.Error())
return
}
if asGoods.AssType == 1 {
back.Fail(c, "该订单仅退款")
return
}
if asGoods.ReturnStatus != 4 {
back.Fail(c, "订单状态不可更新")
return
}
var orderInfo order.Information
if err := dbc.DB.First(&orderInfo, asGoods.OrderID).Error; err != nil {
back.Err(c, err.Error())
return
}
userLog, _ := common.GetManageUser(c)
if p.Opinion == 2 {
if len(p.RejectReason) == 0 {
back.Fail(c, "没有填写拒绝原因")
return
}
tx := dbc.DB.Begin()
{
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 3, //让买家继续填写单号
RejectReason: p.RejectReason,
FinishTime: formatime.NewSecondNow(),
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
//这边增加一个让买家填写单号的通知
var userNotice = &user.Notice{
Type: 4,
UserID: asGoods.UserID,
Content: "您的售后已通过,尽快填写退回的快递单号",
CreatTime: formatime.NewSecondNow(),
}
tx.Create(userNotice)
//这里插入日志
var addr official.ReturnAddress
dbc.DB.Last(&addr)
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台拒绝收货",
Content: "已收到买家退回商品,不符合退货条件,拒绝退款。理由:" + p.RejectReason + "|买家须在48小时内上传物流信息否则系统将自动关闭退货请求。|<address>寄回地址:" + addr.Address + " " + addr.Name + " " + addr.Mobile + "</address>",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
aftersalesLog1 := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "等待买家重新上传物流信息",
Content: "",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog1)
//不改变商品的售后状态
//if err := tx.Model(&order.GoodsDetail{ID: asGoods.OrderGoodsID}).Updates(map[string]interface{}{
// "ass_type": 0,
//}).Error; err != nil {
// http.Err(c, err.Error())
// tx.Rollback()
// return
//}
}
tx.Commit()
} else {
tx := dbc.DB.Begin()
{
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 5,
RefundStatus: 1,
}).Error; err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
salesGoodsModel := after.RecookAfterSalesGoodsModel{Id: asGoods.ID}
mysql.Db.First(&salesGoodsModel)
if err := hook.AfterHook.Finish(&salesGoodsModel); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
if asGoods.IsShip == 1 && asGoods.RefundAmount.IsZero() {
var coinHistory user.CoinHistory
coinHistory.UserID = orderInfo.UserID
coinHistory.CoinType = user.RefundTypeForCoinHistory1
coinHistory.CoinNum = asGoods.RefundCoin
coinHistory.OrderId = orderInfo.ID
if err := tx.Save(&coinHistory).Error; err != nil {
tx.Rollback()
back.Err(c, "退款失败")
return
}
if err := coinHistory.UpdateWalletAfterCreate(tx, orderInfo.UserID); err != nil {
tx.Rollback()
back.Err(c, "退款失败")
return
}
} else {
if orderInfo.PayMethod == 0 {
if err := recookpay.Refund(tx, &asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 1 {
if err := wxpay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 2 {
if err := alipay.Refund(tx, &asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 4 {
if err := wxminipay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.AlipayH5ForOrderInfo {
if err := alipay.Refund(tx, &asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.WechatH5PayForOrderInfo {
if err := wxh5pay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.WechatH5InnerForOrderInfo {
if err := wxh5innerpay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.UnionPay {
if err := unionpay.Refund(&asGoods); err != nil {
back.Err(c, err.Error())
tx.Rollback()
return
}
}
// 瑞比退款
if !refundRecord(tx, orderInfo, asGoods) {
tx.Rollback()
back.Err(c, "流水保存错误2")
return
}
}
}
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台确认收货",
Content: "已收到买家退回商品,符合退货条件,同意退款。|平台将在24小时内处理退款。",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog)
aftersalesLog1 := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "退款成功",
Content: "退款金额<black>¥" + asGoods.RefundAmount.String() + "</black>将原路退回至您的<black>付款账户</black>,请及时关注到账情况。|退回瑞币<black>" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "</black>已返回至您的<black>瑞币账户</black>,请及时合适。|<gray>若3天内未收到退款/瑞币,请联系客服咨询。</gray>",
Ctime: formatime.NewSecondNow(),
User: userLog.Name,
UserId: userLog.Id,
}
tx.Create(&aftersalesLog1)
tx.Commit()
if orderInfo.PayMethod == order.UnionPay {
if err := unionpay.RefundSucc(&asGoods); err != nil {
}
}
}
back.Suc(c, "", nil)
}
func RefundRecord(tx *gorm.DB, orderInfo order.Information, afterSalesGood aftersales.Goods) bool {
return refundRecord(tx, orderInfo, afterSalesGood)
}
func refundRecord(tx *gorm.DB, orderInfo order.Information, afterSalesGood aftersales.Goods) bool {
// pay success 里面已经调用 这边不需要更新
if orderInfo.PayMethod != 0 {
if orderInfo.CoinTotalAmount.GreaterThan(decimal.NewFromInt(0)) {
var orderGoods order.GoodsDetail
if err := dbc.DB.First(&orderGoods, afterSalesGood.OrderGoodsID).Error; err != nil {
beego.Error(err)
return false
}
var coinHistory user.CoinHistory
coinHistory.UserID = orderInfo.UserID
coinHistory.CoinType = user.RefundTypeForCoinHistory1
// coinHistory.CoinNum = orderInfo.CoinTotalAmount
coinHistory.CoinNum = orderGoods.CoinAmount
coinHistory.OrderAmount = orderInfo.GoodsTotalAmount
coinHistory.OrderId = orderInfo.ID
coinHistory.Remark = "商品退款-退回"
// beego.Info(coinHistory.CoinNum, orderInfo.CoinTotalAmount)
if err := tx.Save(&coinHistory).Error; err != nil {
comFunc.PrintErr("refundRecord save coinHistory error:", err)
return false
}
if err := coinHistory.UpdateWalletAfterCreate(tx, orderInfo.UserID); err != nil {
comFunc.PrintErr("refundRecord UpdateWalletAfterCreate error:", err)
return false
}
}
}
return true
}
//24小时自动通过售后现在这个只针对已发货的退货退款和仅退款
var days time.Duration = 1
func AfterNotToDoOne() {
for {
select {
case <-time.After(2 * time.Minute):
t := time.Now().Add(time.Hour * 24 * -days)
//为了测试将24小时改成2分钟
//t := time.Now().Add(time.Minute * -2)
var afterSales []aftersales.Goods
dbc.DB.Find(&afterSales, "is_ship=1 and return_status = 1 AND apply_time <= ?", t.Format("2006-01-02 15:04:05"))
for _, v := range afterSales {
var p updateOrderCheckStatusParam
p = updateOrderCheckStatusParam{
v.ID,
1,
"自动退货",
}
UpdateAfterSalesGoods(p, v)
}
}
}
}
//自动通过未发货仅退款的
func AfterAssTpyeOne() {
for {
select {
case <-time.After(1 * time.Minute):
var afterSales []aftersales.Goods
dbc.DB.Find(&afterSales, "ass_type=1 and return_status = 1 and is_ship=0 and third_party_type = 0 and pay_method != ?", order.UnionPay)
for _, v := range afterSales {
var p updateOrderCheckStatusParam
p = updateOrderCheckStatusParam{
v.ID,
1,
"自动退货",
}
UpdateAfterSalesGoods(p, v)
}
}
}
}
//退款退货或者仅退款都通过
func UpdateAfterSalesGoods(p updateOrderCheckStatusParam, asGoods aftersales.Goods) {
var orderInfo order.Information
if err := dbc.DB.First(&orderInfo, asGoods.OrderID).Error; err != nil {
return
}
// 0正常1等待商家审核 2审核被拒绝 3审核成功 4买家已填写退货物流信息 5收到退货确认退款完成 6退货被拒绝
if asGoods.AssType == 2 { // 退货 退款
tx := dbc.DB.Begin()
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 3,
CheckTime: formatime.NewSecondNow(),
}).Error; err != nil {
tx.Rollback()
return
}
if !refundRecord(tx, orderInfo, asGoods) {
tx.Rollback()
return
}
//这边增加一个让买家填写单号的通知
var userNotice = &user.Notice{
Type: 4,
UserID: asGoods.UserID,
Content: "您的售后已通过,尽快填写退回的快递单号",
CreatTime: formatime.NewSecondNow(),
}
tx.Create(userNotice)
//这里插入日志
var addr official.ReturnAddress
dbc.DB.Last(&addr)
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台同意退货",
Content: "平台同意买家退货买家须在48小时内上传物流信息否则系统将自动关闭退货请求。|<address>寄回地址:" + addr.Address + " " + " " + addr.Name + addr.Mobile + "</address>",
Ctime: formatime.NewSecondNow(),
UserId: 0,
User: "系统",
}
tx.Create(&aftersalesLog)
tx.Commit()
} else { // 只是退款
tx := dbc.DB.Begin()
{
if p.Opinion == 1 {
if err := tx.Model(&asGoods).Updates(aftersales.Goods{
ReturnStatus: 5,
RefundStatus: 1,
CheckTime: formatime.NewSecondNow(),
}).Error; err != nil {
tx.Rollback()
return
}
if orderInfo.PayMethod == 0 {
if err := recookpay.Refund(tx, &asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 1 {
if err := wxpay.Refund(&asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 2 {
if err := alipay.Refund(tx, &asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == 4 {
if err := wxminipay.Refund(&asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.AlipayH5ForOrderInfo {
if err := alipay.Refund(tx, &asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.WechatH5PayForOrderInfo {
if err := wxh5pay.Refund(&asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.WechatH5InnerForOrderInfo {
if err := wxh5innerpay.Refund(&asGoods); err != nil {
tx.Rollback()
return
}
} else if orderInfo.PayMethod == order.UnionPay {
if err := unionpay.Refund(&asGoods); err != nil {
tx.Rollback()
return
}
}
}
}
if !refundRecord(tx, orderInfo, asGoods) {
tx.Rollback()
return
}
//这里插入日志
aftersalesLog := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "平台同意退款",
Content: "同意买家退款平台将在24小时内处理退款。",
Ctime: formatime.NewSecondNow(),
UserId: 0,
User: "系统",
}
tx.Create(&aftersalesLog)
aftersalesLog1 := aftersales.AftersalesLog{
AsId: asGoods.ID,
Title: "退款成功",
Content: "退款金额<black>¥" + asGoods.RefundAmount.String() + "</black>将原路退回至您的<black>付款账户</black>,请及时关注到账情况。|退回瑞币<black>" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "</black>已返回至您的<black>瑞币账户</black>,请及时合适。|<gray>若3天内未收到退款/瑞币,请联系客服咨询。</gray>",
Ctime: formatime.NewSecondNow(),
UserId: 0,
User: "系统",
}
tx.Create(&aftersalesLog1)
tx.Commit()
if orderInfo.PayMethod == order.UnionPay {
if err := unionpay.RefundSucc(&asGoods); err != nil {
}
}
}
}
//48小时自动关闭未填写单号的售后
var days1 time.Duration = 2
// AfterNotToDoTwo 买家没有填写单号
func AfterNotToDoTwo() {
for {
select {
case <-time.After(2 * time.Minute):
t := time.Now().Add(time.Hour * 72 * -days1)
//为了测试将24小时改成2分钟
//t := time.Now().Add(time.Minute * -2)
var afterSales []after.RecookAfterSalesGoodsModel
dbc.DB.Find(&afterSales, "return_status = 3 AND ass_type=2 AND check_time <= ?", t.Format("2006-01-02 15:04:05"))
for _, v := range afterSales {
var p updateReturnSuccessParam
p = updateReturnSuccessParam{
v.Id,
2,
"72小时未填写单号系统自动关闭",
}
UpdateNotExp(p, v)
}
}
}
}
//没有填写单号,退货被拒绝
func UpdateNotExp(p updateReturnSuccessParam, asGoods after.RecookAfterSalesGoodsModel) {
var orderInfo order.Information
if err := dbc.DB.First(&orderInfo, asGoods.OrderId).Error; err != nil {
return
}
if p.Opinion == 2 {
tx := mysql.Db.Begin()
{
if err := tx.Model(&asGoods).Updates(&after.RecookAfterSalesGoodsModel{
ReturnStatus: 6,
RejectReason: p.RejectReason,
FinishTime: formatime.NewSecondNow(),
IsClosed: 1,
}).Error; err != nil {
tx.Rollback()
return
}
if err := tx.Model(&order.GoodsDetail{ID: asGoods.OrderGoodsId}).Updates(map[string]interface{}{
"ass_type": 0,
"is_closed": 1,
}).Error; err != nil {
tx.Rollback()
return
}
if err := hook.AfterHook.Close(&asGoods); err != nil {
tx.Rollback()
return
}
}
tx.Commit()
}
}