1、修改库存调拨入库编号生成规则;

2、修改商品资料前端入参分页错误时,接口报错的缺陷;
3、修复串码商品(手动添加)零售退货订单审核失败的缺陷;
4、优惠券增加商品编号字段;
5、取消会员时扣减积分,尊享会员优惠券更新为过期状态;
This commit is contained in:
chenlin 2024-09-20 11:09:50 +08:00
parent 318541c3af
commit 9c72b52723
12 changed files with 182 additions and 49 deletions

View File

@ -332,6 +332,7 @@ func CancelMembers(c *gin.Context) {
app.Error(c, http.StatusInternalServerError, err, "查询用户失败")
return
}
oldMember := userInfo.MemberLevel
userInfo.MemberLevel = 1
//memberExpire := userInfo.MemberExpire.AddDate(-1, 0, 0)
//userInfo.MemberExpire = memberExpire
@ -353,6 +354,30 @@ func CancelMembers(c *gin.Context) {
app.Error(c, http.StatusInternalServerError, err, "取消会员失败")
return
}
var vmCount int
switch oldMember {
case models.MemberLevelGold, models.MemberLevelPeriod: // 黄金会员
if userInfo.MemberGenre == 200 { // 年费
vmCount = -399
} else if userInfo.MemberGenre == 201 { // 季度
vmCount = -199
} else if userInfo.MemberGenre == 202 { // 半年
vmCount = -299
}
case models.MemberLevelPlatinum: // 白金会员
vmCount = -699
case models.MemberLevelBlackGold: // 黑金会员
vmCount = -1499
}
// 更新用户积分
err = models.UserVmUpdate(nil, "", uint32(req.Uid), vmCount, models.VmEventCancelMember,
"取消租卡会员")
if err != nil {
logger.Errorf("err:", err)
}
app.OK(c, userInfo, "修改成功")
}

View File

@ -510,6 +510,10 @@ func (m *ErpCommodityListReq) List() (*ErpCommodityListResp, error) {
// 计算分页所需的切片索引
startIndex := page * m.PageSize
if (len(commodities)/m.PageSize + 1) < startIndex {
startIndex = 0
page = 0
}
endIndex := (page + 1) * m.PageSize
if endIndex > len(commodities) {
endIndex = len(commodities)

View File

@ -12,20 +12,21 @@ const (
type Coupon struct {
Model
Name string `json:"name"` // 优惠券名称
Describe string `json:"describe" gorm:"type:text"` // 优惠券简介
Rule string `json:"rule" gorm:"type:text"` // 优惠券使用规则
CouponType string `json:"coupon_type"` //
ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-零售销售
ActivityId uint32 `json:"activity_id" gorm:"index"` //
Value uint32 `json:"value"` //
OutCount uint32 `json:"out_count"` // 用户已领取数量
UsedCount uint32 `json:"used_count"` // 用户已使用数量
ActiveStart time.Time `json:"active_start"` // 有效期开始
ActiveEnd time.Time `json:"active_end"` // 有效期结束 零值永不结束
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
CategoryNumber string `json:"category_number"` // 可以使用该优惠券的商品分类,如果为空则表示没限制
IsDraw bool `json:"is_draw" gorm:"-"` //
Name string `json:"name"` // 优惠券名称
Describe string `json:"describe" gorm:"type:text"` // 优惠券简介
Rule string `json:"rule" gorm:"type:text"` // 优惠券使用规则
CouponType string `json:"coupon_type"` //
ActivityType uint32 `json:"activity_type"` // 活动类型 1-会员续费 2-零售销售
ActivityId uint32 `json:"activity_id" gorm:"index"` //
Value uint32 `json:"value"` //
OutCount uint32 `json:"out_count"` // 用户已领取数量
UsedCount uint32 `json:"used_count"` // 用户已使用数量
ActiveStart time.Time `json:"active_start"` // 有效期开始
ActiveEnd time.Time `json:"active_end"` // 有效期结束 零值永不结束
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
CategoryNumber string `json:"category_number"` // 可以使用该优惠券的商品分类,如果为空则表示没限制
CommodityNumber string `json:"commodity_number"` // 可以使用该优惠券的商品编号,如果为空则表示没限制
IsDraw bool `json:"is_draw" gorm:"-"` //
}
// gen:qs
@ -47,6 +48,7 @@ type UserCoupon struct {
PromotionalSales uint32 `json:"promotional_sales"` //
RedeemCode string `json:"redeem_code"` //
CategoryNumber string `json:"category_number"` // 可以使用该优惠券的商品分类,如果为空则表示没限制
CommodityNumber string `json:"commodity_number"` // 可以使用该优惠券的商品编号,如果为空则表示没限制
Code string `json:"code"` // 优惠券券码
Coupon *Coupon `json:"coupon" gorm:"-"` //
UserInfo UserInfo `json:"user_info" gorm:"-"` //

View File

@ -1057,7 +1057,7 @@ func UpdateStock(gdb *gorm.DB, erpOrder ErpOrder, state, auditState int) error {
}
} else if erpOrder.RetailType == RetailTypeRejected { // 零售退货订单
for i, _ := range commodities {
if commodities[i].IMEIType == 2 { // 串码商品
if commodities[i].IMEIType == 2 || commodities[i].IMEIType == 3 { // 串码商品
if commodities[i].IMEI == "" {
return errors.New("串码为空")
}

View File

@ -760,7 +760,7 @@ func handleInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder) er
usedStockCommodityIdList := make(map[uint32][]uint32) // 记录非串码商品已使用的商品库存表主键id
// 更新库存数量
for i, _ := range trimCommodities {
if trimCommodities[i].IMEIType == 2 { // 串码商品
if trimCommodities[i].IMEIType == 2 || trimCommodities[i].IMEIType == 3 { // 串码商品
if trimCommodities[i].IMEI == "" {
return errors.New("串码为空")
}
@ -885,7 +885,7 @@ func handleCancelInventoryAdd(gdb *gorm.DB, changeOrder ErpInventoryChangeOrder)
// 更新库存数量
for i, _ := range trimCommodities {
if trimCommodities[i].IMEIType == 2 { // 串码商品
if trimCommodities[i].IMEIType == 2 || trimCommodities[i].IMEIType == 3 { // 串码商品
if trimCommodities[i].IMEI == "" {
return errors.New("串码为空")
}
@ -970,7 +970,7 @@ func handleCancelInventoryReduce(gdb *gorm.DB, changeOrder ErpInventoryChangeOrd
usedStockCommodityIdList := make(map[uint32][]uint32) // 记录非串码商品已使用的商品库存表主键id
// 更新库存数量
for i, _ := range trimCommodities {
if trimCommodities[i].IMEIType == 2 { // 串码商品
if trimCommodities[i].IMEIType == 2 || trimCommodities[i].IMEIType == 3 { // 串码商品
if trimCommodities[i].IMEI == "" {
return errors.New("串码为空")
}

View File

@ -536,7 +536,7 @@ func cancelProductAuditAndUpdateStock(gdb *gorm.DB, productOrder ErpInventoryPro
// 更新库存数量
for i, _ := range commodities {
if commodities[i].IMEIType == 2 { // 串码商品
if commodities[i].IMEIType == 2 || commodities[i].IMEIType == 3 { // 串码商品
if commodities[i].IMEI == "" {
return errors.New("串码为空")
}

View File

@ -782,29 +782,63 @@ func (m *ErpPurchaseOrder) IdInit() error {
return nil
}
// GetPurchaseInventorySn 生成入库编号
//// GetPurchaseInventorySn 生成入库编号
//func GetPurchaseInventorySn() string {
// count := 0
// for {
// if count > 5 {
// return ""
// }
// nowTime := time.Now()
// sn := nowTime.Format("060102")
// sn += fmt.Sprintf("%d", nowTime.Unix()%100)
// rand.Seed(nowTime.UnixNano())
// sn += fmt.Sprintf("%d", rand.Int31n(100))
// exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_purchase_inventory WHERE serial_number='%s'", sn))
// if err != nil {
// logger.Error("sn err:", logger.Field("err", err))
// count++
// continue
// }
// if err == nil && !exist {
// return sn
// }
// return ""
// }
//}
var mu sync.Mutex
// GetPurchaseInventorySn generates a unique inventory serial number
func GetPurchaseInventorySn() string {
count := 0
for {
if count > 5 {
return ""
}
const maxRetries = 5
mu.Lock()
defer mu.Unlock()
for retryCount := 0; retryCount < maxRetries; retryCount++ {
nowTime := time.Now()
sn := nowTime.Format("060102")
sn += fmt.Sprintf("%d", nowTime.Unix()%100)
rand.Seed(nowTime.UnixNano())
sn += fmt.Sprintf("%d", rand.Int31n(100))
// 使用日期格式精确到天
datePart := nowTime.Format("060102") // 格式为 YYMMDD
// 生成10位随机数
rand.Seed(nowTime.UnixNano() + int64(retryCount)) // 为了确保每次生成不同的随机数
randomNum := rand.Int63n(1e10) // 10位随机数范围从0到9999999999
randomPart := fmt.Sprintf("%010d", randomNum) // 确保随机数是10位的前面补零
// 拼接日期部分和随机数部分
sn := fmt.Sprintf("%s%s", datePart, randomPart)
exist, err := QueryRecordExist(fmt.Sprintf("SELECT * FROM erp_purchase_inventory WHERE serial_number='%s'", sn))
if err != nil {
logger.Error("sn err:", logger.Field("err", err))
count++
continue
}
if err == nil && !exist {
if !exist {
return sn
}
return ""
}
return "" // 返回空字符串,如果在最大重试次数后仍未找到唯一编号
}
// CheckCreateErpPurchaseOrderParam 新增采购订单-检查参数
@ -5740,6 +5774,9 @@ func CancelAuditUpdateStock(begin *gorm.DB, req ErpPurchaseOrder) error {
// Inventories: inventoryList,
//}
// 赋值采购退货单号
purchaseOrder.RejectedSerialNumber = purchaseOrder.SerialNumber
// 按照采购退货更新库存
err = InventoryErpPurchaseUpdateRejectStock(begin, inventoryList, purchaseOrder)
if err != nil {

View File

@ -80,6 +80,7 @@ type UserInfo struct {
Uid uint32 `json:"uid" gorm:"column:uid;unique_index"` //
MemberLevel uint32 `json:"member_level"` // 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员
MemberGenre uint32 `json:"member_genre"` // 会员类型 200-黄金年费 201-黄金季度 202-黄金半年
MemberExpire *time.Time `json:"member_expire"` // 会员到期时间
OpenMemberTime *time.Time `json:"open_member_time"` // 开通会员时间
Bond uint32 `json:"bond"` // 保证金
@ -4474,9 +4475,11 @@ func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember,
userInfo.MemberExpire = &nowTime
userInfo.ExtendStatus = ExtendExpire
begin := orm.Eloquent.Begin()
sql := fmt.Sprintf("UPDATE `privilege_member` SET member_level = 1,member_expire=?,updated_at=?,extend_status=1 WHERE uid = ?;")
err = orm.Eloquent.Debug().Exec(sql, nowTime, nowTime, m.Uid).Error
err = begin.Exec(sql, nowTime, nowTime, m.Uid).Error
if err != nil {
begin.Rollback()
logger.Errorf("err:", logger.Field("err", err))
return nil, err
}
@ -4491,5 +4494,40 @@ func (m *CancelPrivilegeMembersReq) CancelPrivilegeMembers() (*PrivilegeMember,
// return nil, err
//}
// 修改尊享会员优惠券,改为过期状态
var userCoupon []UserCoupon
err = orm.Eloquent.Table("user_coupon").Where("uid = ? and activity_id = 6", m.Uid).Find(&userCoupon).Error
if err != nil || err == RecordNotFound {
logger.Errorf("err:", logger.Field("err", err))
}
for i, _ := range userCoupon {
err = begin.Table("user_coupon").Where("id = ?", userCoupon[i].ID).Updates(map[string]interface{}{
"state": 3,
"updated_at": time.Now(),
}).Error
if err != nil {
begin.Rollback()
logger.Error("UpdateCoupon err:", logger.Field("err", err))
return nil, err
}
}
// 更新用户积分
err = UserVmUpdate(begin, "", uint32(m.Uid), -199, VmEventCancelPrivilegeMember,
"取消尊享会员")
if err != nil {
begin.Rollback()
logger.Errorf("err:", err)
return nil, err
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("CancelPrivilegeMember err:", logger.Field("err", err))
return nil, err
}
return &userInfo, nil
}

View File

@ -10,16 +10,18 @@ import (
)
const (
VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣
VmEventBuyGoodsReject = "buy_goods_reject" // 购买商品积分抵扣取消
VmEventOpenMember = "open_member" // 开通会员奖励
VmEventInvite1Member = "invite_1_member" // 邀请会员奖励
VmEventInvite2Member = "invite_2_member" // 邀请会员奖励
VmEventUserShareCard = "user_share_card" // 用户共享卡收益
VmEventAttendance = "attendance" // 连续签到获取积分
VmEventErpOrderSale = "erp_order_sale" // 零售销售获得积分
VmEventErpOrderReject = "erp_order_reject" // 零售退货扣除积分
VmEventExpired = "vm_expired" // 积分过期扣减
VmEventBuyGoods = "buy_goods" // 购买商品积分抵扣
VmEventBuyGoodsReject = "buy_goods_reject" // 购买商品积分抵扣取消
VmEventOpenMember = "open_member" // 开通会员奖励
VmEventInvite1Member = "invite_1_member" // 邀请会员奖励
VmEventInvite2Member = "invite_2_member" // 邀请会员奖励
VmEventUserShareCard = "user_share_card" // 用户共享卡收益
VmEventAttendance = "attendance" // 连续签到获取积分
VmEventErpOrderSale = "erp_order_sale" // 零售销售获得积分
VmEventErpOrderReject = "erp_order_reject" // 零售退货扣除积分
VmEventExpired = "vm_expired" // 积分过期扣减
VmEventCancelMember = "cancel_member" // 取消租卡会员
VmEventCancelPrivilegeMember = "cancel_privilege_member" // 取消尊享会员
)
// 用户积分

View File

@ -6221,6 +6221,7 @@ const docTemplate = `{
"tags": [
"system/用户"
],
"summary": "登陆",
"parameters": [
{
"description": "account",
@ -11480,11 +11481,11 @@ const docTemplate = `{
},
"total_staff_price": {
"description": "入库员工成本价之和",
"type": "integer"
"type": "number"
},
"total_wholesale_price": {
"description": "入库采购价之和",
"type": "integer"
"type": "number"
}
}
},
@ -16960,6 +16961,10 @@ const docTemplate = `{
"description": "会员过期天数",
"type": "integer"
},
"member_genre": {
"description": "会员类型 200-黄金年费 201-黄金季度 202-黄金半年",
"type": "integer"
},
"member_level": {
"description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员",
"type": "integer"
@ -17125,6 +17130,10 @@ const docTemplate = `{
"description": "会员到期时间",
"type": "string"
},
"member_genre": {
"description": "会员类型 200-黄金年费 201-黄金季度 202-黄金半年",
"type": "integer"
},
"member_level": {
"description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员",
"type": "integer"

View File

@ -6210,6 +6210,7 @@
"tags": [
"system/用户"
],
"summary": "登陆",
"parameters": [
{
"description": "account",
@ -11469,11 +11470,11 @@
},
"total_staff_price": {
"description": "入库员工成本价之和",
"type": "integer"
"type": "number"
},
"total_wholesale_price": {
"description": "入库采购价之和",
"type": "integer"
"type": "number"
}
}
},
@ -16949,6 +16950,10 @@
"description": "会员过期天数",
"type": "integer"
},
"member_genre": {
"description": "会员类型 200-黄金年费 201-黄金季度 202-黄金半年",
"type": "integer"
},
"member_level": {
"description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员",
"type": "integer"
@ -17114,6 +17119,10 @@
"description": "会员到期时间",
"type": "string"
},
"member_genre": {
"description": "会员类型 200-黄金年费 201-黄金季度 202-黄金半年",
"type": "integer"
},
"member_level": {
"description": "当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员",
"type": "integer"

View File

@ -3793,10 +3793,10 @@ definitions:
type: integer
total_staff_price:
description: 入库员工成本价之和
type: integer
type: number
total_wholesale_price:
description: 入库采购价之和
type: integer
type: number
type: object
models.ErpStockListReq:
properties:
@ -7737,6 +7737,9 @@ definitions:
member_expire_days:
description: 会员过期天数
type: integer
member_genre:
description: 会员类型 200-黄金年费 201-黄金季度 202-黄金半年
type: integer
member_level:
description: 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员
type: integer
@ -7858,6 +7861,9 @@ definitions:
member_expire:
description: 会员到期时间
type: string
member_genre:
description: 会员类型 200-黄金年费 201-黄金季度 202-黄金半年
type: integer
member_level:
description: 当前会员等级:10-普通用户 1-普通会员 2-黄金会员 4-白金会员 5-黑金会员
type: integer
@ -12236,6 +12242,7 @@ paths:
}'
schema:
type: string
summary: 登陆
tags:
- system/用户
/logout: