package service import ( "electricity_bill_calc/global" "electricity_bill_calc/logger" "electricity_bill_calc/repository" "fmt" "github.com/doug-martin/goqu/v9" "go.uber.org/zap" ) type _GMService struct { l *zap.Logger gm goqu.DialectWrapper } var GMService = _GMService{ logger.Named("Service", "GM"), goqu.Dialect("postgres"), } func (gm _GMService) DeleteTenements(pid string, tenements []string) error { var err error ctx, cancel := global.TimeoutContext() defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("未能启动数据库事务", zap.Error(err)) return fmt.Errorf("未能启动数据库事务,%w", err) } err = repository.GMRepository.DeleteMeterBinding(ctx, tx, pid, tenements) if err != nil { tx.Rollback(ctx) return err } err = repository.GMRepository.DeleteTenements(ctx, tx, pid, tenements) if err != nil { tx.Rollback(ctx) return err } tx.Commit(ctx) return nil } func (gm _GMService) DeleteParks(parks []string) error { var err error ctx, cancel := global.TimeoutContext() defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("未能启动数据库事务", zap.Error(err)) return fmt.Errorf("未能启动数据库事务,%w", err) } for _, pid := range parks { //删除invoices err = repository.GMRepository.DeleteInvoices(ctx, tx, pid) //删除meter_binding err = repository.GMRepository.DeleteMeterBinding(ctx, tx, pid, []string{}) //删除meter_poolings err = repository.GMRepository.DeleteMeterPoolings(ctx, tx, pid) //删除tenements err = repository.GMRepository.DeleteTenements(ctx, tx, pid, []string{}) //删除meters err = repository.GMRepository.DeleteMeters(ctx, tx, pid) //删除reports err = repository.GMRepository.DeleteReports(ctx, tx, pid) //删除buildings err = repository.GMRepository.DeleteBuildings(ctx, tx, pid) if err != nil { gm.l.Error("删除关联表出错。", zap.Error(err)) break return err } } err = repository.GMRepository.DeleteParks(ctx, tx, parks) if err != nil { gm.l.Error("指定园区删除失败。", zap.Error(err)) return err } tx.Commit(ctx) return nil } func (gm _GMService) DeleteReports(pid string, reports []string) error { ctx, cancel := global.TimeoutContext() defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("未能启动数据库事务", zap.Error(err)) return fmt.Errorf("未能启动数据库事务,%w", err) } err = repository.GMRepository.DeleteReports(ctx, tx, pid, reports) if err != nil { tx.Rollback(ctx) return err } tx.Commit(ctx) return nil } func (gm _GMService) DeleteTenementMeterRelations(pId string, tId []string, mId []string) error { gm.l.Info("删除商户表记关系", zap.String("tenement", pId)) ctx, cancel := global.TimeoutContext(10) defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("开启数据库事务失败。", zap.Error(err)) return err } if err := repository.GMRepository.DeleteMeterBinding(ctx, tx, pId, tId, mId); err != nil { gm.l.Error("无法删除商户与表记关系。", zap.Error(err)) tx.Rollback(ctx) return err } err = tx.Commit(ctx) if err != nil { gm.l.Error("未能成功提交数据库事务。", zap.Error(err)) tx.Rollback(ctx) return err } return nil } func (gm _GMService) DeleteEnterprises(uid string) error { var err error ctx, cancel := global.TimeoutContext() defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("未能启动数据库事务", zap.Error(err)) return fmt.Errorf("未能启动数据库事务,%w", err) } parks, err := repository.GMRepository.ListAllParkIdsInUser(ctx, tx, uid) if err != nil { gm.l.Error("查询园区错误", zap.Error(err)) tx.Rollback(ctx) return err } for _, pid := range parks { err = repository.GMRepository.DeleteInvoices(ctx, tx, pid) err = repository.GMRepository.DeleteMeterBinding(ctx, tx, pid, []string{}) err = repository.GMRepository.DeleteMeterPoolings(ctx, tx, pid) err = repository.GMRepository.DeleteTenements(ctx, tx, pid) err = repository.GMRepository.DeleteMeters(ctx, tx, pid) err = repository.GMRepository.DeleteReports(ctx, tx, pid) err = repository.GMRepository.DeleteBuildings(ctx, tx, pid) if err != nil { gm.l.Error("删除用户下关联出错", zap.Error(err)) return err } } err = repository.GMRepository.DeleteParks(ctx, tx, parks) if err != nil { gm.l.Error("删除用户关联园区错误", zap.Error(err)) tx.Rollback(ctx) return err } err = repository.GMRepository.DeleteUsers(ctx, tx, uid) if err != nil { gm.l.Error("删除用户信息出错", zap.Error(err)) tx.Rollback(ctx) return err } return nil } func (gm _GMService) DeleteMeterPooling(pId string, mId []string) error { ctx, cancel := global.TimeoutContext() defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("开启数据库事务失败。", zap.Error(err)) return err } if err := repository.GMRepository.DeleteMeterPoolings(ctx, tx, pId, mId); err != nil { gm.l.Error("无法删除指定表记公摊关系。", zap.Error(err)) tx.Rollback(ctx) return err } err = tx.Commit(ctx) if err != nil { gm.l.Error("未能成功提交数据库事务。", zap.Error(err)) tx.Rollback(ctx) return err } return nil } func (gm _GMService) DeleteMeters(pId string, mId []string) error { ctx, cancel := global.TimeoutContext() defer cancel() tx, err := global.DB.Begin(ctx) if err != nil { gm.l.Error("开启数据库事务失败。", zap.Error(err)) return err } if err := repository.GMRepository.DeleteMeterBinding(ctx, tx, pId, []string{}, mId); err != nil { gm.l.Error("删除指定园区中的表计和商户的绑定关系", zap.Error(err)) tx.Rollback(ctx) return err } if err := repository.GMRepository.DeleteMeterPoolings(ctx, tx, pId, mId); err != nil { gm.l.Error("无法删除指定表记公摊关系。", zap.Error(err)) tx.Rollback(ctx) return err } if err := repository.GMRepository.DeleteMeters(ctx, tx, pId, mId); err != nil { gm.l.Error("删除指定园区中符合条件的表计。", zap.Error(err)) tx.Rollback(ctx) return err } err = tx.Commit(ctx) if err != nil { gm.l.Error("未能成功提交数据库事务。", zap.Error(err)) tx.Rollback(ctx) return err } return nil }