You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

169 lines
4.4 KiB

  1. package couponusers
  2. import (
  3. "CouponBackendGo/api/v1/couponusers"
  4. "CouponBackendGo/internal/dao"
  5. "CouponBackendGo/internal/service"
  6. "context"
  7. "database/sql"
  8. "encoding/json"
  9. "errors"
  10. "fmt"
  11. "github.com/gogf/gf/v2/frame/g"
  12. "github.com/xuri/excelize/v2"
  13. "mime/multipart"
  14. "strconv"
  15. "strings"
  16. )
  17. type sCouponUsers struct{}
  18. func init() {
  19. service.RegisterCouponUsers(&sCouponUsers{})
  20. }
  21. // 根据优惠券id查看拥有优惠券的用户
  22. func (s *sCouponUsers) GetCouponUsersByCondition(ctx context.Context, couponId, jwcode int, name string) (users []couponusers.GetCouponUsersRes, err error) {
  23. //从redis中获取数据但不返回
  24. value, _ := g.Redis().Get(ctx, fmt.Sprintf("%d CouponUsers", couponId))
  25. if value.String() != "" {
  26. err = json.Unmarshal(value.Bytes(), &users)
  27. if err != nil {
  28. return nil, errors.New("redis中数据解析失败")
  29. }
  30. } else {
  31. /*查询所有数据*/
  32. //在coupon_users中查询出对应的jwcode
  33. err = dao.CouponUsers.Ctx(ctx).Fields("jwcode").
  34. Where("coupon_id = ", couponId).Scan(&users)
  35. if err != nil {
  36. return nil, errors.New("根据卡券id搜索jwcode失败")
  37. }
  38. //根据jwcode查询用户信息
  39. for i, userInfo := range users {
  40. err = dao.MemberInfo.Ctx(ctx).Fields("jwcode", "name", "deptName", "shopName").
  41. Where("jwcode = ?", userInfo.Jwcode).Scan(&users[i])
  42. if err != nil {
  43. return nil, errors.New("根据jwcode搜索用户信息失败")
  44. }
  45. }
  46. /*查询所有数据*/
  47. //将数据存入redis
  48. UsersMarshal, _ := json.Marshal(users)
  49. _, err = g.Redis().Set(ctx, fmt.Sprintf("%d CouponUsers", couponId), UsersMarshal)
  50. if err != nil {
  51. return nil, errors.New("将数据存入redis失败")
  52. }
  53. }
  54. if jwcode != 0 && name == "" {
  55. var result []couponusers.GetCouponUsersRes
  56. for _, user := range users {
  57. if user.Jwcode == jwcode {
  58. result = append(result, user)
  59. }
  60. }
  61. return result, err
  62. } else if jwcode == 0 && name != "" {
  63. var result []couponusers.GetCouponUsersRes
  64. for _, user := range users {
  65. if strings.Contains(user.Name, name) {
  66. result = append(result, user)
  67. }
  68. }
  69. return result, err
  70. } else if jwcode != 0 && name != "" {
  71. var result []couponusers.GetCouponUsersRes
  72. for _, user := range users {
  73. if user.Jwcode == jwcode && strings.Contains(user.Name, name) {
  74. result = append(result, user)
  75. }
  76. }
  77. return result, err
  78. }
  79. return users, err
  80. }
  81. // 根据jwcode,优惠券id删除用户
  82. func (s *sCouponUsers) DeleteCouponUserByJwcode(ctx context.Context, couponId, jwcode int) (result sql.Result, err error) {
  83. if jwcode == 0 {
  84. return nil, errors.New("jwcode不能为空")
  85. }
  86. if couponId == 0 {
  87. return nil, errors.New("couponId不能为空")
  88. }
  89. result, err = dao.CouponUsers.Ctx(ctx).Where("coupon_id = ?", couponId).Where("jwcode = ?", jwcode).Delete()
  90. if err != nil {
  91. return nil, errors.New("删除用户失败")
  92. }
  93. return result, err
  94. }
  95. // 通过excel导入精网号
  96. func (s *sCouponUsers) InsertJwcodeByExcel(file multipart.File) (jwcodes []int, err error) {
  97. //打开文件并返回一个excelize.File对象,用于读取和操作Excel文件的内容
  98. f, err := excelize.OpenReader(file)
  99. if err != nil {
  100. return nil, errors.New("打开文件失败")
  101. }
  102. // 关闭文件
  103. defer func(f *excelize.File) {
  104. err := f.Close()
  105. if err != nil {
  106. // 处理关闭文件时的错误
  107. return
  108. }
  109. }(f)
  110. //读取所有工作表名称
  111. GetSheetMap := f.GetSheetMap()
  112. fmt.Println(GetSheetMap)
  113. if len(GetSheetMap) == 0 {
  114. return nil, errors.New("没有工作表")
  115. }
  116. // 读取第一个工作表
  117. sheetName := GetSheetMap[1]
  118. //rows, err := f.GetRows(f.GetSheetName(1))
  119. rows, err := f.GetRows(sheetName)
  120. if err != nil {
  121. return nil, err
  122. }
  123. // 将每行的第一列转换为int,并添加到切片中
  124. for i, row := range rows {
  125. //跳过第一行
  126. if i == 0 {
  127. continue
  128. }
  129. // 假设jwcode在每行的第一列
  130. /*参数校验*/
  131. //参数校验,检查每行是否有足够数据
  132. if len(row) == 0 {
  133. continue // 跳过空行
  134. }
  135. //参数校验,检查jwcode是否为非空字符串
  136. jwcodeStr := row[0]
  137. if jwcodeStr == "" {
  138. continue // 跳过空行
  139. }
  140. //将字符串转换为整数
  141. jwcode, err := strconv.Atoi(jwcodeStr)
  142. if err != nil {
  143. return nil, errors.New("参数转换失败")
  144. }
  145. fmt.Println(jwcode)
  146. jwcodes = append(jwcodes, jwcode)
  147. /*参数校验*/
  148. }
  149. return
  150. }
  151. // 根据精网号发放用户优惠券
  152. func (s *sCouponUsers) InsertCouponUserByJwcode(ctx context.Context) {
  153. return
  154. }