dividend.go 7.0 KB
package dividend

import (
	"fmt"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/application/factory"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/log"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/protocol"
	"time"
)

// 分红统计
func Statistics(header *protocol.RequestHeader, request *protocol.DividendStatisticsRequest) (rsp *protocol.DividendStatisticsResponse, err error) {
	var (
		transactionContext, _    = factory.CreateTransactionContext(nil)
		OrderBaseResponsitory, _ = factory.CreateOrderBaseRepository(transactionContext)
		//BusinessBonusRepository, _ = factory.CreateBusinessBonusRepository(transactionContext)
	)
	if err = transactionContext.StartTransaction(); err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()

	// 事业分红统计-查询订单
	_, orderAll, e := OrderBaseResponsitory.Find(utils.ObjectJsonToMap(domain.OrderQueryOption{PartnerId: request.PartnerId, EndTime: utils.GetDayEnd(), SortBySalesTime: domain.DESC, OrderTypes: domain.UserOrderTypes(domain.Career)}))
	if e != nil {
		log.Error(e)
	}

	//获取营销年
	t := time.Now()
	var last time.Time
	var first time.Time
	boundDate := time.Date(t.Year(), time.March, 31, 23, 59, 59, 0, time.Local) // 营销年界限
	fmt.Println("营销年界限:", boundDate)
	if t.Before(boundDate) || t.Equal(boundDate) {
		first = time.Date(t.Year()-1, time.April, 1, 0, 0, 0, 0, time.Local)
		last = time.Date(t.Year(), time.March, 31, 23, 59, 59, 0, time.Local)
	} else if t.After(boundDate) {
		first = time.Date(t.Year(), time.April, 1, 0, 0, 0, 0, time.Local)
		last = time.Date(t.Year()+1, time.March, 31, 23, 59, 59, 0, time.Local)
	}
	fmt.Println("当前营销年起始:", first, last)
	//last := time.Date(t.Year(), time.December, 31, 23, 59, 59, 0, time.Local)

	//first := time.Date(t.Year(), time.January, 1, 0, 0, 0, 0, time.Local)
	//last := first.AddDate(1, 0, 0)

	//last := time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), t.Nanosecond(), time.Local)
	//last := utils.GetDayEnd()

	// 请求开始时间和结束时间都为0时,默认从营销年开始统计
	if request.StartTime == 0 && request.EndTime == 0 {
		request.StartTime = first.Unix() * 1000
		request.EndTime = last.Unix() * 1000
	} else if request.StartTime > 0 && request.EndTime > 0 { // 判断结束时间是否超过今天,超过今天的结束时间到今天为止
		currentDayEnd := utils.GetDayEnd().Unix() * 1000
		if request.EndTime >= currentDayEnd {
			request.EndTime = currentDayEnd
		}
	}

	//if request.EndTime > last.Unix()*1000 {
	//	request.EndTime = last.Unix() * 1000
	//}
	fmt.Print("StartTime: ", request.StartTime, "\n")
	fmt.Print("EndTime: ", request.EndTime, "\n")

	var orderBetween []*domain.OrderBase
	for i := range orderAll {
		if orderAll[i].SaleDate.Unix() >= (request.StartTime/1000) && orderAll[i].SaleDate.Unix() < (request.EndTime/1000) {
			orderBetween = append(orderBetween, orderAll[i])
		}
	}
	// 事业分红统计-所有订单统计
	bonusAll := AllBonusStatics(orderAll, 0)
	// 事业分红统计-季度订单统计
	bonusQuarters := QuartersBonusStatics(orderBetween, 0)

	// 业务分红统计
	//if bonus, e := BusinessBonusRepository.FindOne(map[string]interface{}{"partner_id": request.PartnerId, "isDisable": 1}); e == nil {
	//	bonusAll.Receivable += bonus.Bonus
	//	bonusAll.Received += bonus.BonusHas
	//	bonusAll.Outstanding += bonus.BonusNot
	//	if bonus.UpdateAt.Unix() >= (request.StartTime/1000) && bonus.UpdateAt.Unix() < (request.EndTime/1000) {
	//		q := quarter(bonus.UpdateAt)
	//		bonusQuarters[q].Receivable += bonus.Bonus
	//		bonusQuarters[q].Received += bonus.BonusHas
	//		bonusQuarters[q].Outstanding += bonus.BonusNot
	//	}
	//}

	rsp = &protocol.DividendStatisticsResponse{}
	rsp.Statistics = protocol.DividendStatistics{
		Received:    bonusAll.Received,
		Outstanding: bonusAll.Outstanding,
		Receivable:  bonusAll.Receivable,
		Quarters:    bonusQuarters,
	}

	rsp.Timestamp = time.Now().Unix() * 1000

	err = transactionContext.CommitTransaction()
	return
}

// 累计分红
func AllBonusStatics(orders []*domain.OrderBase, action int) (bonus protocol.Bonus) {
	bonus = protocol.Bonus{}
	for i := range orders {
		o := orders[i]
		static := o.OrderBonusStatic()
		bonus.Received = utils.Decimal(bonus.Received + static.OrderBonusReceive())
		bonus.Outstanding = utils.Decimal(bonus.Outstanding + static.OrderBonusWait())
		bonus.Receivable = utils.Decimal(bonus.Receivable + static.OrderTotalReceivable())
	}
	return
}

// 订单-季度分红统计
func QuartersBonusStatics(orders []*domain.OrderBase, action int) (bonus []protocol.Bonus) {
	bonus = make([]protocol.Bonus, 4)
	for i := range orders {
		o := orders[i]
		quarter := quarter(o.SaleDate)
		static := o.OrderBonusStatic()
		bonus[quarter].Receivable = utils.Decimal(bonus[quarter].Receivable + static.OrderTotalReceivable())
		bonus[quarter].Received = utils.Decimal(bonus[quarter].Received + static.OrderBonusReceive())
		bonus[quarter].Outstanding = utils.Decimal(bonus[quarter].Outstanding + static.OrderBonusWait())
	}
	return
}

// 季度
func quarter(t time.Time) int {
	q := t.Month()
	switch q {
	case 4, 5, 6:
		return 0
	case 7, 8, 9:
		return 1
	case 10, 11, 12:
		return 2
	case 1, 2, 3:
		return 3
	}
	return 0
}

// 分红订单
func OrderList(header *protocol.RequestHeader, request *protocol.DividendOrdersRequest) (rsp *protocol.DividendOrdersResponse, err error) {
	var (
		transactionContext, _ = factory.CreateTransactionContext(nil)
		OrderDao, _           = factory.CreateOrderBaseDao(transactionContext)
		orders                []*domain.OrderBase
		count                 int
	)
	if err = transactionContext.StartTransaction(); err != nil {
		return nil, err
	}
	defer func() {
		transactionContext.RollbackTransaction()
	}()
	rsp = &protocol.DividendOrdersResponse{List: make([]*protocol.DividendOrderListItem, 0)}

	// 判断时间是否超过今天
	currentDayEnd := utils.GetDayEnd().Unix() * 1000
	if request.EndTime >= currentDayEnd {
		request.EndTime = currentDayEnd
	}

	count, orders, err = OrderDao.DividendOrders(&domain.DividendOrdersQueryOption{
		OrderTypes:      domain.UserOrderTypes(domain.Career),
		PartnerId:       request.PartnerId,
		DetailAction:    request.DetailAction,
		DividendAction:  request.DividendAction,
		StartTime:       request.StartTime,
		EndTime:         request.EndTime,
		Offset:          request.PageIndex * request.PageSize,
		Limit:           request.PageSize,
		SortBySalesTime: domain.DESC,
		JoinWays:        request.JoinWays,
	})
	if err != nil {
		return
	}

	for i := range orders {
		o := orders[i]
		s := o.OrderBonusStatic()
		item := &protocol.DividendOrderListItem{
			Id:                 o.Id,
			DeliveryNo:         o.DeliveryCode,
			OrderAmount:        s.PlanOrderAmount,
			DividendReceivable: utils.Decimal(s.OrderTotalReceivable()),
		}
		rsp.List = append(rsp.List, item)
	}
	rsp.Total = count

	err = transactionContext.CommitTransaction()
	return
}