Procházet zdrojové kódy

Merge branch 'master' of http://git.hiwavo.com/Fohow/fohow_api

abiao před 3 roky
rodič
revize
7a5431b7ab
28 změnil soubory, kde provedl 1013 přidání a 174 odebrání
  1. 8 0
      go/gopath/src/fohow.com/apps/controllers/balance_controller/balance_controller.go
  2. 71 0
      go/gopath/src/fohow.com/apps/controllers/balance_controller/silver_controller.go
  3. 1 1
      go/gopath/src/fohow.com/apps/controllers/cron_controller/init.go
  4. 13 0
      go/gopath/src/fohow.com/apps/controllers/cron_controller/order_receive_automatically.go
  5. 7 0
      go/gopath/src/fohow.com/apps/controllers/order_controller/cart_controller.go
  6. 72 11
      go/gopath/src/fohow.com/apps/controllers/order_controller/order_controller.go
  7. 74 33
      go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_exchange_controller.go
  8. 2 2
      go/gopath/src/fohow.com/apps/controllers/product_controller/init.go
  9. 60 5
      go/gopath/src/fohow.com/apps/controllers/product_controller/product_controller.go
  10. 15 1
      go/gopath/src/fohow.com/apps/controllers/railsadmin_controller/order_refund_controller.go
  11. 30 27
      go/gopath/src/fohow.com/apps/controllers/test_controller/test_controller.go
  12. 5 21
      go/gopath/src/fohow.com/apps/helpers/benefit_helper.go
  13. 20 21
      go/gopath/src/fohow.com/apps/helpers/promotion_helper.go
  14. 1 1
      go/gopath/src/fohow.com/apps/models/balance_model/init.go
  15. 251 0
      go/gopath/src/fohow.com/apps/models/balance_model/silver.go
  16. 11 9
      go/gopath/src/fohow.com/apps/models/order_model/cart.go
  17. 9 5
      go/gopath/src/fohow.com/apps/models/order_model/order.go
  18. 17 13
      go/gopath/src/fohow.com/apps/models/order_model/order_detail.go
  19. 1 0
      go/gopath/src/fohow.com/apps/models/product_model/init.go
  20. 204 17
      go/gopath/src/fohow.com/apps/models/product_model/product.go
  21. 36 0
      go/gopath/src/fohow.com/apps/models/product_model/product_sale_type.go
  22. 2 2
      go/gopath/src/fohow.com/nginx/ngx_dev_config
  23. 2 3
      go/gopath/src/fohow.com/nginx/ngx_test_config
  24. 10 0
      go/gopath/src/fohow.com/routers/routes.go
  25. 1 1
      go/gopath/src/fohow.com/static/api/fileauth.txt
  26. 27 0
      go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.key
  27. 62 0
      go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.pem
  28. 1 1
      go/gopath/src/fohow.com/static/tapi/fileauth.txt

+ 8 - 0
go/gopath/src/fohow.com/apps/controllers/balance_controller/balance_controller.go

@@ -2,6 +2,7 @@ package balance_controller
 
 import (
 	"fmt"
+	"fohow.com/apps/models/sys_config"
 	"fohow.com/libs/lib_redis"
 	"fohow.com/libs/tool"
 	"github.com/astaxie/beego"
@@ -35,7 +36,10 @@ func (self *BalanceController) GetBalanceInfo() {
 	type BalanceInfo struct {
 		Total          int64 `orm:"-" json:"total"`            //余额,单位分
 		ShowInviteMode int64 `orm:"-" json:"show_invite_mode"` //是否群主
+		SilverTotal    int64 `orm:"-" json:"silver_total"`     //银豆余额,单位分
+		FreightLimit   int64 `orm:"-" json:"freight_limit"`    //运费金额,单位分
 	}
+
 	//user := self.GetCurrentUser(true)
 	wxUId := self.GetCurrentWxUserIdByToken()
 	wxUser := user_model.GetWxUserById(wxUId, true)
@@ -44,7 +48,9 @@ func (self *BalanceController) GetBalanceInfo() {
 	}
 	info := new(BalanceInfo)
 	info.Total = balance_model.GetUserTotalBalance(wxUId)
+	info.SilverTotal = balance_model.GetUserTotalSilver(wxUId)
 	info.ShowInviteMode = wxUser.ShowInviteMode
+	info.FreightLimit = sys_config.GetOrderLimit()
 	self.Data["json"] = info
 	self.ServeJSON()
 }
@@ -223,10 +229,12 @@ func (self *BalanceController) GetTakeCashLimit() {
 	type LimitInfo struct {
 		MinLimitCash int64 `json:"min_limit_cash"` //提现限额
 		MaxLimitCash int64 `json:"max_limit_cash"` //提现限额
+		FeeBl        int64 `json:"fee_bl"`         //手续费比例
 	}
 	limitInfo := new(LimitInfo)
 	limitInfo.MaxLimitCash = TAKE_CASH_AMOUNT_LIMIT_MAX
 	limitInfo.MinLimitCash = TAKE_CASH_AMOUNT_LIMIT_MIN
+	limitInfo.FeeBl = int64(0)
 
 	if beego.AppConfig.String("RunMode") == "dev" {
 		limitInfo.MinLimitCash = 1

+ 71 - 0
go/gopath/src/fohow.com/apps/controllers/balance_controller/silver_controller.go

@@ -0,0 +1,71 @@
+package balance_controller
+
+import (
+	"fohow.com/apps"
+	"fohow.com/apps/models/balance_model"
+	"fohow.com/apps/models/user_model"
+	"strconv"
+)
+
+//银豆和银豆余额
+func (self *BalanceController) GetSilverInfo() {
+	type BalanceInfo struct {
+		Total int64 `orm:"-" json:"total"` //余额,单位分
+	}
+	//user := self.GetCurrentUser(true)
+	wxUId := self.GetCurrentWxUserIdByToken()
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.UserNeedLogin, "", nil)
+	}
+	info := new(BalanceInfo)
+	info.Total = balance_model.GetUserTotalBalance(wxUId)
+	self.Data["json"] = info
+	self.ServeJSON()
+}
+
+//银豆变动列表
+func (self *BalanceController) GetSilverList() {
+	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.GetCurrentWxUserIdByToken()
+
+	list := balance_model.GetSilverListByWxUId(wxUId, page, perPage, cache)
+	count := balance_model.GetSilverCountByWxUId(wxUId)
+	type BalanceInfo struct {
+		BalanceList  []*balance_model.Silver `orm:"-" json:"balance_list"`
+		BalanceCount int64                   `orm:"-" json:"balance_count"`
+	}
+	for _, item := range list {
+		item.SourceName = item.GetSourceName()
+		item.CTime = item.CreatedAt.Unix()
+	}
+
+	self.Data["json"] = &BalanceInfo{BalanceList: list, BalanceCount: count}
+	self.ServeJSON()
+}
+
+//资金详情
+func (self *BalanceController) GetSilverDetail() {
+	_id := self.Ctx.Input.Param(":id")
+	id, _ := strconv.ParseInt(_id, 10, 64)
+	//uId := self.GetCurrentUserId()
+	wxUId := self.GetCurrentWxUserIdByToken()
+	item := balance_model.GetSilverById(id)
+	if item == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	if item.WxUserId != wxUId {
+		self.ReturnError(403, apps.BalanceNotExist, "", nil)
+	}
+	item.CTime = item.CreatedAt.Unix()
+	item.SourceName = item.GetSourceName()
+	self.Data["json"] = item
+	self.ServeJSON()
+}

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

@@ -80,7 +80,7 @@ func exec(name string) {
 	case "cancel_order": //下单24h未支付改为已取消
 		go OrderCancelAutomatically()
 	case "cancel_order_once": //下单24h未支付改为已取消
-		go OnceOrderCancelAutomatically()
+		//go OnceOrderCancelAutomatically()
 	case "send_cent": //补发积分执行一次
 		//go patchCent()
 	case "clear_update_orders": //清理过期物流数据

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

@@ -96,6 +96,19 @@ func OrderCancelAutomatically() {
 				remark := fmt.Sprintf("取消订单退款")
 				new(balance_model.Balance).Create(order.WxUserId, order.UserId, order.CouponPrice, source, orderId, remark)
 			}
+			//返还会员银豆账户
+			if order.PaiedSilver > int64(0) {
+				source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+				remark := fmt.Sprintf("取消订单退银豆")
+				new(balance_model.Silver).Create(order.WxUserId, order.UserId, order.PaiedSilver, source, order.OrderId, remark)
+			}
+
+			//返还会员佣金账户
+			if order.PaiedCash > int64(0) {
+				source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+				remark := fmt.Sprintf("取消订单退佣金")
+				new(balance_model.CashBalance).Create(order.WxUserId, order.PaiedCash, source, order.OrderId, remark)
+			}
 			order.Status = order_model.STATUS_CLOSED
 			order.Save()
 			lib_redis.ThrowOutRedisList(key, orderId)

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

@@ -243,6 +243,7 @@ func (self *OrderController) GetCartList() {
 				item.ColorName = productColor.Name
 			}
 		}
+
 		item.Package = product.Package
 		if product.Package {
 			packageList := product_model.GetPackageList(product.Id, true)
@@ -255,11 +256,17 @@ func (self *OrderController) GetCartList() {
 				item.PackageList = append(item.PackageList, cart_package)
 			}
 		}
+		//获取专区名称
+		saleType := product_model.GetProductSaleTypeById(product.SaleZone)
+		if saleType != nil {
+			item.SaleZoneName = saleType.Name
+		}
 		item.SeckillStartAt = product.SeckillStart.Unix()
 		item.SeckillEndAt = product.SeckillEnd.Unix()
 		item.SeckilShowPrice = product.SeckilShowPrice
 		item.Cover = product_model.GetCoverByPId(item.ProductId, cache)
 		item.OriginalPrice = product.Price
+		item.UseQuan = product.UseQuan
 		item.ProductName = product.Name
 		item.Pv = product.Pv
 	}

+ 72 - 11
go/gopath/src/fohow.com/apps/controllers/order_controller/order_controller.go

@@ -2,6 +2,7 @@ package order_controller
 
 import (
 	"fmt"
+	"fohow.com/apps/helper"
 	"fohow.com/apps/helpers"
 	"fohow.com/apps/models/cent_model"
 	"fohow.com/apps/models/sys_config"
@@ -131,11 +132,26 @@ func (self *OrderController) Create() {
 		order.Promotions = specialstr
 	}
 
-	order.Save()
-	//创建订单明细
-	new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name,
-		sizeName, colorName, count, wxUser.Depart)
+	//实抵银豆
+	var math = helper.NewMath()
+	userLeftSilver := balance_model.GetUserTotalSilver(wxUId)
+	paiedSilver, _ := math.Min(float64(userLeftSilver), float64(product.Silver*count))
+
+	//折扣
+	dis := (float64(product.Price*count) - paiedSilver) * float64(product.Pv) / float64(100)
+	disAmount := math.Round(dis)
 
+	//提货券
+	userLeftBalanceCount := balance_model.GetUserTotalBalance(wxUId)
+	if userLeftBalanceCount > int64(0) && product.UseQuan {
+		disAmount = float64(0)
+	}
+
+	//创建订单明细
+	new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, int64(paiedSilver), int64(disAmount), product.Name, sizeName, colorName, count, wxUser.Depart)
+	order.DisAmount = int64(disAmount)
+	order.TotalSilver = product.Silver * count
+	order.Save()
 	//发放赠品
 	helpers.SetOrderPromotionPro(order.OrderId, wxUser.Id)
 
@@ -185,6 +201,8 @@ func (self *OrderController) MultipleCreate() {
 	}
 	totalPrice := int64(0)
 	totalPv := int64(0)
+	totalSilver := int64(0)
+	totalQuan := int64(0)
 	c_arr := strings.Split(ids, ",")
 	c_nums := strings.Split(nums, ",")
 
@@ -229,15 +247,28 @@ func (self *OrderController) MultipleCreate() {
 				}
 			}
 		}
+		//统计总银豆
+		totalSilver += product.Silver * cNums
+		if product.UseQuan {
+			totalQuan += product.Price * cNums
+		}
 	}
 
+	//统计实抵银豆
+	var math = helper.NewMath()
+	userLeftSilver := balance_model.GetUserTotalSilver(wxUId)
+	paiedSilver, _ := math.Min(float64(userLeftSilver), float64(totalSilver))
+
+	//提货券
+	userLeftBalanceCount := balance_model.GetUserTotalBalance(wxUId)
+
 	//创建订单
 	order := new(order_model.Order).CreateNew(wxUId, wxUser.UserId,
 		totalPrice, int64(0), order_model.ORDER_TYPE_NORMAL, wxUser.Depart, order_model.SOURCE_XCX)
 	if order == nil {
 		self.ReturnError(403, apps.CreateOrderFail, "", nil)
 	}
-
+	totalDisamout := int64(0)
 	for key, s_item := range c_arr {
 		cId, _ := strconv.ParseInt(s_item, 10, 64)
 		cNums := int64(1)
@@ -257,8 +288,20 @@ func (self *OrderController) MultipleCreate() {
 		totalPrice += product.Price * cNums
 		totalPv += product.Pv * cNums
 
+		//统计单件
+		singleTSilver := (float64(product.Silver*cNums) / float64(totalSilver)) * paiedSilver
+		silver := int64(math.Round(singleTSilver))
+
+		dis := (float64(product.Price*cNums) - singleTSilver) * float64(product.Pv) / float64(100)
+		disAmount := int64(math.Round(dis))
+
+		if userLeftBalanceCount > int64(0) && totalQuan > 0 {
+			disAmount = int64(0)
+		}
+		totalDisamout += disAmount
+
 		//创建订单明细
-		CreateOrderDetails(product, order, cNums, wxUser.Depart)
+		CreateOrderDetails(product, order, cNums, wxUser.Depart, silver, disAmount)
 	}
 	freight := sys_config.GetFreight()
 	if totalPrice >= sys_config.GetOrderLimit() {
@@ -267,6 +310,8 @@ func (self *OrderController) MultipleCreate() {
 	order.Pv = totalPv
 	order.TotalPrice = totalPrice
 	order.Freight = freight
+	order.DisAmount = totalDisamout
+	order.TotalSilver = totalSilver
 	specialPromotion, specialstr := sys_config.GetSpetialPromotion()
 	if specialPromotion {
 		order.Promotions = specialstr
@@ -352,7 +397,7 @@ func (self *OrderController) MultShopCreate() {
 		}
 		//创建订单明细
 		totalPrice += product.Price * cNums
-		CreateOrderDetails(product, order, cNums, wxUser.Depart)
+		CreateOrderDetails(product, order, cNums, wxUser.Depart, int64(0), int64(0))
 	}
 	freight := sys_config.GetFreight()
 	if totalPrice >= sys_config.GetOrderLimit() {
@@ -460,7 +505,7 @@ func (self *OrderController) MultCentCreate() {
 		if product == nil {
 			self.ReturnError(403, apps.NoExist, "", nil)
 		}
-		CreateOrderDetails(product, order, cNums, wxUser.Depart)
+		CreateOrderDetails(product, order, cNums, wxUser.Depart, int64(0), int64(0))
 	}
 	order.TotalPrice = totalPrice
 	order.Freight = freight
@@ -525,6 +570,7 @@ func (self *OrderController) Detail() {
 		}
 		o.Count += item.Count
 		item.Cover = product.Cover
+		item.UseQuan = product.UseQuan
 		o.ProductList = append(o.ProductList, item)
 	}
 	wxUser := self.GetCurrentWxUser(cache)
@@ -537,7 +583,9 @@ func (self *OrderController) Detail() {
 		}
 		wxUser.Head = user_model.GetFullImgUrl(wxUser.Head)
 	}
-
+	if wxUser.Rank <= int64(0) {
+		o.DisAmount = int64(0)
+	}
 	o.StatusCn = order_model.STATUS_CN_TEXT[o.Status]
 	o.ShutWechat = sys_config.GetShutWechatPromotion()
 	o.CTime = o.CreatedAt.Unix()
@@ -723,6 +771,19 @@ func (self *OrderController) Operate() {
 			remark := fmt.Sprintf("取消订单退款")
 			new(balance_model.Balance).Create(o.WxUserId, o.UserId, o.CouponPrice, source, o.OrderId, remark)
 		}
+		//返还会员银豆账户
+		if o.PaiedSilver > int64(0) {
+			source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+			remark := fmt.Sprintf("取消订单退银豆")
+			new(balance_model.Silver).Create(o.WxUserId, o.UserId, o.PaiedSilver, source, o.OrderId, remark)
+		}
+
+		//返还会员佣金账户
+		if o.PaiedCash > int64(0) {
+			source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+			remark := fmt.Sprintf("取消订单退佣金")
+			new(balance_model.CashBalance).Create(o.WxUserId, o.PaiedCash, source, o.OrderId, remark)
+		}
 	}
 
 	if operate == order_model.OPERATE_CONFIRM && o.Status == order_model.STATUS_DISPATCH {
@@ -754,7 +815,7 @@ func (self *OrderController) Operate() {
 	self.ServeJSON()
 }
 
-func CreateOrderDetails(product *product_model.Product, order *order_model.Order, cNums, depart int64) {
+func CreateOrderDetails(product *product_model.Product, order *order_model.Order, cNums, depart, silver, disAmount int64) {
 	//获取商品属性详情
 	sizeName := ""
 	colorName := ""
@@ -770,7 +831,7 @@ func CreateOrderDetails(product *product_model.Product, order *order_model.Order
 			colorName = productColor.Name
 		}
 	}
-	new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name, sizeName, colorName, cNums, depart)
+	new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, silver, disAmount, product.Name, sizeName, colorName, cNums, depart)
 }
 
 //用户评论订单明细

+ 74 - 33
go/gopath/src/fohow.com/apps/controllers/pay_controller/pay_exchange_controller.go

@@ -17,12 +17,10 @@ import (
 	"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"
 	"sync"
@@ -102,6 +100,8 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 	total_price := int64(0)
 	total_quan := int64(0)
 	total_weixin := int64(0)
+	paiedSilver := int64(0)
+
 	list := order_model.GetAllDetailsOrderId(order.OrderId, false)
 	for _, item := range list {
 		//商品状态
@@ -125,6 +125,7 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 					self.ReturnError(403, []string{apps.SeckillIsEnd[0], fmt.Sprintf("%s秒杀活动已经结束", product.Name)}, "", nil)
 				}
 			}
+
 			//限购逻辑
 			if product.PurchaseLimitCount > 0 {
 				if product.PurchaseLimitCount < item.Count {
@@ -158,11 +159,11 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 			}
 
 			//微信支付金额统计
-			if product.Pv >= product.Price || specialPromotion {
-				total_quan += product.Price * item.Count
+			if product.UseQuan || specialPromotion {
+				total_quan += product.Price*item.Count - item.Silver
 			}
 			total_price += product.Price * item.Count
-
+			paiedSilver += item.Silver
 		}
 
 		if _, ok := SaleNumsMap[product.Id]; ok {
@@ -178,7 +179,7 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 		}
 
 	}
-	//beego.BeeLogger.Error("SaleNumsMap1 %v", SaleNumsMap)
+	dis_amount := order.DisAmount
 
 	resultStore, prdName := FindNotEnoughPrd(storeMap)
 	if resultStore {
@@ -206,20 +207,32 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 		if order.Status != order_model.STATUS_UNPAY {
 			self.ReturnError(403, apps.NotUnPay, "", nil)
 		}
-		//若账户有提货券则优先抵扣提货券
-		needWx := false
-		totalCoupon := int64(0)
-		userLeftBalanceCount := balance_model.GetUserTotalBalance(wxUId)
-		tp := order.TotalPrice
+
 		freight := sys_config.GetFreight()
-		if tp >= sys_config.GetOrderLimit() || pick_way == order_model.PICK_SHOP {
+		if order.TotalPrice >= sys_config.GetOrderLimit() || pick_way == order_model.PICK_SHOP {
 			freight = int64(0)
 		}
+
+		tp := order.TotalPrice
+
+		needWx := false
+
+		//抵扣银豆
+		if paiedSilver > tp {
+			paiedSilver = tp
+		}
+		tp -= paiedSilver
+
+		//若账户有提货券则优先抵扣提货券
+		totalCoupon := int64(0)
+		userLeftBalanceCount := balance_model.GetUserTotalBalance(wxUId)
+
 		tp += freight
-		total_quan += freight
+		total_quan = total_quan + freight
 
 		quanLittle := false
-		if useCoupon {
+		useCoupon = true
+		if useCoupon && userLeftBalanceCount > 0 {
 			if userLeftBalanceCount < total_quan {
 				quanLittle = true
 				totalCoupon = userLeftBalanceCount
@@ -229,6 +242,31 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 		}
 		total_weixin = tp - totalCoupon
 
+		//店长先抵扣折扣
+		paiedDis := int64(0)
+		if wxUser.Rank >= user_model.WX_USER_RANK_ONE && dis_amount > int64(0) {
+			if dis_amount < total_weixin {
+				paiedDis = dis_amount
+			} else {
+				paiedDis = total_weixin
+			}
+
+		}
+
+		total_weixin = total_weixin - paiedDis
+
+		//抵扣佣金
+		paiedCash := int64(0)
+		userLeftBalanceCash := balance_model.GetCashTotalBalance(wxUId)
+		if userLeftBalanceCash > int64(0) {
+			if userLeftBalanceCash < total_weixin && total_weixin > 0 {
+				paiedCash = userLeftBalanceCash
+			} else {
+				paiedCash = total_weixin
+			}
+		}
+		total_weixin = total_weixin - paiedCash
+
 		//特殊促销期间券不够不允许支付
 		if sys_config.GetShutWechatPromotion() && total_weixin > 0 {
 			if quanLittle {
@@ -238,7 +276,7 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 			}
 		}
 
-		if total_weixin > 0 {
+		if total_weixin > int64(0) {
 			needWx = true
 		}
 		order.Freight = freight
@@ -249,7 +287,25 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 			remark := fmt.Sprintf("提货券兑换商品")
 			new(balance_model.Balance).Create(wxUId, uId, -totalCoupon, source, oId, remark)
 		}
+
+		//扣减银豆
+		if paiedSilver > 0 {
+			source := balance_model.BALANCE_SOURCE_EXCHANGE_PRODUCT
+			remark := fmt.Sprintf("银豆兑换商品")
+			new(balance_model.Silver).Create(wxUId, uId, -paiedSilver, source, oId, remark)
+		}
+
+		//先扣减佣金
+		if paiedCash > 0 {
+			source := balance_model.BALANCE_SOURCE_EXCHANGE_PRODUCT
+			remark := fmt.Sprintf("佣金兑换商品")
+			new(balance_model.CashBalance).Create(wxUId, -paiedCash, source, oId, remark)
+		}
+
 		order.CouponPrice = totalCoupon
+		order.PaiedSilver = paiedSilver
+		order.PaiedCash = paiedCash
+
 		switch needWx { // 1.true需要微信支付,2.false不需要微信支付
 		case false: // 提货券抵扣完毕
 			//更新订单状态
@@ -259,6 +315,7 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 			order.PaiedPrice = 0
 			order.PayWay = pay_model.PAYWAY_BALANCE
 			order.Source = source
+
 			order.Save()
 			//发放赠品
 			//go helpers.SetOrderPromotionPro(order.OrderId, wxUser.Id)
@@ -271,7 +328,8 @@ func (self *PayController) payExchange(oId, payWay, returnUrl, source, remark st
 			go helpers.PresentTransferToOrder(order.OrderId, wxUId)
 			//go CreateOrderNotify(order, product)
 			//wxUser := user_model.GetWxUserById(order.WxUserId, true)
-			//go sendInviterBenefit(wxUser, order.OrderId, user_model.SOURCE_PRODUCT_BENEFIT)
+			go helpers.NewSendInviterBenefit(wxUser, order.OrderId, user_model.SOURCE_PRODUCT_BENEFIT)
+
 			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})
@@ -522,23 +580,6 @@ func (self *PayController) payCentExchange(oId, returnUrl, source, remark string
 	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 FindNotEnoughPrd(storeMap map[int64]int64) (bool, string) {
 	//判断商品库存

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

@@ -16,8 +16,8 @@ import (
 
 var (
 	//需要校验用户登录的Action
-	exceptCheckUserLoginAction   = []string{"GetProductsCommends", "GetPdDetail", "GetProductSizesByPid", "Latest", "Get", "Categories", "GetProductsByCat", "GetNeedShare", "GetCommendWords"}
-	exceptCheckWxUserLoginAction = []string{"GetProductsCommends", "GetPdDetail", "GetProductSizesByPid", "Latest", "Get", "Categories", "GetProductsByCat", "GetCommendWords"}
+	exceptCheckUserLoginAction   = []string{"GetProductsCommends", "GetPdDetail", "GetProductSizesByPid", "Latest", "Get", "Categories", "GetProductsByCat", "GetNeedShare", "GetCommendWords", "SaleTypes"}
+	exceptCheckWxUserLoginAction = []string{"GetProductsCommends", "GetPdDetail", "GetProductSizesByPid", "Latest", "Get", "Categories", "GetProductsByCat", "GetCommendWords", "SaleTypes"}
 )
 
 type ProductController struct {

+ 60 - 5
go/gopath/src/fohow.com/apps/controllers/product_controller/product_controller.go

@@ -26,6 +26,7 @@ func (self *ProductController) Latest() {
 	ptype := self.GetString("ptype")
 	price_sort, _ := self.GetInt64("price_sort")
 	sale_sort, _ := self.GetInt64("sale_sort")
+	sale_zone, _ := self.GetInt64("sale_zone")
 
 	if page <= 0 {
 		page = 1
@@ -44,8 +45,14 @@ func (self *ProductController) Latest() {
 		ListCount int64                    `json:"list_count"`
 	}
 
-	pds := product_model.GetLatest(page, perPage, recommend, price_sort, sale_sort, ptype, cache)
-	count := product_model.GetLatestCount(recommend, ptype, cache)
+	wxUId := self.GetCurrentWxUserIdByToken()
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+
+	pds := product_model.GetLatest(page, perPage, recommend, price_sort, sale_sort, sale_zone, wxUser.Depart, ptype, cache)
+	count := product_model.GetNewLatestCount(recommend, sale_zone, wxUser.Depart, ptype, cache)
 	for _, pd := range pds {
 		pd.SoldCount = pd.SaleNums
 		if pd.Count > pd.SoldCount {
@@ -74,6 +81,11 @@ func (self *ProductController) Latest() {
 		if pd.Package {
 			pd.PackageList = product_model.GetPackageList(pd.Id, true)
 		}
+		//获取专区名称
+		saleType := product_model.GetProductSaleTypeById(pd.SaleZone)
+		if saleType != nil {
+			pd.SaleZoneName = saleType.Name
+		}
 		//判断是否预售
 		pd.IsDeliver = false
 		pd.DeliverStartTime = pd.DeliverStartAt.Unix()
@@ -148,6 +160,13 @@ func (self *ProductController) Get() {
 	if pd.Count > pd.SoldCount {
 		pd.LeftCount = pd.Count - pd.SoldCount
 	}
+
+	//获取专区名称
+	saleType := product_model.GetProductSaleTypeById(pd.SaleZone)
+	if saleType != nil {
+		pd.SaleZoneName = saleType.Name
+	}
+
 	//pd.SoldCount = pd.SoldCount + pd.VirtualSoldCount
 	pd.SoldCount = product_model.GetProductCountByRelateId(pd.RelateProductId, true)
 
@@ -194,7 +213,12 @@ func (self *ProductController) Get() {
 			pd.DeliverState = product_model.DELIVER_STATE_2
 		}
 	}
-
+	wxUId := self.GetCurrentWxUserIdByToken()
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	pd.CanBuy = product_model.DecideCanBuy(pd.RelateProductId, wxUser.Depart)
 	// ret.Product = pd
 	self.Data["json"] = pd
 	self.ServeResultJSON()
@@ -266,6 +290,11 @@ func (self *ProductController) GetPdDetail() {
 		if pd.Package {
 			pd.PackageList = product_model.GetPackageList(pd.Id, true)
 		}
+		//获取专区名称
+		saleType := product_model.GetProductSaleTypeById(pd.SaleZone)
+		if saleType != nil {
+			pd.SaleZoneName = saleType.Name
+		}
 		//判断是否预售
 		pd.IsDeliver = false
 		pd.DeliverStartTime = pd.DeliverStartAt.Unix()
@@ -313,6 +342,7 @@ func (self *ProductController) GetProductsByCat() {
 	cache, _ := self.GetBool("cache", false)
 	price_sort, _ := self.GetInt64("price_sort")
 	sale_sort, _ := self.GetInt64("sale_sort")
+	sale_zone, _ := self.GetInt64("sale_zone")
 
 	if page <= 0 {
 		page = 1
@@ -324,8 +354,14 @@ func (self *ProductController) GetProductsByCat() {
 		List      []*product_model.Product `json:"list"`
 		ListCount int64                    `json:"list_count"`
 	}
-	list := product_model.GetProductsByCatId(catId, page, perPage, price_sort, sale_sort, words, cache)
-	count := product_model.GetProductCountByCatId(catId, words, cache)
+
+	wxUId := self.GetCurrentWxUserIdByToken()
+	wxUser := user_model.GetWxUserById(wxUId, true)
+	if wxUser == nil {
+		self.ReturnError(403, apps.NoExist, "", nil)
+	}
+	list := product_model.DepartGetProductsByCatId(catId, sale_zone, page, perPage, price_sort, sale_sort, wxUser.Depart, words, cache)
+	count := product_model.DepartGetProductCountByCatId(catId, sale_zone, wxUser.Depart, words, cache)
 	for _, pd := range list {
 		pd.SoldCount = pd.SaleNums
 		if pd.Count > pd.SoldCount {
@@ -354,6 +390,11 @@ func (self *ProductController) GetProductsByCat() {
 		if pd.Package {
 			pd.PackageList = product_model.GetPackageList(pd.Id, true)
 		}
+		//获取专区名称
+		saleType := product_model.GetProductSaleTypeById(pd.SaleZone)
+		if saleType != nil {
+			pd.SaleZoneName = saleType.Name
+		}
 		//判断是否预售
 		pd.IsDeliver = false
 		pd.DeliverStartTime = pd.DeliverStartAt.Unix()
@@ -439,6 +480,13 @@ func (self *ProductController) GetProductSizesByPid() {
 
 	ret := &Ret{}
 	if product != nil {
+
+		//获取专区名称
+		saleType := product_model.GetProductSaleTypeById(product.SaleZone)
+		if saleType != nil {
+			product.SaleZoneName = saleType.Name
+		}
+
 		list := product_model.GetProductConfigAttrsByPId(product.RelateProductId)
 		for _, item := range list {
 
@@ -528,3 +576,10 @@ func (self *ProductController) GetCommendWords() {
 	self.Data["json"] = &Ret{List: list}
 	self.ServeJSON()
 }
+
+//专区商品
+func (self *ProductController) SaleTypes() {
+	saleTypes := product_model.GetProductSaleZones()
+	self.Data["json"] = saleTypes
+	self.ServeJSON()
+}

+ 15 - 1
go/gopath/src/fohow.com/apps/controllers/railsadmin_controller/order_refund_controller.go

@@ -72,10 +72,24 @@ func (self *RailsadminController) OrderRefund() {
 		//返还会员提货券账户
 		if o.CouponPrice > int64(0) {
 			source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
-			remark := fmt.Sprintf("取消订单退")
+			remark := fmt.Sprintf("取消订单退提货券")
 			new(balance_model.Balance).Create(o.WxUserId, o.UserId, o.CouponPrice, source, o.OrderId, remark)
 		}
 
+		//返还会员银豆账户
+		if o.PaiedSilver > int64(0) {
+			source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+			remark := fmt.Sprintf("取消订单退银豆")
+			new(balance_model.Silver).Create(o.WxUserId, o.UserId, o.PaiedSilver, source, o.OrderId, remark)
+		}
+
+		//返还会员佣金账户
+		if o.PaiedCash > int64(0) {
+			source := balance_model.BALANCE_SOURCE_ALL_REFUNDED_NAME
+			remark := fmt.Sprintf("取消订单退佣金")
+			new(balance_model.CashBalance).Create(o.WxUserId, o.PaiedCash, source, o.OrderId, remark)
+		}
+
 		//微信支付金额原路退款
 		if o.PaiedPrice > int64(0) {
 			outTradeNo := fmt.Sprintf("%s-%d", refund.OrderId, refund.Id)

+ 30 - 27
go/gopath/src/fohow.com/apps/controllers/test_controller/test_controller.go

@@ -2,11 +2,9 @@ package test_controller
 
 import (
 	"fmt"
+	"fohow.com/apps/helper"
 	"fohow.com/apps/models/order_model"
-	"fohow.com/apps/models/user_model"
-	"fohow.com/libs/lib_redis"
 	"fohow.com/libs/wx_mp"
-	"github.com/astaxie/beego"
 	"math/rand"
 	"strings"
 	"time"
@@ -51,35 +49,40 @@ func (self *TestController) TestOrderListen() {
 //测试redis 存储userInfo
 func (self *TestController) GetUserInfoFromRedis() {
 
-	//-------测试个人------------//
-	userId := int64(1458)
-	key := fmt.Sprintf("userinfo_%d", userId)
-	var user user_model.User
-	ok, resp := lib_redis.GetRedisValue(key, user)
-	if !ok {
-		//发送请求
-		resp = user_model.GetUserById(userId, false)
-		lib_redis.SetJsonEx(key, resp, 90*60)
+	////-------测试个人------------//
+	//userId := int64(1458)
+	//key := fmt.Sprintf("userinfo_%d", userId)
+	//var user user_model.User
+	//ok, resp := lib_redis.GetRedisValue(key, user)
+	//if !ok {
+	//	//发送请求
+	//	resp = user_model.GetUserById(userId, false)
+	//	lib_redis.SetJsonEx(key, resp, 90*60)
+	//
+	//}
+	//beego.BeeLogger.Warn("resp---%v", resp)
+	//
+	////-------测试数组------------//
+	//key_ar := fmt.Sprintf("array_userinfo_a")
+	//var users []user_model.User
+	//ok, resp_ar := lib_redis.GetRedisValue(key_ar, users)
+	//if !ok {
+	//	//发送请求
+	//	resp_ar = user_model.GetUserByIsRegistAndIsRegistBefore()
+	//	lib_redis.SetJsonEx(key_ar, resp_ar, 90*60)
+	//
+	//}
+	//beego.BeeLogger.Warn("resp_ar---%v", resp_ar)
+	var math = helper.NewMath()
+	userLeftSilver := float64(16)
+	paiedSilver, _ := math.Min(float64(userLeftSilver), float64(10.1), float64(9.8))
 
-	}
-	beego.BeeLogger.Warn("resp---%v", resp)
-
-	//-------测试数组------------//
-	key_ar := fmt.Sprintf("array_userinfo_a")
-	var users []user_model.User
-	ok, resp_ar := lib_redis.GetRedisValue(key_ar, users)
-	if !ok {
-		//发送请求
-		resp_ar = user_model.GetUserByIsRegistAndIsRegistBefore()
-		lib_redis.SetJsonEx(key_ar, resp_ar, 90*60)
-
-	}
-	beego.BeeLogger.Warn("resp_ar---%v", resp_ar)
 	type Ret struct {
 		Resp interface{} `json:"resp"`
 	}
 	ret := &Ret{}
-	ret.Resp = resp_ar
+	ret.Resp = paiedSilver
+
 	self.Data["json"] = ret
 	self.ServeJSON()
 }

+ 5 - 21
go/gopath/src/fohow.com/apps/helpers/benefit_helper.go

@@ -11,15 +11,10 @@ import (
 
 func NewSendInviterBenefit(wxUser *user_model.WxUser, orderId, source string) {
 
-	//三部代理--佣金计入本人账户 0317
-	//specialDepartStr := beego.AppConfig.String("SpecialDepart")
-	//specialDeparts := strings.Split(specialDepartStr, ",")
-	//departUser := fmt.Sprintf("%d", wxUser.Depart)
-	//contain := tool.StringsContains(specialDeparts, departUser) //是否结算给
-
 	var benefitWxUser *user_model.WxUser
-	if wxUser.ShowInviteMode == int64(1) {
-		benefitWxUser = wxUser
+	//店长不再计算佣金
+	if wxUser.Rank >= user_model.WX_USER_RANK_ONE {
+		return
 	} else {
 		//20.12.01 新规--(微信支付金额-运费)>0,按(微信支付金额-运费)*20%给上级代理返佣金(代理本人下订单,也是返给上级代理)
 		benefitWxUser = FindInviter(wxUser)
@@ -35,19 +30,8 @@ func NewSendInviterBenefit(wxUser *user_model.WxUser, orderId, source string) {
 		}
 
 		if benefitWxUser != nil {
-			//发放群主收益,(微信支付金额-运费)>0,按(微信支付金额-运费)*20%给上级代理返佣金
-			//val := []int64{productOrder.Pv - productOrder.Freight, productOrder.Pv}
-			//计算佣金的业绩=max(pv-max(扣提货券-运费,0),0)
-			award_cash := productOrder.Pv
-			couponFee := productOrder.CouponPrice - productOrder.Freight
-			if couponFee > 0 {
-				award_cash = productOrder.Pv - couponFee
-			}
-			if award_cash <= 0 {
-				return
-			}
-			be_total := float64(award_cash) * (float64(sys_config.GetCashAward()) / float64(100))
-			count := int64(math.Floor(be_total + 0.5))
+			//直接按pv折扣发放店长收益
+			count := productOrder.DisAmount
 			//beego.BeeLogger.Warn("count %d", count)
 			remark := fmt.Sprintf("%s%s", wxUser.Nickname, "购物")
 			if count > 0 {

+ 20 - 21
go/gopath/src/fohow.com/apps/helpers/promotion_helper.go

@@ -187,7 +187,6 @@ func SetOrderPromotion(orderId string, wxUid int64) {
 	}
 }
 
-
 //订单促销
 /*
 	如果促销条件中,设置的项目有一项不满足即视为不满足促销条件
@@ -241,9 +240,9 @@ func SetOrderPromotionPro(orderId string, wxUid int64) {
 			nums1 = int64(0)
 			if prd != nil {
 				detail_nums1 := int64(0)
-				detailItem:=order_model.GetDetailsByOrderIdAndPid(orderId,item.Prod1)
-				if detailItem!=nil{
-					detail_nums1=detailItem.Count
+				detailItem := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod1)
+				if detailItem != nil {
+					detail_nums1 = detailItem.Count
 				}
 				if detail_nums1 > int64(0) && item.Prod1 > 0 && item.Nums1 > 0 {
 					nums1 = int64(detail_nums1 / item.Nums1)
@@ -255,10 +254,10 @@ func SetOrderPromotionPro(orderId string, wxUid int64) {
 			prd := product_model.GetProductById(item.Prod2, true)
 			nums2 = int64(0)
 			if prd != nil {
-				detail_nums2 :=int64(0)
-				detailItem:=order_model.GetDetailsByOrderIdAndPid(orderId,item.Prod2)
-				if detailItem!=nil{
-					detail_nums2 =detailItem.Count
+				detail_nums2 := int64(0)
+				detailItem := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod2)
+				if detailItem != nil {
+					detail_nums2 = detailItem.Count
 				}
 				//detail_nums2 := order_model.GetDetailsByOrderIdAndRelatePid(orderId, prd.RelateProductId)
 				if detail_nums2 > int64(0) && item.Prod2 > 0 && item.Nums2 > 0 {
@@ -271,9 +270,9 @@ func SetOrderPromotionPro(orderId string, wxUid int64) {
 			nums3 = int64(0)
 			prd := product_model.GetProductById(item.Prod3, true)
 			if prd != nil {
-				detail_nums3 :=int64(0)
-				detailItem:=order_model.GetDetailsByOrderIdAndPid(orderId,item.Prod3)
-				if detailItem!=nil{
+				detail_nums3 := int64(0)
+				detailItem := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod3)
+				if detailItem != nil {
 					detail_nums3 = detailItem.Count
 				}
 				//detail_nums3 := order_model.GetDetailsByOrderIdAndRelatePid(orderId, prd.RelateProductId)
@@ -291,8 +290,8 @@ func SetOrderPromotionPro(orderId string, wxUid int64) {
 			nums5 = int64(0)
 			if prd != nil {
 				detail_nums4 := int64(0)
-				detailItem:=order_model.GetDetailsByOrderIdAndPid(orderId,item.Prod4)
-				if detailItem!=nil{
+				detailItem := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod4)
+				if detailItem != nil {
 					detail_nums4 = detailItem.Count
 				}
 				//detail_nums4 := order_model.GetDetailsByOrderIdAndRelatePid(orderId, prd.RelateProductId)
@@ -306,9 +305,9 @@ func SetOrderPromotionPro(orderId string, wxUid int64) {
 			prd := product_model.GetProductById(item.Prod5, true)
 			nums6 = int64(0)
 			if prd != nil {
-				detail_nums5:=int64(0)
-				detailItem:=order_model.GetDetailsByOrderIdAndPid(orderId,item.Prod5)
-				if detailItem!=nil{
+				detail_nums5 := int64(0)
+				detailItem := order_model.GetDetailsByOrderIdAndPid(orderId, item.Prod5)
+				if detailItem != nil {
 					detail_nums5 = detailItem.Count
 				}
 				//detail_nums5 := order_model.GetDetailsByOrderIdAndRelatePid(orderId, prd.RelateProductId)
@@ -714,7 +713,7 @@ func CreateShopApplyOrder(shopAppplyId int64) {
 				if product != nil {
 					delOrder = false
 					total += sendNums1 * product.Price
-					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name, "", "", sendNums1, order.Depart)
+					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, int64(0), int64(0), product.Name, "", "", sendNums1, order.Depart)
 
 				}
 			}
@@ -725,7 +724,7 @@ func CreateShopApplyOrder(shopAppplyId int64) {
 				if product != nil {
 					delOrder = false
 					total += sendNums2 * product.Price
-					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name, "", "", sendNums2, order.Depart)
+					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, int64(0), int64(0), product.Name, "", "", sendNums2, order.Depart)
 
 				}
 			}
@@ -737,7 +736,7 @@ func CreateShopApplyOrder(shopAppplyId int64) {
 				if product != nil {
 					delOrder = false
 					total += sendNums3 * product.Price
-					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name, "", "", sendNums3, order.Depart)
+					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, int64(0), int64(0), product.Name, "", "", sendNums3, order.Depart)
 
 				}
 			}
@@ -749,7 +748,7 @@ func CreateShopApplyOrder(shopAppplyId int64) {
 				if product != nil {
 					delOrder = false
 					total += sendNums4 * product.Price
-					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name, "", "", sendNums4, order.Depart)
+					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, int64(0), int64(0), product.Name, "", "", sendNums4, order.Depart)
 				}
 			}
 
@@ -760,7 +759,7 @@ func CreateShopApplyOrder(shopAppplyId int64) {
 				if product != nil {
 					delOrder = false
 					total += sendNums5 * product.Price
-					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, product.RoboBalancePrice, product.Name, "", "", sendNums5, order.Depart)
+					go new(order_model.OrderDetail).Create(order.OrderId, order.Id, product.Id, product.RelateProductId, product.Price, int64(0), int64(0), product.Name, "", "", sendNums5, order.Depart)
 				}
 			}
 

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

@@ -6,5 +6,5 @@ import (
 
 func init() {
 	orm.RegisterModel(new(Balance),
-		new(BalanceOrder), new(CashBalance), new(TakeCashOrder), new(RechargeCashOrder))
+		new(Silver), new(BalanceOrder), new(CashBalance), new(TakeCashOrder), new(RechargeCashOrder))
 }

+ 251 - 0
go/gopath/src/fohow.com/apps/models/balance_model/silver.go

@@ -0,0 +1,251 @@
+package balance_model
+
+import (
+	"fmt"
+	"fohow.com/cache"
+	"github.com/astaxie/beego"
+	"github.com/astaxie/beego/orm"
+	"time"
+)
+
+const (
+	silvers_tablename = "silvers"
+)
+
+type Silver struct {
+	Id         int64     `orm:"column(id);pk"                                  json:"id"`          // int(11)
+	UserId     int64     `orm:"column(user_id);null"                           json:"user_id"`     // int(11)
+	WxUserId   int64     `orm:"column(wx_user_id);null"                        json:"wx_user_id"`  // int(11)
+	Count      int64     `orm:"column(count);null"                             json:"count"`       // int(11)
+	Source     string    `orm:"column(source);null"                            json:"source"`      // varchar(20)
+	SourceName string    `orm:"-"                                              json:"source_name"` // varchar(20)
+	RelateId   string    `orm:"column(relate_id);null"                         json:"relate_id"`   // varchar(255)
+	Remark     string    `orm:"column(remark);null"                            json:"remark"`      // varchar(255)
+	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 *Silver) TableName() string {
+	return silvers_tablename
+}
+
+func (self *Silver) Create(wxUId, uId, c int64, s, rId, remark string) (item *Silver) {
+	item = &Silver{
+		Count:    c,
+		WxUserId: wxUId,
+		UserId:   uId,
+		Source:   s,
+		RelateId: rId,
+		Remark:   remark,
+	}
+	id, err := orm.NewOrm().Insert(item)
+	if err != nil {
+		beego.BeeLogger.Error("Create Silver err=[%s]", err)
+		return nil
+	}
+	item.Id = id
+	return item
+}
+
+func GetSilverById(id int64) *Silver {
+	item := &Silver{}
+	if err := orm.NewOrm().QueryTable(item).
+		Filter("id", id).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Debug("GetSilverById(%s), err=%s",
+			id, err)
+		return nil
+	}
+	return item
+}
+
+//获取某人的银豆流列表
+func GetSilverListByWxUId(wxUId, page, perPage int64, useCache bool) (list []*Silver) {
+	k := fmt.Sprintf("silver_model.GetSilverList.wxUId(%d).page(%d).perPage(%d)", wxUId, page, perPage)
+	if useCache {
+		if s, ok := cache.Cache.Get(k).([]*Silver); ok {
+			return s
+		}
+	}
+
+	silver := new(Silver)
+	qs := orm.NewOrm().QueryTable(silver)
+	qs = qs.Filter("wx_user_id", wxUId)
+
+	if _, err := qs.OrderBy("-created_at", "-id").
+		Limit(perPage, (page-1)*perPage).All(&list); err != nil {
+		beego.BeeLogger.Debug("get silver with wxUId=%d, err=[%s]", wxUId, err)
+		return nil
+	}
+
+	cache.Cache.Put(k, list, 10*time.Minute)
+	return list
+}
+
+//获取某人的银豆流列表总条数
+func GetSilverCountByWxUId(wxUId int64) int64 {
+	item := new(Silver)
+	o := orm.NewOrm()
+	count, _ := o.QueryTable(item).Filter("wx_user_id", wxUId).Count()
+	return count
+}
+
+//获取某个用户的余额
+func GetUserTotalSilver(wxUId int64) int64 {
+	type Ret struct {
+		Count int64
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	tbn := new(Silver).TableName()
+	sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_user_id=?;", tbn)
+	err := o.Raw(sql, wxUId).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("get user=[%d] total silver err=[%s]", wxUId, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+	return ret.Count
+}
+
+//获取某个source累计余额
+func GetSilverCountBySource(wxUId int64, source string) int64 {
+	type Ret struct {
+		Count int64
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	tbn := new(Silver).TableName()
+	sql := fmt.Sprintf("SELECT sum(`count`) as count FROM `%s` WHERE wx_user_id=? and source=?", tbn)
+	err := o.Raw(sql, wxUId, source).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("get user=[%d] total silver err=[%s]", wxUId, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+	return ret.Count
+}
+
+func GetSilverBySourceAndRId(source, rId string) *Silver {
+	item := &Silver{}
+	if err := orm.NewOrm().QueryTable(item).
+		Filter("source", source).
+		Filter("relate_id", rId).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetSilverBySourceAndRId(%s,%s), err=%s",
+			source, rId, err)
+		return nil
+	}
+	return item
+}
+
+func GetSilverByUIdAndRIdAndSource(uId int64, rId, source string) *Silver {
+	item := &Silver{}
+	if err := orm.NewOrm().QueryTable(item).
+		Filter("user_id", uId).
+		Filter("source", source).
+		Filter("relate_id", rId).OrderBy("-created_at").Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetSilverByUIdAndRIdAndSource(%d,%s,%s), err=%s",
+			uId, rId, source, err)
+		return nil
+	}
+	return item
+}
+
+func GetBuySilverByRelateId(rId string, useCache bool) *Silver {
+	k := fmt.Sprintf("silver_model.GetBuySilverByRelateId[%s]", rId)
+	if useCache {
+		if order, ok := cache.Cache.Get(k).(*Silver); ok {
+			return order
+		}
+	}
+	//lt < 0
+	item := &Silver{}
+	if err := orm.NewOrm().QueryTable(item).Filter("relate_id", rId).Filter("count__lt", 0).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetBuySilverByRelateId(%s), err=%s", rId, err)
+		return nil
+	}
+	cache.Cache.Put(k, item, 5*time.Minute)
+	return item
+}
+
+func GetRefundSilverByRelateId(rId string, useCache bool) *Silver {
+	k := fmt.Sprintf("silver_model.GetRefundSilverByRelateId[%s]", rId)
+	if useCache {
+		if order, ok := cache.Cache.Get(k).(*Silver); ok {
+			return order
+		}
+	}
+	//gt > 0
+	item := &Silver{}
+	if err := orm.NewOrm().QueryTable(item).Filter("relate_id", rId).Filter("count__gt", 0).Limit(1).
+		One(item); err != nil {
+		beego.BeeLogger.Info("GetRefundSilverByRelateId(%s), err=%s", rId, err)
+		return nil
+	}
+	cache.Cache.Put(k, item, 5*time.Minute)
+	return item
+}
+
+//返回source名称
+func (self *Silver) GetSourceName() string {
+	sourceName := ""
+	switch self.Source {
+	case CASH_SOURCE_SHOP_BENEFIT:
+		sourceName = CASH_SOURCE_SHOP_BENEFIT_NAME
+	case CASH_SOURCE_PRODUCT_BENEFIT:
+		sourceName = CASH_SOURCE_PRODUCT_BENEFIT_NAME
+	case CASH_SOURCE_PROJECT_BENEFIT:
+		sourceName = CASH_SOURCE_PROJECT_BENEFIT_NAME
+	case CASH_SOURCE_TAKE_CASH:
+		sourceName = CASH_SOURCE_TAKE_CASH_NAME
+	case CASH_TO_BALANCE:
+		sourceName = CASH_TO_BALANCE_NAME
+	case CASH_SOURCE_PRODUCT_SALE:
+		sourceName = CASH_SOURCE_PRODUCT_SALE_NAME
+	case CASH_SOURCE_SALE_REWARD:
+		sourceName = CASH_SOURCE_SALE_REWARD_NAME
+	case CASH_SOURCE_PROJECT_INVEST:
+		sourceName = CASH_SOURCE_PROJECT_INVEST_NAME
+	case CASH_SOURCE_RESERVE_ACT_RETURN:
+		sourceName = CASH_SOURCE_RESERVE_ACT_RETURN_NAME
+	case CASH_SOURCE_EXTRACT_REJECT:
+		sourceName = CASH_SOURCE_EXTRACT_REJECT_NAME
+	case CASH_SOURCE_RECHARGE_CASH:
+		sourceName = CASH_SOURCE_RECHARGE_CASH_NAME
+	case CASH_SOURCE_RECEIVE_BUYBACK:
+		sourceName = CASH_SOURCE_RECEIVE_BUYBACK_NAME
+	case CASH_SOURCE_DEDUCT:
+		sourceName = CASH_SOURCE_DEDUCT_NAME
+	case CASH_SOURCE_LOAN:
+		sourceName = CASH_SOURCE_LOAN_NAME
+	case CASH_SOURCE_PROJECT_REFUND:
+		sourceName = CASH_SOURCE_PROJECT_REFUND
+	case CASH_SOURCE_PRODUCT_REFUND:
+		sourceName = CASH_SOURCE_PRODUCT_REFUND_NAME
+	case CASH_SOURCE_PRODUCT_PART_REFUND:
+		sourceName = CASH_SOURCE_PRODUCT_PART_REFUND_NAME
+	case CASH_SOURCE_CORRECT:
+		sourceName = CASH_SOURCE_CORRECT_NAME
+	case CASH_SOURCE_PROJECT_LOAN:
+		sourceName = CASH_SOURCE_PROJECT_LOAN_NAME
+	case CASH_SOURCE_GOOD_PAYMENT:
+		sourceName = CASH_SOURCE_GOOD_PAYMENT_NAME
+	case CASH_SOURCE_DOLLAR_WIN:
+		sourceName = CASH_SOURCE_DOLLAR_WIN_NAME
+	case CASH_SOURCE_DOLLAR_WIN_RETURN:
+		sourceName = CASH_SOURCE_DOLLAR_WIN_RETURN_NAME
+	case FX_CASH_SOURCE_PRODUCT_BENEFIT:
+		sourceName = FX_CASH_SOURCE_PRODUCT_BENEFIT_NAME
+		// case BALANCE_SOURCE_PART_REFUNDED:
+		// 	sourceName = BALANCE_SOURCE_PART_REFUNDED_NAME
+	}
+	return sourceName
+}

+ 11 - 9
go/gopath/src/fohow.com/apps/models/order_model/cart.go

@@ -25,16 +25,18 @@ type Cart struct {
 	CreatedAt       time.Time      `orm:"column(created_at);null;auto_now_add;type(datetime)" json:"-"`    // datetime
 	Count           int64          `orm:"column(nums)"                                       json:"count"` // int(11)
 	IsBuy           bool           `orm:"column(is_buy)" json:"is_under_seckill"`
-	ProductName     string         `orm:"-"     json:"product_name"`       // decimal(10,2)
-	SizeName        string         `orm:"-"     json:"size_name"`          //   varchar(64)
-	ColorName       string         `orm:"-"     json:"color_name"`         //  varchar(64)
-	Cover           string         `orm:"-"     json:"cover"`              // decimal(10,2)
-	OriginalPrice   int64          `orm:"-"     json:"original_price"`     // decimal(10,2)
-	Attrs           string         `orm:"-"     json:"attrs"`              // decimal(10,2)
-	SeckillStartAt  int64          `orm:"-"     json:"seckill_start"`      // datetime
-	SeckillEndAt    int64          `orm:"-"     json:"seckill_end"`        // datetime
-	SeckilShowPrice int64          `orm:"-"     json:"seckill_show_price"` // datetime
+	ProductName     string         `orm:"-"     json:"product_name"`                            // decimal(10,2)
+	SaleZoneName    string         `orm:"-"                              json:"sale_zone_name"` // 销售区名称
+	SizeName        string         `orm:"-"     json:"size_name"`                               //   varchar(64)
+	ColorName       string         `orm:"-"     json:"color_name"`                              //  varchar(64)
+	Cover           string         `orm:"-"     json:"cover"`                                   // decimal(10,2)
+	OriginalPrice   int64          `orm:"-"     json:"original_price"`                          // decimal(10,2)
+	Attrs           string         `orm:"-"     json:"attrs"`                                   // decimal(10,2)
+	SeckillStartAt  int64          `orm:"-"     json:"seckill_start"`                           // datetime
+	SeckillEndAt    int64          `orm:"-"     json:"seckill_end"`                             // datetime
+	SeckilShowPrice int64          `orm:"-"     json:"seckill_show_price"`                      // datetime
 	Package         bool           `orm:"-"     json:"package"`
+	UseQuan         bool           `orm:"-"     json:"use_quan"`
 	Pv              int64          `orm:"-"     json:"pv"`           // pv
 	PackageList     []*ProductItem `orm:"-"     json:"package_list"` // varchar(255)
 }

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

@@ -122,11 +122,15 @@ type Order struct {
 	ReceiveTime    time.Time          `orm:"column(receive_time);null;type(datetime)"            json:"receive_time"`
 	PaiedTime      time.Time          `orm:"column(paied_time);null;type(datetime)"              json:"paied_time"` // int(11)
 	HasCommission  bool               `orm:"has_commission"                                      json:"-"`
-	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
-	Promotions     string             `orm:"column(promotions);null"                           json:"-"`   // varchar(255)
-	SpecialPro     bool               `orm:"-"                                 json:"special_promotion"`   // int(11)
-	ShutWechat     bool               `orm:"-"                                 json:"shut_wechat"`         // 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
+	Promotions     string             `orm:"column(promotions);null"                           json:"-"`              // varchar(255)
+	SpecialPro     bool               `orm:"-"                                 json:"special_promotion"`              // int(11)
+	ShutWechat     bool               `orm:"-"                                 json:"shut_wechat"`                    // int(11)
+	PaiedSilver    int64              `orm:"column(paied_silver)"                                json:"paied_silver"` // int(11)
+	TotalSilver    int64              `orm:"column(total_silver)"                                json:"total_silver"` // int(11)
+	DisAmount      int64              `orm:"column(dis_amount)"                                  json:"dis_amount"`   // 折扣
+	PaiedCash      int64              `orm:"column(paied_cash);null"                      json:"paied_cash"`          // int(11)
 	WxUser         *user_model.WxUser `orm:"-"                                 json:"wx_user"`
 	ProductList    []*OrderDetail     `orm:"-"                                 json:"product_list"` // varchar(255)
 }

+ 17 - 13
go/gopath/src/fohow.com/apps/models/order_model/order_detail.go

@@ -41,7 +41,10 @@ type OrderDetail struct {
 	Attrs                string         `orm:"-"                                                json:"attrs"` // decimal(10,2)
 	Depart               int64          `orm:"column(depart)" json:"-"`                                       // datetime
 	Pv                   int64          `orm:"column(pv)"            json:"pv"`                               // varchar(255)
+	Silver               int64          `orm:"column(silver)"        json:"silver"`                           // varchar(255)
+	DisAmount            int64          `orm:"column(dis_amount)"        json:"dis_amount"`                   // varchar(255)
 	Package              bool           `orm:"-"                                                json:"package"`
+	UseQuan              bool           `orm:"-"                                                json:"use_quan"`
 	PacakageList         []*ProductItem `orm:"-"                                                json:"package_list"` // varchar(255)
 }
 
@@ -50,21 +53,22 @@ func (self *OrderDetail) TableName() string {
 }
 
 //创建订单项
-func (self *OrderDetail) Create(oId string, orderId, pId, relatePId, pPrice, unitRoboBalancePrice int64, pName, sizeName, colorName string,
+func (self *OrderDetail) Create(oId string, orderId, pId, relatePId, pPrice, silver, disAmount int64, pName, sizeName, colorName string,
 	pCount, depart int64) *OrderDetail {
 	item := &OrderDetail{
-		OrderNo:              oId,
-		OrderId:              orderId,
-		Count:                pCount,
-		ProductId:            pId,
-		RelateProductId:      relatePId,
-		Price:                pPrice,
-		UnitRoboBalancePrice: unitRoboBalancePrice,
-		ProductName:          pName,
-		SizeName:             sizeName,
-		ColorName:            colorName,
-		Send:                 false,
-		Depart:               depart,
+		OrderNo:         oId,
+		OrderId:         orderId,
+		Count:           pCount,
+		ProductId:       pId,
+		RelateProductId: relatePId,
+		Price:           pPrice,
+		Silver:          silver,
+		ProductName:     pName,
+		SizeName:        sizeName,
+		ColorName:       colorName,
+		Send:            false,
+		Depart:          depart,
+		DisAmount:       disAmount,
 	}
 	id, err := orm.NewOrm().Insert(item)
 	if err != nil {

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

@@ -17,6 +17,7 @@ func init() {
 		new(ProductCat),
 		new(ProductCommend),
 		new(ProductItem),
+		new(ProductSaleType),
 		new(CommendWord),
 	)
 }

+ 204 - 17
go/gopath/src/fohow.com/apps/models/product_model/product.go

@@ -120,32 +120,41 @@ type Product struct {
 	PackageList      []*ProductItem  `orm:"-"                           json:"package_list"`         // varchar(255)
 	Size             *ProductAttrKey `orm:"-"                            json:"size_list"`           // varchar(255)
 	Color            *ProductAttrKey `orm:"-"                           json:"color_list"`           // varchar(255)
+	UseQuan          bool            `orm:"column(use_quan)"               json:"use_quan"`          // varchar(255)
+	Silver           int64           `orm:"column(silver)"                 json:"silver"`            // varchar(255)
+	SaleZone         int64           `orm:"column(sale_zone)"              json:"sale_zone"`         // 销售区
+	SaleZoneName     string          `orm:"-"                              json:"sale_zone_name"`    // 销售区名称
+	CanBuy           bool            `orm:"-"                              json:"can_buy"`           // bool
 }
 
 //获取最新推荐商品
-func GetLatest(page, perPage, recommend, priceSort, saleSort int64, ptype string, useCache bool) (products []*Product) {
+func GetLatest(page, perPage, recommend, priceSort, saleSort, saleZone, depart int64, ptype string, useCache bool) (products []*Product) {
 	k := fmt.Sprintf("product_model.GetLatest.page(%d).perPage(%d).recommend(%d)", page, perPage, recommend)
 	if useCache {
 		if ret, ok := cache.Cache.Get(k).([]*Product); ok {
 			return ret
 		}
 	}
-	var priceSql, saleSql, orderSql string
+	var saleZoneSql, priceSql, saleSql, orderSql string
+	if saleZone > int64(0) {
+		saleZoneSql = fmt.Sprintf(" and a.sale_zone=%d", saleZone)
+	}
 	if priceSort == int64(1) {
 		//降序
-		priceSql = "price desc"
+		priceSql = "a.price desc"
 	} else if priceSort == int64(2) {
 		//升序
-		priceSql = "price asc"
+		priceSql = "a.price asc"
 	}
 	if saleSort == int64(1) {
 		//降序
-		saleSql = "sale_nums desc"
+		saleSql = "a.sale_nums desc"
 	} else if priceSort == int64(2) {
-		saleSql = "sale_nums asc"
+		saleSql = "a.sale_nums asc"
 	}
 	if len(priceSql) <= 0 && len(saleSql) <= 0 {
-		orderSql = "recommend desc,created_at desc"
+		//orderSql = "recommend desc,created_at desc"
+		orderSql = " (a.virtual_sold_count + a.sale_nums) desc"
 	} else if len(priceSql) <= 0 {
 		orderSql = saleSql
 	} else if len(saleSql) <= 0 {
@@ -154,13 +163,13 @@ func GetLatest(page, perPage, recommend, priceSort, saleSort int64, ptype string
 		orderSql = fmt.Sprintf("%s,%s", priceSql, saleSql)
 	}
 	sql := `
-		select * from products
-		where status = ? and recommend > ? and show_flag=? and ptype=?
+	  select a.* from products a left join depart_records_products b  on a.id=b.product_id
+		where a.status = ? and a.recommend > ? and a.show_flag=? and a.ptype=? and (b.depart_record_id=? or b.depart_record_id is null ) %s
 		order by %s limit %d, %d; 
 	`
-	sql = fmt.Sprintf(sql, orderSql, (page-1)*perPage, perPage)
+	sql = fmt.Sprintf(sql, saleZoneSql, orderSql, (page-1)*perPage, perPage)
 	//beego.BeeLogger.Warn("sql=%s", sql)
-	_, err := orm.NewOrm().Raw(sql, 1, recommend, true, ptype).QueryRows(&products)
+	_, err := orm.NewOrm().Raw(sql, 1, recommend, true, ptype, depart).QueryRows(&products)
 
 	if err != nil {
 		beego.BeeLogger.Debug("GetLatest err=%s", err)
@@ -176,7 +185,41 @@ func GetLatest(page, perPage, recommend, priceSort, saleSort int64, ptype string
 	return products
 }
 
-func GetLatestCount(recommend int64, ptype string, useCache bool) int64 {
+func GetNewLatestCount(recommend, saleZone, depart int64, ptype string, useCache bool) int64 {
+	k := fmt.Sprintf("product_model.GetNewLatestCount.recommend(%d)(%d)(%d)", recommend, saleZone, depart)
+	if useCache {
+		if ret, ok := cache.Cache.Get(k).(int64); ok {
+			return ret
+		}
+	}
+	type Ret struct {
+		Count int64 `json:"count"` //总数
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	sql := `
+		 select count(DISTINCT a.id) as count from products a left join depart_records_products b  on a.id=b.product_id
+			where a.status = ? and a.recommend > ? and a.show_flag=? and a.ptype=? and (b.depart_record_id=? or b.depart_record_id is null ) %s;
+	`
+	var saleZoneSql string
+	if saleZone > int64(0) {
+		saleZoneSql = fmt.Sprintf(" and a.sale_zone=%d", saleZone)
+	}
+	sql = fmt.Sprintf(sql, saleZoneSql)
+
+	err := o.Raw(sql, true, recommend, true, ptype, depart).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("GetLatestCount, depart:%d, err=[%s]", depart, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+	cache.Cache.Put(k, ret.Count, 10*time.Minute)
+	return ret.Count
+}
+
+func GetLatestCount(recommend, saleZone int64, ptype string, useCache bool) int64 {
 	k := fmt.Sprintf("product_model.GetLatestCount.recommend(%d)", recommend)
 	if useCache {
 		if ret, ok := cache.Cache.Get(k).(int64); ok {
@@ -185,7 +228,11 @@ func GetLatestCount(recommend int64, ptype string, useCache bool) int64 {
 	}
 	item := new(Product)
 	o := orm.NewOrm()
-	count, _ := o.QueryTable(item).Filter("recommend__gt", recommend).Filter("show_flag", true).Filter("ptype", ptype).Filter("status", 1).Count()
+	qs := o.QueryTable(item).Filter("recommend__gt", recommend).Filter("show_flag", true).Filter("ptype", ptype).Filter("status", 1)
+	if saleZone > int64(0) {
+		qs = qs.Filter("sale_zone", saleZone)
+	}
+	count, _ := qs.Count()
 
 	cache.Cache.Put(k, count, 10*time.Minute)
 	return count
@@ -258,7 +305,7 @@ func GetNoDeliveryPrd(id int64, province string, useCache bool) *Product {
 	return item
 }
 
-func GetProductsByCatId(cId, page, perPage, priceSort, saleSort int64, words string, useCache bool) (products []*Product) {
+func GetProductsByCatId(cId, saleZone, page, perPage, priceSort, saleSort int64, words string, useCache bool) (products []*Product) {
 	k := fmt.Sprintf("product_model.GetProductsByCatId(%d).page(%d).perPage(%d).words(%d)", cId, page, perPage, words)
 	if useCache {
 		if ret, ok := cache.Cache.Get(k).([]*Product); ok {
@@ -280,7 +327,8 @@ func GetProductsByCatId(cId, page, perPage, priceSort, saleSort int64, words str
 		saleSql = "sale_nums asc"
 	}
 	if len(priceSql) <= 0 && len(saleSql) <= 0 {
-		orderSql = "recommend desc,created_at desc"
+		//orderSql = "recommend desc,created_at desc"
+		orderSql = " (virtual_sold_count + sale_nums) desc"
 	} else if len(priceSql) <= 0 {
 		orderSql = saleSql
 	} else if len(saleSql) <= 0 {
@@ -291,7 +339,10 @@ func GetProductsByCatId(cId, page, perPage, priceSort, saleSort int64, words str
 
 	var cidSql string
 	if cId != 0 {
-		cidSql = fmt.Sprintf("and category_id=%d", cId)
+		cidSql = fmt.Sprintf(" and category_id=%d", cId)
+	}
+	if saleZone != 0 {
+		cidSql = cidSql + fmt.Sprintf(" and sale_zone=%d", saleZone)
 	}
 
 	if len(words) > 0 {
@@ -317,7 +368,7 @@ func GetProductsByCatId(cId, page, perPage, priceSort, saleSort int64, words str
 	return products
 }
 
-func GetProductCountByCatId(cId int64, words string, useCache bool) int64 {
+func GetProductCountByCatId(cId, saleZone int64, words string, useCache bool) int64 {
 	k := fmt.Sprintf("product_model.GetProductCountByCatId(%d)", cId)
 	if useCache {
 		if ret, ok := cache.Cache.Get(k).(int64); ok {
@@ -330,6 +381,11 @@ func GetProductCountByCatId(cId int64, words string, useCache bool) int64 {
 	if cId != 0 {
 		qs = qs.Filter("category_id", cId)
 	}
+
+	if saleZone != 0 {
+		qs = qs.Filter("sale_zone", saleZone)
+	}
+
 	if len(words) > 0 {
 		qs = qs.Filter("key_words__icontains", words)
 	}
@@ -513,3 +569,134 @@ func GetProductCountByRelateId(relateId int64, useCache bool) int64 {
 	return ret.Count
 
 }
+
+func DepartGetProductsByCatId(cId, saleZone, page, perPage, priceSort, saleSort, depart int64, words string, useCache bool) (products []*Product) {
+	k := fmt.Sprintf("product_model.GetProductsByCatId(%d).page(%d).perPage(%d).words(%d)", cId, page, perPage, words)
+	if useCache {
+		if ret, ok := cache.Cache.Get(k).([]*Product); ok {
+			return ret
+		}
+	}
+	var priceSql, saleSql, orderSql string
+	if priceSort == int64(1) {
+		//降序
+		priceSql = "a.price desc"
+	} else if priceSort == int64(2) {
+		//升序
+		priceSql = "a.price asc"
+	}
+	if saleSort == int64(1) {
+		//降序
+		saleSql = "a.sale_nums desc"
+	} else if priceSort == int64(2) {
+		saleSql = "a.sale_nums asc"
+	}
+	if len(priceSql) <= 0 && len(saleSql) <= 0 {
+		//orderSql = "recommend desc,created_at desc"
+		orderSql = " (a.virtual_sold_count + a.sale_nums) desc"
+	} else if len(priceSql) <= 0 {
+		orderSql = saleSql
+	} else if len(saleSql) <= 0 {
+		orderSql = priceSql
+	} else {
+		orderSql = fmt.Sprintf("%s,%s", priceSql, saleSql)
+	}
+
+	var cidSql string
+	if cId != 0 {
+		cidSql = fmt.Sprintf(" and a.category_id=%d", cId)
+	}
+	if saleZone != 0 {
+		cidSql = cidSql + fmt.Sprintf(" and a.sale_zone=%d", saleZone)
+	}
+
+	if len(words) > 0 {
+		cidSql = cidSql + fmt.Sprintf(" and a.key_words like '%s'", "%"+words+"%")
+	}
+
+	sql := `
+		select a.* from products a left join depart_records_products b on a.id=b.product_id
+			where a.status = ? and a.show_flag=? and a.ptype=? and (b.depart_record_id=? or b.depart_record_id is null ) %s
+			order by %s limit %d, %d ; 
+		`
+	sql = fmt.Sprintf(sql, cidSql, orderSql, (page-1)*perPage, perPage)
+	_, err := orm.NewOrm().Raw(sql, 1, true, TYPE_DIRECT_SALE, depart).QueryRows(&products)
+
+	if err != nil {
+		beego.BeeLogger.Debug("GetProductsByCatId err=%s", err)
+	}
+	for _, pd := range products {
+		pd.Cover = GetCoverByPId(pd.Id, useCache)
+	}
+	cache.Cache.Put(k, products, 10*time.Minute)
+	return products
+}
+
+func DepartGetProductCountByCatId(cId, saleZone, depart int64, words string, useCache bool) int64 {
+	k := fmt.Sprintf("product_model.DepartGetProductCountByCatId(%d)saleZone(%d)depart(%d)", cId, saleZone, depart)
+	if useCache {
+		if ret, ok := cache.Cache.Get(k).(int64); ok {
+			return ret
+		}
+	}
+
+	type Ret struct {
+		Count int64 `json:"count"` //总数
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	sql := `
+		 select count(DISTINCT a.id) as count from products a left join depart_records_products b on a.id=b.product_id
+			where a.status = ? and a.show_flag=? and a.ptype=? and (b.depart_record_id=? or b.depart_record_id is null ) %s
+			
+	`
+	var saleZoneSql string
+	if saleZone > int64(0) {
+		saleZoneSql = fmt.Sprintf(" and a.sale_zone=%d", saleZone)
+	}
+
+	if cId != 0 {
+		saleZoneSql = saleZoneSql + fmt.Sprintf(" and a.category_id=%d", cId)
+	}
+
+	if len(words) > 0 {
+		saleZoneSql = saleZoneSql + fmt.Sprintf(" and a.key_words like '%s'", "%"+words+"%")
+	}
+
+	sql = fmt.Sprintf(sql, saleZoneSql)
+
+	err := o.Raw(sql, 1, true, TYPE_DIRECT_SALE, depart).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("GetLatestCount, depart:%d, err=[%s]", depart, err)
+		return 0
+	}
+	if ret.Count < 0 {
+		return 0
+	}
+
+	cache.Cache.Put(k, ret.Count, 10*time.Minute)
+	return ret.Count
+}
+
+func DecideCanBuy(pid, depart int64) bool {
+
+	type Ret struct {
+		Count int64 `json:"count"` //总数
+	}
+	ret := &Ret{}
+	o := orm.NewOrm()
+	sql := `
+		 select count(DISTINCT a.id) as count from products a left join depart_records_products b on a.id=b.product_id
+			where a.id = ? and (b.depart_record_id=? or b.depart_record_id is null )
+			
+	`
+	err := o.Raw(sql, pid, depart).QueryRow(ret)
+	if err != nil {
+		beego.BeeLogger.Error("GetLatestCount, depart:%d, err=[%s]", depart, err)
+		return false
+	}
+	if ret.Count <= 0 {
+		return false
+	}
+	return true
+}

+ 36 - 0
go/gopath/src/fohow.com/apps/models/product_model/product_sale_type.go

@@ -0,0 +1,36 @@
+package product_model
+
+import (
+	// "time"
+
+	"github.com/astaxie/beego/orm"
+)
+
+const (
+	product_sale_types_tablename = "product_sale_types"
+)
+
+type ProductSaleType struct {
+	Id   int64  `orm:"column(id);pk"         json:"id"`   // int(11)
+	Name string `orm:"column(name)"          json:"name"` // varchar(20)
+}
+
+func (self *ProductSaleType) TableName() string {
+	return product_sale_types_tablename
+}
+
+func GetProductSaleTypeById(id int64) *ProductSaleType {
+	saleType := &ProductSaleType{Id: id}
+	if err := orm.NewOrm().Read(saleType); err != nil {
+		// beego.BeeLogger.Error("get name product cat by id err=[%s][", err)
+		return nil
+	}
+	return saleType
+}
+
+func GetProductSaleZones() (zones []*ProductSaleType) {
+	o := orm.NewOrm()
+	qs := o.QueryTable(new(ProductSaleType))
+	qs.OrderBy("id").All(&zones)
+	return zones
+}

+ 2 - 2
go/gopath/src/fohow.com/nginx/ngx_dev_config

@@ -49,8 +49,8 @@ server {
     server_name  tfohowapi.hiwavo.com;
     charset utf-8;
     #ssl on;
-    ssl_certificate      /root/sites/fohow_git/x_api/go/gopath/src/fohow.com/static/tapi/5539910_tfohowapi.hiwavo.com.pem;
-    ssl_certificate_key  /root/sites/fohow_git/x_api/go/gopath/src/fohow.com/static/tapi/5539910_tfohowapi.hiwavo.com.key;
+    ssl_certificate      /root/sites/fohow_git/x_api/go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.pem;
+    ssl_certificate_key  /root/sites/fohow_git/x_api/go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.key;
 
     ssl_session_cache    shared:SSL:1m;
     ssl_session_timeout  5m;

+ 2 - 3
go/gopath/src/fohow.com/nginx/ngx_test_config

@@ -54,9 +54,8 @@ server {
     server_name  tfohowapi.hiwavo.com;
     charset utf-8;
     #ssl on;
-    ssl_certificate      /home/rails/fohow/api/go/gopath/src/fohow.com/static/tapi/5754763_tfohowapi.hiwavo.com.pem;
-    ssl_certificate_key  /home/rails/fohow/api/go/gopath/src/fohow.com/static/tapi/5754763_tfohowapi.hiwavo.com.key;
-
+    ssl_certificate      /home/rails/fohow/api/go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.pem;
+    ssl_certificate_key  /home/rails/fohow/api/go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.key;
     ssl_session_cache    shared:SSL:1m;
     ssl_session_timeout  5m;
 

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

@@ -84,6 +84,10 @@ func init() {
 	//-----------商城相关 -----------
 	//首页频道栏目
 	beego.Router("/v1/categories", &category_controller.CategoryController{}, "get:Get")
+
+	//商品专区栏目
+	beego.Router("/v1/zones", &product_controller.ProductController{}, "get:SaleTypes")
+
 	//商品列表-精选推荐
 	beego.Router("/v1/products", &product_controller.ProductController{}, "get:Latest")
 	//商品分类
@@ -373,4 +377,10 @@ func init() {
 	beego.Router("/v1/pick_address/:id([0-9]+)", &pick_address_controller.PickAddressController{}, "delete:DeletePickAddress")
 	beego.Router("/v1/pick_departs", &pick_address_controller.PickAddressController{}, "get:PickDepartList")
 
+	//----------- 银豆账户相关-----------
+	//银豆账户变更列表
+	beego.Router("/v1/user/silvers", &balance_controller.BalanceController{}, "get:GetSilverList")
+	//银豆账户变更详情
+	beego.Router("/v1/user/silver/:id([0-9]+)", &balance_controller.BalanceController{}, "get:GetSilverDetail")
+
 }

+ 1 - 1
go/gopath/src/fohow.com/static/api/fileauth.txt

@@ -1 +1 @@
-20220424000000592u7dsyu63bkshes6oqpybhzap8pzmcqtgwy2w72rlx3rpwzb
+202206060000006d5hgl7w5c8p5ng2sk2osibi95brvwb8fgeamnu992wz8jqktz

+ 27 - 0
go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEA4E4k5B5AHPH4CU2PGpPwaAfwHUBJf5q0pAI6JdXIZiSyurmo
+6+RF1gdcUt4LmOesyH+FK9k7nqablT/QqS688KBJmtgIei7NpJZyXe9YR5Jkwu2B
+6j0eg8HlXSizyJZpcnpCkJ7/fSzTaMxrVNAhfE/26CWEmm+ZhymeRipdvLkIztdM
+pVwWnuoadDgJRwkCG9IMDnxzKG48zAiFEppWB268qgc+BfvLg5+fBC3RChWiJWR1
+IVyQIrDoSR32C8aad6e1LfMrz/nE+0LV6E4GAASka+fQsrlxCwHgThEt8yIKIlp0
+KcQO/IIc0paxYS8CzEqd/dGhiltMi5pYCYUJlwIDAQABAoIBAFdWVgr0tGYQ2VFV
+/7iLjfoTzSy2kWe8J0YND/MXcLZE58rI67sd4QtbRlmF1+Irox1WedX++bXmjYHp
+nSei6TKQVtiR8YsRmkTRx6pHvYnwuIclz4YTUkRfRR2m8YnS9y/55t1E65oj0BVo
+MwqNF9y9jhgKM72mYpM8Y0JS0LjgYJG/qRZR2RCvHAL8Qiq1/Q/dYw95B/TR/40L
+TEEORReaenD8E1k7mvrY/GjA66iZhvYZgcf0FyvbR954IK9eK/TpMP1a1deDnown
+pIWx2VUfV9LmG9gEM7f/EQTEaEau3cLw7/z2HeNXUmNVLJ2yC6KlRBNOnaFbSDX+
+m8mXvEECgYEA+DQhB/tQOqRVL+UGn2Aq0Ei9A+VmysL6DStlPz6KhDbddy8tju/5
+lQdVyb6ttD1cm5PeA9JPUqPGWTLlGLCPJShzcpb0To0fHwo1xesABmuor9cqE8XC
+KnZlSJWy3QrJ1/+O+wdQaawNyqIChT5EIIhR/f9GjH0pFYOxorkNRtECgYEA51nX
+hsGShErq0xAp1n//M99ghkF7WWefCiMRK/tnDrspx4q3Slmn4aERCeHywW6Mm5bq
+8htTy4LdR3W6Y1SbXXEudmkM1kubhoDPQfno/AnZSZIiLBm6lX3FSvndLAS+eqFL
+Ay2Bj9S0tcMcz4LRbdNcia1WFUXEqxwlSNMms+cCf2yWYd0cFf2R57MMf9k6OYDm
+UctikZYjt0ILuj/xHKi7WCjMeyIN2yNYEjAxO82fCuUFzBvf5tRA0oYzvgcPN5EK
+IXgAkuHK29K4pM3yAhDNCP/lIoOEAW6SXb1jwNzz21qkc+lfSc7xdxcvyeqBU0zo
+VvbIuBS+rTq8YvrN+wECgYEAoFCrf2AIDdB0ZQngVBmiWOnD04Tw2wVpOfcO4TF3
+OsgLrZC8brMuGLYqPnTqaYwXt4GfEWJKcM4gVHKKVGa+usPBdKBbGuyNu2jrNkbd
+YjnY7phrQbAakZjz7H60+tnWvNekSXFxRKAbEZFBF7MJOVer2mPZMSiFniUE2TAo
+s6UCgYEA1xplL7+JoKfTuu0vpZZUp+V+vkAKcea5Ly/6CJTip9mKBdmiK4HLWFrZ
+X01jQ/oFGHWiKuTfotiRA/aWdpdUnhl2MkJ3iAwZ6d0YHmu04q1WidSB16gb+PNh
+zG3H+c/HY3Mv/H0OLXY4d9hZ+xyQ/g3UO1C8ftmA1pN7gS4f+Fo=
+-----END RSA PRIVATE KEY-----

+ 62 - 0
go/gopath/src/fohow.com/static/tapi/7899796_tfohowapi.hiwavo.com.pem

@@ -0,0 +1,62 @@
+-----BEGIN CERTIFICATE-----
+MIIF/zCCBOegAwIBAgIQBmz8cJZVmTSATKY/B6b6VjANBgkqhkiG9w0BAQsFADBu
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
+RFYgVExTIENBIC0gRzEwHhcNMjIwNjA3MDAwMDAwWhcNMjMwNjA4MjM1OTU5WjAf
+MR0wGwYDVQQDExR0Zm9ob3dhcGkuaGl3YXZvLmNvbTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAOBOJOQeQBzx+AlNjxqT8GgH8B1ASX+atKQCOiXVyGYk
+srq5qOvkRdYHXFLeC5jnrMh/hSvZO56mm5U/0KkuvPCgSZrYCHouzaSWcl3vWEeS
+ZMLtgeo9HoPB5V0os8iWaXJ6QpCe/30s02jMa1TQIXxP9uglhJpvmYcpnkYqXby5
+CM7XTKVcFp7qGnQ4CUcJAhvSDA58cyhuPMwIhRKaVgduvKoHPgX7y4OfnwQt0QoV
+oiVkdSFckCKw6Ekd9gvGmnentS3zK8/5xPtC1ehOBgAEpGvn0LK5cQsB4E4RLfMi
+CiJadCnEDvyCHNKWsWEvAsxKnf3RoYpbTIuaWAmFCZcCAwEAAaOCAuYwggLiMB8G
+A1UdIwQYMBaAFFV0T7JyT/VgulDR1+ZRXJoBhxrXMB0GA1UdDgQWBBTMc9dJLZa2
+9Nq3WK1tzujcIW8uwjAfBgNVHREEGDAWghR0Zm9ob3dhcGkuaGl3YXZvLmNvbTAO
+BgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMD4G
+A1UdIAQ3MDUwMwYGZ4EMAQIBMCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGln
+aWNlcnQuY29tL0NQUzCBgAYIKwYBBQUHAQEEdDByMCQGCCsGAQUFBzABhhhodHRw
+Oi8vb2NzcC5kaWdpY2VydC5jb20wSgYIKwYBBQUHMAKGPmh0dHA6Ly9jYWNlcnRz
+LmRpZ2ljZXJ0LmNvbS9FbmNyeXB0aW9uRXZlcnl3aGVyZURWVExTQ0EtRzEuY3J0
+MAkGA1UdEwQCMAAwggGABgorBgEEAdZ5AgQCBIIBcASCAWwBagB3AOg+0No+9QY1
+MudXKLyJa8kD08vREWvs62nhd31tBr1uAAABgTwUdYMAAAQDAEgwRgIhALUhOa87
+OxXoxXVyPpWRUzPnn2+RQFO5wgvo6ZnKFaMRAiEA6wPJaMVqUf3AX8K74TdiAzZM
+QDBn9O+/kQaVgHeggLgAdgA1zxkbv7FsV78PrUxtQsu7ticgJlHqP+Eq76gDwzvW
+TAAAAYE8FHWfAAAEAwBHMEUCIQDmhC8oCM9KOgRzK/8zPnzc0FPr3DHaRS1+ThXf
++sWFuwIgAsBt+vZLtL7r9o4TyZ8FkjMUTbqLCql6IuSphfRWp0IAdwC3Pvsk35xN
+unXyOcW6WPRsXfxCz3qfNcSeHQmBJe20mQAAAYE8FHWmAAAEAwBIMEYCIQCO6YVu
+lktE9BxqUOq2IG6Nk+DKOl08COlrUn8I5pbpsQIhANtBwGXUuk1u+k0kl4yLFtEF
+Kk/Sf8nKU/iwn6iLKnBlMA0GCSqGSIb3DQEBCwUAA4IBAQCi6o9vX1450QaewC9M
+ql4EjJDH8S1hpQWiatJmFzSyDJAKnf+ul7vQce4ec2UCT2lMX6padjv1DNhK/s1C
+WAGHxZXo5eIByYoDdVkuSYyXjCoc+ycbNhoXrXOiToManRlnohlqnnpHomcTLDES
+w/xdat0L+kMXZBdRDcIgV0t0soJmwBa4mta3gy77S4jPfajnbR+gB/jU6m9ACmW5
+0+hjjhfTZJy7yIkE4UsYThp+EdKmHrGPK2okYwcYfUltGXK7dFIDx12ACQtIs8LY
+dZC/gvlhrykIhreF3qzdIWO48NyYq5E8JXWdlC9VY/1W8tEGg+51dIbay8oIl/0E
+pbHO
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
+MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
+oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
+lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
+pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
+yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
+wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
+pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
+BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
+AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
+Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
+Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
+/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
+MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
+SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
+M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
+4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
+sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
+rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
+-----END CERTIFICATE-----

+ 1 - 1
go/gopath/src/fohow.com/static/tapi/fileauth.txt

@@ -1 +1 @@
-202106050000000dah8uinibv1ksxcdtwpi743s2h3smc886je741gyxu87tqdhe
+202206060000002r7gkk4aclmop58pjkpoo8x1km1ru2xlrtl0jv1qfu87gbvsoy