From 183caeefab61e210a2bd5654c5821d79f451bc04 Mon Sep 17 00:00:00 2001 From: chenlin Date: Mon, 2 Sep 2024 17:22:55 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81excel=E5=AF=BC=E5=87=BA=E6=94=B9?= =?UTF-8?q?=E6=88=90=E8=AF=BB=E5=8F=96=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E7=9A=84url=E5=9C=B0=E5=9D=80=EF=BC=9B=202=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=BA=93=E5=AD=98=E5=AF=BC=E5=85=A5=E6=97=B6=E9=97=A8?= =?UTF-8?q?=E5=BA=97=E5=90=8D=E7=A7=B0/=E5=95=86=E5=93=81=E5=90=8D?= =?UTF-8?q?=E7=A7=B0/=E4=BE=9B=E5=BA=94=E5=95=86=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E8=B7=9F=E7=B3=BB=E7=BB=9F=E4=B8=8D=E7=AC=A6=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=A8=A1=E7=B3=8A=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9B=203?= =?UTF-8?q?=E3=80=81=E5=AF=BC=E5=87=BA=E5=BA=93=E5=AD=98=E8=AF=A6excel?= =?UTF-8?q?=E6=97=B6=E5=A2=9E=E5=8A=A0"=E5=BA=93=E5=AD=98=E6=95=B0?= =?UTF-8?q?=E9=87=8F"=E5=88=97=EF=BC=8C=E6=95=B0=E9=87=8F=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=BA1=EF=BC=8C=E6=96=B9=E4=BE=BF=E9=87=87?= =?UTF-8?q?=E8=B4=AD=E8=BF=9B=E8=A1=8Cexcel=E6=95=B0=E6=8D=AE=E9=80=8F?= =?UTF-8?q?=E8=A7=86=EF=BC=9B=204=E3=80=81=E5=A2=9E=E5=8A=A0=E5=B0=8A?= =?UTF-8?q?=E4=BA=AB=E4=BC=9A=E5=91=98=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=92=8C=E5=AD=97=E6=AE=B5=EF=BC=9B=205=E3=80=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=B4=A2=E5=8A=A1=E7=BB=9F=E8=AE=A1=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=89=94=E9=99=A4"=E5=B0=8A?= =?UTF-8?q?=E4=BA=AB=E4=BC=9A=E5=91=98=E8=B4=B9"=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E6=9C=89=E4=BC=A0=E5=8F=82=E6=9C=89=E6=89=8D=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=9B=206=E3=80=81=E8=A7=A3=E5=86=B3=E9=87=87=E8=B4=AD?= =?UTF-8?q?=E9=9C=80=E6=B1=82=E9=A1=B5=E9=9D=A2=E5=BA=93=E5=AD=98=E6=95=B0?= =?UTF-8?q?=E9=87=8F=E7=BB=9F=E8=AE=A1=E4=B8=8D=E5=87=86=E7=A1=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=E5=88=9D=E5=A7=8B=E5=80=BC=E7=94=B1?= =?UTF-8?q?0=E6=94=B9=E6=88=901=EF=BC=9B=207=E3=80=81=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E7=BE=A4=E5=8F=91=E7=BC=96=E8=BE=91=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/usermanage/user.go | 123 +++++ app/admin/models/analyse.go | 3 +- app/admin/models/commodity.go | 26 +- app/admin/models/cooperative_business.go | 22 +- app/admin/models/decision.go | 2 +- app/admin/models/erp_order.go | 8 +- app/admin/models/game_card.go | 5 +- app/admin/models/greentown_sms_test.go | 22 - app/admin/models/inventory_report.go | 10 +- app/admin/models/order.go | 7 +- app/admin/models/purchase.go | 43 +- app/admin/models/recycle_card.go | 3 +- app/admin/models/sysuser.go | 2 +- app/admin/models/user.go | 599 ++++++++++++++++++++--- app/admin/router/usermanage.go | 6 +- cmd/api/server.go | 11 + config/settings.yml | 2 +- docs/docs.go | 358 +++++++++++++- docs/swagger.json | 358 +++++++++++++- docs/swagger.yaml | 254 +++++++++- test/gen_test.go | 2 +- test/greentown_sms_test.go | 18 + 22 files changed, 1741 insertions(+), 143 deletions(-) delete mode 100644 app/admin/models/greentown_sms_test.go create mode 100644 test/greentown_sms_test.go diff --git a/app/admin/apis/usermanage/user.go b/app/admin/apis/usermanage/user.go index b7a7a73..0f71f36 100644 --- a/app/admin/apis/usermanage/user.go +++ b/app/admin/apis/usermanage/user.go @@ -732,6 +732,37 @@ func GroupSendMessageCreateTemplate(c *gin.Context) { app.OK(c, nil, "操作成功") } +func GroupSendMessageEditTemplate(c *gin.Context) { + req := &models.GroupSendMessageTemplate{} + if c.ShouldBindJSON(req) != nil { + logger.Errorf("para err") + app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + if req.Status == 2 { // 已发送的模版不能编辑 + app.Error(c, http.StatusBadRequest, errors.New("para err"), "已发送的短信不能编辑,请重新创建!") + return + } + + if req.UserType == 4 && req.Tels == "" { + app.Error(c, http.StatusBadRequest, errors.New("para err"), "指定用户手机号") + return + } + + if req.Message == "" { + app.Error(c, http.StatusBadRequest, errors.New("para err"), "短信内容不能为空") + return + } + err := orm.Eloquent.Save(req).Error + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + app.Error(c, http.StatusInternalServerError, err, "添加文章错误") + return + } + + app.OK(c, nil, "操作成功") +} + func GroupSendMessage(c *gin.Context) { req := &struct { GroupSendMessageTemplateId uint32 `json:"group_send_message_template_id"` @@ -1023,3 +1054,95 @@ func TelList(c *gin.Context) { app.OK(c, telListInfo, "") } + +// PrivilegeMemberList 零售尊享会员列表 +// @Summary 零售尊享会员列表 +// @Tags 会员管理, V1.4.2 +// @Produce json +// @Accept json +// @Param request body models.PrivilegeMemberListReq true "零售尊享会员列表模型" +// @Success 200 {object} models.PrivilegeMemberListResp +// @Router /api/v1/user_info/privilege_member/list [post] +func PrivilegeMemberList(c *gin.Context) { + req := new(models.PrivilegeMemberListReq) + if c.ShouldBindJSON(req) != nil { + logger.Errorf("para err") + app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + + resp, err := req.PrivilegeMemberList(c) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + if err.Error() == "您没有该门店权限" { + app.Error(c, http.StatusInternalServerError, err, err.Error()) + } else { + app.Error(c, http.StatusInternalServerError, err, "查询失败") + } + return + } + + app.OK(c, resp, "") +} + +// ActivateExtendedWarranty 零售尊享会员激活主机延保 +// @Summary 零售尊享会员激活主机延保 +// @Tags 会员管理, V1.4.2 +// @Produce json +// @Accept json +// @Param request body models.ActivateExtendedWarrantyReq true "零售尊享会员激活主机延保模型" +// @Success 200 {object} app.Response +// @Router /api/v1/user_info/privilege_member/activate_extended_warranty [post] +func ActivateExtendedWarranty(c *gin.Context) { + var req = new(models.ActivateExtendedWarrantyReq) + if err := c.ShouldBindJSON(&req); err != nil { + logger.Error("ShouldBindJSON err:", logger.Field("err", err)) + app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + + err := tools.Validate(req) //必填参数校验 + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + + err = req.ActivateExtendedWarranty(c) + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + + app.OK(c, nil, "激活成功") +} + +// CancelPrivilegeMembers 取消尊享会员 +// @Summary 取消尊享会员 +// @Tags 会员管理, V1.4.2 +// @Produce json +// @Accept json +// @Param request body models.CancelPrivilegeMembersReq true "取消尊享会员模型" +// @Success 200 {object} app.Response +// @Router /api/v1/user_info/privilege_member/cancel_members [post] +func CancelPrivilegeMembers(c *gin.Context) { + var req = new(models.CancelPrivilegeMembersReq) + if err := c.ShouldBindJSON(&req); err != nil { + logger.Error("ShouldBindJSON err:", logger.Field("err", err)) + app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误") + return + } + + err := tools.Validate(req) //必填参数校验 + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + + userInfo, err := req.CancelPrivilegeMembers() + if err != nil { + app.Error(c, http.StatusBadRequest, err, err.Error()) + return + } + + app.OK(c, userInfo, "取消成功") +} diff --git a/app/admin/models/analyse.go b/app/admin/models/analyse.go index 11f7ff2..876157e 100644 --- a/app/admin/models/analyse.go +++ b/app/admin/models/analyse.go @@ -5,6 +5,7 @@ import ( "github.com/codinl/go-logger" "github.com/xuri/excelize/v2" orm "go-admin/common/global" + "go-admin/tools/config" "time" ) @@ -268,7 +269,7 @@ func (m *UserMemberRecordReq) Export() (string, error) { fmt.Println(err) } - return ExportUrl + fileName, nil + return config.ExportConfig.Url + fileName, nil } func UserMemberRecordListSetUser(list []UserMemberRecord) { diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index cce1082..3099e26 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -1041,18 +1041,21 @@ func (m *StockImporter) ImportStockData(colsMap []map[string]interface{}) error for i, _ := range list { v1, ok1 := storeNameMap[list[i].StoreName] if !ok1 { - logger.Error("store name err") - return errors.New("store name err") + logger.Errorf("erp store name err:%s", list[i].StoreName) + fmt.Printf("erp store name err:%s", list[i].StoreName) + return errors.New(fmt.Sprintf("导入门店名称[%s]跟系统不符,请检查", list[i].StoreName)) } v2, ok2 := erpCommodityMap[list[i].Name] if !ok2 || v2 == nil { - logger.Error("erp commodity name err") - return errors.New("erp commodity name err") + logger.Errorf("erp commodity name err:%s", list[i].Name) + fmt.Printf("erp commodity name err:%s", list[i].Name) + return errors.New(fmt.Sprintf("导入商品名称[%s]跟系统不符,请检查", list[i].Name)) } v3, ok3 := erpSupplierNameMap[list[i].SupplierName] if !ok3 { - logger.Error("erp supplier name err") - return errors.New("erp supplier name err") + logger.Errorf("erp supplier name err:%s", list[i].SupplierName) + fmt.Printf("erp supplier name err:%s", list[i].SupplierName) + return errors.New(fmt.Sprintf("导入供应商名称[%s]跟系统不符,请检查", list[i].SupplierName)) } // 注意:表格导入是员工成本价,数据库存储是员工成本价加价=员工成本价-指导采购价 @@ -1447,7 +1450,7 @@ func ErpCommodityListExport(list []ErpCommodity) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "商品资料" + ".xlsx" title := []interface{}{"商品编号", "商品名称", "商品分类", "商品条码", "是否串码", "系统生成串码", "主供应商", "指导零售价", @@ -1560,7 +1563,7 @@ func InventoryDetailListExport(list []ErpStockCommodity, c *gin.Context) (string return "", err } - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "库存详情" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1573,8 +1576,8 @@ func InventoryDetailListExport(list []ErpStockCommodity, c *gin.Context) (string logger.Info("exportStaffCostPrice is:", logger.Field("exportStaffCostPrice", exportStaffCostPrice)) // 设置标题行 - title := []interface{}{"商品编号", "商品名称", "商品分类", "是否串码", "商品串码", "所属门店", "供应商", "首次入库时间", "首次入库方式", - "首次入库订单编号", "最近入库时间"} + title := []interface{}{"商品编号", "商品名称", "商品分类", "是否串码", "商品串码", "所属门店", "供应商", "库存数量", + "首次入库时间", "首次入库方式", "首次入库订单编号", "最近入库时间"} if exportPurchasePrice { title = append(title, "入库采购价") @@ -1626,6 +1629,7 @@ func InventoryDetailListExport(list []ErpStockCommodity, c *gin.Context) (string list[rowId].IMEI, list[rowId].StoreName, list[rowId].ErpSupplierName, + 1, list[rowId].FirstStockTime, storageType, list[rowId].OriginalSn, @@ -1672,7 +1676,7 @@ func ErpCategoryListExport(list []ErpCategory) (string, error) { fmt.Println(err) } - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "分类列表数据" + ".xlsx" //title := []interface{}{"门店", "用户ID", "订单编号", "下单时间", "卡带", "说明", "回收价", "闲麦价", "审核时间", "审核人", "操作", "复核时间", "复核状态"} diff --git a/app/admin/models/cooperative_business.go b/app/admin/models/cooperative_business.go index 9837696..8d116b4 100644 --- a/app/admin/models/cooperative_business.go +++ b/app/admin/models/cooperative_business.go @@ -108,12 +108,14 @@ type CooperativeMemberPromotion struct { GoldCount uint32 `json:"gold_count"` // 黄金会员数量 PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + PrivilegeCount uint32 `json:"privilege_count"` // 尊享会员数量 Date string `json:"date" gorm:"index"` // State string `json:"state"` // 待发起结算 待财务打款 已结算 RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + RenewalPrivilegeCount uint32 `json:"renewal_privilege_count"` // 续费尊享会员数量 GoldDeduct uint32 `json:"gold_deduct" gorm:"-"` // 黄金会员提成 PlatinumDeduct uint32 `json:"platinum_deduct" gorm:"-"` // 白金会员提成 @@ -140,10 +142,12 @@ type CooperativeMemberPromotionStore struct { GoldCount uint32 `json:"gold_count"` // 黄金会员数量 PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + PrivilegeCount uint32 `json:"privilege_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"` // 续费黑金会员数量 + RenewalPrivilegeCount uint32 `json:"renewal_privilege_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"` // 升级:白金->黑金数量 @@ -159,10 +163,12 @@ type CooperativeMemberPromotionDay struct { GoldCount uint32 `json:"gold_count"` // 黄金会员数量 PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + PrivilegeCount uint32 `json:"privilege_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"` // 续费黑金会员数量 + RenewalPrivilegeCount uint32 `json:"renewal_privilege_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"` // 升级:白金->黑金数量 @@ -178,10 +184,12 @@ type CooperativeMemberPromotionStoreDay struct { GoldCount uint32 `json:"gold_count"` // 黄金会员数量 PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + PrivilegeCount uint32 `json:"privilege_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"` // 续费黑金会员数量 + RenewalPrivilegeCount uint32 `json:"renewal_privilege_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"` // 升级:白金->黑金数量 @@ -200,6 +208,7 @@ type CooperativeDeductSettle struct { GoldCount uint32 `json:"gold_count"` // 黄金会员数量 PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + PrivilegeCount uint32 `json:"privilege_count"` // 尊享会员数量 GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成配置 PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成配置 BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成配置 @@ -207,6 +216,7 @@ type CooperativeDeductSettle struct { RenewalGoldCount uint32 `json:"renewal_gold_count"` // 续费黄金会员数量 RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量 RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量 + RenewalPrivilegeCount uint32 `json:"renewal_privilege_count"` // 续费尊享会员数量 RenewalGoldDeduct uint32 `json:"renewal_gold_deduct"` // 续费黄金会员提成 RenewalPlatinumDeduct uint32 `json:"renewal_platinum_deduct"` // 续费白金会员提成 @@ -701,11 +711,13 @@ type CooperativeMemberPromotionStatistic struct { GoldCount uint32 `json:"gold_count"` // 黄金会员数量 PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量 + PrivilegeCount uint32 `json:"privilege_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"` // 续费黑金会员数量 + RenewalPrivilegeCount uint32 `json:"renewal_privilege_count"` // 续费尊享会员数量 Date string `json:"date" gorm:"index"` // 日期 StoreId uint32 `json:"store_id" gorm:"index"` // 门店id @@ -992,7 +1004,7 @@ func promotionStatisticListExport(list []CooperativeMemberPromotionStatistic) (s file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "租卡会员统计" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1102,10 +1114,12 @@ func CooperativeMemberPromotionDayListToStatistic(list []CooperativeMemberPromot GoldCount: list[i].GoldCount, PlatinumCount: list[i].PlatinumCount, BlackGoldCount: list[i].BlackGoldCount, + PrivilegeCount: list[i].PrivilegeCount, DayTime: list[i].DayTime, RenewalGoldCount: list[i].RenewalGoldCount, RenewalPlatinumCount: list[i].RenewalPlatinumCount, RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, + RenewalPrivilegeCount: list[i].RenewalPrivilegeCount, UpgradeGoldToPlatinumCount: list[i].UpgradeGoldToPlatinumCount, UpgradeGoldToBlackCount: list[i].UpgradeGoldToBlackCount, UpgradePlatinumToBlackCount: list[i].UpgradePlatinumToBlackCount, @@ -1129,10 +1143,12 @@ func CooperativeMemberPromotionStoreDayToStatistic(list []CooperativeMemberPromo GoldCount: list[i].GoldCount, PlatinumCount: list[i].PlatinumCount, BlackGoldCount: list[i].BlackGoldCount, + PrivilegeCount: list[i].PrivilegeCount, DayTime: list[i].DayTime, RenewalGoldCount: list[i].RenewalGoldCount, RenewalPlatinumCount: list[i].RenewalPlatinumCount, RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, + RenewalPrivilegeCount: list[i].RenewalPrivilegeCount, UpgradeGoldToPlatinumCount: list[i].UpgradeGoldToPlatinumCount, UpgradeGoldToBlackCount: list[i].UpgradeGoldToBlackCount, UpgradePlatinumToBlackCount: list[i].UpgradePlatinumToBlackCount, @@ -1157,9 +1173,11 @@ func CooperativeMemberPromotionToStatistic(list []CooperativeMemberPromotion) [] GoldCount: list[i].GoldCount, PlatinumCount: list[i].PlatinumCount, BlackGoldCount: list[i].BlackGoldCount, + PrivilegeCount: list[i].PrivilegeCount, RenewalGoldCount: list[i].RenewalGoldCount, RenewalPlatinumCount: list[i].RenewalPlatinumCount, RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, + RenewalPrivilegeCount: list[i].RenewalPrivilegeCount, Date: list[i].Date, UpgradePlatinumToBlackCount: list[i].UpgradePlatinumToBlackCount, UpgradeGoldToBlackCount: list[i].UpgradeGoldToBlackCount, @@ -1184,10 +1202,12 @@ func CooperativeMemberPromotionStoreToStatistic(list []CooperativeMemberPromotio GoldCount: list[i].GoldCount, PlatinumCount: list[i].PlatinumCount, BlackGoldCount: list[i].BlackGoldCount, + PrivilegeCount: list[i].PrivilegeCount, //DayTime: list[i].DayTime, RenewalGoldCount: list[i].RenewalGoldCount, RenewalPlatinumCount: list[i].RenewalPlatinumCount, RenewalBlackGoldCount: list[i].RenewalBlackGoldCount, + RenewalPrivilegeCount: list[i].RenewalPrivilegeCount, Date: list[i].Date, StoreId: list[i].StoreId, Store: list[i].Store, diff --git a/app/admin/models/decision.go b/app/admin/models/decision.go index 9d917b3..e85cb10 100644 --- a/app/admin/models/decision.go +++ b/app/admin/models/decision.go @@ -2285,7 +2285,7 @@ func reportDecisionExport(req *ErpDecisionReportResp) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "进销存报表" + ".xlsx" fmt.Println("url fileName:", url+fileName) diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index 3f64fc6..6c5f733 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -2395,7 +2395,7 @@ func storeManageDataExport(list []StoreManageData, storeName string, c *gin.Cont file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + storeName + "经营数据" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -2493,7 +2493,7 @@ func retailMarginDataExport(req *ErpOrderRetailMarginResp, c *gin.Context) (stri file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "商品零售毛利汇总" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -3009,7 +3009,7 @@ func retailDetailExportBack(list []ErpOrder, sumData RetailDetailTotalData) (str file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "零售明细" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -3274,7 +3274,7 @@ func retailDetailExport(list []ErpOrder, sumData RetailDetailTotalData, c *gin.C file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "零售明细" + ".xlsx" fmt.Println("url fileName:", url+fileName) diff --git a/app/admin/models/game_card.go b/app/admin/models/game_card.go index 18da811..bdc9e31 100644 --- a/app/admin/models/game_card.go +++ b/app/admin/models/game_card.go @@ -9,6 +9,7 @@ import ( orm "go-admin/common/global" "go-admin/logger" "go-admin/tools" + "go-admin/tools/config" "gorm.io/gorm" "strings" "time" @@ -1864,7 +1865,7 @@ func GoodsStockFile(goodsData []ExportGoods, fileName string) string { fmt.Println(err) } - return ExportUrl + fileName + return config.ExportConfig.Url + fileName } func GoodsStatusStringByStatus(status uint8) string { @@ -3332,7 +3333,7 @@ func MemberReportFile(memberReports []InviteMemberReport, fileName string) strin fmt.Println(err) } - return ExportUrl + fileName + return config.ExportConfig.Url + fileName } type CooperativeSetPayInfoReq struct { diff --git a/app/admin/models/greentown_sms_test.go b/app/admin/models/greentown_sms_test.go deleted file mode 100644 index 243550f..0000000 --- a/app/admin/models/greentown_sms_test.go +++ /dev/null @@ -1,22 +0,0 @@ -package models - -import ( - "testing" -) - -func TestSend(t *testing.T) { - //tel := "17080320980" - tel := "13714071204,17727927738" - //tel := "17602181899" - - SmsSend(tel, "【go2switch】温馨提示:您的会员即将过期,请在过期之前将卡归还到门店,如有问题联系客服") -} - -func TestCreateInviteMemberReport(t *testing.T) { - - CreateInviteMemberReport() -} - -func TestGtSendMessage(t *testing.T) { - GtSendMessage([]string{"17080320980"}, "【go2switch】绿城短信推送测试,测试") -} diff --git a/app/admin/models/inventory_report.go b/app/admin/models/inventory_report.go index 1640e61..69732ec 100644 --- a/app/admin/models/inventory_report.go +++ b/app/admin/models/inventory_report.go @@ -488,7 +488,7 @@ func reportByProductExport(req *InventoryReportByProductResp) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "产品库存汇总(按门店)" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -834,7 +834,7 @@ func reportAllotExport(req *InventoryReportByAllotResp) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "库存调拨汇总" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1132,7 +1132,7 @@ func reportAllotDetailExport(req *InventoryReportAllotDetailResp) (string, error file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "库存调拨明细" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1436,7 +1436,7 @@ func reportOtherExport(req *InventoryReportByOtherResp) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "其他出入库汇总" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1784,7 +1784,7 @@ func reportOtherDetailExport(req *InventoryReportOtherDetailResp) (string, error file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "其他出入库明细" + ".xlsx" fmt.Println("url fileName:", url+fileName) diff --git a/app/admin/models/order.go b/app/admin/models/order.go index a84cfac..f1ccf59 100644 --- a/app/admin/models/order.go +++ b/app/admin/models/order.go @@ -519,7 +519,7 @@ func OrderListExport(list []Order) (string, error) { fmt.Println(err) } - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "租赁订单" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1581,8 +1581,11 @@ func (m *FundRecordListReq) List() ([]FundRecord, int64, string, error) { var fundRecords []FundRecord qs := orm.Eloquent.Table("fund_record") + // 默认剔除"尊享会员费",只有传参有才展示 if m.FundType != "" { qs = qs.Where("fund_type=?", m.FundType) + } else { + qs = qs.Where("fund_type != ?", "privilege_member_fee") } if m.TransactionId != "" { qs = qs.Where("transaction_id=?", m.TransactionId) @@ -1691,7 +1694,7 @@ func fundRecordListExport(list []FundRecord) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "财务统计" + ".xlsx" fmt.Println("url fileName:", url+fileName) diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 73a32e9..4e0ac29 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -1937,6 +1937,15 @@ func getErpPurchaseDemandAll(req *GetErpPurchaseDemandReq, c *gin.Context) (*Get } } + commodityIDs := make([]uint32, len(commodities)) + for i, commodity := range commodities { + commodityIDs[i] = commodity.ID + } + + if len(commodityIDs) == 0 { + return resp, nil + } + // 批量查询商品上月销售数量 var soldOutCommodities []ErpStockCommodity firstDay, lastDay := GetLastMonthRange() // 获取上个月的时间范围 @@ -1947,12 +1956,12 @@ func getErpPurchaseDemandAll(req *GetErpPurchaseDemandReq, c *gin.Context) (*Get } if len(storeIdList) > 1 { err = orm.Eloquent.Table("erp_stock_commodity"). - Where("state = ? AND updated_at BETWEEN ? AND ? AND store_id in (?)", - SoldOut, firstDay, lastDay, storeIdList).Find(&soldOutCommodities).Error + Where("state = ? AND updated_at BETWEEN ? AND ? AND store_id in (?) AND erp_commodity_id IN (?)", + SoldOut, firstDay, lastDay, storeIdList, commodityIDs).Find(&soldOutCommodities).Error } else { err = orm.Eloquent.Table("erp_stock_commodity"). - Where("state = ? AND updated_at BETWEEN ? AND ? AND store_id = ?", - SoldOut, firstDay, lastDay, storeIdList[0]).Find(&soldOutCommodities).Error + Where("state = ? AND updated_at BETWEEN ? AND ? AND store_id = ? AND erp_commodity_id IN (?)", + SoldOut, firstDay, lastDay, storeIdList[0], commodityIDs).Find(&soldOutCommodities).Error } if err != nil { return nil, err @@ -1973,12 +1982,12 @@ func getErpPurchaseDemandAll(req *GetErpPurchaseDemandReq, c *gin.Context) (*Get var stockCommodities []ErpStockCommodity if len(storeIdList) > 1 { err = orm.Eloquent.Table("erp_stock_commodity"). - Where("state = ? AND store_id in (?)", - InStock, storeIdList).Find(&stockCommodities).Error + Where("state = ? AND store_id in (?) AND erp_commodity_id IN (?)", + InStock, storeIdList, commodityIDs).Find(&stockCommodities).Error } else { err = orm.Eloquent.Table("erp_stock_commodity"). - Where("state = ? AND store_id = ?", - InStock, storeIdList[0]).Find(&stockCommodities).Error + Where("state = ? AND store_id = ? AND erp_commodity_id IN (?)", + InStock, storeIdList[0], commodityIDs).Find(&stockCommodities).Error } if err != nil { return nil, err @@ -1991,14 +2000,14 @@ func getErpPurchaseDemandAll(req *GetErpPurchaseDemandReq, c *gin.Context) (*Get if exist { // 存在 inStockMap[key] += 1 } else { // 不存在 - inStockMap[key] = 0 + inStockMap[key] = 1 } } // 查询采购需求单信息 var demand []ErpPurchaseDemand demandQs := orm.Eloquent.Table("erp_purchase_demand"). - Where("state = 1").Where("count <> 0") + Where("state = 1").Where("count <> 0").Where("erp_commodity_id IN (?)", commodityIDs) if len(storeIdList) > 0 { if len(storeIdList) == 1 { demandQs = demandQs.Where("store_id = ?", storeIdList[0]) @@ -2016,7 +2025,7 @@ func getErpPurchaseDemandAll(req *GetErpPurchaseDemandReq, c *gin.Context) (*Get demandRemarkQs := orm.Eloquent.Table("erp_purchase_demand_remark"). Where("state = 1"). Where("remark IS NOT NULL"). - Where("remark <> ''") + Where("remark <> ''").Where("erp_commodity_id IN (?)", commodityIDs) err = demandRemarkQs.Find(&demandRemarkInfo).Error if err != nil { return nil, err @@ -2759,7 +2768,7 @@ func demandDataExport(list []DemandData) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "采购需求" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -2911,7 +2920,7 @@ func demandDataExportOnShopAssistant(list []DemandData) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "采购需求" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -3632,7 +3641,7 @@ func reportByOrderExport(req *ErpPurchaseReportByOrderResp) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "采购报表(按单)" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -4682,7 +4691,7 @@ func reportByCommodityExport(req *ErpPurchaseReportByCommodityResp) (string, err file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "采购报表(按商品)" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -5228,7 +5237,7 @@ func reportBySupplierExport(req *ErpPurchaseReportBySupplierResp) (string, error file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "供应商采购汇总" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -5530,7 +5539,7 @@ func reportDetailExport(req *ErpPurchaseReportDetailResp, c *gin.Context) (strin file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "采购明细" + ".xlsx" fmt.Println("url fileName:", url+fileName) diff --git a/app/admin/models/recycle_card.go b/app/admin/models/recycle_card.go index a80038b..bced748 100644 --- a/app/admin/models/recycle_card.go +++ b/app/admin/models/recycle_card.go @@ -9,6 +9,7 @@ import ( orm "go-admin/common/global" "go-admin/logger" "go-admin/tools" + "go-admin/tools/config" "time" ) @@ -271,7 +272,7 @@ func RecycleCardOrderListExport(list []RecycleCardOrder) (string, error) { //if err := file.SaveAs("./" + fileName); err != nil { fmt.Println(err) } - return ExportUrl + fileName, nil + return config.ExportConfig.Url + fileName, nil } func RecycleCardOrderStateUpdate() { diff --git a/app/admin/models/sysuser.go b/app/admin/models/sysuser.go index f264445..a1cb009 100644 --- a/app/admin/models/sysuser.go +++ b/app/admin/models/sysuser.go @@ -417,7 +417,7 @@ func sysUserExport(req []SysUserPage) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "系统用户" + ".xlsx" fmt.Println("url fileName:", url+fileName) diff --git a/app/admin/models/user.go b/app/admin/models/user.go index 4ad6fac..67cf493 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -47,6 +47,8 @@ const ( UpgradeGoldToPlatinumAuto // 18-黄金→白金(自动) UpgradeGoldToBlackAuto // 19-黄金→黑金(自动) UpgradePlatinumToBlackAuto // 20-白金→黑金(自动) + OpenAnnualPrivilege // 21 开通年费尊享会员 + RenewAnnualPrivilegeAuto // 22 续费年费尊享会员(自动) ) const ( @@ -56,6 +58,7 @@ const ( MemberLevelPeriod = 3 // 短期会员 MemberLevelPlatinum = 4 // 白金会员 MemberLevelBlackGold = 5 // 黑金会员 + MemberLevelPrivilege = 6 // 尊享会员 ) const ( @@ -63,6 +66,12 @@ const ( UserTypeShopAssistant = 2 // 店员 ) +const ( // 尊享会员延保状态 + ExtendExpire = 1 // 已过期 + ExtendWaitActive = 2 // 待激活 + ExtendEffectivity = 3 // 已激活 +) + // gen:qs // //go:generate goqueryset -in user.go @@ -132,9 +141,9 @@ const QueryTimeFormat = "2006-01-02T15:04:05+08:00" const StoreDateTimeFormat = "2006.01.02" const ( - ExportUrl = "https://admin.deovo.com/load/export/" - //ExportUrl = "https://dev.admin.deovo.com/load/export/" // dev环境 - //ExportUrl = "/Users/max/Documents/" // 本地环境 +// ExportUrl = "https://admin.deovo.com/load/export/" +// ExportUrl = "https://dev.admin.deovo.com/load/export/" // dev环境 +// ExportUrl = "/Users/max/Documents/" // 本地环境 ) type UserInvite struct { @@ -780,7 +789,7 @@ func newUserListExport(list []U) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "所有会员" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1034,6 +1043,7 @@ type InviteMemberReport struct { GoldCountQuarter uint32 `json:"gold_count_quarter"` // 季度黄金数量 PlatinumCount uint32 `json:"platinum_count"` // 白金数量 BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量 + PrivilegeCount uint32 `json:"privilege_count"` // 尊享会员数量 //ReportTime string `json:"report_time" gorm:"index"` // 业绩时间 Date string `json:"date" gorm:"index"` // 业绩时间 DeductAmount uint32 `json:"deduct_amount"` // 店员提成 @@ -1047,6 +1057,7 @@ type InviteMemberReport struct { RenewalGoldCountQuarter uint32 `json:"renewal_gold_count_quarter"` // 续费季度黄金会员数量(自动) RenewalPlatinumCount uint32 `json:"renewal_platinum_count"` // 续费白金会员数量(自动) RenewalBlackGoldCount uint32 `json:"renewal_black_gold_count"` // 续费黑金会员数量(自动) + RenewalPrivilegeCount uint32 `json:"renewal_privilege_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"` // 升级:白金->黑金数量(自动) @@ -1330,7 +1341,7 @@ func ExportUserMember(storeId uint32, startTime, endTime string) string { log.Fatal(err) } - return ExportUrl + fileName + return config.ExportConfig.Url + fileName } // gen:qs @@ -1342,7 +1353,7 @@ type UserInviteRecord struct { StoreId uint64 `json:"store_id"` // 门店id 邀请用户门店 Action uint32 `json:"action"` // 1-未激活 2-激活邀请 SpendType uint32 `json:"spend_type"` // 1-未开通 2-开通会员 3-续费 4-升级 - MemberLevel uint32 `json:"member_level"` // 会员等级 0-未开通 1-普通 2-黄金 3-短期 4-白金 5-黑金 + MemberLevel uint32 `json:"member_level"` // 会员等级 0-未开通 1-普通 2-黄金 3-短期 4-白金 5-黑金 6-尊享会员 MemberGenre uint32 `json:"member_genre"` // 会员类型 200-黄金年费 201-黄金季度 202-黄金半年 First uint32 `json:"first"` // 首次 Scan uint32 `json:"scan"` // 扫码 @@ -1441,7 +1452,7 @@ type NewUserInviteRecordReq struct { 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-白金→黑金(自动) + 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-白金→黑金(自动),21-开通尊享会员, 22-续费尊享会员 RecordStartTime time.Time `json:"record_start_time"` // 记录时间-开始时间 RecordEndTime time.Time `json:"record_end_time"` // 记录时间-结束时间 MemberLevel uint32 `json:"member_level"` // 当前类型:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员 @@ -1457,29 +1468,33 @@ type UserInviteRecordListResp struct { } 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"` // 租卡会员到期时间 + 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"` // 租卡会员到期时间 + PrivilegeMemberLevel uint32 `json:"privilege_member_level"` // 当前尊享会员类型:1-普通 6-尊享会员 + PrivilegeMemberExpire time.Time `json:"privilege_memberExpire"` // 尊享会员到期时间 } func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListResp, error) { resp := new(UserInviteRecordListResp) var records []struct { UserInviteRecord - StoreId uint32 - InviteUserName string - UserTel string - CreateTime time.Time - MemberExpire time.Time - UserMemberLevel uint32 + StoreId uint32 + InviteUserName string + UserTel string + CreateTime time.Time + MemberExpire time.Time + UserMemberLevel uint32 + PrivilegeMemberExpire time.Time + PrivilegeMemberLevel uint32 } err := UpdateUserInviteRecordRenewHide() if err != nil { @@ -1513,9 +1528,11 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR 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.nick_name AS InviteUserName, " + - "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel"). + "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel, " + + "B3.member_expire AS PrivilegeMemberExpire, B3.member_level AS PrivilegeMemberLevel"). Joins("Left JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid and B1.uid != 0"). Joins("Left JOIN user B2 ON user_invite_record.to_uid = B2.uid"). + Joins("Left JOIN privilege_member B3 ON user_invite_record.to_uid = B3.uid"). Group("user_invite_record.id"). Order("MAX(user_invite_record.action_time) DESC") @@ -1580,50 +1597,55 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR var recordTypeConditions []string for _, t := range m.RecordType { switch t { - case 1: + case 1: // 首次邀请 recordTypeConditions = append(recordTypeConditions, "(first=1 AND spend_type=1)") - case 2: + case 2: // 开通年费黄金 recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=2)") - case 3: + case 3: // 开通季度黄金 recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=2 AND user_invite_record.member_genre=201)") - case 4: + case 4: // 开通半年黄金 recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=2 AND user_invite_record.member_genre=202)") - case 5: + case 5: // 开通年费白金 recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=2)") - case 6: + case 6: // 开通年费黑金 recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=2)") - case 7: + case 7: // 续费年费黄金(干预) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=0)") - case 8: + case 8: // 续费年费白金(干预) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=3 AND renew_hide=0)") - case 9: + case 9: // 续费年费黑金(干预) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=3 AND renew_hide=0)") - case 10: + case 10: // 续费年费黄金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=1)") - case 11: + case 11: // 续费季度黄金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=1 AND user_invite_record.member_genre=201)") - case 12: + case 12: // 续费半年黄金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=2 AND spend_type=3 AND renew_hide=1 AND user_invite_record.member_genre=202)") - case 13: + case 13: // 续费年费白金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=3 AND renew_hide=1)") - case 14: + case 14: // 续费年费黑金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=3 AND renew_hide=1)") - case 15: + case 15: // 黄金→白金(干预) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=4 AND renew_hide=0)") - case 16: + case 16: // 黄金→黑金(干预) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=0 AND user_invite_record.member_genre in (200,201,202))") - case 17: + case 17: // 白金→黑金(干预) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=0 AND user_invite_record.member_genre not in (200,201,202))") - case 18: + case 18: // 黄金→白金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=4 AND spend_type=4 AND renew_hide=1)") - case 19: + case 19: // 黄金→黑金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=1 AND user_invite_record.member_genre in (200,201,202))") - case 20: + case 20: // 白金→黑金(自动) recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=5 AND spend_type=4 AND renew_hide=1 AND user_invite_record.member_genre not in (200,201,202))") + + case 21: // 开通年费尊享会员 + recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=6 AND spend_type=2)") + case 22: // 续费年费尊享会员(自动) + recordTypeConditions = append(recordTypeConditions, "(user_invite_record.member_level=6 AND spend_type=3 AND renew_hide=1)") } } @@ -1657,9 +1679,11 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR if m.IsExport == 1 { // 导出excel err = qs.Select("user_invite_record.*, B1.nick_name AS InviteUserName, " + - "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel"). + "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel, " + + "B3.member_expire AS PrivilegeMemberExpire, B3.member_level AS PrivilegeMemberLevel"). Joins("Left JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid and B1.uid != 0"). Joins("Left JOIN user B2 ON user_invite_record.to_uid = B2.uid"). + Joins("Left JOIN privilege_member B3 ON user_invite_record.to_uid = B3.uid"). Group("user_invite_record.id"). Order("MAX(user_invite_record.action_time) DESC"). Find(&records).Error @@ -1669,9 +1693,11 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR } } else { err = qs.Select("user_invite_record.*, B1.nick_name AS InviteUserName, " + - "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel"). + "B2.tel AS UserTel, B2.created_at AS CreateTime, B2.member_expire AS MemberExpire, B2.member_level AS UserMemberLevel, " + + "B3.member_expire AS PrivilegeMemberExpire, B3.member_level AS PrivilegeMemberLevel"). Joins("Left JOIN sys_user B1 ON user_invite_record.from_uid = B1.uid and B1.uid != 0"). Joins("Left JOIN user B2 ON user_invite_record.to_uid = B2.uid"). + Joins("Left JOIN privilege_member B3 ON user_invite_record.to_uid = B3.uid"). Group("user_invite_record.id"). Order("MAX(user_invite_record.action_time) DESC"). Offset(page * pageSize). @@ -1686,17 +1712,19 @@ func (m *NewUserInviteRecordReq) NewList(c *gin.Context) (*UserInviteRecordListR 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.UserMemberLevel, - MemberExpire: item.MemberExpire, + 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.UserMemberLevel, + MemberExpire: item.MemberExpire, + PrivilegeMemberLevel: item.PrivilegeMemberLevel, + PrivilegeMemberExpire: item.PrivilegeMemberExpire, } if item.FromUid == 0 { @@ -1782,6 +1810,8 @@ func getMemberLevelChineseDescription(memberLevel uint32) string { return "白金会员" case 5: return "黑金会员" + case 6: + return "尊享会员" } return "" @@ -1792,7 +1822,7 @@ func userInviteRecordExport(list []UserInviteRecordListData) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "会员邀请记录" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -1888,6 +1918,8 @@ func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) return OpenAnnualPlatinum case 5: return OpenAnnualBlack + case 6: + return OpenAnnualPrivilege } case spendType == 3 && renewHide == 0: switch memberLevel { @@ -1906,6 +1938,8 @@ func CalculateMemberType(spendType, renewHide, memberGenre, memberLevel uint32) return RenewAnnualPlatinumAuto case 5: return RenewAnnualBlackAuto + case 6: + return RenewAnnualPrivilegeAuto } case spendType == 4 && renewHide == 0: switch memberLevel { @@ -2517,7 +2551,7 @@ func ExportUserMemberList(storeId, memberType, cooperativeId uint32, startTime, fmt.Println(err) } - return ExportUrl + fileName + return config.ExportConfig.Url + fileName } type ExportUserInviteMemberList []UserInviteMember @@ -2782,6 +2816,7 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) { GoldCountQuarter: 0, PlatinumCount: 0, BlackGoldCount: 0, + PrivilegeCount: 0, Date: reportTime, DeductAmount: 0, CooperativeBusinessId: userInfo.CooperativeBusinessId, @@ -2794,6 +2829,7 @@ func (m *CooperativeBusiness) UserInviteReport(userInfo UserInfo) { RenewalGoldCountQuarter: 0, RenewalPlatinumCount: 0, RenewalBlackGoldCount: 0, + RenewalPrivilegeCount: 0, UpgradeGoldToPlatinumCount: 0, UpgradeGoldToBlackCount: 0, UpgradePlatinumToBlackCount: 0, @@ -2997,7 +3033,7 @@ func inviteMemberReport(list []InviteMemberReport) (string, error) { file := excelize.NewFile() fSheet := "Sheet1" - url := ExportUrl + url := config.ExportConfig.Url fileName := time.Now().Format(TimeFormat) + "店员绩效" + ".xlsx" fmt.Println("url fileName:", url+fileName) @@ -3667,7 +3703,7 @@ func MemberStatisticDailyListExport(dailys []MemberStatisticDaily) (string, erro if err := file.SaveAs("/www/server/images/export/" + fileName); err != nil { fmt.Println(err) } - return ExportUrl + fileName, nil + return config.ExportConfig.Url + fileName, nil } func UserInviteRecordListSetAssistantName(records []UserInviteRecord) { @@ -3915,7 +3951,7 @@ func UpdateExpireMemberLevel() { for i, _ := range users { if err = orm.Eloquent.Model(&UserInfo{}).Where("id = ?", users[i].ID).Updates(map[string]interface{}{ - "member_level": 1, + "member_level": MemberLevelUser, }).Error; err != nil { logger.Errorf("UpdateExpireMemberLevel err,", err.Error()) continue @@ -3923,6 +3959,31 @@ func UpdateExpireMemberLevel() { } } +// UpdateExpirePrivilegeMemberLevel 更新过期尊享会员等级 +func UpdateExpirePrivilegeMemberLevel() { + var users []PrivilegeMember + err := orm.Eloquent.Table("privilege_member").Where("member_expire < ?", time.Now()). + Where("member_level = ?", MemberLevelPrivilege).Find(&users).Error + if err != nil { + logger.Error(err.Error()) + return + } + + if len(users) == 0 { + logger.Info("UpdateExpirePrivilegeMemberLevel users is null") + return + } + + for i, _ := range users { + if err = orm.Eloquent.Model(&PrivilegeMember{}).Where("id = ?", users[i].ID).Updates(map[string]interface{}{ + "member_level": MemberLevelUser, + }).Error; err != nil { + logger.Errorf("UpdateExpirePrivilegeMemberLevel err,", err.Error()) + continue + } + } +} + // GetUserInfoByTel 通过手机号获取用户信息 func GetUserInfoByTel(tel string) (UserInfo, error) { var userInfo UserInfo @@ -3955,3 +4016,415 @@ func IsInMemberLevels(memberLevel uint32) bool { } return false } + +// PrivilegeMember 零售尊享会员 +type PrivilegeMember struct { + Model + Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` // 用户id + Tel string `json:"tel"` // 电话 + StoreId uint64 `json:"store_id"` // 门店id + MemberLevel uint32 `json:"member_level"` // 当前会员等级:1-普通用户,6-尊享会员 + MemberExpire *time.Time `json:"member_expire"` // 会员到期时间 + OpenMemberTime *time.Time `json:"open_member_time"` // 开通会员时间 + ExtendStatus uint32 `json:"extend_status"` // 延保状态:0-非会员, 1-已过期,2-待激活、3-已激活 + HostCode string `json:"host_code"` // 主机编码 + Images string `json:"images"` // 图片凭证 + AuditorId uint32 `json:"auditor_id" gorm:"index"` // 审核人id + AuditorName string `json:"auditor_name"` // 审核人姓名 + AuditTime *time.Time `json:"audit_time"` // 审核时间 + Remark string `json:"remark"` // 备注 + Store *Store `json:"store" gorm:"-"` // 门店信息 +} + +// PrivilegeMemberListReq 查询零售尊享会员列表入参 +type PrivilegeMemberListReq struct { + Uid uint32 `json:"uid"` // 用户ID + Tel string `json:"tel"` // 手机号 + HostCode string `json:"host_code"` // 主机编码 + StoreId []uint32 `json:"store_id"` // 门店列表(支持复选) + MemberLevel uint32 `json:"member_level"` // 当前会员等级 + AuditorId uint32 `json:"auditor_id"` // 审核人 + ExtendStatus uint32 `json:"extend_status"` // 延保状态 + OpenMemberStart string `json:"open_member_start"` // 首次开通尊享会员-开始时间 + OpenMemberEnd string `json:"open_member_end"` // 首次开通尊享会员-结束时间 + MemberExpireStart string `json:"member_expire_start"` // 尊享会员到期时间-开始时间 + MemberExpireEnd string `json:"member_expire_end"` // 尊享会员到期时间-结束时间 + AuditTimeStart string `json:"audit_time_start"` // 审核开始时间 + AuditTimeEnd string `json:"audit_time_end"` // 审核结束时间 + IsExport uint32 `json:"is_export"` // 1-导出excel + PageIndex int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 页面条数 +} + +// PrivilegeMemberListResp 查询零售尊享会员列表出参 +type PrivilegeMemberListResp struct { + Total int64 `json:"total"` // 总条数 + PageIndex int `json:"pageIndex"` // 页码 + PageSize int `json:"pageSize"` // 页面条数 + ExportUrl string `json:"export_url"` // 导出excel路径 + List []PrivilegeMember `json:"list"` // 零售尊享会员信息 +} + +func (m *PrivilegeMemberListReq) PrivilegeMemberList(c *gin.Context) (*PrivilegeMemberListResp, error) { + // 非管理员才判断所属门店 + if !(tools.GetRoleName(c) == "admin" || tools.GetRoleName(c) == "系统管理员") { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + return nil, errors.New("操作失败:" + err.Error()) + } + + // 返回sysUser未过期的门店id列表 + storeList := GetValidStoreIDs(sysUser.StoreData) + if len(storeList) > 0 { + m.StoreId = CompareLists(storeList, m.StoreId) + if len(m.StoreId) == 0 { // 没有匹配的数据,表示入参门店不是用户有权限的门店 + return &PrivilegeMemberListResp{}, nil + } + m.StoreId = append(m.StoreId, 0) + } else { + return nil, errors.New("用户未绑定门店") + } + } + + page := m.PageIndex - 1 + if page < 0 { + page = 0 + } + if m.PageSize == 0 { + m.PageSize = 10 + } + resp := &PrivilegeMemberListResp{ + PageIndex: page + 1, + PageSize: m.PageSize, + } + var memberList []PrivilegeMember + qs := orm.Eloquent.Model(&PrivilegeMember{}).Debug() + + if m.Uid != 0 { + qs = qs.Where("uid = ?", m.Uid) + } + if m.Tel != "" { + qs = qs.Where("tel = ?", m.Tel) + } + if m.HostCode != "" { + qs = qs.Where("host_code = ?", m.HostCode) + } + if len(m.StoreId) != 0 { + if len(m.StoreId) == 1 { + qs = qs.Where("store_id = ?", m.StoreId[0]) + } else { + qs = qs.Where("store_id IN (?)", m.StoreId) + } + } + if m.MemberLevel != 0 { + qs = qs.Where("member_level = ?", m.MemberLevel) + } + if m.AuditorId != 0 { + qs = qs.Where("auditor_id = ?", m.AuditorId) + } + if m.ExtendStatus != 0 { + qs = qs.Where("extend_status = ?", m.ExtendStatus) + } + if m.OpenMemberStart != "" { + parse, err := time.Parse(QueryTimeFormat, m.OpenMemberStart) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + qs = qs.Where("open_member_time > ?", parse) + } + if m.OpenMemberEnd != "" { + parse, err := time.Parse(QueryTimeFormat, m.OpenMemberEnd) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + qs = qs.Where("open_member_time < ?", parse) + } + if m.MemberExpireStart != "" { + parse, err := time.Parse(QueryTimeFormat, m.MemberExpireStart) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + qs = qs.Where("member_expire > ?", parse) + } + if m.MemberExpireEnd != "" { + parse, err := time.Parse(QueryTimeFormat, m.MemberExpireEnd) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + qs = qs.Where("member_expire < ?", parse) + } + if m.AuditTimeStart != "" { + parse, err := time.Parse(QueryTimeFormat, m.AuditTimeStart) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + qs = qs.Where("audit_time > ?", parse) + } + if m.AuditTimeEnd != "" { + parse, err := time.Parse(QueryTimeFormat, m.AuditTimeEnd) + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + qs = qs.Where("audit_time < ?", parse) + } + + var count int64 + err := qs.Count(&count).Error + if err != nil { + logger.Error("count err:", logger.Field("err", err)) + return nil, err + } + + if m.IsExport == 1 { // 导出excel + err = qs.Order("id DESC").Find(&memberList).Error + if err != nil && err != RecordNotFound { + logger.Error("err:", logger.Field("err", err)) + return nil, err + } + } else { + err = qs.Order("id DESC").Offset(page * m.PageSize).Limit(m.PageSize).Find(&memberList).Error + if err != nil && err != RecordNotFound { + logger.Error("err:", logger.Field("err", err)) + return nil, err + } + } + + // 查询门店信息 + storeList := make(map[uint32]Store) + storeList = GetStoreMap() + + for i, u := range memberList { + if u.StoreId == 0 { + continue + } + // 添加门店信息 + store := storeList[uint32(u.StoreId)] + memberList[i].Store = &store + + // 校验时间,如果为01-01-01 08:05,则赋值为空 + validateZeroTime(&memberList[i].AuditTime) + } + + if m.IsExport == 1 { + fileName, err := PrivilegeMemberExport(memberList) + if err != nil { + logger.Error("err:", logger.Field("err", err)) + return nil, err + } + resp.ExportUrl = fileName + } else { + resp.List = memberList + resp.Total = count + resp.PageSize = m.PageSize + resp.PageIndex = m.PageIndex + } + + return resp, nil +} + +// PrivilegeMemberExport 尊享会员导出excel +func PrivilegeMemberExport(list []PrivilegeMember) (string, error) { + file := excelize.NewFile() + fSheet := "Sheet1" + + url := config.ExportConfig.Url + fileName := time.Now().Format(TimeFormat) + "零售尊享会员" + ".xlsx" + fmt.Println("url fileName:", url+fileName) + + //title := []interface{}{"用户ID", "手机号", "所属门店", "当前会员等级", "首次开通尊享会员时间", "尊享会员到期时间", "延保状态", + // "主机编码", "图片凭证", "审核人", "审核时间"} + 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) + + for i := 0; i < len(list); i++ { + var strExtendStatus string + switch list[i].ExtendStatus { + case 1: + strExtendStatus = "已过期" + case 2: + strExtendStatus = "待激活" + case 3: + strExtendStatus = "已激活" + default: + strExtendStatus = "" + } + row = []interface{}{ + list[i].Uid, // 用户ID + list[i].Tel, // 手机号 + storeMap[uint32(list[i].StoreId)], // 所属门店 + getMemberLevelChineseDescription(list[i].MemberLevel), // 当前会员等级 + tools.ConvertTimeToStringByPoint(list[i].OpenMemberTime), // 首次开通尊享会员时间 + tools.ConvertTimeToStringByPoint(list[i].MemberExpire), // 尊享会员到期时间 + strExtendStatus, // 延保状态 + list[i].HostCode, // 主机编码 + //list[i].Images, // 图片凭证 + list[i].AuditorName, // 审核人 + tools.ConvertTimeToStringByPoint(list[i].AuditTime), // 审核时间 + } + + 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", 12) + file.SetColWidth("Sheet1", "B", "B", 15) + file.SetColWidth("Sheet1", "C", "C", 30) + file.SetColWidth("Sheet1", "D", "D", 18) + file.SetColWidth("Sheet1", "F", "E", 18) + file.SetColWidth("Sheet1", "F", "F", 18) + file.SetColWidth("Sheet1", "G", "G", 15) + file.SetColWidth("Sheet1", "H", "H", 18) + file.SetColWidth("Sheet1", "I", "I", 15) + file.SetColWidth("Sheet1", "J", "J", 18) + _ = 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 +} + +type ActivateExtendedWarrantyReq struct { + Uid uint32 `json:"uid" binding:"required"` // 用户ID + HostCode string `json:"host_code" binding:"required"` // 主机编码 + Images string `json:"images" binding:"required"` // 图片凭证 + Remark string `json:"remark"` // 备注 +} + +func (m *ActivateExtendedWarrantyReq) ActivateExtendedWarranty(c *gin.Context) error { + sysUser, err := GetSysUserByCtx(c) + if err != nil { + logger.Errorf("err:%#v", err) + return err + } + + var userStoreId uint64 + // 查询用户尊享会员记录 + var memberInfo PrivilegeMember + err = orm.Eloquent.Model(&PrivilegeMember{}).Debug().Where("uid = ?", m.Uid).Find(&memberInfo).Error + if err != nil { + return err + } + if memberInfo.StoreId == 0 { + // 获取店员有效门店 + storeInfo, _ := GetUserEffectiveStore(uint32(sysUser.Uid)) + if len(storeInfo) != 0 { + userStoreId = uint64(storeInfo[0].StoreID) + } + } else { + userStoreId = memberInfo.StoreId + } + + err = orm.Eloquent.Table("privilege_member").Where("uid = ?", m.Uid).Updates(map[string]interface{}{ + "store_id": userStoreId, + "extend_status": ExtendEffectivity, + "host_code": m.HostCode, + "images": m.Images, + "remark": m.Remark, + "audit_time": time.Now(), + "auditor_name": sysUser.NickName, + "auditor_id": sysUser.UserId, + "updated_at": time.Now(), + }).Error + if err != nil { + logger.Error("order err:", logger.Field("err", err)) + return err + } + + return nil +} + +type CancelPrivilegeMembersReq struct { + Uid uint32 `json:"uid" binding:"required"` // 用户ID +} + +func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember, error) { + var userInfo PrivilegeMember + err := orm.Eloquent.Table("privilege_member").Where("uid", m.Uid).Find(&userInfo).Error + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + + if userInfo.MemberLevel != MemberLevelPrivilege { + logger.Errorf("err:", logger.Field("err", "用户不是尊享会员"), logger.Field("uid", m.Uid)) + return nil, errors.New("取消失败,用户不是尊享会员") + } + + nowTime := time.Now() + userInfo.MemberLevel = MemberLevelUser + userInfo.MemberExpire = &nowTime + userInfo.ExtendStatus = ExtendExpire + + sql := fmt.Sprintf("UPDATE `privilege_member` SET member_level = 1,member_expire=?,updated_at=?,extend_status=1 WHERE uid = ?;") + err = orm.Eloquent.Debug().Exec(sql, nowTime, nowTime, m.Uid).Error + if err != nil { + logger.Errorf("err:", logger.Field("err", err)) + return nil, err + } + + //var userInvite UserInvite + //orm.Eloquent.Table("user_invite").Where("to_uid=?", m.Uid).Where("spend_type=2"). + // Order("id DESC").Limit(1).Find(&userInvite) + //sqlInvite := fmt.Sprintf("UPDATE user_invite SET member_status=3,action=1,spend_type=1 WHERE id= ? ;") + //err = orm.Eloquent.Exec(sqlInvite, userInvite.ID).Error + //if err != nil { + // logger.Errorf("err:", logger.Field("err", err)) + // return nil, err + //} + + return &userInfo, nil +} diff --git a/app/admin/router/usermanage.go b/app/admin/router/usermanage.go index 93791c0..5062b0c 100644 --- a/app/admin/router/usermanage.go +++ b/app/admin/router/usermanage.go @@ -15,7 +15,10 @@ func registerUserManageRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMid userInfo.POST("/invite_derive", usermanage.ExportDataUser) userInfo.POST("/mark", usermanage.MarkUser) userInfo.POST("/tel", usermanage.TelList) - userInfo.POST("/new_user_invite_record_list", usermanage.NewUserInviteRecordList) + userInfo.POST("/new_user_invite_record_list", usermanage.NewUserInviteRecordList) // 会员邀请记录 + userInfo.POST("/privilege_member/list", usermanage.PrivilegeMemberList) // 尊享会员列表 + userInfo.POST("/privilege_member/activate_extended_warranty", usermanage.ActivateExtendedWarranty) // 激活尊享会员主机延保 + userInfo.POST("/privilege_member/cancel_members", usermanage.CancelPrivilegeMembers) // 取消尊享会员 } } @@ -62,6 +65,7 @@ func registerUserManageUnAuthRouter(v1 *gin.RouterGroup) { { groupSendMessage.POST("template/list", usermanage.GroupSendMessageCreateTemplateList) groupSendMessage.POST("template/add", usermanage.GroupSendMessageCreateTemplate) + groupSendMessage.POST("template/edit", usermanage.GroupSendMessageEditTemplate) groupSendMessage.POST("/send", usermanage.GroupSendMessage) groupSendMessage.POST("template/del", usermanage.GroupSendMessageCreateTemplateDel) } diff --git a/cmd/api/server.go b/cmd/api/server.go index 2cd4bc6..0d921d7 100644 --- a/cmd/api/server.go +++ b/cmd/api/server.go @@ -138,27 +138,38 @@ func run() error { if err != nil { fmt.Println("err:", err) } + // 更新过期用户的当前会员等级-20240308添加 err = s.Every(1).Day().At("00:05").Do(models.UpdateExpireMemberLevel) if err != nil { fmt.Println("err:", err) } + // 用户邀请用户报表 //err = s.Every(1).Day().At("00:00").Do(models.CreateInviteMemberReport) err = s.Every(1).Day().At("00:10").Do(models.CreateInviteMemberReport) if err != nil { fmt.Println("err:", err) } + + // 更新过期尊享会员等级-20240829添加 + err = s.Every(1).Day().At("00:15").Do(models.UpdateExpirePrivilegeMemberLevel) + if err != nil { + fmt.Println("err:", err) + } + // 用户续费 err = s.Every(1).Day().At("19:00").Do(models.SendMessageMemberRenewal) if err != nil { fmt.Println("err:", err) } + // 管理端首页 err = s.Every(1).Day().At("1:00").Do(models.IndexMemberStatistic) if err != nil { fmt.Println("err:", err) } + // 卡带回收自动取消 err = s.Every(10).Minutes().Do(models.RecycleCardOrderStateUpdate) if err != nil { diff --git a/config/settings.yml b/config/settings.yml index 20811ce..84a739d 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -52,6 +52,6 @@ settings: export: path: /Users/max/Documents/ - url: http://39.108.188.218:8000/img/export/ + url: /Users/max/Documents/ # path: /www/server/images/export/ # url: https://dev.admin.deovo.com/load/export/ diff --git a/docs/docs.go b/docs/docs.go index 04507bf..d3cfefe 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -6077,6 +6077,108 @@ const docTemplate = `{ } } }, + "/api/v1/user_info/privilege_member/activate_extended_warranty": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.4.2" + ], + "summary": "零售尊享会员激活主机延保", + "parameters": [ + { + "description": "零售尊享会员激活主机延保模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.ActivateExtendedWarrantyReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/user_info/privilege_member/cancel_members": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.4.2" + ], + "summary": "取消尊享会员", + "parameters": [ + { + "description": "取消尊享会员模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CancelPrivilegeMembersReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/user_info/privilege_member/list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.4.2" + ], + "summary": "零售尊享会员列表", + "parameters": [ + { + "description": "零售尊享会员列表模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.PrivilegeMemberListReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PrivilegeMemberListResp" + } + } + } + } + }, "/api/v1/user_info/tel": { "post": { "consumes": [ @@ -6548,6 +6650,32 @@ const docTemplate = `{ } } }, + "models.ActivateExtendedWarrantyReq": { + "type": "object", + "required": [ + "host_code", + "images", + "uid" + ], + "properties": { + "host_code": { + "description": "主机编码", + "type": "string" + }, + "images": { + "description": "图片凭证", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, "models.AssistantInviteMemberReportListResp": { "type": "object", "properties": { @@ -6658,6 +6786,18 @@ const docTemplate = `{ } } }, + "models.CancelPrivilegeMembersReq": { + "type": "object", + "required": [ + "uid" + ], + "properties": { + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, "models.CannibalizeStockTask": { "type": "object", "properties": { @@ -7353,6 +7493,10 @@ const docTemplate = `{ "description": "白金会员数量", "type": "integer" }, + "privilege_count": { + "description": "尊享会员数量", + "type": "integer" + }, "renewal_black_gold_count": { "description": "续费黑金会员数量", "type": "integer" @@ -7365,6 +7509,10 @@ const docTemplate = `{ "description": "续费白金会员数量", "type": "integer" }, + "renewal_privilege_count": { + "description": "续费尊享会员数量", + "type": "integer" + }, "store": { "$ref": "#/definitions/models.Store" }, @@ -7640,6 +7788,10 @@ const docTemplate = `{ "description": "采购进货", "type": "integer" }, + "system_in": { + "description": "系统入库", + "type": "integer" + }, "system_out": { "description": "系统出库", "type": "integer" @@ -7709,6 +7861,10 @@ const docTemplate = `{ "description": "采购进货", "type": "integer" }, + "total_system_in": { + "description": "系统入库", + "type": "integer" + }, "total_system_out": { "description": "系统出库", "type": "integer" @@ -7759,6 +7915,10 @@ const docTemplate = `{ "description": "主供应商名称", "type": "string" }, + "img": { + "description": "图片", + "type": "string" + }, "last_wholesale_price": { "description": "最近采购价", "type": "number" @@ -9204,7 +9364,6 @@ const docTemplate = `{ "salesman", "store_id", "store_name", - "tel", "total_count" ], "properties": { @@ -13192,6 +13351,10 @@ const docTemplate = `{ "description": "白金会员提成", "type": "integer" }, + "privilege_count": { + "description": "尊享会员数量", + "type": "integer" + }, "renewal_black_gold_count": { "description": "续费黑金会员数量(自动)", "type": "integer" @@ -13212,6 +13375,10 @@ const docTemplate = `{ "description": "续费白金会员数量(自动)", "type": "integer" }, + "renewal_privilege_count": { + "description": "续费尊享会员数量", + "type": "integer" + }, "store_id": { "description": "门店id", "type": "integer" @@ -13582,7 +13749,7 @@ const docTemplate = `{ "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-白金→黑金(自动)", + "description": "记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动),21-开通尊享会员, 22-续费尊享会员", "type": "array", "items": { "type": "integer" @@ -14146,6 +14313,183 @@ const docTemplate = `{ } } }, + "models.PrivilegeMember": { + "type": "object", + "properties": { + "audit_time": { + "description": "审核时间", + "type": "string" + }, + "auditor_id": { + "description": "审核人id", + "type": "integer" + }, + "auditor_name": { + "description": "审核人姓名", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "extend_status": { + "description": "延保状态:0-非会员, 1-已过期,2-待激活、3-已激活", + "type": "integer" + }, + "host_code": { + "description": "主机编码", + "type": "string" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "images": { + "description": "图片凭证", + "type": "string" + }, + "member_expire": { + "description": "会员到期时间", + "type": "string" + }, + "member_level": { + "description": "当前会员等级:1-普通用户,6-尊享会员", + "type": "integer" + }, + "open_member_time": { + "description": "开通会员时间", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "store": { + "description": "门店信息", + "allOf": [ + { + "$ref": "#/definitions/models.Store" + } + ] + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "tel": { + "description": "电话", + "type": "string" + }, + "uid": { + "description": "用户id", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "models.PrivilegeMemberListReq": { + "type": "object", + "properties": { + "audit_time_end": { + "description": "审核结束时间", + "type": "string" + }, + "audit_time_start": { + "description": "审核开始时间", + "type": "string" + }, + "auditor_id": { + "description": "审核人", + "type": "integer" + }, + "extend_status": { + "description": "延保状态", + "type": "integer" + }, + "host_code": { + "description": "主机编码", + "type": "string" + }, + "is_export": { + "description": "1-导出excel", + "type": "integer" + }, + "member_expire_end": { + "description": "尊享会员到期时间-结束时间", + "type": "string" + }, + "member_expire_start": { + "description": "尊享会员到期时间-开始时间", + "type": "string" + }, + "member_level": { + "description": "当前会员等级", + "type": "integer" + }, + "open_member_end": { + "description": "首次开通尊享会员-结束时间", + "type": "string" + }, + "open_member_start": { + "description": "首次开通尊享会员-开始时间", + "type": "string" + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "页面条数", + "type": "integer" + }, + "store_id": { + "description": "门店列表(支持复选)", + "type": "array", + "items": { + "type": "integer" + } + }, + "tel": { + "description": "手机号", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, + "models.PrivilegeMemberListResp": { + "type": "object", + "properties": { + "export_url": { + "description": "导出excel路径", + "type": "string" + }, + "list": { + "description": "零售尊享会员信息", + "type": "array", + "items": { + "$ref": "#/definitions/models.PrivilegeMember" + } + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "页面条数", + "type": "integer" + }, + "total": { + "description": "总条数", + "type": "integer" + } + } + }, "models.ProductInventoryAddReq": { "type": "object", "required": [ @@ -16829,7 +17173,15 @@ const docTemplate = `{ "type": "string" }, "member_level": { - "description": "会员等级:1-普通 2-黄金 4-白金 5-黑金", + "description": "当前租卡会员类型:1-普通 2-黄金 4-白金 5-黑金", + "type": "integer" + }, + "privilege_memberExpire": { + "description": "尊享会员到期时间", + "type": "string" + }, + "privilege_member_level": { + "description": "当前尊享会员类型:1-普通 6-尊享会员", "type": "integer" }, "record_time": { diff --git a/docs/swagger.json b/docs/swagger.json index 5118389..274895f 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -6066,6 +6066,108 @@ } } }, + "/api/v1/user_info/privilege_member/activate_extended_warranty": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.4.2" + ], + "summary": "零售尊享会员激活主机延保", + "parameters": [ + { + "description": "零售尊享会员激活主机延保模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.ActivateExtendedWarrantyReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/user_info/privilege_member/cancel_members": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.4.2" + ], + "summary": "取消尊享会员", + "parameters": [ + { + "description": "取消尊享会员模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.CancelPrivilegeMembersReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/app.Response" + } + } + } + } + }, + "/api/v1/user_info/privilege_member/list": { + "post": { + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "会员管理", + "V1.4.2" + ], + "summary": "零售尊享会员列表", + "parameters": [ + { + "description": "零售尊享会员列表模型", + "name": "request", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.PrivilegeMemberListReq" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.PrivilegeMemberListResp" + } + } + } + } + }, "/api/v1/user_info/tel": { "post": { "consumes": [ @@ -6537,6 +6639,32 @@ } } }, + "models.ActivateExtendedWarrantyReq": { + "type": "object", + "required": [ + "host_code", + "images", + "uid" + ], + "properties": { + "host_code": { + "description": "主机编码", + "type": "string" + }, + "images": { + "description": "图片凭证", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, "models.AssistantInviteMemberReportListResp": { "type": "object", "properties": { @@ -6647,6 +6775,18 @@ } } }, + "models.CancelPrivilegeMembersReq": { + "type": "object", + "required": [ + "uid" + ], + "properties": { + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, "models.CannibalizeStockTask": { "type": "object", "properties": { @@ -7342,6 +7482,10 @@ "description": "白金会员数量", "type": "integer" }, + "privilege_count": { + "description": "尊享会员数量", + "type": "integer" + }, "renewal_black_gold_count": { "description": "续费黑金会员数量", "type": "integer" @@ -7354,6 +7498,10 @@ "description": "续费白金会员数量", "type": "integer" }, + "renewal_privilege_count": { + "description": "续费尊享会员数量", + "type": "integer" + }, "store": { "$ref": "#/definitions/models.Store" }, @@ -7629,6 +7777,10 @@ "description": "采购进货", "type": "integer" }, + "system_in": { + "description": "系统入库", + "type": "integer" + }, "system_out": { "description": "系统出库", "type": "integer" @@ -7698,6 +7850,10 @@ "description": "采购进货", "type": "integer" }, + "total_system_in": { + "description": "系统入库", + "type": "integer" + }, "total_system_out": { "description": "系统出库", "type": "integer" @@ -7748,6 +7904,10 @@ "description": "主供应商名称", "type": "string" }, + "img": { + "description": "图片", + "type": "string" + }, "last_wholesale_price": { "description": "最近采购价", "type": "number" @@ -9193,7 +9353,6 @@ "salesman", "store_id", "store_name", - "tel", "total_count" ], "properties": { @@ -13181,6 +13340,10 @@ "description": "白金会员提成", "type": "integer" }, + "privilege_count": { + "description": "尊享会员数量", + "type": "integer" + }, "renewal_black_gold_count": { "description": "续费黑金会员数量(自动)", "type": "integer" @@ -13201,6 +13364,10 @@ "description": "续费白金会员数量(自动)", "type": "integer" }, + "renewal_privilege_count": { + "description": "续费尊享会员数量", + "type": "integer" + }, "store_id": { "description": "门店id", "type": "integer" @@ -13571,7 +13738,7 @@ "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-白金→黑金(自动)", + "description": "记录类型 1-首次邀请,2-开通年费黄金,3-开通季度黄金,4-开通半年黄金, 5-开通年费白金,6-开通年费黑金,7-续费年费黄金(干预),8-续费年费白金(干预),9-续费年费黑金(干预),10-续费年费黄金(自动), 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动),21-开通尊享会员, 22-续费尊享会员", "type": "array", "items": { "type": "integer" @@ -14135,6 +14302,183 @@ } } }, + "models.PrivilegeMember": { + "type": "object", + "properties": { + "audit_time": { + "description": "审核时间", + "type": "string" + }, + "auditor_id": { + "description": "审核人id", + "type": "integer" + }, + "auditor_name": { + "description": "审核人姓名", + "type": "string" + }, + "createdAt": { + "description": "创建时间", + "type": "string" + }, + "extend_status": { + "description": "延保状态:0-非会员, 1-已过期,2-待激活、3-已激活", + "type": "integer" + }, + "host_code": { + "description": "主机编码", + "type": "string" + }, + "id": { + "description": "数据库记录编号", + "type": "integer" + }, + "images": { + "description": "图片凭证", + "type": "string" + }, + "member_expire": { + "description": "会员到期时间", + "type": "string" + }, + "member_level": { + "description": "当前会员等级:1-普通用户,6-尊享会员", + "type": "integer" + }, + "open_member_time": { + "description": "开通会员时间", + "type": "string" + }, + "remark": { + "description": "备注", + "type": "string" + }, + "store": { + "description": "门店信息", + "allOf": [ + { + "$ref": "#/definitions/models.Store" + } + ] + }, + "store_id": { + "description": "门店id", + "type": "integer" + }, + "tel": { + "description": "电话", + "type": "string" + }, + "uid": { + "description": "用户id", + "type": "integer" + }, + "updatedAt": { + "description": "更新时间", + "type": "string" + } + } + }, + "models.PrivilegeMemberListReq": { + "type": "object", + "properties": { + "audit_time_end": { + "description": "审核结束时间", + "type": "string" + }, + "audit_time_start": { + "description": "审核开始时间", + "type": "string" + }, + "auditor_id": { + "description": "审核人", + "type": "integer" + }, + "extend_status": { + "description": "延保状态", + "type": "integer" + }, + "host_code": { + "description": "主机编码", + "type": "string" + }, + "is_export": { + "description": "1-导出excel", + "type": "integer" + }, + "member_expire_end": { + "description": "尊享会员到期时间-结束时间", + "type": "string" + }, + "member_expire_start": { + "description": "尊享会员到期时间-开始时间", + "type": "string" + }, + "member_level": { + "description": "当前会员等级", + "type": "integer" + }, + "open_member_end": { + "description": "首次开通尊享会员-结束时间", + "type": "string" + }, + "open_member_start": { + "description": "首次开通尊享会员-开始时间", + "type": "string" + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "页面条数", + "type": "integer" + }, + "store_id": { + "description": "门店列表(支持复选)", + "type": "array", + "items": { + "type": "integer" + } + }, + "tel": { + "description": "手机号", + "type": "string" + }, + "uid": { + "description": "用户ID", + "type": "integer" + } + } + }, + "models.PrivilegeMemberListResp": { + "type": "object", + "properties": { + "export_url": { + "description": "导出excel路径", + "type": "string" + }, + "list": { + "description": "零售尊享会员信息", + "type": "array", + "items": { + "$ref": "#/definitions/models.PrivilegeMember" + } + }, + "pageIndex": { + "description": "页码", + "type": "integer" + }, + "pageSize": { + "description": "页面条数", + "type": "integer" + }, + "total": { + "description": "总条数", + "type": "integer" + } + } + }, "models.ProductInventoryAddReq": { "type": "object", "required": [ @@ -16818,7 +17162,15 @@ "type": "string" }, "member_level": { - "description": "会员等级:1-普通 2-黄金 4-白金 5-黑金", + "description": "当前租卡会员类型:1-普通 2-黄金 4-白金 5-黑金", + "type": "integer" + }, + "privilege_memberExpire": { + "description": "尊享会员到期时间", + "type": "string" + }, + "privilege_member_level": { + "description": "当前尊享会员类型:1-普通 6-尊享会员", "type": "integer" }, "record_time": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 03c3c30..0d3be64 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -270,6 +270,25 @@ definitions: required: - id type: object + models.ActivateExtendedWarrantyReq: + properties: + host_code: + description: 主机编码 + type: string + images: + description: 图片凭证 + type: string + remark: + description: 备注 + type: string + uid: + description: 用户ID + type: integer + required: + - host_code + - images + - uid + type: object models.AssistantInviteMemberReportListResp: properties: export_url: @@ -348,6 +367,14 @@ definitions: required: - print_list_info type: object + models.CancelPrivilegeMembersReq: + properties: + uid: + description: 用户ID + type: integer + required: + - uid + type: object models.CannibalizeStockTask: properties: count: @@ -854,6 +881,9 @@ definitions: platinum_count: description: 白金会员数量 type: integer + privilege_count: + description: 尊享会员数量 + type: integer renewal_black_gold_count: description: 续费黑金会员数量 type: integer @@ -863,6 +893,9 @@ definitions: renewal_platinum_count: description: 续费白金会员数量 type: integer + renewal_privilege_count: + description: 续费尊享会员数量 + type: integer store: $ref: '#/definitions/models.Store' store_id: @@ -1063,6 +1096,9 @@ definitions: purchase_stock: description: 采购进货 type: integer + system_in: + description: 系统入库 + type: integer system_out: description: 系统出库 type: integer @@ -1114,6 +1150,9 @@ definitions: total_purchase_stock: description: 采购进货 type: integer + total_system_in: + description: 系统入库 + type: integer total_system_out: description: 系统出库 type: integer @@ -1150,6 +1189,9 @@ definitions: erp_supplier_name: description: 主供应商名称 type: string + img: + description: 图片 + type: string last_wholesale_price: description: 最近采购价 type: number @@ -2255,7 +2297,6 @@ definitions: - salesman - store_id - store_name - - tel - total_count type: object models.ErpOrderDeleteReq: @@ -5092,6 +5133,9 @@ definitions: platinum_deduct: description: 白金会员提成 type: integer + privilege_count: + description: 尊享会员数量 + type: integer renewal_black_gold_count: description: 续费黑金会员数量(自动) type: integer @@ -5107,6 +5151,9 @@ definitions: renewal_platinum_count: description: 续费白金会员数量(自动) type: integer + renewal_privilege_count: + description: 续费尊享会员数量 + type: integer store_id: description: 门店id type: integer @@ -5369,7 +5416,8 @@ definitions: 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-白金→黑金(自动) + 11-续费季度黄金(自动),12-续费半年黄金(自动),13-续费年费白金(自动),14-续费年费黑金(自动),15-黄金→白金(干预), 16-黄金→黑金(干预),17-白金→黑金(干预),18-黄金→白金(自动),19-黄金→黑金(自动),20-白金→黑金(自动),21-开通尊享会员, + 22-续费尊享会员 items: type: integer type: array @@ -5771,6 +5819,134 @@ definitions: description: 更新时间 type: string type: object + models.PrivilegeMember: + properties: + audit_time: + description: 审核时间 + type: string + auditor_id: + description: 审核人id + type: integer + auditor_name: + description: 审核人姓名 + type: string + createdAt: + description: 创建时间 + type: string + extend_status: + description: 延保状态:0-非会员, 1-已过期,2-待激活、3-已激活 + type: integer + host_code: + description: 主机编码 + type: string + id: + description: 数据库记录编号 + type: integer + images: + description: 图片凭证 + type: string + member_expire: + description: 会员到期时间 + type: string + member_level: + description: 当前会员等级:1-普通用户,6-尊享会员 + type: integer + open_member_time: + description: 开通会员时间 + type: string + remark: + description: 备注 + type: string + store: + allOf: + - $ref: '#/definitions/models.Store' + description: 门店信息 + store_id: + description: 门店id + type: integer + tel: + description: 电话 + type: string + uid: + description: 用户id + type: integer + updatedAt: + description: 更新时间 + type: string + type: object + models.PrivilegeMemberListReq: + properties: + audit_time_end: + description: 审核结束时间 + type: string + audit_time_start: + description: 审核开始时间 + type: string + auditor_id: + description: 审核人 + type: integer + extend_status: + description: 延保状态 + type: integer + host_code: + description: 主机编码 + type: string + is_export: + description: 1-导出excel + type: integer + member_expire_end: + description: 尊享会员到期时间-结束时间 + type: string + member_expire_start: + description: 尊享会员到期时间-开始时间 + type: string + member_level: + description: 当前会员等级 + type: integer + open_member_end: + description: 首次开通尊享会员-结束时间 + type: string + open_member_start: + description: 首次开通尊享会员-开始时间 + type: string + pageIndex: + description: 页码 + type: integer + pageSize: + description: 页面条数 + type: integer + store_id: + description: 门店列表(支持复选) + items: + type: integer + type: array + tel: + description: 手机号 + type: string + uid: + description: 用户ID + type: integer + type: object + models.PrivilegeMemberListResp: + properties: + export_url: + description: 导出excel路径 + type: string + list: + description: 零售尊享会员信息 + items: + $ref: '#/definitions/models.PrivilegeMember' + type: array + pageIndex: + description: 页码 + type: integer + pageSize: + description: 页面条数 + type: integer + total: + description: 总条数 + type: integer + type: object models.ProductInventoryAddReq: properties: commodities: @@ -7714,11 +7890,17 @@ definitions: description: 邀请人昵称 type: string member_level: - description: 会员等级:1-普通 2-黄金 4-白金 5-黑金 + description: 当前租卡会员类型:1-普通 2-黄金 4-白金 5-黑金 type: integer memberExpire: description: 租卡会员到期时间 type: string + privilege_member_level: + description: 当前尊享会员类型:1-普通 6-尊享会员 + type: integer + privilege_memberExpire: + description: 尊享会员到期时间 + type: string record_time: description: 记录时间 type: string @@ -11904,6 +12086,72 @@ paths: tags: - 会员管理 - V1.2.0 + /api/v1/user_info/privilege_member/activate_extended_warranty: + post: + consumes: + - application/json + parameters: + - description: 零售尊享会员激活主机延保模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.ActivateExtendedWarrantyReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/app.Response' + summary: 零售尊享会员激活主机延保 + tags: + - 会员管理 + - V1.4.2 + /api/v1/user_info/privilege_member/cancel_members: + post: + consumes: + - application/json + parameters: + - description: 取消尊享会员模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.CancelPrivilegeMembersReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/app.Response' + summary: 取消尊享会员 + tags: + - 会员管理 + - V1.4.2 + /api/v1/user_info/privilege_member/list: + post: + consumes: + - application/json + parameters: + - description: 零售尊享会员列表模型 + in: body + name: request + required: true + schema: + $ref: '#/definitions/models.PrivilegeMemberListReq' + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.PrivilegeMemberListResp' + summary: 零售尊享会员列表 + tags: + - 会员管理 + - V1.4.2 /api/v1/user_info/tel: post: consumes: diff --git a/test/gen_test.go b/test/gen_test.go index 71494a9..7001fe7 100644 --- a/test/gen_test.go +++ b/test/gen_test.go @@ -120,7 +120,7 @@ func InitDBTest() { // "mh_pro", "fLeytnBFCRB553ab", "39.108.188.218", "3306", // "mh_pro") dialect := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", - "mh_dev", "m5h4parZsXjbeiFh", "39.108.188.218", "3306", + "mh_dev", "d9qy46ONI0ZTF9eH", "112.33.14.191", "3306", "mh_dev") DBTest, err = gorm.Open("mysql", dialect) diff --git a/test/greentown_sms_test.go b/test/greentown_sms_test.go new file mode 100644 index 0000000..8622236 --- /dev/null +++ b/test/greentown_sms_test.go @@ -0,0 +1,18 @@ +package test + +import ( + "go-admin/app/admin/models" + "testing" +) + +func TestSend(t *testing.T) { + //tel := "17080320980" + tel := "13714071204,17727927738" + //tel := "17602181899" + + models.SmsSend(tel, "【go2switch】温馨提示:您的会员即将过期,请在过期之前将卡归还到门店,如有问题联系客服") +} + +func TestGtSendMessage(t *testing.T) { + models.GtSendMessage([]string{"15019230751"}, "【go2ns】绿城短信推送测试,测试") +}