1、新增零售发尊享会员优惠券的逻辑;
2、新增/编辑零售订单时返回订单数据;
This commit is contained in:
parent
cc2beb17a0
commit
505f7548a5
|
@ -21,7 +21,7 @@ import (
|
|||
// @Produce json
|
||||
// @Accept json
|
||||
// @Param request body models.ErpOrderCreateReq true "新建零售订单模型"
|
||||
// @Success 200 {object} app.Response
|
||||
// @Success 200 {object} models.ErpOrder
|
||||
// @Router /api/v1/erp_order/create [post]
|
||||
func ErpOrderCreate(c *gin.Context) {
|
||||
var req = new(model.ErpOrderCreateReq)
|
||||
|
@ -44,14 +44,14 @@ func ErpOrderCreate(c *gin.Context) {
|
|||
app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号")
|
||||
}
|
||||
|
||||
err = model.CreateErpOrder(req, c)
|
||||
erpOrder, err := model.CreateErpOrder(req, c)
|
||||
if err != nil {
|
||||
logger.Error("CreateErpOrder err:", logger.Field("err", err))
|
||||
app.Error(c, http.StatusInternalServerError, err, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
app.OK(c, nil, "新增成功")
|
||||
app.OK(c, erpOrder, "新增成功")
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -61,7 +61,7 @@ func ErpOrderCreate(c *gin.Context) {
|
|||
// @Produce json
|
||||
// @Accept json
|
||||
// @Param request body models.ErpOrderCreateReq true "编辑零售订单模型"
|
||||
// @Success 200 {object} app.Response
|
||||
// @Success 200 {object} models.ErpOrder
|
||||
// @Router /api/v1/erp_order/edit [post]
|
||||
func ErpOrderEdit(c *gin.Context) {
|
||||
var req = new(model.ErpOrderCreateReq)
|
||||
|
@ -82,14 +82,14 @@ func ErpOrderEdit(c *gin.Context) {
|
|||
app.Error(c, http.StatusBadRequest, errors.New("参数错误:缺少会员手机号"), "参数错误:缺少会员手机号")
|
||||
}
|
||||
|
||||
err = model.EditErpOrder(req, c)
|
||||
erpOrder, err := model.EditErpOrder(req, c)
|
||||
if err != nil {
|
||||
logger.Error("EditErpOrder err:", logger.Field("err", err))
|
||||
app.Error(c, http.StatusInternalServerError, err, err.Error())
|
||||
return
|
||||
}
|
||||
|
||||
app.OK(c, nil, "编辑成功")
|
||||
app.OK(c, erpOrder, "编辑成功")
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -287,6 +287,11 @@ func ErpOrderAudit(c *gin.Context) {
|
|||
return
|
||||
}
|
||||
|
||||
if req.State == 1 && nPayStatus == model.HavePaid { // 已完成支付的零售订单判断是否发优惠券
|
||||
// 发放尊享会员优惠券
|
||||
model.UpdateSwitchUserCoupon(erpOrder.ID, erpOrder.Uid)
|
||||
}
|
||||
|
||||
app.OK(c, nil, "")
|
||||
return
|
||||
}
|
||||
|
|
|
@ -4,6 +4,12 @@ import "time"
|
|||
|
||||
const (
|
||||
CouponTypeDeduction = "deduction" // 抵扣
|
||||
Switch1ActivityId = 11 // switch1用户尊享会员优惠券
|
||||
Switch2ActivityId = 12 // switch2用户尊享会员优惠券
|
||||
Switch1CategoryId1 = 2 // 国行主机分类ID
|
||||
Switch1CategoryId2 = 3 // 通用主机分类ID
|
||||
Switch2CategoryId2 = 68 // switch2主机分类ID
|
||||
SwitchActivityType = 11 // 尊享会员优惠券类型
|
||||
)
|
||||
|
||||
// gen:qs
|
||||
|
|
|
@ -7,6 +7,7 @@ import (
|
|||
"github.com/gin-gonic/gin"
|
||||
"github.com/xuri/excelize/v2"
|
||||
"go-admin/app/admin/apis/pay"
|
||||
utils "go-admin/app/admin/models/tools"
|
||||
orm "go-admin/common/global"
|
||||
"go-admin/logger"
|
||||
"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
|
||||
}
|
||||
|
||||
|
@ -2705,6 +2711,11 @@ func QueryErpOrderPayStatus(billSn string) (*ErpOrderPayResp, error) {
|
|||
return resp, fmt.Errorf("QueryErpOrderPayStatus[commit err]:%v", err)
|
||||
}
|
||||
|
||||
if payStatus == PayOk { // 已完成支付的订单判断是否发优惠券
|
||||
// 发放尊享会员优惠券
|
||||
UpdateSwitchUserCoupon(orderInfo.ID, orderInfo.Uid)
|
||||
}
|
||||
|
||||
resp.Status = payStatus
|
||||
return resp, nil
|
||||
}
|
||||
|
@ -5975,14 +5986,14 @@ func QueryReceiptData(req *ErpOrderDeleteReq, c *gin.Context) (*ErpOrderReceiptD
|
|||
}
|
||||
|
||||
// CreateErpOrder 创建零售订单
|
||||
func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
||||
func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
|
||||
for i, _ := range req.ErpOrderCommodities {
|
||||
req.ErpOrderCommodities[i].ID = 0
|
||||
}
|
||||
// 校验订单数据
|
||||
erpOrder, err := checkOrderData(req, c)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
// 四舍五入
|
||||
tools.RoundFloatFields(req)
|
||||
|
@ -5993,7 +6004,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
userInfo, err := GetUserInfoByTel(req.Tel)
|
||||
if err != nil {
|
||||
logger.Error("checkOrderData GetUserInfoByTel err:", logger.Field("err", err))
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
if userInfo.Uid == 0 {
|
||||
|
@ -6010,7 +6021,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
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 {
|
||||
begin.Rollback()
|
||||
logger.Error("create erp_order err:", logger.Field("err", err))
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 销售信息添加零售订单id
|
||||
|
@ -6037,7 +6048,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
logger.Error("Create erp_order_sales err")
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 支付方式添加零售订单id
|
||||
|
@ -6055,7 +6066,7 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
logger.Error("Create erp_order_pay_way err")
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 订单商品表信息添加零售订单id
|
||||
|
@ -6068,37 +6079,41 @@ func CreateErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
logger.Error("Create erp_order_commodity err")
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
err = begin.Commit().Error
|
||||
if err != nil {
|
||||
begin.Rollback()
|
||||
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 编辑订单
|
||||
func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
||||
func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) (*ErpOrder, error) {
|
||||
var orderInfo ErpOrder
|
||||
err := orm.Eloquent.Table("erp_order").Where("bill_sn=?", req.BillSn).Find(&orderInfo).Error
|
||||
if err != nil {
|
||||
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 {
|
||||
logger.Error("EditErpOrder err:", logger.Field("err", err))
|
||||
return errors.New("订单状态不是待审核,操作失败")
|
||||
return nil, errors.New("订单状态不是待审核,操作失败")
|
||||
}
|
||||
|
||||
// 校验订单数据
|
||||
erpOrder, err := checkOrderData(req, c)
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
erpOrder.ID = orderInfo.ID
|
||||
|
@ -6110,7 +6125,7 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
logger.Error("update erp_order err:", logger.Field("err", err))
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 2-更新零售订单商品信息
|
||||
|
@ -6118,7 +6133,7 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
logger.Error("update erp_order_commodity err:", logger.Field("err", err))
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 3-更新销售员信息记录
|
||||
|
@ -6126,7 +6141,7 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
logger.Error("update erp_order_sales err:", logger.Field("err", err))
|
||||
return errors.New("操作失败:" + err.Error())
|
||||
return nil, errors.New("操作失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 4-更新支付方式记录
|
||||
|
@ -6134,17 +6149,21 @@ func EditErpOrder(req *ErpOrderCreateReq, c *gin.Context) error {
|
|||
if err != nil {
|
||||
begin.Rollback()
|
||||
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
|
||||
if err != nil {
|
||||
begin.Rollback()
|
||||
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 校验用户门店是否包含在门店数据中且未过期
|
||||
|
@ -8187,3 +8206,179 @@ func saleDetailExport(list []ErpOrder, sumData RetailDetailTotalData, c *gin.Con
|
|||
}
|
||||
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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user