tm_accountType.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package typeManage
  2. import (
  3. "errors"
  4. "fmt"
  5. "gorm.io/gorm"
  6. "log-server/global"
  7. "log-server/model/common/request"
  8. "log-server/model/typeManage"
  9. )
  10. type AccountTypeService struct {
  11. }
  12. //添加账号类型
  13. func (a *AccountTypeService) CreateAccountType(accountType typeManage.AccountType) (err error) {
  14. //首先检查数据库中是否有同名账号类型
  15. err = global.GVA_DB.Table("account_type").Where("type_name = ?", accountType.TypeName).First(&typeManage.AccountType{}).Error
  16. if !errors.Is(err, gorm.ErrRecordNotFound) {
  17. return errors.New("已存在相同账号类型,请勿重复添加")
  18. }
  19. return global.GVA_DB.Table("account_type").Omit("create_time", "update_time").Create(&accountType).Error
  20. }
  21. //单个删除账号类型
  22. func (a *AccountTypeService) DeleteAccountType(accountType typeManage.AccountType) (err error) {
  23. //首先检查数据库中是否有这条记录
  24. //为了后端数据的安全,声明一个实体用来存储扫描到的记录
  25. //删除实体
  26. var entity typeManage.AccountType
  27. err = global.GVA_DB.Table("account_type").Where("id = ?", accountType.Id).First(&entity).Error
  28. if errors.Is(err, gorm.ErrRecordNotFound) {
  29. return err
  30. }
  31. return global.GVA_DB.Table("account_type").Delete(&entity).Error
  32. }
  33. //批量删除账号类型
  34. func (a *AccountTypeService) DeleteAccountTypesByIds(ids request.IdsReq) (err error) {
  35. err = global.GVA_DB.Table("account_type").Delete(&[]typeManage.AccountType{}, "id in ?", ids.Ids).Error
  36. return err
  37. }
  38. //更改账号类型
  39. func (a *AccountTypeService) UpdateAccountType(accountType typeManage.AccountType) (err error) {
  40. //做业务逻辑判断
  41. //比如不能更改至同名账号类型,如果存在同名账号类型就直接返回错误
  42. //排错之后再更新
  43. err = global.GVA_DB.Table("account_type").Where("id != ? and type_name = ?", accountType.Id, accountType.TypeName).First(&typeManage.AccountType{}).Error
  44. if !errors.Is(err, gorm.ErrRecordNotFound) {
  45. return errors.New("已存在同名账号类型,无法更新")
  46. }
  47. return global.GVA_DB.Table("account_type").Updates(&accountType).Error
  48. }
  49. //通过id获取单条数据
  50. func (a *AccountTypeService) GetAccountTypeById(id int) (accountType typeManage.AccountType, err error){
  51. err = global.GVA_DB.Table("account_type").Where("id = ?", id).First(&accountType).Error
  52. return
  53. }
  54. //获取所有账号类型列表
  55. func (a *AccountTypeService) AccountTypeList(accountType typeManage.AccountType, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error){
  56. //accountType是传输过来的查询条件
  57. //info是传输过来的分页信息
  58. //order是传输过来的排序字段
  59. //desc是传输过来的升降序信息
  60. //获取limit和offset
  61. limit := info.PageSize
  62. offset := (info.Page - 1) * info.PageSize
  63. db := global.GVA_DB.Table("account_type").Model(&typeManage.AccountType{})
  64. var accountTypeList []typeManage.AccountType
  65. //先条件过滤
  66. if accountType.TypeName != "" {
  67. //条件过滤记录数
  68. db = db.Where("type_name like ?", "%" + accountType.TypeName + "%")
  69. }
  70. //查找数量并且校验是否出错,注意,即使count=0,Count也不会出错,出错的地方可能在于我条件筛选没有,然后我再count,然后出错?
  71. //非也非也,我即使条件查询没有,从逻辑上来说不该报错,而且实际业务表现上也没有报错,所以可能是为了防止其他错误出现稳一手
  72. //只要进行了条件筛选,就可以直接去查询count了,后续任何操作比如分页排序都无法也不能改变count,所以在条件查询之后、在分页和排序之前去操作count
  73. err = db.Count(&total).Error
  74. if err != nil{
  75. //如果出错直接返回
  76. return accountTypeList, total, err
  77. } else {
  78. //先分页再排序
  79. db = db.Limit(limit).Offset(offset)
  80. if order != ""{
  81. //传入排序字段,进行排序
  82. //定义orderStr存储完整的排序字段
  83. var orderStr string
  84. //为了避免sql注入,自己创建数组匹配
  85. orderMap := make(map[string]bool, 3)
  86. orderMap["type_name"] = true
  87. orderMap["create_time"] = true
  88. orderMap["update_time"] = true
  89. if orderMap[order] {
  90. //是好人,可以排序
  91. if desc {
  92. //传入desc,是降序
  93. orderStr = order + " desc"
  94. } else {
  95. //没有传入desc,是默认升序
  96. orderStr = order
  97. }
  98. } else {
  99. //传入非法字段,不能排序
  100. err = fmt.Errorf("传入非法字段 %v", order)
  101. return accountTypeList, total, err
  102. }
  103. //排序
  104. err = db.Order(orderStr).Find(&accountTypeList).Error
  105. } else {
  106. //没有传入排序字段,默认按照类型名称降序排序
  107. err = db.Order("type_name desc").Find(&accountTypeList).Error
  108. }
  109. }
  110. //是因为只有切片能排序,model没办法排序;还是说为了将数组返回至前端才find扫描至切片呢?
  111. return accountTypeList, total, err
  112. }