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() } }