micro-bundle/internal/logic/orderRecordsLogic.go

323 lines
11 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package logic
import (
"errors"
"fmt"
"micro-bundle/internal/dao"
"micro-bundle/internal/model"
"micro-bundle/pb/bundle"
"micro-bundle/pkg/app"
"micro-bundle/pkg/utils"
"strconv"
uuid "github.com/satori/go.uuid"
"github.com/jinzhu/copier"
)
func CreateOrderRecord(req *bundle.OrderCreateRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
// 下单前置校验
orderKind := model.OrderKindBundle
if req.OrderType == model.OrderTypeValueAdd {
orderKind = model.OrderKindValueAdd
}
if eligibility, e := CheckOrderEligibility(&bundle.CheckOrderEligibilityRequest{
CustomerID: req.CustomerID,
OrderKind: orderKind,
OrderMode: req.OrderMode,
}); e != nil {
return nil, e
} else if !eligibility.Allow {
res.Msg = eligibility.Msg
return res, errors.New(eligibility.Msg)
}
//orderUUID := app.ModuleClients.SfNode.Generate().Base64()
uuidV4, err := uuid.NewV4()
if err != nil {
fmt.Println("生成错误", err)
return nil, errors.New("生成uuid失败")
}
orderUUID := uuidV4.String()
orderNo := utils.GetOrderNo()
if req.OrderNo != "" {
orderNo = req.OrderNo
}
var addRecords []model.BundleOrderValueAdd
for _, i := range req.AddRecords {
addOrderMode := i.OrderMode
if addOrderMode == 0 {
addOrderMode = model.OrderModePayLater // 增值订单默认先用后付
}
addPayLaterStatus := i.PayLaterStatus
if addOrderMode == model.OrderModePayLater && addPayLaterStatus == 0 && i.PaymentStatus != 2 {
addPayLaterStatus = model.PayLaterStatusPending
}
addRecords = append(addRecords, model.BundleOrderValueAdd{
UUID: app.ModuleClients.SfNode.Generate().Base64(),
OrderNo: orderNo,
OrderUUID: orderUUID,
CustomerID: req.CustomerID,
CustomerNum: req.CustomerNum,
CustomerName: req.CustomerName,
ServiceType: i.ServiceType,
CurrencyType: i.CurrencyType,
Amount: float64(i.Amount),
Num: i.Num,
Unit: i.Unit,
ValueAddUUID: i.ValueUid,
Source: int(i.Source),
PaymentStatus: int(i.PaymentStatus),
SignContract: req.SignContract,
Signature: req.Signature,
SignedTime: req.SignedTime,
Snapshot: req.Snapshot,
HandlingFee: i.HandlingFee,
EquityType: i.EquityType,
QuotaType: i.QuotaType,
QuotaValue: i.QuotaValue,
IsExpired: i.IsExpired,
})
}
orderMode := req.OrderMode
if orderMode == 0 {
return res, errors.New("订单模式错误")
}
payLaterStatus := req.PayLaterStatus
if orderMode == model.OrderModePayLater && payLaterStatus == 0 && req.Status != model.BundleStatusPaid {
payLaterStatus = model.PayLaterStatusPending
}
// OrderType 从请求中获取,不写死
orderType := req.OrderType
if orderType == 0 {
return res, errors.New("订单类型错误")
}
orderRecord := &model.BundleOrderRecords{
UUID: orderUUID,
OrderNo: orderNo,
BundleUUID: req.BundleUuid,
BundleName: req.BundleName,
CustomerID: req.CustomerID,
CustomerNum: req.CustomerNum,
CustomerName: req.CustomerName,
Amount: req.Amount,
AmountType: req.AmountType,
TotalAmount: req.TotalAmount,
SignContract: req.SignContract,
Signature: req.Signature,
SignedTime: req.SignedTime,
PayType: int64(req.PayType),
PayTime: req.PayTime,
Status: req.Status,
ContractNo: req.ContractNo,
BundleCommonUid: req.BundleCommonUid,
FinancialConfirmation: model.ConfirmationNotConfirmed,
ExpirationTime: req.ExpirationTime,
Language: req.Language,
BundleOrderValueAdd: addRecords,
PlatformIds: req.PlatformIds,
InviterID: req.InviterId,
PurchaseType: req.PurchaseType,
RenewalOrderUUID: req.RenewalOrderUUID,
OrderMode: orderMode,
DueTime: req.DueTime,
PayLaterStatus: payLaterStatus,
ContractTplType: req.ContractTplType,
OrderType: orderType,
}
res, err = dao.CreateOrderRecord(orderRecord)
return
}
func UpdateOrderRecord(req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord := new(model.BundleOrderRecords)
_ = copier.CopyWithOption(&orderRecord, req, copier.Option{DeepCopy: true})
orderRecord.UUID = req.Uuid
orderRecord.BundleUUID = req.BundleUuid
res, err = dao.UpdateOrderRecord(orderRecord)
return
}
func UpdateOrderRecordByOrderNo(req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord := new(model.BundleOrderRecords)
_ = copier.CopyWithOption(&orderRecord, req, copier.Option{DeepCopy: true})
orderRecord.UUID = req.Uuid
orderRecord.BundleUUID = req.BundleUuid
orderRecord.Status = req.Status
fmt.Println("UpdateOrderRecordByOrderNo Status:", req.Status)
res, err = dao.UpdateOrderRecordByOrderNO(orderRecord)
return
}
func OrderRecordsList(req *bundle.OrderRecordsRequest) (res *bundle.OrderRecordsResponse, err error) {
res = new(bundle.OrderRecordsResponse)
res, err = dao.OrderRecordsList(req)
return
}
func OrderRecordsDetail(req *bundle.OrderRecordsDetailRequest) (res *bundle.OrderRecordsDetailResponse, err error) {
res = new(bundle.OrderRecordsDetailResponse)
res.OrderRecord = new(bundle.OrderRecord)
res.OrderRecord, err = dao.OrderRecordDetail(req)
if err != nil {
res.Msg = err.Error()
}
return
}
func GetInEffectOrderRecord(req *bundle.GetInEffectOrderRecordRequest) (res *bundle.OrderRecord, err error) {
res = new(bundle.OrderRecord)
orderReq := &bundle.OrderRecordsDetailRequest{
CustomerID: strconv.FormatUint(req.UserID, 10),
Status: 2,
}
res, err = dao.OrderRecordDetail(orderReq)
if err != nil {
return nil, errors.New("未找到有效订单")
}
return
}
func UpdateFinancialConfirmationStatus(req *bundle.FinancialConfirmationRequest) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
err = app.ModuleClients.BundleDB.Model(&model.BundleOrderRecords{}).Where("order_no = ?", req.OrderNo).Update("financial_confirmation", model.ConfirmationConfirmed).Error
if err != nil {
res.Msg = "更新财务确认状态失败"
return res, err
}
res.Msg = "更新财务确认状态成功"
return
}
func PackagePriceAndTime(req *bundle.OrderRecord) (res *bundle.PackagePriceAndTimeResponse, err error) {
res = new(bundle.PackagePriceAndTimeResponse)
res, err = dao.PackagePriceAndTime(req)
return
}
func CreateOrderAddRecord(req *bundle.OrderAddRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
// 增值订单下单前置校验规则5增值订单不受套餐过期限制可无限续杯
if eligibility, e := CheckOrderEligibility(&bundle.CheckOrderEligibilityRequest{
CustomerID: req.CustomerID,
OrderKind: model.OrderKindValueAdd,
OrderMode: req.OrderMode,
}); e != nil {
return nil, e
} else if !eligibility.Allow {
res.Msg = eligibility.Msg
return res, errors.New(eligibility.Reason)
}
res, err = dao.CreateOrderAddRecord(req)
return
}
func OrderRecordsListV2(req *bundle.OrderRecordsRequestV2) (res *bundle.OrderRecordsResponseV2, err error) {
res = new(bundle.OrderRecordsResponseV2)
res, err = dao.OrderRecordsListV2(req)
return
}
func OrderListByOrderNo(req *bundle.OrderInfoByOrderNoRequest) (res *bundle.OrderInfoByOrderNoResp, err error) {
res = new(bundle.OrderInfoByOrderNoResp)
res, err = dao.OrderListByOrderNo(req)
return
}
func GetReconciliationList(req *bundle.GetReconciliationListReq) (res *bundle.GetReconciliationListResp, err error) {
res = new(bundle.GetReconciliationListResp)
res, err = dao.GetReconciliationList(req)
return
}
func CreateReconciliation(req *bundle.ReconciliationInfo) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.CreateReconciliation(req)
return
}
func UpdateReconciliation(req *bundle.ReconciliationInfo) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.UpdateReconciliation(req)
return
}
func OnlyAddValueListByOrderNo(req *bundle.OnlyAddValueListByOrderNoRequest) (res *bundle.OnlyAddValueListByOrderNoResp, err error) {
res = new(bundle.OnlyAddValueListByOrderNoResp)
res, err = dao.OnlyAddValueListByOrderNo(req)
return
}
func UpdateReconciliationStatusBySerialNumber(req *bundle.UpdateStatusAndPayTimeBySerialNumber) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.UpdateReconciliationStatusBySerialNumber(req)
return
}
func DeleteValueAddService(req *bundle.DeleteValueAddServiceRequest) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.DeleteValueAddService(req)
return
}
func ListUnfinishedInfos(req *bundle.AutoCreateUserAndOrderRequest) (res *bundle.UnfinishedInfos, err error) {
res = new(bundle.UnfinishedInfos)
res, err = dao.ListUnfinishedInfos(req)
return
}
func SoftDeleteUnfinishedInfo(req *bundle.SoftDeleteUnfinishedInfoRequest) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.SoftDeleteUnfinishedInfo(req)
return
}
func ReSignTheContract(req *bundle.ReSignTheContractRequest) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
res, err = dao.ReSignTheContract(req)
return
}
func UpdateOrderRecordByOrderUuid(req *bundle.OrderRecord) (res *bundle.CommonResponse, err error) {
res = new(bundle.CommonResponse)
orderRecord := new(model.BundleOrderRecords)
_ = copier.CopyWithOption(&orderRecord, req, copier.Option{DeepCopy: true})
orderRecord.UUID = req.Uuid
orderRecord.BundleUUID = req.BundleUuid
orderRecord.Status = req.Status
fmt.Println("UpdateOrderRecordByOrderUuid Status:", req.Status)
res, err = dao.UpdateOrderRecordByOrderUuid(orderRecord)
return
}
func OrderListByOrderUuid(req *bundle.OrderInfoByOrderUuidRequest) (res *bundle.OrderInfoByOrderNoResp, err error) {
res = new(bundle.OrderInfoByOrderNoResp)
res, err = dao.OrderListByOrderUuid(req)
return
}
// GetUserOrderListWithDetails 根据用户ID获取订单列表包含子表
// 支持30+筛选条件和分页
func GetUserOrderListWithDetails(req *bundle.GetUserOrderListRequest) (*bundle.GetUserOrderListResponse, error) {
return dao.GetUserOrderListWithDetails(req)
}
// UpdateOrderExpiration 更新订单过期时间定时任务
// 根据 BundleBalance.ExpiredAt 更新 BundleOrderRecords.ExpirationTime
// 只更新 ExpirationTime 为空的记录
func UpdateOrderExpiration(req *bundle.UpdateOrderExpirationRequest) (*bundle.UpdateOrderExpirationResponse, error) {
res := &bundle.UpdateOrderExpirationResponse{}
updated, err := dao.UpdateOrderExpiration()
if err != nil {
res.Msg = fmt.Sprintf("更新失败: %v", err)
return res, err
}
res.Updated = updated
res.Msg = fmt.Sprintf("成功更新 %d 条订单记录", updated)
return res, nil
}
// CompleteExpiredOrders 完成已过期订单定时任务
// 将已支付且已过期的订单状态更新为已完成(status=4)
func CompleteExpiredOrders(req *bundle.CompleteExpiredOrdersRequest) (*bundle.CompleteExpiredOrdersResponse, error) {
res := &bundle.CompleteExpiredOrdersResponse{}
completed, err := dao.CompleteExpiredOrders()
if err != nil {
res.Msg = fmt.Sprintf("更新失败: %v", err)
return res, err
}
res.Completed = completed
res.Msg = fmt.Sprintf("成功完成 %d 条订单", completed)
return res, nil
}