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: tools.TimeToStringPtr(v.LastWithdrawAuditAt), 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": model.REPORT_WITHDRAW_GRANTED, "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": model.REPORT_WITHDRAW_DENIED, "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 }