From d207720a4c3b0666265ac69c7aeb8b3390d6fbd0 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Thu, 30 May 2024 14:13:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=86=EF=BC=9A=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7=E3=80=81?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=B3=BB=E7=BB=9F=E4=BC=98=E6=83=A0=E5=8D=B7?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/controller/coupon.go | 78 +++++++++++++ api/dao/coupon.go | 4 +- api/dto/coupon.go | 8 +- api/model/coupon.go | 4 +- api/requests/coupon.go | 33 +++++- api/router/router.go | 4 +- api/service/coupon.go | 231 ++++++++++++++++++++++++++++++++++++++- 7 files changed, 347 insertions(+), 15 deletions(-) diff --git a/api/controller/coupon.go b/api/controller/coupon.go index 477387c..2d59413 100644 --- a/api/controller/coupon.go +++ b/api/controller/coupon.go @@ -110,3 +110,81 @@ func (r *Coupon) AddSystemCoupon(c *gin.Context) { responses.Ok(c) } + +// PutSystemCoupon 修改系统优惠卷 +func (r *Coupon) PutSystemCoupon(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.PutSystemCoupon + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("coupon_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + couponId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + couponService := service.CouponService{} + _, err = couponService.PutSystemCoupon(couponId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} + +// PutSystemCouponStatus 修改系统优惠卷状态 +func (r *Coupon) PutSystemCouponStatus(c *gin.Context) { + couponRequest := requests.CouponRequest{} + req := couponRequest.PutSystemCouponStatus + if err := c.ShouldBindJSON(&req); err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + // 参数验证 + if err := global.Validate.Struct(req); err != nil { + responses.FailWithMessage(utils.Translate(err), c) + return + } + + id := c.Param("coupon_id") + if id == "" { + responses.FailWithMessage("缺少参数", c) + return + } + + // 将 id 转换为 int64 类型 + couponId, err := strconv.ParseInt(id, 10, 64) + if err != nil { + responses.Fail(c) + return + } + + // 业务处理 + couponService := service.CouponService{} + _, err = couponService.PutSystemCouponStatus(couponId, req) + if err != nil { + responses.FailWithMessage(err.Error(), c) + return + } + + responses.Ok(c) +} diff --git a/api/dao/coupon.go b/api/dao/coupon.go index c20d879..331b494 100644 --- a/api/dao/coupon.go +++ b/api/dao/coupon.go @@ -40,8 +40,8 @@ func (r *CouponDao) EditCoupon(tx *gorm.DB, maps interface{}, data interface{}) return nil } -// EditCouponByOrderServicePackageId 修改-id -func (r *CouponDao) EditCouponByOrderServicePackageId(tx *gorm.DB, couponId int64, data interface{}) error { +// EditCouponById 修改 +func (r *CouponDao) EditCouponById(tx *gorm.DB, couponId int64, data interface{}) error { err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).Updates(data).Error if err != nil { return err diff --git a/api/dto/coupon.go b/api/dto/coupon.go index 1d0466b..1ddac2f 100644 --- a/api/dto/coupon.go +++ b/api/dto/coupon.go @@ -53,10 +53,10 @@ func GetCouponDto(m *model.Coupon) *CouponDto { ApplicationScope: m.ApplicationScope, InquiryType: m.InquiryType, BrandId: fmt.Sprintf("%d", m.BrandId), - IsMutex: m.IsMutex, + IsMutex: *m.IsMutex, IsDisplay: m.IsDisplay, DistributionWithDay: m.DistributionWithDay, - MinUsableNumber: m.MinUsableNumber, + MinUsableNumber: *m.MinUsableNumber, CouponCount: m.CouponCount, CouponTakeCount: m.CouponTakeCount, CouponUsedCount: m.CouponUsedCount, @@ -94,10 +94,10 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto { ApplicationScope: v.ApplicationScope, InquiryType: v.InquiryType, BrandId: fmt.Sprintf("%d", v.BrandId), - IsMutex: v.IsMutex, + IsMutex: *v.IsMutex, IsDisplay: v.IsDisplay, DistributionWithDay: v.DistributionWithDay, - MinUsableNumber: v.MinUsableNumber, + MinUsableNumber: *v.MinUsableNumber, CouponCount: v.CouponCount, CouponTakeCount: v.CouponTakeCount, CouponUsedCount: v.CouponUsedCount, diff --git a/api/model/coupon.go b/api/model/coupon.go index e84a0b0..0f51d26 100644 --- a/api/model/coupon.go +++ b/api/model/coupon.go @@ -18,10 +18,10 @@ type Coupon struct { ApplicationScope int `gorm:"column:application_scope;type:tinyint(1);default:1;comment:适用范围(1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品)" json:"application_scope"` InquiryType string `gorm:"column:inquiry_type;type:varchar(100);comment:关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测)" json:"inquiry_type"` BrandId *int64 `gorm:"column:brand_id;type:bigint(19);comment:关联品牌id(如不限制品牌,此项为空)" json:"brand_id"` - IsMutex int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` + IsMutex *int `gorm:"column:is_mutex;type:tinyint(1);default:1;comment:是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用" json:"is_mutex"` IsDisplay int `gorm:"column:is_display;type:tinyint(1);comment:是否展示(0:否 1:是)" json:"is_display"` DistributionWithDay int `gorm:"column:distribution_with_day;type:int(11);default:0;comment:发放关联天数(发放对象为近期消费等类型时规定天数)" json:"distribution_with_day"` - MinUsableNumber int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` + MinUsableNumber *int `gorm:"column:min_usable_number;type:int(11);default:1;comment:单商品最小可使用数量(默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处)" json:"min_usable_number"` CouponCount int `gorm:"column:coupon_count;type:int(10);default:0;comment:发放数量" json:"coupon_count"` CouponTakeCount int `gorm:"column:coupon_take_count;type:int(10);default:0;comment:已领取数量" json:"coupon_take_count"` CouponUsedCount int `gorm:"column:coupon_used_count;type:int(10);default:0;comment:已使用数量" json:"coupon_used_count"` diff --git a/api/requests/coupon.go b/api/requests/coupon.go index af00ef9..64b38bc 100644 --- a/api/requests/coupon.go +++ b/api/requests/coupon.go @@ -1,8 +1,10 @@ package requests type CouponRequest struct { - GetSystemCouponPage // 获取系统优惠卷列表-分页 - AddSystemCoupon // 新增系统优惠卷 + GetSystemCouponPage // 获取系统优惠卷列表-分页 + AddSystemCoupon // 新增系统优惠卷 + PutSystemCoupon // 修改系统优惠卷 + PutSystemCouponStatus // 修改系统优惠卷状态 } // GetSystemCouponPage 获取系统优惠卷列表-分页 @@ -33,7 +35,7 @@ type AddSystemCoupon struct { CouponClient *int `json:"coupon_client" form:"coupon_client" label:"使用平台" validate:"required,oneof=1"` // 使用平台(1:小程序) CouponType *int `json:"coupon_type" form:"coupon_type" label:"优惠卷类型" validate:"required,oneof=1 2 3"` // 优惠卷类型(1 :无门槛 2:满减 3:数量) DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` - ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` + ApplicationScope *int `json:"application_scope" form:"application_scope" label:"适用范围" validate:"required,oneof=1 2 3 4 5 6"` // (1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品) InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 @@ -53,3 +55,28 @@ type AddSystemCoupon struct { IsPopup *int `json:"is_popup" form:"is_popup" label:"是否首页弹窗" validate:"required,oneof=0 1"` // 是否首页弹窗(0:否 1:是) CouponDesc *string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` } + +// PutSystemCoupon 修改系统优惠卷 +type PutSystemCoupon struct { + CouponName string `json:"coupon_name" form:"coupon_name" label:"优惠卷名称" validate:"required"` // 优惠卷名称 + CouponIcon string `json:"coupon_icon" form:"coupon_icon" label:"头像"` // 优惠卷名称 + DistributionObject *int `json:"distribution_object" form:"distribution_object" label:"发放对象" validate:"required,oneof=1 2 3 4 5 6 7"` // (1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户) + InquiryType *string `json:"inquiry_type" form:"inquiry_type" label:"关联问诊类型" validate:"omitempty,oneof=1 2 3 4 5 6"` // 关联问诊类型,application_scope=问诊时存在生效,逗号分隔(1:全部 2:快速问诊 3:专家问诊 4:公益问诊 5:问诊购药 6:检测) + BrandId *string `json:"brand_id" form:"brand_id" label:"关联品牌id"` // 关联品牌id(如不限制品牌,此项为空) + IsMutex *int `json:"is_mutex" form:"is_mutex" label:"是否互斥" validate:"required,oneof=0 1"` // 是否互斥(0:否 1:是)互斥情况下无法和其他优惠卷同时使用 + IsDisplay *int `json:"is_display" form:"is_display" label:"是否展示" validate:"required,oneof=0 1"` // 是否展示(0:否 1:是) + DistributionWithDay *int `json:"distribution_with_day" form:"distribution_with_day" label:"发放关联天数" validate:"omitempty,numeric,min=1"` // (发放对象为近期消费等类型时规定天数) + MinUsableNumber *int `json:"min_usable_number" form:"min_usable_number" label:"单商品最小可使用数量" validate:"omitempty,numeric,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponCount *int `json:"coupon_count" form:"coupon_count" label:"发放数量" validate:"required,number,min=1"` // (默认为1,类型为数量时使用,如需限制优惠卷使用数量,请填写此处) + CouponPrice *float64 `json:"coupon_price" form:"coupon_price" label:"优惠卷金额" validate:"required,numeric,gt=0"` // 优惠卷金额 + ProductId []string `json:"product_id" form:"product_id" label:"关联商品id"` // ,逗号分隔,指定商品时,填入此项。 + ReissueIntervalDays *int `json:"reissue_interval_days" form:"reissue_interval_days" label:"确认收货后的再次发放间隔天数" validate:"omitempty,numeric,min=0"` // (如果设置为 0,则表示不再次发放。当适用范围为商品时生效) + IsReissuableAfterExpire *int `json:"is_reissuable_after_expire" form:"is_reissuable_after_expire" label:"过期之后是否允许再次发放" validate:"omitempty,oneof=0 1"` // 过期之后是否允许再次发放(0:否 1:是) + IsPopup *int `json:"is_popup" form:"is_popup" label:"是否首页弹窗" validate:"required,oneof=0 1"` // 是否首页弹窗(0:否 1:是) + CouponDesc *string `json:"coupon_desc" form:"coupon_desc" label:"优惠卷描述"` +} + +// PutSystemCouponStatus 修改系统优惠卷状态 +type PutSystemCouponStatus struct { + CouponStatus int `json:"coupon_status" form:"coupon_status" label:"状态" validate:"required,oneof=2 3 4"` // (1:正常 2:强制失效 3:结束 4:删除) +} diff --git a/api/router/router.go b/api/router/router.go index 758e9a3..1e47da2 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -736,10 +736,10 @@ func privateRouter(r *gin.Engine, api controller.Api) { systemGroup.POST("", api.Coupon.AddSystemCoupon) // 修改系统优惠卷 - systemGroup.PUT("/:coupon_id", api.Product.PutProduct) + systemGroup.PUT("/:coupon_id", api.Coupon.PutSystemCoupon) // 修改系统优惠卷状态 - systemGroup.PUT("/status/:product_id", api.Product.PutProductStatus) + systemGroup.PUT("/status/:coupon_id", api.Coupon.PutSystemCouponStatus) } // 用户优惠卷管理 diff --git a/api/service/coupon.go b/api/service/coupon.go index 8353239..b8367cb 100644 --- a/api/service/coupon.go +++ b/api/service/coupon.go @@ -145,7 +145,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err CouponStatus: *req.CouponClient, DistributionObject: *req.DistributionObject, ApplicationScope: *req.ApplicationScope, - IsMutex: *req.IsMutex, + IsMutex: req.IsMutex, IsDisplay: *req.IsDisplay, CouponCount: *req.CouponCount, CouponPrice: *req.CouponPrice, @@ -208,11 +208,16 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err coupon.DistributionWithDay = *req.DistributionWithDay } - // 关联 单商品最小可使用数量 + // 发放关联天数 if req.DistributionWithDay != nil { coupon.DistributionWithDay = *req.DistributionWithDay } + // 单商品最小可使用数量 + if req.MinUsableNumber != nil { + coupon.MinUsableNumber = req.MinUsableNumber + } + // 符合满减标准金额 if req.WithAmount != nil { coupon.WithAmount = *req.WithAmount @@ -245,6 +250,228 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err return false, errors.New(err.Error()) } + // 增加优惠卷过期队列 + + tx.Commit() + return true, nil +} + +// PutSystemCoupon 修改系统优惠卷 +func (r *CouponService) PutSystemCoupon(couponId int64, req requests.PutSystemCoupon) (bool, error) { + couponDao := dao.CouponDao{} + coupon, err := couponDao.GetCouponById(couponId) + if err != nil { + return false, err + } + + if coupon.CouponStatus != 1 { + return false, errors.New("优惠卷非正常状态,不支持更改") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + couponData := make(map[string]interface{}) + + // 优惠卷名称 + if req.CouponName != coupon.CouponName { + couponData["coupon_name"] = req.CouponName + } + + // 头像 + if req.CouponIcon != "" { + if req.CouponIcon != coupon.CouponIcon { + couponData["coupon_icon"] = req.CouponIcon + } + } + + // 发放对象 + if req.DistributionObject != nil { + if *req.DistributionObject != coupon.DistributionObject { + couponData["distribution_object"] = req.DistributionObject + } + } + + // 关联问诊类型 + if coupon.ApplicationScope == 2 { + if req.InquiryType != nil { + if *req.InquiryType != coupon.InquiryType { + couponData["inquiry_type"] = req.InquiryType + } + } + } + + // 关联品牌id + if coupon.ApplicationScope == 3 { + // 将 id 转换为 int64 类型 + brandId, err := strconv.ParseInt(*req.BrandId, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + if &brandId != coupon.BrandId { + couponData["brand_id"] = req.InquiryType + } + } + + // 是否互斥 + if req.IsMutex != nil { + if req.IsMutex != coupon.IsMutex { + couponData["is_mutex"] = req.IsMutex + } + } + + // 是否展示 + if req.IsDisplay != nil { + if *req.IsDisplay != coupon.IsDisplay { + couponData["is_display"] = req.IsDisplay + } + } + + // 发放关联天数 + if coupon.DistributionObject == 4 { + if req.DistributionWithDay != nil { + if *req.DistributionWithDay != coupon.DistributionWithDay { + couponData["distribution_with_day"] = req.InquiryType + } + } + } + + // 单商品最小可使用数量 + if coupon.ApplicationScope == 1 && coupon.CouponType == 3 { + if req.MinUsableNumber != nil { + couponData["min_usable_number"] = req.InquiryType + } + } + + // 发放数量 + if req.CouponCount != nil { + if *req.CouponCount != coupon.CouponCount { + if *req.CouponCount <= coupon.CouponTakeCount { + tx.Rollback() + return false, errors.New("发放数量,不可低于已发放数量") + } + + couponData["coupon_count"] = req.InquiryType + } + } + + // 优惠卷金额 + if req.CouponPrice != nil { + if *req.CouponPrice != coupon.CouponPrice { + couponData["coupon_price"] = req.InquiryType + } + } + + // 关联商品id + if len(req.ProductId) > 0 { + productId := strings.Join(req.ProductId, ",") + + if productId != coupon.ProductId { + productDao := dao.ProductDao{} + for _, s := range req.ProductId { + // 将 id 转换为 int64 类型 + productId, err := strconv.ParseInt(s, 10, 64) + if err != nil { + tx.Rollback() + return false, errors.New("修改失败") + } + + _, err = productDao.GetProductById(productId) + if err != nil { + tx.Rollback() + return false, errors.New("存在错误商品") + } + } + + couponData["product_id"] = productId + } + } + + // 确认收货后的再次发放间隔天数 + if req.ReissueIntervalDays != nil { + if *req.ReissueIntervalDays != coupon.ReissueIntervalDays { + couponData["reissue_interval_days"] = req.ReissueIntervalDays + } + } + + // 过期之后是否允许再次发放 + if req.IsReissuableAfterExpire != nil { + if *req.IsReissuableAfterExpire != coupon.IsReissuableAfterExpire { + couponData["is_reissuable_after_expire"] = req.IsReissuableAfterExpire + } + } + + // 是否首页弹窗 + if *req.IsPopup != coupon.IsPopup { + couponData["is_popup"] = req.IsPopup + } + + // 优惠卷描述 + if req.CouponDesc != nil { + if *req.CouponDesc != coupon.CouponDesc { + couponData["coupon_desc"] = req.CouponDesc + } + } + + err = couponDao.EditCouponById(tx, coupon.CouponId, couponData) + if err != nil || coupon == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + + tx.Commit() + return true, nil +} + +// PutSystemCouponStatus 修改系统优惠卷状态 +func (r *CouponService) PutSystemCouponStatus(couponId int64, req requests.PutSystemCouponStatus) (bool, error) { + couponDao := dao.CouponDao{} + coupon, err := couponDao.GetCouponById(couponId) + if err != nil { + return false, err + } + + // 状态未变 + if coupon.CouponStatus == req.CouponStatus { + return true, nil + } + + if coupon.CouponStatus == 2 { + return false, errors.New("优惠卷已强制失效,无法再次操作") + } + + if coupon.CouponStatus == 3 { + return false, errors.New("优惠卷已结束,无法再次操作") + } + + if coupon.CouponStatus == 4 { + return false, errors.New("优惠卷已删除,无法再次操作") + } + + // 开始事务 + tx := global.Db.Begin() + defer func() { + if r := recover(); r != nil { + tx.Rollback() + } + }() + + couponData := make(map[string]interface{}) + couponData["coupon_status"] = req.CouponStatus + + err = couponDao.EditCouponById(tx, coupon.CouponId, couponData) + if err != nil || coupon == nil { + tx.Rollback() + return false, errors.New(err.Error()) + } + tx.Commit() return true, nil }