Browse Source

1月3日晚 导出,查询拥有卡券的用户列表,修改导入excel时传递参数名称

master
lijikun 6 months ago
parent
commit
4049612544
  1. 1
      api/v1/couponusers/couponUsers.go
  2. 1
      internal/cmd/cmd.go
  3. 8
      internal/controller/couponusers/couponUsers.go
  4. 138
      internal/logic/couponusers/couponUsers.go
  5. 7
      internal/service/couponusers.go

1
api/v1/couponusers/couponUsers.go

@ -15,6 +15,7 @@ type GetCouponUsersRes struct {
Jwcode int `json:"jwcode" dc:"精网号"` Jwcode int `json:"jwcode" dc:"精网号"`
DeptName string `json:"deptName" dc:"部门"` DeptName string `json:"deptName" dc:"部门"`
ShopName string `json:"shopName" dc:"门店"` ShopName string `json:"shopName" dc:"门店"`
Total int `json:"total" dc:"总数"`
} }
// DelCouponUserByJwcodeReq 删除卡券用户 // DelCouponUserByJwcodeReq 删除卡券用户

1
internal/cmd/cmd.go

@ -25,6 +25,7 @@ var (
group.POST("/insert-coupon-users-by-excel", couponusers.NewCouponUsers().InsertCouponUserByExcel) // 通过excel导入jwcode并发放卡券 group.POST("/insert-coupon-users-by-excel", couponusers.NewCouponUsers().InsertCouponUserByExcel) // 通过excel导入jwcode并发放卡券
//group.POST("/insert-coupon-user", couponusers.NewCouponUsers().InsertCouponUser) //给用户发放卡券 //group.POST("/insert-coupon-user", couponusers.NewCouponUsers().InsertCouponUser) //给用户发放卡券
group.POST("/insert-coupon-users-by-str", couponusers.NewCouponUsers().InsertCouponUserByJwcodeStr) //通过jwcodes字符串导入jwcode并发放卡券 group.POST("/insert-coupon-users-by-str", couponusers.NewCouponUsers().InsertCouponUserByJwcodeStr) //通过jwcodes字符串导入jwcode并发放卡券
group.POST("/export-coupon-users", couponusers.NewCouponUsers().ExportCouponUsers) //导出拥有卡券的用户列表
// 近期使用 // 近期使用
group.POST("/insert-users-to-redis", couponusers.NewCouponUsers().InsertJwcodesToRedisByExcel) //导入满足条件的用户jwcode到redis group.POST("/insert-users-to-redis", couponusers.NewCouponUsers().InsertJwcodesToRedisByExcel) //导入满足条件的用户jwcode到redis
group.POST("/is-eligible-user", couponusers.NewCouponUsers().IsEligibleUser) //判断用户是否满足领取条件 group.POST("/is-eligible-user", couponusers.NewCouponUsers().IsEligibleUser) //判断用户是否满足领取条件

8
internal/controller/couponusers/couponUsers.go

@ -69,7 +69,8 @@ func (c *CouponUsers) InsertCouponUserByExcel(r *ghttp.Request) {
/*解析请求*/ /*解析请求*/
// 从请求中获取文件 // 从请求中获取文件
file, _, err := r.FormFile("excelFile")
//file, _, err := r.FormFile("excelFile")
file, _, err := r.FormFile("file")
if err != nil { if err != nil {
r.Response.WriteJsonExit(dto.Error(err.Error())) r.Response.WriteJsonExit(dto.Error(err.Error()))
} }
@ -246,13 +247,14 @@ func (c *CouponUsers) AddRecord(r *ghttp.Request) {
/*近期使用*/ /*近期使用*/
// 未编写
// 导出拥有卡券的用户 // 导出拥有卡券的用户
func (c *CouponUsers) ExportCouponUsers(r *ghttp.Request) { func (c *CouponUsers) ExportCouponUsers(r *ghttp.Request) {
var req *couponusers.GetCouponUsersReq var req *couponusers.GetCouponUsersReq
// 解析请求参数
if err := r.Parse(&req); err != nil { if err := r.Parse(&req); err != nil {
r.Response.WriteJsonExit(dto.Error(err.Error())) r.Response.WriteJsonExit(dto.Error(err.Error()))
} }
//查询数据,创建excel文件,设置表头,写入数据,设置文件名,保存到缓冲区并返回,设置响应头,指定内容类型为excel文件,指定文件名为fileName,将buffer中的内容写入到响应
//查询数据,创建excel文件,设置表头,写入数据,设置文件名,保存到缓冲区并返回,设置响应头,指定内容类型为excel文件,指定文件名为fileName,将buffer中的内容写入响应
service.CouponUsers().ExportCouponUsers(r, req.CouponId, req.Jwcode, req.Name, req.PageNo, req.PageSize)
} }

138
internal/logic/couponusers/couponUsers.go

@ -3,16 +3,19 @@ package couponusers
import ( import (
"CouponBackendGo/api/v1/couponusers" "CouponBackendGo/api/v1/couponusers"
"CouponBackendGo/internal/dao" "CouponBackendGo/internal/dao"
"CouponBackendGo/internal/model/dto"
"CouponBackendGo/internal/service" "CouponBackendGo/internal/service"
"context" "context"
"database/sql" "database/sql"
"errors" "errors"
"github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gtime" "github.com/gogf/gf/v2/os/gtime"
"github.com/xuri/excelize/v2" "github.com/xuri/excelize/v2"
"mime/multipart" "mime/multipart"
"strconv" "strconv"
"strings" "strings"
"time"
) )
type sCouponUsers struct{} type sCouponUsers struct{}
@ -23,75 +26,42 @@ func init() {
// 根据优惠券id查看拥有优惠券的用户 // 根据优惠券id查看拥有优惠券的用户
func (s *sCouponUsers) GetCouponUsersByCondition(ctx context.Context, couponId, jwcode int, name string, pageNo, pageSize int) (users []couponusers.GetCouponUsersRes, err error) { func (s *sCouponUsers) GetCouponUsersByCondition(ctx context.Context, couponId, jwcode int, name string, pageNo, pageSize int) (users []couponusers.GetCouponUsersRes, err error) {
//没有条件查询时,分页
if jwcode == 0 && name == "" {
/*查询所有数据*/
//在coupon_users中查询出对应的jwcode
err = dao.CouponUsers.Ctx(ctx).Fields("jwcode").
Where("coupon_id = ", couponId).Page(pageNo, pageSize).Scan(&users)
if err != nil {
return nil, errors.New("根据卡券id搜索jwcode失败")
}
//根据jwcode查询用户信息
for i, userInfo := range users {
err = dao.MemberInfo.Ctx(ctx).Fields("jwcode", "name", "deptName", "shopName").
Where("jwcode = ?", userInfo.Jwcode).Scan(&users[i])
if err != nil {
return nil, errors.New("根据jwcode搜索用户信息失败")
}
db := dao.CouponUsers.Ctx(ctx)
//基于量表JOIN查询
db = db.As("cu").InnerJoin("member_info mi", "cu.jwcode = mi.jwcode").
Where("cu.coupon_id = ?", couponId)
//如果jwcode条件存在
if jwcode != 0 {
db = db.Where("cu.jwcode = ?", jwcode)
} }
/*查询所有数据*/
return users, err
} else { //有条件查询时,不在分页,全查后筛选
//如果name条件存在
if name != "" {
db = db.Where("mi.name like ?", "%"+name+"%")
}
/*查询所有数据*/
//在coupon_users中查询出对应的jwcode
err = dao.CouponUsers.Ctx(ctx).Fields("jwcode").
Where("coupon_id = ", couponId).Scan(&users)
//查询总数
total, err := db.Count()
if err != nil { if err != nil {
return nil, errors.New("根据卡券id搜索jwcode失败")
return nil, errors.New("查询总数失败")
} }
//根据jwcode查询用户信息
for i, userInfo := range users {
err = dao.MemberInfo.Ctx(ctx).Fields("jwcode", "name", "deptName", "shopName").
Where("jwcode = ?", userInfo.Jwcode).Scan(&users[i])
//查询数据(分页)
err = db.Fields("mi.jwcode, mi.name, mi.deptName, mi.shopName").
Page(pageNo, pageSize).Scan(&users)
if err != nil { if err != nil {
return nil, errors.New("根据jwcode搜索用户信息失败")
}
return nil, errors.New("查询数据失败")
} }
/*查询所有数据*/
//条件查询
if jwcode != 0 && name == "" {
var result []couponusers.GetCouponUsersRes
for _, user := range users {
if user.Jwcode == jwcode {
result = append(result, user)
}
}
return result, err
} else if jwcode == 0 && name != "" {
var result []couponusers.GetCouponUsersRes
for _, user := range users {
if strings.Contains(user.Name, name) {
result = append(result, user)
}
}
return result, err
} else if jwcode != 0 && name != "" {
var result []couponusers.GetCouponUsersRes
for _, user := range users {
if user.Jwcode == jwcode && strings.Contains(user.Name, name) {
result = append(result, user)
}
}
return result, err
//设置总数
for i := range users {
users[i].Total = total
} }
return users, err return users, err
} }
}
// 根据jwcode,优惠券id删除用户 // 根据jwcode,优惠券id删除用户
func (s *sCouponUsers) DeleteCouponUserByJwcode(ctx context.Context, couponId, jwcode int) (result sql.Result, err error) { func (s *sCouponUsers) DeleteCouponUserByJwcode(ctx context.Context, couponId, jwcode int) (result sql.Result, err error) {
@ -108,7 +78,7 @@ func (s *sCouponUsers) DeleteCouponUserByJwcode(ctx context.Context, couponId, j
return result, err return result, err
} }
// 通过excel导入精网号
// 通过excel导入精网号, 解析并发放卡券
func (s *sCouponUsers) InsertJwcodeByExcel(ctx context.Context, file multipart.File, couponId int) (num int, err error) { func (s *sCouponUsers) InsertJwcodeByExcel(ctx context.Context, file multipart.File, couponId int) (num int, err error) {
// func (s *sCouponUsers) InsertJwcodeByExcel(file multipart.File) (jwcodes []int, err error) { // func (s *sCouponUsers) InsertJwcodeByExcel(file multipart.File) (jwcodes []int, err error) {
@ -384,9 +354,57 @@ func (s *sCouponUsers) IssueCouponToUser(ctx context.Context, jwcode, couponId i
} }
/*未编写*/
// 导出拥有卡券的用户列表 // 导出拥有卡券的用户列表
func (s *sCouponUsers) ExportCouponUsers() {
func (s *sCouponUsers) ExportCouponUsers(r *ghttp.Request, couponId, jwcode int, name string, pageNo, pageSize int) {
//调用查询
users, err := s.GetCouponUsersByCondition(r.Context(), couponId, jwcode, name, pageNo, pageSize)
if err != nil {
r.Response.WriteJsonExit(dto.Error("查询失败:" + err.Error()))
return
}
if len(users) == 0 {
r.Response.WriteJsonExit(dto.Error("查询结果为空"))
return
}
//创建 Excel文件
excelFile := excelize.NewFile() //默认会创建一个Sheet1
sheetName := "Sheet1"
//设置表头
headers := []string{"序号", "精网号", "姓名", "部门", "门店"}
for i, header := range headers {
col := string('A' + i) //将索引转换为 Excel列名
excelFile.SetCellValue(sheetName, col+"1", header)
}
/*写入数据*/
rowIndex := 2 //从第二行开始写入数据
for _, user := range users {
excelFile.SetCellValue(sheetName, "A"+strconv.Itoa(rowIndex), rowIndex-1) //序号
excelFile.SetCellValue(sheetName, "B"+strconv.Itoa(rowIndex), user.Jwcode) //精网号
excelFile.SetCellValue(sheetName, "C"+strconv.Itoa(rowIndex), user.Name) //姓名
excelFile.SetCellValue(sheetName, "D"+strconv.Itoa(rowIndex), user.DeptName) //部门
excelFile.SetCellValue(sheetName, "E"+strconv.Itoa(rowIndex), user.ShopName) //门店
rowIndex++
}
/*写入数据*/
//设置文件名
fileName := "Users_" + time.Now().Format("20060102150405") + ".xlsx"
//保存到缓冲区并返回
buffer, err := excelFile.WriteToBuffer()
if err != nil {
r.Response.WriteJsonExit(dto.Error("生成Excel文件失败:" + err.Error()))
return
}
// 设置响应头,指定内容类型为Excel文件
r.Response.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
// 设置响应头,指定文件名为fileName
r.Response.Header().Set("Content-Disposition", "attachment; filename="+fileName)
// 将buffer中的内容写入响应
r.Response.Write(buffer.Bytes())
} }

7
internal/service/couponusers.go

@ -10,6 +10,8 @@ import (
"context" "context"
"database/sql" "database/sql"
"mime/multipart" "mime/multipart"
"github.com/gogf/gf/v2/net/ghttp"
) )
type ( type (
@ -18,7 +20,7 @@ type (
GetCouponUsersByCondition(ctx context.Context, couponId int, jwcode int, name string, pageNo int, pageSize int) (users []couponusers.GetCouponUsersRes, err error) GetCouponUsersByCondition(ctx context.Context, couponId int, jwcode int, name string, pageNo int, pageSize int) (users []couponusers.GetCouponUsersRes, err error)
// 根据jwcode,优惠券id删除用户 // 根据jwcode,优惠券id删除用户
DeleteCouponUserByJwcode(ctx context.Context, couponId int, jwcode int) (result sql.Result, err error) DeleteCouponUserByJwcode(ctx context.Context, couponId int, jwcode int) (result sql.Result, err error)
// 通过excel导入精网号
// 通过excel导入精网号, 解析并发放卡券
InsertJwcodeByExcel(ctx context.Context, file multipart.File, couponId int) (num int, err error) InsertJwcodeByExcel(ctx context.Context, file multipart.File, couponId int) (num int, err error)
// 传来jwcodes字符串,解析并发放卡券 // 传来jwcodes字符串,解析并发放卡券
InsertCouponUsersByJwcodeStr(ctx context.Context, jwcodeStr string, couponId int) (num int, err error) InsertCouponUsersByJwcodeStr(ctx context.Context, jwcodeStr string, couponId int) (num int, err error)
@ -30,9 +32,8 @@ type (
IsEligibleUser(ctx context.Context, jwcode int, couponIds []int) (img string, err error) IsEligibleUser(ctx context.Context, jwcode int, couponIds []int) (img string, err error)
// 给单个用户发放卡券 // 给单个用户发放卡券
IssueCouponToUser(ctx context.Context, jwcode int, couponId int) (err error) IssueCouponToUser(ctx context.Context, jwcode int, couponId int) (err error)
/*未编写*/
// 导出拥有卡券的用户列表 // 导出拥有卡券的用户列表
ExportCouponUsers()
ExportCouponUsers(r *ghttp.Request, couponId int, jwcode int, name string, pageNo int, pageSize int)
// 添加用户选择武器记录 // 添加用户选择武器记录
AddRecord(ctx context.Context, jwcode int, id int, name string) (err error) AddRecord(ctx context.Context, jwcode int, id int, name string) (err error)
} }

Loading…
Cancel
Save