Browse Source

商品订单

kobe6258 4 months ago
parent
commit
5ea2fdc76a

+ 144 - 0
controllers/order.go

@@ -1,7 +1,9 @@
 package controllers
 
 import (
+	"encoding/json"
 	"eta/eta_mini_crm_ht/models"
+	"eta/eta_mini_crm_ht/models/request"
 	"eta/eta_mini_crm_ht/models/response"
 	"eta/eta_mini_crm_ht/utils"
 	"fmt"
@@ -676,3 +678,145 @@ func (this *OrderController) downloadExcelFile(file *excelize.File, filename str
 	}
 	return
 }
+
+// Refund
+// @Title 退款
+// @Description 退款
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ClassifyIds   query   string  true       "二级分类id,可多选用英文,隔开"
+// @Param   KeyWord   query   string  true       "报告标题/创建人"
+// @Param   SortType   query   string  true       "排序方式"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /refund [post]
+func (this *OrderController) Refund() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req request.RefundReq
+	if err := json.Unmarshal(this.Ctx.Input.RequestBody, &req); err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ProductOrderNo == "" {
+		br.Msg = "商品订单号不能为空"
+		br.ErrMsg = "商品订单号不能为空"
+		return
+	}
+	productOrder, err := models.GetProductOrderByID(req.ProductOrderNo)
+	if err != nil {
+		br.Msg = "获取商品订单失败"
+		br.ErrMsg = "获取商品订单失败,err:" + err.Error()
+		return
+	}
+	if productOrder.Status == models.OrderStatusPending {
+		br.Msg = "退款失败,"
+		br.ErrMsg = "退款失败,退款状态异常,当前订单已关闭"
+		return
+	}
+	if productOrder.Status == models.OrderStatusRefund && productOrder.RefundStatus != models.RefundStatusFailed {
+		br.Msg = "退款失败,"
+		br.ErrMsg = "退款失败,当前订单退款处理中"
+		return
+	}
+	tradeOrder, err := models.GetTradeOrderByNo(productOrder.TradeNO)
+	if err != nil {
+		br.Msg = "退款失败,获取原订单失败"
+		br.ErrMsg = "退款失败,获取原订单失败,err:" + err.Error()
+		return
+	}
+	if tradeOrder.PaymentType != models.PaymentTypePay {
+		br.Msg = "退款失败,原订单非支付订单"
+		br.ErrMsg = "退款失败,原订单非支付订单"
+		return
+	}
+	if tradeOrder.PaymentStatus == models.PaymentStatusDone {
+		br.Msg = "退款失败,原订单未完成支付"
+		br.ErrMsg = "退款失败,原订单未完成支付"
+		return
+	}
+	refundOrder := &models.TradeOrder{
+		TransactionId:    productOrder.TradeNO,
+		OrgTransactionId: productOrder.TradeNO,
+		ProductOrderId:   productOrder.OrderID,
+		PaymentAccount:   tradeOrder.PaymentAccount,
+		PaymentWay:       tradeOrder.PaymentWay,
+		Amount:           tradeOrder.Amount,
+		Currency:         tradeOrder.Currency,
+		UserId:           tradeOrder.UserId,
+		TemplateUserId:   tradeOrder.TemplateUserId,
+		PaymentType:      models.PaymentTypeRefund,
+		PaymentStatus:    models.PaymentStatusProcessing,
+		CreatedTime:      time.Now(),
+	}
+	productOrder.RefundStatus = models.RefundStatusPending
+	productOrder.Status = models.OrderStatusRefund
+	productOrder.RefundTradeId = refundOrder.TransactionId
+	productOrder.Remark = req.Remark
+	productOrder.RefundAmount = tradeOrder.Amount
+	err = refundOrder.Refund(productOrder)
+	if err != nil {
+		br.Msg = "退款失败"
+		br.ErrMsg = "退款失败,,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "退款处理成功"
+}
+
+// RefundDetail
+// @Title 退款详情
+// @Description 退款详情
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ClassifyIds   query   string  true       "二级分类id,可多选用英文,隔开"
+// @Param   KeyWord   query   string  true       "报告标题/创建人"
+// @Param   SortType   query   string  true       "排序方式"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /refundDetail [get]
+func (this *OrderController) RefundDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	ProductOrderNo := this.GetString("ProductOrderNo")
+	if ProductOrderNo == "" {
+		br.Msg = "商品订单号不能为空"
+		br.ErrMsg = "商品订单号不能为空"
+		return
+	}
+	productOrder, err := models.GetProductOrderByID(ProductOrderNo)
+	if err != nil {
+		br.Msg = "获取商品订单失败"
+		br.ErrMsg = "获取商品订单失败,err:" + err.Error()
+		return
+	}
+	if productOrder.Status != models.OrderStatusRefund && productOrder.RefundStatus != models.RefundStatusSuccess {
+		br.Msg = "当前订单未完成退款"
+		br.ErrMsg = "当前订单未完成退款"
+		return
+	}
+	refundOrder, err := models.GetTradeOrderByNo(productOrder.RefundTradeId)
+	if err != nil {
+		br.Msg = "获取退款订单失败"
+		br.ErrMsg = "获取退款订单失败,err:" + err.Error()
+		return
+	}
+	refundResp := response.RefundResp{
+		Account:          refundOrder.PaymentAccount,
+		RealName:         productOrder.RealName,
+		RefundAmount:     productOrder.RefundAmount,
+		RefundFinishTime: productOrder.RefundFinishTime.Format(time.DateTime),
+		Remark:           productOrder.Remark,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Data = refundResp
+	br.Msg = "退款详情获取成功"
+	return
+}

+ 1 - 1
models/product_order.go

@@ -21,7 +21,6 @@ const (
 	RefundStatusPending    RefundStatus = "pending"
 	RefundStatusFailed     RefundStatus = "failed"
 	RefundStatusProcessing RefundStatus = "processing"
-	RefundStatusCanceled   RefundStatus = "canceled"
 	WechatPayWay           PaymentWay   = "wechat"
 	AliPayWay              PaymentWay   = "alipay"
 
@@ -61,6 +60,7 @@ type ProductOrder struct {
 	TotalAmount      string              `gorm:"column:total_amount;size:255;default:null;comment:'金额'" json:"total_amount"`
 	TradeID          int                 `gorm:"column:trade_id;default:null;comment:'支付订单'" json:"trade_id"`
 	TradeNO          string              `gorm:"column:trade_no;default:null;comment:'支付订单'" json:"trade_no"`
+	RefundTradeId    string              `column:"refund_trade_id"`
 	RefundAmount     string              `gorm:"column:refund_amount;size:255;default:null;comment:'退款金额'" json:"refund_amount"`
 	PaymentWay       PaymentWay          `gorm:"column:payment_way;enum('wechat','alipay');default:null;comment:'支付渠道'"`
 	PaymentTime      time.Time           `gorm:"column:payment_time;default:null;comment:'支付时间'" json:"payment_time"`

+ 5 - 0
models/request/trade_order.go

@@ -1 +1,6 @@
 package request
+
+type RefundReq struct {
+	ProductOrderNo string
+	Remark         string
+}

+ 22 - 0
models/response/order.go

@@ -1 +1,23 @@
 package response
+
+import (
+	"eta/eta_mini_crm_ht/models"
+	"github.com/rdlucklib/rdluck_tools/paging"
+)
+
+type ProductOrderListResp struct {
+	List   []*models.ProductOrderView
+	Paging *paging.PagingItem
+}
+type TradeOrderListResp struct {
+	List   []*models.TradeOrderView
+	Paging *paging.PagingItem
+}
+
+type RefundResp struct {
+	RealName         string
+	RefundAmount     string
+	RefundFinishTime string
+	Account          string
+	Remark           string
+}

+ 31 - 15
models/trade_order.go

@@ -35,21 +35,22 @@ type TradeOrderView struct {
 	CreatedTime    string
 }
 type TradeOrder struct {
-	Id             uint          `gorm:"primaryKey;autoIncrement" json:"id"`
-	TransactionId  string        `gorm:"column:transaction_id;size:255;default:null;comment:'第三方平台ID'" json:"transaction_id"`
-	ProductOrderId string        `gorm:"column:product_order_id;size:255;default:null;comment:'商品订单号'" json:"product_order_id"`
-	PaymentAccount string        `gorm:"column:payment_account;size:255;default:null;comment:'支付账号'" json:"payment_account"`
-	PaymentWay     PaymentWay    `gorm:"column:payment_way;type:enum('wechat');default:null;comment:'支付渠道'" json:"payment_way"`
-	Amount         string        `gorm:"column:amount;size:20;default:null;comment:'支付金额'" json:"amount"`
-	Currency       string        `gorm:"column:currency;size:255;default:null;comment:'货币'" json:"currency"`
-	MerchantId     string        `gorm:"column:merchant_id;size:255;default:null;comment:'商户id'" json:"merchant_id"`
-	UserId         int           `gorm:"column:user_id;default:null;comment:'用户id'" json:"user_id"`
-	TemplateUserId int           `gorm:"column:template_user_id;default:null;comment:'临时用户id'" json:"template_user_id"`
-	PaymentType    string        `gorm:"column:payment_type;type:enum('pay','refund');default:null;comment:'订单类型'" json:"payment_type"`
-	PaymentStatus  PaymentStatus `gorm:"column:payment_status;type:enum('pending','done','failed');default:null;comment:'支付状态'" json:"payment_status"`
-	DealTime       time.Time     `gorm:"column:deal_time;default:null;comment:'完成时间'" json:"deal_time"`
-	CreatedTime    time.Time     `gorm:"column:created_time;default:null" json:"created_time"`
-	UpdatedTime    time.Time     `gorm:"column:updated_time;default:null" json:"updated_time"`
+	Id               uint          `gorm:"primaryKey;autoIncrement" json:"id"`
+	TransactionId    string        `gorm:"column:transaction_id;size:255;default:null;comment:'第三方平台ID'" json:"transaction_id"`
+	OrgTransactionId string        `gorm:"column:org_transaction_id;size:255;default:null;comment:'原支付第三方平台ID'" json:"org_transaction_id"`
+	ProductOrderId   string        `gorm:"column:product_order_id;size:255;default:null;comment:'商品订单号'" json:"product_order_id"`
+	PaymentAccount   string        `gorm:"column:payment_account;size:255;default:null;comment:'支付账号'" json:"payment_account"`
+	PaymentWay       PaymentWay    `gorm:"column:payment_way;type:enum('wechat');default:null;comment:'支付渠道'" json:"payment_way"`
+	Amount           string        `gorm:"column:amount;size:20;default:null;comment:'支付金额'" json:"amount"`
+	Currency         string        `gorm:"column:currency;size:255;default:null;comment:'货币'" json:"currency"`
+	MerchantId       string        `gorm:"column:merchant_id;size:255;default:null;comment:'商户id'" json:"merchant_id"`
+	UserId           int           `gorm:"column:user_id;default:null;comment:'用户id'" json:"user_id"`
+	TemplateUserId   int           `gorm:"column:template_user_id;default:null;comment:'临时用户id'" json:"template_user_id"`
+	PaymentType      PaymentType   `gorm:"column:payment_type;type:enum('pay','refund');default:null;comment:'订单类型'" json:"payment_type"`
+	PaymentStatus    PaymentStatus `gorm:"column:payment_status;type:enum('pending','done','failed');default:null;comment:'支付状态'" json:"payment_status"`
+	DealTime         time.Time     `gorm:"column:deal_time;default:null;comment:'完成时间'" json:"deal_time"`
+	CreatedTime      time.Time     `gorm:"column:created_time;default:null" json:"created_time"`
+	UpdatedTime      time.Time     `gorm:"column:updated_time;default:null" json:"updated_time"`
 }
 
 func (TradeOrder) TableName() string {
@@ -93,3 +94,18 @@ func GetTradeOrderByNo(tradeNo string) (tradeOrder TradeOrder, err error) {
 	err = o.Raw("select * from trade_orders where transsaction_id=? ", tradeNo).QueryRow(&tradeOrder)
 	return
 }
+
+func (to *TradeOrder) Refund(productOrder *ProductOrder) (err error) {
+	o := orm.NewOrm()
+	tx, _ := o.Begin()
+	defer func() {
+		if err != nil {
+			tx.Rollback()
+		} else {
+			tx.Commit()
+		}
+	}()
+	_, err = tx.Insert(to)
+	_, err = tx.Update(productOrder, "status", "refund_status", "refund_trade_id", "remark", "refund_amount")
+	return
+}

+ 18 - 0
routers/commentsRouter.go

@@ -351,6 +351,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:OrderController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "Refund",
+            Router: `/refund`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:OrderController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:OrderController"],
+        beego.ControllerComments{
+            Method: "RefundDetail",
+            Router: `/refundDetail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:OrderController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:OrderController"],
         beego.ControllerComments{
             Method: "ExportTradeOrder",