71 lines
1.8 KiB
Go
71 lines
1.8 KiB
Go
|
|
package repository
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"database/sql"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/muyuqingfeng/iloom/textile-service/internal/model"
|
||
|
|
)
|
||
|
|
|
||
|
|
type PaymentRepo struct {
|
||
|
|
db *sql.DB
|
||
|
|
}
|
||
|
|
|
||
|
|
func NewPaymentRepo(db *sql.DB) *PaymentRepo {
|
||
|
|
return &PaymentRepo{db: db}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepo) ListByCompany(ctx context.Context, companyID string) ([]model.Payment, error) {
|
||
|
|
query := `
|
||
|
|
SELECT p.id, p.plan_id, p.from_company_id, p.to_company_id,
|
||
|
|
p.amount, p.quantity, p.price_per_meter, p.status, p.paid_at, p.created_at,
|
||
|
|
COALESCE(pp.plan_code, '') AS plan_code,
|
||
|
|
COALESCE(c.name, '') AS from_company_name
|
||
|
|
FROM ilm_payment p
|
||
|
|
LEFT JOIN ilm_production_plan pp ON p.plan_id = pp.id
|
||
|
|
LEFT JOIN ilm_company c ON p.from_company_id = c.id
|
||
|
|
WHERE p.to_company_id = ?
|
||
|
|
ORDER BY p.created_at DESC`
|
||
|
|
|
||
|
|
rows, err := r.db.QueryContext(ctx, query, companyID)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
defer rows.Close()
|
||
|
|
|
||
|
|
var payments []model.Payment
|
||
|
|
for rows.Next() {
|
||
|
|
var p model.Payment
|
||
|
|
if err := rows.Scan(
|
||
|
|
&p.ID, &p.PlanID, &p.FromCompanyID, &p.ToCompanyID,
|
||
|
|
&p.Amount, &p.Quantity, &p.PricePerMeter, &p.Status, &p.PaidAt, &p.CreatedAt,
|
||
|
|
&p.PlanCode, &p.FromCompanyName,
|
||
|
|
); err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
payments = append(payments, p)
|
||
|
|
}
|
||
|
|
return payments, rows.Err()
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepo) Confirm(ctx context.Context, paymentID string) error {
|
||
|
|
now := time.Now()
|
||
|
|
query := `
|
||
|
|
UPDATE ilm_payment
|
||
|
|
SET status = 'paid', paid_at = ?
|
||
|
|
WHERE id = ?`
|
||
|
|
|
||
|
|
_, err := r.db.ExecContext(ctx, query, now, paymentID)
|
||
|
|
return err
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *PaymentRepo) CountPending(ctx context.Context, companyID string) (int, error) {
|
||
|
|
var count int
|
||
|
|
err := r.db.QueryRowContext(ctx,
|
||
|
|
`SELECT COUNT(*) FROM ilm_payment WHERE to_company_id = ? AND status = 'pending'`,
|
||
|
|
companyID,
|
||
|
|
).Scan(&count)
|
||
|
|
return count, err
|
||
|
|
}
|