fix: shutdown

master
howell 4 years ago
parent bcb099809c
commit 090ac21022

@ -960,9 +960,7 @@ func AfterNotToDoTwo() {
"72小时未填写单号系统自动关闭",
}
UpdateNotExp(p, v)
}
}
}
}

@ -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())
// }
// }
//}
}

@ -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)

@ -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
}

@ -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())
}
}
}
}

@ -642,7 +642,7 @@ func (l *messageLogic) SearchGys(p ShowRE) (gysVo []GysRestVo, tol int64) {
}
//定时发送系统消息
// SendMessage 定时发送系统消息
func SendMessage() {
for {
select {

@ -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)
}
}

Loading…
Cancel
Save