diff --git a/app/admin/apis/erpordermanage/erp_order.go b/app/admin/apis/erpordermanage/erp_order.go index b852979..dcafbe0 100644 --- a/app/admin/apis/erpordermanage/erp_order.go +++ b/app/admin/apis/erpordermanage/erp_order.go @@ -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 } diff --git a/app/admin/models/coupon.go b/app/admin/models/coupon.go index 2d51051..f22fa10 100644 --- a/app/admin/models/coupon.go +++ b/app/admin/models/coupon.go @@ -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 diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index 4b2f1a4..fcb421d 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -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 +}