pg_partner_dao.go 3.0 KB
package dao

import (
	"fmt"
	"github.com/go-pg/pg/v10"
	"github.com/go-pg/pg/v10/orm"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/domain"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/models"
	"gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/pg/transaction"
	. "gitlab.fjmaimaimai.com/mmm-go/partner/pkg/infrastructure/utils"
)

type PartnerInfoDao struct {
	transactionContext *transaction.TransactionContext
}

func (dao *PartnerInfoDao) Update(queryOptions map[string]interface{}) error {
	tx := dao.transactionContext.PgTx
	m := new(models.PartnerInfo)
	query := NewQuery(tx.Model(m), queryOptions)
	query.SetUpdate(`account=?`, "Account")
	query.SetUpdate(`password=?`, "Password")
	query.SetWhere(`id=?`, "Id")
	if _, ok := queryOptions["Id"]; !ok {
		return fmt.Errorf(`error: miss param "Id"`)
	}
	_, err := query.Update()
	return err
}

func (dao *PartnerInfoDao) PartnerStatic(queryOptions map[string]interface{}) (count int, err error) {
	tx := dao.transactionContext.PgTx
	m := new(models.PartnerInfo)
	query := NewQuery(tx.Model(m), queryOptions)

	query.ColumnExpr("count(*) count")
	if inPartnerIds, ok := queryOptions["inPartnerIds"]; ok {
		query.Where("id in (?)", pg.In(inPartnerIds.([]int64)))
	}
	if inPartnerCategory, ok := queryOptions["inPartnerCategory"]; ok {
		query.Where(`partner_info.partner_category_infos @>'[{"id":?}]'`, inPartnerCategory)
	}
	// 多个合伙人类型
	if inPartnerCategory, ok := queryOptions["inPartnerCategories"]; ok {
		query.Query = query.WhereGroup(func(q *orm.Query) (*orm.Query, error) {
			if arrayInPartnerCategory, ok := inPartnerCategory.([]int64); ok {
				for i := range arrayInPartnerCategory {
					q.WhereOr(`partner_info.partner_category_infos @>'[{"id":?}]')`, arrayInPartnerCategory[i])
				}
			}
			return q, nil
		})
	}
	err = query.Select(&count)
	return
}

func (dao *PartnerInfoDao) PartnerStatics(queryOptions map[string]interface{}) (statics []*domain.PartnerStatics, err error) {
	tx := dao.transactionContext.PgDd
	//m := new(models.PartnerInfo)
	sql := fmt.Sprintf(`select  A.*,
(B.amount1+C.amount2) amount,(B.bonus1+C.bonus2) bonus,(B.bonus_expense1 + C.bonus_expense2) bonus_expense
from 
(
	select * from partner_info
	WHERE (id in (1,2))
) 
A left join 
(
	SELECT partner_id,count(*) total1,sum(plan_order_amount) amount1, sum(plan_partner_bonus) bonus1, sum(partner_bonus_expense) bonus_expense1 FROM "order_base" AS "order_base" 
	WHERE (partner_id in (1,2)) and order_type =1
	GROUP BY partner_id
) B on A."id" = B.partner_id
left join
(
	select partner_info_id,count(*) total2,0 amount2, sum(bonus) bonus2, sum(bonus_expense) bonus_expense2 from business_bonus
	WHERE (partner_info_id in (1,2)) and is_disable=1
	GROUP BY partner_info_id
) C on A."id"= C."partner_info_id"`)
	tx.Query(&statics, sql)
	return
}

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