diff --git a/internal/api/manage/order/after_sales.go b/internal/api/manage/order/after_sales.go index 80ee751..1bf319f 100755 --- a/internal/api/manage/order/after_sales.go +++ b/internal/api/manage/order/after_sales.go @@ -960,9 +960,7 @@ func AfterNotToDoTwo() { "72小时未填写单号,系统自动关闭", } UpdateNotExp(p, v) - } - } } } diff --git a/internal/api/mobile/order/plan.go b/internal/api/mobile/order/plan.go index b6fa804..280d84f 100755 --- a/internal/api/mobile/order/plan.go +++ b/internal/api/mobile/order/plan.go @@ -10,7 +10,7 @@ import ( // 订单自动确认时间 var days time.Duration = 15 -// 一定要保证上个月的订单全部完成 +// PlanMonitorTradeSucOrderTask 一定要保证上个月的订单全部完成 func PlanMonitorTradeSucOrderTask() { for { select { @@ -69,15 +69,3 @@ func PlanMonitorExpireOrderTask() { } } } - -func PlanPartnerSalesMonthStat() { - //for { - // select { - // case <-time.After(1 * time.Hour): - // if err := DistributeTeamCommission(); err != nil { - // log.Fatal("订单无法自动设置过期:" + err.Error()) - // } - // } - //} - -} diff --git a/internal/api/mobile/order_preview/normal_create.go b/internal/api/mobile/order_preview/normal_create.go index 3bdc1d2..340e92a 100755 --- a/internal/api/mobile/order_preview/normal_create.go +++ b/internal/api/mobile/order_preview/normal_create.go @@ -31,19 +31,18 @@ import ( /*普通订单预览的参数*/ type previewNormalOrderParam struct { - UserID uint `json:"userId" validate:"required"` - SkuID uint `json:"skuId" validate:"required"` - Quantity uint `json:"quantity" validate:"required"` - ParentID uint `json:"parentId"` // 可选字段 如果是链接分享 则传入该字段,代表分享者的id。 没有的话。就是上级的id,顶级用户没有 - UseCoin int `json:"useCoin"` //默认0 开启 1 关闭 - LiveId uint `json:"liveId"` //直播间id - Address string `json:"address"` + UserID uint `json:"userId" validate:"required"` + SkuID uint `json:"skuId" validate:"required"` + Quantity uint `json:"quantity" validate:"required"` + ParentID uint `json:"parentId"` // 可选字段 如果是链接分享 则传入该字段,代表分享者的id。 没有的话。就是上级的id,顶级用户没有 + UseCoin int `json:"useCoin"` //默认0 开启 1 关闭 + LiveId uint `json:"liveId"` //直播间id + Address string `json:"address"` + InvitationNo string `json:"invitation_no"` } -/* -创建普通订单,从商品详情页直接点击《立即购买》按钮进入购买页面,客户端不计算价格,服务端进行计算。 -明天参加活动的商品不允许购买 -*/ +// CreatePreviewNormalOrder 创建普通订单,从商品详情页直接点击《立即购买》按钮进入购买页面,客户端不计算价格,服务端进行计算。 +// 明天参加活动的商品不允许购买 func CreatePreviewNormalOrder(c *gin.Context) { var p previewNormalOrderParam err := tools.ParseParams(&p, c) diff --git a/internal/cache/user_code.go b/internal/cache/user_code.go deleted file mode 100644 index f876288..0000000 --- a/internal/cache/user_code.go +++ /dev/null @@ -1,178 +0,0 @@ -package cache - -import ( - "github.com/go-redis/redis" - "github.com/golangkit/formatime" - "log" - "recook/internal/dbc" - "recook/internal/model/user" - "recook/internal/service/comFunc" - "strconv" - "strings" - "time" -) - -/** -用于用户code的缓存处理 -使用set做统计 -*/ -type UserCode struct { - Code string - ID uint -} - -const ( - UserCodeListName = "UserCode" - InviteCodeSetPrefix = "InvCode" // 邀请的集合名称前缀 - IntroCodeSetPrefix = "IntroCode" // 推荐的集合名称前缀 - UpgradeCodeUnuse = 1 - UpgradeCodeUsed = 2 - SystemerIntroUserId = 0 // 系统分发的升级券用此表示user id - AllInviteCodeSetForCal = "AllInviteCodeSet" - AllIntroCodeSetForCal = "AllIntroCodeSet" -) - -func NewUserCode(code string, id uint) UserCode { - return UserCode{ - ID: id, - Code: code, - } -} - -// ProducerCode 生产者, 将带消费的数据放入到队列中 -func (uc *UserCode) ProducerCode() (err error) { - //str := strings.Join([]string{strconv.Itoa(int(uc.ID)), uc.Code}, ",") //将下级id16进制,上级的code,放到redis里面 - //_, err = dbc.Rds.RPush(UserCodeListName, str).Result() - return -} - -// ConsumerCode 消费者 -func (uc *UserCode) ConsumerCode() (err error) { - //log.Println("开始消费") - // 返回一个slice 【0】 -》 key 【1】 -》 取出来的值 - for { - if strSlice, err := dbc.Rds.BLPop(30*time.Second, UserCodeListName).Result(); err != nil { - if err != redis.Nil { - err = nil - } - //log.Println("结束消费") - return err - } else { - // 消费数据 - idCode := strings.Split(strSlice[1], ",") - codeType := comFunc.JudgeInvitOrIntro(idCode[1]) // 判断上级的推荐码的长度 - tmpId, _ := strconv.Atoi(idCode[0]) //转10进制,下级的id - uc.Code = idCode[1] //上级推荐码 - uc.ID = uint(tmpId) //下级的id - if codeType == "Invit" { //6位 - if err := uc.InviteNumCache(); err != nil { - log.Println(err) - } - } else if codeType == "Intro" { //8位 - if err := uc.IntroNumCache(); err != nil { - log.Println(err) - } - } - //log.Println("结束消费") - } - } -} - -// InviteNumCache 缓存 邀请人数 -func (uc *UserCode) InviteNumCache() error { - // 1、落盘 - //InviterUser, err := baseCode.ToInt(uc.Code) //这个是上级id, - //if err != nil { - // log.Println("[panic]反推userid错误", err) - //} - - //这边要根据数据库来获取 - var userInfo user.Information - err := dbc.DB.First(&userInfo, "invitation_no=?", uc.Code).Error - if err != nil { - log.Println("[panic]反推userid错误", err) - } - InviterUser := userInfo.ID - - err = dbc.DB.Create(&user.InviteHistory{ - InviterUserID: uint(InviterUser), - InviterCode: uc.Code, - UserId: uc.ID, - }).Error - if err != nil { - return err - } - - // 2、进缓存的set, 为之后计算绩效作准备 - _, err = dbc.Rds.SAdd(InviteCodeSetPrefix+uc.Code, uc.ID).Result() - if err != nil { - log.Println("introCode set错误:", err) - return err - } - _, err = dbc.Rds.SAdd(AllInviteCodeSetForCal, uc.Code).Result() - return err -} - -func GetInviteNumFromCache(code string) (num int64) { - num, _ = dbc.Rds.SCard(InviteCodeSetPrefix + code).Result() - return -} - -// 缓存 推荐人数 -func (uc *UserCode) IntroNumCache() error { - // 推荐之后有 升级码 和 保级码 - // 1、落盘 - tx := dbc.DB.Begin() - genCode := comFunc.SerializeMd5(strconv.Itoa(int(uc.ID)), 16) - upCode := comFunc.SerializeMd5(strconv.Itoa(int(uc.ID)+'a'), 16) - //保级码 - err := tx.Create(&user.IntroHistory{ - IntroCode: uc.Code, - UserId: uc.ID, - KeepCode: genCode[0:6], - UpCodeUsed: UpgradeCodeUnuse, - }).Error - if err != nil { - tx.Rollback() - return err - } - // 升级码 - err = tx.Create(&user.IntroHistory{ - IntroCode: uc.Code, - UserId: uc.ID, - UpgradeCode: upCode[0:6], - UpCodeUsed: UpgradeCodeUnuse, - }).Error - if err != nil { - tx.Rollback() - return err - } - - //获取下级的昵称 - var userInfo user.Information - tx.First(&userInfo, "id=?", uc.ID) - - //获取上级id - var userTree user.Tree - tx.First(&userTree, "depth=1 and user_id=?", uc.ID) - - //为该用户插入通知 - var userNotice = &user.Notice{ - Type: 1, - UserID: userTree.RootID, - Content: "您成功推荐了" + userInfo.Nickname + ",恭喜获得一张升级卡和保级卡", - CreatTime: formatime.NewSecondNow(), - } - tx.Create(userNotice) - - tx.Commit() - - // 2、进缓存的set, 为之后计算绩效作准备 - _, err = dbc.Rds.SAdd(IntroCodeSetPrefix+uc.Code, uc.ID).Result() - if err != nil { - log.Println("introCode set错误:", err) - return err - } - _, err = dbc.Rds.SAdd(AllIntroCodeSetForCal, uc.Code).Result() - return err -} diff --git a/internal/cron/task.go b/internal/cron/task.go index b80ff35..6853ccf 100644 --- a/internal/cron/task.go +++ b/internal/cron/task.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "git.oa00.com/go/mysql" - "github.com/go-redis/redis" "github.com/golangkit/formatime" "github.com/jinzhu/gorm" "github.com/shopspring/decimal" @@ -13,6 +12,7 @@ import ( "log" "recook/configs" "recook/internal/api/manage/gys/logic" + morder "recook/internal/api/manage/order" order3 "recook/internal/api/mobile/order" "recook/internal/cache" "recook/internal/dbc" @@ -25,7 +25,7 @@ import ( "recook/internal/v2/lib/jcook" "recook/internal/v2/lib/nuonuo" after2 "recook/internal/v2/logic/manage/after" - goods3 "recook/internal/v2/logic/manage/goods" + "recook/internal/v2/logic/manage/message" order2 "recook/internal/v2/logic/manage/order" "recook/internal/v2/model/recook/after" goods2 "recook/internal/v2/model/recook/goods" @@ -38,18 +38,25 @@ import ( "time" ) -// 定时任务 +// Task 定时任务 func Task() { go superPassword() go flushNewerTeHuiIDSet() - go UserCodeConsumer() go NuoNuoTimeTask() go NoticeDelete() - go UpdateGysPurchase() if configs.IsProductionEnv() { go TaskMq() } + //消息中心发送消息 + go message.SendMessage() + //供应商,商品,品牌资质,临期预警 + //go message.QualificationOnSchedule() + //每小时标记 发货超时 + go message.DeliveryTimeOut() + go order3.PlanMonitorTradeSucOrderTask() + go order3.PlanMonitorExpireOrderTask() + go morder.AfterNotToDoTwo() } func TaskMq() { @@ -58,7 +65,6 @@ func TaskMq() { go orderCreate() go OrderPay() go OrderStockOut() - //go OrderFinished() go OrderCancel() } @@ -721,24 +727,6 @@ func flushNewerTeHuiIDSet() { } } -// UserCodeConsumer 定时消费数据 -func UserCodeConsumer() { - uc := cache.UserCode{} - t1 := time.Tick(60 * time.Second) - for { - select { - case <-t1: - if err := uc.ConsumerCode(); err != nil { - if err != redis.Nil { - log.Println("uPanic: error ", err) - } - } - default: - time.Sleep(time.Second) - } - } -} - // SendEmailList 发送邮件队列 func SendEmailList() { //log.Println("开始邮件任务..............") @@ -775,15 +763,3 @@ func SendEmailList() { } }() } -func UpdateGysPurchase() { - for { - select { - case <-time.After(1 * time.Minute): - fmt.Println("开启供应商供货价更新") - err := goods3.UpdatePurchasePrice() - if err != nil { - log.Println(err.Error()) - } - } - } -} diff --git a/internal/v2/logic/manage/message/messageLogic.go b/internal/v2/logic/manage/message/messageLogic.go index bafe89b..20bfdde 100644 --- a/internal/v2/logic/manage/message/messageLogic.go +++ b/internal/v2/logic/manage/message/messageLogic.go @@ -642,7 +642,7 @@ func (l *messageLogic) SearchGys(p ShowRE) (gysVo []GysRestVo, tol int64) { } -//定时发送系统消息 +// SendMessage 定时发送系统消息 func SendMessage() { for { select { diff --git a/main.go b/main.go index e8b927c..228b809 100644 --- a/main.go +++ b/main.go @@ -1,23 +1,21 @@ package main import ( + "context" "log" - "net" "net/http" "os" - "path/filepath" + "os/signal" "recook/configs" "recook/internal/api/manage" - morder "recook/internal/api/manage/order" "recook/internal/api/mobile" _ "recook/internal/api/mobile/bill" - "recook/internal/api/mobile/order" "recook/internal/api/store" "recook/internal/api/vend" "recook/internal/cron" "recook/internal/dbc" "recook/internal/mq" - "recook/internal/v2/logic/manage/message" + "syscall" "time" "github.com/gin-gonic/gin" @@ -82,7 +80,6 @@ func main() { WriteTimeout: 10 * time.Second, } - // h5的路由处理,现在直接拿mobile来用 h5Server := &http.Server{ Addr: ":8084", Handler: mobile.Service(), @@ -106,45 +103,29 @@ func main() { return storeServer.ListenAndServe() }) - g.Go(func() error { - log.Println("[h5 https] 已启动") - ln, err := net.Listen("tcp4", h5Server.Addr) - if err != nil { - log.Println("[h5 https] err:", err) - return err + idleConnClosed := make(chan struct{}) + go func() { + sigint := make(chan os.Signal, 1) + signal.Notify(sigint, syscall.SIGINT, syscall.SIGTERM) + <-sigint + if err := manageServer.Shutdown(context.Background()); err != nil { + log.Printf("HTTP server Shutdown: %v", err) } - - dir, _ := os.Executable() - exPath := filepath.Dir(dir) - if configs.IsProductionEnv() { - return h5Server.ServeTLS(ln.(*net.TCPListener), exPath+`/./credentials/h5api/h5api.reecook.cn_chain.crt`, - exPath+`/./credentials/h5api/h5api.reecook.cn_key.key`) - } else { - return h5Server.ServeTLS(ln.(*net.TCPListener), exPath+`/./credentials/testh5api/testh5api.reecook.cn_chain.crt`, - exPath+`/./credentials/testh5api/testh5api.reecook.cn_key.key`) + if err := appServer.Shutdown(context.Background()); err != nil { + log.Printf("HTTP server Shutdown: %v", err) } - }) - - go order.PlanMonitorTradeSucOrderTask() - go order.PlanMonitorExpireOrderTask() - go order.PlanPartnerSalesMonthStat() - - go morder.AfterNotToDoTwo() - - // 发送邮件任务 - if configs.IsProductionEnv() { - go cron.SendEmailList() - } - - { - //消息中心发送消息 - go message.SendMessage() - //供应商,商品,品牌资质,临期预警 - //go message.QualificationOnSchedule() - //每小时标记 发货超时 - go message.DeliveryTimeOut() + if err := vendServer.Shutdown(context.Background()); err != nil { + log.Printf("HTTP server Shutdown: %v", err) + } + if err := storeServer.Shutdown(context.Background()); err != nil { + log.Printf("HTTP server Shutdown: %v", err) + } + if err := h5Server.Shutdown(context.Background()); err != nil { + log.Printf("HTTP server Shutdown: %v", err) + } + close(idleConnClosed) + }() - } go func() { cron.Task() }() @@ -152,5 +133,4 @@ func main() { if err := g.Wait(); err != nil { log.Fatal(err) } - }