241 lines
7.6 KiB
Go
241 lines
7.6 KiB
Go
package repository
|
||
|
||
import (
|
||
"electricity_bill_calc/config"
|
||
"electricity_bill_calc/global"
|
||
"electricity_bill_calc/logger"
|
||
"electricity_bill_calc/model"
|
||
"electricity_bill_calc/tools"
|
||
"electricity_bill_calc/types"
|
||
"fmt"
|
||
"github.com/doug-martin/goqu/v9"
|
||
"github.com/georgysavva/scany/v2/pgxscan"
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
type _WithdrawRepository struct {
|
||
log *zap.Logger
|
||
ds goqu.DialectWrapper
|
||
}
|
||
|
||
var WithdrawRepository = &_WithdrawRepository{
|
||
log: logger.Named("Repository", "Withdraw"),
|
||
ds: goqu.Dialect("postgres"),
|
||
}
|
||
|
||
//该方法用于分页查询核算报表
|
||
func (wd _WithdrawRepository) FindWithdraw(page uint, keyword *string) ([]model.Withdraw, int64, error) {
|
||
wd.log.Info("查询核算报表", zap.Stringp("keyword", keyword), zap.Int("page", int(page)))
|
||
ctx, cancel := global.TimeoutContext()
|
||
defer cancel()
|
||
|
||
/**
|
||
如果访问数据库次数过多出现时间过长的话可以用这个尝试优化,未测试的sql语句
|
||
|
||
wd.ds.From(goqu.T("report")).
|
||
Where(goqu.I("withdraw").Eq(1)).
|
||
Select(
|
||
goqu.I("report.*"),
|
||
goqu.I("park.*"),
|
||
goqu.I("user_detail.*"),
|
||
).
|
||
Join(
|
||
goqu.T("park"), goqu.On(goqu.I("report.park_id").Eq(goqu.I("park.id"))),
|
||
).
|
||
Join(
|
||
goqu.T("user_detail"), goqu.On(goqu.I("park.user_id").Eq(goqu.I("user_detail.id"))),
|
||
).ToSQL()
|
||
|
||
SELECT report.*, park.*, user_detail.*
|
||
FROM report as r
|
||
JOIN park as p ON r.park_id = p.id
|
||
JOIN user_detail as ud ON p.user_id = ud.id
|
||
WHERE withdraw = 1
|
||
AND p.name Like '%keyword%'
|
||
AND ud.name Like '%keyword%'
|
||
*/
|
||
reportQuery := wd.ds.
|
||
From(goqu.T("report").As("r")).
|
||
Where(goqu.I("withdraw").Eq(1)).
|
||
Join(goqu.T("park").As("p"), goqu.On(goqu.I("r.park_id").Eq(goqu.I("p.id")))).
|
||
Join(goqu.T("user_detail").As("ud"), goqu.On(goqu.I("p.user_id").Eq(goqu.I("ud.id")))).
|
||
Where(goqu.I("p.deleted_at").IsNull()).
|
||
Where(goqu.I("ud.deleted_at").IsNull()).
|
||
Select(
|
||
goqu.I("r.id").As("report_id"), goqu.I("r.last_withdraw_applied_at"), goqu.I("r.last_withdraw_audit_at"),
|
||
goqu.I("r.park_id").As("report_park_id"), goqu.I("r.period"), goqu.I("r.published"), goqu.I("r.published_at"), goqu.I("r.withdraw"),
|
||
goqu.I("p.address").As("park_address"), goqu.I("p.area"), goqu.I("p.capacity"), goqu.I("p.category"), goqu.I("p.contact").As("park_contact"),
|
||
goqu.I("p.id").As("park_id"), goqu.I("p.meter_04kv_type"), goqu.I("p.name").As("park_name"), goqu.I("p.phone").As("park_phone"), goqu.I("p.region").As("park_region"),
|
||
goqu.I("p.tenement_quantity"), goqu.I("p.user_id"), goqu.I("ud.address"), goqu.I("ud.contact").As("user_detail_contact"),
|
||
goqu.I("ud.id").As("ud_id"), goqu.I("ud.name").As("user_detail_name"), goqu.I("ud.phone").As("user_detail_phone"), goqu.I("ud.region").As("user_detail_region"),
|
||
)
|
||
|
||
countReportQuery := wd.ds.
|
||
From(goqu.T("report").As("r")).
|
||
Where(goqu.I("withdraw").Eq(1)).
|
||
Join(goqu.T("park").As("p"), goqu.On(goqu.I("r.park_id").Eq(goqu.I("p.id")))).
|
||
Join(goqu.T("user_detail").As("ud"), goqu.On(goqu.I("p.user_id").Eq(goqu.I("ud.id")))).
|
||
Select(goqu.COUNT("*"))
|
||
|
||
if keyword != nil && len(*keyword) > 0 {
|
||
pattern := fmt.Sprintf("%%%s%%", *keyword)
|
||
reportQuery = reportQuery.Where(goqu.Or(
|
||
goqu.I("p.name").ILike(pattern),
|
||
goqu.I("ud.name").ILike(pattern),
|
||
))
|
||
}
|
||
|
||
reportQuery = reportQuery.Order(goqu.I("r.created_at").Desc())
|
||
|
||
currentPostion := (page - 1) * config.ServiceSettings.ItemsPageSize
|
||
reportQuery = reportQuery.Offset(currentPostion).Limit(config.ServiceSettings.ItemsPageSize)
|
||
|
||
reportSql, reportArgs, _ := reportQuery.Prepared(true).ToSQL()
|
||
|
||
countReportQuerySql, countReportQueryArgs, _ := countReportQuery.Prepared(true).ToSQL()
|
||
|
||
var (
|
||
reports []*model.ReportRes = make([]*model.ReportRes, 0)
|
||
total int64
|
||
)
|
||
var err error
|
||
|
||
err = pgxscan.Select(ctx, global.DB, &reports, reportSql, reportArgs...)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
wd.log.Error("查询报表记录失败。", zap.Error(err))
|
||
return make([]model.Withdraw, 0), 0, err
|
||
}
|
||
|
||
if err = pgxscan.Get(ctx, global.DB, &total, countReportQuerySql, countReportQueryArgs...); err != nil {
|
||
wd.log.Error("查询报表记录总数失败。", zap.Error(err))
|
||
return make([]model.Withdraw, 0), 0, err
|
||
}
|
||
|
||
if len(reports) <= 0 {
|
||
return make([]model.Withdraw, 0), total, nil
|
||
}
|
||
|
||
var withdrawReses []model.Withdraw
|
||
//TODO: 2023.07.24对查询到的数据进行拼接(完成)
|
||
for _, v := range reports {
|
||
Begin := v.Period.SafeLower().Format("2006-01-02")
|
||
End := v.Period.SafeUpper().Format("2006-01-02")
|
||
|
||
var withdrawRes model.Withdraw
|
||
report := model.SimplifiedReport{
|
||
ID: v.ReportId,
|
||
LastWithdrawAppliedAt: tools.TimeToStringPtr(v.LastWithdrawAppliedAt),
|
||
LastWithdrawAuditAt: tools.TimeToStringPtr(v.LastWithdrawAuditAt),
|
||
Message: nil,
|
||
ParkID: v.ParkID,
|
||
PeriodBegin: Begin,
|
||
PeriodEnd: End,
|
||
Published: v.Published,
|
||
PublishedAt: nil,
|
||
Status: 0.,
|
||
Withdraw: v.Withdraw,
|
||
}
|
||
park := model.SimplifiedPark{
|
||
Address: v.ParkAddress,
|
||
Area: tools.NullDecimalToString(v.Area),
|
||
Capacity: tools.NullDecimalToString(v.Capacity),
|
||
Category: int16(v.Category),
|
||
Contact: v.ParkContact,
|
||
ID: v.ParkId,
|
||
Meter04KvType: v.Meter04KVType,
|
||
Name: v.ParkName,
|
||
Phone: v.ParkPhone,
|
||
Region: &v.ParkRegion,
|
||
Tenement: tools.NullDecimalToString(v.TenementQuantity),
|
||
UserID: v.UserID,
|
||
}
|
||
userInfo := model.UserInfos{
|
||
Address: v.Address,
|
||
Contact: &v.Contact,
|
||
ID: v.ID,
|
||
Name: v.Name,
|
||
Phone: &v.Phone,
|
||
Region: v.Region,
|
||
}
|
||
|
||
withdrawRes.Report = report
|
||
withdrawRes.Park = park
|
||
withdrawRes.User = userInfo
|
||
withdrawReses = append(withdrawReses, withdrawRes)
|
||
}
|
||
|
||
return withdrawReses, total, nil
|
||
}
|
||
|
||
//该方法用于审核同意报表撤回
|
||
func (wd _WithdrawRepository) ReviewTrueReportWithdraw( rid string) (bool, error) {
|
||
wd.log.Info("审核指定的报表", zap.String("rid", rid))
|
||
ctx, cancel := global.TimeoutContext()
|
||
defer cancel()
|
||
//update report set withdraw=$2,
|
||
//last_withdraw_audit_at=$3, published=false,
|
||
//published_at=null where id=$1
|
||
|
||
tx, err := global.DB.Begin(ctx)
|
||
if err != nil {
|
||
wd.log.Error("开启数据库事务失败", zap.Error(err))
|
||
}
|
||
updateQuerySql, updateArgs, _ := wd.ds.
|
||
Update(goqu.T("report")).
|
||
Set(goqu.Record{
|
||
"withdraw": 3,
|
||
"last_withdraw_audit_at": types.Now(),
|
||
"published": false,
|
||
"published_at": nil,
|
||
}).
|
||
Where(goqu.I("id").Eq(rid)).
|
||
Prepared(true).ToSQL()
|
||
|
||
rs, err := tx.Exec(ctx, updateQuerySql, updateArgs...)
|
||
if err != nil {
|
||
wd.log.Error("审核报表失败", zap.Error(err))
|
||
return false, err
|
||
}
|
||
err = tx.Commit(ctx)
|
||
if err != nil {
|
||
wd.log.Error("提交数据库事务失败", zap.Error(err))
|
||
return false, err
|
||
}
|
||
|
||
return rs.RowsAffected() > 0, nil
|
||
}
|
||
|
||
func (wd _WithdrawRepository) ReviewFalseReportWithdraw( rid string) (bool, error) {
|
||
wd.log.Info("审核指定的报表", zap.String("rid", rid))
|
||
ctx, cancel := global.TimeoutContext()
|
||
defer cancel()
|
||
|
||
tx, err := global.DB.Begin(ctx)
|
||
if err != nil {
|
||
wd.log.Error("开启数据库事务失败", zap.Error(err))
|
||
}
|
||
updateQuerySql, updateArgs, _ := wd.ds.
|
||
Update(goqu.T("report")).
|
||
Set(goqu.Record{
|
||
"withdraw": 2,
|
||
"last_withdraw_audit_at": types.Now(),
|
||
"published": false,
|
||
"published_at": nil,
|
||
}).
|
||
Where(goqu.I("id").Eq(rid)).
|
||
Prepared(true).ToSQL()
|
||
|
||
rs, err := tx.Exec(ctx, updateQuerySql, updateArgs...)
|
||
if err != nil {
|
||
wd.log.Error("审核报表失败", zap.Error(err))
|
||
return false, err
|
||
}
|
||
err = tx.Commit(ctx)
|
||
if err != nil {
|
||
wd.log.Error("提交数据库事务失败", zap.Error(err))
|
||
return false, err
|
||
}
|
||
|
||
return rs.RowsAffected() > 0, nil
|
||
} |