abiao лет назад: 5
Родитель
Сommit
7f3e2e0611

+ 2 - 0
go/gopath/src/fohow.com/apps/controllers/cron_controller/init.go

@@ -80,6 +80,8 @@ func exec(name string) {
 		threebUserRelation()
 		threebUserRelation()
 	case "register_wxuser": //修复数据--注册会员
 	case "register_wxuser": //修复数据--注册会员
 		registerWxUser()
 		registerWxUser()
+	case "cancel_order": //下单24h未支付改为已取消
+		OrderCancelAutomatically()
 	default:
 	default:
 		beego.BeeLogger.Error("Didn't get task wity name:[%s]", name)
 		beego.BeeLogger.Error("Didn't get task wity name:[%s]", name)
 	}
 	}

+ 48 - 0
go/gopath/src/fohow.com/apps/controllers/cron_controller/order_receive_automatically.go

@@ -1,10 +1,14 @@
 package cron_controller
 package cron_controller
 
 
 import (
 import (
+	"fmt"
+	"fohow.com/apps/helpers"
+	"github.com/go-redis/redis"
 	"time"
 	"time"
 
 
 	"github.com/astaxie/beego"
 	"github.com/astaxie/beego"
 
 
+	"fohow.com/apps/models/balance_model"
 	"fohow.com/apps/models/order_model"
 	"fohow.com/apps/models/order_model"
 )
 )
 
 
@@ -46,3 +50,47 @@ func OrderCompleteDispatchTime(isUpdateTime bool) {
 	}
 	}
 
 
 }
 }
+
+//下单超24h未支付,自动取消订单
+func OrderCancelAutomatically() {
+	payTime, err := beego.AppConfig.Int("PayTime")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	key := helpers.GetOrderCancelList()
+	list, _ := client.LRange(key, -1000, -1).Result()
+	for _, orderId := range list {
+
+		order := order_model.GetOrderById(orderId)
+		if order == nil || order.PaiedAt > 0 {
+			helpers.ThrowOutRedisList(key, orderId)
+			continue
+		}
+		//如果下单时间超过一天,则取消订单
+		if order.Status == order_model.STATUS_UNPAY && order.CreatedAt.Unix()+int64(payTime) < time.Now().Unix() {
+			if order.CouponPrice > 0 {
+				//退款至代金券账户
+				source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+				remark := fmt.Sprintf("取消订单退款")
+				new(balance_model.Balance).Create(order.WxUserId, order.UserId, order.CouponPrice, source, orderId, remark)
+			}
+			order.Status = order_model.STATUS_CLOSED
+			order.Save()
+			helpers.ThrowOutRedisList(key, orderId)
+		}
+	}
+	return
+}

+ 18 - 1
go/gopath/src/fohow.com/apps/controllers/order_controller/order_controller.go

@@ -1,6 +1,9 @@
 package order_controller
 package order_controller
 
 
 import (
 import (
+	"fmt"
+	"fohow.com/apps/helpers"
+
 	// "fmt"
 	// "fmt"
 	"strconv"
 	"strconv"
 	// "time"
 	// "time"
@@ -10,6 +13,7 @@ import (
 	"fohow.com/apps"
 	"fohow.com/apps"
 	// "fohow.com/apps/controllers/user_controller"
 	// "fohow.com/apps/controllers/user_controller"
 	// "fohow.com/apps/models/activity_model"
 	// "fohow.com/apps/models/activity_model"
+	"fohow.com/apps/models/balance_model"
 	"fohow.com/apps/models/merchant_model"
 	"fohow.com/apps/models/merchant_model"
 	"fohow.com/apps/models/order_model"
 	"fohow.com/apps/models/order_model"
 	"fohow.com/apps/models/product_model"
 	"fohow.com/apps/models/product_model"
@@ -90,7 +94,9 @@ func (self *OrderController) Create() {
 	//创建订单明细
 	//创建订单明细
 	go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.Price, product.RoboBalancePrice, product.Name,
 	go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.Price, product.RoboBalancePrice, product.Name,
 		sizeName, colorName, count)
 		sizeName, colorName, count)
-
+	//未支付订单加入取消队列
+	cancelKey := helpers.GetOrderCancelList()
+	helpers.ThrowInRedisList(cancelKey, order.OrderId)
 	type Order struct {
 	type Order struct {
 		OrderId string `json:"order_id"`
 		OrderId string `json:"order_id"`
 	}
 	}
@@ -180,6 +186,9 @@ func (self *OrderController) MultipleCreate() {
 	order.Freight = freight
 	order.Freight = freight
 	order.Save()
 	order.Save()
 	go ClearCart(order.UserId, order.OrderId)
 	go ClearCart(order.UserId, order.OrderId)
+	//未支付订单加入取消队列
+	cancelKey := helpers.GetOrderCancelList()
+	helpers.ThrowInRedisList(cancelKey, order.OrderId)
 	type Order struct {
 	type Order struct {
 		OrderId string `json:"order_id"`
 		OrderId string `json:"order_id"`
 	}
 	}
@@ -339,11 +348,19 @@ func (self *OrderController) Operate() {
 		o.ReceiveTime = time.Now()
 		o.ReceiveTime = time.Now()
 	} else if operate == order_model.OPERATE_CANCEL && o.Status == order_model.STATUS_UNPAY {
 	} else if operate == order_model.OPERATE_CANCEL && o.Status == order_model.STATUS_UNPAY {
 		o.Status = order_model.STATUS_CLOSED
 		o.Status = order_model.STATUS_CLOSED
+
 	}
 	}
 
 
 	if !o.Save() {
 	if !o.Save() {
 		beego.BeeLogger.Error("wx_user[%d] complete order[%s] fail", wxUId, oId)
 		beego.BeeLogger.Error("wx_user[%d] complete order[%s] fail", wxUId, oId)
 	}
 	}
+
+	if operate == order_model.OPERATE_CANCEL && o.Status == order_model.STATUS_UNPAY && o.CouponPrice > 0 {
+		//退款至代金券账户
+		source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+		remark := fmt.Sprintf("取消订单退款")
+		new(balance_model.Balance).Create(o.WxUserId, o.UserId, o.CouponPrice, source, o.OrderId, remark)
+	}
 	//已确认收货的订单、发放代销金给卖方
 	//已确认收货的订单、发放代销金给卖方
 	//if o.Status == order_model.STATUS_COMPLETE && o.OrderType == order_model.ORDER_TYPE_SALE {
 	//if o.Status == order_model.STATUS_COMPLETE && o.OrderType == order_model.ORDER_TYPE_SALE {
 	//helpers.SendBalanceWhileSaleOrderCompleteHandler(o)
 	//helpers.SendBalanceWhileSaleOrderCompleteHandler(o)

+ 5 - 0
go/gopath/src/fohow.com/apps/controllers/pay_controller/after_pay_controller.go

@@ -7,6 +7,8 @@ import (
 	// "github.com/astaxie/beego"
 	// "github.com/astaxie/beego"
 
 
 	"fohow.com/apps"
 	"fohow.com/apps"
+	"fohow.com/apps/helpers"
+
 	// "fohow.com/apps/models/balance_model"
 	// "fohow.com/apps/models/balance_model"
 	// "fohow.com/apps/models/project_join_model"
 	// "fohow.com/apps/models/project_join_model"
 	// "fohow.com/apps/models/project_model"
 	// "fohow.com/apps/models/project_model"
@@ -319,6 +321,9 @@ func (self *PayController) wxPayExchangeAsync() {
 		product := product_model.GetProductById(productId, false)
 		product := product_model.GetProductById(productId, false)
 		go order_model.SendCreate(order.OrderId, order.Id, productId, product.Price, product.Price, product.Name, int64(1))
 		go order_model.SendCreate(order.OrderId, order.Id, productId, product.Price, product.Price, product.Name, int64(1))
 	}
 	}
+	//已支付订单移除队列
+	cancelKey := helpers.GetOrderCancelList()
+	helpers.ThrowOutRedisList(cancelKey, order.OrderId)
 	//更新商品售量
 	//更新商品售量
 	go UpdatePdSaleNums(order)
 	go UpdatePdSaleNums(order)
 	notifyResponse["return_code"] = wx_mp.PAY_SUCCESS
 	notifyResponse["return_code"] = wx_mp.PAY_SUCCESS

+ 11 - 9
go/gopath/src/fohow.com/apps/controllers/tool_controller/express_controller.go

@@ -6,13 +6,12 @@ import (
 	"encoding/json"
 	"encoding/json"
 	"fmt"
 	"fmt"
 	"fohow.com/apps"
 	"fohow.com/apps"
+	"fohow.com/apps/helpers"
 	"fohow.com/apps/models/express_model"
 	"fohow.com/apps/models/express_model"
-	"fohow.com/cache"
 	"io/ioutil"
 	"io/ioutil"
 	"net/http"
 	"net/http"
 	"net/url"
 	"net/url"
 	"strings"
 	"strings"
-	"time"
 )
 )
 
 
 func (self *ToolController) GetExpressCompany() {
 func (self *ToolController) GetExpressCompany() {
@@ -91,20 +90,23 @@ func (self *ToolController) GetExpressInfo() {
 	param.Set("key", express_model.JUHE_KEY) //应用APPKEY(应用详细页查询)
 	param.Set("key", express_model.JUHE_KEY) //应用APPKEY(应用详细页查询)
 	param.Set("dtype", "json")               //返回数据的格式,xml或json,默认json
 	param.Set("dtype", "json")               //返回数据的格式,xml或json,默认json
 	var netReturn map[string]interface{}
 	var netReturn map[string]interface{}
-	//将数据存入cache
-	k := fmt.Sprintf("express.GetExpressInfo(%s)", expressNo)
-	ret, ok := cache.Cache.Get(k).(*Ret)
-	if !ok {
-		ret = &Ret{}
+	ret := &Ret{}
+	//将数据存入 redis
+	key := fmt.Sprintf("express.GetExpressInfo(%s)", expressNo)
+	ok, retStr := helpers.GetRedisValue(key)
+	if ok {
+		_ := json.Unmarshal([]byte(retStr), &ret)
+	} else {
 		//发送请求
 		//发送请求
 		data, err := Get(juheURL, param)
 		data, err := Get(juheURL, param)
 		if err != nil {
 		if err != nil {
 			fmt.Errorf("请求失败,错误信息:\r\n%v", err)
 			fmt.Errorf("请求失败,错误信息:\r\n%v", err)
 		} else {
 		} else {
-			json.Unmarshal(data, &netReturn)
+			helpers.SetRedisValue(key, string(data), 90)
+			_ := json.Unmarshal(data, &netReturn)
 		}
 		}
 		ret.Resp = netReturn
 		ret.Resp = netReturn
-		cache.Cache.Put(k, ret, 90*time.Minute)
+		//cache.Cache.Put(k, ret, 90*time.Minute)
 	}
 	}
 	self.Data["json"] = ret
 	self.Data["json"] = ret
 	self.ServeJSON()
 	self.ServeJSON()

+ 113 - 0
go/gopath/src/fohow.com/apps/helpers/redis_helper.go

@@ -0,0 +1,113 @@
+package helpers
+
+import (
+	"fmt"
+	"github.com/astaxie/beego"
+	"github.com/go-redis/redis"
+	"time"
+)
+
+//保存keyValue
+func SetRedisValue(key, value string, durTime int) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	var t time.Duration
+	if durTime == 90 {
+		t = 90 * time.Minute
+	}
+	client.Set(key, value, t) //忽略错误
+	return
+}
+
+//获取keyValue
+func GetRedisValue(key string) (bool, string) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return false, ""
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return false, ""
+	}
+	str := client.Get(key).String()
+	return true, str
+}
+
+//保存redis队列
+func ThrowInRedisList(key, value string) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client.LPush(key, value) //rpush则在尾部插入
+	return
+}
+
+//从redis队列剔除
+func ThrowOutRedisList(key, value string) {
+	db, err := beego.AppConfig.Int("AliRedisDb")
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client := redis.NewClient(&redis.Options{
+		Addr:     beego.AppConfig.String("AliRedisHost"),
+		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
+		DB:       db,                                    //使用默认数据库
+	})
+	beego.BeeLogger.Info("Connect redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
+	defer client.Close() //最后关闭
+	_, err = client.Ping().Result()
+	if err != nil {
+		beego.BeeLogger.Error("%s", err)
+		return
+	}
+	client.LRem(key, 0, value)
+	return
+}
+
+func GetKeyByOrderId(orderId string) string {
+	return fmt.Sprintf("mall:order:info:%s", orderId)
+}
+
+//所有未支付普通订单加入队列,用作倒计到时取消
+func GetOrderCancelList() string {
+	return fmt.Sprintf("mall:cancelorder")
+}

+ 15 - 0
go/gopath/src/fohow.com/conf/app.conf

@@ -64,6 +64,11 @@ MysqlMaster = root:fohow123!@#@tcp(127.0.0.1:3306)/test_fohow?charset=utf8&parse
 #WkhtmltoimgBinPath = "C:/Program Files/wkhtmltopdf/bin/wkhtmltoimage.exe"
 #WkhtmltoimgBinPath = "C:/Program Files/wkhtmltopdf/bin/wkhtmltoimage.exe"
 WkhtmltoimgBinPath = /opt/software/wkhtmltox/bin/wkhtmltoimage
 WkhtmltoimgBinPath = /opt/software/wkhtmltox/bin/wkhtmltoimage
 
 
+## Redis配置信息
+AliRedisHost = "r-wz9dtt12y12ns2b97gpd.redis.rds.aliyuncs.com:6379"
+AliRedisPwd = "Fohow123!@#"
+AliRedisDb = 0
+
 SessionName = "fohow_sid"
 SessionName = "fohow_sid"
 SessionDomain = ".hiwavo.com"
 SessionDomain = ".hiwavo.com"
 SessionHashKey = "todayisagoodday20200519"
 SessionHashKey = "todayisagoodday20200519"
@@ -95,6 +100,8 @@ CheckIsRegistD5cKey = "1234567890123456"
 # 一键绑定微信使用的号码
 # 一键绑定微信使用的号码
 BindingWxPhoneKey = "1234567890123456"
 BindingWxPhoneKey = "1234567890123456"
 
 
+# 支付时长
+PayTime = 10800
 
 
 #######################################################################
 #######################################################################
 [prod]
 [prod]
@@ -149,6 +156,12 @@ AliSmsAccessSecret = "jTjeHIaZ6cei0ZOfmuSxQKdlRRlxh7"
 #MysqlMaster = root:Ud56Ur&fad@tcp(127.0.0.1:3306)/fohow_org?charset=utf8&parseTime=true
 #MysqlMaster = root:Ud56Ur&fad@tcp(127.0.0.1:3306)/fohow_org?charset=utf8&parseTime=true
 MysqlMaster = vx99mall:fohow123!@#@tcp(rm-wz9pd3e23k8d32t99.mysql.rds.aliyuncs.com:3306)/fohow_org?charset=utf8&parseTime=true
 MysqlMaster = vx99mall:fohow123!@#@tcp(rm-wz9pd3e23k8d32t99.mysql.rds.aliyuncs.com:3306)/fohow_org?charset=utf8&parseTime=true
 
 
+## Redis配置信息
+AliRedisHost = "r-wz9dtt12y12ns2b97g.redis.rds.aliyuncs.com:6379"
+AliRedisPwd = "Fohow123!@#"
+AliRedisDb = 2
+
+
 
 
 #WkhtmltoimgBinPath = "C:/Program Files/wkhtmltopdf/bin/wkhtmltoimage.exe"
 #WkhtmltoimgBinPath = "C:/Program Files/wkhtmltopdf/bin/wkhtmltoimage.exe"
 WkhtmltoimgBinPath = /opt/software/wkhtmltox/bin/wkhtmltoimage
 WkhtmltoimgBinPath = /opt/software/wkhtmltox/bin/wkhtmltoimage
@@ -184,6 +197,8 @@ CheckIsRegistD5cKey = "0f9412b6dz7be0cf"
 # 一键绑定微信使用的号码
 # 一键绑定微信使用的号码
 BindingWxPhoneKey = "fd85930e4941d780"
 BindingWxPhoneKey = "fd85930e4941d780"
 
 
+# 支付时长
+PayTime = 86400
 
 
 #微信支付、企业付款证书
 #微信支付、企业付款证书
 #小程序商户号证书
 #小程序商户号证书