order_base.go 4.7 KB
package domain

import (
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
	"time"
)

//OrderBase 订单基础
type OrderBase struct {
	//表id
	Id int64
	//订单类型 1:实际订单 2:意向订单
	OrderType int `pg:",notnull,default:1"`
	//订单编号
	OrderCode string
	//交货编号
	DeliveryCode string
	//买家
	Buyer *Buyer
	//订单区域信息
	RegionInfo *RegionInfo
	//订单对应的合伙人
	PartnerId int64
	//业务员抽成比例
	SalesmanBonusPercent float64
	//业务员抽成
	SalesmanBonus float64
	//预计的订单内货品总数
	PlanOrderCount int
	//预计的订单的总金额
	PlanOrderAmount float64
	//按需使用的订单内货品总数 (初始值=-1)
	UseOrderCount int
	//按需使用的订单内货品总数 (初始值=-1)
	UseOrderAmount float64
	//订单的创建时间
	CreateTime time.Time
	//发货时间
	DeliveryTime time.Time
	//更新时间
	UpdateTime time.Time
	//上一次查看时间 已读情况
	LastViewTime time.Time
	//合伙人应收分红
	PlanPartnerBonus float64
	//调整后的合伙人应收分红 (初始值=-1)
	UsePartnerBonus float64
	//合伙人已收分红
	PartnerBonusHas float64
	//合伙人未收分红
	PartnerBonusNot float64
	//合伙人分红支出
	PartnerBonusExpense float64
	//是否关闭【0;否】【1:是】
	IsDisable int8
	//1:待支付分红 2:已支付分红
	BonusStatus int8
	//货物列表
	OrderGood []*OrderGood
}

func (m *OrderBase) Identify() interface{} {
	if m.Id == 0 {
		return nil
	}
	return m.Id
}

//合伙人
//订单累计分红
func (m *OrderBase) OrderTotalBonus() float64 {
	if m.UseOrderCount >= 0 {
		return utils.Decimal(m.UsePartnerBonus + m.PartnerBonusExpense)
	}
	return utils.Decimal(m.PlanPartnerBonus)
}

//订单已收分红
func (m *OrderBase) OrderBonusReceive() float64 {
	return utils.Decimal(m.PartnerBonusHas)
}

//订单未收分红
func (m *OrderBase) OrderBonusWait() float64 {
	bonusWait := m.OrderTotalBonus() - m.OrderBonusReceive()
	if bonusWait < 0 {
		return 0
	}
	return bonusWait
}

//分红支出
func (m *OrderBase) OrderBonusOutstanding() float64 {
	return utils.Decimal(m.PartnerBonusExpense)
}

//订单被取消金额
func (m *OrderBase) OrderAmountCancel() float64 {
	if m.UseOrderAmount < 0 {
		return 0
	}
	if m.PlanOrderAmount > m.UseOrderAmount {
		return 0
	}
	return utils.Decimal(m.UseOrderAmount - m.PlanOrderAmount)
}

//订单金额
func (m *OrderBase) OrderAmount() float64 {
	if m.UseOrderAmount < 0 {
		return m.PlanOrderAmount
	}
	return m.UseOrderAmount
}

//订单是否已读
func (m *OrderBase) IsRead() int {
	if m.UpdateTime.After(m.LastViewTime) {
		return 0
	}
	return 1
}

func (m *OrderBase) OrderBonusStatic() *OrderStatics {
	return &OrderStatics{
		BonusStatus:         m.BonusStatus,
		PlanOrderCount:      m.PlanOrderCount,
		PlanOrderAmount:     m.PlanOrderAmount,
		UseOrderCount:       m.UseOrderCount,
		UseOrderAmount:      m.UseOrderAmount,
		PlanPartnerBonus:    m.PlanPartnerBonus,
		UsePartnerBonus:     m.UsePartnerBonus,
		PartnerBonusHas:     m.PartnerBonusHas,
		PartnerBonusNot:     m.PartnerBonusNot,
		PartnerBonusExpense: m.PartnerBonusExpense,
	}
}

type OrderQueryOption struct {
	PartnerId   int64     `json:"partnerId,omitempty"`
	OrderType   int       `json:"orderType,omitempty"`
	OrderStatus int       `json:"orderStatus,omitempty"`
	BeginTime   time.Time `json:"beginTime,omitempty"`
	EndTime     time.Time `json:"endTime,omitempty"`
	//IsDisable        string    `json:"isDisable,omitempty"`
	SortByCreateTime string `json:"sortByCreateTime,omitempty"`
	SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
	Offset           int    `json:"offset,omitempty"`
	Limit            int    `json:"limit,omitempty"`
}

type DividendOrdersQueryOption struct {
	PartnerId        int64  `json:"partnerId"`
	OrderType        int    `json:"orderType"`      //订单类型
	DetailAction     int    `json:"detailAction"`   //明细类型(0已收明细、1未收明细)
	DividendAction   int    `json:"dividendAction"` //分红类型(0累计分红、1分红支出)
	IsDisable        string `json:"isDisable,omitempty"`
	StartTime        int64  `json:"startTime" `
	EndTime          int64  `json:"endTime"`
	Offset           int    `json:"offset,omitempty"`
	Limit            int    `json:"limit,omitempty"`
	SortByUpdateTime string `json:"sortByUpdateTime,omitempty"`
}

//买家
type Buyer struct {
	//买家姓名
	BuyerName string `json:"buyerName"`
	//联系方式
	ContactInfo string `json:"contactInfo"`
	//收获地址
	ShippingAddress string `json:"shippingAddress"`
}

type OrderBaseRepository interface {
	Save(dm *OrderBase) (*OrderBase, error)
	Remove(dm *OrderBase) (*OrderBase, error)
	FindOne(queryOptions map[string]interface{}) (*OrderBase, error)
	Find(queryOptions map[string]interface{}) (int64, []*OrderBase, error)
}