pg_employee_dao.go 7.9 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) BatchRemove(uids []int64) error {
	tx := dao.transactionContext.PgTx
	_, err := tx.QueryOne(
		pg.Scan(),
		"DELETE FROM employees WHERE uid IN (?)",
		pg.In(uids))
	return err
}

func (dao *EmployeeDao) BatchSetStatus(uids []int64, status int) error {
	tx := dao.transactionContext.PgTx
	_, err := tx.QueryOne(
		pg.Scan(),
		"UPDATE employees SET status=? WHERE uid IN (?)",
		status, pg.In(uids))
	return err
}

func (dao *EmployeeDao) ChangePrincipal(companyId int64, employeeAccount string) error {
	tx := dao.transactionContext.PgTx
	if _, err := tx.Query(
		pg.Scan(),
		"UPDATE employees SET is_principal=? WHERE company_id=?",
		false, companyId); err != nil {
		return err
	}
	if _, err := tx.QueryOne(
		pg.Scan(),
		"UPDATE employees SET is_principal=? WHERE company_id=? AND employee_account=?",
		true, companyId, employeeAccount); err != nil {
		return err
	}
	return nil
}

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) CalculatePersonUnReadNotification(uid int64) (map[string]int, error) {
	var unReadSystemNotification int
	var unReadInteractionNotification int
	tx := dao.transactionContext.PgTx
	sentNotificationModel := new(models.SentNotification)
	if count, err := tx.Model(sentNotificationModel).Relation("Notification").
		Where(`sent_notification.receiver @> '{"uid":?}'`, uid).
		Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_SYSTEM).
		Where("sent_notification.is_read = ?", false).
		Count(); err != nil {
		return nil, err
	} else {
		unReadSystemNotification = count
	}
	if count, err := tx.Model(sentNotificationModel).Relation("Notification").
		Where(`sent_notification.receiver @> '{"uid":?}'`, uid).
		Where("notification.notification_type = ?", domain.NOTIFICATION_TYPE_INTERACTION).
		Where("sent_notification.is_read = ?", false).
		Count(); err != nil {
		return nil, err
	} else {
		unReadInteractionNotification = count
	}
	return map[string]int{
		"unReadSystemNotification":      unReadSystemNotification,
		"unReadInteractionNotification": unReadInteractionNotification,
	}, nil
}

func (dao *EmployeeDao) CalculatePersonSuMoney(uid int64) (map[string]interface{}, error) {
	var incomeSuMoney float64
	var incomeSuMoneyOfYesterday float64
	tx := dao.transactionContext.PgTx
	suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
	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(&incomeSuMoneyOfYesterday); err != nil {
		return nil, err
	}
	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).
		Select(&incomeSuMoney); err != nil {
		return nil, err
	}
	return map[string]interface{}{
		"incomeSuMoney":            incomeSuMoney,
		"incomeSuMoneyOfYesterday": incomeSuMoneyOfYesterday,
	}, nil
}

// TODO 计算系统素币
func (dao *EmployeeDao) CalculateSystemSuMoney(companyId int64) (map[string] interface{}, error) {
	var systemUnExchangeSuMoney float64
	var systemExchangedSuMoney float64
	tx := dao.transactionContext.PgTx
	suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
	if err := tx.Model(suMoneyTransactionRecordModel).Join("JOIN employees AS employee ON employee.uid = employee.uid").
		ColumnExpr("sum(su_money_transaction_record.current_su_money) AS system_unExchange_su_money").
		Where("employee.company_id = ?", companyId).
		Where(`su_money_transaction_record.record_type = ?`, 5).
		Select(&systemUnExchangeSuMoney); err != nil {
		return nil, err
	}
	if err := tx.Model(suMoneyTransactionRecordModel).Join("JOIN employees AS employee ON employee.uid = employee.uid").
		ColumnExpr("sum(su_money_transaction_record.su_money) AS system_changed_su_money").
		Where("employee.company_id = ?", companyId).
		Where(`su_money_transaction_record.record_type = ?`, 5).
		Select(&systemExchangedSuMoney); err != nil {
		return nil, err
	}
	return  map[string] interface{} {
		"systemUnExchangeSuMoney": systemUnExchangeSuMoney,
		"systemExchangedSuMoney": systemExchangedSuMoney,
	},nil
}

// TODO 计算系统现金
func (dao *EmployeeDao) CalculateSystemCash(companyId int64) (map[string] interface{}, error) {
	var (
		systemUnExchangeCash float64
		systemExchangedCash float64
	)
	tx := dao.transactionContext.PgTx
	suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
	if err := tx.Model(suMoneyTransactionRecordModel).Join("JOIN employees AS employee ON employee.uid = employee.uid").
		ColumnExpr("sum(su_money_transaction_record.cash) AS system_exchanged_cash").
		Where("employee.company_id = ?", companyId).
		Where(`su_money_transaction_record.record_type = ?`, 5).
		Select(&systemExchangedCash) ; err != nil {
		return nil, err
	}

	cashPool := new(models.CashPool)
	if err := tx.Model(cashPool).
		Where("cash_pool.company_id = ?", companyId).
		Select(&systemUnExchangeCash) ; err != nil {
		return nil, err
	}

	return map[string] interface{} {
		"systemUnExchangeCash": systemUnExchangeCash,
		"systemExchangedCash": systemExchangedCash,
	}, nil
}

func (dao *EmployeeDao) CalculateSuMoneyTransactionRecord(uid int64, transactionStartTime time.Time, transactionEndTime time.Time) (map[string]interface{}, error) {
	var incomeSuMoney float64  // 收入的素币(2:任务奖励,3:增加)
	var expendSuMoney float64  // 消耗的素币(1:兑换物资,4:扣除, 5: 兑换现金)
	tx := dao.transactionContext.PgTx
	suMoneyTransactionRecordModel := new(models.SuMoneyTransactionRecord)
	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 IN (?)`, pg.In([]int{2, 3})).
		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 IN (?)`, pg.In([]int{1, 4})).
		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
	}
}