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小时内上传物流信息,否则系统将自动关闭退货请求。|
寄回地址:" + addr.Address + " " + " " + addr.Name + addr.Mobile + "",
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: "退款金额¥" + asGoods.RefundAmount.String() + "将原路退回至您的付款账户,请及时关注到账情况。|退回瑞币" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "已返回至您的瑞币账户,请及时合适。|若3天内未收到退款/瑞币,请联系客服咨询。",
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: "退款金额¥" + asGoods.RefundAmount.String() + "将原路退回至您的付款账户,请及时关注到账情况。|退回瑞币" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "已返回至您的瑞币账户,请及时合适。|若3天内未收到退款/瑞币,请联系客服咨询。",
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小时内上传物流信息,否则系统将自动关闭退货请求。|寄回地址:" + addr.Address + " " + addr.Name + " " + addr.Mobile + "",
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: "退款金额¥" + asGoods.RefundAmount.String() + "将原路退回至您的付款账户,请及时关注到账情况。|退回瑞币" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "已返回至您的瑞币账户,请及时合适。|若3天内未收到退款/瑞币,请联系客服咨询。",
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小时内上传物流信息,否则系统将自动关闭退货请求。|寄回地址:" + addr.Address + " " + " " + addr.Name + addr.Mobile + "",
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: "退款金额¥" + asGoods.RefundAmount.String() + "将原路退回至您的付款账户,请及时关注到账情况。|退回瑞币" + asGoods.RefundCoin.Add(asGoods.ExpressFree).String() + "已返回至您的瑞币账户,请及时合适。|若3天内未收到退款/瑞币,请联系客服咨询。",
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()
}
}