pg_employee_dao.go 3.2 KB
package dao

import (
	"fmt"
	"github.com/go-pg/pg"
	pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
	"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
	"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models"
	"time"
)

type EmployeeDao struct {
	transactionContext *pgTransaction.TransactionContext
}

func (dao *EmployeeDao) TransferSuMoney(uid int64, suMoney float64) error {
	tx := dao.transactionContext.PgTx
	_, err := tx.QueryOne(
		pg.Scan(),
		"UPDATE employees SET su_money=su_money+? WHERE uid=?",
		suMoney, uid)
	return err
}

func (dao *EmployeeDao) CalculatePersonSuMoney(uid int64) (*domain.PersonSuMoneyStatistics, error) {
	tx := dao.transactionContext.PgTx
	suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
	personSuMoneyStatistics := &domain.PersonSuMoneyStatistics{}
	yesterday := time.Now().AddDate(0, 0, -1)
	if err := tx.Model(suMoneyTransactionRecordModel).
		ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money").
		Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
		Where(`su_money_transaction_record.record_type = ?`, 2).
		Where(`su_money_transaction_record.create_time > ?`, time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 0, 0, 0, 0, yesterday.Location())).
		Where(`su_money_transaction_record.create_time < ?`, time.Date(yesterday.Year(), yesterday.Month(), yesterday.Day(), 23, 59, 59, 0, yesterday.Location())).
		Select(&personSuMoneyStatistics.IncomeSuMoneyOfYesterday); err != nil {
		return nil, err
	} else {
		return personSuMoneyStatistics, nil
	}
}

func (dao *EmployeeDao) CalculateSuMoneyTransactionRecord(uid int64, transactionStartTime time.Time, transactionEndTime time.Time) (map[string]interface{}, error) {
	tx := dao.transactionContext.PgTx
	suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
	var incomeSuMoney float64
	var expendSuMoney float64
	if err := tx.Model(suMoneyTransactionRecordModel).
		ColumnExpr("sum(su_money_transaction_record.su_money) AS income_su_money").
		Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
		Where(`su_money_transaction_record.record_type = ?`, 2).
		Where(`su_money_transaction_record.create_time > ?`, transactionStartTime).
		Where(`su_money_transaction_record.create_time < ?`, transactionEndTime).
		Select(&incomeSuMoney); err != nil {
		return nil, err
	}
	if err := tx.Model(suMoneyTransactionRecordModel).
		ColumnExpr("sum(su_money_transaction_record.su_money) AS expend_su_money").
		Where(`su_money_transaction_record.employee @> '{"uid":?}'`, uid).
		Where(`su_money_transaction_record.record_type = ?`, 1).
		Where(`su_money_transaction_record.create_time > ?`, transactionStartTime).
		Where(`su_money_transaction_record.create_time < ?`, transactionEndTime).
		Select(&expendSuMoney); err != nil {
		return nil, err
	}
	return map[string]interface{}{
		"incomeSuMoney": incomeSuMoney,
		"expendSuMoney": expendSuMoney,
	}, nil
}

func NewEmployeeDao(transactionContext *pgTransaction.TransactionContext) (*EmployeeDao, error) {
	if transactionContext == nil {
		return nil, fmt.Errorf("transactionContext参数不能为nil")
	} else {
		return &EmployeeDao{
			transactionContext: transactionContext,
		}, nil
	}
}