From be82112908b9d18ce5bcbd0cb7ec563bca3f6a98 Mon Sep 17 00:00:00 2001 From: chenlin Date: Wed, 31 Jan 2024 18:00:16 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=96=B0=E5=A2=9EV1.2.0=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=B7=B2=E5=9F=BA=E6=9C=AC=E5=AE=8C?= =?UTF-8?q?=E6=88=90=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apis/cooperativemanage/cooperative.go | 243 +++- app/admin/apis/inventorymanage/Inventory.go | 2 +- app/admin/apis/mallmanage/mall_goods_order.go | 21 +- app/admin/apis/usermanage/user.go | 60 +- app/admin/models/commodity.go | 5 +- app/admin/models/cooperative_business.go | 158 ++- app/admin/models/dispose_config.go | 122 +- app/admin/models/erp_order.go | 22 +- app/admin/models/game_card.go | 14 +- app/admin/models/mall.go | 173 ++- app/admin/models/share_card.go | 2 +- app/admin/models/user.go | 849 ++++++++++++- app/admin/models/user_vm.go | 51 +- app/admin/router/cooperativemanage.go | 3 + app/admin/router/mallmanage.go | 2 +- app/admin/router/usermanage.go | 1 + docs/docs.go | 1058 ++++++++++++++++- docs/swagger.json | 1058 ++++++++++++++++- docs/swagger.yaml | 740 +++++++++++- go.mod | 1 - go.sum | 3 - tools/utils.go | 16 + 22 files changed, 4277 insertions(+), 327 deletions(-) diff --git a/app/admin/apis/cooperativemanage/cooperative.go b/app/admin/apis/cooperativemanage/cooperative.go index dd0f914..00e4ec5 100644 --- a/app/admin/apis/cooperativemanage/cooperative.go +++ b/app/admin/apis/cooperativemanage/cooperative.go @@ -3,16 +3,25 @@ package cooperativemanage import ( "errors" "fmt" - "github.com/codinl/go-logger" "github.com/gin-gonic/gin" "go-admin/app/admin/models" orm "go-admin/common/global" + "go-admin/logger" "go-admin/pkg/jwtauth" + "go-admin/tools" "go-admin/tools/app" "net/http" "time" ) +// CooperativeBusinessList 查看供应商列表 +// @Summary 查看供应商列表 +// @Tags 合作商, v1.2.0 +// @Produce json +// @Accept json +// @Param request body models.CooperativeBusinessListReq true "查看供应商列表模型" +// @Success 200 {object} models.CooperativeBusinessListResp +// @Router /api/v1/cooperative/list [post] func CooperativeBusinessList(c *gin.Context) { req := &models.CooperativeBusinessListReq{} if c.ShouldBindJSON(req) != nil { @@ -28,12 +37,13 @@ func CooperativeBusinessList(c *gin.Context) { return } - ret := map[string]interface{}{ - "count": count, - "list": list, - "pageIndex": req.Page, - "total_page": req.PageSize, + ret := models.CooperativeBusinessListResp{ + Count: count, + List: list, + PageIndex: req.Page, + TotalPage: req.PageSize, } + app.OK(c, ret, "") return } @@ -46,10 +56,18 @@ type CooperativeMemberDeductReq struct { // cooperative_member_deduct } +// CooperativeAdd 新增供应商 +// @Summary 新增供应商 +// @Tags 合作商, v1.2.0 +// @Produce json +// @Accept json +// @Param request body models.CooperativeBusiness true "新增供应商模型" +// @Success 200 {object} app.Response +// @Router /api/v1/cooperative/add [post] func CooperativeAdd(c *gin.Context) { req := &models.CooperativeBusiness{} if err := c.ShouldBindJSON(req); err != nil { - logger.Error("para err", err) + logger.Errorf("para err", err) app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") return } @@ -72,7 +90,7 @@ func CooperativeAdd(c *gin.Context) { } err = orm.Eloquent.Create(deduct).Error if err != nil { - logger.Error("create cooperative member deduct err:", err) + logger.Errorf("create cooperative member deduct err:", err) app.Error(c, http.StatusInternalServerError, err, "添加失败") return } @@ -81,6 +99,34 @@ func CooperativeAdd(c *gin.Context) { return } +// CooperativeEdit 编辑供应商 +// @Summary 编辑供应商 +// @Tags 合作商, v1.2.0 +// @Produce json +// @Accept json +// @Param request body models.CooperativeBusiness true "编辑供应商模型" +// @Success 200 {object} app.Response +// @Router /api/v1/cooperative/edit [post] +func CooperativeEdit(c *gin.Context) { + req := &models.CooperativeBusiness{} + if err := c.ShouldBindJSON(req); err != nil { + logger.Errorf("para err", err) + app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + + req.AddTime = time.Now() + err := orm.Eloquent.Model(&models.CooperativeBusiness{}).Where("id = ?", req.ID).Updates(req).Error + if err != nil { + logger.Errorf("edit cooperative err:", err) + app.Error(c, http.StatusInternalServerError, err, "更新失败") + return + } + + app.OK(c, nil, "添加成功") + return +} + func CooperativeMemberPromotionList(c *gin.Context) { req := &models.CooperativeMemberPromotionReq{} if c.ShouldBindJSON(req) != nil { @@ -177,6 +223,14 @@ func CooperativeMemberPromotionStoreDayList(c *gin.Context) { return } +// CooperativeMemberPromotionStatisticList 租卡会员统计 +// @Summary 租卡会员统计 +// @Tags 会员管理, V1.2.0 +// @Produce json +// @Accept json +// @Param request body models.CooperativeMemberPromotionStatisticReq true "租卡会员统计模型" +// @Success 200 {object} models.CooperativeMemberPromotionStatisticListResp +// @Router /api/v1/cooperative/member_promotion_statistic/list [post] func CooperativeMemberPromotionStatisticList(c *gin.Context) { req := &models.CooperativeMemberPromotionStatisticReq{} if c.ShouldBindJSON(req) != nil { @@ -192,11 +246,12 @@ func CooperativeMemberPromotionStatisticList(c *gin.Context) { return } - ret := map[string]interface{}{ - "count": count, - "list": list, - "pageIndex": req.Page, + ret := models.CooperativeMemberPromotionStatisticListResp{ + Count: count, + PageIndex: req.Page, + List: list, } + app.OK(c, ret, "") return } @@ -215,12 +270,12 @@ func CooperativeMemberPromotionSettleInfo(c *gin.Context) { var memberPromotion models.CooperativeMemberPromotion err := orm.Eloquent.Table("").Where("id=?", req.CooperativeMemberPromotionId).Find(&memberPromotion).Error if err != nil { - logger.Error("cooperative member promotion err:", err) + logger.Errorf("cooperative member promotion err:", err) app.Error(c, http.StatusInternalServerError, err, "结算错误") return } if memberPromotion.CooperativeBusinessId != req.CooperativeBusinessId { - logger.Error("cooperative business id err:") + logger.Errorf("cooperative business id err:") app.Error(c, http.StatusInternalServerError, errors.New("cooperative business id err"), "结算错误") return } @@ -229,13 +284,13 @@ func CooperativeMemberPromotionSettleInfo(c *gin.Context) { cooperative.SetMemberDeductConfig() if memberPromotion.State != models.PromotionStateUnSettlement { - logger.Error("cooperative member promotion state err:") + logger.Errorf("cooperative member promotion state err:") app.Error(c, http.StatusInternalServerError, err, "结算错误") return } if cooperative.CooperativeMemberDeduct == nil { - logger.Error("cooperative member deduct nil:") + logger.Errorf("cooperative member deduct nil:") app.Error(c, http.StatusInternalServerError, err, "结算错误") return } @@ -273,18 +328,18 @@ func CooperativeMemberPromotionSettleConfirm(c *gin.Context) { var memberPromotion models.CooperativeMemberPromotion err := orm.Eloquent.Table("").Where("id=?", req.CooperativeMemberPromotionId).Find(&memberPromotion).Error if err != nil { - logger.Error("cooperative member promotion err:", err) + logger.Errorf("cooperative member promotion err:", err) app.Error(c, http.StatusInternalServerError, err, "结算错误") return } if memberPromotion.CooperativeBusinessId != req.CooperativeBusinessId { - logger.Error("cooperative business id err:") + logger.Errorf("cooperative business id err:") app.Error(c, http.StatusInternalServerError, errors.New("cooperative business id err"), "结算错误") return } // TODO //if memberPromotion.Date != models.MonthDateAdd(-1) { - // logger.Error("settle date err:") + // logger.Errorf("settle date err:") // app.Error(c, http.StatusInternalServerError, errors.New("settle date err"), "结算错误") // return //} @@ -294,13 +349,13 @@ func CooperativeMemberPromotionSettleConfirm(c *gin.Context) { cooperative.SetMemberDeductConfig() if memberPromotion.State != models.PromotionStateUnSettlement { - logger.Error("cooperative member promotion state err:") + logger.Errorf("cooperative member promotion state err:") app.Error(c, http.StatusInternalServerError, err, "结算错误") return } if cooperative.CooperativeMemberDeduct == nil { - logger.Error("cooperative member deduct nil:") + logger.Errorf("cooperative member deduct nil:") app.Error(c, http.StatusInternalServerError, err, "结算错误") return } @@ -345,7 +400,7 @@ func CooperativeMemberPromotionSettleConfirm(c *gin.Context) { err = begin.Create(deductSettle).Error if err != nil { begin.Rollback() - logger.Error("create cooperative deduct settle err:", err) + logger.Errorf("create cooperative deduct settle err:", err) app.Error(c, http.StatusInternalServerError, err, "结算错误") return } @@ -355,7 +410,7 @@ func CooperativeMemberPromotionSettleConfirm(c *gin.Context) { }).Error if err != nil { begin.Rollback() - logger.Error("update cooperative_member_promotion state err:", err) + logger.Errorf("update cooperative_member_promotion state err:", err) app.Error(c, http.StatusInternalServerError, errors.New("update cooperative_member_promotion state err"), "结算错误") return @@ -363,7 +418,7 @@ func CooperativeMemberPromotionSettleConfirm(c *gin.Context) { err = begin.Commit().Error if err != nil { begin.Rollback() - logger.Error("commit err:", err) + logger.Errorf("commit err:", err) app.Error(c, http.StatusInternalServerError, err, "结算错误") return } @@ -409,17 +464,17 @@ func CooperativeMemberPromotionSettleRemit(c *gin.Context) { var deductSettle models.CooperativeDeductSettle err := orm.Eloquent.Table("").Where("id=?", req.CooperativeDeductSettleId).Find(&deductSettle).Error if err != nil { - logger.Error("cooperative member promotion err:", err) + logger.Errorf("cooperative member promotion err:", err) app.Error(c, http.StatusInternalServerError, err, "结算错误") return } if deductSettle.CooperativeBusinessId != req.CooperativeBusinessId { - logger.Error("cooperative business id err:") + logger.Errorf("cooperative business id err:") app.Error(c, http.StatusInternalServerError, errors.New("cooperative business id err"), "操作失败") return } if deductSettle.State != models.PromotionStateFinancePay { - logger.Error("deduct settle state err:") + logger.Errorf("deduct settle state err:") app.Error(c, http.StatusInternalServerError, errors.New("deduct settle state err"), "操作失败") return } @@ -431,7 +486,7 @@ func CooperativeMemberPromotionSettleRemit(c *gin.Context) { }).Error if err != nil { begin.Rollback() - logger.Error("update cooperative_member_promotion state err:", err) + logger.Errorf("update cooperative_member_promotion state err:", err) app.Error(c, http.StatusInternalServerError, errors.New("update cooperative_member_promotion state err"), "操作失败") return } @@ -440,14 +495,14 @@ func CooperativeMemberPromotionSettleRemit(c *gin.Context) { }).Error if err != nil { begin.Rollback() - logger.Error("update cooperative_member_promotion state err:", err) + logger.Errorf("update cooperative_member_promotion state err:", err) app.Error(c, http.StatusInternalServerError, errors.New("update cooperative_member_promotion state err"), "操作失败") return } err = begin.Commit().Error if err != nil { begin.Rollback() - logger.Error("commit err:", err) + logger.Errorf("commit err:", err) app.Error(c, http.StatusInternalServerError, err, "结算错误") return } @@ -531,7 +586,7 @@ func UpdateCooperativeMemberStoreDeduct(c *gin.Context) { var store models.Store err := orm.Eloquent.Table("store").Where("id=?", memberDeduct.StoreId).Find(&store).Error if err != nil { - logger.Error("store err:", store) + logger.Errorf("store err:", store) app.Error(c, http.StatusInternalServerError, err, "修改失败") return } @@ -539,7 +594,7 @@ func UpdateCooperativeMemberStoreDeduct(c *gin.Context) { } err := orm.Eloquent.Save(memberDeduct).Error if err != nil { - logger.Error("update cooperative member deduct err:", err) + logger.Errorf("update cooperative member deduct err:", err) app.Error(c, http.StatusInternalServerError, err, "修改失败") return } @@ -573,10 +628,18 @@ func CooperativeOrderList(c *gin.Context) { app.OK(c, ret, "") } +// AssistantInviteMemberReportList 店员绩效 +// @Summary 店员绩效 +// @Tags 门店管理, v1.2.0 +// @Produce json +// @Accept json +// @Param request body models.AssistantInviteMemberReportReq true "店员绩效模型" +// @Success 200 {object} models.AssistantInviteMemberReportListResp +// @Router /api/v1/cooperative/member_promotion/assistant_report [post] func AssistantInviteMemberReportList(c *gin.Context) { req := models.AssistantInviteMemberReportReq{} if c.ShouldBindJSON(&req) != nil { - logger.Error("parameter err") + logger.Errorf("parameter err") app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") return } @@ -584,13 +647,13 @@ func AssistantInviteMemberReportList(c *gin.Context) { data, _ := c.Get(jwtauth.JwtPayloadKey) sysUid, ok := data.(jwtauth.MapClaims)["identity"] if !ok { - logger.Error("sys uid err") + logger.Errorf("sys uid err") app.Error(c, http.StatusInternalServerError, errors.New("sys uid err"), "查询失败") return } sysUser, err := models.GetSysUser(sysUid) if err != nil { - logger.Error("sys user err:", err) + logger.Errorf("sys user err:", err) app.Error(c, http.StatusInternalServerError, err, "查询失败") return } @@ -604,11 +667,12 @@ func AssistantInviteMemberReportList(c *gin.Context) { return } - ret := map[string]interface{}{ - "list": list, - "cur_page": req.Page, - "count": count, + ret := models.AssistantInviteMemberReportListResp{ + List: list, + CurPage: req.Page, + Count: count, } + app.OK(c, ret, "") return } @@ -649,7 +713,7 @@ func CooperativeStoreList(c *gin.Context) { func CooperativeGameCardStockList(c *gin.Context) { req := models.CooperativeGameCardStockReq{} if c.ShouldBindJSON(&req) != nil { - logger.Error("parameter err") + logger.Errorf("parameter err") app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") return } @@ -657,20 +721,20 @@ func CooperativeGameCardStockList(c *gin.Context) { //data, _ := c.Get(jwtauth.JwtPayloadKey) //sysUid, ok := data.(jwtauth.MapClaims)["identity"] //if !ok { - // logger.Error("sys uid err") + // logger.Errorf("sys uid err") // app.Error(c, http.StatusInternalServerError, errors.New("sys uid err"), "查询失败") // return //} //sysUser, err := models.GetSysUser(sysUid) //if err != nil { - // logger.Error("sys user err:", err) + // logger.Errorf("sys user err:", err) // app.Error(c, http.StatusInternalServerError, err, "查询失败") // return //} ////req.CooperativeBusinessId = sysUser.CooperativeBusinessId businessId, err := models.GetCooperativeBusinessId(c) if err != nil { - logger.Error("get cooperative business id err:", err) + logger.Errorf("get cooperative business id err:", err) app.Error(c, http.StatusInternalServerError, err, "查询失败") return } @@ -695,7 +759,7 @@ func CooperativeGameCardGoodsList(c *gin.Context) { } businessId, err := models.GetCooperativeBusinessId(c) if err != nil { - logger.Error("get cooperative business id err:", err) + logger.Errorf("get cooperative business id err:", err) app.Error(c, http.StatusInternalServerError, err, "查询失败") return } @@ -727,7 +791,7 @@ func CooperativeCannibalizeTaskList(c *gin.Context) { req.CooperativeBusinessId = businessId resp, err := req.List() if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) app.Error(c, http.StatusInternalServerError, err, "任务列表错误") return } @@ -754,7 +818,7 @@ func CooperativeStockExport(c *gin.Context) { var cooperativeBusiness models.CooperativeBusiness err = orm.Eloquent.Table("cooperative_business").Where("id=?", businessId).Find(&cooperativeBusiness).Error if err != nil { - logger.Error("cooperative business err:", err) + logger.Errorf("cooperative business err:", err) app.Error(c, http.StatusInternalServerError, err, "导出失败") return } @@ -762,7 +826,7 @@ func CooperativeStockExport(c *gin.Context) { if req.StoreId == 0 { ids, err := models.GetStoreIdsByCooperativeBusinessId(businessId) if err != nil { - logger.Error("store id cooperative business err:", err) + logger.Errorf("store id cooperative business err:", err) app.Error(c, http.StatusInternalServerError, err, "导出失败") return } @@ -796,7 +860,7 @@ func CooperativeMemberPromotionExport(c *gin.Context) { //var cooperativeBusiness models.CooperativeBusiness //err = orm.Eloquent.Table("cooperative_business").Where("id=?", businessId).Find(&cooperativeBusiness).Error //if err != nil { - // logger.Error("cooperative business err:", err) + // logger.Errorf("cooperative business err:", err) // app.Error(c, http.StatusInternalServerError, err, "导出失败") // return //} @@ -804,7 +868,7 @@ func CooperativeMemberPromotionExport(c *gin.Context) { //if req.StoreId == 0 { // ids, err := models.GetStoreIdsByCooperativeBusinessId(businessId) // if err != nil { - // logger.Error("store id cooperative business err:", err) + // logger.Errorf("store id cooperative business err:", err) // app.Error(c, http.StatusInternalServerError, err, "导出失败") // return // } @@ -813,7 +877,7 @@ func CooperativeMemberPromotionExport(c *gin.Context) { memberPromotion := req.Export() if memberPromotion == "" { - logger.Error("member promotion url nil:") + logger.Errorf("member promotion url nil:") app.Error(c, http.StatusInternalServerError, errors.New("member promotion url nil"), "导出失败") return } @@ -823,3 +887,82 @@ func CooperativeMemberPromotionExport(c *gin.Context) { } app.OK(c, ret, "数据导出成功") } + +// CooperativeSetPayInfo 设置支付信息 +// @Summary 设置支付信息 +// @Tags 合作商, v1.2.0 +// @Produce json +// @Accept json +// @Param request body models.CooperativeSetPayInfoReq true "设置支付信息模型" +// @Success 200 {object} app.Response +// @Router /api/v1/cooperative/set_pay_info [post] +func CooperativeSetPayInfo(c *gin.Context) { + var req = new(models.CooperativeSetPayInfoReq) + if err := c.ShouldBindJSON(&req); err != nil { + logger.Errorf("ShouldBindJSON err:", logger.Field("err", err)) + app.Error(c, http.StatusBadRequest, err, "参数错误:"+err.Error()) + return + } + + err := tools.Validate(req) //必填参数校验 + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + + sysUser, err := models.GetSysUserByCtx(c) + if err != nil { + logger.Error("sys user err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, "操作失败:"+err.Error()) + return + } + + if req.CooperativeBusinessId == 0 { // 如果入参为空,则默认使用当前用户所属的合作商id + if sysUser.CooperativeBusinessId == 0 { + logger.Error("sysUser.CooperativeBusinessId is 0") + app.Error(c, http.StatusInternalServerError, errors.New("合作商id为空"), "保存失败:合作商id为空") + return + } + req.CooperativeBusinessId = sysUser.CooperativeBusinessId + } + + err = models.SetPayInfo(req) + if err != nil { + logger.Error("CreateErpOrder err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, err.Error()) + return + } + + app.OK(c, nil, "") +} + +// CooperativeGetPayInfo 获取支付信息 +// @Summary 获取支付信息 +// @Tags 合作商, v1.2.0 +// @Produce json +// @Accept json +// @Success 200 {object} models.CooperativePayInfo +// @Router /api/v1/cooperative/get_pay_info [post] +func CooperativeGetPayInfo(c *gin.Context) { + //var req = new(models.CooperativeGetPayInfoReq) + //if err := c.ShouldBindJSON(&req); err != nil { + // logger.Errorf("ShouldBindJSON err:", logger.Field("err", err)) + // app.Error(c, http.StatusBadRequest, err, "参数错误:"+err.Error()) + // return + //} + // + //err := tools.Validate(req) //必填参数校验 + //if err != nil { + // app.Error(c, http.StatusBadRequest, err, err.Error()) + // return + //} + + payInfo, err := models.GetPayInfo() + if err != nil { + logger.Error("CreateErpOrder err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, err.Error()) + return + } + + app.OK(c, payInfo, "") +} diff --git a/app/admin/apis/inventorymanage/Inventory.go b/app/admin/apis/inventorymanage/Inventory.go index 51f8176..f07b1c5 100644 --- a/app/admin/apis/inventorymanage/Inventory.go +++ b/app/admin/apis/inventorymanage/Inventory.go @@ -280,7 +280,7 @@ func QueryCode(c *gin.Context) { list, err := models.GetCodeList(req) if err != nil { logger.Error("GetCodeList err:", logger.Field("err", err)) - app.Error(c, http.StatusInternalServerError, err, "获取失败") + app.Error(c, http.StatusInternalServerError, err, err.Error()) return } diff --git a/app/admin/apis/mallmanage/mall_goods_order.go b/app/admin/apis/mallmanage/mall_goods_order.go index 391207f..1b6c1e2 100644 --- a/app/admin/apis/mallmanage/mall_goods_order.go +++ b/app/admin/apis/mallmanage/mall_goods_order.go @@ -118,6 +118,14 @@ func GoodsOrderRefundSendReceive(c *gin.Context) { app.OK(c, nil, "订单退货成功") } +// MallUserVmRecord 用户积分记录 +// @Summary 用户积分记录 +// @Tags 数据统计, V1.2.0 +// @Produce json +// @Accept json +// @Param request body models.MallUserVmRecordReq true "用户积分记录模型" +// @Success 200 {object} models.MallUserVmRecordResp +// @Router /api/v1/mall/goods/user/vm_record [post] func MallUserVmRecord(c *gin.Context) { req := &models.MallUserVmRecordReq{} if c.ShouldBindJSON(req) != nil { @@ -132,12 +140,13 @@ func MallUserVmRecord(c *gin.Context) { app.Error(c, http.StatusInternalServerError, errors.New("order detail err"), msg) return } - ret := map[string]interface{}{ - "count": totalCount, - "list": orderList, - "page_index": req.PageIdx, - "page_size": req.PageSize, - //"total_page": totalPage, + + ret := models.MallUserVmRecordResp{ + Count: totalCount, + List: orderList, + PageIndex: req.PageIdx, + PageSize: req.PageSize, } + app.OK(c, ret, "") } diff --git a/app/admin/apis/usermanage/user.go b/app/admin/apis/usermanage/user.go index 3feef71..fcd2a8b 100644 --- a/app/admin/apis/usermanage/user.go +++ b/app/admin/apis/usermanage/user.go @@ -103,11 +103,11 @@ func UserList(c *gin.Context) { // NewUserList 所有用户 // @Summary 所有用户 -// @Tags 会员管理 +// @Tags 会员管理, V1.2.0 // @Produce json // @Accept json // @Param request body models.NewUserListReq true "所有用户模型" -// @Success 200 {object} models.U +// @Success 200 {object} models.NewUserListResp // @Router /api/v1/user_info/list [post] func NewUserList(c *gin.Context) { var req = new(models.NewUserListReq) @@ -118,41 +118,13 @@ func NewUserList(c *gin.Context) { } fmt.Printf("req: %+v \n", req) - userList, _, count, err := models.GetNewUserList(req) + ret, err := models.GetNewUserList(req) if err != nil { logger.Errorf("err:", logger.Field("err", err)) app.Error(c, http.StatusInternalServerError, err, "查询失败") return } - var uids []uint32 - for _, u := range userList { - if u.MemberExpireDays > 0 { - uids = append(uids, u.Uid) - } - } - //未归还卡带 - cards, err := models.GetUserExpiredCards(uids) - if err != nil { - logger.Errorf("err:", logger.Field("err", err)) - app.Error(c, http.StatusInternalServerError, err, "查询失败") - return - } - for i, u := range userList { - c, ok := cards[u.Uid] - if ok { - userList[i].OrderCards = c - //滞纳金 一个卡带一天2块钱 - userList[i].ForfeitPenalty = len(c) * 200 * int(userList[i].MemberExpireDays) - } - } - - ret := map[string]interface{}{ - "count": count, - "list": userList, - "pageIndex": req.PageIndex, - "total_page": req.PageSize, - } app.OK(c, ret, "") } @@ -942,6 +914,32 @@ func UserInviteRecordList(c *gin.Context) { app.OK(c, ret, "") } +// NewUserInviteRecordList 会员邀请记录 +// @Summary 会员邀请记录 +// @Tags 会员管理, V1.2.0 +// @Produce json +// @Accept json +// @Param request body models.NewUserInviteRecordReq true "会员邀请记录模型" +// @Success 200 {object} models.UserInviteRecordListResp +// @Router /api/v1/user_info/new_user_invite_record_list [post] +func NewUserInviteRecordList(c *gin.Context) { + req := new(models.NewUserInviteRecordReq) + if c.ShouldBindJSON(req) != nil { + logger.Errorf("para err") + app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + + resp, err := req.NewList() + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, "查询失败") + return + } + + app.OK(c, resp, "") +} + func ExpireMemberSmsSendRecordList(c *gin.Context) { req := &models.ExpireMemberSmsSendListReq{} if c.ShouldBindJSON(req) != nil { diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index 454e7e4..a1c6ab4 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -2118,6 +2118,7 @@ func GetCodeList(req *QueryCodeReq) (*QueryCodeResp, error) { qs := orm.Eloquent.Debug().Table("erp_stock_commodity"). Where("imei LIKE ? OR erp_barcode LIKE ?", "%"+req.ScanCode+"%", "%"+req.ScanCode+"%") + es := qs err := qs.Order(orderStr).Offset(page * req.PageSize).Limit(req.PageSize).Find(&commodities).Error if err != nil && err != RecordNotFound { @@ -2137,7 +2138,9 @@ func GetCodeList(req *QueryCodeReq) (*QueryCodeResp, error) { for _, commodity := range commodities { if commodity.IMEI != "" && strings.Contains(commodity.IMEI, req.ScanCode) { // 串码非空且包含查找的数据 strCode = commodity.IMEI - } else { // 串码为空,直接返回条码数据 + } else if commodity.IMEI != "" && strings.Contains(commodity.ErpBarcode, req.ScanCode) { // 串码不为空,但条码包含扫码数据 + return nil, errors.New("串码类商品请直接输入串码") + } else { strCode = commodity.ErpBarcode } stockList = append(stockList, strCode) diff --git a/app/admin/models/cooperative_business.go b/app/admin/models/cooperative_business.go index 0fbe6b0..67ff25b 100644 --- a/app/admin/models/cooperative_business.go +++ b/app/admin/models/cooperative_business.go @@ -16,11 +16,13 @@ import ( type CooperativeBusiness struct { Model - Name string `json:"name" binding:"required"` - Avatar string `json:"avatar" binding:"required"` - Address string `json:"address" binding:"required"` - Tel string `json:"tel" binding:"required"` - AddTime time.Time `json:"add_time"` // 加入时间 + Name string `json:"name" binding:"required"` // 供应商名称 + Avatar string `json:"avatar" binding:"required"` // logo + Address string `json:"address"` // 地址 + Tel string `json:"tel" binding:"required"` // 电话 + AddTime time.Time `json:"add_time"` // 加入时间 + Username string `json:"username" binding:"required"` // 用户名 + Password string `json:"password" binding:"required"` // 密码 CooperativeMemberDeduct *CooperativeMemberDeduct `json:"cooperative_member_deduct" gorm:"-"` CooperativeAssistantMemberDeduct *CooperativeAssistantMemberDeduct `json:"cooperative_assistant_member_deduct" gorm:"-"` @@ -116,6 +118,10 @@ type CooperativeMemberPromotion struct { RenewalPlatinumDeduct uint32 `json:"renewal_platinum_deduct" gorm:"-"` // 续费白金会员提成 RenewalBlackGoldDeduct uint32 `json:"renewal_black_gold_deduct" gorm:"-"` // 续费黑金金会员提成 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 + DeductAmount uint32 `json:"deduct_amount" gorm:"-"` // 结算净额 // cooperative_member_promotion } @@ -123,49 +129,58 @@ type CooperativeMemberPromotion struct { // 合作商推广会员门店 饼图 type CooperativeMemberPromotionStore struct { Model - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` - CooperativeName string `json:"cooperative_name"` // 合作商名称 - StoreId uint32 `json:"store_id" gorm:"index"` // 门店id - GoldCount uint32 `json:"gold_count"` // 黄金会员数量 - PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 - BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 - Date string `json:"date" gorm:"index"` // - RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 - Store *Store `json:"store" gorm:"-"` + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` + CooperativeName string `json:"cooperative_name"` // 合作商名称 + StoreId uint32 `json:"store_id" gorm:"index"` // 门店id + GoldCount uint32 `json:"gold_count"` // 黄金会员数量 + PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 + BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + Date string `json:"date" gorm:"index"` // + RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 + Store *Store `json:"store" gorm:"-"` // cooperative_member_promotion_store } // 合作商推广会员每天 type CooperativeMemberPromotionDay struct { Model - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` - CooperativeName string `json:"cooperative_name"` // 合作商名称 - GoldCount uint32 `json:"gold_count"` // 黄金会员数量 - PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 - BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 - DayTime string `json:"day_time" gorm:"index"` // - RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` + CooperativeName string `json:"cooperative_name"` // 合作商名称 + GoldCount uint32 `json:"gold_count"` // 黄金会员数量 + PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 + BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + DayTime string `json:"day_time" gorm:"index"` // + RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 // cooperative_member_promotion_day } // 合作商推广会员门店每天 柱状图 type CooperativeMemberPromotionStoreDay struct { Model - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` - CooperativeName string `json:"cooperative_name"` // 合作商名称 - StoreId uint32 `json:"store_id" gorm:"index"` // 门店id - GoldCount uint32 `json:"gold_count"` // 黄金会员数量 - PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 - BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 - DayTime string `json:"day_time" gorm:"index"` // - RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 - RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 - RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 - Store *Store `json:"store" gorm:"-"` + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` + CooperativeName string `json:"cooperative_name"` // 合作商名称 + StoreId uint32 `json:"store_id" gorm:"index"` // 门店id + GoldCount uint32 `json:"gold_count"` // 黄金会员数量 + PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 + BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + DayTime string `json:"day_time" gorm:"index"` // + RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 + RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 + Store *Store `json:"store" gorm:"-"` // cooperative_member_promotion_store_day } @@ -201,6 +216,13 @@ type CooperativeBusinessListReq struct { PageSize int `json:"pageSize"` } +type CooperativeBusinessListResp struct { + Count int64 `json:"count"` + List []CooperativeBusiness `json:"list"` + PageIndex int `json:"pageIndex"` + TotalPage int `json:"total_page"` +} + func (m *CooperativeBusinessListReq) List() ([]CooperativeBusiness, int64, error) { var cooperatives []CooperativeBusiness qs := orm.Eloquent.Table("cooperative_business") @@ -682,18 +704,29 @@ type CooperativeMemberPromotionStatistic struct { Date string `json:"date" gorm:"index"` // StoreId uint32 `json:"store_id" gorm:"index"` // 门店id + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量 + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量 + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量 + Store *Store `json:"store" gorm:"-"` // cooperative_member_promotion_day } type CooperativeMemberPromotionStatisticReq struct { - Type uint32 `json:"type"` // 1-日店员推广 2-日门店店员推广 - CooperativeBusinessId uint32 `json:"cooperative_business_id"` - StartDate string `json:"start_date"` - EndDate string `json:"end_date"` - StoreId uint32 `json:"store_id"` - Page int `json:"pageIndex"` - PageSize int `json:"pageSize"` + Type uint32 `json:"type"` // 1-按天展示 2-按月展示 + CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id + StartDate string `json:"start_date"` // 开始月份 + EndDate string `json:"end_date"` // 结束月份 + StoreId uint32 `json:"store_id"` // 门店ID + Page int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 每页条数 + IsExport uint32 `json:"is_export"` // 1-导出 +} + +type CooperativeMemberPromotionStatisticListResp struct { + Count int64 `json:"count"` + PageIndex int `json:"pageIndex"` + List []CooperativeMemberPromotionStatistic `json:"list"` } func (m *CooperativeMemberPromotionStatisticReq) List() ([]CooperativeMemberPromotionStatistic, int64, error) { @@ -866,18 +899,20 @@ func CooperativeMemberPromotionToStatistic(list []CooperativeMemberPromotion) [] } for i, _ := range list { promotions = append(promotions, CooperativeMemberPromotionStatistic{ - Model: list[i].Model, - CooperativeBusinessId: list[i].CooperativeBusinessId, - CooperativeName: list[i].CooperativeName, - GoldCount: list[i].GoldCount, - PlatinumCount: list[i].PlatinumCount, - BlackGoldCount: list[i].BlackGoldCount, - RenewalGoldCount: list[i].RenewalGoldCount, - RenewalPlatinumCount: list[i].RenewalPlatinumCount, - RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, - Date: list[i].Date, + Model: list[i].Model, + CooperativeBusinessId: list[i].CooperativeBusinessId, + CooperativeName: list[i].CooperativeName, + GoldCount: list[i].GoldCount, + PlatinumCount: list[i].PlatinumCount, + BlackGoldCount: list[i].BlackGoldCount, + RenewalGoldCount: list[i].RenewalGoldCount, + RenewalPlatinumCount: list[i].RenewalPlatinumCount, + RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, + Date: list[i].Date, + UpgradePlatinumToBlackCount: list[i].UpgradePlatinumToBlackCount, + UpgradeGoldToBlackCount: list[i].UpgradeGoldToBlackCount, + UpgradeGoldToPlatinumCount: list[i].UpgradeGoldToPlatinumCount, //StoreId: list[i].StoreId, - }) } return promotions @@ -898,12 +933,15 @@ func CooperativeMemberPromotionStoreToStatistic(list []CooperativeMemberPromotio PlatinumCount: list[i].PlatinumCount, BlackGoldCount: list[i].BlackGoldCount, //DayTime: list[i].DayTime, - RenewalGoldCount: list[i].RenewalGoldCount, - RenewalPlatinumCount: list[i].RenewalPlatinumCount, - RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, - Date: list[i].Date, - StoreId: list[i].StoreId, - Store: list[i].Store, + RenewalGoldCount: list[i].RenewalGoldCount, + RenewalPlatinumCount: list[i].RenewalPlatinumCount, + RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, + Date: list[i].Date, + StoreId: list[i].StoreId, + Store: list[i].Store, + UpgradeGoldToPlatinumCount: list[i].UpgradeGoldToPlatinumCount, + UpgradeGoldToBlackCount: list[i].UpgradeGoldToBlackCount, + UpgradePlatinumToBlackCount: list[i].UpgradePlatinumToBlackCount, }) } return promotions diff --git a/app/admin/models/dispose_config.go b/app/admin/models/dispose_config.go index 96305d7..5f6182f 100644 --- a/app/admin/models/dispose_config.go +++ b/app/admin/models/dispose_config.go @@ -3,8 +3,8 @@ package models import ( "encoding/json" "errors" - "github.com/codinl/go-logger" orm "go-admin/common/global" + "go-admin/logger" ) // gen:qs @@ -29,12 +29,13 @@ type PayConfig struct { } const ( - ConfigNamePay = "pay_config" // 支付配置 - ConfigNameMember = "member_config" // 会员配置 - ConfigNameMemberVm = "member_vm_config" // 会员积分配置 - ConfigNameAttendanceVm = "attendance_vm_config" // 签到积分配置 - ConfigActivityRenewal = "activity_renewal_config" // 活动配置 - ConfigRecycleCard = "recycle_card_config" // 回收卡配置 + ConfigNamePay = "pay_config" // 支付配置 + ConfigNameMember = "member_config" // 会员配置 + ConfigNameMemberVm = "member_vm_config" // 会员积分配置 + ConfigNameAttendanceVm = "attendance_vm_config" // 签到积分配置 + ConfigActivityRenewal = "activity_renewal_config" // 活动配置 + ConfigRecycleCard = "recycle_card_config" // 回收卡配置 + ConfigCooperativePayInfo = "cooperative_pay_info" // 合作商支付设置 ) func PayConfigInfo() (*PayConfig, error) { @@ -43,13 +44,13 @@ func PayConfigInfo() (*PayConfig, error) { err := orm.Eloquent.Table("config").Where("name=?", ConfigNamePay).Find(&configAllocation).Error //err := NewConfigQuerySet(DB).NameEq(ConfigNamePay).One(&configAllocation) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return payConfig, err } err = json.Unmarshal([]byte(configAllocation.Value), payConfig) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return payConfig, err } @@ -69,13 +70,13 @@ func MemberConfigInfo() ([]MemberConfig, error) { err := orm.Eloquent.Table("config").Where("name=?", ConfigNameMember).Find(&configAllocation).Error //err := NewConfigQuerySet(DB).NameEq(ConfigNameMember).One(&configAllocation) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return memberConfigs, err } err = json.Unmarshal([]byte(configAllocation.Value), &memberConfigs) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return memberConfigs, err } @@ -113,13 +114,13 @@ func memberVmConfigInfo() ([]MemberVmConfig, error) { err := orm.Eloquent.Table("config").Where("name=?", ConfigNameMemberVm).Find(&configAllocation).Error //err := NewConfigQuerySet(DB).NameEq(ConfigNameMemberVm).One(&configAllocation) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return memberVmConfigs, err } err = json.Unmarshal([]byte(configAllocation.Value), &memberVmConfigs) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return memberVmConfigs, err } @@ -159,13 +160,13 @@ func AttendanceVmConfigInfo() (*AttendanceVmConfig, error) { err := orm.Eloquent.Table("config").Where("name=?", ConfigNameAttendanceVm).Find(&configAllocation).Error //err := NewConfigQuerySet(DB).NameEq(ConfigNameAttendanceVm).One(&configAllocation) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return attendanceConfig, err } err = json.Unmarshal([]byte(configAllocation.Value), attendanceConfig) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return attendanceConfig, err } @@ -208,13 +209,13 @@ func ActivityRenewalConfigInfo() (ActivityRenewalConfig, error) { Where("name=?", ConfigActivityRenewal).Find(&configAllocation).Error //err := NewConfigQuerySet(DB).NameEq(ConfigActivityRenewal).One(&configAllocation) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return activityRenewalConfig, err } err = json.Unmarshal([]byte(configAllocation.Value), &activityRenewalConfig) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return activityRenewalConfig, err } @@ -224,14 +225,14 @@ func ActivityRenewalConfigInfo() (ActivityRenewalConfig, error) { func ActivityRenewalConfigUpdate(activity ActivityRenewalConfig) (ActivityRenewalConfig, error) { bytes, err := json.Marshal(activity) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return activity, err } orm.Eloquent.Table("config"). Where("name=?", ConfigActivityRenewal).Update("Value", string(bytes)) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return activity, err } @@ -241,7 +242,7 @@ func ActivityRenewalConfigUpdate(activity ActivityRenewalConfig) (ActivityRenewa func GetActivityRenewalConfig() ActivityRenewalConfig { info, err := ActivityRenewalConfigInfo() if err != nil { - logger.Error("info err:", err) + logger.Errorf("info err:", err) return info } return info @@ -258,13 +259,13 @@ func RecycleCardConfigInfo() (RecycleCardConfig, error) { err := orm.Eloquent.Table("config"). Where("name=?", ConfigRecycleCard).Find(&configAllocation).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return recycleConfig, err } err = json.Unmarshal([]byte(configAllocation.Value), &recycleConfig) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return recycleConfig, err } @@ -274,16 +275,89 @@ func RecycleCardConfigInfo() (RecycleCardConfig, error) { func RecycleCardConfigUpdate(recycleConfig RecycleCardConfig) (RecycleCardConfig, error) { bytes, err := json.Marshal(recycleConfig) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return recycleConfig, err } orm.Eloquent.Table("config"). Where("name=?", ConfigRecycleCard).Update("Value", string(bytes)) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return recycleConfig, err } return recycleConfig, nil } + +// CooperativePayInfo 支付信息 +type CooperativePayInfo struct { + CooperativeBusinessId uint32 `json:"cooperative_business_id" binding:"required"` // 合作商id + UnionPayMerchantId string `json:"union_pay_merchant_id" gorm:"index"` // 聚合支付平台商户号 + WxAppId string `json:"wx_app_id" gorm:"index"` // 微信小程序AppID + WxAppMchId string `json:"wx_app_mchId" gorm:"index"` // 微信支付商户号 + WxAppMchSecret string `json:"wx_app_mchSecret" gorm:"index"` // 微信支付商户密钥 +} + +func SetPayInfo(req *CooperativeSetPayInfoReq) error { + payInfo := CooperativePayInfo{ + CooperativeBusinessId: req.CooperativeBusinessId, + UnionPayMerchantId: req.UnionPayMerchantId, + WxAppId: req.WxAppId, + WxAppMchId: req.WxAppMchId, + WxAppMchSecret: req.WxAppMchSecret, + } + + jPayInfo, err := json.Marshal(payInfo) + if err != nil { + logger.Errorf("CooperativePayInfo marshal err:", logger.Field("err", err)) + return err + } + + var configInfo Config + err = orm.Eloquent.Table("config").Where("name=?", ConfigCooperativePayInfo).Find(&configInfo).Error + if err != nil { + logger.Error("query erp_order err:", logger.Field("err", err)) + return errors.New("操作失败:" + err.Error()) + } + + if errors.Is(err, RecordNotFound) || configInfo.ID == 0 { // 没有记录则新增 + configInfo.Name = ConfigCooperativePayInfo + configInfo.Value = string(jPayInfo) + err = orm.Eloquent.Create(&configInfo).Error + if err != nil { + logger.Errorf("create CooperativePayInfo err:", logger.Field("err", err)) + return errors.New("保存失败:" + err.Error()) + } + } else { // 有记录则更新 + var updateConfigInfo Config + updateConfigInfo.ID = configInfo.ID + updateConfigInfo.Name = ConfigCooperativePayInfo + updateConfigInfo.Value = string(jPayInfo) + + err = orm.Eloquent.Model(&Config{}).Where("id = ?", configInfo.ID).Updates(updateConfigInfo).Error + if err != nil { + logger.Error("update CooperativePayInfo err:", logger.Field("err", err)) + return errors.New("保存失败:" + err.Error()) + } + } + + return nil +} + +func GetPayInfo() (*CooperativePayInfo, error) { + payConfig := new(CooperativePayInfo) + var configAllocation Config + err := orm.Eloquent.Table("config").Where("name=?", ConfigCooperativePayInfo).Find(&configAllocation).Error + if err != nil { + logger.Errorf("err:", err) + return payConfig, err + } + + err = json.Unmarshal([]byte(configAllocation.Value), payConfig) + if err != nil { + logger.Errorf("err:", err) + return payConfig, err + } + + return payConfig, nil +} diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index eed24a2..23c141d 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -8,6 +8,7 @@ import ( "go-admin/app/admin/apis/pay" orm "go-admin/common/global" "go-admin/logger" + "go-admin/tools" "go-admin/tools/config" "gorm.io/gorm" "math/rand" @@ -58,7 +59,7 @@ type ErpOrder struct { MakerTime time.Time `json:"maker_time"` // 制单时间 AuditorId uint32 `json:"auditor_id" gorm:"index"` // 审核人id AuditorName string `json:"auditor_name"` // 审核人姓名 - AuditTime time.Time `json:"audit_time"` // 审核时间 + AuditTime *time.Time `json:"audit_time"` // 审核时间 CashierList string `json:"cashier_list" gorm:"type:text"` // 付款方式,存储json数据 SalesmanList string `json:"salesman_list" gorm:"type:text"` // 销售员信息,存储json数据 MemberType string `json:"member_type"` // 会员类型:general 普通; member 会员 @@ -709,6 +710,25 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state int) error { return errors.New("订单类型错误") } + // 更新用户积分 + var vmCount int + var describe, event string + if erpOrder.RetailType == RetailTypeSale && state == SoldOut { // 零售订单,而且订单已支付,更新用户积分 + describe = "零售销售获得积分" + event = VmEventErpOrderSale + vmCount = tools.RoundFloat64(erpOrder.TotalAmount) + } else if erpOrder.RetailType == RetailTypeRejected { // 退货订单,扣减用户积分 + describe = "零售退货扣除积分" + event = VmEventErpOrderReject + vmCount = 0 - tools.RoundFloat64(erpOrder.TotalAmount) + } + + err = UserVmUpdate(gdb, uint32(erpOrder.Uid), vmCount, event, describe) + if err != nil { + logger.Errorf("err:", err) + return err + } + return nil } diff --git a/app/admin/models/game_card.go b/app/admin/models/game_card.go index 4016330..bdca8c3 100644 --- a/app/admin/models/game_card.go +++ b/app/admin/models/game_card.go @@ -3224,7 +3224,7 @@ func MemberReportFile(memberReports []InviteMemberReport, fileName string) strin var row []interface{} for rowId := 0; rowId < len(memberReports); rowId++ { row = []interface{}{fmt.Sprintf("%d", memberReports[rowId].Store.ID), memberReports[rowId].Store.Name, - fmt.Sprintf("%d", memberReports[rowId].UserInfo.Uid), memberReports[rowId].UserInfo.ShopAssistantName, + fmt.Sprintf("%d", memberReports[rowId].User.Uid), memberReports[rowId].User.ShopAssistantName, fmt.Sprintf("%d", memberReports[rowId].GoldCount), fmt.Sprintf("%d", memberReports[rowId].PlatinumCount), fmt.Sprintf("%d", memberReports[rowId].BlackGoldCount)} @@ -3243,3 +3243,15 @@ func MemberReportFile(memberReports []InviteMemberReport, fileName string) strin return ExportUrl + fileName } + +type CooperativeSetPayInfoReq struct { + CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id + UnionPayMerchantId string `json:"name" binding:"required"` // 聚合支付平台商户号 + WxAppId string `json:"wx_app_id"` // 微信小程序AppID + WxAppMchId string `json:"wx_app_mchId" binding:"required"` // 微信支付商户号 + WxAppMchSecret string `json:"wx_app_mchSecret" binding:"required"` // 微信支付商户密钥 +} + +type CooperativeGetPayInfoReq struct { + CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id +} diff --git a/app/admin/models/mall.go b/app/admin/models/mall.go index 7137030..66e725d 100644 --- a/app/admin/models/mall.go +++ b/app/admin/models/mall.go @@ -4,10 +4,10 @@ import ( "encoding/json" "errors" "fmt" - "github.com/codinl/go-logger" "github.com/rs/zerolog/log" utils "go-admin/app/admin/models/tools" orm "go-admin/common/global" + "go-admin/logger" "gorm.io/gorm" "sort" "strconv" @@ -183,7 +183,7 @@ func CreateGoodsSerialNo() string { var count int64 err := orm.Eloquent.Table("goods").Where("serial_no=?", serialNo).Count(&count).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return "" } if count > 0 { @@ -202,7 +202,7 @@ func CreateGoodsId() uint32 { var count int64 err := orm.Eloquent.Table("goods").Where("goods_id=?", orderId).Count(&count).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return 0 } if count > 0 { @@ -242,7 +242,7 @@ func (m *GoodsListReq) GoodsList() ([]Goods, int64, error) { var count int64 err := qs.Count(&count).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, 0, err } //totalPage := int(count)/m.PageSize + 1 @@ -250,7 +250,7 @@ func (m *GoodsListReq) GoodsList() ([]Goods, int64, error) { //err = qs.Order("cat_sort DESC,sort DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&goodsList).Error err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&goodsList).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, 0, err } GoodsListSetGoodsCat(goodsList) @@ -267,7 +267,7 @@ func (m *GoodsDetailReq) GoodsDetail() (*Goods, error) { //err := NewGoodsQuerySet(DB).GoodsIdEq(m.GoodsId).One(&goods).GoodsIdEq(m.GoodsId).One(&goods) err := orm.Eloquent.Table("goods").Where("goods_id=?", m.GoodsId).Find(&goods).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } return &goods, nil @@ -410,14 +410,14 @@ func (m *GoodsOrderListReq) OrderList() ([]GoodsOrder, int64, error) { var count int64 err := qs.Count(&count).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, 0, err } //totalPage := int(count)/m.PageSize + 1 err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&list).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, 0, err } GoodsOrderListSetGoods(list) @@ -439,7 +439,7 @@ func (m *GoodsOrderDetailReq) OrderDetail() (*GoodsOrder, error) { err := qs.Find(&order).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } //orders := GoodsOrderListSetGoods([]GoodsOrder{order}) @@ -449,7 +449,7 @@ func (m *GoodsOrderDetailReq) OrderDetail() (*GoodsOrder, error) { //var goods Goods goods, err := GetGoods(order.GoodsId) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } var goodsAttribute GoodsAttribute @@ -490,13 +490,13 @@ func (m *GoodsOrderDetailReq) OrderDetail() (*GoodsOrder, error) { var userAddress UserAddress err = orm.Eloquent.Table("user_address").Where("id=?", order.AddressId).Find(&userAddress).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } order.UserAddress = &userAddress err = order.SetDeliverStore() if err != nil { - logger.Error(" err:", err) + logger.Errorf(" err:", err) } return &order, nil } @@ -506,7 +506,7 @@ func (m *Goods) GoodsCreate() error { m.GoodsId = CreateGoodsId() err := orm.Eloquent.Create(m).Error if err != nil { - logger.Error("err:", err.Error()) + logger.Errorf("err:", err.Error()) return err } return nil @@ -515,7 +515,7 @@ func (m *Goods) GoodsCreate() error { func (m *Goods) Edit() error { err := orm.Eloquent.Save(m).Error if err != nil { - logger.Error("err:", err.Error()) + logger.Errorf("err:", err.Error()) return err } return nil @@ -524,7 +524,7 @@ func (m *Goods) Edit() error { func (m *Goods) GetDetail() error { err := orm.Eloquent.Table("goods").Where("goods_id=?", m.GoodsId).Find(m).Error if err != nil { - logger.Error("err:", err.Error()) + logger.Errorf("err:", err.Error()) return err } var goodsAttributes []GoodsAttribute @@ -566,7 +566,7 @@ func GetGoodsMapByIds(ids []uint32) map[uint32]Goods { err := orm.Eloquent.Table("goods").Where("goods_id IN (?)", ids).Find(&goodsList).Error //err := NewGoodsQuerySet(DB).GoodsIdIn(ids...).All(&goodsList) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return goodsMap } for i, _ := range goodsList { @@ -606,7 +606,7 @@ func (m *GoodsOrderDeliverReq) OrderDeliver() (*GoodsOrder, error) { var order GoodsOrder err := orm.Eloquent.Table("goods_order").Where("order_id=?", m.OrderId).Find(&order).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } if order.State != GoodsOrderStateOnDeliver { @@ -625,7 +625,7 @@ func (m *GoodsOrderDeliverReq) OrderDeliver() (*GoodsOrder, error) { //"delivery_status": 2, }).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } order.DeliveryTrackingNo = m.DeliveryTrackingNo @@ -643,7 +643,7 @@ func (m *GoodsOrderDeliverReq) OrderDeliver() (*GoodsOrder, error) { goods, err := GetGoods(order.GoodsId) if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } var goodsAttribute GoodsAttribute @@ -678,7 +678,7 @@ func (m *GoodsOrderDeliverReq) OrderDeliver() (*GoodsOrder, error) { var userAddress UserAddress err = orm.Eloquent.Table("user_address").Where("id=?", order.AddressId).Find(&userAddress).Error if err != nil { - logger.Error("err:", err) + logger.Errorf("err:", err) return nil, err } order.UserAddress = &userAddress @@ -689,12 +689,27 @@ func (m *GoodsOrderDeliverReq) OrderDeliver() (*GoodsOrder, error) { } type MallUserVmRecordReq struct { - PageIdx int `json:"pageIndex"` - PageSize int `json:"pageSize"` - Uid uint32 `json:"uid"` + PageIdx int `json:"pageIndex"` + PageSize int `json:"pageSize"` + Uid uint32 `json:"uid"` // 用户ID + Tel string `json:"tel"` // 用户手机号 + StartTime string `json:"start_time"` // 开始时间,示例:2006-01-02T15:04:05+08:00 + EndTime string `json:"end_time"` // 结束时间,示例:2006-01-02T15:04:05+08:00 } -func (m *MallUserVmRecordReq) MallUserVmRecordList() ([]UserVmRecord, int64, error) { +type MallUserVmRecordResp struct { + Count int64 `json:"count"` + List []MallUserVmRecordData `json:"list"` + PageIndex int `json:"page_index"` + PageSize int `json:"page_size"` +} + +type MallUserVmRecordData struct { + UserVmRecord + Tel string `json:"tel"` // 用户手机号 +} + +func (m *MallUserVmRecordReq) MallUserVmRecordList() ([]MallUserVmRecordData, int64, error) { page := m.PageIdx - 1 if page < 0 { page = 0 @@ -703,29 +718,83 @@ func (m *MallUserVmRecordReq) MallUserVmRecordList() ([]UserVmRecord, int64, err m.PageSize = 10 } - var list []UserVmRecord - qs := orm.Eloquent.Table("user_vm_record") // NewGoodsOrderQuerySet(DB) + var list []MallUserVmRecordData + qs := orm.Eloquent.Table("user_vm_record") + countQuery := orm.Eloquent.Table("user_vm_record"). + Joins("LEFT JOIN user ON user_vm_record.uid = user.uid") if m.Uid != 0 { - qs = qs.Where("uid=?", m.Uid) + qs = qs.Where("user_vm_record.uid=?", m.Uid) + countQuery = countQuery.Where("user_vm_record.uid=?", m.Uid) + } + if m.Tel != "" { + qs = qs.Where("user.tel=?", m.Tel) + countQuery = countQuery.Where("user.tel=?", m.Tel) + } + if m.StartTime != "" { + startTime, err := time.Parse(QueryTimeFormat, m.StartTime) + if err == nil { + qs = qs.Where("user_vm_record.created_at>?", startTime) + countQuery = countQuery.Where("user_vm_record.created_at>?", startTime) + } else { + logger.Errorf("MallUserVmRecordList time start parse err:", err.Error()) + } + } + if m.EndTime != "" { + endTime, err := time.Parse(QueryTimeFormat, m.EndTime) + if err == nil { + qs = qs.Where("user_vm_record.created_at ?", parse) } if req.CreateEndTime != "" { - parse, err := time.Parse(DateTimeFormat, req.CreateEndTime) + parse, err := time.Parse(QueryTimeFormat, req.CreateEndTime) if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return users, 0, 0, err + return nil, err } qs = qs.Where("created_at < ?", parse) } if req.OrderStartTime != "" { - parse, err := time.Parse(DateTimeFormat, req.OrderStartTime) + parse, err := time.Parse(QueryTimeFormat, req.OrderStartTime) if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return users, 0, 0, err + return nil, err } qs = qs.Where("first_retail_order > ?", parse) } if req.OrderEndTime != "" { - parse, err := time.Parse(DateTimeFormat, req.OrderEndTime) + parse, err := time.Parse(QueryTimeFormat, req.OrderEndTime) if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return users, 0, 0, err + return nil, err } qs = qs.Where("first_retail_order < ?", parse) } if req.OpenStartTime != "" { - parse, err := time.Parse(DateTimeFormat, req.OpenStartTime) + parse, err := time.Parse(QueryTimeFormat, req.OpenStartTime) if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return users, 0, 0, err + return nil, err } qs = qs.Where("open_member_time > ?", parse) } if req.OpenEndTime != "" { - parse, err := time.Parse(DateTimeFormat, req.OpenEndTime) + parse, err := time.Parse(QueryTimeFormat, req.OpenEndTime) if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return users, 0, 0, err + return nil, err } qs = qs.Where("open_member_time < ?", parse) } @@ -327,19 +370,17 @@ func GetNewUserList(req *NewUserListReq) ([]U, uint32, uint32, error) { err := qs.Count(&count).Error if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return users, 0, 0, err + return nil, err } currentTime := time.Now() // 子查询,查询消费次数和消费金额 - subQuery := fmt.Sprintf(` - SELECT uid, COUNT(*) as order_count, SUM(amount) as order_amount + subQuery := fmt.Sprintf(`SELECT uid, COUNT(*) as order_count, SUM(amount) as order_amount FROM fund_record WHERE fund_type NOT IN ('deposit_refund', 'express_fee_refund', 'member_expire_delay', 'recycle_card') GROUP BY uid - HAVING COUNT(uid) > 0 - `) + HAVING COUNT(uid) > 0`) // 查询用户数据,过期天数,消费次数,消费金额 qs = qs.Select("user.*, COALESCE(fr.order_count, 0) as order_count, COALESCE(fr.order_amount, 0) as "+ @@ -360,22 +401,64 @@ func GetNewUserList(req *NewUserListReq) ([]U, uint32, uint32, error) { err = qs.Find(&users).Error if err != nil && err != RecordNotFound { logger.Errorf("err:", logger.Field("err", err)) - return nil, 0, 0, err + return nil, err } count = int64(len(users)) users = nil } - err = qs.Order(fmt.Sprintf("%s %s", sortFiled, sortType)).Offset(req.PageIndex * req.PageSize).Limit(req.PageSize).Find(&users).Error - if err != nil && err != RecordNotFound { + if req.IsExport == 1 { // 导出excel + err = qs.Order(fmt.Sprintf("%s %s", sortFiled, sortType)).Find(&users).Error + if err != nil && err != RecordNotFound { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + } else { + err = qs.Order(fmt.Sprintf("%s %s", sortFiled, sortType)).Offset(req.PageIndex * req.PageSize).Limit(req.PageSize).Find(&users).Error + if err != nil && err != RecordNotFound { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + } + resp.Total = int(count) + + //查询卡片 + var uids []uint32 + for _, u := range users { + if u.MemberExpireDays > 0 { + uids = append(uids, u.Uid) + } + } + //未归还卡带 + cards, err := GetUserExpiredCards(uids) + if err != nil { logger.Errorf("err:", logger.Field("err", err)) - return nil, 0, 0, err + return nil, err + } + for i, u := range users { + c, ok := cards[u.Uid] + if ok { + users[i].OrderCards = c + //滞纳金 一个卡带一天2块钱 + users[i].ForfeitPenalty = len(c) * 200 * int(users[i].MemberExpireDays) + } } - totalPage = uint32(int(count)/req.PageSize + 1) + if req.IsExport == 1 { + exportFile, err := newUserListExport(users) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + resp.ExportUrl = exportFile + } else { + resp.List = users + resp.PageIndex = req.PageIndex + resp.PageSize = req.PageSize + } - return users, totalPage, uint32(count), nil + return resp, nil } func GetUserList(page, pageSize, uid, memberLevel, storeId, userType, cooperativeBusinessId int, tel, startTime, endTime, nameKey, sortFiled, sortType string, filter bool) ([]U, uint32, uint32, error) { @@ -478,6 +561,122 @@ func GetUserList(page, pageSize, uid, memberLevel, storeId, userType, cooperativ return users, totalPage, uint32(count), nil } +// 导出所有用户excel +func newUserListExport(list []U) (string, error) { + file := excelize.NewFile() + fSheet := "Sheet1" + + url := ExportUrl + fileName := time.Now().Format(TimeFormat) + "所有会员" + ".xlsx" + fmt.Println("url fileName:", url+fileName) + + title := []interface{}{"用户ID", "手机号", "所属门店", "消费次数", "消费金额", "注册小程序时间", "首次零售开单时间", + "首次开通租卡会员等级", "当前会员等级", "首次开通租卡会员时间", "租卡会员到期时间", "保证金", "租卡会员过期天数", "滞纳金", + "未归还卡带名称", "未归还卡带串码"} + for i, _ := range title { + cell, _ := excelize.CoordinatesToCellName(1+i, 1) + err := file.SetCellValue(fSheet, cell, title[i]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + + var row []interface{} + nExcelStartRow := 0 + + // 查询门店信息 + var storeList []Store + err := orm.Eloquent.Table("store").Find(&storeList).Error + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return "", err + } + storeMap := make(map[uint32]string, 0) + for i, _ := range storeList { + storeMap[storeList[i].ID] = storeList[i].Name + } + fmt.Println("storeMap is:", storeMap[13]) + + for i := 0; i < len(list); i++ { + // 未归还卡带名称和串码 + var cardNames, cardNums []string + var cardNamesResult, cardNumsResult string + if list[i].MemberExpireDays > 0 { + for _, item := range list[i].OrderCards { + // 未归还卡带名称 + if item.GameCard != nil { + cardNames = append(cardNames, item.GameCard.Name) + } + // 未归还卡带串码 + cardNums = append(cardNums, item.SerialNumber) + } + if len(cardNames) != 0 { + cardNamesResult = strings.Join(cardNames, ",") + } + if len(cardNums) != 0 { + cardNumsResult = strings.Join(cardNums, ",") + } + } + + row = []interface{}{ + list[i].Uid, // 用户ID + list[i].Tel, // 手机号 + storeMap[uint32(list[i].StoreId)], // 所属门店 + list[i].OrderCount, // 消费次数 + list[i].OrderAmount, // 消费金额 + tools.ConvertTimeToString(list[i].CreatedAt), // 注册小程序时间 + tools.ConvertTimeToString(list[i].FirstRetailOrder), // 首次零售开单时间 + getMemberLevelChineseDescription(list[i].OpenMemberLevel), // 首次开通租卡会员等级 + getMemberLevelChineseDescription(list[i].MemberLevel), // 当前会员等级 + tools.ConvertTimeToString(list[i].OpenMemberTime), // 首次开通租卡会员时间 + tools.ConvertTimeToString(list[i].MemberExpire), // 租卡会员到期时间 + list[i].Deposit, // 保证金 + list[i].MemberExpireDays, // 租卡会员过期天数 + list[i].ForfeitPenalty, // 滞纳金 + cardNamesResult, // 未归还卡带名称 + cardNumsResult, // 未归还卡带串码 + } + + for j, _ := range row { + cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) + err := file.SetCellValue(fSheet, cell, row[j]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + nExcelStartRow++ + } + + // 设置所有单元格的样式: 居中、加边框 + style, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + // 设置单元格的样式: 居中、加边框、自动换行 + style1, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center","wrap_text":true}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + endRow := fmt.Sprintf("P%d", nExcelStartRow+1) + // 应用样式到整个表格 + file.SetColWidth("Sheet1", "F", "F", 18) + file.SetColWidth("Sheet1", "G", "G", 18) + file.SetColWidth("Sheet1", "J", "J", 18) + file.SetColWidth("Sheet1", "K", "K", 18) + _ = file.SetCellStyle("Sheet1", "A1", "P1", style1) + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) + + fmt.Println("save fileName:", config.ExportConfig.Path+fileName) + if err := file.SaveAs(config.ExportConfig.Path + fileName); err != nil { + fmt.Println(err) + } + return url + fileName, nil +} + type CommonProblem struct { Model @@ -592,24 +791,57 @@ func (m *UserAddress) TableName() string { } // gen:qs +//type InviteMemberReport struct { +// Model +// Uid uint32 `json:"uid" gorm:"index"` +// StoreId uint32 `json:"store_id" gorm:"index"` // 门店id +// GoldCount uint32 `json:"gold_count"` // 黄金数量 +// PlatinumCount uint32 `json:"platinum_count"` // 白金数量 +// BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量 +// Date string `json:"date" gorm:"index"` // 业绩时间 +// DeductAmount uint32 `json:"deduct_amount"` // 店员提成 +// CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id +// CooperativeName string `json:"cooperative_name"` // 合作商名称 +// GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成 +// PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成 +// BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成 +// UserInfo *UserInfo `json:"user_info" gorm:"-"` // 用户 +// Store *Store `json:"store" gorm:"-"` // 门店 +// // ReportTime string `json:"report_time" gorm:"index"` // 业绩时间 +// // invite_member_report +//} + type InviteMemberReport struct { Model - Uid uint32 `json:"uid" gorm:"index"` - StoreId uint32 `json:"store_id" gorm:"index"` // 门店id - GoldCount uint32 `json:"gold_count"` // 黄金数量 - PlatinumCount uint32 `json:"platinum_count"` // 白金数量 - BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量 - Date string `json:"date" gorm:"index"` // 业绩时间 - DeductAmount uint32 `json:"deduct_amount"` // 店员提成 - CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id - CooperativeName string `json:"cooperative_name"` // 合作商名称 - GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成 - PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成 - BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成 - UserInfo *UserInfo `json:"user_info" gorm:"-"` // 用户 - Store *Store `json:"store" gorm:"-"` // 门店 - // ReportTime string `json:"report_time" gorm:"index"` // 业绩时间 + Uid uint32 `json:"uid" gorm:"index"` // 店员uid + StoreId uint32 `json:"store_id" gorm:"index"` // 门店id + GoldCount uint32 `json:"gold_count"` // 黄金数量 + PlatinumCount uint32 `json:"platinum_count"` // 白金数量 + BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量 + //ReportTime string `json:"report_time" gorm:"index"` // 业绩时间 + Date string `json:"date" gorm:"index"` // 业绩时间 + DeductAmount uint32 `json:"deduct_amount"` // 店员提成 + CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id + CooperativeName string `json:"cooperative_name"` // 合作商名称 + GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成 + PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成 + BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成 + RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量(自动) + RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量(自动) + RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量(自动) + UpgradeGoldToPlatinumCount uint32 `json:"upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(自动) + UpgradeGoldToBlackCount uint32 `json:"upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量(自动) + UpgradePlatinumToBlackCount uint32 `json:"upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量(自动) + InviteRenewalGoldCount uint32 `json:"invite_renewal_gold_count"` // 续费黄金会员数量(干预) + InviteRenewalPlatinumCount uint32 `json:"invite_renewal_platinum_count"` // 续费白金会员数量(干预) + InviteRenewalBlackGoldCount uint32 `json:"invite_renewal_black_gold_count"` // 续费黑金会员数量(干预) + InviteUpgradeGoldToPlatinumCount uint32 `json:"invite_upgrade_gold_to_platinum_count" gorm:"default:0"` // 升级:黄金->白金数量(干预) + InviteUpgradeGoldToBlackCount uint32 `json:"invite_upgrade_gold_to_black_count" gorm:"default:0"` // 升级:黄金->黑金数量(干预) + InviteUpgradePlatinumToBlackCount uint32 `json:"invite_upgrade_platinum_to_black_count" gorm:"default:0"` // 升级:白金->黑金数量(干预) + // invite_member_report + User *UserInfo `json:"user" gorm:"-"` + Store *Store `json:"store" gorm:"-"` // 门店 } type UserInviteListReq struct { @@ -889,11 +1121,12 @@ type UserInviteRecord struct { FromUid uint32 `json:"from_uid"` // 邀请人ID Action uint32 `json:"action"` // 1-未激活 2-激活邀请 SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级 - MemberLevel uint32 `json:"member_level"` // 会员等级 + MemberLevel uint32 `json:"member_level"` // 会员等级 0-未开通 1-普通 2-黄金 3-短期 4-白金 5-黑金 + MemberGenre uint32 `json:"member_genre"` // 会员类型 200-黄金年费 201-黄金季度 202-黄金半年 First uint32 `json:"first"` // 首次 Scan uint32 `json:"scan"` // 扫码 ActionTime time.Time `json:"action_time"` // 激活时间 - RenewHide uint32 `json:"renew_hide"` // 自动续费 + RenewHide uint32 `json:"renew_hide"` // 自动续费 1-自动 0-干预 ShopAssistantName string `json:"shop_assistant_name" gorm:"-"` // 店员名称 // user_invite_record } @@ -931,19 +1164,19 @@ func (m *UserInviteRecordReq) List() ([]UserInviteRecord, int64, error) { if m.MemberType != 0 { switch m.MemberType { - case 1: + case 1: // 首次邀请 qs = qs.Where("first=1").Where("spend_type=1") - case 2: + case 2: // 开通年费黄金 qs = qs.Where("member_level=2").Where("spend_type=2") - case 3: + case 3: // 开通年费白金 qs = qs.Where("member_level=4").Where("spend_type=2") - case 4: + case 4: // 开通年费黑金 qs = qs.Where("member_level=5").Where("spend_type=2") - case 5: + case 5: // 续费年费黄金 qs = qs.Where("member_level=2").Where("spend_type=3") - case 6: + case 6: // 续费年费白金 qs = qs.Where("member_level=4").Where("spend_type=3") - case 7: + case 7: // 续费年费黑金 qs = qs.Where("member_level=5").Where("spend_type=3") } } @@ -977,6 +1210,489 @@ func (m *UserInviteRecordReq) List() ([]UserInviteRecord, int64, error) { return records, count, nil } +type NewUserInviteRecordReq struct { + PageNum int `json:"pageIndex"` + PageSize int `json:"pageSize"` + StoreId uint32 `json:"store_id"` // 邀请人所属门店id + InviteUserName string `json:"invite_user_name"` // 邀请人昵称 + FromUid uint32 `json:"from_uid"` // 邀请人ID + ToUid uint32 `json:"to_uid"` // 用户ID + UserTel string `json:"user_tel"` // 用户手机号 + CreateStartTime time.Time `json:"create_start_time"` // 注册小程序时间-开始时间 + CreateEndTime time.Time `json:"create_end_time"` // 注册小程序时间-结束时间 + RecordType uint32 `json:"record_type"` // 记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动) + RecordStartTime time.Time `json:"record_start_time"` // 记录时间-开始时间 + RecordEndTime time.Time `json:"record_end_time"` // 记录时间-结束时间 + MemberLevel uint32 `json:"member_level"` // 当前类型:1-普通 2-黄金 4-白金 5-黑金 + IsExport uint32 `json:"is_export"` // 1-导出 +} + +type UserInviteRecordListResp struct { + List []UserInviteRecordListData `json:"list"` + Total int64 `json:"total"` // 总条数 + PageIndex int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 每页展示条数 + ExportUrl string `json:"export_url"` // 导出excel地址 +} + +type UserInviteRecordListData struct { + StoreId uint32 `json:"store_id"` // 邀请人所属门店id + StoreName string `json:"store_name"` // 邀请人所属门店名称 + InviteUserName string `json:"invite_user_name"` // 邀请人昵称 + InviteUid uint32 `json:"invite_uid"` // 邀请人ID + UserUid uint32 `json:"user_uid"` // 用户ID + UserTel string `json:"user_tel"` // 用户手机号 + CreateTime time.Time `json:"create_time"` // 注册小程序时间 + RecordType uint32 `json:"record_type"` // 记录类型 + RecordTime time.Time `json:"record_time"` // 记录时间 + MemberLevel uint32 `json:"member_level"` // 会员等级:1-普通 2-黄金 4-白金 5-黑金 + MemberExpire time.Time `json:"memberExpire"` // 租卡会员到期时间 +} + +func (m *NewUserInviteRecordReq) NewList() (*UserInviteRecordListResp, error) { + resp := new(UserInviteRecordListResp) + var records []struct { + UserInviteRecord + StoreId uint32 + InviteUserName string + UserTel string + CreateTime time.Time + MemberExpire time.Time + } + err := UpdateUserInviteRecordRenewHide() + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + + // 查询门店信息 + var storeList []Store + err = orm.Eloquent.Table("store").Find(&storeList).Error + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + storeMap := make(map[uint32]string, 0) + for i, _ := range storeList { + storeMap[storeList[i].ID] = storeList[i].Name + } + fmt.Println("storeMap is:", storeMap[13]) + + page := m.PageNum - 1 + pageSize := m.PageSize + + if page < 0 { + page = 0 + } + if pageSize == 0 { + pageSize = 10 + } + + qs := orm.Eloquent.Table("user_invite_record").Where("action=2") + countQuery := orm.Eloquent.Table("user_invite_record").Where("action=2"). + Select("user_invite_record.*, B1.store_id, B1.Shop_assistant_name AS InviteUserName, " + + "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire"). + Joins("JOIN user B1 ON user_invite_record.from_uid = B1.uid"). + Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid") + + if m.StoreId != 0 { + qs = qs.Where("B1.store_id=?", m.StoreId) + countQuery = countQuery.Where("B1.store_id=?", m.StoreId) + } + if m.InviteUserName != "" { + qs = qs.Where("B1.Shop_assistant_name=?", m.InviteUserName) + countQuery = countQuery.Where("B1.Shop_assistant_name=?", m.InviteUserName) + } + if m.FromUid != 0 { + qs = qs.Where("from_uid=?", m.FromUid) + countQuery = countQuery.Where("from_uid=?", m.FromUid) + } + if m.ToUid != 0 { + qs = qs.Where("to_uid=?", m.ToUid) + countQuery = countQuery.Where("to_uid=?", m.ToUid) + } + if m.UserTel != "" { + qs = qs.Where("B2.tel=?", m.UserTel) + countQuery = countQuery.Where("B2.tel=?", m.UserTel) + } + if !m.CreateStartTime.IsZero() { + qs = qs.Where("B2.created_at > ?", m.CreateStartTime) + countQuery = countQuery.Where("B2.created_at > ?", m.CreateStartTime) + } + if !m.CreateEndTime.IsZero() { + qs = qs.Where("B2.created_at < ?", m.CreateEndTime) + countQuery = countQuery.Where("B2.created_at < ?", m.CreateEndTime) + } + if m.RecordType != 0 { + switch m.RecordType { + case 1: // 首次邀请 + qs = qs.Where("first=1").Where("spend_type=1") + countQuery = countQuery.Where("first=1").Where("spend_type=1") + case 2: // 开通年费黄金 + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=2") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=2") + case 3: // 开通季度黄金 + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=201") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=201") + case 4: // 开通半年黄金 + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=202") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=2").Where("user_invite_record.member_genre=202") + case 5: // 开通年费白金 + qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=2") + countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=2") + case 6: // 开通年费黑金 + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=2") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=2") + + case 7: // 续费年费黄金(干预) + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=0") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=0") + case 8: // 续费年费白金(干预) + qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=0") + countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=0") + case 9: // 续费年费黑金(干预) + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=0") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=0") + + case 10: // 续费年费黄金(自动) + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1") + case 11: // 续费季度黄金(自动) + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1"). + Where("user_invite_record.member_genre=201") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1"). + Where("user_invite_record.member_genre=201") + case 12: // 续费半年黄金(自动) + qs = qs.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1"). + Where("user_invite_record.member_genre=202") + countQuery = countQuery.Where("user_invite_record.member_level=2").Where("spend_type=3").Where("renew_hide=1"). + Where("user_invite_record.member_genre=202") + case 13: // 续费年费白金(自动) + qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=1") + countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=3").Where("renew_hide=1") + case 14: // 续费年费黑金(自动) + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=1") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=3").Where("renew_hide=1") + + case 15: //黄金→白金(干预) + qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=0") + countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=0") + case 16: //黄金→黑金(干预) + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0"). + Where("user_invite_record.member_genre in (200,201,202)") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0"). + Where("user_invite_record.member_genre in (200,201,202)") + case 17: //白金→黑金(干预) + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0"). + Where("user_invite_record.member_genre not in (200,201,202)") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=0"). + Where("user_invite_record.member_genre not in (200,201,202)") + + case 18: //黄金→白金(自动) + qs = qs.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=1") + countQuery = countQuery.Where("user_invite_record.member_level=4").Where("spend_type=4").Where("renew_hide=1") + case 19: //黄金→黑金(自动) + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1"). + Where("user_invite_record.member_genre in (200,201,202)") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1"). + Where("user_invite_record.member_genre in (200,201,202)") + case 20: //白金→黑金(自动) + qs = qs.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1"). + Where("user_invite_record.member_genre not in (200,201,202)") + countQuery = countQuery.Where("user_invite_record.member_level=5").Where("spend_type=4").Where("renew_hide=1"). + Where("user_invite_record.member_genre not in (200,201,202)") + } + } + if !m.RecordStartTime.IsZero() { + qs = qs.Where("action_time > ?", m.RecordStartTime) + countQuery = countQuery.Where("action_time > ?", m.RecordStartTime) + } + if !m.RecordEndTime.IsZero() { + qs = qs.Where("action_time < ?", m.RecordEndTime) + countQuery = countQuery.Where("action_time < ?", m.RecordEndTime) + } + if m.MemberLevel != 0 { + qs = qs.Where("user_invite_record.member_level = ?", m.MemberLevel) + countQuery = countQuery.Where("user_invite_record.member_level = ?", m.MemberLevel) + } + + var count int64 + err = countQuery.Count(&count).Error + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + + if m.IsExport == 1 { // 导出excel + err = qs.Select("user_invite_record.*, B1.store_id, B1.Shop_assistant_name AS InviteUserName, " + + "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire"). + Joins("JOIN user B1 ON user_invite_record.from_uid = B1.uid"). + Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid"). + Order("action_time DESC"). + Find(&records).Error + if err != nil && err != RecordNotFound { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + } else { + err = qs.Select("user_invite_record.*, B1.store_id, B1.Shop_assistant_name AS InviteUserName, " + + "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire"). + Joins("JOIN user B1 ON user_invite_record.from_uid = B1.uid"). + Joins("JOIN user B2 ON user_invite_record.to_uid = B2.uid"). + Order("action_time DESC"). + Offset(page * pageSize). + Limit(pageSize). + Find(&records).Error + if err != nil && err != RecordNotFound { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + } + + var listData []UserInviteRecordListData + for _, item := range records { + data := UserInviteRecordListData{ + StoreId: item.StoreId, + StoreName: storeMap[item.StoreId], + InviteUserName: item.InviteUserName, + InviteUid: item.FromUid, + UserUid: item.ToUid, + UserTel: item.UserTel, + CreateTime: item.CreateTime, + RecordType: uint32(CalculateMemberType(item.SpendType, item.RenewHide, item.MemberGenre, item.MemberLevel)), + RecordTime: item.ActionTime, + MemberLevel: item.MemberLevel, + MemberExpire: item.MemberExpire, + } + listData = append(listData, data) + } + + if m.IsExport == 1 { + fileName, err := userInviteRecordExport(listData) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + resp.ExportUrl = fileName + } else { + resp.List = listData + resp.PageIndex = m.PageNum + resp.PageSize = m.PageSize + resp.Total = count + } + + return resp, nil +} + +// getMemberTypeChineseDescription 根据整数参数返回对应中文描述 +func getMemberTypeChineseDescription(memberType MemberType) string { + switch memberType { + case FirstInvite: + return "首次邀请" + case OpenAnnualGold: + return "开通年费黄金" + case OpenQuarterGold: + return "开通季度黄金" + case OpenHalfYearGold: + return "开通半年黄金" + case OpenAnnualPlatinum: + return "开通年费白金" + case OpenAnnualBlack: + return "开通年费黑金" + case RenewAnnualGoldIntervene: + return "续费年费黄金(干预)" + case RenewAnnualPlatinumIntervene: + return "续费年费白金(干预)" + case RenewAnnualBlackIntervene: + return "续费年费黑金(干预)" + case RenewAnnualGoldAuto: + return "续费年费黄金(自动)" + case RenewQuarterGoldAuto: + return "续费季度黄金(自动)" + case RenewHalfYearGoldAuto: + return "续费半年黄金(自动)" + case RenewAnnualPlatinumAuto: + return "续费年费白金(自动)" + case RenewAnnualBlackAuto: + return "续费年费黑金(自动)" + case UpgradeGoldToPlatinumIntervene: + return "黄金→白金(干预)" + case UpgradeGoldToBlackIntervene: + return "黄金→黑金(干预)" + case UpgradePlatinumToBlackIntervene: + return "白金→黑金(干预)" + case UpgradeGoldToPlatinumAuto: + return "黄金→白金(自动)" + case UpgradeGoldToBlackAuto: + return "黄金→黑金(自动)" + case UpgradePlatinumToBlackAuto: + return "白金→黑金(自动)" + default: + return "" + } +} + +// getMemberLevelChineseDescription 根据整数参数返回对应中文描述 +func getMemberLevelChineseDescription(memberLevel uint32) string { + switch memberLevel { + case 1: + return "普通会员" + case 2: + case 3: + return "黄金会员" + case 4: + return "白金会员" + case 5: + return "黑金会员" + } + + return "" +} + +// 导出会员邀请记录excel +func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { + file := excelize.NewFile() + fSheet := "Sheet1" + + url := ExportUrl + fileName := time.Now().Format(TimeFormat) + "会员邀请记录" + ".xlsx" + fmt.Println("url fileName:", url+fileName) + + title := []interface{}{"邀请人所属门店", "邀请人昵称", "邀请人ID", "用户ID", "手机号", "注册小程序时间", "记录类型", + "记录时间", "当前类型", "租卡会员到期时间"} + for i, _ := range title { + cell, _ := excelize.CoordinatesToCellName(1+i, 1) + err := file.SetCellValue(fSheet, cell, title[i]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + + var row []interface{} + nExcelStartRow := 0 + + for i := 0; i < len(list); i++ { + row = []interface{}{ + list[i].StoreName, // 邀请人所属门店 + list[i].InviteUserName, // 邀请人昵称 + list[i].InviteUid, // 邀请人ID + list[i].UserUid, // 用户ID + list[i].UserTel, // 手机号 + tools.ConvertTimeToString(list[i].CreateTime), // 注册小程序时间 + getMemberTypeChineseDescription(MemberType(list[i].RecordType)), // 记录类型 + tools.ConvertTimeToString(list[i].RecordTime), // 记录时间 + getMemberLevelChineseDescription(list[i].MemberLevel), // 当前类型 + tools.ConvertTimeToString(list[i].MemberExpire), // 租卡会员到期时间 + } + + for j, _ := range row { + cell, _ := excelize.CoordinatesToCellName(1+j, nExcelStartRow+2) + err := file.SetCellValue(fSheet, cell, row[j]) + if err != nil { + logger.Error("file set value err:", logger.Field("err", err)) + } + } + nExcelStartRow++ + } + + // 设置所有单元格的样式: 居中、加边框 + style, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center"}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + // 设置单元格的样式: 居中、加边框、自动换行 + style1, _ := file.NewStyle(`{"alignment":{"horizontal":"center","vertical":"center","wrap_text":true}, + "border":[{"type":"left","color":"000000","style":1}, + {"type":"top","color":"000000","style":1}, + {"type":"right","color":"000000","style":1}, + {"type":"bottom","color":"000000","style":1}]}`) + + endRow := fmt.Sprintf("J%d", nExcelStartRow+1) + // 设置单元格大小 + file.SetColWidth("Sheet1", "A", "A", 30) + file.SetColWidth("Sheet1", "B", "B", 12) + file.SetColWidth("Sheet1", "E", "E", 15) + file.SetColWidth("Sheet1", "F", "F", 20) + file.SetColWidth("Sheet1", "G", "G", 20) + file.SetColWidth("Sheet1", "H", "H", 20) + file.SetColWidth("Sheet1", "J", "J", 20) + // 应用样式到整个表格 + _ = file.SetCellStyle("Sheet1", "A1", "J1", style1) + _ = file.SetCellStyle("Sheet1", "A2", endRow, style) + + fmt.Println("save fileName:", config.ExportConfig.Path+fileName) + if err := file.SaveAs(config.ExportConfig.Path + fileName); err != nil { + fmt.Println(err) + } + return url + fileName, nil +} + +// CalculateMemberType 匹配记录类型 +func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) MemberType { + switch { + case spendType == 1: + return FirstInvite + case spendType == 2: + switch memberLevel { + case 2: + return OpenAnnualGold + case 4: + return OpenAnnualPlatinum + case 5: + return OpenAnnualBlack + } + case spendType == 3 && renewHide == 0: + switch memberLevel { + case 2: + return RenewAnnualGoldIntervene + case 4: + return RenewAnnualPlatinumIntervene + case 5: + return RenewAnnualBlackIntervene + } + case spendType == 3 && renewHide == 1: + switch memberLevel { + case 2: + return RenewAnnualGoldAuto + case 4: + return RenewAnnualPlatinumAuto + case 5: + return RenewAnnualBlackAuto + } + case spendType == 4 && renewHide == 0: + switch memberLevel { + case 4: + return UpgradeGoldToPlatinumIntervene + case 5: + if memberGenre == 200 || memberGenre == 201 || memberGenre == 202 { + return UpgradeGoldToBlackIntervene + } + return UpgradePlatinumToBlackIntervene + } + case spendType == 4 && renewHide == 1: + switch memberLevel { + case 4: + return UpgradeGoldToPlatinumAuto + case 5: + if memberGenre == 200 { + return UpgradeGoldToBlackAuto + } + return UpgradePlatinumToBlackAuto + } + case spendType == 2 && memberLevel == 2 && memberGenre == 201: + return OpenQuarterGold + case spendType == 2 && memberLevel == 2 && memberGenre == 202: + return OpenHalfYearGold + case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 201: + return RenewQuarterGoldAuto + case spendType == 3 && renewHide == 1 && memberLevel == 2 && memberGenre == 202: + return RenewHalfYearGoldAuto + } + return Unknown +} + func UpdateUserInviteRecordRenewHide() error { err := orm.Eloquent.Exec("UPDATE user_invite_record SET renew_hide=1 WHERE spend_type=3 AND scan=0 AND renew_hide!=1;").Error if err != nil { @@ -1847,13 +2563,18 @@ func GetSysUser(suid interface{}) (SysUser, error) { } type AssistantInviteMemberReportReq struct { - CooperativeBusinessId uint32 `json:"cooperative_business_id"` - //ParaCooperativeId uint32 `json:"para_cooperative_id"` - StoreId uint32 `json:"store_id"` // 门店id - SysUser SysUser `json:"sys_user"` - Date string `json:"date"` - Page int `json:"pageIndex"` - PageSize int `json:"pageSize"` + CooperativeBusinessId uint32 `json:"cooperative_business_id"` // 合作商id + StoreId uint32 `json:"store_id"` // 门店id + SysUser SysUser `json:"sys_user"` + Date string `json:"date"` // 日期 + Page int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 每页数量 +} + +type AssistantInviteMemberReportListResp struct { + Count int64 `json:"count"` + List []InviteMemberReport `json:"list"` + CurPage int `json:"cur_page"` } func (m *AssistantInviteMemberReportReq) List() ([]InviteMemberReport, int64, error) { @@ -1945,7 +2666,7 @@ func InviteMemberReportListSetUser(list []InviteMemberReport) []InviteMemberRepo for i, _ := range list { v, ok := infoMap[list[i].Uid] if ok { - list[i].UserInfo = &v + list[i].User = &v } fmt.Println("UserInfo:", v) } diff --git a/app/admin/models/user_vm.go b/app/admin/models/user_vm.go index 98b656e..4dc2551 100644 --- a/app/admin/models/user_vm.go +++ b/app/admin/models/user_vm.go @@ -5,15 +5,18 @@ import ( "fmt" orm "go-admin/common/global" "go-admin/logger" + "gorm.io/gorm" ) const ( - VmEventBuyGoods = "buy_goods" - VmEventOpenMember = "open_member" - VmEventInvite1Member = "invite_1_member" - VmEventInvite2Member = "invite_2_member" - VmEventUserShareCard = "user_share_card" - VmEventAttendance = "attendance" + VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣 + VmEventOpenMember = "open_member" // 开通会员奖励 + VmEventInvite1Member = "invite_1_member" // 邀请会员奖励 + VmEventInvite2Member = "invite_2_member" // 邀请会员奖励 + VmEventUserShareCard = "user_share_card" // 用户共享卡收益 + VmEventAttendance = "attendance" // 连续签到获取积分 + VmEventErpOrderSale = "erp_order_sale" // 零售销售获得积分 + VmEventErpOrderReject = "erp_order_reject" // 零售退货扣除积分 ) // 用户积分 @@ -34,15 +37,16 @@ type UserVm struct { type UserVmRecord struct { Model - Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` - BeforeVm uint32 `json:"before_vm"` // 变动前 - AfterVm uint32 `json:"after_vm"` // 变动后 - Alter int `json:"alter"` // 数值 - Event string `json:"event" gorm:"type:varchar(100)"` // 事件 - Describe string `json:"describe" gorm:"type:text"` // 描述 + Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` // 用户ID + BeforeVm uint32 `json:"before_vm"` // 变动前 + AfterVm uint32 `json:"after_vm"` // 变动后 + Alter int `json:"alter"` // 数值 + Event string `json:"event" gorm:"type:varchar(100)"` // 事件 + Describe string `json:"describe" gorm:"type:text"` // 描述 + User *UserInfo `json:"user,omitempty" gorm:"-"` } -func UserVmUpdate(uid uint32, amount int, event, describe string) error { +func UserVmUpdate(gdb *gorm.DB, uid uint32, amount int, event, describe string) error { var userVm UserVm err := orm.Eloquent.Table("user_vm"). Where("uid=?", uid).Find(&userVm).Error @@ -51,7 +55,13 @@ func UserVmUpdate(uid uint32, amount int, event, describe string) error { return err } - begin := orm.Eloquent.Begin() + flag := false + begin := gdb + if gdb == nil { + flag = true + begin = orm.Eloquent.Begin() + } + if err == RecordNotFound { if amount < 0 { begin.Rollback() @@ -93,11 +103,14 @@ func UserVmUpdate(uid uint32, amount int, event, describe string) error { return err } - err = begin.Commit().Error - if err != nil { - begin.Rollback() - logger.Error("err:", logger.Field("err", err)) - return err + if flag { + err = begin.Commit().Error + if err != nil { + begin.Rollback() + logger.Error("err:", logger.Field("err", err)) + return err + } } + return nil } diff --git a/app/admin/router/cooperativemanage.go b/app/admin/router/cooperativemanage.go index 4ce5c2c..e29dc7f 100644 --- a/app/admin/router/cooperativemanage.go +++ b/app/admin/router/cooperativemanage.go @@ -14,6 +14,7 @@ func registerCooperativeManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi { cooperativeBusiness.POST("list", cooperativemanage.CooperativeBusinessList) // 获取合作商列表 cooperativeBusiness.POST("add", cooperativemanage.CooperativeAdd) // 获取合作商 + cooperativeBusiness.POST("edit", cooperativemanage.CooperativeEdit) // 编辑供应商 cooperativeBusiness.POST("member_promotion/list", cooperativemanage.CooperativeMemberPromotionList) // 合作商推广会员列表 cooperativeBusiness.POST("member_promotion_store/list", cooperativemanage.CooperativeMemberPromotionStoreList) // 合作商推广会员门店列表 cooperativeBusiness.POST("member_promotion_day/list", cooperativemanage.CooperativeMemberPromotionDayList) // 合作商每天推广会员列表 @@ -35,6 +36,8 @@ func registerCooperativeManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.Gi cooperativeBusiness.POST("cannibalize_task_list", cooperativemanage.CooperativeCannibalizeTaskList) // 合作商调拨任务列表 cooperativeBusiness.POST("stock_export", cooperativemanage.CooperativeStockExport) // 合作商库存导出 cooperativeBusiness.POST("member_promotion_export", cooperativemanage.CooperativeMemberPromotionExport) // 合作商推广会员导出 + cooperativeBusiness.POST("set_pay_info", cooperativemanage.CooperativeSetPayInfo) // 设置支付信息 + cooperativeBusiness.POST("get_pay_info", cooperativemanage.CooperativeGetPayInfo) // 获取支付信息 } } diff --git a/app/admin/router/mallmanage.go b/app/admin/router/mallmanage.go index 4e0e73b..f340858 100644 --- a/app/admin/router/mallmanage.go +++ b/app/admin/router/mallmanage.go @@ -42,7 +42,7 @@ func registerMallManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMid goods.POST("goods/order/detail", mallmanage.GoodsOrderDetail) // 详情 goods.POST("goods/order/deliver", mallmanage.GoodsOrderDeliver) // 发货 goods.POST("goods/order/refund_send_receive", mallmanage.GoodsOrderRefundSendReceive) // 退货接收 - goods.POST("goods/user/vm_record", mallmanage.MallUserVmRecord) + goods.POST("goods/user/vm_record", mallmanage.MallUserVmRecord) // 用户积分记录 goods.POST("goods/attribute_add", mallmanage.GoodsAttributeAdd) // 添加规格 goods.POST("goods/attribute_m_del", mallmanage.GoodsAttributeMDel) // 删除规格 diff --git a/app/admin/router/usermanage.go b/app/admin/router/usermanage.go index ac8a0a8..f89a122 100644 --- a/app/admin/router/usermanage.go +++ b/app/admin/router/usermanage.go @@ -37,6 +37,7 @@ func registerUserManageUnAuthRouter(v1 *gin.RouterGroup) { userInfo.POST("/member_record_list_export", usermanage.UserMemberRecordListExport) userInfo.POST("/member_statistic_list", usermanage.UserMemberStatisticList) userInfo.POST("/user_invite_record_list", usermanage.UserInviteRecordList) + userInfo.POST("/new_user_invite_record_list", usermanage.NewUserInviteRecordList) userInfo.POST("/expire_member_sms_list", usermanage.ExpireMemberSmsSendRecordList) diff --git a/docs/docs.go b/docs/docs.go index 4751fef..bdd8179 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -818,6 +818,233 @@ const docTemplate = `{ } } }, + "/api/v1/cooperative/add": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "新增供应商", + "parameters": [ + { + "description": "新增供应商模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeBusiness" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/cooperative/edit": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "编辑供应商", + "parameters": [ + { + "description": "编辑供应商模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeBusiness" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/cooperative/get_pay_info": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "获取支付信息", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CooperativePayInfo" + } + } + } + } + }, + "/api/v1/cooperative/list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "查看供应商列表", + "parameters": [ + { + "description": "查看供应商列表模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeBusinessListReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CooperativeBusinessListResp" + } + } + } + } + }, + "/api/v1/cooperative/member_promotion/assistant_report": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "门店管理", + "v1.2.0" + ], + "summary": "店员绩效", + "parameters": [ + { + "description": "店员绩效模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.AssistantInviteMemberReportReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.AssistantInviteMemberReportListResp" + } + } + } + } + }, + "/api/v1/cooperative/member_promotion_statistic/list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.2.0" + ], + "summary": "租卡会员统计", + "parameters": [ + { + "description": "租卡会员统计模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeMemberPromotionStatisticReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CooperativeMemberPromotionStatisticListResp" + } + } + } + } + }, + "/api/v1/cooperative/set_pay_info": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "设置支付信息", + "parameters": [ + { + "description": "设置支付信息模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeSetPayInfoReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, "/api/v1/db/columns/page": { "get": { "description": "数据库表列分页列表 / database table column page list", @@ -2268,6 +2495,40 @@ const docTemplate = `{ } } }, + "/api/v1/mall/goods/user/vm_record": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "数据统计", + "V1.2.0" + ], + "summary": "用户积分记录", + "parameters": [ + { + "description": "用户积分记录模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.MallUserVmRecordReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.MallUserVmRecordResp" + } + } + } + } + }, "/api/v1/menu": { "get": { "security": [ @@ -3917,7 +4178,8 @@ const docTemplate = `{ "application/json" ], "tags": [ - "会员管理" + "会员管理", + "V1.2.0" ], "summary": "所有用户", "parameters": [ @@ -3935,7 +4197,41 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.U" + "$ref": "#/definitions/models.NewUserListResp" + } + } + } + } + }, + "/api/v1/user_info/new_user_invite_record_list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.2.0" + ], + "summary": "会员邀请记录", + "parameters": [ + { + "description": "会员邀请记录模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.NewUserInviteRecordReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.UserInviteRecordListResp" } } } @@ -4603,6 +4899,51 @@ const docTemplate = `{ } } }, + "models.AssistantInviteMemberReportListResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "cur_page": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.InviteMemberReport" + } + } + } + }, + "models.AssistantInviteMemberReportReq": { + "type": "object", + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "date": { + "description": "日期", + "type": "string" + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页数量", + "type": "integer" + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "sys_user": { + "$ref": "#/definitions/models.SysUser" + } + } + }, "models.BatchPrintInfo": { "type": "object", "required": [ @@ -4867,6 +5208,328 @@ const docTemplate = `{ } } }, + "models.CooperativeBusiness": { + "type": "object", + "required": [ + "avatar", + "name", + "password", + "tel", + "username" + ], + "properties": { + "add_time": { + "description": "加入时间", + "type": "string" + }, + "address": { + "description": "地址", + "type": "string" + }, + "avatar": { + "description": "logo", + "type": "string" + }, + "cooperative_assistant_member_deduct": { + "$ref": "#/definitions/models.CooperativeAssistantMemberDeduct" + }, + "cooperative_member_deduct": { + "$ref": "#/definitions/models.CooperativeMemberDeduct" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "name": { + "description": "供应商名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "tel": { + "description": "电话", + "type": "string" + }, + "username": { + "description": "用户名", + "type": "string" + } + } + }, + "models.CooperativeBusinessListReq": { + "type": "object", + "properties": { + "end_time": { + "description": "结束时间", + "type": "string" + }, + "pageIndex": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "start_time": { + "description": "开始时间", + "type": "string" + } + } + }, + "models.CooperativeBusinessListResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CooperativeBusiness" + } + }, + "pageIndex": { + "type": "integer" + }, + "total_page": { + "type": "integer" + } + } + }, + "models.CooperativeMemberDeduct": { + "type": "object", + "required": [ + "black_gold_deduct", + "gold_deduct", + "platinum_deduct", + "renewal_black_gold_deduct", + "renewal_gold_deduct", + "renewal_platinum_deduct" + ], + "properties": { + "black_gold_deduct": { + "description": "黑金金会员提成", + "type": "integer" + }, + "cooperative_business_id": { + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "gold_deduct": { + "description": "黄金会员提成", + "type": "integer" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "platinum_deduct": { + "description": "白金会员提成", + "type": "integer" + }, + "renewal_black_gold_deduct": { + "description": "续费黑金金会员提成", + "type": "integer" + }, + "renewal_gold_deduct": { + "description": "续费黄金会员提成", + "type": "integer" + }, + "renewal_platinum_deduct": { + "description": "续费白金会员提成", + "type": "integer" + } + } + }, + "models.CooperativeMemberPromotionStatistic": { + "type": "object", + "properties": { + "black_gold_count": { + "description": "黑金会员数量", + "type": "integer" + }, + "cooperative_business_id": { + "type": "integer" + }, + "cooperative_name": { + "description": "合作商名称", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "date": { + "type": "string" + }, + "day_time": { + "type": "string" + }, + "gold_count": { + "description": "黄金会员数量", + "type": "integer" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "platinum_count": { + "description": "白金会员数量", + "type": "integer" + }, + "renewal_black_gold_count": { + "description": "续费黑金会员数量", + "type": "integer" + }, + "renewal_gold_count": { + "description": "续费黄金会员数量", + "type": "integer" + }, + "renewal_platinum_count": { + "description": "续费白金会员数量", + "type": "integer" + }, + "store": { + "$ref": "#/definitions/models.Store" + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "upgrade_gold_to_black_count": { + "description": "升级:黄金-\u003e黑金数量", + "type": "integer" + }, + "upgrade_gold_to_platinum_count": { + "description": "升级:黄金-\u003e白金数量", + "type": "integer" + }, + "upgrade_platinum_to_black_count": { + "description": "升级:白金-\u003e黑金数量", + "type": "integer" + } + } + }, + "models.CooperativeMemberPromotionStatisticListResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CooperativeMemberPromotionStatistic" + } + }, + "pageIndex": { + "type": "integer" + } + } + }, + "models.CooperativeMemberPromotionStatisticReq": { + "type": "object", + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "end_date": { + "description": "结束月份", + "type": "string" + }, + "is_export": { + "description": "1-导出", + "type": "integer" + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页条数", + "type": "integer" + }, + "start_date": { + "description": "开始月份", + "type": "string" + }, + "store_id": { + "description": "门店ID", + "type": "integer" + }, + "type": { + "description": "1-按天展示 2-按月展示", + "type": "integer" + } + } + }, + "models.CooperativePayInfo": { + "type": "object", + "required": [ + "cooperative_business_id" + ], + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "union_pay_merchant_id": { + "description": "聚合支付平台商户号", + "type": "string" + }, + "wx_app_id": { + "description": "微信小程序AppID", + "type": "string" + }, + "wx_app_mchId": { + "description": "微信支付商户号", + "type": "string" + }, + "wx_app_mchSecret": { + "description": "微信支付商户密钥", + "type": "string" + } + } + }, + "models.CooperativeSetPayInfoReq": { + "type": "object", + "required": [ + "name", + "wx_app_mchId", + "wx_app_mchSecret" + ], + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "name": { + "description": "聚合支付平台商户号", + "type": "string" + }, + "wx_app_id": { + "description": "微信小程序AppID", + "type": "string" + }, + "wx_app_mchId": { + "description": "微信支付商户号", + "type": "string" + }, + "wx_app_mchSecret": { + "description": "微信支付商户密钥", + "type": "string" + } + } + }, "models.DictType": { "type": "object", "properties": { @@ -6690,6 +7353,131 @@ const docTemplate = `{ } } }, + "models.InviteMemberReport": { + "type": "object", + "properties": { + "black_gold_count": { + "description": "黑金数量", + "type": "integer" + }, + "black_gold_deduct": { + "description": "黑金会员提成", + "type": "integer" + }, + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "cooperative_name": { + "description": "合作商名称", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "date": { + "description": "ReportTime string ` + "`" + `json:\"report_time\" gorm:\"index\"` + "`" + ` // 业绩时间", + "type": "string" + }, + "deduct_amount": { + "description": "店员提成", + "type": "integer" + }, + "gold_count": { + "description": "黄金数量", + "type": "integer" + }, + "gold_deduct": { + "description": "黄金会员提成", + "type": "integer" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "invite_renewal_black_gold_count": { + "description": "续费黑金会员数量(干预)", + "type": "integer" + }, + "invite_renewal_gold_count": { + "description": "续费黄金会员数量(干预)", + "type": "integer" + }, + "invite_renewal_platinum_count": { + "description": "续费白金会员数量(干预)", + "type": "integer" + }, + "invite_upgrade_gold_to_black_count": { + "description": "升级:黄金-\u003e黑金数量(干预)", + "type": "integer" + }, + "invite_upgrade_gold_to_platinum_count": { + "description": "升级:黄金-\u003e白金数量(干预)", + "type": "integer" + }, + "invite_upgrade_platinum_to_black_count": { + "description": "升级:白金-\u003e黑金数量(干预)", + "type": "integer" + }, + "platinum_count": { + "description": "白金数量", + "type": "integer" + }, + "platinum_deduct": { + "description": "白金会员提成", + "type": "integer" + }, + "renewal_black_gold_count": { + "description": "续费黑金会员数量(自动)", + "type": "integer" + }, + "renewal_gold_count": { + "description": "续费黄金会员数量(自动)", + "type": "integer" + }, + "renewal_platinum_count": { + "description": "续费白金会员数量(自动)", + "type": "integer" + }, + "store": { + "description": "门店", + "allOf": [ + { + "$ref": "#/definitions/models.Store" + } + ] + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "uid": { + "description": "店员uid", + "type": "integer" + }, + "upgrade_gold_to_black_count": { + "description": "升级:黄金-\u003e黑金数量(自动)", + "type": "integer" + }, + "upgrade_gold_to_platinum_count": { + "description": "升级:黄金-\u003e白金数量(自动)", + "type": "integer" + }, + "upgrade_platinum_to_black_count": { + "description": "升级:白金-\u003e黑金数量(自动)", + "type": "integer" + }, + "user": { + "description": "invite_member_report", + "allOf": [ + { + "$ref": "#/definitions/models.UserInfo" + } + ] + } + } + }, "models.Login": { "type": "object", "required": [ @@ -6796,6 +7584,97 @@ const docTemplate = `{ } } }, + "models.MallUserVmRecordData": { + "type": "object", + "properties": { + "after_vm": { + "description": "变动后", + "type": "integer" + }, + "alter": { + "description": "数值", + "type": "integer" + }, + "before_vm": { + "description": "变动前", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "describe": { + "description": "描述", + "type": "string" + }, + "event": { + "description": "事件", + "type": "string" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "tel": { + "description": "用户手机号", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + }, + "user": { + "$ref": "#/definitions/models.UserInfo" + } + } + }, + "models.MallUserVmRecordReq": { + "type": "object", + "properties": { + "end_time": { + "description": "结束时间,示例:2006-01-02T15:04:05+08:00", + "type": "string" + }, + "pageIndex": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "start_time": { + "description": "开始时间,示例:2006-01-02T15:04:05+08:00", + "type": "string" + }, + "tel": { + "description": "用户手机号", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, + "models.MallUserVmRecordResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.MallUserVmRecordData" + } + }, + "page_index": { + "type": "integer" + }, + "page_size": { + "type": "integer" + } + } + }, "models.Menu": { "type": "object", "properties": { @@ -6885,6 +7764,65 @@ const docTemplate = `{ } } }, + "models.NewUserInviteRecordReq": { + "type": "object", + "properties": { + "create_end_time": { + "description": "注册小程序时间-结束时间", + "type": "string" + }, + "create_start_time": { + "description": "注册小程序时间-开始时间", + "type": "string" + }, + "from_uid": { + "description": "邀请人ID", + "type": "integer" + }, + "invite_user_name": { + "description": "邀请人昵称", + "type": "string" + }, + "is_export": { + "description": "1-导出", + "type": "integer" + }, + "member_level": { + "description": "当前类型:1-普通 2-黄金 4-白金 5-黑金", + "type": "integer" + }, + "pageIndex": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "record_end_time": { + "description": "记录时间-结束时间", + "type": "string" + }, + "record_start_time": { + "description": "记录时间-开始时间", + "type": "string" + }, + "record_type": { + "description": "记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动)", + "type": "integer" + }, + "store_id": { + "description": "邀请人所属门店id", + "type": "integer" + }, + "to_uid": { + "description": "用户ID", + "type": "integer" + }, + "user_tel": { + "description": "用户手机号", + "type": "string" + } + } + }, "models.NewUserListReq": { "type": "object", "properties": { @@ -6900,6 +7838,10 @@ const docTemplate = `{ "description": "是否过滤无滞纳金已标记用户", "type": "boolean" }, + "is_export": { + "description": "1-导出", + "type": "integer" + }, "memberLevel": { "description": "当前会员等级", "type": "integer" @@ -6943,6 +7885,38 @@ const docTemplate = `{ "uid": { "description": "用户id", "type": "integer" + }, + "user_type": { + "description": "用户类型 用户类型 1-普通用户 2-店员", + "type": "integer" + } + } + }, + "models.NewUserListResp": { + "type": "object", + "properties": { + "export_url": { + "description": "导出excel地址", + "type": "string" + }, + "list": { + "description": "用户数据", + "type": "array", + "items": { + "$ref": "#/definitions/models.U" + } + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页展示条数", + "type": "integer" + }, + "total": { + "description": "总条数", + "type": "integer" } } }, @@ -8546,7 +9520,7 @@ const docTemplate = `{ "type": "integer" }, "open_member_time": { - "description": "开通会员", + "description": "开通会员时间", "type": "string" }, "order_amount": { @@ -8713,7 +9687,7 @@ const docTemplate = `{ "type": "integer" }, "open_member_time": { - "description": "开通会员", + "description": "开通会员时间", "type": "string" }, "order_cards": { @@ -8776,6 +9750,82 @@ const docTemplate = `{ } } }, + "models.UserInviteRecordListData": { + "type": "object", + "properties": { + "create_time": { + "description": "注册小程序时间", + "type": "string" + }, + "invite_uid": { + "description": "邀请人ID", + "type": "integer" + }, + "invite_user_name": { + "description": "邀请人昵称", + "type": "string" + }, + "memberExpire": { + "description": "租卡会员到期时间", + "type": "string" + }, + "member_level": { + "description": "会员等级:1-普通 2-黄金 4-白金 5-黑金", + "type": "integer" + }, + "record_time": { + "description": "记录时间", + "type": "string" + }, + "record_type": { + "description": "记录类型", + "type": "integer" + }, + "store_id": { + "description": "邀请人所属门店id", + "type": "integer" + }, + "store_name": { + "description": "邀请人所属门店名称", + "type": "string" + }, + "user_tel": { + "description": "用户手机号", + "type": "string" + }, + "user_uid": { + "description": "用户ID", + "type": "integer" + } + } + }, + "models.UserInviteRecordListResp": { + "type": "object", + "properties": { + "export_url": { + "description": "导出excel地址", + "type": "string" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.UserInviteRecordListData" + } + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页展示条数", + "type": "integer" + }, + "total": { + "description": "总条数", + "type": "integer" + } + } + }, "tools.Params": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 771ed45..d3168e3 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -807,6 +807,233 @@ } } }, + "/api/v1/cooperative/add": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "新增供应商", + "parameters": [ + { + "description": "新增供应商模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeBusiness" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/cooperative/edit": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "编辑供应商", + "parameters": [ + { + "description": "编辑供应商模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeBusiness" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/cooperative/get_pay_info": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "获取支付信息", + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CooperativePayInfo" + } + } + } + } + }, + "/api/v1/cooperative/list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "查看供应商列表", + "parameters": [ + { + "description": "查看供应商列表模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeBusinessListReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CooperativeBusinessListResp" + } + } + } + } + }, + "/api/v1/cooperative/member_promotion/assistant_report": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "门店管理", + "v1.2.0" + ], + "summary": "店员绩效", + "parameters": [ + { + "description": "店员绩效模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.AssistantInviteMemberReportReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.AssistantInviteMemberReportListResp" + } + } + } + } + }, + "/api/v1/cooperative/member_promotion_statistic/list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.2.0" + ], + "summary": "租卡会员统计", + "parameters": [ + { + "description": "租卡会员统计模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeMemberPromotionStatisticReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.CooperativeMemberPromotionStatisticListResp" + } + } + } + } + }, + "/api/v1/cooperative/set_pay_info": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "合作商", + "v1.2.0" + ], + "summary": "设置支付信息", + "parameters": [ + { + "description": "设置支付信息模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CooperativeSetPayInfoReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, "/api/v1/db/columns/page": { "get": { "description": "数据库表列分页列表 / database table column page list", @@ -2257,6 +2484,40 @@ } } }, + "/api/v1/mall/goods/user/vm_record": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "数据统计", + "V1.2.0" + ], + "summary": "用户积分记录", + "parameters": [ + { + "description": "用户积分记录模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.MallUserVmRecordReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.MallUserVmRecordResp" + } + } + } + } + }, "/api/v1/menu": { "get": { "security": [ @@ -3906,7 +4167,8 @@ "application/json" ], "tags": [ - "会员管理" + "会员管理", + "V1.2.0" ], "summary": "所有用户", "parameters": [ @@ -3924,7 +4186,41 @@ "200": { "description": "OK", "schema": { - "$ref": "#/definitions/models.U" + "$ref": "#/definitions/models.NewUserListResp" + } + } + } + } + }, + "/api/v1/user_info/new_user_invite_record_list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.2.0" + ], + "summary": "会员邀请记录", + "parameters": [ + { + "description": "会员邀请记录模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.NewUserInviteRecordReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.UserInviteRecordListResp" } } } @@ -4592,6 +4888,51 @@ } } }, + "models.AssistantInviteMemberReportListResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "cur_page": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.InviteMemberReport" + } + } + } + }, + "models.AssistantInviteMemberReportReq": { + "type": "object", + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "date": { + "description": "日期", + "type": "string" + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页数量", + "type": "integer" + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "sys_user": { + "$ref": "#/definitions/models.SysUser" + } + } + }, "models.BatchPrintInfo": { "type": "object", "required": [ @@ -4856,6 +5197,328 @@ } } }, + "models.CooperativeBusiness": { + "type": "object", + "required": [ + "avatar", + "name", + "password", + "tel", + "username" + ], + "properties": { + "add_time": { + "description": "加入时间", + "type": "string" + }, + "address": { + "description": "地址", + "type": "string" + }, + "avatar": { + "description": "logo", + "type": "string" + }, + "cooperative_assistant_member_deduct": { + "$ref": "#/definitions/models.CooperativeAssistantMemberDeduct" + }, + "cooperative_member_deduct": { + "$ref": "#/definitions/models.CooperativeMemberDeduct" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "name": { + "description": "供应商名称", + "type": "string" + }, + "password": { + "description": "密码", + "type": "string" + }, + "tel": { + "description": "电话", + "type": "string" + }, + "username": { + "description": "用户名", + "type": "string" + } + } + }, + "models.CooperativeBusinessListReq": { + "type": "object", + "properties": { + "end_time": { + "description": "结束时间", + "type": "string" + }, + "pageIndex": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "start_time": { + "description": "开始时间", + "type": "string" + } + } + }, + "models.CooperativeBusinessListResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CooperativeBusiness" + } + }, + "pageIndex": { + "type": "integer" + }, + "total_page": { + "type": "integer" + } + } + }, + "models.CooperativeMemberDeduct": { + "type": "object", + "required": [ + "black_gold_deduct", + "gold_deduct", + "platinum_deduct", + "renewal_black_gold_deduct", + "renewal_gold_deduct", + "renewal_platinum_deduct" + ], + "properties": { + "black_gold_deduct": { + "description": "黑金金会员提成", + "type": "integer" + }, + "cooperative_business_id": { + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "gold_deduct": { + "description": "黄金会员提成", + "type": "integer" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "platinum_deduct": { + "description": "白金会员提成", + "type": "integer" + }, + "renewal_black_gold_deduct": { + "description": "续费黑金金会员提成", + "type": "integer" + }, + "renewal_gold_deduct": { + "description": "续费黄金会员提成", + "type": "integer" + }, + "renewal_platinum_deduct": { + "description": "续费白金会员提成", + "type": "integer" + } + } + }, + "models.CooperativeMemberPromotionStatistic": { + "type": "object", + "properties": { + "black_gold_count": { + "description": "黑金会员数量", + "type": "integer" + }, + "cooperative_business_id": { + "type": "integer" + }, + "cooperative_name": { + "description": "合作商名称", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "date": { + "type": "string" + }, + "day_time": { + "type": "string" + }, + "gold_count": { + "description": "黄金会员数量", + "type": "integer" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "platinum_count": { + "description": "白金会员数量", + "type": "integer" + }, + "renewal_black_gold_count": { + "description": "续费黑金会员数量", + "type": "integer" + }, + "renewal_gold_count": { + "description": "续费黄金会员数量", + "type": "integer" + }, + "renewal_platinum_count": { + "description": "续费白金会员数量", + "type": "integer" + }, + "store": { + "$ref": "#/definitions/models.Store" + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "upgrade_gold_to_black_count": { + "description": "升级:黄金-\u003e黑金数量", + "type": "integer" + }, + "upgrade_gold_to_platinum_count": { + "description": "升级:黄金-\u003e白金数量", + "type": "integer" + }, + "upgrade_platinum_to_black_count": { + "description": "升级:白金-\u003e黑金数量", + "type": "integer" + } + } + }, + "models.CooperativeMemberPromotionStatisticListResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.CooperativeMemberPromotionStatistic" + } + }, + "pageIndex": { + "type": "integer" + } + } + }, + "models.CooperativeMemberPromotionStatisticReq": { + "type": "object", + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "end_date": { + "description": "结束月份", + "type": "string" + }, + "is_export": { + "description": "1-导出", + "type": "integer" + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页条数", + "type": "integer" + }, + "start_date": { + "description": "开始月份", + "type": "string" + }, + "store_id": { + "description": "门店ID", + "type": "integer" + }, + "type": { + "description": "1-按天展示 2-按月展示", + "type": "integer" + } + } + }, + "models.CooperativePayInfo": { + "type": "object", + "required": [ + "cooperative_business_id" + ], + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "union_pay_merchant_id": { + "description": "聚合支付平台商户号", + "type": "string" + }, + "wx_app_id": { + "description": "微信小程序AppID", + "type": "string" + }, + "wx_app_mchId": { + "description": "微信支付商户号", + "type": "string" + }, + "wx_app_mchSecret": { + "description": "微信支付商户密钥", + "type": "string" + } + } + }, + "models.CooperativeSetPayInfoReq": { + "type": "object", + "required": [ + "name", + "wx_app_mchId", + "wx_app_mchSecret" + ], + "properties": { + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "name": { + "description": "聚合支付平台商户号", + "type": "string" + }, + "wx_app_id": { + "description": "微信小程序AppID", + "type": "string" + }, + "wx_app_mchId": { + "description": "微信支付商户号", + "type": "string" + }, + "wx_app_mchSecret": { + "description": "微信支付商户密钥", + "type": "string" + } + } + }, "models.DictType": { "type": "object", "properties": { @@ -6679,6 +7342,131 @@ } } }, + "models.InviteMemberReport": { + "type": "object", + "properties": { + "black_gold_count": { + "description": "黑金数量", + "type": "integer" + }, + "black_gold_deduct": { + "description": "黑金会员提成", + "type": "integer" + }, + "cooperative_business_id": { + "description": "合作商id", + "type": "integer" + }, + "cooperative_name": { + "description": "合作商名称", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "date": { + "description": "ReportTime string `json:\"report_time\" gorm:\"index\"` // 业绩时间", + "type": "string" + }, + "deduct_amount": { + "description": "店员提成", + "type": "integer" + }, + "gold_count": { + "description": "黄金数量", + "type": "integer" + }, + "gold_deduct": { + "description": "黄金会员提成", + "type": "integer" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "invite_renewal_black_gold_count": { + "description": "续费黑金会员数量(干预)", + "type": "integer" + }, + "invite_renewal_gold_count": { + "description": "续费黄金会员数量(干预)", + "type": "integer" + }, + "invite_renewal_platinum_count": { + "description": "续费白金会员数量(干预)", + "type": "integer" + }, + "invite_upgrade_gold_to_black_count": { + "description": "升级:黄金-\u003e黑金数量(干预)", + "type": "integer" + }, + "invite_upgrade_gold_to_platinum_count": { + "description": "升级:黄金-\u003e白金数量(干预)", + "type": "integer" + }, + "invite_upgrade_platinum_to_black_count": { + "description": "升级:白金-\u003e黑金数量(干预)", + "type": "integer" + }, + "platinum_count": { + "description": "白金数量", + "type": "integer" + }, + "platinum_deduct": { + "description": "白金会员提成", + "type": "integer" + }, + "renewal_black_gold_count": { + "description": "续费黑金会员数量(自动)", + "type": "integer" + }, + "renewal_gold_count": { + "description": "续费黄金会员数量(自动)", + "type": "integer" + }, + "renewal_platinum_count": { + "description": "续费白金会员数量(自动)", + "type": "integer" + }, + "store": { + "description": "门店", + "allOf": [ + { + "$ref": "#/definitions/models.Store" + } + ] + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "uid": { + "description": "店员uid", + "type": "integer" + }, + "upgrade_gold_to_black_count": { + "description": "升级:黄金-\u003e黑金数量(自动)", + "type": "integer" + }, + "upgrade_gold_to_platinum_count": { + "description": "升级:黄金-\u003e白金数量(自动)", + "type": "integer" + }, + "upgrade_platinum_to_black_count": { + "description": "升级:白金-\u003e黑金数量(自动)", + "type": "integer" + }, + "user": { + "description": "invite_member_report", + "allOf": [ + { + "$ref": "#/definitions/models.UserInfo" + } + ] + } + } + }, "models.Login": { "type": "object", "required": [ @@ -6785,6 +7573,97 @@ } } }, + "models.MallUserVmRecordData": { + "type": "object", + "properties": { + "after_vm": { + "description": "变动后", + "type": "integer" + }, + "alter": { + "description": "数值", + "type": "integer" + }, + "before_vm": { + "description": "变动前", + "type": "integer" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "describe": { + "description": "描述", + "type": "string" + }, + "event": { + "description": "事件", + "type": "string" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "tel": { + "description": "用户手机号", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + }, + "user": { + "$ref": "#/definitions/models.UserInfo" + } + } + }, + "models.MallUserVmRecordReq": { + "type": "object", + "properties": { + "end_time": { + "description": "结束时间,示例:2006-01-02T15:04:05+08:00", + "type": "string" + }, + "pageIndex": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "start_time": { + "description": "开始时间,示例:2006-01-02T15:04:05+08:00", + "type": "string" + }, + "tel": { + "description": "用户手机号", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, + "models.MallUserVmRecordResp": { + "type": "object", + "properties": { + "count": { + "type": "integer" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.MallUserVmRecordData" + } + }, + "page_index": { + "type": "integer" + }, + "page_size": { + "type": "integer" + } + } + }, "models.Menu": { "type": "object", "properties": { @@ -6874,6 +7753,65 @@ } } }, + "models.NewUserInviteRecordReq": { + "type": "object", + "properties": { + "create_end_time": { + "description": "注册小程序时间-结束时间", + "type": "string" + }, + "create_start_time": { + "description": "注册小程序时间-开始时间", + "type": "string" + }, + "from_uid": { + "description": "邀请人ID", + "type": "integer" + }, + "invite_user_name": { + "description": "邀请人昵称", + "type": "string" + }, + "is_export": { + "description": "1-导出", + "type": "integer" + }, + "member_level": { + "description": "当前类型:1-普通 2-黄金 4-白金 5-黑金", + "type": "integer" + }, + "pageIndex": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "record_end_time": { + "description": "记录时间-结束时间", + "type": "string" + }, + "record_start_time": { + "description": "记录时间-开始时间", + "type": "string" + }, + "record_type": { + "description": "记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动)", + "type": "integer" + }, + "store_id": { + "description": "邀请人所属门店id", + "type": "integer" + }, + "to_uid": { + "description": "用户ID", + "type": "integer" + }, + "user_tel": { + "description": "用户手机号", + "type": "string" + } + } + }, "models.NewUserListReq": { "type": "object", "properties": { @@ -6889,6 +7827,10 @@ "description": "是否过滤无滞纳金已标记用户", "type": "boolean" }, + "is_export": { + "description": "1-导出", + "type": "integer" + }, "memberLevel": { "description": "当前会员等级", "type": "integer" @@ -6932,6 +7874,38 @@ "uid": { "description": "用户id", "type": "integer" + }, + "user_type": { + "description": "用户类型 用户类型 1-普通用户 2-店员", + "type": "integer" + } + } + }, + "models.NewUserListResp": { + "type": "object", + "properties": { + "export_url": { + "description": "导出excel地址", + "type": "string" + }, + "list": { + "description": "用户数据", + "type": "array", + "items": { + "$ref": "#/definitions/models.U" + } + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页展示条数", + "type": "integer" + }, + "total": { + "description": "总条数", + "type": "integer" } } }, @@ -8535,7 +9509,7 @@ "type": "integer" }, "open_member_time": { - "description": "开通会员", + "description": "开通会员时间", "type": "string" }, "order_amount": { @@ -8702,7 +9676,7 @@ "type": "integer" }, "open_member_time": { - "description": "开通会员", + "description": "开通会员时间", "type": "string" }, "order_cards": { @@ -8765,6 +9739,82 @@ } } }, + "models.UserInviteRecordListData": { + "type": "object", + "properties": { + "create_time": { + "description": "注册小程序时间", + "type": "string" + }, + "invite_uid": { + "description": "邀请人ID", + "type": "integer" + }, + "invite_user_name": { + "description": "邀请人昵称", + "type": "string" + }, + "memberExpire": { + "description": "租卡会员到期时间", + "type": "string" + }, + "member_level": { + "description": "会员等级:1-普通 2-黄金 4-白金 5-黑金", + "type": "integer" + }, + "record_time": { + "description": "记录时间", + "type": "string" + }, + "record_type": { + "description": "记录类型", + "type": "integer" + }, + "store_id": { + "description": "邀请人所属门店id", + "type": "integer" + }, + "store_name": { + "description": "邀请人所属门店名称", + "type": "string" + }, + "user_tel": { + "description": "用户手机号", + "type": "string" + }, + "user_uid": { + "description": "用户ID", + "type": "integer" + } + } + }, + "models.UserInviteRecordListResp": { + "type": "object", + "properties": { + "export_url": { + "description": "导出excel地址", + "type": "string" + }, + "list": { + "type": "array", + "items": { + "$ref": "#/definitions/models.UserInviteRecordListData" + } + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "每页展示条数", + "type": "integer" + }, + "total": { + "description": "总条数", + "type": "integer" + } + } + }, "tools.Params": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 287a4cc..aaa87ae 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -417,6 +417,37 @@ definitions: required: - id type: object + models.AssistantInviteMemberReportListResp: + properties: + count: + type: integer + cur_page: + type: integer + list: + items: + $ref: '#/definitions/models.InviteMemberReport' + type: array + type: object + models.AssistantInviteMemberReportReq: + properties: + cooperative_business_id: + description: 合作商id + type: integer + date: + description: 日期 + type: string + pageIndex: + description: 页码 + type: integer + pageSize: + description: 每页数量 + type: integer + store_id: + description: 门店id + type: integer + sys_user: + $ref: '#/definitions/models.SysUser' + type: object models.BatchPrintInfo: properties: erp_commodity_name: @@ -610,6 +641,238 @@ definitions: store_id: type: integer type: object + models.CooperativeBusiness: + properties: + add_time: + description: 加入时间 + type: string + address: + description: 地址 + type: string + avatar: + description: logo + type: string + cooperative_assistant_member_deduct: + $ref: '#/definitions/models.CooperativeAssistantMemberDeduct' + cooperative_member_deduct: + $ref: '#/definitions/models.CooperativeMemberDeduct' + createdAt: + description: 创建时间 + type: string + id: + description: 数据库记录编号 + type: integer + name: + description: 供应商名称 + type: string + password: + description: 密码 + type: string + tel: + description: 电话 + type: string + username: + description: 用户名 + type: string + required: + - avatar + - name + - password + - tel + - username + type: object + models.CooperativeBusinessListReq: + properties: + end_time: + description: 结束时间 + type: string + pageIndex: + type: integer + pageSize: + type: integer + start_time: + description: 开始时间 + type: string + type: object + models.CooperativeBusinessListResp: + properties: + count: + type: integer + list: + items: + $ref: '#/definitions/models.CooperativeBusiness' + type: array + pageIndex: + type: integer + total_page: + type: integer + type: object + models.CooperativeMemberDeduct: + properties: + black_gold_deduct: + description: 黑金金会员提成 + type: integer + cooperative_business_id: + type: integer + createdAt: + description: 创建时间 + type: string + gold_deduct: + description: 黄金会员提成 + type: integer + id: + description: 数据库记录编号 + type: integer + platinum_deduct: + description: 白金会员提成 + type: integer + renewal_black_gold_deduct: + description: 续费黑金金会员提成 + type: integer + renewal_gold_deduct: + description: 续费黄金会员提成 + type: integer + renewal_platinum_deduct: + description: 续费白金会员提成 + type: integer + required: + - black_gold_deduct + - gold_deduct + - platinum_deduct + - renewal_black_gold_deduct + - renewal_gold_deduct + - renewal_platinum_deduct + type: object + models.CooperativeMemberPromotionStatistic: + properties: + black_gold_count: + description: 黑金会员数量 + type: integer + cooperative_business_id: + type: integer + cooperative_name: + description: 合作商名称 + type: string + createdAt: + description: 创建时间 + type: string + date: + type: string + day_time: + type: string + gold_count: + description: 黄金会员数量 + type: integer + id: + description: 数据库记录编号 + type: integer + platinum_count: + description: 白金会员数量 + type: integer + renewal_black_gold_count: + description: 续费黑金会员数量 + type: integer + renewal_gold_count: + description: 续费黄金会员数量 + type: integer + renewal_platinum_count: + description: 续费白金会员数量 + type: integer + store: + $ref: '#/definitions/models.Store' + store_id: + description: 门店id + type: integer + upgrade_gold_to_black_count: + description: 升级:黄金->黑金数量 + type: integer + upgrade_gold_to_platinum_count: + description: 升级:黄金->白金数量 + type: integer + upgrade_platinum_to_black_count: + description: 升级:白金->黑金数量 + type: integer + type: object + models.CooperativeMemberPromotionStatisticListResp: + properties: + count: + type: integer + list: + items: + $ref: '#/definitions/models.CooperativeMemberPromotionStatistic' + type: array + pageIndex: + type: integer + type: object + models.CooperativeMemberPromotionStatisticReq: + properties: + cooperative_business_id: + description: 合作商id + type: integer + end_date: + description: 结束月份 + type: string + is_export: + description: 1-导出 + type: integer + pageIndex: + description: 页码 + type: integer + pageSize: + description: 每页条数 + type: integer + start_date: + description: 开始月份 + type: string + store_id: + description: 门店ID + type: integer + type: + description: 1-按天展示 2-按月展示 + type: integer + type: object + models.CooperativePayInfo: + properties: + cooperative_business_id: + description: 合作商id + type: integer + union_pay_merchant_id: + description: 聚合支付平台商户号 + type: string + wx_app_id: + description: 微信小程序AppID + type: string + wx_app_mchId: + description: 微信支付商户号 + type: string + wx_app_mchSecret: + description: 微信支付商户密钥 + type: string + required: + - cooperative_business_id + type: object + models.CooperativeSetPayInfoReq: + properties: + cooperative_business_id: + description: 合作商id + type: integer + name: + description: 聚合支付平台商户号 + type: string + wx_app_id: + description: 微信小程序AppID + type: string + wx_app_mchId: + description: 微信支付商户号 + type: string + wx_app_mchSecret: + description: 微信支付商户密钥 + type: string + required: + - name + - wx_app_mchId + - wx_app_mchSecret + type: object models.DictType: properties: createBy: @@ -1939,6 +2202,96 @@ definitions: description: 用户名 type: string type: object + models.InviteMemberReport: + properties: + black_gold_count: + description: 黑金数量 + type: integer + black_gold_deduct: + description: 黑金会员提成 + type: integer + cooperative_business_id: + description: 合作商id + type: integer + cooperative_name: + description: 合作商名称 + type: string + createdAt: + description: 创建时间 + type: string + date: + description: ReportTime string `json:"report_time" gorm:"index"` // + 业绩时间 + type: string + deduct_amount: + description: 店员提成 + type: integer + gold_count: + description: 黄金数量 + type: integer + gold_deduct: + description: 黄金会员提成 + type: integer + id: + description: 数据库记录编号 + type: integer + invite_renewal_black_gold_count: + description: 续费黑金会员数量(干预) + type: integer + invite_renewal_gold_count: + description: 续费黄金会员数量(干预) + type: integer + invite_renewal_platinum_count: + description: 续费白金会员数量(干预) + type: integer + invite_upgrade_gold_to_black_count: + description: 升级:黄金->黑金数量(干预) + type: integer + invite_upgrade_gold_to_platinum_count: + description: 升级:黄金->白金数量(干预) + type: integer + invite_upgrade_platinum_to_black_count: + description: 升级:白金->黑金数量(干预) + type: integer + platinum_count: + description: 白金数量 + type: integer + platinum_deduct: + description: 白金会员提成 + type: integer + renewal_black_gold_count: + description: 续费黑金会员数量(自动) + type: integer + renewal_gold_count: + description: 续费黄金会员数量(自动) + type: integer + renewal_platinum_count: + description: 续费白金会员数量(自动) + type: integer + store: + allOf: + - $ref: '#/definitions/models.Store' + description: 门店 + store_id: + description: 门店id + type: integer + uid: + description: 店员uid + type: integer + upgrade_gold_to_black_count: + description: 升级:黄金->黑金数量(自动) + type: integer + upgrade_gold_to_platinum_count: + description: 升级:黄金->白金数量(自动) + type: integer + upgrade_platinum_to_black_count: + description: 升级:白金->黑金数量(自动) + type: integer + user: + allOf: + - $ref: '#/definitions/models.UserInfo' + description: invite_member_report + type: object models.Login: properties: code: @@ -2016,6 +2369,70 @@ definitions: description: 用户名 type: string type: object + models.MallUserVmRecordData: + properties: + after_vm: + description: 变动后 + type: integer + alter: + description: 数值 + type: integer + before_vm: + description: 变动前 + type: integer + createdAt: + description: 创建时间 + type: string + describe: + description: 描述 + type: string + event: + description: 事件 + type: string + id: + description: 数据库记录编号 + type: integer + tel: + description: 用户手机号 + type: string + uid: + description: 用户ID + type: integer + user: + $ref: '#/definitions/models.UserInfo' + type: object + models.MallUserVmRecordReq: + properties: + end_time: + description: 结束时间,示例:2006-01-02T15:04:05+08:00 + type: string + pageIndex: + type: integer + pageSize: + type: integer + start_time: + description: 开始时间,示例:2006-01-02T15:04:05+08:00 + type: string + tel: + description: 用户手机号 + type: string + uid: + description: 用户ID + type: integer + type: object + models.MallUserVmRecordResp: + properties: + count: + type: integer + list: + items: + $ref: '#/definitions/models.MallUserVmRecordData' + type: array + page_index: + type: integer + page_size: + type: integer + type: object models.Menu: properties: action: @@ -2076,6 +2493,50 @@ definitions: visible: type: string type: object + models.NewUserInviteRecordReq: + properties: + create_end_time: + description: 注册小程序时间-结束时间 + type: string + create_start_time: + description: 注册小程序时间-开始时间 + type: string + from_uid: + description: 邀请人ID + type: integer + invite_user_name: + description: 邀请人昵称 + type: string + is_export: + description: 1-导出 + type: integer + member_level: + description: 当前类型:1-普通 2-黄金 4-白金 5-黑金 + type: integer + pageIndex: + type: integer + pageSize: + type: integer + record_end_time: + description: 记录时间-结束时间 + type: string + record_start_time: + description: 记录时间-开始时间 + type: string + record_type: + description: 记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), + 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动) + type: integer + store_id: + description: 邀请人所属门店id + type: integer + to_uid: + description: 用户ID + type: integer + user_tel: + description: 用户手机号 + type: string + type: object models.NewUserListReq: properties: create_endTime: @@ -2087,6 +2548,9 @@ definitions: filter: description: 是否过滤无滞纳金已标记用户 type: boolean + is_export: + description: 1-导出 + type: integer memberLevel: description: 当前会员等级 type: integer @@ -2120,6 +2584,29 @@ definitions: uid: description: 用户id type: integer + user_type: + description: 用户类型 用户类型 1-普通用户 2-店员 + type: integer + type: object + models.NewUserListResp: + properties: + export_url: + description: 导出excel地址 + type: string + list: + description: 用户数据 + items: + $ref: '#/definitions/models.U' + type: array + pageIndex: + description: 页码 + type: integer + pageSize: + description: 每页展示条数 + type: integer + total: + description: 总条数 + type: integer type: object models.Order: properties: @@ -3274,7 +3761,7 @@ definitions: description: 开通会员级别:2-黄金会员 4-白金会员 5-黑金会员 type: integer open_member_time: - description: 开通会员 + description: 开通会员时间 type: string order_amount: description: 消费金额 @@ -3396,7 +3883,7 @@ definitions: description: 开通会员级别:2-黄金会员 4-白金会员 5-黑金会员 type: integer open_member_time: - description: 开通会员 + description: 开通会员时间 type: string order_cards: items: @@ -3441,6 +3928,61 @@ definitions: description: 角色id type: integer type: object + models.UserInviteRecordListData: + properties: + create_time: + description: 注册小程序时间 + type: string + invite_uid: + description: 邀请人ID + type: integer + invite_user_name: + description: 邀请人昵称 + type: string + member_level: + description: 会员等级:1-普通 2-黄金 4-白金 5-黑金 + type: integer + memberExpire: + description: 租卡会员到期时间 + type: string + record_time: + description: 记录时间 + type: string + record_type: + description: 记录类型 + type: integer + store_id: + description: 邀请人所属门店id + type: integer + store_name: + description: 邀请人所属门店名称 + type: string + user_tel: + description: 用户手机号 + type: string + user_uid: + description: 用户ID + type: integer + type: object + models.UserInviteRecordListResp: + properties: + export_url: + description: 导出excel地址 + type: string + list: + items: + $ref: '#/definitions/models.UserInviteRecordListData' + type: array + pageIndex: + description: 页码 + type: integer + pageSize: + description: 每页展示条数 + type: integer + total: + description: 总条数 + type: integer + type: object tools.Params: properties: treeCode: @@ -4128,6 +4670,153 @@ paths: summary: 配置列表数据 tags: - system/配置 + /api/v1/cooperative/add: + post: + consumes: + - application/json + parameters: + - description: 新增供应商模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.CooperativeBusiness' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/app.Response' + summary: 新增供应商 + tags: + - 合作商 + - v1.2.0 + /api/v1/cooperative/edit: + post: + consumes: + - application/json + parameters: + - description: 编辑供应商模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.CooperativeBusiness' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/app.Response' + summary: 编辑供应商 + tags: + - 合作商 + - v1.2.0 + /api/v1/cooperative/get_pay_info: + post: + consumes: + - application/json + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CooperativePayInfo' + summary: 获取支付信息 + tags: + - 合作商 + - v1.2.0 + /api/v1/cooperative/list: + post: + consumes: + - application/json + parameters: + - description: 查看供应商列表模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.CooperativeBusinessListReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CooperativeBusinessListResp' + summary: 查看供应商列表 + tags: + - 合作商 + - v1.2.0 + /api/v1/cooperative/member_promotion/assistant_report: + post: + consumes: + - application/json + parameters: + - description: 店员绩效模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.AssistantInviteMemberReportReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.AssistantInviteMemberReportListResp' + summary: 店员绩效 + tags: + - 门店管理 + - v1.2.0 + /api/v1/cooperative/member_promotion_statistic/list: + post: + consumes: + - application/json + parameters: + - description: 租卡会员统计模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.CooperativeMemberPromotionStatisticReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.CooperativeMemberPromotionStatisticListResp' + summary: 租卡会员统计 + tags: + - 会员管理 + - V1.2.0 + /api/v1/cooperative/set_pay_info: + post: + consumes: + - application/json + parameters: + - description: 设置支付信息模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.CooperativeSetPayInfoReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/app.Response' + summary: 设置支付信息 + tags: + - 合作商 + - v1.2.0 /api/v1/db/columns/page: get: description: 数据库表列分页列表 / database table column page list @@ -5043,6 +5732,28 @@ paths: summary: 登录日志列表 tags: - system/日志 + /api/v1/mall/goods/user/vm_record: + post: + consumes: + - application/json + parameters: + - description: 用户积分记录模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.MallUserVmRecordReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.MallUserVmRecordResp' + summary: 用户积分记录 + tags: + - 数据统计 + - V1.2.0 /api/v1/menu: get: description: 获取JSON @@ -6098,10 +6809,33 @@ paths: "200": description: OK schema: - $ref: '#/definitions/models.U' + $ref: '#/definitions/models.NewUserListResp' summary: 所有用户 tags: - 会员管理 + - V1.2.0 + /api/v1/user_info/new_user_invite_record_list: + post: + consumes: + - application/json + parameters: + - description: 会员邀请记录模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.NewUserInviteRecordReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.UserInviteRecordListResp' + summary: 会员邀请记录 + tags: + - 会员管理 + - V1.2.0 /api/v1/user_info/tel: post: consumes: diff --git a/go.mod b/go.mod index 6420411..a3f452f 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,6 @@ module go-admin go 1.16 require ( - github.com/360EntSecGroup-Skylar/excelize v1.4.1 github.com/BurntSushi/toml v1.3.2 // indirect github.com/aliyun/aliyun-sts-go-sdk v0.0.0-20171106034748-98d3903a2309 github.com/bytedance/sonic v1.10.2 // indirect diff --git a/go.sum b/go.sum index 167b7c4..188cac7 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,6 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/360EntSecGroup-Skylar/excelize v1.4.1 h1:l55mJb6rkkaUzOpSsgEeKYtS6/0gHwBYyfo5Jcjv/Ks= -github.com/360EntSecGroup-Skylar/excelize v1.4.1/go.mod h1:vnax29X2usfl7HHkBrX5EvSCJcmH3dT9luvxzu8iGAE= github.com/AlecAivazis/survey/v2 v2.0.5/go.mod h1:WYBhg6f0y/fNYUuesWQc0PKbJcEliGcYHB9sNT3Bg74= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= @@ -517,7 +515,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.3-0.20181224173747-660f15d67dbb/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= diff --git a/tools/utils.go b/tools/utils.go index 3313e30..a520d52 100644 --- a/tools/utils.go +++ b/tools/utils.go @@ -5,8 +5,10 @@ import ( "fmt" "gorm.io/gorm" "log" + "math" "runtime" "strconv" + "time" "github.com/gin-gonic/gin" "github.com/google/uuid" @@ -82,3 +84,17 @@ func GetOrm(c *gin.Context) (*gorm.DB, error) { return nil, errors.New(fmt.Sprintf("msgID[%s], db connect not exist", msgID)) } } + +// RoundFloat64 将float64类型四舍五入取整 +func RoundFloat64(input float64) int { + rounded := int(math.Round(input)) + return rounded +} + +// ConvertTimeToString 将time类型转换为string +func ConvertTimeToString(t time.Time) string { + if t.IsZero() { + return "" // 零值或 nil 返回空字符串 + } + return t.Format("2006-01-02 15:04:05") +}