This commit is contained in:
li 2022-05-10 15:17:34 +08:00
parent c556a306f1
commit 133ed7db4b
21 changed files with 18172 additions and 561 deletions

View File

@ -125,6 +125,8 @@ func AuthLogin(c *gin.Context) {
user.StoreId = inviteUser.StoreId
user.UserType = model.UserTypeConsumer
user.CooperativeBusinessId = inviteUser.CooperativeBusinessId
user.CooperativeName = inviteUser.CooperativeName
invite := &model.UserInvite{
FromUid: req.InviteUid,
@ -212,7 +214,6 @@ func AuthLogin(c *gin.Context) {
// RespJson(c, status.InternalServerError, nil)
// return
//}
//
//refreshToken := &model.UserRefreshToken{
// Uid: user.Uid,
// Token: newRefreshToken,
@ -259,7 +260,6 @@ func AuthLogin(c *gin.Context) {
//"is_new": isNew,
//"invite_from_code": inviteCode,
})
fmt.Println("sqlErr:", sqlErr)
return
}

View File

@ -0,0 +1,355 @@
package controller
import (
"github.com/codinl/go-logger"
"github.com/gin-gonic/gin"
"mh-server/lib/auth"
"mh-server/lib/status"
"mh-server/model"
"time"
)
func CooperativeGameCardGoodsStockAdds(c *gin.Context) {
req := struct {
Cards []model.GameCardGoods `json:"cards"`
}{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("ShouldBindJSON err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
cardGoods := &model.GameCardGoods{}
for i, _ := range req.Cards {
req.Cards[i].CardType = model.GameCardGoodsTypeCommon
req.Cards[i].ShareProfitType = 1
}
err := cardGoods.Adds(req.Cards)
if err != nil {
logger.Errorf("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
RespOK(c, nil)
return
}
func GameCardGoodsStockAnalysis(c *gin.Context) {
req := model.GameCardGoodsStockAnalysisReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("ShouldBindJSON err")
RespJson(c, status.BadRequest, nil)
return
}
resp, err := req.GameCardStockListAnalysis()
if err != nil {
logger.Error("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
//ret := make(map[string]interface{}, 0)
//ret["list"] = stockList
//ret["count"] = total
//ret["page_index"] = req.PageNum
RespOK(c, resp)
return
}
func CooperativeExportDataGameCardGoodsStock(c *gin.Context) {
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
assistant := model.GetUserByUid(uc.Uid)
if assistant.XcxRoleId != 2 {
logger.Error("xcx role err:")
RespJson(c, status.NoAuth, nil)
return
}
goodsStock := model.ExportGoodsStock(uint32(assistant.StoreId))
ret := &map[string]interface{}{
"goods_stock_url": goodsStock,
}
RespOK(c, ret)
return
}
// 1.创建调拨
func CooperativeCannibalizeTaskCreate(c *gin.Context) {
req := struct {
FromStoreId uint32 `json:"from_store_id"`
ToStoreId uint32 `json:"to_store_id"`
}{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
assistant := model.GetUserByUid(uc.Uid)
req.FromStoreId = uint32(assistant.StoreId)
if req.FromStoreId == 0 || req.ToStoreId == 0 {
RespJson(c, status.BadRequest, nil)
return
}
task := &model.CannibalizeStockTask{
FromStoreId: req.FromStoreId,
ToStoreId: req.ToStoreId,
TaskId: uint32(time.Now().Unix()),
Count: 0,
Status: model.CannibalizeTaskStatusNotImportGoods,
}
err := model.DB.Create(task).Error
if err != nil {
logger.Error("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
RespOK(c, nil)
}
// 2.导入调拨卡
func CooperativeCannibalizeTaskImportGoods(c *gin.Context) {
req := struct {
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
SerialNumberList []string `json:"serial_number_list"` // 编号
}{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
RespJson(c, status.BadRequest, nil)
return
}
unImportGoods, err := model.CannibalizeTaskImportGoods(req.CannibalizeStockTaskId, req.SerialNumberList)
if err != nil {
logger.Error("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
if unImportGoods > 0 {
//app.OK(c, nil, fmt.Sprintf("有 %d 个卡未导入", unImportGoods))
RespJson(c, status.InternalServerError, nil)
return
}
//app.OK(c, nil, "导入调拨卡成功")
RespOK(c, nil)
return
}
// 3.确认发货
func CooperativeCannibalizeTaskDeliverGoods(c *gin.Context) {
req := struct {
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
}{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
RespJson(c, status.BadRequest, nil)
return
}
err := model.CannibalizeDeliverGoods(req.CannibalizeStockTaskId)
if err != nil {
logger.Error("err:", err)
//app.Error(c, http.StatusInternalServerError, err, "发货错误")
RespJson(c, status.InternalServerError, nil)
return
}
//app.OK(c, nil, "发货成功")
RespOK(c, nil)
return
}
// 4.确认入库
func CooperativeCannibalizeTaskPutInStorage(c *gin.Context) {
req := struct {
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
}{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
//app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
RespJson(c, status.BadRequest, nil)
return
}
err := model.CannibalizePutInStorage(req.CannibalizeStockTaskId)
if err != nil {
logger.Error("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
RespOK(c, nil)
return
}
// 5.调拨任务列表
func CooperativeCannibalizeTaskList(c *gin.Context) {
req := model.CannibalizeTaskListReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
//app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
assistant := model.GetUserByUid(uc.Uid)
req.StoreId = uint32(assistant.StoreId)
if req.StoreId == 0 {
RespJson(c, status.BadRequest, nil)
return
}
resp, err := req.GetCannibalizeTaskList()
if err != nil {
logger.Error("err:", err)
//app.Error(c, http.StatusInternalServerError, err, "任务列表错误")
RespJson(c, status.InternalServerError, nil)
return
}
//app.OK(c, resp, "")
RespOK(c, resp)
return
}
// 6.调拨任务卡列表
func CooperativeCannibalizeTaskGameCardGoodsList(c *gin.Context) {
req := model.CannibalizeTaskGameCardGoodsListReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
//app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
RespJson(c, status.BadRequest, nil)
return
}
resp, err := req.GetCannibalizeTaskGameCardGoodsList()
if err != nil {
logger.Error("err:", err)
//app.Error(c, http.StatusInternalServerError, err, "任务列表错误")
RespJson(c, status.InternalServerError, nil)
return
}
//app.OK(c, resp, "")
RespOK(c, resp)
return
}
func CooperativeCannibalizeTaskDel(c *gin.Context) {
req := struct {
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
}{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
//app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
RespJson(c, status.BadRequest, nil)
return
}
err := model.CannibalizeTaskDel(req.CannibalizeStockTaskId)
if err != nil {
logger.Error("err:", err)
//app.Error(c, http.StatusInternalServerError, err, "改任务状态不能删除")
RespJson(c, status.InternalServerError, nil)
return
}
//app.OK(c, nil, "发货成功")
RespOK(c, nil)
return
}
func CooperativeGameCardGoodsList(c *gin.Context) {
req := model.CooperativeGameCardGoodsListReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
//app.Error(c, http.StatusBadRequest, errors.New("para err"), "参数错误")
RespJson(c, status.InternalServerError, nil)
return
}
//goodsStock := model.ExportGoodsStock(req.StoreId)
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
req.AssistantUid = uc.Uid
resp, err := req.List()
if err != nil {
logger.Error("list err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
//ret := &map[string]interface{}{
// "goods_stock_url": goodsStock,
//}
//app.OK(c, ret, "数据导出成功")
RespOK(c, resp)
return
}
func AssistantMemberPromotionList(c *gin.Context) {
req := model.AssistantMemberPromotionReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Errorf("para err")
RespJson(c, status.InternalServerError, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
req.AssistantUid = uc.Uid
req.Assistant = model.GetUserByUid(uc.Uid)
if req.Assistant.XcxRoleId != 2 {
logger.Error("xcx role err:")
RespJson(c, status.NoAuth, nil)
return
}
list, totalPage, err := req.List()
if err != nil {
logger.Error("list err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
ret := &map[string]interface{}{
"list": list,
"total_page": totalPage,
"page_num": req.PageNum,
}
RespOK(c, ret)
return
}

122
controller/cb_rent_order.go Normal file
View File

@ -0,0 +1,122 @@
package controller
import (
"github.com/codinl/go-logger"
"github.com/gin-gonic/gin"
"mh-server/lib/auth"
"mh-server/lib/status"
"mh-server/model"
)
func CooperativeRentCardOrderList(c *gin.Context) {
req := model.CooperativeRentCardOrderListReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("ShouldBindJSON err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
req.AssistantUid = uc.Uid
list, count, err := req.List()
if err != nil {
logger.Errorf("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
ret := map[string]interface{}{
"count": count,
"list": list,
"pageIndex": req.PageNum,
"total_page": req.PageSize,
}
RespOK(c, ret)
return
}
func CooperativeRentCardOrderInfo(c *gin.Context) {
req := model.CooperativeRentCardOrderReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("ShouldBindJSON err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
order, err := req.Info()
if err != nil {
logger.Error("rent card order err:", err)
if err.Error() == "parameter_err" {
RespJson(c, status.BadRequest, nil)
} else {
RespJson(c, status.InternalServerError, nil)
}
return
}
RespOK(c, order)
return
}
func CooperativeRentCardOrderDeliver(c *gin.Context) {
req := model.CooperativeRentCardOrderDeliverReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("ShouldBindJSON err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
assistant := model.GetUserByUid(uc.Uid)
req.OperationUid = uc.Uid
req.StoreId = uint32(assistant.StoreId)
err, _ := req.Deliver()
if err != nil {
logger.Error("rent card order err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
RespOK(c, nil)
return
}
func CooperativeRentCardOrderRevert(c *gin.Context) {
req := model.CooperativeRentCardOrderRevertReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("ShouldBindJSON err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
logger.Error("uc is nil")
RespJson(c, status.Unauthorized, nil)
return
}
req.OperationUid = uc.Uid
err := req.Revert()
if err != nil {
logger.Error("rent card order revert err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
RespOK(c, nil)
return
}

View File

@ -418,8 +418,9 @@ func PushWXPayNotice(c *gin.Context) {
if !user.OpenMemberTime.IsZero() {
openMemberTime = user.OpenMemberTime
}
_, err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel).SetMemberExpire(expireTime).
SetDeposit(memberConfig.MemberDeposit).SetOpenMemberTime(openMemberTime).UpdateNum()
_, err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().SetMemberLevel(record.MemberLevel).
SetMemberExpire(expireTime).SetDeposit(memberConfig.MemberDeposit).SetOpenMemberTime(openMemberTime).
UpdateNum()
//err = model.UserUpdate(&model.User{Uid: uint32(record.Uid), MemberLevel: record.MemberLevel, MemberExpire: expireTime, Deposit: memberConfig.MemberDeposit})
if err != nil {
logger.Error("err:", err)
@ -466,11 +467,6 @@ func PushWXPayNotice(c *gin.Context) {
if invite.FromUid != 0 {
inviteUser := model.GetUserByUid(invite.FromUid)
if inviteUser.UserType != 2 /*不是店员*/ && user.MemberLevel != 2 { // 邀请 新用户推送一次
//err := model.CodeSendToUser(invite.FromUid, model.CodeTypeMemberCard30, model.RedeemCodeActivityTypeUserInvite)
//if err != nil {
// logger.Error("err:", err)
//}
err = model.SendUserVm(inviteUser.Uid, record.MemberLevel, 1)
if err != nil {
logger.Error("send user vm err:", err)
@ -485,12 +481,15 @@ func PushWXPayNotice(c *gin.Context) {
openMemberChannel := model.OpenMemberChannelUserInvite
if inviteUser.UserType == 2 {
openMemberChannel = model.OpenMemberChannelStorePromotion
model.AddCooperativeMemberPromotion(inviteUser.CooperativeBusinessId,
uint32(inviteUser.StoreId), inviteUser.Uid, int(record.MemberLevel))
}
_, err = model.NewUserQuerySet(model.DB).UidEq(record.Uid).GetUpdater().
SetOpenMemberChannel(openMemberChannel).UpdateNum()
SetOpenMemberChannel(openMemberChannel).
SetCooperativeBusinessId(inviteUser.CooperativeBusinessId).
SetCooperativeName(inviteUser.CooperativeName).UpdateNum()
if err != nil {
logger.Error("err:", err)
return
}
}
}

View File

@ -920,7 +920,8 @@ func UserAttendanceDetail(c *gin.Context) {
var attendanceRecord model.UserAttendanceRecord
//err = model.NewUserAttendanceRecordQuerySet(model.DB).UidEq(uc.Uid).AttendanceDateEq(todayZero).One(&attendanceRecord)
err = model.NewUserAttendanceRecordQuerySet(model.DB).UidEq(uc.Uid).OrderDescByID().Limit(1).One(&attendanceRecord)
err = model.NewUserAttendanceRecordQuerySet(model.DB).UidEq(uc.Uid).OrderDescByID().
Limit(1).One(&attendanceRecord)
if err != nil && err != model.RecordNotFound {
logger.Error("user attendance record err:")
RespJson(c, status.InternalServerError, nil)
@ -975,6 +976,35 @@ func UserAttendanceDetail(c *gin.Context) {
return
}
func InviteMemberReportList(c *gin.Context) {
req := model.InviteMemberReportListReq{}
if c.ShouldBindJSON(&req) != nil {
logger.Error("parameter err")
RespJson(c, status.BadRequest, nil)
return
}
uc := auth.GetCurrentUser(c)
if uc == nil {
RespJson(c, status.Unauthorized, nil)
return
}
req.Uid = uc.Uid
list, totalPage, err := req.List()
if err != nil {
logger.Errorf("err:", err)
RespJson(c, status.InternalServerError, nil)
return
}
ret := map[string]interface{}{
"list": list,
"cur_page": req.PageNum,
"total_page": totalPage,
}
RespOK(c, ret)
return
}
// 升级 1-黄金会员 2-白金会员 3-黑金会员
// 开通会员
// 升级会员

1
go.mod
View File

@ -19,6 +19,7 @@ require (
github.com/spf13/cobra v1.1.3
github.com/spf13/viper v1.7.1
github.com/wechatpay-apiv3/wechatpay-go v0.2.6
github.com/xuri/excelize/v2 v2.6.0
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9
qiniupkg.com/x v7.0.8+incompatible // indirect
)

33
go.sum
View File

@ -186,6 +186,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
@ -211,6 +213,10 @@ github.com/qiniu/api.v7 v7.2.5+incompatible h1:6KKaGt7MbFzVGSniwzv7qsM/Qv0or4SkR
github.com/qiniu/api.v7 v7.2.5+incompatible/go.mod h1:V8/EzlTgLN6q0s0CJmg/I81ytsvldSF22F7h6MI02+c=
github.com/qiniu/x v7.0.8+incompatible h1:P4LASsfwJY7SoZ13dwqBwGhZh7HKU8cdFVCUkmz0gZ8=
github.com/qiniu/x v7.0.8+incompatible/go.mod h1:KpRKWYG/GaidPQVpoQ2Cvuvtts3gYnoo2PftgdmAiU4=
github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o=
github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
@ -260,6 +266,12 @@ github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLY
github.com/wechatpay-apiv3/wechatpay-go v0.2.6 h1:iWXgJ7nt8vTMU/MYYdZa6yklC8r4qdAJu+CKnRe0Bo0=
github.com/wechatpay-apiv3/wechatpay-go v0.2.6/go.mod h1:W8ucVAOCKOii933cWROLaDLmRQ2cg/vHHVF4vGAVq9Q=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
github.com/xuri/efp v0.0.0-20220407160117-ad0f7a785be8 h1:3X7aE0iLKJ5j+tz58BpvIZkXNV7Yq4jC93Z/rbN2Fxk=
github.com/xuri/efp v0.0.0-20220407160117-ad0f7a785be8/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
github.com/xuri/excelize/v2 v2.6.0 h1:m/aXAzSAqxgt74Nfd+sNzpzVKhTGl7+S9nbG4A57mF4=
github.com/xuri/excelize/v2 v2.6.0/go.mod h1:Q1YetlHesXEKwGFfeJn7PfEZz2IvHb6wdOeYjBxVcVs=
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 h1:OAmKAfT06//esDdpi/DZ8Qsdt4+M5+ltca05dA5bG2M=
github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
@ -275,8 +287,9 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM=
golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -284,6 +297,8 @@ golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm0
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.0.0-20211028202545-6944b10bf410 h1:hTftEOvwiOq2+O8k2D5/Q7COC7k5Qcrgc2TFURJYnvQ=
golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@ -313,8 +328,10 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
golang.org/x/net v0.0.0-20201021035429-f5854403a974 h1:IX6qOQeG5uLjB/hjjwjedwfjND0hgjPMMyO1RoIXQNI=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3 h1:EN5+DfgmRMvRUrMGERW2gQl3Vc+Z7ZMnI/xdEpPSf0c=
golang.org/x/net v0.0.0-20220407224826-aac1ed45d8e3/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -342,13 +359,21 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4 h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e h1:fLOSk5Q00efkSvAm+4xcoXD+RRmLmmulPn5I3Y9F2EM=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View File

@ -99,6 +99,7 @@ const (
CardRetrieveBefore6Month = 500515 // 用户收回卡需要半年后
IssueFeedbackRepetition = 500516 // 问题反馈已存在,不能重复反馈
TodayAttendance = 500517 // 已签到
NoAuth = 500519 // 没有权限
GoodsNotSale = 500508 // 商品已下架
ToastErr = 600 // 报错
@ -202,7 +203,9 @@ var statusMsg = map[int]string{
HbKeySendFail: "口令发送失败60秒后重试",
IsNoviceFail: "该用户不是新用户",
CheckInAlready: "今日已签到",
CheckInAlready: "今日已签到",
NoAuth: "没有权限",
OpenChestTimeNot: "宝箱时间未到",
NotExists: "请求的资源不存在",

View File

@ -31,6 +31,10 @@ func TodayZero() time.Time {
return tm
}
func MonthDate() string {
return NowTime().Format("2006-01")
}
func TodayZeroAddDays(days int) time.Time {
return TodayZero().AddDate(0, 0, days)
}
@ -58,3 +62,7 @@ func Yesterday() time.Time {
func TodayAddDays(days int) time.Time {
return Now().AddDate(0, 0, days)
}
func NowTime() time.Time {
return time.Now().In(cstZone)
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,28 @@
package model
import "time"
import (
"errors"
"fmt"
"github.com/codinl/go-logger"
"github.com/jinzhu/gorm"
"mh-server/lib/utils"
"time"
)
//go:generate goqueryset -in cooperative_business.go
// gen:qs
type CooperativeBusiness struct {
Model
Name string `json:"name"` //
AddTime time.Time `json:"add_time"` // 加入时间
//Identification string `json:"identification"` // 标识
Name string `json:"name" binding:"required"` //
AddTime time.Time `json:"add_time"` // 加入时间
Avatar string `json:"avatar" binding:"required"`
Address string `json:"address" binding:"required"`
Tel string `json:"tel" binding:"required"`
CooperativeMemberDeduct *CooperativeMemberDeduct `json:"cooperative_member_deduct" gorm:"-"`
CooperativeAssistantMemberDeduct *CooperativeAssistantMemberDeduct `json:"cooperative_assistant_member_deduct" gorm:"-"`
//Identification string `json:"identification"` // 标识
// cooperative_business
}
/*
@ -17,6 +30,427 @@ type CooperativeBusiness struct {
游戏
库存
用户 绑定门店 店员
借卡 订单
*/
// gen:qs
type CooperativeMemberDeduct struct {
Model
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金金会员提成
// cooperative_member_deduct
}
// gen:qs
type CooperativeAssistantMemberDeduct struct {
Model
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
StoreId uint32 `json:"store_id" gorm:"index"` //
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金金会员提成
// cooperative_assistant_member_deduct
}
const (
PromotionStateUnSettlement = "un_settlement"
PromotionStateFinancePay = "finance_pay"
PromotionStateSettled = "settled"
)
// 合作商推广会员
// gen:qs
type CooperativeMemberPromotion struct {
Model
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
CooperativeName string `json:"cooperative_name"` // 合作商名称
GoldCount uint32 `json:"gold_count"` // 黄金会员数量
PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量
Date string `json:"date" gorm:"index"` //
State string `json:"state"` // 待发起结算 待财务打款 已结算
// cooperative_member_promotion
}
// 合作商推广会员门店 饼图
// gen:qs
type CooperativeMemberPromotionStore struct {
Model
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
CooperativeName string `json:"cooperative_name"` // 合作商名称
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
GoldCount uint32 `json:"gold_count"` // 黄金会员数量
PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量
Date string `json:"date" gorm:"index"` //
// cooperative_member_promotion_store
}
// 合作商推广会员每天
// gen:qs
type CooperativeMemberPromotionDay struct {
Model
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
CooperativeName string `json:"cooperative_name"` // 合作商名称
GoldCount uint32 `json:"gold_count"` // 黄金会员数量
PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量
DayTime string `json:"day_time" gorm:"index"` //
// cooperative_member_promotion_day
}
// 合作商推广会员门店每天 柱状图
// gen:qs
type CooperativeMemberPromotionStoreDay struct {
Model
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
CooperativeName string `json:"cooperative_name"` // 合作商名称
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
GoldCount uint32 `json:"gold_count"` // 黄金会员数量
PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量
DayTime string `json:"day_time" gorm:"index"` //
//
}
// gen:qs
type CooperativeDeductSettle struct {
Model
CooperativeMemberPromotionId uint32 `json:"cooperative_member_promotion_id" gorm:"index"`
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"`
CooperativeName string `json:"cooperative_name"` // 合作商名称
DeductAmount uint32 `json:"deduct_amount"` // 提成金额
Date string `json:"date" gorm:"index"` //
State string `json:"state"` // 待财务打款 已结算
GoldCount uint32 `json:"gold_count"` // 黄金会员数量
PlatinumCount uint32 `json:"platinum_count"` // 白金会员数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金会员数量
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成配置
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成配置
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成配置
}
func AddCooperativeMemberPromotion(cooperativeId, storeId, assistantUid uint32, memberLevel int) {
defer func() {
if err := recover(); err != nil {
logger.Error("err:", err)
}
}()
var cooperativeBusiness CooperativeBusiness
err := NewCooperativeBusinessQuerySet(DB).IDEq(cooperativeId).One(&cooperativeBusiness)
if err != nil {
logger.Error("cooperative business err:", err)
return
}
go func() {
promotion := &CooperativeMemberPromotion{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name}
promotionStore := &CooperativeMemberPromotionStore{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name}
promotionDay := &CooperativeMemberPromotionDay{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name}
promotionStoreDay := &CooperativeMemberPromotionStoreDay{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name}
inviteReport := &InviteMemberReport{CooperativeBusinessId: cooperativeId, CooperativeName: cooperativeBusiness.Name,
Uid: assistantUid, StoreId: storeId,
}
begin := DB.Begin()
err := promotion.AddPromotion(begin, memberLevel)
if err != nil {
begin.Rollback()
logger.Error("promotion add promotion err:", err)
return
}
err = promotionStore.AddPromotion(begin, memberLevel, storeId)
if err != nil {
begin.Rollback()
logger.Error("promotion add promotion err:", err)
return
}
err = promotionDay.AddPromotion(begin, memberLevel)
if err != nil {
begin.Rollback()
logger.Error("promotion add promotion err:", err)
return
}
err = promotionStoreDay.AddPromotion(begin, memberLevel, storeId)
if err != nil {
begin.Rollback()
logger.Error("promotion add promotion err:", err)
return
}
err = inviteReport.AddPromotion(begin, memberLevel)
if err != nil {
begin.Rollback()
logger.Error("promotion add promotion err:", err)
return
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("commit err:", err)
return
}
}()
}
func (m *CooperativeMemberPromotion) AddPromotion(gdb *gorm.DB, memberLevel int) error {
dateString := utils.MonthDate()
if memberLevel < 0 {
return errors.New("member level err")
}
m.Date = dateString
sql := ""
switch memberLevel {
case 2:
sql = "UPDATE cooperative_member_promotion SET gold_count=gold_count+1 " +
fmt.Sprintf("WHERE date=%s AND cooperative_business_id=%d", dateString, m.CooperativeBusinessId)
m.GoldCount = 1
case 4:
sql = "UPDATE cooperative_member_promotion SET platinum_count=platinum_count+1 " +
fmt.Sprintf("WHERE date=%s AND cooperative_business_id=%d", dateString, m.CooperativeBusinessId)
m.PlatinumCount = 1
case 5:
sql = "UPDATE cooperative_member_promotion SET black_gold_count=black_gold_count+1 " +
fmt.Sprintf("WHERE date=%s AND cooperative_business_id=%d", dateString, m.CooperativeBusinessId)
m.BlackGoldCount = 1
}
fmt.Println("邀请会员sql:", sql)
exist, err := QueryRecordExist(fmt.Sprintf(
"SELECT * FROM cooperative_member_promotion WHERE cooperative_business_id=%d AND date=%s",
m.CooperativeBusinessId, dateString))
if err != nil {
logger.Error("cooperative member promotion record exist err:", err)
return err
}
if exist {
err = gdb.Exec(sql).Error
if err != nil {
logger.Error("update cooperative member promotion err:", err)
return err
}
} else {
m.State = PromotionStateUnSettlement
err = gdb.Create(m).Error
if err != nil {
logger.Error("create cooperative member promotion err:", err)
return err
}
}
return nil
}
func (m *CooperativeMemberPromotionStore) AddPromotion(gdb *gorm.DB, memberLevel int, storeId uint32) error {
dateString := utils.MonthDate()
if memberLevel < 0 {
return errors.New("member level err")
}
m.Date = dateString
m.StoreId = storeId
sql := ""
switch memberLevel {
case 2:
sql = "UPDATE cooperative_member_promotion_store SET gold_count=gold_count+1 " +
fmt.Sprintf("WHERE date=%s AND cooperative_business_id=%d AND store_id=%d",
dateString, m.CooperativeBusinessId, storeId)
m.GoldCount = 1
case 4:
sql = "UPDATE cooperative_member_promotion_store SET platinum_count=platinum_count+1 " +
fmt.Sprintf("WHERE date=%s AND cooperative_business_id=%d AND store_id=%d",
dateString, m.CooperativeBusinessId, storeId)
m.PlatinumCount = 1
case 5:
sql = "UPDATE cooperative_member_promotion_store SET black_gold_count=black_gold_count+1 " +
fmt.Sprintf("WHERE date=%s AND cooperative_business_id=%d AND store_id=%d",
dateString, m.CooperativeBusinessId, storeId)
m.BlackGoldCount = 1
}
exist, err := QueryRecordExist(fmt.Sprintf(
"SELECT * FROM cooperative_member_promotion_store WHERE cooperative_business_id=%d AND date=%s AND store_id=%d",
m.CooperativeBusinessId, dateString, storeId))
if err != nil {
logger.Error("cooperative member promotion record exist err:", err)
return err
}
if exist {
err = gdb.Exec(sql).Error
if err != nil {
logger.Error("update cooperative member promotion err:", err)
return err
}
} else {
err = gdb.Create(m).Error
if err != nil {
logger.Error("create cooperative member promotion err:", err)
return err
}
}
return nil
}
func (m *CooperativeMemberPromotionDay) AddPromotion(gdb *gorm.DB, memberLevel int) error {
dayString := utils.TodayZeroDateFormat()
if memberLevel < 0 {
return errors.New("member level err")
}
m.DayTime = dayString
sql := ""
switch memberLevel {
case 2:
sql = "UPDATE cooperative_member_promotion_day SET gold_count=gold_count+1 " +
fmt.Sprintf("WHERE day_time=%s AND cooperative_business_id=%d", dayString, m.CooperativeBusinessId)
m.GoldCount = 1
case 4:
sql = "UPDATE cooperative_member_promotion_day SET platinum_count=platinum_count+1 " +
fmt.Sprintf("WHERE day_time=%s AND cooperative_business_id=%d", dayString, m.CooperativeBusinessId)
m.PlatinumCount = 1
case 5:
sql = "UPDATE cooperative_member_promotion_day SET black_gold_count=black_gold_count+1 " +
fmt.Sprintf("WHERE day_time=%s AND cooperative_business_id=%d", dayString, m.CooperativeBusinessId)
m.BlackGoldCount = 1
}
exist, err := QueryRecordExist(fmt.Sprintf(
"SELECT * FROM cooperative_member_promotion_day WHERE cooperative_business_id=%d AND day_time=%s",
m.CooperativeBusinessId, dayString))
if err != nil {
logger.Error("cooperative member promotion record exist err:", err)
return err
}
if exist {
err = gdb.Exec(sql).Error
if err != nil {
logger.Error("update cooperative member promotion day err:", err)
return err
}
} else {
err = gdb.Create(m).Error
if err != nil {
logger.Error("create cooperative member promotion day err:", err)
return err
}
}
return nil
}
func (m *CooperativeMemberPromotionStoreDay) AddPromotion(gdb *gorm.DB, memberLevel int, storeId uint32) error {
dateString := utils.TodayZeroDateFormat()
if memberLevel < 0 {
return errors.New("member level err")
}
m.DayTime = dateString
m.StoreId = storeId
sql := ""
switch memberLevel {
case 2:
sql = "UPDATE cooperative_member_promotion_store_day SET gold_count=gold_count+1 " +
fmt.Sprintf("WHERE day_time=%s AND cooperative_business_id=%d AND store_id=%d",
dateString, m.CooperativeBusinessId, storeId)
m.GoldCount = 1
case 4:
sql = "UPDATE cooperative_member_promotion_store_day SET platinum_count=platinum_count+1 " +
fmt.Sprintf("WHERE day_time=%s AND cooperative_business_id=%d AND store_id=%d",
dateString, m.CooperativeBusinessId, storeId)
m.PlatinumCount = 1
case 5:
sql = "UPDATE cooperative_member_promotion_store_day SET black_gold_count=black_gold_count+1 " +
fmt.Sprintf("WHERE day_time=%s AND cooperative_business_id=%d AND store_id=%d",
dateString, m.CooperativeBusinessId, storeId)
m.BlackGoldCount = 1
}
exist, err := QueryRecordExist("SELECT * FROM cooperative_member_promotion_store_day " +
fmt.Sprintf("WHERE cooperative_business_id=%d AND day_time=%s AND store_id=%d",
m.CooperativeBusinessId, dateString, storeId))
if err != nil {
logger.Error("cooperative member promotion store day record exist err:", err)
return err
}
if exist {
err = gdb.Exec(sql).Error
if err != nil {
logger.Error("update cooperative member promotion store day err:", err)
return err
}
} else {
err = gdb.Create(m).Error
if err != nil {
logger.Error("create cooperative member promotion store day err:", err)
return err
}
}
return nil
}
func (m *InviteMemberReport) AddPromotion(gdb *gorm.DB, memberLevel int) error {
dateString := utils.MonthDate()
if memberLevel < 0 {
return errors.New("member level err")
}
if gdb == nil {
gdb = DB
}
if m.StoreId == 0 {
return errors.New("store id is null")
}
if m.Uid == 0 {
return errors.New("uid is null")
}
m.ReportTime = dateString
sql := ""
switch memberLevel {
case 2:
sql = "UPDATE invite_member_report SET gold_count=gold_count+1 " +
fmt.Sprintf("WHERE report_time=%s AND cooperative_business_id=%d AND store_id=%d AND uid=%d",
dateString, m.CooperativeBusinessId, m.StoreId, m.Uid)
m.GoldCount = 1
case 4:
sql = "UPDATE invite_member_report SET platinum_count=platinum_count+1 " +
fmt.Sprintf("WHERE report_time=%s AND cooperative_business_id=%d AND store_id=%d AND uid=%d",
dateString, m.CooperativeBusinessId, m.StoreId, m.Uid)
m.PlatinumCount = 1
case 5:
sql = "UPDATE invite_member_report SET black_gold_count=black_gold_count+1 " +
fmt.Sprintf("WHERE report_time=%s AND cooperative_business_id=%d AND store_id=%d AND uid=%d",
dateString, m.CooperativeBusinessId, m.StoreId, m.Uid)
m.BlackGoldCount = 1
}
exist, err := QueryRecordExist(fmt.Sprintf(
"SELECT * FROM invite_member_report WHERE cooperative_business_id=%d AND report_time=%s AND store_id=%d AND uid=%d",
m.CooperativeBusinessId, dateString, m.StoreId, m.Uid))
if err != nil {
logger.Error("cooperative member promotion record exist err:", err)
return err
}
if exist {
err = gdb.Exec(sql).Error
if err != nil {
logger.Error("update cooperative member promotion err:", err)
return err
}
} else {
//m.State = PromotionStateUnSettlement
err = gdb.Create(m).Error
if err != nil {
logger.Error("create cooperative member promotion err:", err)
return err
}
}
return nil
}
func (m *CooperativeBusiness) SetAssistantMemberDeductConfig(storeId uint32) {
var assistantDeductConfig CooperativeAssistantMemberDeduct
err := DB.Table("cooperative_assistant_member_deduct").Where("cooperative_business_id=?", m.ID).
Where("store_id=?", storeId).Order("id DESC").Limit(1).Find(&assistantDeductConfig).Error
if err != nil && err != RecordNotFound {
logger.Error("cooperative err:", err)
return
}
m.CooperativeAssistantMemberDeduct = &assistantDeductConfig
}

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,7 @@ import (
//"github.com/andreburgaud/crypt2go/padding"
"github.com/codinl/go-logger"
"github.com/jinzhu/gorm"
"github.com/xuri/excelize/v2"
"math/rand"
"strings"
"testing"
@ -74,61 +75,33 @@ func InitTestDB() {
db.SingularTable(true)
db.AutoMigrate(
//&User{},
////&LotteryInviteTargetUser{},
//&GameCard{},
//&Collection{},
//&Config{},
//&HistoryBrowsing{},
//&ShoppingCart{},
//&UserAddress{},
//&SearchHistory{},
//&Order{},
//&HotSearch{},
//&HomeCarousel{},
//&GameCardType{},
//&Store{},
//&GameType{},
//&UserOpenMemberRecord{},
//&CommonProblem{},
//&ExpressCompany{},
//&GameCardGoodsStock{},
//&GameCardGoods{},
//&UserInvite{},
//&ArticleTitlePanel{},
//&RedeemCode{},
//&UserRedeemCode{},
//&DepositRefundRecord{},
//&GroupSendMessageTemplate{},
//
//&Goods{},
//&GoodsOrder{},
//&UserVm{},
//&UserVmRecord{},
//
//&OrderCard{},
//&UserRentCard{},
//&UserConsumeRecord{},
//&UserMemberExpireDelay{},
//
//&UserShareCardBill{},
//&ShareCardBillGame{},
//&UserShareCard{},
//&ShareCardVmRecord{},
//&UserShareCardVm{},
//&ShareCardDateVm{},
//&ShareCardVmRecord{},
//&ShareCardRetrieve{},
//&ShareCardRetrieveCard{},
//&GameCardLabel{},
//&CardIssueFeedback{},
//&GameShareCardVm{},
//&GameCard{},
//&FundRecord{},
//&User{},
//&UserAttendance{},
//&UserAttendanceRecord{},
// 合作商
&Store{},
&GameCard{},
&FundRecord{},
&GameCardGoods{},
&GameCardGoodsStock{},
&User{},
&UserAttendance{},
&UserAttendanceRecord{},
&Order{},
&OrderCard{},
&OperationLog{},
&CooperativeBusiness{},
&CooperativeMemberDeduct{},
&CooperativeAssistantMemberDeduct{},
&CooperativeMemberPromotion{},
&CooperativeMemberPromotionStore{},
&CooperativeMemberPromotionDay{},
&CooperativeMemberPromotionStoreDay{},
&InviteMemberReport{},
&CooperativeDeductSettle{},
&XcxRole{},
)
fmt.Println("DB init success")
@ -164,31 +137,32 @@ func InitDBProd() {
DBProd.LogMode(false)
DBProd.SingularTable(true)
DBProd.AutoMigrate(
//&RedeemCode{},
//&UserRedeemCode{},
//&GameCardGoods{},
//
//&UserShareCardBill{},
//&ShareCardBillGame{},
//&UserShareCard{},
//&ShareCardVmRecord{},
//&UserShareCardVm{},
//&ShareCardDateVm{},
//&ShareCardGameVm{},
//&ShareCardRetrieve{},
//&ShareCardRetrieveCard{},
//&GameCardLabel{},
//&CardIssueFeedback{},
//&RedeemCode{},
//&UserRedeemCode{},
//&GameCardGoods{},
//
//&UserShareCardBill{},
//&ShareCardBillGame{},
//&UserShareCard{},
//&ShareCardVmRecord{},
//&UserShareCardVm{},
//&ShareCardDateVm{},
//&ShareCardGameVm{},
//&ShareCardRetrieve{},
//&ShareCardRetrieveCard{},
//&GameCardLabel{},
//&CardIssueFeedback{},
//&GameCard{},
//&FundRecord{},
//&User{},
//&GameCard{},
//&FundRecord{},
//&User{},
//&GameCard{},
//&FundRecord{},
//&User{},
//&UserAttendance{},
//&UserAttendanceRecord{},
&GameCard{},
&FundRecord{},
&User{},
&UserAttendance{},
&UserAttendanceRecord{},
)
if err := DBProd.DB().Ping(); err != nil {
@ -1104,3 +1078,83 @@ func UserAttendanceDays() {
retJson, _ := json.Marshal(&ret)
fmt.Println("ret:", string(retJson))
}
func TestAddCooperativeBusiness(t *testing.T) {
InitTestDB()
//business := &CooperativeBusiness{
// Name: "迪为",
// AddTime: time.Now(),
//}
//err := DBDev.Create(business).Error
//if err != nil {
// logger.Error("err:")
//}
deduct := &CooperativeMemberDeduct{
CooperativeBusinessId: 1,
GoldDeduct: 5000,
PlatinumDeduct: 8000,
BlackGoldDeduct: 1500,
}
err := DBDev.Create(deduct).Error
if err != nil {
logger.Error("err:")
}
}
func CreateEx() {
file := excelize.NewFile()
sheet := "Sheet1"
index := file.NewSheet(sheet)
file.SetCellStr(sheet, "A1", "这个表格")
file.SetActiveSheet(index)
err := file.SaveAs("boo.xlsx")
if err != nil {
logger.Error("err:", err)
}
}
func TestAddMemberPromotion(t *testing.T) {
AddMemberPromotion()
}
func AddMemberPromotion() {
InitTestDB()
sql := fmt.Sprintf("UPDATE cooperative_member_promotion SET gold_count=gold_count+1 WHERE date=%s AND cooperative_business_id=%d", "2022-04", 1)
err := DBDev.Exec(sql).Error
if err != nil {
logger.Error("err:", err)
}
}
func TestXcxRoleAdd(t *testing.T) {
InitTestDB()
role := &XcxRole{
RoleName: "店长",
RoleKey: "shop_manager",
RoleSort: 2,
Status: "normal",
Flag: "",
CreateBy: "",
UpdateBy: "",
Remark: "",
}
err := DBDev.Create(role).Error
if err != nil {
logger.Error("err:")
}
// assistant
//shop_manager 长
}
func TestExportGoodsStock(t *testing.T) {
InitTestDB()
DB = DBDev
stock := ExportGoodsStock(13)
fmt.Println("stock:", stock)
}

View File

@ -6,6 +6,7 @@ import (
"fmt"
"github.com/codinl/go-logger"
"github.com/jinzhu/gorm"
"golang.org/x/sync/errgroup"
"math/rand"
"time"
)
@ -62,8 +63,13 @@ type Order struct {
RevertExpressDuration uint64 `json:"revert_express_duration"` // 归还物流时长
OutTradeNo string `json:"out_trade_no"` // 支付订单
Mchid string `json:"mchid"` // 商户
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
OrderCardId uint32 `json:"order_card_id" gorm:"-"` //
OrderCardId uint32 `json:"order_card_id" gorm:"-"` //
OrderCards []OrderCard `json:"order_cards" gorm:"-"`
Store *Store `json:"store" gorm:"-"`
UserAddress *UserAddress `json:"user_address" gorm:"-"`
}
// gen:qs
@ -81,24 +87,28 @@ type OrderCard struct {
SerialNumber string `json:"serial_number" gorm:"index"` // 编号
PayStatus uint8 `json:"pay_status"` // 支付状态 1-未支付 2-已支付
RevertStoreId uint64 `json:"revert_store_id"` // 归还门店id
RevertTime time.Time `json:"revert_time"` // 归还时间
RevertExpressCompany string `json:"revert_express_company"` // 归还物流公司
RevertExpressCompanyNo string `json:"revert_express_company_no"` // 归还物流公司编号
RevertExpressNo string `json:"revert_express_no"` // 归还物流单号
RevertExpressDuration uint64 `json:"revert_express_duration"` // 归还物流时长
//Status uint8 `json:"status" gorm:"index"` // 1-待领取 2-游玩中 3-已归还 4-未领取
IssueType uint32 `json:"issue_type"` // 问题类型: 1-问题反馈 2-正常
Postage uint32 `json:"postage" gorm:"-"` // 邮费
ExpressCompany string `json:"express_company" gorm:"-"` // 物流公司
ExpressCompanyNo string `json:"express_company_no" gorm:"-"` // 物流公司编号
ExpressNo string `json:"express_no" gorm:"-"` // 物流单号
RevertStoreId uint64 `json:"revert_store_id"` // 归还门店id
RevertTime time.Time `json:"revert_time"` // 归还时间
RevertExpressCompany string `json:"revert_express_company"` // 归还物流公司
RevertExpressCompanyNo string `json:"revert_express_company_no"` // 归还物流公司编号
RevertExpressNo string `json:"revert_express_no"` // 归还物流单号
RevertExpressDuration uint64 `json:"revert_express_duration"` // 归还物流时长
IssueType uint32 `json:"issue_type"` // 问题类型: 1-问题反馈 2-正常
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
GameName string `json:"name" gorm:"-"` // 名称
GamePrice uint32 `json:"price" gorm:"-"` // 价格
GameCoverImg string `json:"cover_img" gorm:"-"` // 封面
IssueFeedbackStoreId uint32 `json:"issue_feedback_store_id" gorm:"-"` // 问题反馈门店
Order *Order `json:"order" gorm:"-"` // 订单
Postage uint32 `json:"postage" gorm:"-"` // 邮费
ExpressCompany string `json:"express_company" gorm:"-"` // 物流公司
ExpressCompanyNo string `json:"express_company_no" gorm:"-"` // 物流公司编号
ExpressNo string `json:"express_no" gorm:"-"` // 物流单号
GameName string `json:"name" gorm:"-"` // 名称
GamePrice uint32 `json:"price" gorm:"-"` // 价格
GameCoverImg string `json:"cover_img" gorm:"-"` // 封面
IssueFeedbackStoreId uint32 `json:"issue_feedback_store_id" gorm:"-"` // 问题反馈门店
Order *Order `json:"order" gorm:"-"` // 订单
GameCard *GameCard `json:"game_card" gorm:"-"` // 游戏
Store *Store `json:"store" gorm:"-"` // 游戏
//Status uint8 `json:"status" gorm:"index"` // 1-待领取 2-游玩中 3-已归还 4-未领取
//PickupCode string `json:"pickup_code"` // 取货码
}
@ -118,7 +128,6 @@ type OrderInfo struct {
}
func OrderCardListSetGameInfo(list []OrderCard) []OrderCard {
//GameCardMap
ids := make([]uint32, 0, len(list))
orderIds := make([]uint32, 0, len(list))
for i, _ := range list {
@ -141,31 +150,20 @@ func OrderCardListSetGameInfo(list []OrderCard) []OrderCard {
return list
}
//fmt.Println("ids:", ids)
//NewCardIssueFeedbackQuerySet(DB).SerialNumberEq()
//bytes, _ := json.Marshal(&cardMap)
//orderMapbytes, _ := json.Marshal(&orderMap)
//fmt.Println("cardMap:", string(bytes))
//fmt.Println("orderMap:", string(orderMapbytes))
for i, _ := range list {
//fmt.Println("list[i].GameCardId", list[i].GameCardId)
//fmt.Println("list[i].OrderId", list[i].OrderId)
gameCard, ok1 := cardMap[list[i].GameCardId]
order, ok2 := orderMap[list[i].OrderId]
//fmt.Printf("gameCard1:%#v \n", gameCard)
if ok1 && ok2 {
if order.CardStatus == 2 || order.CardStatus == 3 {
order.CardStatus = 4
}
//fmt.Printf("gameCard2:%#v \n", gameCard)
list[i].GameName = gameCard.Name
list[i].GameCoverImg = gameCard.CoverImg
list[i].GamePrice = gameCard.Price
list[i].Order = &order
}
}
//listbytes, _ := json.Marshal(&list)
//fmt.Println("listbytes:", string(listbytes))
return list
}
@ -288,7 +286,7 @@ func (m *Order) Revert() error {
//qs := NewOrderQuerySet(DB).IDEq(m.ID)
//err := qs.One(&order)
//if err != nil {
// logger.Errorf("err:%#v", err)
// logger.Error("err:%#v", err)
// return err
//}
//if order.CardStatus == OrderCardStatusCompleted {
@ -358,7 +356,7 @@ func (m *Order) RevertCancel() (bool, error) {
//qs := NewOrderQuerySet(DB).IDEq(m.ID)
//err := qs.One(&order)
//if err != nil {
// logger.Errorf("err:%#v", err)
// logger.Error("err:%#v", err)
// return false, err
//}
//if order.CardStatus != OrderCardStatusReturning {
@ -844,3 +842,639 @@ func QueryRecordExist(sql string) (bool, error) {
return recordExist.RecordExist == 1, nil
}
type CooperativeRentCardOrderReq struct {
SerialNumber string `json:"serial_number" ` // 编号
PickupCode string `json:"pickup_code"` // 取货码
OrderId uint32 `json:"order_id"` // 取货码
}
func (m *CooperativeRentCardOrderReq) Info() (Order, error) {
var order Order
if m.PickupCode != "" {
err := NewOrderQuerySet(DB).PickupCodeEq(m.PickupCode).PayStatusEq(PayStatusPaid).
CardStatusEq(OrderCardStatusUnPick).One(&order)
if err != nil {
logger.Error("order err:", err)
return order, err
}
} else if m.SerialNumber != "" {
var orderCard OrderCard
err := NewOrderCardQuerySet(DB).SerialNumberEq(m.SerialNumber).CardStatusIn(OrderCardStatusPlaying,
OrderCardStatusReturning).One(&orderCard)
if err != nil {
logger.Error("order card err:", err)
return order, err
}
err = NewOrderQuerySet(DB).IDEq(orderCard.OrderId).One(&order)
if err != nil {
logger.Error("order err:", err)
return order, err
}
} else if m.OrderId != 0 {
err := NewOrderQuerySet(DB).IDEq(m.OrderId).One(&order)
if err != nil {
logger.Error("order err:", err)
return order, err
}
} else {
return order, errors.New("parameter_err")
}
var orderCards []OrderCard
err := NewOrderCardQuerySet(DB).OrderIdEq(order.ID).All(&orderCards)
if err != nil {
logger.Error("order card err:", err)
return order, err
}
var store Store
err = NewStoreQuerySet(DB).IDEq(uint32(order.StoreId)).One(&store)
if err != nil {
logger.Error("store err:", err)
return order, err
}
if order.UserAddressId != 0 {
var address UserAddress
err = NewUserAddressQuerySet(DB).IDEq(uint32(order.UserAddressId)).One(&address)
if err != nil {
logger.Error("address err:", err)
return order, err
}
order.UserAddress = &address
}
order.Store = &store
order.OrderCards = CooperativeOrderCardListSetInfo(orderCards)
return order, nil
}
func CooperativeOrderCardListSetInfo(list []OrderCard) []OrderCard {
ids := make([]uint32, 0, len(list))
for i, _ := range list {
ids = append(ids, list[i].GameCardId)
}
if len(ids) == 0 {
return list
}
cardMap, err := GameCardMap(ids)
if err != nil {
logger.Error("err:", err)
return list
}
for i, _ := range list {
gameCard, ok1 := cardMap[list[i].GameCardId]
if ok1 {
list[i].GameName = gameCard.Name
list[i].GameCoverImg = gameCard.CoverImg
list[i].GamePrice = gameCard.Price
}
}
return list
}
func GetStoreMap(ids []uint32) (map[uint32]Store, error) {
storeMap := make(map[uint32]Store, 0)
if len(ids) == 0 {
return storeMap, nil
}
var stores []Store
err := NewStoreQuerySet(DB).IDIn(ids...).All(&stores)
if err != nil {
logger.Error("err:", err)
return storeMap, err
}
if len(stores) == 0 {
return storeMap, nil
}
for i, _ := range stores {
storeMap[stores[i].ID] = stores[i]
}
return storeMap, nil
}
func (m *Order) GetById() error {
err := NewOrderQuerySet(DB).IDEq(m.ID).One(m)
if err != nil {
logger.Error("get order err")
return err
}
return nil
}
func (m *Order) SetUnPickOrderCards() error {
var cards []OrderCard
err := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).CardStatusEq(OrderCardStatusUnPick).All(&cards)
if err != nil {
logger.Error("get order err")
return err
}
m.OrderCards = cards
return nil
}
func (m *Order) SetOrderCards() error {
var cards []OrderCard
err := NewOrderCardQuerySet(DB).OrderIdEq(m.ID).All(&cards)
if err != nil {
logger.Error("get order err")
return err
}
m.OrderCards = cards
return nil
}
func (m *Order) GetOrderCardMap() (map[string]OrderCard, error) {
cardMap := make(map[string]OrderCard, 0)
err := m.SetOrderCards()
if err != nil {
logger.Error("order card err:", err)
return cardMap, err
}
for i, _ := range m.OrderCards {
cardMap[m.OrderCards[i].SerialNumber] = m.OrderCards[i]
}
return cardMap, nil
}
type CooperativeRentCardOrderDeliverReq struct {
OrderId uint32 `json:"order_id"`
SerialNumbers []string `json:"serial_numbers"`
StoreId uint32 `json:"store_id"`
ExpressCompany string `json:"express_company"`
ExpressCompanyNo string `json:"express_company_no"`
ExpressNo string `json:"express_no"`
OperationUid uint32 `json:"operation_uid"`
}
func (m *CooperativeRentCardOrderDeliverReq) Deliver() (error, string) {
paraMap := make(map[string]interface{}, 0)
order := new(Order)
order.ID = m.OrderId
err := order.GetById()
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return err, ""
}
err = order.SetUnPickOrderCards()
if err != nil {
logger.Error("err:", err)
return err, ""
}
if len(m.SerialNumbers) != len(order.OrderCards) || len(m.SerialNumbers) == 0 {
logger.Error("发货卡的数量与订单游戏卡数量不一致")
return errors.New("发货卡的数量与订单游戏卡数量不一致"), "发货卡的数量与订单游戏卡数量不一致"
}
user := GetUserByUid(uint32(order.Uid))
if user.MemberExpire.Before(time.Now()) {
logger.Error("会员已过期,不能发货")
return errors.New("会员已过期,不能发货"), "会员已过期,不能发货"
}
orderCardMaps := make(map[uint32]OrderCard, 0)
for i, _ := range order.OrderCards {
orderCardMaps[order.OrderCards[i].ID] = order.OrderCards[i]
}
receiptTime := time.Time{}
if order.DeliveryType == 1 {
receiptTime = time.Now()
}
serialNumberMap := make(map[string]GameCardGoods, 0)
var serialGoods []GameCardGoods
err = NewGameCardGoodsQuerySet(DB).SerialNumberIn(m.SerialNumbers...).All(&serialGoods)
if err != nil {
logger.Error("serial goods err:", err)
return err, ""
}
for i, _ := range serialGoods {
serialNumberMap[serialGoods[i].SerialNumber] = serialGoods[i]
}
isUpdateOrder := false
begin := DB.Begin()
for _, serialNumber := range m.SerialNumbers {
if serialNumber != "" {
continue
}
paraMap["game_card_serial_number"] = serialNumber
gameCardGoods, ok := serialNumberMap["serialNumber"]
if !ok {
begin.Rollback()
logger.Errorf("游戏编号卡未找到:%s", serialNumber)
return errors.New("游戏卡未找到"), "编号的游戏卡不存在"
}
if gameCardGoods.Status == GameCardGoodsStatusCannibalize {
begin.Rollback()
return errors.New("card goods status err"), "该卡在调拨中,不能发货"
}
if gameCardGoods.Status != GameCardGoodsStatusStock {
begin.Rollback()
return errors.New("card goods status err"), "该卡状态,不能发货"
}
if order.CardStatus != OrderCardStatusUnPick {
begin.Rollback()
logger.Error("order not unpick")
return errors.New("order not unpick"), "订单不是待取货状态"
}
if order.PayStatus != PayStatusPaid {
begin.Rollback()
logger.Error("order not pay")
return errors.New("order not pay"), "订单未支付"
}
orderCard := GetOrderCardMapSerialNumberUnset(orderCardMaps, uint32(gameCardGoods.GameCardId))
if orderCard == nil {
begin.Rollback()
logger.Error("发货游戏卡错误")
return errors.New("发货游戏卡错误"), "发货游戏卡错误"
}
if m.StoreId != uint32(gameCardGoods.StoreId) {
begin.Rollback()
logger.Error("游戏编号卡不是该门店")
return errors.New("游戏编号卡不是该门店"), "该门店没有改游戏卡"
}
if uint32(m.StoreId) != orderCard.StoreId {
begin.Rollback()
// 订单锁库存
logger.Error("订单门店与发货门店不一致")
return errors.New("订单门店与发货门店不一致"), "订单门店与发货门店不一致,请取消订单后重新下单"
}
if !isUpdateOrder {
if m.StoreId != 0 {
paraMap["store_id"] = m.StoreId
paraMap["pickup_code"] = "已取货"
paraMap["card_status"] = 4
paraMap["store_id"] = m.StoreId
paraMap["delivery_time"] = time.Now()
}
if m.ExpressCompany != "" {
paraMap["express_company"] = m.ExpressCompany
}
if m.ExpressCompanyNo != "" {
paraMap["express_company_no"] = m.ExpressCompanyNo
}
if m.ExpressNo != "" {
paraMap["express_no"] = m.ExpressNo
}
err := begin.Table("order").Where("id", m.OrderId).Updates(paraMap).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err, ""
}
isUpdateOrder = true
}
var eg errgroup.Group
eg.Go(func() error {
err := begin.Table("game_card_goods").Where("serial_number", serialNumber).
Update("status", GameCardGoodsStatusCustomerHold).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
return nil
})
eg.Go(func() error {
goodsStock := &GameCardGoodsStock{
StoreId: uint64(m.StoreId),
GameCardId: gameCardGoods.GameCardId,
}
err = goodsStock.AddUserHoldStock(begin)
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
return nil
})
eg.Go(func() error {
user := GetUserByUid(uint32(order.Uid))
if user.StoreId == 0 {
sql := fmt.Sprintf("UPDATE `user` SET store_id = %d WHERE uid =%d", order.StoreId, order.Uid)
err := DB.Exec(sql).Error
if err != nil {
logger.Error("err:", err)
return err
}
}
return nil
})
eg.Go(func() error {
err = begin.Table("order_card").Where("id=?", orderCard.ID).Updates(&map[string]interface{}{
"store_id": m.StoreId,
"delivery_time": time.Now(),
"game_card_goods_id": gameCardGoods.ID,
"serial_number": gameCardGoods.SerialNumber,
"card_status": 2,
"receipt_time": receiptTime,
}).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
delete(orderCardMaps, orderCard.ID)
return nil
})
err = eg.Wait()
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err, ""
}
}
err = begin.Table("order_card").Where("order_id=?", m.OrderId).Where("uid=?", order.Uid).
Where("serial_number=''").Updates(&map[string]interface{}{
"card_status": 5,
}).Error
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err, ""
}
// TODO
//if m.ExpressCompanyNo != "" && m.ExpressNo != "" {
// _, err = kuaidi.SubscribeExpressState(m.ExpressCompanyNo, m.ExpressNo)
// if err != nil {
// logger.Error("subscribe express state err:", err)
// }
//}
operationLog := &OperationLog{
Uid: m.OperationUid,
Description: "借卡归还入库",
OperationType: OperationTypeRentCardDeliver,
CorrelationId: order.ID,
CorrelationName: LogCorrelationOrderId,
StoreId: m.StoreId,
StoreName: "",
CooperativeName: "",
//SerialNumber: m.SerialNumber,
}
operationLog.AddLog()
return nil, ""
}
type CooperativeRentCardOrderRevertReq struct {
OrderId uint32 `json:"order_id"`
SerialNumber string `json:"serial_number"`
RevertStoreId uint32 `json:"revert_store_id"`
OperationUid uint32 `json:"operation_uid"`
}
func (m *CooperativeRentCardOrderRevertReq) Revert() error {
order := new(Order)
order.ID = m.OrderId
err := order.GetById()
if err != nil {
logger.Error("get order err:", err)
return err
}
cardMap, err := order.GetOrderCardMap()
if err != nil {
logger.Error("err:", err)
return err
}
orderCardIds := make([]uint32, 0, len(cardMap))
orderCardIdString := ""
for _, card := range cardMap {
orderCardIds = append(orderCardIds, card.ID)
orderCardIdString += fmt.Sprintf("%d,", card.ID)
}
recordExist, err := QueryRecordExist(fmt.Sprintf(
"SELECT * FROM card_issue_feedback WHERE state='%s' AND relevance_id in (%s)",
CardIssueStateFollowing, orderCardIdString[:len(orderCardIdString)-1]))
if err != nil {
logger.Errorf("err:%#v", err)
return err
}
if recordExist {
logger.Error("untreated_issue_feedback")
return errors.New("untreated_issue_feedback")
}
serialNumber := m.SerialNumber
orderCard, ok := cardMap[serialNumber]
if !ok {
logger.Error("order card is not revert card")
return errors.New("order card is not revert card")
}
if m.RevertStoreId == 0 {
logger.Error("revert store id null")
return errors.New("revert store id null")
}
if orderCard.CardStatus != OrderCardStatusReturning && orderCard.CardStatus != OrderCardStatusPlaying {
logger.Error("order card status not returning playing ")
return errors.New("order card status not returning playing ")
}
gameCardGoods, err := GetGameCardGoodsBySerialNumber(serialNumber)
if err != nil {
logger.Errorf("err:%#v", err)
return err
}
if order.StoreId != gameCardGoods.StoreId {
logger.Error("order store id not game card goods store id")
return errors.New("order store id not game card goods store id")
}
begin := DB.Begin()
var eg errgroup.Group
eg.Go(func() error {
goodsStatus := GameCardGoodsStatusStock
if gameCardGoods.Status == 7 {
goodsStatus = GameCardGoodsStatusUnusual
}
err := begin.Table("game_card_goods").Where("serial_number=?", serialNumber).
Updates(map[string]interface{}{
"status": goodsStatus,
"store_id": m.RevertStoreId,
"stock_time": time.Now(),
}).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
return nil
})
eg.Go(func() error {
if uint32(gameCardGoods.StoreId) != m.RevertStoreId {
sqlStore := fmt.Sprintf(
"UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock-1,order_count=order_count+1,total_stock=total_stock-1 WHERE store_id=%d AND game_card_id=%d;",
order.StoreId, gameCardGoods.GameCardId)
fmt.Println("sqlStore:", sqlStore)
err = begin.Exec(sqlStore).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
var count int64
err := DB.Table("game_card_goods_stock").Where("store_id", m.RevertStoreId).
Where("game_card_id", gameCardGoods.GameCardId).Count(&count).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
if count == 0 && (gameCardGoods.Status != 7 || gameCardGoods.FunctionState != 1) {
goodsStock := &GameCardGoodsStock{
StoreId: uint64(m.RevertStoreId),
GameCardId: gameCardGoods.GameCardId,
StoreStock: 0,
RentStock: 1,
UserHoldStock: 0,
OrderCount: 0,
TotalStock: 1,
}
err := begin.Create(goodsStock).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
return nil
} else {
if gameCardGoods.Status != 7 || gameCardGoods.FunctionState != 1 {
sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock+1,total_stock=total_stock+1 WHERE store_id=%d AND game_card_id=%d;", m.RevertStoreId, gameCardGoods.GameCardId)
fmt.Println("sql:", sql)
err = begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
}
}
} else {
//sqlStore := fmt.Sprintf("UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock-1,order_count=order_count+1,order_count=order_count+1 WHERE store_id=%d AND game_card_id=%d;", order.StoreId, gameCardGoods.GameCardId)
sqlStore := fmt.Sprintf("UPDATE game_card_goods_stock SET user_hold_stock= user_hold_stock-1,order_count=order_count+1 WHERE store_id=%d AND game_card_id=%d;", order.StoreId, gameCardGoods.GameCardId)
fmt.Println("sqlStore:", sqlStore)
err = begin.Exec(sqlStore).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
if gameCardGoods.Status != 7 || gameCardGoods.FunctionState != 1 {
//sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock+1,user_hold_stock= user_hold_stock-1 WHERE store_id=%d AND game_card_id=%d;", m.RevertStoreId, gameCardGoods.GameCardId)
sql := fmt.Sprintf("UPDATE game_card_goods_stock SET rent_stock= rent_stock+1 WHERE store_id=%d AND game_card_id=%d;", m.RevertStoreId, gameCardGoods.GameCardId)
fmt.Println("sql:", sql)
err = begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
}
}
return nil
})
eg.Go(func() error {
if order.GameCardId != 0 {
sql := fmt.Sprintf("UPDATE game_card SET order_count = order_count+1 WHERE id = %d", order.GameCardId)
err := begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
}
return nil
})
eg.Go(func() error {
err := begin.Table("order_card").Where("id=?", orderCard.ID).Updates(&map[string]interface{}{
"card_status": OrderCardStatusCompleted,
"revert_store_id": m.RevertStoreId,
"revert_time": time.Now(),
}).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
var count int64
err = DB.Table("order_card").Where("order_id=?", orderCard.OrderId).
Where("card_status in (?)", []uint32{1, 2, 3}).Count(&count).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
if count == 0 {
err := begin.Table("order").Where("id=?", orderCard.OrderId).Updates(&map[string]interface{}{
"card_status": OrderCardStatusCompleted,
}).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
}
return nil
})
eg.Go(func() error {
sql := fmt.Sprintf("UPDATE user_rent_card SET have_rent_count = have_rent_count-1,can_rent_count=can_rent_count+1 WHERE uid =%d;", orderCard.Uid)
//sql := fmt.Sprintf("UPDATE user_rent_card SET have_rent_count = have_rent_count-1,can_rent_count=can_rent_count+1 WHERE uid =%d;", m.Uid)
fmt.Println("sql:", sql)
err = begin.Exec(sql).Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
return nil
})
err = eg.Wait()
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
err = begin.Commit().Error
if err != nil {
begin.Rollback()
logger.Error("err:", err)
return err
}
operationLog := &OperationLog{
Uid: m.OperationUid,
Description: "借卡归还入库",
OperationType: OperationTypeRentCardRevert,
CorrelationId: orderCard.ID,
CorrelationName: LogCorrelationOrderCard,
StoreId: m.RevertStoreId,
StoreName: "",
CooperativeName: "",
SerialNumber: m.SerialNumber,
}
operationLog.AddLog()
return nil
}

243
model/stock.go Normal file
View File

@ -0,0 +1,243 @@
package model
import (
"encoding/csv"
"fmt"
"github.com/codinl/go-logger"
"github.com/xuri/excelize/v2"
"os"
"time"
)
type ExportGoods struct {
GoodsName string `json:"goods_name"`
CardPool uint32 `json:"card_pool"`
RentStock uint32 `json:"rent_stock"`
PlayerHold uint32 `json:"player_hold"`
OrderCount uint32 `json:"order_count"`
DelayDeliverGameCard uint32 `json:"delay_deliver_game_card"`
Goods []GameCardGoods `json:"goods"`
}
func ExportGoodsStock(storeId uint32) string {
var games []GameCard
err := DB.Table("game_card").Order("id DESC").Find(&games).Error
if err != nil {
logger.Error("err:", err)
return ""
}
if storeId == 0 {
allInfo, err := GoodsStockAllInfo(games)
if err != nil {
logger.Error("err:", err)
return ""
}
return GoodsStockFile(allInfo, "全部门店")
} else {
var store Store
err := DB.Table("store").Where("id=?", storeId).Find(&store).Error
if err != nil {
logger.Error("err:", err)
return ""
}
storeInfo, err := GoodsStockStoreInfo(games, storeId)
if err != nil {
logger.Error("err:", err)
return ""
}
return GoodsStockFile(storeInfo, store.Name)
}
}
func GoodsStockAllInfo(gameCards []GameCard) ([]ExportGoods, error) {
goodsData := make([]ExportGoods, 0, len(gameCards))
cardStocks := make([]GameCardGoodsStock, 0)
err := DB.Table("game_card_goods_stock").Order("id DESC").Find(&cardStocks).Error
if err != nil {
logger.Error("err:", err)
return goodsData, err
}
cardStockMap := make(map[uint64][]GameCardGoodsStock, 0)
for i, _ := range cardStocks {
cardStockMap[cardStocks[i].GameCardId] = append(cardStockMap[cardStocks[i].GameCardId], cardStocks[i])
}
cardGoods := make([]GameCardGoods, 0)
err = DB.Table("game_card_goods").Order("id DESC").Find(&cardGoods).Error
if err != nil {
logger.Error("err:", err)
return goodsData, err
}
cardGoodsMap := make(map[uint64][]GameCardGoods, 0)
for i, _ := range cardGoods {
cardGoodsMap[cardGoods[i].GameCardId] = append(cardGoodsMap[cardGoods[i].GameCardId], cardGoods[i])
}
for _, game := range gameCards {
cardStock, ok1 := cardStockMap[uint64(game.ID)]
gameCardGoods, ok2 := cardGoodsMap[uint64(game.ID)]
if !ok1 || !ok2 {
continue
}
exportGoods := &ExportGoods{
GoodsName: game.Name,
Goods: gameCardGoods,
}
for i, _ := range cardStock {
exportGoods.RentStock += cardStock[i].RentStock
exportGoods.OrderCount += cardStock[i].OrderCount
}
exportGoods.CardPool = uint32(len(gameCardGoods))
for i, _ := range gameCardGoods {
if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
exportGoods.PlayerHold += 1
}
}
exportGoods.DelayDeliverGameCard = uint32(len(gameCardGoods)) - exportGoods.RentStock - exportGoods.PlayerHold
goodsData = append(goodsData, *exportGoods)
}
return goodsData, err
}
func GoodsStockFile(goodsData []ExportGoods, fileName string) string {
url := "http://switch.deovo.com:8000/img/export/"
fileName = fileName + time.Now().Format("2006-01-02 15:04:05") + ".csv"
// /www/server/images/export
//f, err := os.OpenFile(fmt.Sprintf("./")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
f, err := os.OpenFile(fmt.Sprintf("/www/server/images/export/")+fileName, os.O_CREATE|os.O_TRUNC|os.O_APPEND|os.O_RDWR, 0644)
if err != nil {
fmt.Println(err)
return url + fileName
}
defer f.Close()
w := csv.NewWriter(f)
headline := []string{"游戏名称", "卡池总数", "在库数量", "玩家持有数量", "锁定数量", "借出总数", "游戏卡编号", "状态"}
if err := w.Write(headline); err != nil {
logger.Error("error writing record to csv:", err)
return url
}
for _, goods := range goodsData {
record := []string{goods.GoodsName, fmt.Sprintf("%d", goods.CardPool),
fmt.Sprintf("%d", goods.RentStock),
fmt.Sprintf("%d", goods.PlayerHold),
fmt.Sprintf("%d", goods.DelayDeliverGameCard),
fmt.Sprintf("%d", goods.OrderCount)}
if len(goods.Goods) > 0 {
record = append(record, goods.Goods[0].SerialNumber, GoodsStatusStringByStatus(goods.Goods[0].Status))
}
if err := w.Write(record); err != nil {
logger.Error("error writing record to csv:", err)
return url
}
if len(goods.Goods) <= 1 {
continue
}
for _, cardGoods := range goods.Goods[1:] {
recordGoods := make([]string, 6)
recordGoods = append(recordGoods, cardGoods.SerialNumber, GoodsStatusStringByStatus(cardGoods.Status))
if err := w.Write(recordGoods); err != nil {
logger.Error("error writing record to csv:", err)
return url
}
}
}
newFile := excelize.NewFile()
fmt.Println("newFile:", newFile)
w.Flush()
if err := w.Error(); err != nil {
//log.Fatal(err)
logger.Error("err:", err)
}
return url + fileName
}
func GoodsStockStoreInfo(gameCards []GameCard, storeId uint32) ([]ExportGoods, error) {
goodsData := make([]ExportGoods, 0, len(gameCards))
cardStocks := make([]GameCardGoodsStock, 0)
err := DB.Table("game_card_goods_stock").Where("store_id=?", storeId).Order("id DESC").Find(&cardStocks).Error
if err != nil {
logger.Error("err:", err)
return goodsData, err
}
cardStockMap := make(map[uint64]GameCardGoodsStock, 0)
for i, _ := range cardStocks {
cardStockMap[cardStocks[i].GameCardId] = cardStocks[i]
}
cardGoods := make([]GameCardGoods, 0)
err = DB.Table("game_card_goods").Where("store_id=?", storeId).Order("id DESC").Find(&cardGoods).Error
if err != nil {
logger.Error("err:", err)
return goodsData, err
}
cardGoodsMap := make(map[uint64][]GameCardGoods, 0)
for i, _ := range cardGoods {
cardGoodsMap[cardGoods[i].GameCardId] = append(cardGoodsMap[cardGoods[i].GameCardId], cardGoods[i])
}
for _, game := range gameCards {
cardStock, ok1 := cardStockMap[uint64(game.ID)]
gameCardGoods, ok2 := cardGoodsMap[uint64(game.ID)]
if !ok1 || !ok2 {
continue
}
exportGoods := &ExportGoods{
GoodsName: game.Name,
//CardPool: cardStock.StoreStock,
RentStock: cardStock.RentStock,
OrderCount: cardStock.OrderCount,
Goods: gameCardGoods,
}
exportGoods.CardPool = uint32(len(gameCardGoods))
for i, _ := range gameCardGoods {
if gameCardGoods[i].Status == GameCardGoodsStatusCustomerHold {
exportGoods.PlayerHold += 1
}
}
if uint32(len(gameCardGoods)) > exportGoods.RentStock+exportGoods.PlayerHold {
exportGoods.DelayDeliverGameCard = uint32(len(gameCardGoods)) - exportGoods.RentStock - exportGoods.PlayerHold
}
goodsData = append(goodsData, *exportGoods)
}
return goodsData, err
}
func GoodsStatusStringByStatus(status uint32) string {
switch status {
case 1:
return "库存中"
case 2:
return "在途"
case 3:
return "客户持有"
case 4:
return "调拨中"
case 5:
return "待收回"
case 6:
return "已收回"
case 7:
return "异常锁定"
}
return ""
}

View File

@ -4,6 +4,7 @@ import (
"fmt"
"github.com/codinl/go-logger"
"golang.org/x/sync/errgroup"
"time"
)
//go:generate goqueryset -in store.go
@ -11,16 +12,18 @@ import (
type Store struct {
Model
Name string `json:"name"` // 门店名称
Img string `json:"img"` // 门面图
Tel string `json:"tel" gorm:"type:varchar(20)"` // 电话
Province string `json:"province" gorm:"type:varchar(100)"` // 省
City string `json:"city" gorm:"type:varchar(100)"` // 市
District string `json:"district" gorm:"type:varchar(100)"` // 区
Address string `json:"address" gorm:"type:varchar(100)"` // 详细地址
Longitude float64 `json:"longitude" gorm:"column:longitude"` // 经度
Latitude float64 `json:"latitude" gorm:"column:latitude"` // 纬度
IsOnline uint32 `json:"is_online"`
Name string `json:"name"` // 门店名称
Img string `json:"img"` // 门面图
Tel string `json:"tel" gorm:"type:varchar(20)"` // 电话
Province string `json:"province" gorm:"type:varchar(100)"` // 省
City string `json:"city" gorm:"type:varchar(100)"` // 市
District string `json:"district" gorm:"type:varchar(100)"` // 区
Address string `json:"address" gorm:"type:varchar(100)"` // 详细地址
Longitude float64 `json:"longitude" gorm:"column:longitude"` // 经度
Latitude float64 `json:"latitude" gorm:"column:latitude"` // 纬度
IsOnline uint32 `json:"is_online"` // 在线
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
}
func (*Store) TableName() string {
@ -136,22 +139,40 @@ func (m *Store) Info() error {
return nil
}
const (
CannibalizeTaskStatusNotImportGoods = 1 // 1-待填调拨卡
CannibalizeTaskStatusNotDeliverGoods = 2 // 2-待发货
CannibalizeTaskStatusDeliveredGoods = 3 // 3-已发货
CannibalizeTaskStatusInStorage = 4 // 4-已入库
CannibalizeTaskStatusDel = 5 // 4-已删除
)
// gen:qs
type CannibalizeStockTask struct {
Model
FromStoreId uint32 `json:"from_store_id"`
ToStoreId uint32 `json:"to_store_id"`
TaskId uint32 `json:"task_id"`
GameCardId uint32 `json:"game_card_id"` // 游戏卡id
Count uint32 `json:"count"`
Status uint8 `json:"status"` // 1-待填调拨卡 2-待发货 3-已发货 4-已入库
//GameCardId uint32 `json:"game_card_id"` // 游戏卡id
Count uint32 `json:"count"` // 总数量
Status uint8 `json:"status"` // 1-待填调拨卡 2-待发货 3-已发货 4-已入库
DeliveryTime time.Time `json:"delivery_time"`
InStorageTime time.Time `json:"in_storage_time"`
FromStoreName string `json:"from_store_name" gorm:"-"`
ToStoreName string `json:"to_store_name" gorm:"-"`
// cannibalize_stock_task
}
// gen:qs
type CannibalizeGameCardGoods struct {
Model
CannibalizeStockTaskId uint32 `json:"cannibalize_stock_task_id"`
GameCardId uint32 `json:"game_card_id"` // 游戏卡id
SerialNumber string `json:"serial_number" gorm:"index"` // 编号
GameCardName string `json:"game_card_name" gorm:""`
// cannibalize_game_card_goods
}
func IsStoreStockEnough(cardInfos []CardInfo, gameStockMap map[uint64]uint32) bool {
@ -164,3 +185,65 @@ func IsStoreStockEnough(cardInfos []CardInfo, gameStockMap map[uint64]uint32) bo
}
return true
}
func CannibalizeStockTaskListSetInfo(tasks []CannibalizeStockTask) []CannibalizeStockTask {
if len(tasks) == 0 {
return tasks
}
storeMap := GetAllStoreMap()
for i, _ := range tasks {
toStore, ok1 := storeMap[tasks[i].ToStoreId]
if ok1 {
tasks[i].ToStoreName = toStore.Name
}
fromStore, ok2 := storeMap[tasks[i].FromStoreId]
if ok2 {
tasks[i].FromStoreName = fromStore.Name
}
}
return tasks
}
func GetAllStoreMap() map[uint32]Store {
storeMap := make(map[uint32]Store, 0)
var stores []Store
err := DB.Table("store").Find(&stores).Error
if err != nil {
logger.Errorf("err:%s", err)
return storeMap
}
for i, _ := range stores {
storeMap[stores[i].ID] = stores[i]
}
return storeMap
}
func CannibalizeGameCardGoodsSetInfo(goodses []CannibalizeGameCardGoods) []CannibalizeGameCardGoods {
if len(goodses) == 0 {
return goodses
}
ids := make([]uint32, 0)
for i, _ := range goodses {
ids = append(ids, goodses[i].GameCardId)
}
var gameCards []GameCard
err := DB.Table("game_card").Where("id IN (?)", ids).Find(&gameCards).Error
if err != nil {
logger.Error("err:", err)
return goodses
}
gameCardMap := make(map[uint32]GameCard, 0)
for i, _ := range gameCards {
gameCardMap[gameCards[i].ID] = gameCards[i]
}
for i, _ := range goodses {
v, ok := gameCardMap[goodses[i].GameCardId]
if ok {
goodses[i].GameCardName = v.Name
}
}
//UserOpenMemberRecord{}
return goodses
}

View File

@ -16,32 +16,36 @@ import (
type User struct {
Model
Uid uint32 `json:"uid" gorm:"column:uid;unique_index"`
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
OpenMemberTime time.Time `json:"open_member_time"` // 开通会员
Bond uint32 `json:"bond"` // 保证金
WxName string `json:"wx_name"` // 昵称
WxAvatar string `json:"wx_avatar"` // 头像
WxOpenID string `json:"wx_open_id"`
AppOpenID string `json:"app_open_id"`
WxUnionID string `json:"wx_union_id"`
Tel string `json:"tel"` // 电话
Gender uint8 `json:"gender"` // 性别
City string `json:"city"` // 城市
Province string `json:"province"` // 省
Country string `json:"country"` // 市
Deposit uint32 `json:"deposit"` // 押金
UserType uint8 `json:"user_type"` // 用户类型 1-普通用户 2-店员
OpenMemberChannel string `json:"open_member_channel" ` // 开通会员渠道 -门店推广 -用户邀请 -兑换码
StoreId uint64 `json:"store_id"` // 门店id
InviteCodeUrl string `json:"invite_code_url"` // 分享二维码
LastLoginAt time.Time `json:"last_login_at"` // 最近登录时间
IP string `json:"-" gorm:"type:varchar(60)"` // ip
InBlack bool `json:"in_black"` // 是否在黑名单
StoreType uint8 `json:"store_type"` // 1-订单门店
Version uint32 `json:"-"`
UserVm *UserVm `json:"user_vm" gorm:"-"` //
Uid uint32 `json:"uid" gorm:"column:uid;unique_index"`
MemberLevel uint32 `json:"member_level"` // 会员等级 1-用户 2-会员
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
OpenMemberTime time.Time `json:"open_member_time"` // 开通会员
Bond uint32 `json:"bond"` // 保证金
WxName string `json:"wx_name"` // 昵称
WxAvatar string `json:"wx_avatar"` // 头像
WxOpenID string `json:"wx_open_id"`
AppOpenID string `json:"app_open_id"`
WxUnionID string `json:"wx_union_id"`
Tel string `json:"tel"` // 电话
Gender uint8 `json:"gender"` // 性别
City string `json:"city"` // 城市
Province string `json:"province"` // 省
Country string `json:"country"` // 市
Deposit uint32 `json:"deposit"` // 押金
UserType uint32 `json:"user_type"` // 用户类型: 1-普通用户 2-店员
XcxRoleId uint32 `json:"xcx_role_id"` // 角色id
OpenMemberChannel string `json:"open_member_channel" ` // 开通会员渠道: -门店推广 -用户邀请 -兑换码
StoreId uint64 `json:"store_id"` // 门店id
InviteCodeUrl string `json:"invite_code_url"` // 分享二维码
LastLoginAt time.Time `json:"last_login_at"` // 最近登录时间
IP string `json:"-" gorm:"type:varchar(60)"` // ip
InBlack bool `json:"in_black"` // 是否在黑名单
StoreType uint32 `json:"store_type"` // 1-订单门店
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
Version uint32 `json:"-"`
UserVm *UserVm `json:"user_vm" gorm:"-"` //
//RoleId uint32 `json:"role_id"` // 角色id
}
func (o *User) TableName() string {
@ -76,10 +80,10 @@ type UserInvite struct {
Model
FromUid uint32 `json:"from_uid"` // 邀请用户id
UserType uint8 `json:"user_type"` // 用户类型
UserType uint32 `json:"user_type"` // 用户类型
StoreId uint64 `json:"store_id"` // 门店id
MemberOpenTime time.Time `json:"member_open_time"` // 开通会员
MemberType uint8 `json:"member_type"` // 被邀请用户 1-普通用户 2-会员
MemberType uint32 `json:"member_type"` // 被邀请用户 1-普通用户 2-会员
MemberStatus uint8 `json:"member_status"` // 被邀请用户 1-未开通 2-已开通 3-已取消会员
ToUid uint32 `json:"to_uid"` // 被邀请用户
StoreType uint32 `json:"store_type"` // 门店类型
@ -162,6 +166,24 @@ type UserMemberExpireDelay struct {
IsPay uint32 `json:"is_pay"` // 1-已支付
}
// gen:qs
type XcxRole struct {
Model
RoleId uint32 `json:"role_id" gorm:"unique_index,not null"`
RoleName string `json:"role_name" gorm:"size:255;"` // 角色名称
RoleKey string `json:"role_key" gorm:"size:255;"` // 角色代码
RoleSort int `json:"role_sort" gorm:""` // 角色排序
Status string `json:"status" gorm:"size:255;"` // 状态:1-停用 2-正常
Flag string `json:"flag" gorm:"size:255;"` //
CreateBy string `json:"create_by" gorm:"size:255;"` //
UpdateBy string `json:"update_by" gorm:"size:255;"` //
Remark string `json:"remark" gorm:"size:255;"` // 备注
Params string `json:"params" gorm:"-"`
MenuIds []int `json:"menuIds" gorm:"-"`
DeptIds []int `json:"deptIds" gorm:"-"`
}
func GetUserByUid(uid uint32) *User {
user := new(User)
if err := NewUserQuerySet(DB).UidEq(uid).One(user); err != nil {
@ -217,9 +239,9 @@ func UserUpdate(user *User) error {
type UserOpenMemberRecord struct {
Model
Uid uint32 `json:"uid"`
Uid uint32 `json:"uid" gorm:"index"`
OpenNo string `json:"open_no" gorm:"index"`
OrderId uint32 `json:"order_id"`
OrderId uint32 `json:"order_id" gorm:"index"`
OrderType uint32 `json:"order_type"` // 1-物流支付 2-取消物流租卡 3-滞纳金 4-收回卡 5-退物流费
MemberLevel uint32 `json:"member_level"`
MemberExpire time.Time `json:"member_expire"` // 会员到期时间
@ -241,6 +263,29 @@ func (m UserOpenMemberRecord) Insert() error {
return nil
}
const (
LogCorrelationOrderId = "order_id"
LogCorrelationOrderCard = "order_card_id"
)
const (
OperationTypeRentCardRevert = "rent_card_revert"
OperationTypeRentCardDeliver = "rent_card_deliver"
)
// gen:qs
type OperationLog struct {
Model
Uid uint32 `json:"uid" gorm:"index"` // 店员id
Description string `json:"description"` // 描述
OperationType string `json:"operation_type" gorm:"index"` // 操作类型
CorrelationId uint32 `json:"correlation_id" gorm:"index"` // 关联id
CorrelationName string `json:"correlation_name" gorm:"index"` // 关联name
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
StoreName string `json:"store_name"` // 门店名称
CooperativeName string `json:"cooperative_name"` // 合作商名称
SerialNumber string `json:"serial_number" gorm:"index"` // 卡编号
}
func (m *UserOpenMemberRecord) OrderRefund(outTradeNo string) error {
if m.Order == nil {
return errors.New("order is nil")
@ -260,6 +305,24 @@ func (m *UserOpenMemberRecord) OrderRefund(outTradeNo string) error {
return nil
}
// gen:qs
type InviteMemberReport struct {
Model
Uid uint32 `json:"uid" gorm:"index"` // 店员uid
StoreId uint32 `json:"store_id" gorm:"index"` // 门店id
GoldCount uint32 `json:"gold_count"` // 黄金数量
PlatinumCount uint32 `json:"platinum_count"` // 白金数量
BlackGoldCount uint32 `json:"black_gold_count"` // 黑金数量
ReportTime string `json:"report_time" gorm:"index"` // 业绩时间
DeductAmount uint32 `json:"deduct_amount"` // 店员提成
CooperativeBusinessId uint32 `json:"cooperative_business_id" gorm:"index"` // 合作商id
CooperativeName string `json:"cooperative_name"` // 合作商名称
GoldDeduct uint32 `json:"gold_deduct"` // 黄金会员提成
PlatinumDeduct uint32 `json:"platinum_deduct"` // 白金会员提成
BlackGoldDeduct uint32 `json:"black_gold_deduct"` // 黑金会员提成
// invite_member_report
}
func (m *UserOpenMemberRecord) Refund(outTradeNo string, amount uint32) error {
configInfo, err := PayConfigInfo()
if err != nil {
@ -301,45 +364,44 @@ func (m *UserOpenMemberRecord) Refund(outTradeNo string, amount uint32) error {
return nil
}
func (m *UserOpenMemberRecord) ShareCardRetrieveRefund(outTradeNo string) error {
//if m.ShareCardRetrieve == nil {
// return errors.New("order is nil")
//}
//if m.OpenNo == "" {
// m.OpenNo = GetShareCardRetrieveOrderSn()
//}
//m.Uid = uint32(m.Order.Uid)
//m.OrderId = m.ShareCardRetrieve.ID
//configInfo, err := PayConfigInfo()
//if err != nil {
// logger.Error("config info err:", err)
// return err
//}
//
//err = m.Insert()
//if err != nil {
// logger.Error("insert user open member record err:", err)
// return err
//}
//
//orderRefund := wxpay.OrderRefund{
// OutTradeNo: outTradeNo,
// OutRefundNo: m.OpenNo,
// NotifyUrl: configInfo.NotifyUrl,
// Amount: wxpay.OrderRefundAmount{
// Refund: m.ShareCardRetrieve.PayAmount,
// Total: m.ShareCardRetrieve.PayAmount,
// Currency: "CNY",
// },
//}
//err = wxpay.TransactionOrderRefund(orderRefund)
//if err != nil {
// logger.Error("err:", err)
// return err
//}
return nil
}
//func (m *UserOpenMemberRecord) ShareCardRetrieveRefund(outTradeNo string) error {
// //if m.ShareCardRetrieve == nil {
// // return errors.New("order is nil")
// //}
// //if m.OpenNo == "" {
// // m.OpenNo = GetShareCardRetrieveOrderSn()
// //}
// //m.Uid = uint32(m.Order.Uid)
// //m.OrderId = m.ShareCardRetrieve.ID
// //configInfo, err := PayConfigInfo()
// //if err != nil {
// // logger.Error("config info err:", err)
// // return err
// //}
// //
// //err = m.Insert()
// //if err != nil {
// // logger.Error("insert user open member record err:", err)
// // return err
// //}
// //
// //orderRefund := wxpay.OrderRefund{
// // OutTradeNo: outTradeNo,
// // OutRefundNo: m.OpenNo,
// // NotifyUrl: configInfo.NotifyUrl,
// // Amount: wxpay.OrderRefundAmount{
// // Refund: m.ShareCardRetrieve.PayAmount,
// // Total: m.ShareCardRetrieve.PayAmount,
// // Currency: "CNY",
// // },
// //}
// //err = wxpay.TransactionOrderRefund(orderRefund)
// //if err != nil {
// // logger.Error("err:", err)
// // return err
// //}
// return nil
//}
func (m *UserOpenMemberRecord) GetByOpenNo() error {
err := NewUserOpenMemberRecordQuerySet(DB).OpenNoEq(m.OpenNo).One(m)
@ -431,7 +493,7 @@ func (m *UserInviteListReq) InviteUserList() (*UserInviteListResp, error) {
qs := NewUserInviteQuerySet(DB).FromUidEq(m.Uid)
if m.MemberType != 0 {
qs = qs.MemberTypeEq(uint8(m.MemberType))
qs = qs.MemberTypeEq(uint32(m.MemberType))
}
if m.StartTime != "" {
parse, err := time.Parse(DateTimeFormat, m.StartTime)
@ -786,3 +848,64 @@ func MemberExpireDelaying(uid uint32) (map[string]interface{}, error) {
}
return ret, nil
}
func (m *OperationLog) AddLog() {
defer func() {
if err := recover(); err != nil {
fmt.Println("recover err:", err)
}
}()
go func() {
err := DB.Create(m).Error
if err != nil {
logger.Error("create operation log err:")
}
}()
}
type InviteMemberReportListReq struct {
PageNum int `json:"page_num"`
PageSize int `json:"page_size"`
Uid uint32 `json:"uid"`
}
func (m *InviteMemberReportListReq) List() ([]InviteMemberReport, int, error) {
var memberReport []InviteMemberReport
qs := NewInviteMemberReportQuerySet(DB).UidEq(m.Uid)
count, err := qs.Count()
if err != nil {
logger.Error("err:", err)
return memberReport, 0, err
}
page := m.PageNum - 1
if page < 0 {
page = 0
}
if m.PageSize == 0 {
m.PageSize = 10
}
totalPage := count/m.PageSize + 1
err = qs.Offset(page * m.PageSize).Limit(m.PageSize).OrderDescByID().All(&memberReport)
if err != nil && err != RecordNotFound {
logger.Error("err:", err)
return memberReport, totalPage, err
}
assistant := GetUserByUid(m.Uid)
cooperative := new(CooperativeBusiness)
cooperative.ID = assistant.CooperativeBusinessId
cooperative.SetAssistantMemberDeductConfig(uint32(assistant.StoreId))
if len(memberReport) > 0 {
memberReport[len(memberReport)-1].GoldDeduct = cooperative.CooperativeAssistantMemberDeduct.GoldDeduct
memberReport[len(memberReport)-1].PlatinumDeduct = cooperative.CooperativeAssistantMemberDeduct.PlatinumDeduct
memberReport[len(memberReport)-1].BlackGoldDeduct = cooperative.CooperativeAssistantMemberDeduct.BlackGoldDeduct
report := memberReport[len(memberReport)-1]
memberReport[len(memberReport)-1].DeductAmount += report.GoldCount * report.GoldDeduct
memberReport[len(memberReport)-1].DeductAmount += report.PlatinumCount * report.PlatinumDeduct
memberReport[len(memberReport)-1].DeductAmount += report.BlackGoldCount * report.BlackGoldDeduct
}
return memberReport, totalPage, nil
}

View File

@ -88,6 +88,7 @@ func ConfigAppRouter(r gin.IRouter) {
user.POST("member_config", controller.MemberConfigList) // 开通会员配置
user.POST("attendance", controller.UserAttendance) // 签到
user.POST("attendance/detail", controller.UserAttendanceDetail) // 签到详情
user.POST("invite_report", controller.InviteMemberReportList) // 用户邀请会员业绩报表
user.POST("common_problem/list", controller.CommonProblemList) // 常见问题列表
//user.POST("service/wechat_id", controller.GetCustomerServiceWechatId) // 获取客服微信号
@ -210,9 +211,29 @@ func ConfigAppRouter(r gin.IRouter) {
shareCard.POST("card_issue/list", controller.CardIssueList) // 我的共享卡问题反馈列表
shareCard.POST("card_issue/info", controller.CardIssueInfo) // 我的共享卡问题反馈详情
shareCard.POST("card_issue/deliver", controller.CardIssueDeliver) // 我的共享卡问题反馈卡发货
//shoppingCart.POST("del", controller.ShoppingCartDel) //
}
cooperative := api.Group("cooperative_business")
{
cooperative.Use(auth.UserAccessAuth)
cooperative.POST("rent_card_order/list", controller.CooperativeRentCardOrderList)
cooperative.POST("rent_card_order/info", controller.CooperativeRentCardOrderInfo)
cooperative.POST("rent_card_order/deliver", controller.CooperativeRentCardOrderDeliver) // 订单发货
cooperative.POST("rent_card_order/revert", controller.CooperativeRentCardOrderRevert) // 订单归还
cooperative.POST("goods_stock/adds", controller.CooperativeGameCardGoodsStockAdds) // 游戏卡入库
cooperative.POST("goods_stock/analysis", controller.GameCardGoodsStockAnalysis) // 游戏卡
cooperative.POST("goods_stock/export", controller.CooperativeExportDataGameCardGoodsStock) // 库存导出
cooperative.POST("goods_stock/goods_list", controller.CooperativeGameCardGoodsList) // 卡列表
cooperative.POST("member_promotion/assistant_list", controller.AssistantMemberPromotionList) // 店员推广 TODO
cooperative.POST("/cannibalize_task/create", controller.CooperativeCannibalizeTaskCreate) // 创建调拨
cooperative.POST("/cannibalize_task/import_goods", controller.CooperativeCannibalizeTaskImportGoods) //
cooperative.POST("/cannibalize_task/deliver_goods", controller.CooperativeCannibalizeTaskDeliverGoods) //
cooperative.POST("/cannibalize_task/put_in_storage", controller.CooperativeCannibalizeTaskPutInStorage) //
cooperative.POST("/cannibalize_task/list", controller.CooperativeCannibalizeTaskList) //
cooperative.POST("/cannibalize_task/goods_list", controller.CooperativeCannibalizeTaskGameCardGoodsList) //
cooperative.POST("/cannibalize_task/del", controller.CooperativeCannibalizeTaskDel) //
//order.POST("/card/adds", stockmanage.GameCardGoodsStockAdds) // 游戏卡入库
}
}