From 9c72b527237deab349f57ea578318fa1caa9964c Mon Sep 17 00:00:00 2001 From: chenlin Date: Fri, 20 Sep 2024 11:09:50 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E4=BF=AE=E6=94=B9=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E8=B0=83=E6=8B=A8=E5=85=A5=E5=BA=93=E7=BC=96=E5=8F=B7=E7=94=9F?= =?UTF-8?q?=E6=88=90=E8=A7=84=E5=88=99=EF=BC=9B=202=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=95=86=E5=93=81=E8=B5=84=E6=96=99=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=85=A5=E5=8F=82=E5=88=86=E9=A1=B5=E9=94=99=E8=AF=AF=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E6=8E=A5=E5=8F=A3=E6=8A=A5=E9=94=99=E7=9A=84=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=EF=BC=9B=203=E3=80=81=E4=BF=AE=E5=A4=8D=E4=B8=B2?= =?UTF-8?q?=E7=A0=81=E5=95=86=E5=93=81=EF=BC=88=E6=89=8B=E5=8A=A8=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=EF=BC=89=E9=9B=B6=E5=94=AE=E9=80=80=E8=B4=A7=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=AE=A1=E6=A0=B8=E5=A4=B1=E8=B4=A5=E7=9A=84=E7=BC=BA?= =?UTF-8?q?=E9=99=B7=EF=BC=9B=204=E3=80=81=E4=BC=98=E6=83=A0=E5=88=B8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E5=93=81=E7=BC=96=E5=8F=B7=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=EF=BC=9B=205=E3=80=81=E5=8F=96=E6=B6=88=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E6=97=B6=E6=89=A3=E5=87=8F=E7=A7=AF=E5=88=86=EF=BC=8C?= =?UTF-8?q?=E5=B0=8A=E4=BA=AB=E4=BC=9A=E5=91=98=E4=BC=98=E6=83=A0=E5=88=B8?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=BA=E8=BF=87=E6=9C=9F=E7=8A=B6=E6=80=81?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/admin/apis/usermanage/user.go | 25 +++++++++++ app/admin/models/commodity.go | 4 ++ app/admin/models/coupon.go | 30 +++++++------ app/admin/models/erp_order.go | 2 +- app/admin/models/inventory_change.go | 6 +-- app/admin/models/inventory_product.go | 2 +- app/admin/models/purchase.go | 63 +++++++++++++++++++++------ app/admin/models/user.go | 40 ++++++++++++++++- app/admin/models/user_vm.go | 22 +++++----- docs/docs.go | 13 +++++- docs/swagger.json | 13 +++++- docs/swagger.yaml | 11 ++++- 12 files changed, 182 insertions(+), 49 deletions(-) diff --git a/app/admin/apis/usermanage/user.go b/app/admin/apis/usermanage/user.go index 0f71f36..bcfc16e 100644 --- a/app/admin/apis/usermanage/user.go +++ b/app/admin/apis/usermanage/user.go @@ -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, "修改成功") } diff --git a/app/admin/models/commodity.go b/app/admin/models/commodity.go index f27a2fd..7c8b76d 100644 --- a/app/admin/models/commodity.go +++ b/app/admin/models/commodity.go @@ -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) diff --git a/app/admin/models/coupon.go b/app/admin/models/coupon.go index 0376b00..fbcb97f 100644 --- a/app/admin/models/coupon.go +++ b/app/admin/models/coupon.go @@ -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:"-"` // diff --git a/app/admin/models/erp_order.go b/app/admin/models/erp_order.go index 2516426..31462eb 100644 --- a/app/admin/models/erp_order.go +++ b/app/admin/models/erp_order.go @@ -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("串码为空") } diff --git a/app/admin/models/inventory_change.go b/app/admin/models/inventory_change.go index 5672173..8383e9e 100644 --- a/app/admin/models/inventory_change.go +++ b/app/admin/models/inventory_change.go @@ -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("串码为空") } diff --git a/app/admin/models/inventory_product.go b/app/admin/models/inventory_product.go index 039720e..a802649 100644 --- a/app/admin/models/inventory_product.go +++ b/app/admin/models/inventory_product.go @@ -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("串码为空") } diff --git a/app/admin/models/purchase.go b/app/admin/models/purchase.go index 96c4d0c..27f1bb2 100644 --- a/app/admin/models/purchase.go +++ b/app/admin/models/purchase.go @@ -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 { diff --git a/app/admin/models/user.go b/app/admin/models/user.go index 80c6bc1..e293daf 100644 --- a/app/admin/models/user.go +++ b/app/admin/models/user.go @@ -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 } diff --git a/app/admin/models/user_vm.go b/app/admin/models/user_vm.go index 2799eaf..185a9a6 100644 --- a/app/admin/models/user_vm.go +++ b/app/admin/models/user_vm.go @@ -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" // 取消尊享会员 ) // 用户积分 diff --git a/docs/docs.go b/docs/docs.go index 339ad6c..354119d 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -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" diff --git a/docs/swagger.json b/docs/swagger.json index 703b3d9..d7ad80a 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -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" diff --git a/docs/swagger.yaml b/docs/swagger.yaml index fecb5ff..161c726 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -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: