新增了:修改系统优惠卷、修改系统优惠卷状态

This commit is contained in:
wucongxing8150 2024-05-30 14:13:07 +08:00
parent 44f9cdcb93
commit d207720a4c
7 changed files with 347 additions and 15 deletions

View File

@ -110,3 +110,81 @@ func (r *Coupon) AddSystemCoupon(c *gin.Context) {
responses.Ok(c) 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)
}

View File

@ -40,8 +40,8 @@ func (r *CouponDao) EditCoupon(tx *gorm.DB, maps interface{}, data interface{})
return nil return nil
} }
// EditCouponByOrderServicePackageId 修改-id // EditCouponById 修改
func (r *CouponDao) EditCouponByOrderServicePackageId(tx *gorm.DB, couponId int64, data interface{}) error { func (r *CouponDao) EditCouponById(tx *gorm.DB, couponId int64, data interface{}) error {
err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).Updates(data).Error err := tx.Model(&model.Coupon{}).Where("coupon_id = ?", couponId).Updates(data).Error
if err != nil { if err != nil {
return err return err

View File

@ -53,10 +53,10 @@ func GetCouponDto(m *model.Coupon) *CouponDto {
ApplicationScope: m.ApplicationScope, ApplicationScope: m.ApplicationScope,
InquiryType: m.InquiryType, InquiryType: m.InquiryType,
BrandId: fmt.Sprintf("%d", m.BrandId), BrandId: fmt.Sprintf("%d", m.BrandId),
IsMutex: m.IsMutex, IsMutex: *m.IsMutex,
IsDisplay: m.IsDisplay, IsDisplay: m.IsDisplay,
DistributionWithDay: m.DistributionWithDay, DistributionWithDay: m.DistributionWithDay,
MinUsableNumber: m.MinUsableNumber, MinUsableNumber: *m.MinUsableNumber,
CouponCount: m.CouponCount, CouponCount: m.CouponCount,
CouponTakeCount: m.CouponTakeCount, CouponTakeCount: m.CouponTakeCount,
CouponUsedCount: m.CouponUsedCount, CouponUsedCount: m.CouponUsedCount,
@ -94,10 +94,10 @@ func GetCouponListDto(m []*model.Coupon) []*CouponDto {
ApplicationScope: v.ApplicationScope, ApplicationScope: v.ApplicationScope,
InquiryType: v.InquiryType, InquiryType: v.InquiryType,
BrandId: fmt.Sprintf("%d", v.BrandId), BrandId: fmt.Sprintf("%d", v.BrandId),
IsMutex: v.IsMutex, IsMutex: *v.IsMutex,
IsDisplay: v.IsDisplay, IsDisplay: v.IsDisplay,
DistributionWithDay: v.DistributionWithDay, DistributionWithDay: v.DistributionWithDay,
MinUsableNumber: v.MinUsableNumber, MinUsableNumber: *v.MinUsableNumber,
CouponCount: v.CouponCount, CouponCount: v.CouponCount,
CouponTakeCount: v.CouponTakeCount, CouponTakeCount: v.CouponTakeCount,
CouponUsedCount: v.CouponUsedCount, CouponUsedCount: v.CouponUsedCount,

View File

@ -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"` 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"` 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"` 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"` 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"` 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"` 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"` 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"` CouponUsedCount int `gorm:"column:coupon_used_count;type:int(10);default:0;comment:已使用数量" json:"coupon_used_count"`

View File

@ -3,6 +3,8 @@ package requests
type CouponRequest struct { type CouponRequest struct {
GetSystemCouponPage // 获取系统优惠卷列表-分页 GetSystemCouponPage // 获取系统优惠卷列表-分页
AddSystemCoupon // 新增系统优惠卷 AddSystemCoupon // 新增系统优惠卷
PutSystemCoupon // 修改系统优惠卷
PutSystemCouponStatus // 修改系统优惠卷状态
} }
// GetSystemCouponPage 获取系统优惠卷列表-分页 // GetSystemCouponPage 获取系统优惠卷列表-分页
@ -33,7 +35,7 @@ type AddSystemCoupon struct {
CouponClient *int `json:"coupon_client" form:"coupon_client" label:"使用平台" validate:"required,oneof=1"` // 使用平台1:小程序) 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:数量) 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"` 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:检测) 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如不限制品牌此项为空 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:是)互斥情况下无法和其他优惠卷同时使用 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:是) 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:"优惠卷描述"` 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:删除)
}

View File

@ -736,10 +736,10 @@ func privateRouter(r *gin.Engine, api controller.Api) {
systemGroup.POST("", api.Coupon.AddSystemCoupon) 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)
} }
// 用户优惠卷管理 // 用户优惠卷管理

View File

@ -145,7 +145,7 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err
CouponStatus: *req.CouponClient, CouponStatus: *req.CouponClient,
DistributionObject: *req.DistributionObject, DistributionObject: *req.DistributionObject,
ApplicationScope: *req.ApplicationScope, ApplicationScope: *req.ApplicationScope,
IsMutex: *req.IsMutex, IsMutex: req.IsMutex,
IsDisplay: *req.IsDisplay, IsDisplay: *req.IsDisplay,
CouponCount: *req.CouponCount, CouponCount: *req.CouponCount,
CouponPrice: *req.CouponPrice, CouponPrice: *req.CouponPrice,
@ -208,11 +208,16 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err
coupon.DistributionWithDay = *req.DistributionWithDay coupon.DistributionWithDay = *req.DistributionWithDay
} }
// 关联 单商品最小可使用数量 // 发放关联天数
if req.DistributionWithDay != nil { if req.DistributionWithDay != nil {
coupon.DistributionWithDay = *req.DistributionWithDay coupon.DistributionWithDay = *req.DistributionWithDay
} }
// 单商品最小可使用数量
if req.MinUsableNumber != nil {
coupon.MinUsableNumber = req.MinUsableNumber
}
// 符合满减标准金额 // 符合满减标准金额
if req.WithAmount != nil { if req.WithAmount != nil {
coupon.WithAmount = *req.WithAmount coupon.WithAmount = *req.WithAmount
@ -245,6 +250,228 @@ func (r *CouponService) AddSystemCoupon(req requests.AddSystemCoupon) (bool, err
return false, errors.New(err.Error()) 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() tx.Commit()
return true, nil return true, nil
} }