fonchain-fiee/pkg/service/bundle/bundleOrder.go

299 lines
8.3 KiB
Go
Raw Normal View History

2025-02-20 12:55:54 +00:00
package bundle
import (
"context"
"errors"
2025-03-28 10:51:15 +00:00
"fonchain-fiee/api/account"
2025-02-20 12:55:54 +00:00
"fonchain-fiee/api/bundle"
2025-02-23 02:42:41 +00:00
"fonchain-fiee/api/order"
2025-02-21 13:09:29 +00:00
"fonchain-fiee/pkg/model/login"
2025-02-20 12:55:54 +00:00
"fonchain-fiee/pkg/service"
2025-02-21 13:09:29 +00:00
"fonchain-fiee/pkg/service/bundle/common"
2025-02-22 07:31:21 +00:00
"fonchain-fiee/pkg/service/bundle/logic"
2025-02-21 13:09:29 +00:00
bundleModel "fonchain-fiee/pkg/service/bundle/model"
2025-03-28 01:25:54 +00:00
"math/big"
2025-03-25 08:30:58 +00:00
"strconv"
2025-02-20 12:55:54 +00:00
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
)
2025-02-21 13:09:29 +00:00
func CreateBundleOrderSignature(c *gin.Context) {
2025-02-20 12:55:54 +00:00
var req bundle.OrderRecord
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
if req.BundleUuid == "" {
service.Error(c, errors.New(common.MissBundleUUID))
return
}
2025-03-28 11:07:20 +00:00
// 不去校验 签名
/*if req.Signature == "" {
2025-02-20 12:55:54 +00:00
service.Error(c, errors.New(common.MissOrderSignature))
return
2025-03-28 11:07:20 +00:00
}*/
2025-02-20 12:55:54 +00:00
// 获取 用户信息
2025-02-21 13:09:29 +00:00
userInfo := login.GetUserInfoFromC(c)
2025-02-22 12:37:56 +00:00
// 校验 当前用户只能买一次套餐
orderRecordsListReq := bundle.OrderRecordsRequest{
CustomerID: strconv.FormatUint(userInfo.ID, 10),
}
orderRecordsList, orderRecordsListErr := service.BundleProvider.OrderRecordsList(context.Background(), &orderRecordsListReq)
if orderRecordsListErr != nil {
service.Error(c, orderRecordsListErr)
return
}
if orderRecordsList.OrderRecords != nil {
for _, order := range orderRecordsList.OrderRecords {
if order.CustomerID == strconv.FormatUint(userInfo.ID, 10) {
service.Error(c, errors.New(common.HadOrder))
return
}
}
}
2025-03-12 02:56:27 +00:00
// 获取 最后一次的 合同编号
lastOrderRecord, lastOrderRecordErr := service.BundleProvider.OrderRecordsList(context.Background(), &bundle.OrderRecordsRequest{
PageSize: 1,
Page: 1,
})
if lastOrderRecordErr != nil {
service.Error(c, lastOrderRecordErr)
return
}
lastContractNo := ""
if lastOrderRecord.OrderRecords != nil {
for _, lastOrder := range lastOrderRecord.OrderRecords {
lastContractNo = lastOrder.ContractNo
}
}
2025-02-21 13:09:29 +00:00
req.CustomerNum = userInfo.SubNum
req.CustomerName = userInfo.Name
req.CustomerID = strconv.FormatUint(userInfo.ID, 10)
2025-02-20 12:55:54 +00:00
// 获取 套餐信息
bundleDetailReq := &bundle.BundleDetailRequest{
Uuid: req.BundleUuid,
}
bundleDetail, detailErr := service.BundleProvider.BundleDetail(context.Background(), bundleDetailReq)
if detailErr != nil {
service.Error(c, detailErr)
return
}
2025-03-25 08:30:58 +00:00
//获取增值套餐信息
if req.ValueAddBundleUuid != "" {
valueAddBundleDetail, err := service.BundleProvider.ValueAddBundleDetail(context.Background(), &bundle.ValueAddBundleDetailRequest{
Uuid: req.ValueAddBundleUuid,
})
if err != nil {
service.Error(c, err)
return
}
2025-03-28 01:25:54 +00:00
req.ValueAddBundleUuid = valueAddBundleDetail.Data.Uuid
2025-03-28 18:08:16 +00:00
req.ValueAddOriginalPrice = valueAddBundleDetail.Data.OriginalPrice
req.ValueAddDiscountPrice = valueAddBundleDetail.Data.DiscountPrice
2025-03-28 21:02:05 +00:00
req.AddBundleCommonUid = valueAddBundleDetail.Data.AddBundleCommonUid
2025-03-28 18:08:16 +00:00
if valueAddBundleDetail.Data.Choose { // 可选条数
req.ValueAddBundleAmount = valueAddBundleDetail.Data.DiscountPrice * float32(req.Num)
discount, _ := new(big.Float).Sub(big.NewFloat(float64(valueAddBundleDetail.Data.OriginalPrice)), big.NewFloat(float64(valueAddBundleDetail.Data.DiscountPrice))).Float32()
req.ValueAddSavedAmount = discount * float32(req.Num)
} else { // 固定条数
req.ValueAddBundleAmount = valueAddBundleDetail.Data.TotalPrice
req.ValueAddSavedAmount = valueAddBundleDetail.Data.SavedAmount
}
2025-03-28 01:25:54 +00:00
req.TotalAmount, _ = new(big.Float).Add(big.NewFloat(float64(req.ValueAddBundleAmount)), big.NewFloat(float64(bundleDetail.Bundle.Price))).Float32()
2025-03-25 08:30:58 +00:00
}
2025-02-20 12:55:54 +00:00
req.BundleName = bundleDetail.Bundle.Name
req.Amount = bundleDetail.Bundle.Price
req.AmountType = bundleDetail.Bundle.PriceType
2025-03-28 21:02:05 +00:00
req.BundleCommonUid = bundleDetail.Bundle.BundleCommonUid
2025-03-25 08:30:58 +00:00
req.TotalAmount = req.Amount + req.ValueAddBundleAmount
2025-02-22 12:31:26 +00:00
req.PayType = 1 // 默认 人民币
2025-03-12 02:56:27 +00:00
req.ContractNo = common.GenerateContractNo(lastContractNo)
2025-02-20 12:55:54 +00:00
// 当前 未将 签名 写入合同中
2025-03-28 18:49:48 +00:00
signContract, signContractErr := logic.SignContractV2(req.CustomerNum, bundleDetail.Bundle.Contract, req.TotalAmount, bundleDetail.Bundle.ContractDuration)
2025-02-22 07:31:21 +00:00
if signContractErr != nil {
service.Error(c, signContractErr)
return
}
req.SignContract = signContract
2025-02-20 12:55:54 +00:00
req.SignedTime = common.GetBeijingTime()
2025-02-21 13:09:29 +00:00
req.Status = bundleModel.OrderSigned
2025-02-20 12:55:54 +00:00
res, err := service.BundleProvider.CreateOrderRecord(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
}
2025-02-21 13:09:29 +00:00
func UpdateBundleOrderStatusPaid(c *gin.Context) {
2025-02-20 12:55:54 +00:00
var req bundle.OrderRecord
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
// 获取 用户信息
2025-02-21 13:09:29 +00:00
userInfo := login.GetUserInfoFromC(c)
if req.Uuid == "" {
2025-02-22 11:36:25 +00:00
service.Error(c, errors.New(common.MissOrderUUID))
2025-02-21 13:09:29 +00:00
return
}
detail, detailErr := service.BundleProvider.OrderRecordsDetail(context.Background(), &bundle.OrderRecordsDetailRequest{
Uuid: req.Uuid,
})
if detailErr != nil {
2025-02-22 11:36:25 +00:00
service.Error(c, detailErr)
2025-02-21 13:09:29 +00:00
return
}
2025-02-20 12:55:54 +00:00
// 判断 是否是 本人操作
2025-02-21 13:09:29 +00:00
if strconv.FormatUint(userInfo.ID, 10) != detail.OrderRecord.CustomerID {
service.Error(c, errors.New(common.NotMatchOrderInfo))
return
}
2025-02-23 02:42:41 +00:00
// 如果 当前订单 是 已签未支付 且 存在 checkoutSessionId 需要 查询 支付结果
if detail.OrderRecord.Status == bundleModel.OrderSigned && detail.OrderRecord.CheckoutSessionId != "" && detail.OrderRecord.PayTime == "" {
// 查询支付结果
stripeInfosRes, stripeInfosErr := service.OrderProvider.QueryStripeInfoByCheckSessionIds(context.Background(), &order.QueryStripeInfoRequest{
CheckoutSessionIds: []string{detail.OrderRecord.CheckoutSessionId},
})
2025-02-21 13:09:29 +00:00
2025-02-23 02:42:41 +00:00
if stripeInfosErr != nil {
service.Error(c, errors.New(common.ErrorQueryStripeInfo))
return
}
2025-02-20 12:55:54 +00:00
2025-02-23 03:11:31 +00:00
totalStripe := 0
2025-02-23 02:42:41 +00:00
if stripeInfosRes != nil && len(stripeInfosRes.StripeInfos) > 0 {
2025-02-23 03:11:31 +00:00
totalStripe = len(stripeInfosRes.StripeInfos)
2025-02-23 02:42:41 +00:00
for _, stripeInfo := range stripeInfosRes.StripeInfos {
if stripeInfo.OutTradeNo == detail.OrderRecord.OrderNo && stripeInfo.PaymentIntentStatus == "paid" {
_, updateOrderRecordErr := service.BundleProvider.UpdateOrderRecord(context.Background(), &bundle.OrderRecord{
Uuid: detail.OrderRecord.Uuid,
Status: bundleModel.OrderPaid,
PayTime: common.GetBeijingTime(),
})
if updateOrderRecordErr != nil {
service.Error(c, detailErr)
return
}
2025-02-23 03:11:31 +00:00
totalStripe--
2025-02-23 02:42:41 +00:00
}
}
}
2025-02-23 03:11:31 +00:00
if totalStripe != 0 && totalStripe == len(stripeInfosRes.StripeInfos) {
_, updateOrderRecordErr := service.BundleProvider.UpdateOrderRecord(context.Background(), &bundle.OrderRecord{
Uuid: detail.OrderRecord.Uuid,
CheckoutSessionId: "",
CheckoutSessionUrl: "",
})
if updateOrderRecordErr != nil {
service.Error(c, detailErr)
return
}
}
2025-02-20 12:55:54 +00:00
}
2025-02-23 02:42:41 +00:00
service.Success(c, nil)
2025-02-20 12:55:54 +00:00
}
func OrderRecordsList(c *gin.Context) {
var req bundle.OrderRecordsRequest
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
// 获取 用户信息
2025-02-23 06:24:02 +00:00
//userInfo := login.GetUserInfoFromC(c)
2025-02-23 05:42:23 +00:00
2025-02-23 06:24:02 +00:00
//req.CustomerID = strconv.FormatUint(userInfo.ID, 10)
2025-02-20 12:55:54 +00:00
res, err := service.BundleProvider.OrderRecordsList(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
2025-03-28 10:51:15 +00:00
for _, orderRecord := range res.OrderRecords {
if orderRecord.CustomerID != "" {
var userID uint64
userID, err = strconv.ParseUint(orderRecord.CustomerID, 10, 64)
if err != nil {
err = nil
continue
}
userInfo, _ := service.AccountProvider.Info(context.Background(), &account.InfoRequest{
Domain: "app",
ID: userID,
})
if userInfo != nil {
orderRecord.Sex = userInfo.Sex
orderRecord.Nationality = userInfo.Nationality
orderRecord.CertificatePicture = userInfo.CertificatePicture
orderRecord.PlaceOfResidence = userInfo.PlaceOfResidence
orderRecord.GroupPhoto = userInfo.GroupPhoto
}
}
}
2025-02-20 12:55:54 +00:00
service.Success(c, res)
}
func OrderRecordsDetail(c *gin.Context) {
var req bundle.OrderRecordsDetailRequest
if err := c.ShouldBindBodyWith(&req, binding.JSON); err != nil {
service.Error(c, err)
return
}
2025-03-28 16:39:15 +00:00
/*// 获取 用户信息
2025-02-23 12:57:14 +00:00
userInfo := login.GetUserInfoFromC(c)
2025-03-28 16:39:15 +00:00
req.CustomerID = strconv.FormatUint(userInfo.ID, 10)*/
2025-02-20 12:55:54 +00:00
res, err := service.BundleProvider.OrderRecordsDetail(context.Background(), &req)
if err != nil {
service.Error(c, err)
return
}
service.Success(c, res)
}