Forráskód Böngészése

rebuid api 精简

abiao 5 éve
szülő
commit
1e6775d5ac
21 módosított fájl, 751 hozzáadás és 513 törlés
  1. 4 0
      go/gopath/src/fohow.com/apps/controllers/cron_controller/init.go
  2. 67 1
      go/gopath/src/fohow.com/apps/controllers/cron_controller/sync_balance.go
  3. 35 0
      go/gopath/src/fohow.com/apps/controllers/cron_controller/update_sold_count.go
  4. 80 0
      go/gopath/src/fohow.com/apps/controllers/cron_controller/user_complete_info.go
  5. 0 1
      go/gopath/src/fohow.com/apps/controllers/order_controller/cart_controller.go
  6. 27 147
      go/gopath/src/fohow.com/apps/controllers/order_controller/order_controller.go
  7. 41 6
      go/gopath/src/fohow.com/apps/controllers/pay_controller/after_pay_controller.go
  8. 48 0
      go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_cashcz_controller.go
  9. 0 3
      go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_controller.go
  10. 315 0
      go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_exchange_controller.go
  11. 1 0
      go/gopath/src/fohow.com/apps/controllers/pay_controller/recharge_controller.go
  12. 29 36
      go/gopath/src/fohow.com/apps/controllers/permit_controller/permit_controller.go
  13. 10 25
      go/gopath/src/fohow.com/apps/controllers/product_controller/product_controller.go
  14. 5 11
      go/gopath/src/fohow.com/apps/controllers/seckill_controller/seckill_controller.go
  15. 1 1
      go/gopath/src/fohow.com/apps/models/balance_model/balance.go
  16. 45 68
      go/gopath/src/fohow.com/apps/models/order_model/order.go
  17. 27 3
      go/gopath/src/fohow.com/apps/models/order_model/order_detail.go
  18. 8 203
      go/gopath/src/fohow.com/apps/models/product_model/product.go
  19. 2 2
      go/gopath/src/fohow.com/apps/models/product_model/product_picture.go
  20. 2 4
      go/gopath/src/fohow.com/apps/models/user_model/invite.go
  21. 4 2
      go/gopath/src/fohow.com/apps/models/user_model/wx_user.go

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

@@ -70,10 +70,14 @@ func exec(name string) {
 		OrderReceiveAutomatically()
 	case "updateUserNicknameAndHead": //修复数据-只执行一次
 		updateUserNicknameAndHead()
+	case "udpate_sold_count": //更新已售数量
+		updateSoldCount()
 	case "sendTopSaleListMonthlyReward": //发放每月销售奖金
 		sendTopSaleListMonthlyReward()
 	case "comb_user_relation": //梳理内部推荐关系
 		combUserRelation()
+	case "test_inser_three": //测试三位关系
+		insertThreeWxusers()
 	case "comb_three_user": //梳理三位关系
 		threebUserRelation()
 	case "register_wxuser": //修复数据--注册会员

+ 67 - 1
go/gopath/src/fohow.com/apps/controllers/cron_controller/sync_balance.go

@@ -1,14 +1,80 @@
 package cron_controller
 
 import (
+	"crypto/md5"
+	"fmt"
+	"io"
+	"net/http"
+	"net/url"
+	"strconv"
 	"time"
 
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/orm"
+
 	"fohow.com/apps/models/balance_model"
 	"fohow.com/apps/models/user_model"
 	"fohow.com/libs/wx_mp"
-	"github.com/astaxie/beego"
 )
 
+type SyncData struct {
+	RecordID  int64     `orm:"column(id)"`
+	UnionId   string    `orm:"column(unionid)"`
+	Amount    int64     `orm:"column(receive_bonus)"`
+	CreatedAt time.Time `orm:"column(created_at);null;auto_now_add;type(datetime)"`
+}
+
+func (self *SyncData) Sign() string {
+	h := md5.New()
+	s := fmt.Sprintf("%s,%s,%d,!iGUESS", self.UnionId, self.Amount, self.CreatedAt.Unix())
+	io.WriteString(h, s)
+	return fmt.Sprintf("%x", h.Sum(nil))
+}
+
+// 定期同步红包数据到第五创主数据库
+func syncBalance() {
+	beego.BeeLogger.Warn("********** Cron task - handle syncBalance start at: %s********", time.Now())
+	// 找出50条未同步的记录
+	// 逐条同步,并标记成功记录
+	o := orm.NewOrm()
+
+	var rs []SyncData
+
+	sql := "SELECT `chunjie_lucky_moneys`.`id` AS id,  `wx_uid`, `receive_bonus`, `chunjie_lucky_moneys`.`created_at`, `unionid` FROM `chunjie_lucky_moneys` inner join `wx_users` on `chunjie_lucky_moneys`.`wx_uid`=`wx_users`.`id` WHERE `is_sync25`<>1 AND `wx_users`.`unionid`<>'' order by `is_sync25` ASC LIMIT 300 ;"
+	num, err := o.Raw(sql).QueryRows(&rs)
+	if err == nil {
+		fmt.Println("user nums: ", num)
+	}
+	for _, syncData := range rs {
+		beego.BeeLogger.Info("********** Cron task - handle syncBalance RecordID=[%d] ********", syncData)
+		if result := syncOne(syncData); result {
+			// update chunjie_lucky_moneys set is_sync25=1
+			o.Raw("UPDATE `chunjie_lucky_moneys` SET `is_sync25` = 1 WHERE id=?", syncData.RecordID).Exec()
+			beego.BeeLogger.Info("********** Cron task - handle syncBalance Success: ********", syncData)
+		} else {
+			o.Raw("UPDATE `chunjie_lucky_moneys` SET `is_sync25` = 2 WHERE id=?", syncData.RecordID).Exec()
+			beego.BeeLogger.Error("********** Cron task - handle syncBalance Fail: ********", syncData)
+		}
+	}
+	beego.BeeLogger.Warn("********** Cron task - handle syncBalance end   at: %s********", time.Now())
+}
+
+func syncOne(syncData SyncData) bool {
+	form := url.Values{}
+	form.Add("unionId", syncData.UnionId)
+	form.Add("amount", strconv.FormatInt(syncData.Amount, 10))
+	form.Add("timestamp", strconv.FormatInt(syncData.CreatedAt.Unix(), 10))
+	form.Add("signature", syncData.Sign())
+	apiUrl := beego.AppConfig.String("D5CApiHost") + "/v1/labi/cjhd/sync_balance"
+	resp, err := http.PostForm(apiUrl, form)
+	if err != nil {
+		beego.BeeLogger.Error("********** Cron task - handle syncBalance Http Error %s:  ********", err)
+	}
+	defer resp.Body.Close()
+	beego.BeeLogger.Debug("********** Cron task - handle syncBalance end   at:  ********", resp)
+	return resp.StatusCode == 201
+}
+
 //提现打款的定时任务
 func takeCash() {
 	//选择出已审批通过的提现中订单

+ 35 - 0
go/gopath/src/fohow.com/apps/controllers/cron_controller/update_sold_count.go

@@ -0,0 +1,35 @@
+package cron_controller
+
+import (
+	"fohow.com/apps/models/order_model"
+	"fohow.com/apps/models/product_model"
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/orm"
+)
+
+/*
+处理商品已销售数量
+*/
+func updateSoldCount() {
+
+	var list []*product_model.Product
+	sql := `
+		select *
+		  from products ;
+	`
+	_, err := orm.NewOrm().Raw(sql).QueryRows(&list)
+	if err != nil {
+		beego.Debug("updateSoldCount err=[%s]", err)
+		return
+	}
+	beego.BeeLogger.Warn("updateSoldCount.len(list):%d", len(list))
+	for _, product := range list {
+		//统计商品总销量
+		soldCount := order_model.GetSoldCountByPId(product.Id, false)
+		product.SaleNums = soldCount
+		beego.BeeLogger.Warn("updateSoldCount.productId:%d", product.Id)
+		beego.BeeLogger.Warn("updateSoldCount.SaleNums:%d", soldCount)
+		product.Save()
+	}
+
+}

+ 80 - 0
go/gopath/src/fohow.com/apps/controllers/cron_controller/user_complete_info.go

@@ -73,3 +73,83 @@ func updateUserNicknameAndHead() {
 	}
 
 }
+
+/*
+团购有支付成功的投资记录
+邀请佣金管理有记录的
+分享情况管理,有分享记录的
+给他们开通微信推广模块
+*/
+func updateWxUserShowInviteMode() {
+
+	//查找真实投资人
+	var list1 []*project_model.ProjectJoin
+	sql1 := `
+		select *
+		  FROM project_joins
+		 where state= 1
+		   and is_deleted= 0
+		   and is_refunded= 0
+		 GROUP BY user_id ;
+	`
+
+	_, err1 := orm.NewOrm().Raw(sql1).QueryRows(&list1)
+
+	if err1 != nil {
+		beego.Debug("GetProjectUsers err=[%s]", err1)
+	}
+
+	for _, item := range list1 {
+
+		wxUser := user_model.GetWxUserByUserId(item.UserId, true)
+		if wxUser != nil && wxUser.ShowInviteMode != 1 {
+			wxUser.ShowInviteMode = int64(1)
+			wxUser.Save()
+		}
+	}
+
+	//邀请佣金管理有记录的
+	var list2 []*user_model.InviteOrder
+	sql2 := `
+		select *
+		  from invite_benefit_orders
+		 where source!= 'binding'
+		 GROUP BY benefit_wx_uid ;
+	`
+	_, err2 := orm.NewOrm().Raw(sql2).QueryRows(&list2)
+	if err2 != nil {
+		beego.Debug("GetInviteOrderUsers err=[%s]", err2)
+	}
+
+	for _, item := range list2 {
+
+		wxUser := user_model.GetWxUserById(item.BenefitWxUId, true)
+
+		if wxUser != nil && wxUser.ShowInviteMode != 1 {
+			wxUser.ShowInviteMode = int64(1)
+			wxUser.Save()
+		}
+	}
+
+	//分享情况
+	var list3 []*share_model.ShareInfo
+	sql3 := `
+		select *
+		  from share_infos
+		 GROUP BY wx_user_id ;
+	`
+	_, err3 := orm.NewOrm().Raw(sql3).QueryRows(&list3)
+	if err3 != nil {
+		beego.Debug("GetInviteOrderUsers err=[%s]", err3)
+	}
+
+	for _, item := range list3 {
+
+		wxUser := user_model.GetWxUserById(item.WxUserId, true)
+		if wxUser != nil && wxUser.ShowInviteMode != 1 {
+			wxUser.ShowInviteMode = int64(1)
+			wxUser.Save()
+		}
+	}
+
+}

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

@@ -242,7 +242,6 @@ func (self *OrderController) GetCartBuyList() {
 	total := int64(0)
 	for _, item := range list {
 		count += item.Count
-
 		product := product_model.GetProductById(item.ProductId, cache)
 		wxUser := user_model.GetWxUserById(item.WxUserId, cache)
 		if wxUser != nil {

+ 27 - 147
go/gopath/src/fohow.com/apps/controllers/order_controller/order_controller.go

@@ -20,7 +20,6 @@ import (
 	"fohow.com/apps/helpers"
 	"fohow.com/apps/models/cow_order_model"
 	"fohow.com/apps/models/merchant_model"
-	"fohow.com/apps/models/subject_model"
 	"fohow.com/apps/models/user_model"
 	"fohow.com/libs/tool"
 	"strings"
@@ -29,9 +28,13 @@ import (
 )
 
 var updateExpressLock sync.Mutex
+var createOrder sync.Mutex
+var MultreateOrder sync.Mutex
 
 //下单
 func (self *OrderController) Create() {
+	createOrder.Lock()
+	defer createOrder.Unlock()
 	_pid := self.Ctx.Input.Param(":id")
 	pId, _ := strconv.ParseInt(_pid, 10, 64)
 	_count := self.Ctx.Input.Param(":count")
@@ -50,68 +53,6 @@ func (self *OrderController) Create() {
 	//if user.IsBlackUser == 1 {
 	//	self.ReturnError(403, apps.AccountError, "", nil)
 	//}
-	//加入限购逻辑
-	if product.PurchaseLimitCount > 0 {
-		if product.PurchaseLimitCount < count {
-			self.ReturnError(403, []string{apps.OverLimitCount[0], fmt.Sprintf("该商品限购%d件", product.PurchaseLimitCount)}, "", nil)
-		} else {
-			purchaseTotalCount := order_model.GetOrderCountByPIdAndWxUId(pId, wxUId)
-			//历史已经买够到限购数量了
-			if product.PurchaseLimitCount <= purchaseTotalCount {
-				self.ReturnError(403, []string{apps.PurchasedReachLimit[0], fmt.Sprintf("该商品限购%d件", product.PurchaseLimitCount)}, "", nil)
-			}
-			//历史没买够数量,但是历史总数+想购买的数量 超过限购数量
-			if product.PurchaseLimitCount < (purchaseTotalCount + count) {
-				canBuyCount := product.PurchaseLimitCount - purchaseTotalCount
-				self.ReturnError(403, []string{apps.PurchasedReachLimit[0], fmt.Sprintf("您还可以购买%d件", canBuyCount)}, "", nil)
-			}
-		}
-	}
-	//判断剩余数量
-	leftCount := int64(0)
-	product.SoldCount = order_model.GetSoldCountByPId(product.Id, false)
-	leftCount = product.Count - product.SoldCount
-	if count > leftCount {
-		self.ReturnError(403, apps.ProductStockNotEnough, "", nil)
-	}
-	//商品销售专题---start
-	isJoinSubjectPrize := false      //商品是否参与专题的抽奖, 考虑开奖时间
-	productSaleSubjectId := int64(0) //专题的id
-	sId, _ := self.GetInt64("sid", 0)
-	if sId > 0 {
-		subject := subject_model.GetProductSaleSubjectById(sId, false)
-		if subject != nil {
-			productIds := subject.ProductIds
-			productIdArray := strings.Split(productIds, ",")
-			for _, productIdItem := range productIdArray {
-				productId, err := strconv.ParseInt(productIdItem, 10, 64)
-				if err == nil && productId == pId {
-					productSaleSubjectId = subject.Id
-					if subject.IsPrizeAct && subject.OpenPrizeTime.Unix() > time.Now().Unix() {
-						isJoinSubjectPrize = true
-					}
-				}
-			}
-		}
-	}
-	subjects := subject_model.GetPrizeActProductSaleSubjectsByProductId(pId, false)
-	if len(subjects) > 0 {
-		for _, item := range subjects {
-			productIds := item.ProductIds
-			productIdArray := strings.Split(productIds, ",")
-			for _, productIdItem := range productIdArray {
-				productId, err := strconv.ParseInt(productIdItem, 10, 64)
-				if err == nil && productId == pId {
-					productSaleSubjectId = item.Id
-					if item.IsPrizeAct && item.OpenPrizeTime.Unix() > time.Now().Unix() {
-						isJoinSubjectPrize = true
-					}
-				}
-			}
-		}
-	}
-	//商品销售专题---end
-
 	//秒杀逻辑: 判断是否处于秒杀时间段内
 	if product.SeckilShowPrice > 0 {
 		now := time.Now()
@@ -121,37 +62,25 @@ func (self *OrderController) Create() {
 			self.ReturnError(403, apps.SeckillIsEnd, "", nil)
 		}
 	}
-
-	//限新逻辑: 微信支付完成购买过商品的用户
-	if product.IsOnlyNew {
-		paiedOrder := order_model.GetPaiedOrderByWxUIdAndPayWayLimitOne(wxUId, order_model.PAY_WAY_WEIXIN, false)
-		if paiedOrder != nil {
-			self.ReturnError(403, apps.OnlyNew, "", nil)
-		}
-	}
-
-	totalPrice := product.RoboBalancePrice * count
+	totalPrice := product.Price * count
 	//小兔微信,测试微信支付
-	if wxUId == 42452 {
+	if wxUId == 76 {
 		totalPrice = 1
 	}
 	freight := order_model.FREIGHT
-	if totalPrice >= order_model.FREIGHT_LIMIT {
+	if totalPrice >= order_model.FREIGHT_LIMIT || beego.AppConfig.String("RunMode") == "dev" {
 		freight = int64(0)
 	}
 
 	order := new(order_model.Order).CreateNew(wxUId, uId,
 		totalPrice, freight, order_model.SOURCE_XCX)
-	if order != nil {
-		if productSaleSubjectId > 0 {
-			order.IsJoinSubjectPrize = isJoinSubjectPrize
-			order.ProductSaleSubjectId = productSaleSubjectId
-		}
-		order.Save()
-		//创建订单明细
-		go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.Price, product.RoboBalancePrice, product.Name,
-			count)
+	if order == nil {
+		self.ReturnError(403, apps.CreateOrderFail, "", nil)
 	}
+	order.Save()
+	//创建订单明细
+	go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.Price, product.RoboBalancePrice, product.Name,
+		count)
 
 	type Order struct {
 		OrderId string `json:"order_id"`
@@ -182,20 +111,24 @@ func (self *OrderController) GetExpressNo() {
 
 //购物车下单
 func (self *OrderController) MultipleCreate() {
+	MultreateOrder.Lock()
+	defer MultreateOrder.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)
 	}
 	totalPrice := int64(0)
+	//创建订单
+	order := new(order_model.Order).CreateNew(wxUId, uId,
+		totalPrice, int64(0), order_model.SOURCE_XCX)
+	if order == nil {
+		self.ReturnError(403, apps.CreateOrderFail, "", nil)
+	}
 	c_arr := strings.Split(ids, ",")
-	beego.BeeLogger.Warn("c_arr(%s)", c_arr)
 	c_nums := strings.Split(nums, ",")
-	beego.BeeLogger.Warn("c_nums(%s)", c_nums)
 	for key, s_item := range c_arr {
 		cId, _ := strconv.ParseInt(s_item, 10, 64)
 		cNums := int64(1)
@@ -211,70 +144,17 @@ func (self *OrderController) MultipleCreate() {
 		if product == nil {
 			self.ReturnError(403, apps.NoExist, "", nil)
 		}
-		//加入限购逻辑
-		if product.PurchaseLimitCount > 0 {
-			if product.PurchaseLimitCount < cNums {
-				self.ReturnError(403, []string{apps.OverLimitCount[0], fmt.Sprintf("%s商品限购%d件", product.Name, product.PurchaseLimitCount)}, "", nil)
-			} else {
-				purchaseTotalCount := order_model.GetOrderCountByPIdAndWxUId(cartItem.ProductId, wxUId)
-				//历史已经买够到限购数量了
-				if product.PurchaseLimitCount <= purchaseTotalCount {
-					self.ReturnError(403, []string{apps.PurchasedReachLimit[0], fmt.Sprintf("%s商品限购%d件", product.Name, product.PurchaseLimitCount)}, "", nil)
-				}
-				//历史没买够数量,但是历史总数+想购买的数量 超过限购数量
-				if product.PurchaseLimitCount < (purchaseTotalCount + cNums) {
-					canBuyCount := product.PurchaseLimitCount - purchaseTotalCount
-					self.ReturnError(403, []string{apps.PurchasedReachLimit[0], fmt.Sprintf("%s您还可以购买%d件", product.Name, canBuyCount)}, "", nil)
-				}
-			}
-		}
-		//普通下单--判断剩余数量
-		product.SoldCount = order_model.GetSoldCountByPId(product.Id, false)
-		leftCount := product.Count - product.SoldCount
-		if cNums > leftCount {
-			self.ReturnError(403, []string{apps.ProductStockNotEnough[0], fmt.Sprintf("%s商品库存不足", product.Name)}, "", nil)
-		}
-		//限新逻辑: 微信支付完成购买过商品的用户
-		if product.IsOnlyNew {
-			paiedOrder := order_model.GetPaiedOrderByWxUIdAndPayWayLimitOne(wxUId, order_model.PAY_WAY_WEIXIN, false)
-			if paiedOrder != nil {
-				self.ReturnError(403, []string{apps.OnlyNew[0], fmt.Sprintf("%s仅限新人购买", product.Name)}, "", nil)
-			}
-		}
 		totalPrice += product.Price * cNums
-		//小兔微信,测试微信支付
-		if wxUId == 12 {
-			//totalPrice = 1
-		}
+		go new(order_model.OrderDetail).Create(order.OrderId, order.Id, cartItem.ProductId, product.Price, product.RoboBalancePrice, product.Name,
+			cNums)
 	}
 	freight := order_model.FREIGHT
-	if totalPrice >= order_model.FREIGHT_LIMIT {
+	if totalPrice >= order_model.FREIGHT_LIMIT || beego.AppConfig.String("RunMode") == "dev" {
 		freight = int64(0)
 	}
-	order := new(order_model.Order).CreateNew(wxUId, uId,
-		totalPrice, freight, order_model.SOURCE_XCX)
-	if order != nil {
-		order.Save()
-		//创建订单明细
-		for key, s_item := range c_arr {
-			cId, _ := strconv.ParseInt(s_item, 10, 64)
-			cNums := int64(1)
-			cNums, _ = strconv.ParseInt(c_nums[key], 10, 64)
-			cartItem := order_model.GetCartById(cId)
-			if cartItem == nil {
-				self.ReturnError(403, apps.NoExist, "", nil)
-			}
-			if cartItem.WxUserId != wxUId {
-				self.ReturnError(403, apps.AccountError, "", nil)
-			}
-			product := product_model.GetProductById(cartItem.ProductId, false)
-			if product == nil {
-				self.ReturnError(403, apps.NoExist, "", nil)
-			}
-			new(order_model.OrderDetail).Create(order.OrderId, order.Id, cartItem.ProductId, product.Price, product.RoboBalancePrice, product.Name,
-				cNums)
-		}
-	}
+	order.TotalPrice = totalPrice
+	order.Freight = freight
+	order.Save()
 	go ClearCart(order.UserId, order.OrderId)
 	type Order struct {
 		OrderId string `json:"order_id"`

+ 41 - 6
go/gopath/src/fohow.com/apps/controllers/pay_controller/after_pay_controller.go

@@ -573,7 +573,8 @@ func (self *PayController) wxPayExchangeAsync() {
 	order.Status = order_model.STATUS_PROCESSING
 	order.TradeNo = params.TransactionId
 	order.PayWay = order_model.PAY_WAY_WEIXIN
-	order.PaiedAt = time.Now().Unix() //支付时间存储秒级别
+	order.PaiedAt = time.Now().Unix()
+	order.PaiedTime = time.Now()
 	order.PaiedPrice = order.TotalPrice
 	if isSuccess := order.Save(); !isSuccess {
 		beego.BeeLogger.Error("weixinpay async return. save oId=%s fail", order.OrderId)
@@ -584,13 +585,47 @@ func (self *PayController) wxPayExchangeAsync() {
 	//go notice()
 	wxUser := user_model.GetWxUserById(order.WxUserId, true)
 	go newSendInviterBenefit(wxUser, order.OrderId, user_model.SOURCE_PRODUCT_BENEFIT)
-
+	//发放赠品
+	productId := int64(0)
+	if beego.AppConfig.String("RunMode") == "dev" {
+		productId = int64(91)
+	} else {
+		productId = order_model.SEND_PRODUCT_ID
+	}
+	//saleList := order_model.GetWxUserOrders(wxUser.Id)
+	//beego.BeeLogger.Error("en(saleList)=%d", len(saleList))
+	//	七月注册会员首单赠送赠品
+	if order.TotalPrice >= order_model.PROMOTION_TOTAL {
+		product := product_model.GetProductById(productId, false)
+		go order_model.SendCreate(order.OrderId, order.Id, productId, product.Price, product.Price, product.Name, int64(1))
+	}
+	//更新商品售量
+	go UpdatePdSaleNums(order)
 	notifyResponse["return_code"] = wx_mp.PAY_SUCCESS
 	beego.BeeLogger.Warn("商品购买微信支付回调通知,订单编号=%s  订单状态=%s", order.OrderId, order.Status)
 	self.Ctx.WriteString(wx_mp.MapToXmlString(notifyResponse))
 	return
 }
 
+//更新已售数量
+func UpdatePdSaleNums(order *order_model.Order) {
+	if order == nil {
+		return
+	}
+
+	orderDtList := order_model.GetAllDetailsOrderId(order.OrderId)
+
+	if len(orderDtList) == 0 {
+		return
+	}
+	SaleNumsMap := make(map[int64]int64)
+	for _, item := range orderDtList {
+		SaleNumsMap[item.ProductId] = item.Count
+	}
+
+	go order_model.UpdateSaleNums(SaleNumsMap)
+}
+
 //模板消息推送
 func TmplMsgNotice(order *order_model.Order) {
 	if order == nil {
@@ -610,7 +645,7 @@ func TmplMsgNotice(order *order_model.Order) {
 		codes = append(codes, tool.GetAssignLengthStr(item.Code, 6))
 	}
 
-	if wxUserGzh != nil {
+	/*	if wxUserGzh != nil {
 		openId := wxUserGzh.GzhOpenId
 		url := fmt.Sprintf("%s/activity/project/%d", beego.AppConfig.String("WxHost"), order.ProductSaleSubjectId)
 		title := fmt.Sprintf("购买成功!获取抽奖码:%s", strings.Join(codes, ","))
@@ -620,10 +655,10 @@ func TmplMsgNotice(order *order_model.Order) {
 		if order.PayWay == pay_model.PAYWAY_BALANCE {
 			paiedPrice = fmt.Sprintf("%d份共%d代金券", order.Count, order.TotalPrice)
 		}
-		paiedAt := time.Unix(order.PaiedAt, 0).Format("2006-01-02 15:04:05")
+		paiedAt := order.PaiedAt
 		remark := "备注:回复“我的抽奖号码”,可以看到您在当前活动的全部抽奖号码。\n了解更多内容请点击详情"
-		wx_mp.TmplmsgGetDrawCodeAfterPay(openId, url, title, pName, orderId, paiedPrice, paiedAt, remark)
-	}
+		//wx_mp.TmplmsgGetDrawCodeAfterPay(openId, url, title, pName, orderId, paiedPrice, paiedAt.Format("2016-05-04"), remark)
+	}*/
 }
 
 //微信支付预定优惠

+ 48 - 0
go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_cashcz_controller.go

@@ -0,0 +1,48 @@
+package pay_controller
+
+import (
+	"fmt"
+	"fohow.com/apps"
+	"fohow.com/apps/models/balance_model"
+	"fohow.com/libs/wx_mp"
+	"github.com/astaxie/beego"
+)
+
+//余额充值-微信支付
+func (self *PayController) wxPayCashcz(orderId string) {
+	//user := self.GetCurrentUser(true)
+	//if user == nil{
+	//	self.ReturnError(403, apps.NoExist, "", nil)
+	//}
+	wxUser := self.GetCurrentWxUser(true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+
+	//查询充值订单信息
+	reCashOrder := balance_model.GetRechargeCashOrderByOId(orderId, false)
+
+	if reCashOrder == nil {
+		self.ReturnError(403, apps.OrderNotExist, "", nil)
+	}
+	//不属于当前用户
+	if reCashOrder.WxUserId != wxUser.Id {
+		self.ReturnError(403, apps.OrderNotExist, "", nil)
+	}
+	//无法支付,该订单已支付或者已过期
+	if reCashOrder.State == 1 {
+		self.ReturnError(403, apps.NotUnPay, "", nil)
+
+	}
+	//获取预支付信息/v1/pay/:target:string/async/:payway:string
+	notifyUrl := fmt.Sprintf("%s/v1/pay/%s/async/%s", beego.AppConfig.String("ApiHost"), CASH_TARGET, balance_model.PAY_WAY_TYPE_RECHARGE_WXPAY) // rechargeCashOrder "recharge_wxpay"
+	body := "FOHOW玖玖-余额充值"
+	payData := wx_mp.GetPayDataLimitPay(wxUser.Openid, reCashOrder.OrderId, reCashOrder.TotalPrice, body, notifyUrl, self.Ctx.Input.IP())
+
+	//返回数据
+	type PayData struct {
+		PayData map[string]string `json:"pay_data"`
+	}
+	self.Data["json"] = &PayData{PayData: payData}
+	self.ServeJSON()
+}

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

@@ -67,9 +67,6 @@ func (self *PayController) Pay() {
 			self.ReturnError(403, apps.ParamsError, "", nil)
 		}
 	case EXCHANGE_TARGET: // 商品购买
-		//if tradPwd == "" {
-		//	self.ReturnError(500, apps.TradePasswordError, "", nil)
-		//}
 		self.payExchange(oId, payWay, tradPwd, returnUrl, source)
 
 	case CASH_TARGET:

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

@@ -0,0 +1,315 @@
+package pay_controller
+
+import (
+	"fmt"
+	// "net/url"
+	// "strings"
+	"time"
+
+	"github.com/astaxie/beego"
+	// "github.com/astaxie/beego/context"
+
+	"fohow.com/apps"
+	"fohow.com/apps/helpers"
+	"fohow.com/apps/models/address_model"
+	"fohow.com/apps/models/balance_model"
+	"fohow.com/apps/models/merchant_model"
+	"fohow.com/apps/models/order_model"
+	"fohow.com/apps/models/pay_model"
+	"fohow.com/apps/models/product_model"
+	"fohow.com/apps/models/user_model"
+	"fohow.com/libs/tool"
+	"fohow.com/libs/wx_mp"
+	"strings"
+	// "fohow.com/apps/models/wx_gongzhonghao_model"
+	"fohow.com/apps/models/exchange_model"
+	"fohow.com/apps/models/subject_model"
+	"sync"
+)
+
+var createDrawCode sync.Mutex
+var payOrder sync.Mutex
+
+//支付订单
+func (self *PayController) payExchange(oId, payWay, tradPwd, returnUrl, source string) {
+	payOrder.Lock()
+	defer payOrder.Unlock()
+	var payUrl string
+	var payData map[string]string
+	wxUId := self.GetCurrentWxUserId()
+	uId := self.GetCurrentUserId()
+
+	//地址
+	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)
+	}
+
+	//订单状态
+	order := order_model.GetOrderById(oId)
+	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)
+	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)
+		}
+		//秒杀逻辑: 判断是否处于秒杀时间段内
+		if product.SeckilShowPrice > 0 {
+			now := time.Now()
+			if now.Unix() < product.SeckillStart.Unix() {
+				self.ReturnError(403, []string{apps.SeckillNotStart[0], fmt.Sprintf("%s秒杀活动尚未开始", product.Name)}, "", nil)
+			} else if now.Unix() > product.SeckillEnd.Unix() {
+				self.ReturnError(403, []string{apps.SeckillIsEnd[0], fmt.Sprintf("%s秒杀活动已经结束", product.Name)}, "", nil)
+			}
+		}
+		buy_price_total += product.BuyPrice * item.Count
+		if payWay == order_model.PAY_WAY_WEIXIN { //微信支付总价
+			total_price += product.Price * item.Count
+		} else if payWay == order_model.PAY_WAY_BALANCE { //代金券支付总价
+			total_price += product.Price * item.Count
+		}
+		SaleNumsMap[product.Id] = item.Count
+	}
+	order.PayWay = payWay
+	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
+
+	switch payWay { // 1.代金券购买 2.微信支付
+	case pay_model.PAYWAY_BALANCE: // 代金券购买
+
+		curWxUser := user_model.GetWxUserById(wxUId, false)
+		if curWxUser == nil {
+			self.ReturnError(403, apps.UserNeedLogin, "", nil)
+		}
+		//黑名单用户
+		curUser := user_model.GetUserById(curWxUser.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)
+		}
+
+		userLeftBalanceCount := balance_model.GetUserTotalBalance(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 userLeftBalanceCount < tp {
+			self.ReturnError(403, apps.BalanceNotEnough, "", nil)
+		}
+
+		if tp > 0 {
+			source := balance_model.BALANCE_SOURCE_EXCHANGE_PRODUCT
+			remark := fmt.Sprintf("代金券兑换商品")
+			new(balance_model.Balance).Create(wxUId, uId, -tp, source, oId, remark)
+		}
+
+		//更新订单状态
+		order.Status = order_model.STATUS_PROCESSING
+		order.PaiedAt = time.Now().Unix()
+		order.PaiedTime = time.Now()
+		order.PaiedPrice = order.TotalPrice
+		order.PayWay = pay_model.PAYWAY_BALANCE
+		order.Source = source
+		order.Save()
+		//发放赠品
+		productId := int64(0)
+		if beego.AppConfig.String("RunMode") == "dev" {
+			productId = int64(91)
+		} else {
+			productId = order_model.SEND_PRODUCT_ID
+		}
+		//saleList := order_model.GetWxUserOrders(curWxUser.Id)
+		//beego.BeeLogger.Error("en(saleList)=%d", len(saleList))
+		//	七月注册会员首单赠送赠品
+		if order.TotalPrice >= order_model.PROMOTION_TOTAL {
+			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.UpdateSaleNums(SaleNumsMap)
+		//go CreateOrderNotify(order, product)
+		//wxUser := user_model.GetWxUserById(order.WxUserId, true)
+		//go sendInviterBenefit(wxUser, order.OrderId, user_model.SOURCE_PRODUCT_BENEFIT)
+		payUrl, payData = fmt.Sprintf("%s?order_id=%s", returnUrl, order.OrderId), nil
+		result := PayUrl{PayUrl: payUrl, PayData: payData, OrderId: order.OrderId}
+		self.Data["json"] = self.FormatResult([]interface{}{result})
+	case pay_model.PAYWAY_WEIXINPAY: // 微信支付
+
+		wxUser := self.GetCurrentWxUser(false)
+
+		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.Source = source
+		order.Save()
+
+		if order.Source == order_model.SOURCE_XCX { //小程序微信支付
+			freight := order_model.FREIGHT
+			if order.TotalPrice >= order_model.FREIGHT_LIMIT || beego.AppConfig.String("RunMode") == "dev" {
+				freight = int64(0)
+			}
+			order.TotalPrice += freight
+			notifyUrl := fmt.Sprintf("%s/v1/pay/%s/async/%s", beego.AppConfig.String("ApiHost"), EXCHANGE_TARGET, pay_model.PAYWAY_WEIXINPAY)
+			body := fmt.Sprintf("FOHOW玖玖-购买商品")
+			payData := wx_mp.GetPayData(wxUser.Openid, order.OrderId, order.TotalPrice, body, notifyUrl, self.Ctx.Input.IP())
+
+			//返回数据
+			type PayData struct {
+				PayData map[string]string `json:"pay_data"`
+			}
+			self.Data["json"] = &PayData{PayData: payData}
+
+		} else { //公众号微信支付
+
+			notifyUrl := fmt.Sprintf("%s/v1/pay/%s/async/%s", beego.AppConfig.String("ApiHost"), EXCHANGE_TARGET, pay_model.PAYWAY_WEIXINPAY)
+			body := fmt.Sprintf("FOHOW玖玖-购买商品")
+			wxGzh := user_model.GetWxUserGzhByWxUIdAndAppId(wxUser.Id, beego.AppConfig.String("WxMPAppId"), false)
+			if wxGzh == nil {
+				self.ReturnError(403, apps.NoExist, "", nil)
+			}
+			//payData := wx_mp.GetPayData(wxGzh.GzhOpenId, order.OrderId , order.TotalPrice, body,notifyUrl, self.Ctx.Input.IP())
+			payData := wx_mp.GetGzhPayData(wxGzh.GzhOpenId, order.OrderId, order.TotalPrice, body, notifyUrl, self.Ctx.Input.IP())
+
+			//返回数据
+			type PayData struct {
+				PayData map[string]string `json:"pay_data"`
+			}
+			self.Data["json"] = &PayData{PayData: payData}
+		}
+	default:
+		beego.BeeLogger.Error("pay way not match, payway:%s", payWay)
+	}
+	self.ServeJSON()
+}
+
+//用户支付成功,后给卖家所有管理员发下单通知
+func CreateOrderNotify(order *order_model.Order, product *product_model.Product) {
+	merchantUserList := merchant_model.GetMerchantUserRelationListByMerchantId(product.MerchantId, true)
+	for _, item := range merchantUserList {
+		if item == nil {
+			continue
+		}
+		isManageTheProduct, _ := tool.Contain(fmt.Sprintf("%d", product.Id), strings.Split(item.ManageProductIds, ","))
+		if item.ManageProductIds == "0" || isManageTheProduct {
+			sellerWxUser := user_model.GetWxUserByUserId(item.UserId, true)
+			if sellerWxUser != nil {
+				helpers.OrderCreateNotify(*sellerWxUser, order.CreatedAt, product.Name, order.OrderId, "您有新的商品订单,请及时处理发货。", order_model.STATUS_CN_TEXT[order.Status], order.Count, fmt.Sprintf("pages/start/start?url=packageMerchant/pages/merchant/orders/orders&id=%d", item.MerchantId))
+			}
+		}
+	}
+}
+
+func (self *PayController) CheckBalanceBeforePayExchange() {
+	oId := self.GetString("order_id")
+
+	//user := self.GetCurrentUser(false)
+	//if user == nil {
+	//	self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	//}
+	wxUser := self.GetCurrentWxUser(false)
+	if wxUser == nil {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+
+	order := order_model.GetOrderById(oId)
+	if order == nil || order.WxUserId != wxUser.Id {
+		self.ReturnError(404, apps.OrderNotExist, "", nil)
+	}
+	if order.Status != order_model.STATUS_UNPAY {
+		self.ReturnError(403, apps.NotUnPay, "", nil)
+	}
+
+	type Ret struct {
+		LackLuoboCount int64 `json:"lack_luobo_count"`
+		RechargeMoney  int64 `json:"need_recharge_money"`
+	}
+
+	userLeftBalanceCount := balance_model.GetUserTotalBalance(wxUser.Id)
+	tp := order.UnitRoboBalancePrice * order.Count
+	lackCount := tp - userLeftBalanceCount //(订单金额-用户剩余代金券1000-500=500,1000-2000=-1000,1000-1000=0)
+	if lackCount < 0 {
+		lackCount = 0
+	}
+
+	self.Data["json"] = &Ret{LackLuoboCount: lackCount, RechargeMoney: lackCount}
+	self.ServeJSON()
+}
+
+//处理生成抽奖码
+func CreateDrawCode(order *order_model.Order) {
+
+	createDrawCode.Lock()
+	defer createDrawCode.Unlock()
+
+	subject := subject_model.GetProductSaleSubjectById(order.ProductSaleSubjectId, true)
+	if subject == nil {
+		return
+	}
+	for i := int64(1); i <= order.Count; i++ {
+		drawCode := subject_model.GetLastSaleDrawCodeBySubjectId(order.ProductSaleSubjectId)
+		if drawCode == nil {
+			new(subject_model.SaleDrawCode).Create(int64(1), order.WxUserId, order.ProductSaleSubjectId, order.OrderId)
+		} else {
+			new(subject_model.SaleDrawCode).Create(drawCode.Code+1, order.WxUserId, order.ProductSaleSubjectId, order.OrderId)
+		}
+	}
+	go TmplMsgNotice(order)
+}
+
+func AnalyseMallBalance(user *user_model.User, platform *exchange_model.Platform, order *order_model.Order) bool {
+
+	if user != nil {
+		//查询是否在通用白名单上
+		if user.IsUnlimitPayProduct {
+			return true
+		}
+		//第五创查询
+		resultAnalyse := helpers.AnalysePlatformMallBalance(platform.Secret, user.Tel, helpers.ANALYSE_URL)
+		beego.BeeLogger.Warn("pay_controller.AnalyseMallBalance().Platform analyse retMsg:%v", resultAnalyse)
+		//查询错误,则提示用户错误请稍后重试
+		if resultAnalyse == nil || resultAnalyse.Normal == helpers.UNNORMAL {
+			return false
+		} else if resultAnalyse.Normal == helpers.UNNORMAL_POINT_TASK {
+			//非正常的代金券任务刷子,不能继续支付,关闭订单,且更新为黑名单用户
+			order.Status = order_model.STATUS_CLOSED
+			order.Save()
+			user.IsBlackUser = 1
+			user.Save()
+			return false
+		} else if resultAnalyse.Normal == helpers.NORMAL {
+			user.IsUnlimitPayProduct = true
+			user.Save()
+		}
+	}
+	return true
+}

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

@@ -14,6 +14,7 @@ func (self *PayController) CreateBalanceOrder() {
 	//校验兑换代金券数量,为正整数
 	//count, _ := self.GetInt64("count") //兑换数量
 	count := balance_model.BALANCE_PAIED
+
 	if count <= 0 {
 		self.ReturnError(403, apps.RechargeCountWrong, "", nil)
 	}

+ 29 - 36
go/gopath/src/fohow.com/apps/controllers/permit_controller/permit_controller.go

@@ -105,50 +105,43 @@ func (self *PermitController) XcxAuthorize() {
 		self.ReturnError(403, apps.UserAuthorizeFailed, "", nil)
 	}
 	wxUser := user_model.GetWxUserByUnionid(encryptedData.UnionId, false)
+	ip := self.Ctx.Input.IP()
+	//注册会员
+	user := user_model.Create("", ip)
+	if user == nil {
+		self.ReturnError(403, apps.RegisterUserError, "", nil)
+	}
 	if wxUser != nil {
 		wxUser.Openid = encryptedData.OpenId
 	} else {
-		introUserId := int64(0)
+		introUserId := int64(1)
 		if inviteId == int64(0) {
 			inviteId = int64(1)
-			introUserId = int64(1)
 		}
-		ip := self.Ctx.Input.IP()
-		wxUser = new(user_model.WxUser).QuickCreate(encryptedData.OpenId, encryptedData.UnionId, ip, channel, time.Now().Unix())
 		beego.BeeLogger.Warn("XcxAuthorize_quickCreate_inviteId:%d", inviteId)
-		wxUser.InviteId = inviteId
-		inviter := user_model.GetWxUserById(inviteId, true)
-		if inviter.ShowInviteMode == 1 && inviteId != int64(1) {
-			introUserId = inviter.Id
-		} else {
-			introUserId = inviter.IntroUserId
-		}
-		wxUser.IntroUserId = introUserId
-		//设定会员内部编号
-		introArea := user_model.GetAvailableIntroArea(inviter.Id)
-		introInnerNo := inviter.IntroInnerNo + introArea
-		wxUser.IntroArea = introArea
-		wxUser.IntroInnerNo = introInnerNo
-
-		//注册会员
-		user := user_model.Create("", ip)
-		if user == nil {
-			self.ReturnError(403, apps.RegisterUserError, "", nil)
-		}
-		wxUser.UserId = user.Id
-		user.Nickname = wxUser.Nickname
-		user.Country = wxUser.Country
-		user.Province = wxUser.Province
-		user.City = wxUser.City
-		user.Sex = wxUser.Sex
-		//参数第一,cookie第二
-		cId, _ := strconv.ParseInt(self.Ctx.GetCookie("sign_up_channel"), 10, 64)
-		user.SignupChannelId = cId
-		user.Save()
-		if user != nil {
-			self.SetSession(apps.SessionUserKey, user.Id)
+		inviter := user_model.GetWxUserById(inviteId, false)
+		if inviter != nil {
+			if inviter.ShowInviteMode == 1 && inviteId != int64(1) {
+				introUserId = inviter.Id
+			} else {
+				introUserId = inviter.IntroUserId
+			}
 		}
-	}
+		wxUser = new(user_model.WxUser).QuickCreate(encryptedData.OpenId, encryptedData.UnionId, ip, channel, time.Now().Unix(), user.Id, inviteId, introUserId)
+	}
+	user.Nickname = wxUser.Nickname
+	user.Country = wxUser.Country
+	user.Province = wxUser.Province
+	user.City = wxUser.City
+	user.Sex = wxUser.Sex
+	//参数第一,cookie第二
+	cId, _ := strconv.ParseInt(self.Ctx.GetCookie("sign_up_channel"), 10, 64)
+	user.SignupChannelId = cId
+	user.Save()
+	if user != nil {
+		self.SetSession(apps.SessionUserKey, user.Id)
+	}
+	//wxUser.UserId = user.Id
 	wxUser.Nickname = info.UserInfo.NickName
 	wxUser.Sex = info.UserInfo.Gender
 	wxUser.City = info.UserInfo.City

+ 10 - 25
go/gopath/src/fohow.com/apps/controllers/product_controller/product_controller.go

@@ -9,7 +9,6 @@ import (
 	// "github.com/astaxie/beego"
 
 	"fohow.com/apps"
-	"fohow.com/apps/models/granary_model"
 	"fohow.com/apps/models/order_model"
 	"fohow.com/apps/models/product_model"
 	// "fohow.com/apps/models/user_model"
@@ -38,13 +37,9 @@ func (self *ProductController) Latest() {
 	pds := product_model.GetLatest(page, perPage, recommend, cache)
 	count := product_model.GetLatestCount(recommend, cache)
 	for _, pd := range pds {
-		pd.SoldCount = order_model.GetSoldCountByPId(pd.Id, cache)
-		if pd.Ptype == product_model.TYPE_USER_SALE {
-			pd.LeftCount = granary_model.GetSaleOrderLeftCountByPId(pd.Id)
-		} else {
-			if pd.Count > pd.SoldCount {
-				pd.LeftCount = pd.Count - pd.SoldCount
-			}
+		pd.SoldCount = pd.SaleNums
+		if pd.Count > pd.SoldCount {
+			pd.LeftCount = pd.Count - pd.SoldCount
 		}
 		pd.SoldCount = pd.SoldCount + pd.VirtualSoldCount
 		if pd.SeckilShowPrice > 0 {
@@ -83,20 +78,14 @@ func (self *ProductController) Get() {
 		self.ReturnError(403, apps.NoExist, "", nil)
 	}
 
-	pd.SoldCount = order_model.GetSoldCountByPId(pId, cache)
-	//代销商品特殊计算库存
-	if pd.Ptype == product_model.TYPE_USER_SALE {
-		pd.LeftCount = granary_model.GetSaleOrderLeftCountByPId(pId)
-	} else {
-		if pd.Count > pd.SoldCount {
-			pd.LeftCount = pd.Count - pd.SoldCount
-		}
+	pd.SoldCount = pd.SaleNums
+	if pd.Count > pd.SoldCount {
+		pd.LeftCount = pd.Count - pd.SoldCount
 	}
-
 	pd.SoldCount = pd.SoldCount + pd.VirtualSoldCount
 	pd.Cover = product_model.GetCoverByPId(pId, cache)
 	pd.Album = product_model.GetPicturesByPIdAndPType(pId, product_model.PIC_TYPE_ALBUM, cache)
-	pd.ShareImg = self.GetFullImgUrl(pd.ShareImg)
+	pd.ShareImg = self.GetCdnFullImgUrl(pd.ShareImg)
 
 	if pd.SeckilShowPrice > 0 {
 		now := time.Now()
@@ -159,13 +148,9 @@ func (self *ProductController) GetProductsByCat() {
 	list := product_model.GetProductsByCatId(catId, page, perPage, cache)
 	count := product_model.GetProductCountByCatId(catId, cache)
 	for _, pd := range list {
-		pd.SoldCount = order_model.GetSoldCountByPId(pd.Id, cache)
-		if pd.Ptype == product_model.TYPE_USER_SALE {
-			pd.LeftCount = granary_model.GetSaleOrderLeftCountByPId(pd.Id)
-		} else {
-			if pd.Count > pd.SoldCount {
-				pd.LeftCount = pd.Count - pd.SoldCount
-			}
+		pd.SoldCount = pd.SaleNums
+		if pd.Count > pd.SoldCount {
+			pd.LeftCount = pd.Count - pd.SoldCount
 		}
 		pd.SoldCount = pd.SoldCount + pd.VirtualSoldCount
 		if pd.SeckilShowPrice > 0 {

+ 5 - 11
go/gopath/src/fohow.com/apps/controllers/seckill_controller/seckill_controller.go

@@ -1,13 +1,11 @@
 package seckill_controller
 
 import (
-	"github.com/astaxie/beego"
-	"github.com/astaxie/beego/context"
 	"fohow.com/apps"
-	"fohow.com/apps/models/granary_model"
-	"fohow.com/apps/models/order_model"
 	"fohow.com/apps/models/product_model"
 	"fohow.com/libs/tool"
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/context"
 	"time"
 )
 
@@ -113,13 +111,9 @@ func (self *SeckillController) GetSeckillProducts() {
 	products := product_model.GetSeckillProducts(queryDate, useCache)
 
 	for _, pd := range products {
-		pd.SoldCount = order_model.GetSoldCountByPId(pd.Id, useCache)
-		if pd.Ptype == product_model.TYPE_USER_SALE {
-			pd.LeftCount = granary_model.GetSaleOrderLeftCountByPId(pd.Id)
-		} else {
-			if pd.Count > pd.SoldCount {
-				pd.LeftCount = pd.Count - pd.SoldCount
-			}
+		pd.SoldCount = pd.SaleNums
+		if pd.Count > pd.SoldCount {
+			pd.LeftCount = pd.Count - pd.SoldCount
 		}
 		pd.SoldCount = pd.SoldCount + pd.VirtualSoldCount
 

+ 1 - 1
go/gopath/src/fohow.com/apps/models/balance_model/balance.go

@@ -25,7 +25,7 @@ const (
 	BALANCE_PAIED       = int64(300000) //升级支付金额
 	BALANCE_BL          = int64(8)      //群主推荐比例
 	RECHARGE_BALANCE_BL = int64(85)     //群主优惠比例
-	AWARD_UPGRADE       = int64(54000)  //升级群主奖励
+	AWARD_UPGRADE       = int64(24000)  //升级群主奖励
 
 	ORDER_ID_PREFIX_CZ = "CZ" //充值
 

+ 45 - 68
go/gopath/src/fohow.com/apps/models/order_model/order.go

@@ -49,8 +49,10 @@ const (
 	ORDER_COW_BUY     = 3
 	ORDER_COW_CHANGE  = 4
 
-	FREIGHT_LIMIT = int64(9900)
-	FREIGHT       = int64(500)
+	FREIGHT_LIMIT   = int64(9900)
+	FREIGHT         = int64(500)
+	PROMOTION_TOTAL = int64(9900)
+	SEND_PRODUCT_ID = int64(98)
 )
 
 var STATUS_CN_TEXT = map[string]string{
@@ -104,11 +106,12 @@ type Order struct {
 	Freight              int64                    `orm:"column(freight);null"                            json:"freight"`              // int(11)
 	DispatchTime         time.Time                `orm:"column(dispatch_time);null;type(datetime)"           json:"dispatch_time"`
 	ReceiveTime          time.Time                `orm:"column(receive_time);null;type(datetime)"            json:"receive_time"`
-	IsPartRefund         int64                    `orm:"column(is_part_refund);null"                         json:"-"` // int(11)
-	PlatformRefundAmount int64                    `orm:"column(platform_refund_amount);null"                 json:"-"` // int(11)
-	MerchantRefundAmount int64                    `orm:"column(merchant_refund_amount);null"                 json:"-"` // 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
+	IsPartRefund         int64                    `orm:"column(is_part_refund);null"                         json:"-"`          // int(11)
+	PlatformRefundAmount int64                    `orm:"column(platform_refund_amount);null"                 json:"-"`          // int(11)
+	MerchantRefundAmount int64                    `orm:"column(merchant_refund_amount);null"                 json:"-"`          // int(11)
+	PaiedTime            time.Time                `orm:"column(paied_time);null;type(datetime)"              json:"paied_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
 	WxUser               *user_model.WxUser       `orm:"-"                                 json:"wx_user"`
 	ProductList          []*product_model.Product `orm:"-"                                 json:"product_list"` // varchar(255)
 	IsJoinSubjectPrize   bool                     `orm:"column(is_join_subject_prize)"     json:"-"`            // int(11)
@@ -355,6 +358,26 @@ func GetUserSaleOrders() (orders []*Order) {
 	return orders
 }
 
+//获取用户订单列表
+func GetWxUserOrders(wxUId int64) (orders []*Order) {
+
+	sql := `
+		SELECT
+			*
+		FROM
+			orders
+		WHERE
+			wx_user_id = %d And status in ("%s","%s","%s");
+	`
+	sql = fmt.Sprintf(sql, wxUId, STATUS_DISPATCH, STATUS_PROCESSING, STATUS_COMPLETE)
+
+	if _, err := orm.NewOrm().Raw(sql).QueryRows(&orders); err != nil {
+		return nil
+	}
+
+	return orders
+}
+
 //获取用户订单列表-总数
 func GetUserOrdersCount(wxUId int64, status string) int64 {
 	order := new(Order)
@@ -382,18 +405,13 @@ func GetSoldCountByPId(pId int64, useCache bool) int64 {
 	o := orm.NewOrm()
 	new_tbn := "order_details"
 	tbn := new(Order).TableName()
-	sql := fmt.Sprintf("SELECT sum(`nums`) as count FROM `%s` WHERE order_id in ( select order_id from `%s` where  status not in (?, ?) ) and product_id=?;", new_tbn, tbn)
+	sql := fmt.Sprintf("SELECT sum(`nums`) as count FROM `%s` WHERE order_id in ( select id from `%s` where  status not in (?, ?) ) and product_id=?;", new_tbn, tbn)
 	err := o.Raw(sql, STATUS_CLOSED, STATUS_UNPAY, pId).QueryRow(ret)
 	if err != nil {
 		beego.BeeLogger.Error("GetSoldCountByPId err=[%s]", err)
 		return 0
 	}
-	// return ret.Total, ret.Count
-	// order := new(Order)
-	// qs := orm.NewOrm().QueryTable(order)
-	// qs = qs.Filter("product_id", pId).Exclude("status", STATUS_UNPAY)
 
-	// count, _ := qs.Count()
 	cache.Cache.Put(k, ret.Count, 10*time.Minute)
 	return ret.Count
 }
@@ -743,61 +761,6 @@ func GetOrderByOrderRemark(remark string, useCache bool) (item *Order) {
 	return item
 }
 
-// type ExpressCompany struct {
-// 	Name    string `json:"name"`
-// 	Value   string `json:"value"`
-// 	Kuaidi  string `json:"kuaidi"`
-// 	Website string `json:"website"`
-// }
-
-// // 取快递公司相关信息
-// func GetExpressCompany(company string) *ExpressCompany {
-
-// 	ec := new(ExpressCompany)
-// 	ec.Value = company
-// 	if company == "" {
-// 		ec.Name = "请选择"
-// 		ec.Kuaidi = ""
-// 		ec.Website = ""
-// 	}
-// 	switch company {
-// 	case "sf-express":
-// 		{
-// 			ec.Name = "顺丰速运"
-// 			ec.Kuaidi = "shunfeng"
-// 			ec.Website = "http://www.sf-express.com/cn/sc/"
-// 		}
-// 	}
-// 	// {:name => "人工派送", :value => 'person', :kuaidi => "",     :website => ""},
-// 	//    {:name => "空中充值", :value => 'pay',    :kuaidi => "",     :website => ""},
-// 	//    {:name => "无效订单", :value => 'invalid_order', :kuaidi => "",:website => ""},
-// 	//    {:name => "兑换密码", :value => 'pwd',         :kuaidi => "",:website => ""},
-// 	//    {:name => "到店消费", :value => 'shop-to-use', :kuaidi => "",:website => ""},
-// 	//    {:name => "到店领取", :value => 'shop-to-get', :kuaidi => "",:website => ""},
-// 	//    {:name => "点币自动到账", :value => 'dianbi_auto', :kuaidi => "",:website => ""},
-// 	//    {:name => "申通快递", :value => 'sto',         :kuaidi => "shentong",:website => "http://www.sto.cn/"},
-// 	//    {:name => "加运美",   :value => 'tms56',       :kuaidi => "jiayunmeiwuliu",:website => "www.tms56.com"},
-// 	//    {:name => "圆通速递", :value => 'yto',         :kuaidi => "yuantong",:website => "http://www.yto.net.cn/"},
-// 	//    {:name => "中通快递", :value => 'zto',         :kuaidi => "zhongtong",:website => "http://www.zto.cn/"},
-// 	//    {:name => "邮政EMS",  :value => 'ems',         :kuaidi => "ems",:website => "http://www.ems.com.cn/"},
-// 	//    {:name => "中国邮政", :value => 'chinapost',   :kuaidi => "youzhengguonei",:website => "http://yjcx.chinapost.com.cn/"},
-// 	//    {:name => "韵达快递", :value => 'yundaex',     :kuaidi => "yunda",:website => "http://www.yundaex.com/"},
-// 	//    {:name => "天天快递", :value => 'ttkdex',      :kuaidi => "tiantian",:website => "http://www.ttkdex.com/"},
-// 	//    {:name => "百世汇通", :value => '800bestex',   :kuaidi => "huitongkuaidi",:website => "http://www.800bestex.com/"},
-// 	//    {:name => "优速快递", :value => 'uc56',        :kuaidi => "youshuwuliu",:website => "http://www.uc56.com"},
-// 	//    {:name => "宅急送",   :value => 'zjs',         :kuaidi => "zhaijisong",:website => "http://www.zjs.com.cn/"},
-// 	//    {:name => "德邦物流", :value => 'deppon',      :kuaidi => "debangwuliu",:website => "http://www.deppon.com/"},
-// 	//    {:name => "全峰快递", :value => 'qfkd',        :kuaidi => "quanfengkuaidi",:website => "http://www.qfkd.com.cn/"},
-// 	//    {:name => "国通快递", :value => 'gto365',      :kuaidi => "guotongkuaidi",:website => "http://www.gto365.com/"},
-// 	//    {:name => "信丰物流", :value => 'xf-express',  :kuaidi => "xinfengwuliu",:website => "http://www.xf-express.com.cn/"},
-// 	//    {:name => "快捷快递", :value => 'kjkd',        :kuaidi => "kuaijiesudi",:website => "http://www.kjkd.com"},
-// 	//    {:name => "增益速递", :value => 'zeny-express',:kuaidi => "",:website => "http://www.zeny-express.com"},
-// 	//    {:name => "万象物流", :value => 'ewinshine',:kuaidi => "",:website => "http://www.ewinshine.com/"},
-// 	//    {:name => "京东物流", :value => 'jd-ex',:kuaidi => "",:website => "http://www.jd-ex.com/"},
-// 	// {:name => "退款",     :value => 'refund',      :kuaidi => "",:website => ""}
-// 	return ec
-
-// }
 //查询用户购买某个商品的订单总数
 func GetOrderCountByPIdAndWxUId(pId, wxUId int64) int64 {
 
@@ -932,3 +895,17 @@ func GetPaiedOrderByWxUIdAndPayWayLimitOne(wxUserId int64, payWay string, useCac
 	cache.Cache.Put(k, item, 10*time.Minute)
 	return item
 }
+
+//更新商品已售数量
+func UpdateSaleNums(saleProducts map[int64]int64) bool {
+
+	for pId, nums := range saleProducts {
+		product := product_model.GetProductById(pId, true)
+		if product == nil {
+			continue
+		}
+		product.SaleNums += nums
+		product.Save()
+	}
+	return true
+}

+ 27 - 3
go/gopath/src/fohow.com/apps/models/order_model/order_detail.go

@@ -18,9 +18,10 @@ const (
 )
 
 type OrderDetail struct {
-	Id                   int64     `orm:"column(id);pk"                                       json:"id"`           // int(11)
-	ProductId            int64     `orm:"column(product_id)"                                  json:"product_id"`   // int(11)
-	OrderId              int64     `orm:"column(order_id)"                                  json:"-"`              // int(11)
+	Id                   int64     `orm:"column(id);pk"                                       json:"id"`         // int(11)
+	ProductId            int64     `orm:"column(product_id)"                                  json:"product_id"` // int(11)
+	OrderId              int64     `orm:"column(order_id)"                            json:"-"`                  // int(11)
+	Send                 bool      `orm:"column(is_zeng)"                                json:"send"`
 	OrderNo              string    `orm:"column(order_no)"                            json:"order_id"`             // varchar(64)
 	Price                int64     `orm:"column(price)"                                       json:"price"`        // int(11)
 	CreatedAt            time.Time `orm:"column(created_at);null;auto_now_add;type(datetime)" json:"-"`            // datetime
@@ -47,6 +48,29 @@ func (self *OrderDetail) Create(oId string, orderId, pId, pPrice, unitRoboBalanc
 		Price:                pPrice,
 		UnitRoboBalancePrice: unitRoboBalancePrice,
 		ProductName:          pName,
+		Send:                 false,
+	}
+	id, err := orm.NewOrm().Insert(item)
+	if err != nil {
+		beego.BeeLogger.Error("insert order item err=[%s]", err)
+		return nil
+	}
+	item.Id = id
+	return item
+}
+
+//创建订单项
+func SendCreate(oId string, orderId, pId, pPrice, unitRoboBalancePrice int64, pName string,
+	pCount int64) *OrderDetail {
+	item := &OrderDetail{
+		OrderNo:              oId,
+		OrderId:              orderId,
+		Count:                pCount,
+		ProductId:            pId,
+		Price:                pPrice,
+		UnitRoboBalancePrice: unitRoboBalancePrice,
+		ProductName:          pName,
+		Send:                 true,
 	}
 	id, err := orm.NewOrm().Insert(item)
 	if err != nil {

+ 8 - 203
go/gopath/src/fohow.com/apps/models/product_model/product.go

@@ -50,6 +50,7 @@ type Product struct {
 	BuyPrice         int64      `orm:"column(buy_price)"                                   json:"-"`                  // int(11)
 	UserSalePrice    int64      `orm:"column(user_sale_price)"                             json:"user_sale_price"`    // int(11)
 	Count            int64      `orm:"column(count)"                                   json:"-"`                      // int(11)
+	SaleNums         int64      `orm:"column(sale_nums)"                                   json:"-"`                  // int(11)
 	LeftCount        int64      `orm:"-"                                   json:"left_count"`                         // int(11)
 	Recommend        int64      `orm:"column(recommend);null"                              json:"-"`                  // int(11)
 	Status           int64      `orm:"column(status);null"                                 json:"-"`                  // tinyint(1)
@@ -292,206 +293,10 @@ func GetSeckillOnOffSeckillTimeByDate(queryDate string, useCache bool) *OnOffSec
 	return item
 }
 
-// type MenuSubProduct struct {
-// 	Price         float64 `orm:"-"      json:"price"`
-// 	OriginalPrice float64 `orm:"-"      json:"original_price"`
-// 	Cover         string  `orm:"-"      json:"cover"`
-// 	VipPrice      float64 `orm:"-"      json:"vip_price"`
-// }
-// type GroupProduct struct {
-// 	Id    int64  `orm:"-"      json:"id"`
-// 	Name  string `orm:"-"      json:"name"`
-// 	Cover string `orm:"-"      json:"cover"`
-// }
-
-// type Product struct {
-// 	Id                  int64             `orm:"column(id);pk"                                           json:"id"`     // int(11)
-// 	ShopId              int64             `orm:"-"                                         json:"-"`                    // int(11)
-// 	Name                string            `orm:"column(name)"                                            json:"name"`   // varchar(100)
-// 	Brand               int64             `orm:"column(brand);null"                                json:"brand"`        // int(11) 商品分类
-// 	Way                 int64             `orm:"column(way);null"                                json:"way"`            // int(11) 商品分类
-// 	CategoryId          int64             `orm:"-"                                json:"-"`                             // int(11) 商品分类
-// 	CreatedAt           time.Time         `orm:"column(created_at);auto_now_add;type(datetime)"          json:"-"`      // datetime
-// 	UpdatedAt           time.Time         `orm:"column(updated_at);auto_now;type(datetime)"              json:"-"`      // datetime
-// 	State               int64             `orm:"column(state)"                                          json:"-"`       // enum('no','yes','inactive','approved')
-// 	Status              string            `orm:"-"                                          json:"-"`                   // enum('no','yes','inactive','approved')
-// 	Sort                int64             `orm:"column(sort)"                                            json:"-"`      // int(11)
-// 	Price               float64           `orm:"column(price);digits(10);decimals(2)"                    json:"price"`  // decimal(10,2)
-// 	VipPrice            float64           `orm:"-"                    json:"-"`                                         // decimal(10,2)
-// 	Detail              string            `orm:"column(detail);null"                                     json:"detail"` // text
-// 	ProductCategoryId   int64             `orm:"-"                             json:"-"`                                // int(11)
-// 	Stock               int64             `orm:"column(stock)"                                        json:"stock"`     // int(11)
-// 	Quantity            int64             `orm:"-"                                        json:"-"`                     // int(11)
-// 	MinPrice            float64           `orm:"-"                json:"-"`                                             // decimal(10,2)
-// 	Tags                string            `orm:"column(tags);null"                                       json:"tags"`   // varchar(255)
-// 	AliCssUpdatedAt     time.Time         `orm:"column(ali_css_updated_at);null;auto_now;type(datetime)" json:"-"`      // datetime
-// 	CheckQty            int64             `orm:"-"                                       json:"-"`                      // int(11)
-// 	BoughtPrice         float64           `orm:"column(bought_price);digits(10);decimals(2)"             json:"-"`      // decimal(10,2)
-// 	Recommend           int64             `orm:"-"                                       json:"-"`                      // int(11)
-// 	Carriage            int64             `orm:"-"                                        json:"-"`                     // int(11)
-// 	FreeShipQty         int64             `orm:"-"                                   json:"-"`                          // int(11)
-// 	ProductGroupId      int64             `orm:"-"                                json:"-"`                             // int(11)
-// 	OriginalPrice       float64           `orm:"column(original_price);null;digits(10);decimals(2)"      json:"-"`      // decimal(10,2)
-// 	CommentAverageStart float64           `orm:"-"                                  json:"-"`                           // int(11)
-// 	MemberId            int64             `orm:"-"             json:"-"`                                                // int(11)
-// 	CommentCount        int64             `orm:"-"                                  json:"-"`                           // int(11)
-// 	CanKj               bool              `orm:"-"                                  json:"-"`                           // int(11)
-// 	BargainKjAt         time.Time         `orm:"-"               json:"-"`                                              // datetime
-// 	ShortName           string            `orm:"column(short_name)"                                     json:"-"`       // varchar(10)
-// 	Cover               string            `orm:"column(cover)" json:"cover"`                                            // varchar(255)
-// 	Album               []*ProductPicture `orm:"-" json:"-"`
-// 	SaleCount           int64             `orm:"-" json:"sale_count"`
-// 	CategoryName        string            `orm:"-" json:"-"`
-// 	Shop                *ProductShop      `orm:"-" json:"-"`
-// 	ProductAttrs        []*ProductAttrs   `orm:"-" json:"-"`
-// 	Groups              []*GroupProduct   `orm:"-" json:"-"`
-// 	// 这两个字段是专门给姨妈巾商品,表示长度和质地的,从tags的前两个获取
-// 	Length   string `orm:"-" json:"length"`
-// 	Material string `orm:"-" json:"material"`
-// }
-
-// type ProductShop struct {
-// 	Id          int64  `orm:"-"                               json:"id"`           // int(11)
-// 	Name        string `orm:"-"                               json:"name"`         // varchar(40) 商家名称
-// 	Tel         string `orm:"-"                               json:"tel"`          // varchar(40)电话
-// 	Province    string `orm:"-"                               json:"province"`     // varchar(10)省份
-// 	City        string `orm:"-"                               json:"city"`         // varchar(10)城市
-// 	Address     string `orm:"-"                               json:"address"`      // varchar(100)地址
-// 	FullAddress string `orm:"-"                               json:"full_address"` // varchar(100)省份+城市+地址
-// 	Head        string `orm:"-"                               json:"head"`         // varchar(100)
-// }
-
-// type ProductAttrs struct {
-// 	Name   string               `orm:"-"                               json:"name"`   // int(11)
-// 	Values []*ProductAttrValues `orm:"-"                               json:"values"` // varchar(40) 商家名称
-
-// }
-
-// type ProductAttrValues struct {
-// 	Id     int64                    `orm:"-"                               json:"id"`     // int(11)
-// 	Name   string                   `orm:"-"                               json:"name"`   // varchar(40) 商家名称
-// 	Color  string                   `orm:"-"                               json:"color"`  // varchar(40)电话
-// 	Custom *ProductAttrValuesCustom `orm:"-"                               json:"custom"` // varchar(10)省份
-
-// }
-// type ProductAttrValuesCustom struct {
-// 	Enabled bool   `orm:"-"                               json:"enabled"` // int(11)
-// 	Name    string `orm:"-"                               json:"name"`    // varchar(40) 商家名称
-// 	Pic     string `orm:"-"                               json:"pic"`     // varchar(40)电话
-
-// }
-
-// func GetMenuProductById(product_id int64, useCached bool) (product *MenuSubProduct) {
-// 	p := GetProductById(product_id, useCached)
-// 	product = &MenuSubProduct{OriginalPrice: p.OriginalPrice, Price: p.Price, Cover: p.GetCover(), VipPrice: 0}
-// 	return product
-
-// }
-
-// func GetProductsByBrandAndWay(brand, way int64, page, perPage int) (products []*Product) {
-// 	o := orm.NewOrm()
-// 	product := new(Product)
-// 	qs := o.QueryTable(product)
-// 	if brand != 0 {
-// 		qs = qs.Filter("brand", brand)
-// 	}
-// 	if way != 0 {
-// 		qs = qs.Filter("way", way)
-// 	}
-// 	_, err := qs.Filter("state", 1).Filter("stock__gt", 0).
-// 		OrderBy("-sort", "-created_at").
-// 		Limit(perPage, (page-1)*perPage).
-// 		All(&products)
-// 	if err != nil {
-// 		beego.BeeLogger.Error("GetProductsByBrandAndWay err=%s", err)
-// 	}
-// 	return products
-
-// }
-
-// func (self *Product) GetSaleCount() int64 {
-// 	r := (time.Now().Unix() - self.CreatedAt.Unix()) / (3600 * 12)
-// 	// beego.BeeLogger.Error("======%d,%d,%d", r, time.Now().Unix(), self.CreatedAt.Unix())
-// 	type Count struct {
-// 		Count int64
-// 	}
-// 	product_id := self.Id
-// 	var iem order_model.OrderItem
-// 	var cnt Count
-// 	k := fmt.Sprintf("product_sale_count[%d]", product_id)
-// 	if c, ok := cache.Cache.Get(k).(int64); ok {
-// 		return c + r
-// 	}
-
-// 	o := orm.NewOrm()
-// 	err := o.Raw(fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE product_id=?", iem.TableName()),
-// 		product_id).QueryRow(&cnt)
-// 	if err != nil {
-// 		beego.BeeLogger.Error("get all order items product_id=[%d],err=[%s]", product_id, err)
-// 	} else {
-// 		// sec, _ := beego.AppConfig.Int64("AllDayCacheSecond")
-// 		cache.Cache.Put(k, cnt.Count, 300*time.Second)
-// 	}
-
-// 	return cnt.Count + r
-// }
-
-// func (self *Product) GetAlbum() []*ProductPicture {
-// 	pps := GetProductPicturesByProductId(self.Id)
-// 	for i := 0; i < len(pps); i++ {
-// 		if beego.AppConfig.String("RunMode") == "prod" {
-// 			pps[i].Url = fmt.Sprintf("%s/%s@!product",
-// 				beego.AppConfig.String("AliCDNImgHost"),
-// 				pps[i].StoreName)
-// 		} else {
-// 			pps[i].Url = fmt.Sprintf("%s/%s",
-// 				beego.AppConfig.String("AliOssImgHost"),
-// 				pps[i].StoreName)
-// 		}
-
-// 	}
-// 	return pps
-// }
-
-// func GetGroupProducts(gId int64) (products []*Product) {
-// 	o := orm.NewOrm()
-// 	product := new(Product)
-// 	_, err := o.QueryTable(product).Filter("product_group_id", gId).
-// 		Filter("status", "approved").Filter("quantity__gt", 0).
-// 		OrderBy("-recommend", "-created_at").
-// 		// Limit(per_page, (page-1)*per_page).
-// 		All(&products)
-// 	if err != nil {
-// 		beego.BeeLogger.Error("GetGroupProducts(%d), err=%s", gId, err)
-// 	}
-// 	return products
-// }
-
-// //获取宠物管最新推荐商品
-// func GetPetLatest(page int, per_page int) (products []*Product) {
-// 	//找出宠物类别的所有ID
-// 	pet_id, _ := beego.AppConfig.Int64("PetID")
-// 	cats := GetProductCatChildrenById(pet_id)
-// 	size := len(cats)
-// 	beego.BeeLogger.Debug("len=%d", size)
-// 	if size <= 0 {
-// 		return nil
-// 	}
-
-// 	var ids []int64 = make([]int64, size)
-
-// 	for i, cat := range cats {
-// 		ids[i] = cat.Id
-// 	}
-// 	beego.BeeLogger.Debug("ids=%v", ids)
-// 	o := orm.NewOrm()
-// 	_, err := o.QueryTable(new(Product)).Filter("status", "approved").
-// 		Filter("quantity__gt", 0).Filter("category_id__in", ids).
-// 		OrderBy("-recommend", "-created_at").
-// 		Limit(per_page, (page-1)*per_page).
-// 		All(&products)
-// 	if err != nil {
-// 		beego.BeeLogger.Error("GetPetLatest err=%s", err)
-// 	}
-// 	return products
-// }
+func (self *Product) Save() error {
+	if _, err := orm.NewOrm().Update(self); err != nil {
+		beego.BeeLogger.Error("Save product id=[%d] .err=[%s]", self.Id, err)
+		return err
+	}
+	return nil
+}

+ 2 - 2
go/gopath/src/fohow.com/apps/models/product_model/product_picture.go

@@ -65,7 +65,7 @@ func GetCoverByPId(pId int64, useCache bool) string {
 		OrderBy("-sort").Limit(1).One(item); err != nil {
 		return ""
 	}
-	url := GetFullImgUrl(item.Img)
+	url := GetCdnFullImgUrl(item.Img)
 	cache.Cache.Put(k, url, 10*time.Minute)
 	return url
 }
@@ -84,7 +84,7 @@ func GetVideoCoverByPId(pId int64, useCache bool) string {
 		OrderBy("-sort").Limit(1).One(item); err != nil {
 		return ""
 	}
-	url := GetFullImgUrl(item.Img)
+	url := GetCdnFullImgUrl(item.Img)
 	cache.Cache.Put(k, url, 10*time.Minute)
 	return url
 }

+ 2 - 4
go/gopath/src/fohow.com/apps/models/user_model/invite.go

@@ -213,8 +213,7 @@ func GetMyIntroListByInviteId(inviteId, page, perPage int64, useCache bool) (lis
 		WHERE
 			a.invite_id=%d
 		ORDER BY
-			b.total DESC,
-			a.intro_inner_no 
+			a.id DESC
 			LIMIT %d,%d;
 	`
 	sql = fmt.Sprintf(sql, inviteId, (page-1)*perPage, perPage)
@@ -384,8 +383,7 @@ func GetMyMonthIntroListByInviteId(inviteId int64, page, perPage int64, createTi
 		WHERE
 			 a.invite_id=%d 
 		ORDER BY
-			b.total DESC,
-			a.intro_inner_no 
+			a.id DESC
 			LIMIT %d,%d;
 	`
 	sql = fmt.Sprintf(sql, "%Y%m", inviteId, (page-1)*perPage, perPage)

+ 4 - 2
go/gopath/src/fohow.com/apps/models/user_model/wx_user.go

@@ -72,13 +72,15 @@ func (self *WxUser) TableName() string {
 	return wx_users_tablename
 }
 
-func (self *WxUser) QuickCreate(openid, unionid, ip string, channel, lastConversationAt int64) *WxUser {
+func (self *WxUser) QuickCreate(openid, unionid, ip string, channel, lastConversationAt, userId, inviteId, introUserId int64) *WxUser {
 	item := &WxUser{
-		UserId:             0,
+		UserId:             userId,
 		Openid:             openid,
 		Unionid:            unionid,
 		SignupIp:           ip,
 		ChannelQrcodeId:    channel,
+		IntroUserId:        introUserId,
+		InviteId:           inviteId,
 		LastConversationAt: lastConversationAt}
 	id, err := orm.NewOrm().Insert(item)
 	if err != nil {