1、新增零售发尊享会员优惠券的逻辑;

2、新增/编辑零售订单时返回订单数据;
This commit is contained in:
chenlin 2025-05-23 11:00:40 +08:00
parent cc2beb17a0
commit 505f7548a5
3 changed files with 232 additions and 26 deletions

View File

@ -21,7 +21,7 @@ import (
// @Produce json // @Produce json
// @Accept json // @Accept json
// @Param request body models.ErpOrderCreateReq true "新建零售订单模型" // @Param request body models.ErpOrderCreateReq true "新建零售订单模型"
// @Success 200 {object} app.Response // @Success 200 {object} models.ErpOrder
// @Router /api/v1/erp_order/create [post] // @Router /api/v1/erp_order/create [post]
func ErpOrderCreate(c *gin.Context) { func ErpOrderCreate(c *gin.Context) {
var req = new(model.ErpOrderCreateReq) var req = new(model.ErpOrderCreateReq)
@ -44,14 +44,14 @@ func ErpOrderCreate(c *gin.Context) {
app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号") app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号")
} }
err = model.CreateErpOrder(req, c) erpOrder, err := model.CreateErpOrder(req, c)
if err != nil { if err != nil {
logger.Error("CreateErpOrder err:", logger.Field("err", err)) logger.Error("CreateErpOrder err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, err.Error()) app.Error(c, http.StatusInternalServerError, err, err.Error())
return return
} }
app.OK(c, nil, "新增成功") app.OK(c, erpOrder, "新增成功")
return return
} }
@ -61,7 +61,7 @@ func ErpOrderCreate(c *gin.Context) {
// @Produce json // @Produce json
// @Accept json // @Accept json
// @Param request body models.ErpOrderCreateReq true "编辑零售订单模型" // @Param request body models.ErpOrderCreateReq true "编辑零售订单模型"
// @Success 200 {object} app.Response // @Success 200 {object} models.ErpOrder
// @Router /api/v1/erp_order/edit [post] // @Router /api/v1/erp_order/edit [post]
func ErpOrderEdit(c *gin.Context) { func ErpOrderEdit(c *gin.Context) {
var req = new(model.ErpOrderCreateReq) var req = new(model.ErpOrderCreateReq)
@ -82,14 +82,14 @@ func ErpOrderEdit(c *gin.Context) {
app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号") app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号")
} }
err = model.EditErpOrder(req, c) erpOrder, err := model.EditErpOrder(req, c)
if err != nil { if err != nil {
logger.Error("EditErpOrder err:", logger.Field("err", err)) logger.Error("EditErpOrder err:", logger.Field("err", err))
app.Error(c, http.StatusInternalServerError, err, err.Error()) app.Error(c, http.StatusInternalServerError, err, err.Error())
return return
} }
app.OK(c, nil, "编辑成功") app.OK(c, erpOrder, "编辑成功")
return return
} }
@ -287,6 +287,11 @@ func ErpOrderAudit(c *gin.Context) {
return return
} }
if req.State == 1 && nPayStatus == model.HavePaid { // 已完成支付的零售订单判断是否发优惠券
// 发放尊享会员优惠券
model.UpdateSwitchUserCoupon(erpOrder.ID, erpOrder.Uid)
}
app.OK(c, nil, "") app.OK(c, nil, "")
return return
} }

View File

@ -4,6 +4,12 @@ import "time"
const ( const (
CouponTypeDeduction = "deduction" // 抵扣 CouponTypeDeduction = "deduction" // 抵扣
Switch1ActivityId = 11 // switch1用户尊享会员优惠券
Switch2ActivityId = 12 // switch2用户尊享会员优惠券
Switch1CategoryId1 = 2 // 国行主机分类ID
Switch1CategoryId2 = 3 // 通用主机分类ID
Switch2CategoryId2 = 68 // switch2主机分类ID
SwitchActivityType = 11 // 尊享会员优惠券类型
) )
// gen:qs // gen:qs

View File

@ -7,6 +7,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/xuri/excelize/v2" "github.com/xuri/excelize/v2"
"go-admin/app/admin/apis/pay" "go-admin/app/admin/apis/pay"
utils "go-admin/app/admin/models/tools"
orm "go-admin/common/global" orm "go-admin/common/global"
"go-admin/logger" "go-admin/logger"
"go-admin/tools" "go-admin/tools"
@ -2600,6 +2601,11 @@ func ErpOrderPay(req *ErpOrderPayReq, c *gin.Context) (*ErpOrderPayResp, error)
} }
} }
if payStatus == PayOk { // 已完成支付的订单判断是否发优惠券
// 发放尊享会员优惠券
UpdateSwitchUserCoupon(orderInfo.ID, orderInfo.Uid)
}
return resp, nil return resp, nil
} }
@ -2705,6 +2711,11 @@ func QueryErpOrderPayStatus(billSn string) (*ErpOrderPayResp, error) {
return resp, fmt.Errorf("QueryErpOrderPayStatus[commit err]%v", err) return resp, fmt.Errorf("QueryErpOrderPayStatus[commit err]%v", err)
} }
if payStatus == PayOk { // 已完成支付的订单判断是否发优惠券
// 发放尊享会员优惠券
UpdateSwitchUserCoupon(orderInfo.ID, orderInfo.Uid)
}
resp.Status = payStatus resp.Status = payStatus
return resp, nil return resp, nil
} }
@ -5975,14 +5986,14 @@ func QueryReceiptData(req *ErpOrderDeleteReq, c *gin.Context) (*ErpOrderReceiptD
} }
// CreateErpOrder 创建零售订单 // CreateErpOrder 创建零售订单
func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error { func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
for i, _ := range req.ErpOrderCommodities { for i, _ := range req.ErpOrderCommodities {
req.ErpOrderCommodities[i].ID = 0 req.ErpOrderCommodities[i].ID = 0
} }
// 校验订单数据 // 校验订单数据
erpOrder, err := checkOrderData(req, c) erpOrder, err := checkOrderData(req, c)
if err != nil { if err != nil {
return err return nil, err
} }
// 四舍五入 // 四舍五入
tools.RoundFloatFields(req) tools.RoundFloatFields(req)
@ -5993,7 +6004,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
userInfo, err := GetUserInfoByTel(req.Tel) userInfo, err := GetUserInfoByTel(req.Tel)
if err != nil { if err != nil {
logger.Error("checkOrderData GetUserInfoByTel err:", logger.Field("err", err)) logger.Error("checkOrderData GetUserInfoByTel err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
if userInfo.Uid == 0 { if userInfo.Uid == 0 {
@ -6010,7 +6021,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("create user err:", logger.Field("err", err)) logger.Error("create user err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
} }
} }
@ -6025,7 +6036,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("create erp_order err:", logger.Field("err", err)) logger.Error("create erp_order err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
// 销售信息添加零售订单id // 销售信息添加零售订单id
@ -6037,7 +6048,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("Create erp_order_sales err") logger.Error("Create erp_order_sales err")
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
// 支付方式添加零售订单id // 支付方式添加零售订单id
@ -6055,7 +6066,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("Create erp_order_pay_way err") logger.Error("Create erp_order_pay_way err")
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
// 订单商品表信息添加零售订单id // 订单商品表信息添加零售订单id
@ -6068,37 +6079,41 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("Create erp_order_commodity err") logger.Error("Create erp_order_commodity err")
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
err = begin.Commit().Error err = begin.Commit().Error
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("commit err:", logger.Field("err", err)) logger.Error("commit err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
return nil erpOrder.Commodities = req.ErpOrderCommodities
erpOrder.Cashiers = req.Cashiers
erpOrder.Salesman = req.Salesman
return erpOrder, nil
} }
// EditErpOrder 编辑订单 // EditErpOrder 编辑订单
func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error { func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
var orderInfo ErpOrder var orderInfo ErpOrder
err := orm.Eloquent.Table("erp_order").Where("bill_sn=?", req.BillSn).Find(&orderInfo).Error err := orm.Eloquent.Table("erp_order").Where("bill_sn=?", req.BillSn).Find(&orderInfo).Error
if err != nil { if err != nil {
logger.Error("query erp_order err:", logger.Field("err", err)) logger.Error("query erp_order err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
if orderInfo.State != ErpOrderStateUnAudit { if orderInfo.State != ErpOrderStateUnAudit {
logger.Error("EditErpOrder err:", logger.Field("err", err)) logger.Error("EditErpOrder err:", logger.Field("err", err))
return errors.New("订单状态不是待审核,操作失败") return nil, errors.New("订单状态不是待审核,操作失败")
} }
// 校验订单数据 // 校验订单数据
erpOrder, err := checkOrderData(req, c) erpOrder, err := checkOrderData(req, c)
if err != nil { if err != nil {
return err return nil, err
} }
erpOrder.ID = orderInfo.ID erpOrder.ID = orderInfo.ID
@ -6110,7 +6125,7 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("update erp_order err:", logger.Field("err", err)) logger.Error("update erp_order err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
// 2-更新零售订单商品信息 // 2-更新零售订单商品信息
@ -6118,7 +6133,7 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("update erp_order_commodity err:", logger.Field("err", err)) logger.Error("update erp_order_commodity err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
// 3-更新销售员信息记录 // 3-更新销售员信息记录
@ -6126,7 +6141,7 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("update erp_order_sales err:", logger.Field("err", err)) logger.Error("update erp_order_sales err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
// 4-更新支付方式记录 // 4-更新支付方式记录
@ -6134,17 +6149,21 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("update erp_order_pay_way err:", logger.Field("err", err)) logger.Error("update erp_order_pay_way err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
err = begin.Commit().Error err = begin.Commit().Error
if err != nil { if err != nil {
begin.Rollback() begin.Rollback()
logger.Error("commit err:", logger.Field("err", err)) logger.Error("commit err:", logger.Field("err", err))
return errors.New("操作失败:" + err.Error()) return nil, errors.New("操作失败:" + err.Error())
} }
return nil erpOrder.Commodities = req.ErpOrderCommodities
erpOrder.Cashiers = req.Cashiers
erpOrder.Salesman = req.Salesman
return erpOrder, nil
} }
// CheckUserStore 校验用户门店是否包含在门店数据中且未过期 // CheckUserStore 校验用户门店是否包含在门店数据中且未过期
@ -8187,3 +8206,179 @@ func saleDetailExport(list []ErpOrder, sumData RetailDetailTotalData, c *gin.Con
} }
return url + fileName, nil return url + fileName, nil
} }
// UpdateSwitchUserCoupon
// 针对购买switch1老主机的用户如果有录入手机号且开通了会员则自动发放"500元尊享会员开通优惠券"
// 针对购买switch2新主机的用户如果有录入手机号且开通了会员则自动发放"300元尊享会员开通优惠券"
func UpdateSwitchUserCoupon(orderId uint32, uid int) error {
if uid == 0 || orderId == 0 {
return errors.New("参数不能为空")
}
// 判断是否是会员
userInfo, err := GetUserInfoByUid(uint32(uid))
if err != nil {
logger.Error("获取用户信息失败:", logger.Field("err", err))
return err
}
if userInfo.Uid == 0 {
logger.Errorf("未查询到用户信息,uid:", uid)
return errors.New("未查询到用户信息")
}
// 判断是否购买了switch1主机
var commodity []ErpOrderCommodity
err = orm.Eloquent.Table("erp_order_commodity").Where("erp_order_id = ?", orderId).Find(&commodity).Error
if err != nil && err != RecordNotFound {
logger.Errorf("查询订单商品失败: %w", err)
return fmt.Errorf("查询订单商品失败: %w", err)
}
buySwitch1, buySwitch2 := false, false
for _, item := range commodity {
if item.ErpCategoryId == Switch2CategoryId2 { // 判断是否购买了switch2主机
buySwitch2 = true
break
} else if item.ErpCategoryId == Switch1CategoryId1 || item.ErpCategoryId == Switch1CategoryId2 { // 判断是否购买了switch1主机
buySwitch1 = true
break
}
}
if !buySwitch1 && !buySwitch2 {
logger.Info("订单未包含Switch主机", logger.Field("orderId", orderId))
return nil
}
// 已是尊享会员不发券
if IsValidPrivilegeMember(userInfo.Uid) {
logger.Info("用户已是尊享会员", logger.Field("uid", userInfo.Uid))
return nil
}
// 确定目标优惠券面值与活动ID
var targetActivityId int
var targetValue uint32
switch {
case buySwitch1 && buySwitch2:
targetActivityId = Switch2ActivityId
targetValue = 30000
case buySwitch1:
targetActivityId = Switch1ActivityId
targetValue = 50000
case buySwitch2:
targetActivityId = Switch2ActivityId
targetValue = 30000
}
// 查询已发放优惠券state = 1
var existingCoupons []UserCoupon
err = orm.Eloquent.Table("user_coupon").
Where("uid = ? AND activity_type = ? AND state = 1", uid, SwitchActivityType).
Find(&existingCoupons).Error
if err != nil {
logger.Error("查询已发放优惠券失败", logger.Field("err", err))
return err
}
// 多张券处理逻辑
if len(existingCoupons) > 0 {
// 判断是否有比目标券面值小的旧券
var smallerCoupons []UserCoupon
var greaterOrEqualCoupons []UserCoupon
for _, c := range existingCoupons {
if c.Value < targetValue {
smallerCoupons = append(smallerCoupons, c)
} else {
greaterOrEqualCoupons = append(greaterOrEqualCoupons, c)
}
}
if len(smallerCoupons) > 0 {
// 保留最小的一张更新有效期,删除其他券
minCoupon := smallerCoupons[0]
for _, c := range smallerCoupons {
if c.Value < minCoupon.Value {
minCoupon = c
}
}
// 更新最小券有效期
err = orm.Eloquent.Model(&UserCoupon{}).
Where("id = ?", minCoupon.ID).
Update("active_end", time.Now().AddDate(0, 1, 0)).Error
if err != nil {
logger.Error("更新优惠券有效期失败", logger.Field("err", err))
}
// 删除其余所有券(除保留那张)
var deleteIds []uint32
for _, c := range existingCoupons {
if c.ID != minCoupon.ID {
deleteIds = append(deleteIds, c.ID)
}
}
if len(deleteIds) > 0 {
err = orm.Eloquent.Table("user_coupon").
Where("id IN ?", deleteIds).
Delete(nil).Error
if err != nil {
logger.Error("删除多余旧券失败", logger.Field("err", err))
}
}
return nil // 不再发新券
}
// 所有旧券面值 >= 当前目标,全部删除,继续发新券
err = orm.Eloquent.Table("user_coupon").
Where("uid = ? AND activity_type = ? AND state = 1", uid, SwitchActivityType).
Delete(nil).Error
if err != nil {
logger.Error("删除旧优惠券失败", logger.Field("err", err))
return err
}
}
// 发放优惠券
var coupons []Coupon
err = orm.Eloquent.Debug().Table("coupon").Where("activity_id = ?", targetActivityId).Find(&coupons).Error
if err != nil {
logger.Error("查询优惠券失败:", logger.Field("err", err))
return err
}
for i, _ := range coupons {
couponCode, err := utils.GenerateRandomNumber19()
if err != nil {
logger.Error("生成优惠码失败:", logger.Field("err", err))
continue
}
userCoupon := &UserCoupon{
Uid: userInfo.Uid,
CouponId: coupons[i].ID,
CouponType: coupons[i].CouponType,
ActivityType: coupons[i].ActivityType,
ActivityId: coupons[i].ActivityId,
Value: coupons[i].Value,
State: 1,
ActiveStart: time.Now(),
ActiveEnd: time.Now().AddDate(0, 1, 0),
UseTime: time.Time{},
MemberLevel: coupons[i].MemberLevel,
Approach: 0,
PromotionalSales: 0,
RedeemCode: "",
CategoryNumber: coupons[i].CategoryNumber,
Code: couponCode,
}
err = orm.Eloquent.Create(userCoupon).Error
if err != nil {
logger.Errorf("user coupon err:", err)
continue
}
}
return nil
}