Переглянути джерело

Merge branch 'develop'

* develop:
  change fohow wxpay mechant id
  debug sign error
  cent sale add
  add order pay way cent
  add order pay way cent
  add order pay way cent
  add order pay way cent
  add inviter first send cent
  debug cent function
  debug cent function
  debug cent function
  debug cent function
  add cent function
  add cent function
  add cent function
  add cent function
  add cent function
  add cent function
  add cent function
  optimize lib redis
abiao 5 роки тому
батько
коміт
f5f84b3c87

+ 265 - 0
go/gopath/src/fohow.com/apps/controllers/cent_controller/cent_controller.go

@@ -0,0 +1,265 @@
+package cent_controller
+
+import (
+	"fmt"
+	"fohow.com/libs/lib_redis"
+	"github.com/astaxie/beego"
+	"github.com/go-redis/redis"
+
+	// "crypto/md5"
+	// "encoding/hex"
+	"strconv"
+	"time"
+
+	// "github.com/astaxie/beego"
+	// "github.com/astaxie/beego/context"
+
+	"fohow.com/apps"
+	// 	// "fohow.com/apps/controllers/user_controller"
+	// 	"fohow.com/apps/models/activity_model"
+	// 	"fohow.com/apps/models/address_model"
+	"fohow.com/apps/models/cent_model"
+	"fohow.com/apps/models/user_model"
+)
+
+type CountDownSignDaily struct {
+	TodaySignNum int64 `json:"today_sign_num"`
+	LastTime     int64 `json:"last_time"`
+}
+
+type CountDownCentAward struct {
+	Oneday     int64 `json:"one_day"`
+	Twoday     int64 `json:"two_day"`
+	Threeday   int64 `json:"three_day"`
+	Fourday    int64 `json:"four_day"`
+	Fiveday    int64 `json:"five_day"`
+	Sixday     int64 `json:"six_day"`
+	Sevenday   int64 `json:"seven_day"`
+	Firstlogin int64 `json:"first_login"`
+	Newman     int64 `json:"new_man"`
+}
+
+//积分和积分余额
+func (self *CentController) GetCentInfo() {
+	type CentInfo struct {
+		Total int64 `orm:"-" json:"total"` //余额,单位分
+	}
+	//user := self.GetCurrentUser(true)
+	wxUId := self.GetCurrentWxUserId()
+	//wxUId := int64(1781)
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+	info := new(CentInfo)
+	info.Total = cent_model.GetCentTotalBalance(wxUId)
+	self.Data["json"] = info
+	self.ServeJSON()
+}
+
+//积分变动列表
+func (self *CentController) GetCentList() {
+	page, _ := self.GetInt64("page", 1)
+	perPage, _ := self.GetInt64("per_page", 20)
+	if perPage <= 0 || perPage > 100 {
+		perPage = 20
+	}
+	cache, _ := self.GetBool("cache", false)
+
+	//user := self.GetCurrentUser(cache)
+	wxUId := self.GetCurrentWxUserId()
+	//wxUId := int64(1781)
+	list := cent_model.GetCentBalanceListByWxUId(wxUId, page, perPage, cache)
+	count := cent_model.GetCentBalanceCountByWxUId(wxUId)
+	type CentInfo struct {
+		CentList  []*cent_model.CentBalance `orm:"-" json:"balance_list"`
+		CentCount int64                     `orm:"-" json:"balance_count"`
+	}
+	for _, item := range list {
+		item.SourceName = item.GetSourceName()
+		item.CTime = item.CreatedAt.Unix()
+	}
+
+	self.Data["json"] = &CentInfo{CentList: list, CentCount: count}
+	self.ServeJSON()
+}
+
+//资金详情
+func (self *CentController) GetCentDetail() {
+	_id := self.Ctx.Input.Param(":id")
+	id, _ := strconv.ParseInt(_id, 10, 64)
+	//uId := self.GetCurrentUserId()
+	wxUId := self.GetCurrentWxUserId()
+	//wxUId := int64(1781)
+	item := cent_model.GetCentById(id)
+	if item == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	if item.WxUId != wxUId {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	item.CTime = item.CreatedAt.Unix()
+	item.SourceName = item.GetSourceName()
+	self.Data["json"] = item
+	self.ServeJSON()
+}
+
+//获得七日签到任务状态
+func (self *CentController) GetSignStatus() {
+	wxUId := self.GetCurrentWxUserId()
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+	now := time.Now()
+	yesterday := time.Now().Add(-24 * time.Hour)
+	result := &CountDownSignDaily{}
+	//每日签到任务
+	var everydayOk = true
+	var everydayNo int64 = 1
+	preKey := cent_model.PRE_KEY_DAILY
+	key := fmt.Sprintf("%s_%d_%d%02d%02d", preKey, wxUser.Id, now.Year(), now.Month(), now.Day())
+	errToday := lib_redis.GetFromJSON(result, key) //判断今天签了没签
+	if errToday != redis.Nil && errToday != nil {
+		beego.BeeLogger.Warn("GetSignStatus() TodayEveryday in redisClient  err, err:%s", errToday)
+		self.ReturnError(403, apps.RedisGetError, "", nil)
+	}
+	if result.TodaySignNum > int64(0) {
+		everydayOk = false
+	}
+	yesterdayResult := &CountDownSignDaily{}
+	keyYesterday := fmt.Sprintf("%s_%d_%d%02d%02d", preKey, wxUser.Id, yesterday.Year(), yesterday.Month(), yesterday.Day())
+
+	errYesterday := lib_redis.GetFromJSON(yesterdayResult, keyYesterday) //判断今天签了没签
+	if errYesterday != redis.Nil && errYesterday != nil {
+		beego.BeeLogger.Warn("GetSignStatus() Yesterday in redisClient err, err:%s", errYesterday)
+		self.ReturnError(403, apps.RedisGetError, "", nil)
+	}
+	if yesterdayResult.TodaySignNum > int64(0) {
+		if yesterdayResult.TodaySignNum >= 7 { //昨天是第	七天,则今天计为第1天
+			everydayNo = 1
+		} else {
+			everydayNo = yesterdayResult.TodaySignNum + 1
+		}
+	}
+	type Ret struct {
+		TodayEveryday      bool               `json:"today_everyday_ok"`
+		TodayEverydayNo    int64              `json:"today_everyday_no"`
+		CountDownCentAward CountDownCentAward `json:"cent_award_conf"`
+	}
+	dataRet := &Ret{
+		TodayEveryday:   everydayOk,
+		TodayEverydayNo: everydayNo,
+	}
+	//获取赠送积分配置
+	oneDay := cent_model.GetCentAwardByCtype(cent_model.ONE_DAY, true)
+	if oneDay != nil {
+		dataRet.CountDownCentAward.Oneday = oneDay.Count
+	}
+	twoDay := cent_model.GetCentAwardByCtype(cent_model.TWO_DAY, true)
+	if twoDay != nil {
+		dataRet.CountDownCentAward.Twoday = twoDay.Count
+	}
+	threeDay := cent_model.GetCentAwardByCtype(cent_model.THREE_DAY, true)
+	if threeDay != nil {
+		dataRet.CountDownCentAward.Threeday = threeDay.Count
+	}
+	fourDay := cent_model.GetCentAwardByCtype(cent_model.FOUR_DAY, true)
+	if fourDay != nil {
+		dataRet.CountDownCentAward.Fourday = fourDay.Count
+	}
+	fiveDay := cent_model.GetCentAwardByCtype(cent_model.FIVE_DAY, true)
+	if fiveDay != nil {
+		dataRet.CountDownCentAward.Fiveday = fiveDay.Count
+	}
+	sixDay := cent_model.GetCentAwardByCtype(cent_model.SIX_DAY, true)
+	if sixDay != nil {
+		dataRet.CountDownCentAward.Sixday = sixDay.Count
+	}
+	sevenDay := cent_model.GetCentAwardByCtype(cent_model.SEVEN_DAY, true)
+	if sevenDay != nil {
+		dataRet.CountDownCentAward.Sevenday = sevenDay.Count
+	}
+	firstL := cent_model.GetCentAwardByCtype(cent_model.FIRST_LOGIN, true)
+	if firstL != nil {
+		dataRet.CountDownCentAward.Firstlogin = firstL.Count
+	}
+	newMan := cent_model.GetCentAwardByCtype(cent_model.NEW_MAN, true)
+	if newMan != nil {
+		dataRet.CountDownCentAward.Newman = newMan.Count
+	}
+	self.Data["json"] = dataRet
+	self.ServeJSON()
+}
+
+// 每日签到,领取积分
+func (self *CentController) SignEveryday() {
+
+	wxUId := self.GetCurrentWxUserId()
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+	now := time.Now()
+	lastTimeUnix := now.Unix() //记录最后一次领取时间
+	yesterday := time.Now().Add(-24 * time.Hour)
+
+	result := &CountDownSignDaily{}
+
+	preKey := cent_model.PRE_KEY_DAILY
+	key := fmt.Sprintf("%s_%d_%d%02d%02d", preKey, wxUser.Id, now.Year(), now.Month(), now.Day())
+	errToday := lib_redis.GetFromJSON(result, key) //判断今天签了没签
+
+	if errToday != redis.Nil && errToday != nil {
+		beego.BeeLogger.Warn("SignEveryday() in redisClient.Get(key).Result() err, err:%s", errToday)
+		self.ReturnError(403, apps.RedisGetError, "", nil)
+	}
+	beego.BeeLogger.Warn("Result()%v", result)
+	if result.TodaySignNum > 0 {
+		self.ReturnError(403, apps.DailySignRepeat, "", nil)
+	}
+	yesterdayResult := &CountDownSignDaily{}
+
+	num := int64(1)
+	keyYesterday := fmt.Sprintf("%s_%d_%d%02d%02d", preKey, wxUser.Id, yesterday.Year(), yesterday.Month(), yesterday.Day())
+	errYesterday := lib_redis.GetFromJSON(yesterdayResult, keyYesterday) //判断今天签了没签
+	if errYesterday != redis.Nil && errYesterday != nil {
+		beego.BeeLogger.Warn("SignEveryday() in redisClient.Get(key).Result() err, errYesterday:%s", errYesterday)
+		self.ReturnError(403, apps.RedisGetError, "", nil)
+	}
+	if yesterdayResult != nil {
+		if yesterdayResult.TodaySignNum >= 7 { //昨天是第五天,则今天计为第1天
+			num = 1
+		} else {
+			num = yesterdayResult.TodaySignNum + 1
+		}
+	}
+	type Ret struct {
+		TodaySignNum int64 `json:"today_sign_num"`
+		LastTime     int64 `json:"last_time"`
+	}
+
+	var dataRet *Ret
+	//领取积分
+	s := cent_model.GetDailySource(num) //积分类型
+	centAward := cent_model.GetCentAwardByCtype(s, true)
+	if centAward == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	count := centAward.Count
+	remark := fmt.Sprintf("每日签到(连续第%d天 领取:%d)", num, count)
+
+	//发放积分
+	c := new(cent_model.CentBalance).Create(wxUser.Id, count, s, s, remark)
+	if c != nil {
+		//标志进账
+		dataRet = &Ret{TodaySignNum: num, LastTime: lastTimeUnix}
+		err := lib_redis.SetJsonEx(key, dataRet, 7*24*60*60)
+		if err != nil {
+			beego.BeeLogger.Warn("SignEveryday() in redisClient.Set() err, err:%s", err)
+		}
+	}
+	self.Data["json"] = dataRet
+	self.ServeJSON()
+
+}

+ 32 - 0
go/gopath/src/fohow.com/apps/controllers/cent_controller/init.go

@@ -0,0 +1,32 @@
+package cent_controller
+
+import (
+	// "fmt"
+	// "os"
+	// "net/url"
+	// "strings"
+
+	// "github.com/astaxie/beego"
+	"github.com/astaxie/beego/context"
+	// "github.com/go-wkhtmltoimage"
+	// "github.com/skip2/go-qrcode"
+
+	"fohow.com/apps"
+)
+
+var (
+	//需要校验用户登录的Action
+	exceptCheckUserLoginAction   = []string{""}
+	exceptCheckWxUserLoginAction = []string{""}
+)
+
+type CentController struct {
+	apps.BaseController
+}
+
+func (self *CentController) Init(ctx *context.Context, controllerName, actionName string, app interface{}) {
+	// beego.BeeLogger.Info("invote controller Init func")
+	self.BaseController.Init(ctx, controllerName, actionName, app)
+	self.ExceptCheckUserLoginAction = exceptCheckUserLoginAction
+	self.ExceptCheckWxUserLoginAction = exceptCheckWxUserLoginAction
+}

+ 63 - 0
go/gopath/src/fohow.com/apps/controllers/order_controller/order_controller.go

@@ -26,6 +26,7 @@ var updateExpressLock sync.Mutex
 var createOrder sync.Mutex
 var MultreateOrder sync.Mutex
 var MultShopOrder sync.Mutex
+var MultCentOrder sync.Mutex
 
 //下单
 func (self *OrderController) Create() {
@@ -240,6 +241,68 @@ func (self *OrderController) MultShopCreate() {
 	self.ServeJSON()
 }
 
+//积分专区下单
+func (self *OrderController) MultCentCreate() {
+	MultCentOrder.Lock()
+	defer MultCentOrder.Unlock()
+	uId := self.GetCurrentUserId()
+	wxUId := self.GetCurrentWxUserId()
+	ids := self.GetString("ids")
+	nums := self.GetString("nums")
+	if len(nums) <= 0 || len(ids) <= 0 {
+		self.ReturnError(403, apps.NoCart, "", nil)
+	}
+	wxUser := user_model.GetWxUserByUserId(uId, false)
+	if wxUser == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	totalPrice := int64(0)
+	//创建订单
+	order := new(order_model.Order).CreateNew(wxUId, uId,
+		totalPrice, int64(0), order_model.ORDER_TYPE_CENT, order_model.SOURCE_XCX)
+	if order == nil {
+		self.ReturnError(403, apps.CreateOrderFail, "", nil)
+	}
+	c_arr := strings.Split(ids, ",")
+	c_nums := strings.Split(nums, ",")
+	for key, s_item := range c_arr {
+		pId, _ := strconv.ParseInt(s_item, 10, 64)
+		cNums := int64(1)
+		cNums, _ = strconv.ParseInt(c_nums[key], 10, 64)
+		product := product_model.GetProductById(pId, false)
+		if product == nil {
+			self.ReturnError(403, apps.NoExist, "", nil)
+		}
+		if product.Ptype != product_model.CENT_SALE {
+			self.ReturnError(403, apps.NoShopSale, "", nil)
+		}
+
+		//创建订单明细
+		totalPrice += product.Price * cNums
+		CreateOrderDetails(product, order, cNums)
+	}
+	freight := order_model.FREIGHT
+	if totalPrice < order_model.CENT_LIMIT {
+		self.ReturnError(403, []string{apps.OrderNotEnough[0], fmt.Sprintf("订单最低金额%d", order_model.CENT_LIMIT)}, "", nil)
+	}
+
+	if totalPrice < order_model.CENT_LIMIT || beego.AppConfig.String("RunMode") == "dev" {
+		freight = int64(0)
+	}
+	order.TotalPrice = totalPrice
+	order.Freight = freight
+	order.Save()
+
+	//未支付订单加入取消队列
+	cancelKey := lib_redis.GetOrderCancelList()
+	lib_redis.ThrowInRedisList(cancelKey, order.OrderId)
+	type Order struct {
+		OrderId string `json:"order_id"`
+	}
+	self.Data["json"] = &Order{OrderId: order.OrderId}
+	self.ServeJSON()
+}
+
 func ClearCart(userId int64, orderId string) {
 	orderDetails := order_model.GetAllDetailsOrderId(orderId, false)
 	for _, item := range orderDetails {

+ 7 - 1
go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_controller.go

@@ -49,7 +49,13 @@ func (self *PayController) Pay() {
 			self.ReturnError(403, apps.ParamsError, "", nil)
 		}
 	case EXCHANGE_TARGET: // 商品购买
-		self.payExchange(oId, payWay, tradPwd, returnUrl, source, useCoupon)
+		order := order_model.GetOrderById(oId, false)
+
+		if order != nil && order.OrderType != order_model.ORDER_TYPE_CENT {
+			self.payExchange(oId, payWay, tradPwd, returnUrl, source, useCoupon)
+		} else {
+			self.payCentExchange(oId, returnUrl, source)
+		}
 
 	case CASH_TARGET:
 		switch payWay {

+ 108 - 0
go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_exchange_controller.go

@@ -2,6 +2,7 @@ package pay_controller
 
 import (
 	"fmt"
+	"fohow.com/apps/models/cent_model"
 	"fohow.com/libs/lib_redis"
 
 	// "net/url"
@@ -242,6 +243,113 @@ func (self *PayController) payExchange(oId, payWay, tradPwd, returnUrl, source s
 	self.ServeJSON()
 }
 
+//支付积分订单
+func (self *PayController) payCentExchange(oId, returnUrl, source string) {
+	payOrder.Lock()
+	defer payOrder.Unlock()
+	var payUrl string
+	var payData map[string]string
+	wxUId := self.GetCurrentWxUserId()
+	//地址
+	addressId, _ := self.GetInt64("address_id")
+	address := address_model.GetUserAddressById(addressId)
+	if address == nil || address.WxUserId != wxUId {
+		self.ReturnError(403, apps.AddressNotMatch, "", nil)
+	}
+
+	if source != order_model.SOURCE_XCX && source != order_model.SOURCE_GZH {
+		self.ReturnError(403, apps.ParamsError, "", nil)
+	}
+	wxUser := user_model.GetWxUserById(wxUId, false)
+	if wxUser == nil {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+	//订单状态
+	order := order_model.GetOrderById(oId, false)
+	if order == nil || order.WxUserId != wxUId {
+		self.ReturnError(404, apps.OrderNotExist, "", nil)
+	}
+	if order.Status != order_model.STATUS_UNPAY {
+		self.ReturnError(403, apps.NotUnPay, "", nil)
+	}
+	SaleNumsMap := make(map[int64]int64)
+
+	//获取购物商品明细
+	buy_price_total := int64(0)
+	total_price := int64(0)
+	list := order_model.GetAllDetailsOrderId(order.OrderId, false)
+	for _, item := range list {
+		//商品状态
+		product := product_model.GetProductById(item.ProductId, false)
+		if product == nil {
+			self.ReturnError(403, []string{apps.ProductNotExist[0], fmt.Sprintf("%s产品不存在", product.Name)}, "", nil)
+		}
+		//商品下架
+		if product.Status == product_model.PRODUCT_STATUS_DOWN {
+			self.ReturnError(403, []string{apps.ProductOffSale[0], fmt.Sprintf("%s产品已经下架", product.Name)}, "", nil)
+		}
+		buy_price_total += product.BuyPrice * item.Count
+		total_price += product.Price * item.Count
+		SaleNumsMap[product.Id] = item.Count
+	}
+
+	order.PayWay = order_model.PAY_WAY_CENT
+	order.Contact = address.Contact
+	order.Tel = address.Tel
+	order.Address = fmt.Sprintf("%s%s%s%s", address.Province, address.City, address.District, address.Address)
+	order.BuyPrice = buy_price_total
+	order.TotalPrice = total_price
+	//支付信息判断
+	//黑名单用户
+	curUser := user_model.GetUserById(wxUser.UserId, false)
+	if curUser != nil && curUser.IsBlackUser == 1 {
+		self.ReturnError(403, apps.NetworkBusy, "", nil)
+	}
+	//再次增加订单状态判断
+	if order.Status != order_model.STATUS_UNPAY {
+		self.ReturnError(403, apps.NotUnPay, "", nil)
+	}
+	//直接抵扣积分,积分不够则报错
+	userLeftCent := cent_model.GetCentTotalBalance(wxUId)
+	tp := order.TotalPrice
+	freight := order_model.FREIGHT
+	if tp >= order_model.FREIGHT_LIMIT || beego.AppConfig.String("RunMode") == "dev" {
+		freight = int64(0)
+	}
+	tp += freight
+	if userLeftCent < tp {
+		self.ReturnError(403, apps.CentNotEnough, "", nil)
+	}
+	//扣除积分
+	if tp > 0 {
+		source := cent_model.EXCXHANGE_PRODUCT
+		remark := fmt.Sprintf("积分兑换商品")
+		new(cent_model.CentBalance).Create(wxUId, -tp, source, oId, remark)
+	}
+	order.CentPrice = tp
+
+	//更新订单状态
+	order.Status = order_model.STATUS_PROCESSING
+	order.PaiedAt = time.Now().Unix()
+	order.PaiedTime = time.Now()
+	order.PaiedPrice = 0
+	order.PayWay = pay_model.PAYWAY_CENT
+	order.Source = source
+	order.Save()
+
+	//已支付订单移除未支付队列
+	cancelKey := lib_redis.GetOrderCancelList()
+	lib_redis.ThrowOutRedisList(cancelKey, order.OrderId)
+	//更新已售数量
+	go order_model.UpdateSaleNums(SaleNumsMap)
+
+	payUrl, payData = fmt.Sprintf("%s?order_id=%s", returnUrl, order.OrderId), nil
+	result := PayUrl{NeedWx: false, PayUrl: payUrl, PayData: payData, OrderId: order.OrderId}
+	//self.Data["json"] = self.FormatResult([]interface{}{result})
+	self.Data["json"] = result
+	self.ServeJSON()
+}
+
 //用户支付成功,后给卖家所有管理员发下单通知
 func CreateOrderNotify(order *order_model.Order, product *product_model.Product) {
 	merchantUserList := merchant_model.GetMerchantUserRelationListByMerchantId(product.MerchantId, true)

+ 7 - 0
go/gopath/src/fohow.com/apps/controllers/permit_controller/permit_controller.go

@@ -54,6 +54,7 @@ func (self *PermitController) XcxAuthorize() {
 	channel, _ := self.GetInt64("channel", 0)
 	// beego.BeeLogger.Warn("XcxAuthorize userinfo: %s", params)
 	inviteId, _ := self.GetInt64("invite_id", 0)
+	first := false
 	beego.BeeLogger.Warn("XcxAuthorize inviteId: %d", inviteId)
 	type UserInfo struct {
 		NickName  string `json:"nickName"`  // 用户的昵称
@@ -121,6 +122,8 @@ func (self *PermitController) XcxAuthorize() {
 	if wxUser != nil {
 		wxUser.Openid = encryptedData.OpenId
 	} else {
+		//首次授权
+		first = true
 		introUserId := int64(1)
 		if inviteId == int64(0) {
 			inviteId = int64(1)
@@ -162,6 +165,10 @@ func (self *PermitController) XcxAuthorize() {
 	if wxUser != nil {
 		self.SetSession(apps.SessionWxUserKey, wxUser.Id)
 	}
+	//赠送积分
+	if first {
+		go helpers.SendCent(wxUser.Id, inviteId)
+	}
 	// 如果微信用户已绑定手机,则找出userId,并且赋值给session[userId]
 	if wxUser != nil && wxUser.UserId > 0 {
 		user := user_model.GetUserById(wxUser.UserId, false)

+ 3 - 13
go/gopath/src/fohow.com/apps/controllers/user_controller/user_controller.go

@@ -56,10 +56,9 @@ import (
 // 校验当前用户是否登录
 func (self *UserController) CheckLogin() {
 	type UserInfo struct {
-		UserId     int64 `json:"user_id"`
-		WxUserId   int64 `json:"wx_user_id"`
-		MerchantId int64 `json:"merchant_id"`
-		Rank       int64 `json:"rank"` //级别
+		UserId   int64 `json:"user_id"`
+		WxUserId int64 `json:"wx_user_id"`
+		Rank     int64 `json:"rank"` //级别
 	}
 	userInfo := new(UserInfo)
 	useCache, err := self.GetBool("cache", true)
@@ -75,15 +74,6 @@ func (self *UserController) CheckLogin() {
 		userInfo.WxUserId = wxUser.Id
 	}
 
-	// 商户信息, 如果不是商户,则返回 0
-	merchant_user_id := int64(0)
-	if curUser != nil {
-		merchant_user_id = curUser.Id
-	}
-	merchantUser := merchant_model.GetMerchantUserRelationByUserId(merchant_user_id, false) //一个商户对应多个用户
-	if merchantUser != nil {
-		userInfo.MerchantId = merchantUser.MerchantId
-	}
 	if wxUser != nil {
 		userInfo.Rank = wxUser.Rank
 	}

+ 44 - 0
go/gopath/src/fohow.com/apps/helpers/cent_helper.go

@@ -0,0 +1,44 @@
+package helpers
+
+import (
+	"fmt"
+	"github.com/astaxie/beego"
+
+	"fohow.com/apps/models/cent_model"
+	"fohow.com/apps/models/user_model"
+	// "st.com/libs/wx_mp"
+)
+
+//首次登录发放积分
+func SendCent(loginedWxUId, ivId int64) {
+	beego.BeeLogger.Warn("******* SendCent wxid:%d, ivId:%d", loginedWxUId, ivId)
+	// 不能设置自己为邀请人, 且没有下级
+	wxUser := user_model.GetWxUserById(loginedWxUId, false)
+	if wxUser != nil && wxUser.Id != ivId {
+		inviter := user_model.GetWxUserById(ivId, true)
+		if inviter == nil {
+			beego.BeeLogger.Error("wxUser SetInviter(%d) inviter not exsit", ivId)
+			return
+		}
+		//登录会员发放积分
+		s := cent_model.FIRST_LOGIN
+		centAward := cent_model.GetCentAwardByCtype(s, true)
+		if centAward == nil {
+			return
+		}
+		count := centAward.Count
+		remark := fmt.Sprintf("首次登录,赠送积分:%d", count)
+		c := new(cent_model.CentBalance).Create(wxUser.Id, count, s, s, remark)
+		if c != nil && ivId > 0 {
+			s := cent_model.NEW_MAN
+			centAward := cent_model.GetCentAwardByCtype(s, true)
+			if centAward == nil {
+				return
+			}
+			count := centAward.Count
+			remark := fmt.Sprintf("分享好友%s注册成功,赠送积分:%d", wxUser.Nickname, count)
+			new(cent_model.CentBalance).Create(inviter.Id, count, s, s, remark)
+		}
+		beego.BeeLogger.Info("Wxuser SendCent  wxUserId:%d, inviteId:%d", wxUser.Id, wxUser.InviteId)
+	}
+}

+ 7 - 1
go/gopath/src/fohow.com/apps/init.go

@@ -27,6 +27,10 @@ const (
 
 var (
 	// 共用
+	DailySignRepeat       = []string{"dailySignRepeat", "已经领取过啦"}
+	RedisError            = []string{"redisError", "redis初始化错误"}
+	RedisGetError         = []string{"redisGetError", "redisGet错误"}
+	RedisJsonError        = []string{"redisJsonError", "json转换错误"}
 	OrderRefundError      = []string{"orderRefundError", "退款失败"}
 	OtherSNotAllow        = []string{"othersNotAllow", "非店长无法在专区下单!"}
 	AlreadyShop           = []string{"alreadyShop", "您已经是店主,请勿重复申请"}
@@ -147,6 +151,7 @@ var (
 	DownloadError        = []string{"downloadError", "阿里云下载文件错误"}
 	ConvertToBase64Error = []string{"convertToBase64Error", "转base64错误"}
 	//资金账户相关
+	CentNotEnough                    = []string{"centNotEnough", "积分余额不足"}
 	BalanceNotExist                  = []string{"balanceNotExist", "资金明细不存在"}
 	BalanceNotEnough                 = []string{"balanceNotEnough", "余额不足"}
 	BalanceNotEnoughForCharge        = []string{"balanceNotEnoughForCharge", "可提现余额不足支付手续费,无法提现"}
@@ -189,7 +194,8 @@ var (
 	SeckillIsEnd    = []string{"seckillIsEnd", "秒杀活动已经结束"}
 	SeckillNotAllow = []string{"seckillNotAllow", "秒杀商品不允许加入购物车"}
 
-	OnlyNew = []string{"onlyNew", "仅限新人购买"}
+	OnlyNew        = []string{"onlyNew", "仅限新人购买"}
+	OrderNotEnough = []string{"orderNotEnough", "订单金额不满足"}
 )
 
 type BaseController struct {

+ 108 - 0
go/gopath/src/fohow.com/apps/models/cent_model/cent_award.go

@@ -0,0 +1,108 @@
+package cent_model
+
+import (
+	"fmt"
+	"fohow.com/cache"
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/orm"
+	"time"
+	// "fohow.com/libs/wx_mp"
+)
+
+const (
+	cent_awards_tablename = "cent_awards"
+	ONE_DAY               = "one_day" //签到第一天
+	ONE_DAY_NAME          = "签到第一天"
+	TWO_DAY               = "two_day"
+	TWO_DAY_NAME          = "签到第二天"
+	THREE_DAY             = "three_day"
+	THREE_DAY_NAME        = "签到第三天"
+	FOUR_DAY              = "four_day"
+	FOUR_DAY_NAME         = "签到第四天"
+	FIVE_DAY              = "five_day"
+	FIVE_DAY_NAME         = "签到第五天"
+	SIX_DAY               = "six_day"
+	SIX_DAY_NAME          = "签到第六天"
+	SEVEN_DAY             = "seven_day"
+	SEVEN_DAY_NAME        = "签到第七天"
+	FIRST_LOGIN           = "first_login"
+	FIRST_LOGIN_NAME      = "首次登录"
+	NEW_MAN               = "new_man"
+	NEW_MAN_NAME          = "新人注册"
+)
+
+type CentAward struct {
+	Id        int64     `orm:"column(id);pk"                                  json:"id"`     // int(11)
+	Count     int64     `orm:"column(count);null"                             json:"count"`  // int(11)
+	Type      string    `orm:"column(c_type);null"                            json:"c_type"` // varchar(20)
+	CreatedAt time.Time `orm:"column(created_at);auto_now_add;type(datetime)" json:"-"`      // datetime
+	CTime     int64     `orm:"-"                                              json:"ctime"`  // datetime
+	UpdatedAt time.Time `orm:"column(updated_at);auto_now;type(datetime)"     json:"-"`      // datetime
+}
+
+func (self *CentAward) TableName() string {
+	return cent_awards_tablename
+}
+
+//返回source名称
+func (self *CentAward) GetSourceName() string {
+	typeName := ""
+	switch self.Type {
+	case ONE_DAY:
+		typeName = ONE_DAY_NAME
+	case TWO_DAY:
+		typeName = TWO_DAY_NAME
+	case THREE_DAY:
+		typeName = THREE_DAY_NAME
+	case FOUR_DAY:
+		typeName = FOUR_DAY_NAME
+	case FIVE_DAY:
+		typeName = FIVE_DAY_NAME
+	case SIX_DAY:
+		typeName = SIX_DAY_NAME
+	case SEVEN_DAY:
+		typeName = SEVEN_DAY_NAME
+	case FIRST_LOGIN:
+		typeName = FIRST_LOGIN_NAME
+	case NEW_MAN:
+		typeName = NEW_MAN_NAME
+	}
+	return typeName
+}
+
+func GetCentAwardByCtype(ctype string, useCache bool) *CentAward {
+
+	k := fmt.Sprintf("cent_model.GetCentAwardByCtype[%s]", ctype)
+	if useCache {
+		if award, ok := cache.Cache.Get(k).(*CentAward); ok {
+			return award
+		}
+	}
+	item := &CentAward{}
+	if err := orm.NewOrm().QueryTable(item).Filter("c_type", ctype).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetCentAwardByCtype(%s), err=%s", ctype, err)
+		return nil
+	}
+	cache.Cache.Put(k, item, 15*time.Minute)
+	return item
+}
+
+// 连续第几天的积分对应数
+func GetDailySource(day int64) string {
+	source := ONE_DAY
+	if day == 2 {
+		source = TWO_DAY
+	} else if day == 3 {
+		source = THREE_DAY
+	} else if day == 4 {
+		source = FOUR_DAY
+	} else if day == 5 {
+		source = FIVE_DAY
+	} else if day == 6 {
+		source = SIX_DAY
+	} else if day >= 7 {
+		source = SEVEN_DAY
+	}
+	return source
+}

+ 232 - 0
go/gopath/src/fohow.com/apps/models/cent_model/cent_balance.go

@@ -0,0 +1,232 @@
+package cent_model
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/orm"
+
+	"fohow.com/cache"
+)
+
+const (
+	cent_balances_tablename = "cent_balances"
+
+	CENT_ONE_DAY           = "one_day" //签到第一天
+	CENT_ONE_DAY_NAME      = "签到第一天"
+	CENT_TWO_DAY           = "two_day"
+	CENT_TWO_DAY_NAME      = "签到第二天"
+	CENT_THREE_DAY         = "three_day"
+	CENT_THREE_DAY_NAME    = "签到第三天"
+	CENT_FOUR_DAY          = "four_day"
+	CENT_FOUR_DAY_NAME     = "签到第四天"
+	CENT_FIVE_DAY          = "five_day"
+	CENT_FIVE_DAY_NAME     = "签到第五天"
+	CENT_SIX_DAY           = "six_day"
+	CENT_SIX_DAY_NAME      = "签到第六天"
+	CENT_SEVEN_DAY         = "seven_day"
+	CENT_SEVEN_DAY_NAME    = "签到第七天"
+	CENT_FIRST_LOGIN       = "first_login"
+	CENT_FIRST_LOGIN_NAME  = "首次登录"
+	CENT_NEW_MAN           = "new_man"
+	CENT_NEW_MAN_NAME      = "新人注册"
+	EXCXHANGE_PRODUCT      = "exchange_product"
+	EXCXHANGE_PRODUCT_NAME = "购物扣除"
+	PRE_KEY_DAILY          = "day_sign"
+)
+
+//积分余额表
+type CentBalance struct {
+	Id         int64     `orm:"column(id);pk"                                       json:"id"`        // int(11)
+	WxUId      int64     `orm:"column(wx_uid)"                                      json:"wx_uid"`    // int(11)
+	Count      int64     `orm:"column(count)"                                       json:"count"`     // int(11)
+	Source     string    `orm:"column(source);null"                                 json:"source"`    // varchar(64)
+	SourceName string    `orm:"-"                                 json:"source_name"`                 // varchar(64)
+	RelateId   string    `orm:"column(relate_id);null"                              json:"relate_id"` // varchar(255)
+	Remark     string    `orm:"column(remark);null"                                 json:"remark"`    // varchar(255)
+	CTime      int64     `orm:"-"                                       json:"c_time"`                // int(11)
+	CreatedAt  time.Time `orm:"column(created_at);null;auto_now_add;type(datetime)" json:"-"`         // datetime
+	UpdatedAt  time.Time `orm:"column(updated_at);null;auto_now;type(datetime)"     json:"-"`         // datetime
+}
+
+func (self *CentBalance) TableName() string {
+	return cent_balances_tablename
+}
+
+func (self *CentBalance) Create(wxUId, c int64, s, rId, remark string) (item *CentBalance) {
+	item = &CentBalance{
+		Count:    c,
+		WxUId:    wxUId,
+		Source:   s,
+		RelateId: rId,
+		Remark:   remark,
+	}
+	id, err := orm.NewOrm().Insert(item)
+	if err != nil {
+		beego.BeeLogger.Error("Create CentBalance err=[%s]", err)
+		return nil
+	}
+	item.Id = id
+	return item
+}
+
+//返回source名称
+func (self *CentBalance) GetSourceName() string {
+	sourceName := ""
+	switch self.Source {
+	case CENT_ONE_DAY:
+		sourceName = CENT_ONE_DAY_NAME
+	case CENT_TWO_DAY:
+		sourceName = CENT_TWO_DAY_NAME
+	case CENT_THREE_DAY:
+		sourceName = CENT_THREE_DAY_NAME
+	case CENT_FOUR_DAY:
+		sourceName = CENT_FOUR_DAY_NAME
+	case CENT_FIVE_DAY:
+		sourceName = CENT_FIVE_DAY_NAME
+	case CENT_SIX_DAY:
+		sourceName = CENT_SIX_DAY_NAME
+	case CENT_SEVEN_DAY:
+		sourceName = CENT_SEVEN_DAY_NAME
+	case CENT_FIRST_LOGIN:
+		sourceName = CENT_FIRST_LOGIN_NAME
+	case CENT_NEW_MAN:
+		sourceName = CENT_NEW_MAN_NAME
+	}
+	return sourceName
+}
+
+//获取某人的积分流列表
+func GetCentBalanceListByWxUId(wxUId, page, perPage int64, useCache bool) (list []*CentBalance) {
+	k := fmt.Sprintf("cent_model.GetCentBalanceListByWxUId(%d).page(%d).perPage(%d)", wxUId, page, perPage)
+	if useCache {
+		if s, ok := cache.Cache.Get(k).([]*CentBalance); ok {
+			return s
+		}
+	}
+
+	balance := new(CentBalance)
+	qs := orm.NewOrm().QueryTable(balance)
+	qs = qs.Filter("wx_uid", wxUId)
+
+	if _, err := qs.OrderBy("-created_at", "-id").
+		Limit(perPage, (page-1)*perPage).All(&list); err != nil {
+		beego.BeeLogger.Debug("get cash balance with wxUId=%d, err=[%s]", wxUId, err)
+		return nil
+	}
+
+	for _, item := range list {
+		item.SourceName = item.GetSourceName()
+	}
+
+	cache.Cache.Put(k, list, 10*time.Minute)
+	return list
+}
+
+//获取某人的积分流列表总条数
+func GetCentBalanceCountByWxUId(wxUId int64) int64 {
+	item := new(CentBalance)
+	o := orm.NewOrm()
+	count, _ := o.QueryTable(item).Filter("wx_uid", wxUId).Count()
+	return count
+}
+
+//账户进账总额
+func GetCentEnterBalance(wxUId int64) int64 {
+	type Ret struct {
+		Count int64
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	tbn := new(CentBalance).TableName()
+	sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_uid=? and count > 0;", tbn)
+	err := o.Raw(sql, wxUId).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("GetCentEnterBalance, wxUser:%d err=[%s]", wxUId, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+	return ret.Count
+}
+
+//账户出账总额
+func GetCentOutBalance(wxUId int64) int64 {
+	type Ret struct {
+		Count int64
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	tbn := new(CentBalance).TableName()
+	sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_uid=? and count < 0;", tbn)
+	err := o.Raw(sql, wxUId).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("GetCentOuterBalance, wxUser:%d err=[%s]", wxUId, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+	return ret.Count
+}
+
+//账户余额
+func GetCentTotalBalance(wxUId int64) int64 {
+	type Ret struct {
+		Count int64
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	tbn := new(CentBalance).TableName()
+	sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_uid=?;", tbn)
+	err := o.Raw(sql, wxUId).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("GetCentTotalBalance, wxUser:%d err=[%s]", wxUId, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+	return ret.Count
+}
+
+func GetCentBalanceByWxUIdAndRIdAndSource(wxUId int64, rId, source string) *CentBalance {
+	item := &CentBalance{}
+	if err := orm.NewOrm().QueryTable(item).
+		Filter("wx_uid", wxUId).
+		Filter("source", source).
+		Filter("relate_id", rId).OrderBy("-created_at").Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetCentBalanceByWxUIdAndRIdAndSource(%d,%s,%s), err=%s",
+			wxUId, rId, source, err)
+		return nil
+	}
+	return item
+}
+
+func GetCentBalanceBySourceAndRId(source, rId string) *CentBalance {
+	item := &CentBalance{}
+	if err := orm.NewOrm().QueryTable(item).
+		Filter("source", source).
+		Filter("relate_id", rId).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetCentBalanceBySourceAndRId(%s,%s), err=%s",
+			source, rId, err)
+		return nil
+	}
+	return item
+}
+
+func GetCentById(id int64) *CentBalance {
+	item := &CentBalance{}
+	if err := orm.NewOrm().QueryTable(item).
+		Filter("id", id).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Debug("GetCentById(%s), err=%s",
+			id, err)
+		return nil
+	}
+	return item
+}

+ 9 - 0
go/gopath/src/fohow.com/apps/models/cent_model/init.go

@@ -0,0 +1,9 @@
+package cent_model
+
+import (
+	"github.com/astaxie/beego/orm"
+)
+
+func init() {
+	orm.RegisterModel(new(CentBalance), new(CentAward))
+}

+ 5 - 1
go/gopath/src/fohow.com/apps/models/order_model/order.go

@@ -33,6 +33,7 @@ const (
 	PAY_WAY_WEIXIN   = "weixinpay" //微信支付
 	PAY_WAY_BALANCE  = "balance"   //代金券余额支付
 	PAY_WAY_INTEGRAl = "integral"  //代金券支付
+	PAY_WAY_CENT     = "cent"      //积分支付
 
 	SOURCE_XCX     = "xcx"
 	SOURCE_GZH     = "gzh"
@@ -41,11 +42,13 @@ const (
 	OPERATE_CONFIRM = "confirm" //确认收货
 	OPERATE_CANCEL  = "cancel"  //取消订单
 
-	//订单类型 0:普通订单, 1:秒杀订单, 2:店铺订单
+	//订单类型 0:普通订单, 1:秒杀订单, 2:店铺订单, 3:积分订单
 	ORDER_TYPE_NORMAL = int64(0)
 	ORDER_TYPE_SEKILL = int64(1)
 	ORDER_TYPE_SHOP   = int64(2)
+	ORDER_TYPE_CENT   = int64(3)
 
+	CENT_LIMIT       = int64(9900)
 	FREIGHT_LIMIT    = int64(9900)
 	FREIGHT          = int64(500)
 	PROMOTION_TOTAL  = int64(19800)
@@ -79,6 +82,7 @@ type Order struct {
 	TotalPrice     int64                    `orm:"column(total_price)"                                 json:"total_price"`      // int(11)
 	PaiedPrice     int64                    `orm:"column(paied_price);null"                            json:"paied_price"`      // int(11)
 	CouponPrice    int64                    `orm:"column(coupon_price);null"                           json:"coupon_price"`     // int(11)
+	CentPrice      int64                    `orm:"column(cent_price);null"                             json:"cent_price"`       // int(11)
 	BuyPrice       int64                    `orm:"column(buy_price);null"                              json:"-"`                // int(11)
 	Count          int64                    `orm:"column(count);null"                                  json:"count"`            // int(11)
 	PaiedAt        int64                    `orm:"column(paied_at);null"                               json:"paied_at"`         // int(11)

+ 2 - 0
go/gopath/src/fohow.com/apps/models/pay_model/init.go

@@ -15,4 +15,6 @@ const (
 	PAYWAY_WEIXINPAY = "weixinpay" //微信支付
 	PAYWAY_BALANCE   = "balance"   //我的代金券
 	PAY_WAY_INTEGRAL = "integral"  //代金券
+	PAYWAY_CENT      = "cent"      //积分支付
+
 )

+ 1 - 0
go/gopath/src/fohow.com/apps/models/product_model/product.go

@@ -21,6 +21,7 @@ const (
 	TYPE_USER_SALE   = "user_sale"   //代销
 	TYPE_DIRECT_SALE = "direct_sale" //直营
 	SHOP_SALE        = "shop_sale"   //店铺专区
+	CENT_SALE        = "cent_sale"   //积分专区
 
 	SECKILL_NONE_STATE         = "none"
 	SECKILL_NONE_STATE_CN      = "暂无秒杀"

+ 35 - 77
go/gopath/src/fohow.com/libs/lib_redis/redis.go

@@ -8,25 +8,35 @@ import (
 	"time"
 )
 
-func Del(key string) error {
+func redisInitClient() *redis.Client {
 	db, err := beego.AppConfig.Int("AliRedisDb")
 	if err != nil {
 		beego.BeeLogger.Error("%s", err)
-		return err
+		return nil
 	}
 	client := redis.NewClient(&redis.Options{
 		Addr:     beego.AppConfig.String("AliRedisHost"),
 		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
 		DB:       db,                                    //使用默认数据库
 	})
-	//beego.BeeLogger.Info("Connect lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
-	defer client.Close() //最后关闭
+	//defer client.Close()
 	_, err = client.Ping().Result()
 	if err != nil {
+		beego.BeeLogger.Error("redisError redisInitClient(), err:%s", err)
+		return nil
+	}
+	return client
+}
+
+func Del(key string) error {
+	redisClient := redisInitClient()
+	defer redisClient.Close()
+	_, err := redisClient.Ping().Result()
+	if err != nil {
 		beego.BeeLogger.Error("%s", err)
 		return err
 	}
-	return client.Del(key).Err()
+	return redisClient.Del(key).Err()
 }
 
 // SetJsonEx set Json and second
@@ -40,47 +50,27 @@ func SetJsonEx(key string, data interface{}, seconds int) error {
 
 //保存keyValue
 func SetRedisValue(key, value string, expiration time.Duration) error {
-	db, err := beego.AppConfig.Int("AliRedisDb")
-	if err != nil {
-		beego.BeeLogger.Error("%s", err)
-		return err
-	}
-	client := redis.NewClient(&redis.Options{
-		Addr:     beego.AppConfig.String("AliRedisHost"),
-		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
-		DB:       db,                                    //使用默认数据库
-	})
-	beego.BeeLogger.Info("Connect lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
-	defer client.Close() //最后关闭
-	_, err = client.Ping().Result()
+	redisClient := redisInitClient()
+	defer redisClient.Close()
+	_, err := redisClient.Ping().Result()
 	if err != nil {
 		beego.BeeLogger.Error("%s", err)
 		return err
 	}
-
-	client.Set(key, value, expiration) //忽略错误
+	redisClient.Set(key, value, expiration) //忽略错误
 	return nil
 }
 
 //获取keyValue
 func GetRedisValue(key string, resp interface{}) (bool, interface{}) {
-	db, err := beego.AppConfig.Int("AliRedisDb")
+	redisClient := redisInitClient()
+	defer redisClient.Close()
+	_, err := redisClient.Ping().Result()
 	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,                                    //使用默认数据库
-	})
-	defer client.Close() //最后关闭
-	_, err = client.Ping().Result()
-	if err != nil {
-		beego.BeeLogger.Error("%s", err)
-		return false, ""
-	}
-	val, err := client.Get(key).Result()
+	val, err := redisClient.Get(key).Result()
 	if err != nil {
 		return false, ""
 	}
@@ -94,23 +84,14 @@ func GetRedisValue(key string, resp interface{}) (bool, interface{}) {
 
 // GetFromJSON 从 lib_redis 读取数据, 自带解析JSON格式
 func GetFromJSON(data interface{}, key string) error {
-	db, err := beego.AppConfig.Int("AliRedisDb")
-	if err != nil {
-		beego.BeeLogger.Error("%s", err)
-		return err
-	}
-	client := redis.NewClient(&redis.Options{
-		Addr:     beego.AppConfig.String("AliRedisHost"),
-		Password: beego.AppConfig.String("AliRedisPwd"), //默认空密码
-		DB:       db,                                    //使用默认数据库
-	})
-	defer client.Close() //最后关闭
-	_, err = client.Ping().Result()
+	redisClient := redisInitClient()
+	defer redisClient.Close()
+	_, err := redisClient.Ping().Result()
 	if err != nil {
 		beego.BeeLogger.Error("%s", err)
 		return err
 	}
-	val := client.Get(key)
+	val := redisClient.Get(key)
 	if val.Err() != nil {
 		return val.Err()
 	}
@@ -118,10 +99,8 @@ func GetFromJSON(data interface{}, key string) error {
 	if err != nil {
 		return err
 	}
-
 	if err := json.Unmarshal(jsonData, data); err != nil {
 		beego.Warn("lib_redis.GetFromJSON: %s %s", string(jsonData), err)
-
 		return err
 	}
 	//beego.BeeLogger.Info("result 返回字符:%s", jsonData)
@@ -131,49 +110,28 @@ func GetFromJSON(data interface{}, key string) error {
 
 //保存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 lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
-	defer client.Close() //最后关闭
-	_, err = client.Ping().Result()
+	redisClient := redisInitClient()
+	defer redisClient.Close()
+	_, err := redisClient.Ping().Result()
 	if err != nil {
 		beego.BeeLogger.Error("%s", err)
 		return
 	}
 	beego.BeeLogger.Info("throwin lib_redis key (%s), value=%s", key, value)
-
-	client.LPush(key, value) //rpush则在尾部插入
+	redisClient.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 lib_redis name (%s), pwd=%s", beego.AppConfig.String("AliRedisHost"), beego.AppConfig.String("AliRedisPwd"))
-	defer client.Close() //最后关闭
-	_, err = client.Ping().Result()
+	redisClient := redisInitClient()
+	defer redisClient.Close()
+	_, err := redisClient.Ping().Result()
 	if err != nil {
 		beego.BeeLogger.Error("%s", err)
 		return
 	}
-	client.LRem(key, 0, value)
+	redisClient.LRem(key, 0, value)
 	beego.BeeLogger.Info("throwout lib_redis key (%s), value=%s", key, value)
 	return
 }

+ 11 - 7
go/gopath/src/fohow.com/libs/wx_mp/pay.go

@@ -24,18 +24,22 @@ import (
 
 const (
 	appId = "wx84f6c33a9fa3977d" //小程序APPID
-	//190903之后统一用571商户号
-	mchId  = "1424016502"
-	apiKey = "8r76o4CWzgWqTTlrNwtnWH9URpdXyveO"
+
+	mchId  = "1604238155"
+	apiKey = "w7gb9ur5hb9g5326vy3sr0q4cobmrpgq"
 
 	//微信公众号使用小程序的商户号和api加密
-	gzhMchId  = "1424016502"
-	gzhApiKey = "8r76o4CWzgWqTTlrNwtnWH9URpdXyveO"
+	gzhMchId  = "1604238155"
+	gzhApiKey = "w7gb9ur5hb9g5326vy3sr0q4cobmrpgq"
 	gzhAppId  = "wx6c8e31c921527d39" //公众号APPID
 
 	//微信公众号-独立商户号
-	wxMchId  = "1424016502"
-	wxApiKey = "8r76o4CWzgWqTTlrNwtnWH9URpdXyveO"
+	wxMchId  = "1604238155"
+	wxApiKey = "w7gb9ur5hb9g5326vy3sr0q4cobmrpgq"
+
+	//提现商户号
+	takeWxMchId  = "1424016502"
+	takeWxApiKey = "8r76o4CWzgWqTTlrNwtnWH9URpdXyveO"
 
 	PAY_SUCCESS = "SUCCESS"
 	PAY_FAIL    = "FAIL"

+ 14 - 0
go/gopath/src/fohow.com/routers/routes.go

@@ -1,6 +1,7 @@
 package routers
 
 import (
+	"fohow.com/apps/controllers/cent_controller"
 	"fohow.com/apps/controllers/test_controller"
 	// "fohow.com/apps"
 	"github.com/astaxie/beego"
@@ -282,4 +283,17 @@ func init() {
 	//店铺专区下单
 	beego.Router("/v1/shop/order_mul", &order_controller.OrderController{}, "post:MultShopCreate")
 
+	//----------------积分活动-------------------
+	beego.Router("/v1/task_sign/daily/day", &cent_controller.CentController{}, "post:SignEveryday")
+	beego.Router("/v1/task_sign/daily/check", &cent_controller.CentController{}, "get:GetSignStatus")
+	//积分账户变更详情
+	beego.Router("/v1/user/cent/:id([0-9]+)", &cent_controller.CentController{}, "get:GetCentDetail")
+	//积分账户余额
+	beego.Router("/v1/user/cent/info", &cent_controller.CentController{}, "get:GetCentInfo")
+	//积分账户变动列表
+	beego.Router("/v1/user/cent/balances", &cent_controller.CentController{}, "get:GetCentList")
+
+	//积分专区下单
+	beego.Router("/v1/cent/order_mul", &order_controller.OrderController{}, "post:MultCentCreate")
+
 }