Browse Source

wip:身份提交

wkyuer 4 months ago
parent
commit
62b0b81e24

+ 2 - 0
config.yaml

@@ -25,6 +25,8 @@ redis:
     address: 127.0.0.1:6379
   other: # 广告位
     address: 127.0.0.1:6379
+  session:
+    address: 172.20.45.129:1713
 
 mongodb:
   default:

+ 13 - 0
global.yaml

@@ -0,0 +1,13 @@
+#allowEntId: 176278
+
+#销售业绩默认渠道设置
+deptDefaultChannel:
+  26820: "x020" #销售一部/电销部及其下属部门
+  27955: "x020" #销售三部
+  27275: "x021" #销售一部/大客户部
+  59006: "x021" #数据事业部及下属部门
+  59010: "x021" #市场部及下属部门
+  59005: "x022" #运营部/客户成功组
+
+#销售部门
+saleDeptShowArr: ["销售一部","产品部","运营部","销售三部","市场部","数据事业部","质量部"]

+ 15 - 2
internal/cmd/cmd.go

@@ -5,6 +5,7 @@ import (
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/gogf/gf/v2/os/gcmd"
+	"github.com/gogf/gf/v2/os/gsession"
 	"jyOrderManager/internal/controller"
 	_ "jyOrderManager/internal/logic/product/bigmember"
 	_ "jyOrderManager/internal/logic/product/dataPack"
@@ -20,18 +21,22 @@ var (
 		Brief: "start http server",
 		Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
 			s := g.Server()
+			s.SetSessionIdName("SESSIONID")
+			s.SetSessionStorage(gsession.NewStorageRedis(g.Redis("session")))
 			s.Group("/", func(group *ghttp.RouterGroup) {
-				group.Middleware(
+				//group.Middleware()
+				s.BindMiddlewareDefault(
 					service.Middleware().Log,                       //访问日志
 					service.Middleware().MiddlewareHandlerResponse, //统一返回值
-					service.Middleware().Ctx,                       //session注册中间件
 					service.Middleware().LoginFilter,               //登录过滤
 				)
+				//产品相关
 				s.Group("/product", func(group *ghttp.RouterGroup) {
 					group.GET("/list", controller.GetProductListHandler)       //商品表列表
 					group.POST("/getPrice", controller.GetProductPriceHandler) //获取价格
 				})
 
+				//订单相关
 				s.Group("/order", func(group *ghttp.RouterGroup) {
 					group.POST("/save", controller.SaveOrderHandler) //创建订单
 					group.GET("/examine", controller.Examine)        //订单审核
@@ -39,6 +44,14 @@ var (
 					//group.GET("/list", controller.EmptyHandler)      //订单列表
 					//group.GET("/detail", controller.EmptyHandler)    //订单详情
 				})
+
+				//订单相关
+				s.Group("/common", func(group *ghttp.RouterGroup) {
+					group.GET("/getSelectItem", controller.GetSelectItemHandler) //创建订单
+					group.GET("/examine", controller.Examine)                    //订单审核
+					group.GET("/refund", controller.OrderRefund)                 //订单回款
+				})
+
 			})
 			s.Run()
 			return nil

+ 22 - 0
internal/controller/commonHandler.go

@@ -0,0 +1,22 @@
+package controller
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"jyOrderManager/internal/jyutil"
+)
+
+func GetSelectItemHandler(r *ghttp.Request) {
+	rData, err := func() (interface{}, error) {
+		return g.Map{
+			"deptTree":           jyutil.JyDepartmentManager.GetShowDeptTree(g.Cfg("global").MustGet(r.Context(), "saleDeptShowArr").Strings()...), //可选择销售部门tree
+			"defaultSaleChannel": g.Cfg("global").MustGet(r.Context(), "deptDefaultChannel").Map(),                                                 //默认销售渠道
+			"channel":            jyutil.GetChannel(r.Context()),                                                                                   //销售渠道
+		}, nil
+	}()
+	if err != nil {
+		g.Log().Errorf(r.Context(), "GetSelectItemHandler 异常 %v", err)
+	}
+	r.Response.WriteJson(NewResult(rData, err))
+}

+ 42 - 0
internal/jyutil/channel.go

@@ -0,0 +1,42 @@
+package jyutil
+
+import (
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+var (
+	cacheChannelData = []g.Map{}
+)
+
+func GetChannel(ctx context.Context) []g.Map {
+	if len(cacheChannelData) > 0 {
+		return cacheChannelData
+	}
+	var rData []g.Map
+	res, err := g.DB().Query(ctx, "SELECT item_code,item_name FROM jianyu.dict_item WHERE parent_name='销售渠道' AND state=1")
+	if err != nil {
+		g.Log().Errorf(ctx, "GetChannel 获取销售渠道异常 %v", err)
+	}
+	if !res.IsEmpty() {
+		for _, m := range res.List() {
+			var (
+				itemCode = gconv.String(m["item_code"])
+				itemName = gconv.String(m["item_name"])
+			)
+			res, err := g.DB().Query(ctx, "SELECT item_code,item_name FROM jianyu.dict_item WHERE parent_code=? AND state=1", itemCode)
+			if err != nil {
+				g.Log().Errorf(ctx, "GetChannel 获取 %s 销售渠道异常 %v", gconv.String(m["item_code"]), err)
+				continue
+			}
+			rData = append(rData, g.Map{
+				"item_code": itemCode,
+				"item_name": itemName,
+				"children":  res.List(),
+			})
+		}
+	}
+	cacheChannelData = rData
+	return cacheChannelData
+}

+ 175 - 0
internal/jyutil/dept.go

@@ -0,0 +1,175 @@
+package jyutil
+
+import (
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/crypto/gmd5"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gcron"
+	"github.com/gogf/gf/v2/util/gconv"
+	"sync"
+)
+
+type (
+	DeptManager struct {
+		deptTree      *DeptStruct
+		idDeptMapping map[int]*DeptStruct
+		lock          *sync.RWMutex
+		lastMd5       string
+	}
+	DeptStruct struct {
+		IsRoot   bool          `json:"-"`
+		Id       int           `json:"value"`
+		Pid      int           `json:"-"`
+		FullName string        `json:"-"`
+		Name     string        `json:"label"`
+		Children []*DeptStruct `json:"children,omitempty"`
+	}
+)
+
+var (
+	JyDepartmentManager = &DeptManager{
+		lock: &sync.RWMutex{},
+	}
+)
+
+func init() {
+	ctx := context.Background()
+	JyDepartmentManager.initAndUpdateDeptManager(ctx)
+	c, e := gcron.Add(ctx, g.Cfg().MustGet(ctx, "cron.updateDept", "5 * * * * *").String(), JyDepartmentManager.initAndUpdateDeptManager)
+	if e != nil {
+		g.Log().Errorf(ctx, "initAndUpdateDeptManager cron任务异常 %v", e)
+	}
+	c.Status()
+}
+
+func (mge *DeptManager) initAndUpdateDeptManager(ctx context.Context) {
+	res, err := g.DB().Query(ctx, "SELECT id,pid,name FROM jianyu.entniche_department where ent_id=? ", g.Cfg("global").MustGet(ctx, "powerEntId", 25917).Int64())
+	if err != nil || res.IsEmpty() {
+		return
+	}
+	md5Str := gmd5.MustEncryptString(res.Json())
+	if mge.lastMd5 != "" && mge.lastMd5 == md5Str {
+		return
+	}
+	var (
+		deptTree      *DeptStruct
+		allDept       []*DeptStruct
+		idDeptMapping = map[int]*DeptStruct{}
+
+		loopCount = 0
+	)
+
+	for _, m := range res.List() {
+		var (
+			id   = gconv.Int(m["id"])
+			pid  = gconv.Int(m["pid"])
+			name = gconv.String(m["name"])
+		)
+		deptObj := &DeptStruct{
+			Id:   id,
+			Pid:  pid,
+			Name: name,
+		}
+		if pid == 0 { //公司根部门id
+			deptObj.IsRoot = true
+			deptTree = deptObj
+			idDeptMapping[deptObj.Id] = deptObj
+		}
+
+		allDept = append(allDept, deptObj)
+	}
+	//拼接组织架构树
+	for len(idDeptMapping) != res.Len() {
+		for _, deptStruct := range allDept {
+			_, ok1 := idDeptMapping[deptStruct.Id]
+			if ok1 {
+				continue
+			}
+			p, ok2 := idDeptMapping[deptStruct.Pid]
+			if ok2 {
+				p.Children = append(p.Children, deptStruct)
+				idDeptMapping[deptStruct.Id] = deptStruct
+			}
+		}
+		loopCount++
+		if loopCount == 50 {
+			break
+		}
+	}
+	mge.lock.Lock()
+	defer mge.lock.Unlock()
+	mge.deptTree = deptTree
+	mge.idDeptMapping = idDeptMapping
+	mge.lastMd5 = md5Str
+	//递归获取部门全名
+	for _, deptStruct := range idDeptMapping {
+		deptStruct.FullName = mge.getDeptFullName(deptStruct.Id)
+	}
+}
+
+func (mge *DeptManager) getDeptFullName(deptId int) string {
+	node, ok := mge.idDeptMapping[deptId]
+	if !ok {
+		return ""
+	}
+	if pNode, _ := mge.idDeptMapping[node.Pid]; pNode != nil {
+		if pNode.IsRoot {
+			return node.Name
+		} else {
+			return fmt.Sprintf("%s/%s", mge.getDeptFullName(pNode.Id), node.Name)
+		}
+	}
+	return node.Name
+}
+
+func (mge *DeptManager) GetDeptNode(deptId int) *DeptStruct {
+	node, ok := mge.idDeptMapping[deptId]
+	if !ok {
+		return nil
+	}
+	return node
+}
+
+func (mge *DeptManager) GetDeptAllChildNode(deptId int) []*DeptStruct {
+	var rData []*DeptStruct
+	node, ok := mge.idDeptMapping[deptId]
+	if !ok || node == nil {
+		return nil
+	}
+	for _, child := range node.Children {
+		rData = append(rData, child)
+		rData = append(rData, mge.GetDeptAllChildNode(child.Id)...)
+	}
+	return rData
+}
+
+// GetFullDeptName 通过部门id获取部门全名
+func (mge *DeptManager) GetFullDeptName(deptId int) string {
+	dept, ok := mge.idDeptMapping[deptId]
+	if !ok {
+		return ""
+	}
+	mge.lock.RLock()
+	defer mge.lock.RUnlock()
+	return dept.FullName
+}
+
+// GetShowDeptTree 根据部门名字获取展示根部门
+func (mge *DeptManager) GetShowDeptTree(deptName ...string) (rData []interface{}) {
+	mge.lock.RLock()
+	defer mge.lock.RUnlock()
+	for _, child := range mge.deptTree.Children {
+		var ok bool
+		for _, name := range deptName {
+			if child.Name == name {
+				ok = true
+				break
+			}
+		}
+		if ok {
+			rData = append(rData, child)
+		}
+	}
+	return rData
+}

+ 24 - 0
internal/jyutil/user.go

@@ -94,6 +94,30 @@ func SaveUserLog(userid, phone string) {
 	MG.DB().Save("register_log", data)
 }
 
+func GetUserFullId(phone, companyName string) (mongoUserId string, baseUserId, entId, entUserId int64) {
+	userData, ok := MG.DB().FindOne("user", map[string]interface{}{
+		"$or": []map[string]interface{}{
+			{"s_phone": phone},
+			{"s_m_phone": phone},
+		},
+	})
+	if ok && userData != nil && len(*userData) > 0 {
+		mongoUserId = mongodb.BsonIdToSId((*userData)["_id"])
+		baseUserId = gconv.Int64((*userData)["base_user_id"])
+	}
+	if companyName == "" {
+		entUser, err := g.DB().Ctx(ctx).GetOne(ctx, fmt.Sprintf(`SELECT a.ent_id,a.id FROM entniche_user a
+			LEFT JOIN entniche_info b on b.name='%s' and a.ent_id = b.id
+			WHERE phone = '%s'  limit 1`, companyName, phone))
+		if err == nil && !entUser.IsEmpty() {
+			entId = gconv.Int64(entUser.Map()["ent_id"])
+			entUserId = gconv.Int64(entUser.Map()["id"])
+		}
+	}
+
+	return
+}
+
 var getPositionIdByMongoUserId = func(mgoUserId string) int64 {
 	userData, ok := MG.DB().FindById("user", mgoUserId, `"base_user_id":1`)
 	if userData != nil && len(*userData) > 0 && ok {

+ 0 - 57
internal/logic/bizctx/bizctx.go

@@ -1,57 +0,0 @@
-package bizctx
-
-import (
-	"context"
-	"jyOrderManager/internal/consts"
-	"jyOrderManager/internal/model"
-	"jyOrderManager/internal/service"
-
-	"github.com/gogf/gf/v2/net/ghttp"
-)
-
-type sBizCtx struct {
-}
-
-func init() {
-	service.RegisterBizCtx(&sBizCtx{})
-}
-
-func (s *sBizCtx) Init(r *ghttp.Request) error {
-	mCtx := &model.Context{
-		Request: r,
-		Session: r.Session,
-	}
-	r.SetCtxVar(consts.ContextKey, mCtx)
-	//从redis获取用户信息及当前小程序
-	mCtx.User = service.Session().GetUser(r.Context())
-	return nil
-}
-
-func (s *sBizCtx) Get(ctx context.Context) *model.Context {
-	value := ctx.Value(consts.ContextKey)
-	if value == nil {
-		return nil
-	}
-	if localCtx, ok := value.(*model.Context); ok {
-		return localCtx
-	}
-	return nil
-}
-
-// GetSession 获取session
-func (s *sBizCtx) GetSession(ctx context.Context) *ghttp.Session {
-	value := s.Get(ctx)
-	if value == nil {
-		return nil
-	}
-	return value.Session
-}
-
-// GetRequest 一般情况下使用不到此方法;不建议使用
-func (s *sBizCtx) GetRequest(ctx context.Context) *ghttp.Request {
-	value := s.Get(ctx)
-	if value == nil {
-		return nil
-	}
-	return value.Request
-}

+ 0 - 2
internal/logic/logic.go

@@ -5,8 +5,6 @@
 package logic
 
 import (
-	_ "jyOrderManager/internal/logic/bizctx"
 	_ "jyOrderManager/internal/logic/middleware"
 	_ "jyOrderManager/internal/logic/productManager"
-	_ "jyOrderManager/internal/logic/session"
 )

+ 15 - 7
internal/logic/middleware/middleware.go

@@ -1,13 +1,14 @@
 package middleware
 
 import (
+	//. "app.yhyue.com/moapp/jybase/api"
 	"context"
+	"fmt"
 	"jyOrderManager/internal/jyutil"
 	"jyOrderManager/internal/model"
 	"jyOrderManager/internal/service"
-	"sync"
-
 	"net/http"
+	"sync"
 	"time"
 
 	util "app.yhyue.com/moapp/jybase/common"
@@ -82,13 +83,20 @@ func (s *sMiddleware) Log(r *ghttp.Request) {
 	r.Middleware.Next()
 }
 
-// Ctx 获取用户身份
-func (s *sMiddleware) Ctx(r *ghttp.Request) {
-	r.Middleware.Next()
-}
-
 // LoginFilter 登录过滤拦截
 func (s *sMiddleware) LoginFilter(r *ghttp.Request) {
+	var (
+		entId      = r.Session.MustGet("entId", 0).Int64()
+		positionId = r.Session.MustGet("positionId", 0).Int64()
+	)
+	if entId == 0 || positionId == 0 {
+		r.SetError(fmt.Errorf("身份异常"))
+		return
+	}
+	if entId != g.Cfg("global").MustGet(r.Context(), "powerEntId", 25917).Int64() {
+		r.SetError(fmt.Errorf("非法请求"))
+		return
+	}
 	r.Middleware.Next()
 }
 

+ 4 - 3
internal/logic/order/order.go

@@ -25,9 +25,10 @@ func SaveOrder(ctx context.Context, param model.OrderParams) (string, error) {
 	)
 	for _, tParam := range param.ProductArr {
 		//参数注入
-		tParam["phone"] = param.PersonPhone    //开通手机号
-		tParam["order_code"] = orderCode       //订单号
-		tParam["reqBuySet"] = param.BuySubject //购买主体
+		tParam["phone"] = param.PersonPhone          //开通手机号
+		tParam["order_code"] = orderCode             //订单号
+		tParam["reqBuySet"] = param.BuySubject       //购买主体
+		tParam["reqCompanyName"] = param.CompanyName //公司名称
 		productCode := gconv.String(tParam["product_code"])
 		pFunc, err := product.JyProFunc.GetProductInitFuncByCode(productCode)
 		if err != nil {

+ 1 - 1
internal/logic/product/jyProductInterface.go

@@ -17,7 +17,7 @@ type (
 	ProductInitFunc func(reqMap map[string]interface{}, orderDetailId ...int64) (JyProduct, error)
 
 	JyProduct interface {
-		Check(int) error                       //参数校验 0:获取价格校验 1:数据保存校验 2:活动数据保存
+		Check(int) error                       //参数校验 0:获取价格校验 1:数据保存校验 2:活动数据保存(活动不校验购买内容)
 		GetPrice() (int64, error)              //查询价格
 		SaveUpdate(ctx context.Context) error  //保存更新
 		OpenService(ctx context.Context) error //开通服务

+ 19 - 2
internal/logic/product/subvip/check.go

@@ -29,7 +29,7 @@ func (p jySubVipProduct) Check(t int) error {
 		return errors.New("超级订阅-请选择时间")
 	}
 
-	if t == 1 { //订单报错校验
+	if t == 1 || t == 2 { //订单报错校验
 		if !(p.OrderDetail.Tactics == 1 || p.OrderDetail.Tactics == 2) {
 			return fmt.Errorf("超级订阅-参数异常")
 		}
@@ -57,7 +57,24 @@ func (p jySubVipProduct) Check(t int) error {
 			return errors.Wrap(err, "超级订阅-金额校验计算异常")
 		}
 		if p.OrderDetail.OriginalPrice != m {
-			return fmt.Errorf("超级订阅- 金额校验异常 %s  %d!=%d", p.OrderDetail.ProductCode, p.OrderDetail.Amount, m)
+			return fmt.Errorf("超级订阅- 金额校验异常 %s  %d!=%d", p.OrderDetail.ProductCode, p.OrderDetail.OriginalPrice, m)
+		}
+
+		//校验会员状态
+		if t == 1 {
+			//mgoId, baseUserId, entId, entUserId := jyutil.GetUserFullId(p.OrderDetail.Phone, p.OrderDetail.ReqCompanyName)
+			//if baseUserId == 0 && (p.OrderDetail.ServiceType == 2 || p.OrderDetail.ServiceType == 3) { //续费升级
+			//	return fmt.Errorf("超级订阅-当前账户不支持此操作")
+			//}
+			//
+			//switch p.OrderDetail.ReqBuySet {
+			//case 1: //个人
+			//	jyutil.Middleground.UserCenter.IdentityByUserId(baseUserId)
+			//case 2: //企业
+			//	jyutil.Middleground.UserCenter.IdentityByEntUserId(entUserId)
+			//}
+			//
+			//p := jyutil.Middleground.PowerCheckCenter.Check("10000", mgoId,baseUserId)
 		}
 	}
 	return nil

+ 0 - 32
internal/logic/session/session.go

@@ -1,32 +0,0 @@
-package session
-
-import (
-	"context"
-	"fmt"
-	"jyOrderManager/internal/model"
-	"jyOrderManager/internal/service"
-
-	"github.com/gogf/gf/v2/util/gconv"
-)
-
-type (
-	sSession struct{}
-)
-
-func init() {
-	service.RegisterSession(&sSession{})
-}
-
-func (s *sSession) GetUser(ctx context.Context) *model.User {
-	bizCtx := service.BizCtx().Get(ctx)
-	if bizCtx != nil {
-		if v, e := bizCtx.Session.Data(); e == nil && v != nil {
-			user := &model.User{}
-			if err := gconv.Struct(v, user); err != nil {
-				fmt.Println(err)
-			}
-			return user
-		}
-	}
-	return nil
-}

+ 10 - 8
internal/model/orderParams.go

@@ -12,17 +12,19 @@ type (
 
 		Tactics int `json:"tactics"` //策略 1仅购买 2仅赠送 3购买+赠送
 
-		ReqBuySet int `json:"reqBuySet,omitempty"` // 购买主体
+		ReqBuySet      int    `json:"reqBuySet,omitempty"`      // 购买主体
+		ReqCompanyName string `json:"reqCompanyName,omitempty"` // 购买主体
 	}
 
 	OrderParams struct {
-		OrderStatus    int    `form:"order_status" json:"orderStatus,omitempty"`      // 订单状态  0 未完成 1 已完成
-		BuySubject     int    `form:"buySubject" json:"buySubject"`                   // 购买主体  1 个人, 2公司
-		PaybackCompany string `form:"paybackCompany" json:"paybackCompany,omitempty"` // 签约主体  回款公司
-		ContactsName   string `json:"personName,omitempty"`                           // 联系人
-		ContactsPhone  string `json:"personPhone"`                                    // 联系人手机号
-		PersonPhone    string `json:"userPhone"`                                      // 开通服务手机号
-		OrderCode      string `json:"orderCode,omitempty"`                            // 订单号
+		OrderStatus    int    `form:"order_status" json:"orderStatus,omitempty"`   // 订单状态  0 未完成 1 已完成
+		BuySubject     int    `form:"buySubject" json:"buySubject"`                // 购买主体  1 个人, 2公司
+		CompanyName    string `form:"paybackCompany" json:"companyName,omitempty"` // 公司名称
+		PaybackCompany string `form:"paybackCompany" json:"paybackCompany"`        // 签约主体  回款公司
+		ContactsName   string `json:"personName,omitempty"`                        // 联系人
+		ContactsPhone  string `json:"personPhone"`                                 // 联系人手机号
+		PersonPhone    string `json:"userPhone"`                                   // 开通服务手机号
+		OrderCode      string `json:"orderCode,omitempty"`                         // 订单号
 
 		ProductArr        []map[string]interface{} `json:"productArr"`                                           //产品
 		ContractMoney     int                      `json:"contractMoney"`                                        //合同金额

+ 0 - 39
internal/service/bizctx.go

@@ -1,39 +0,0 @@
-// ================================================================================
-// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
-// You can delete these comments if you wish manually maintain this interface file.
-// ================================================================================
-
-package service
-
-import (
-	"context"
-	"jyOrderManager/internal/model"
-
-	"github.com/gogf/gf/v2/net/ghttp"
-)
-
-type (
-	IBizCtx interface {
-		Init(r *ghttp.Request) error
-		Get(ctx context.Context) *model.Context
-		// GetSession 获取session
-		GetSession(ctx context.Context) *ghttp.Session
-		// GetRequest 一般情况下使用不到此方法;不建议使用
-		GetRequest(ctx context.Context) *ghttp.Request
-	}
-)
-
-var (
-	localBizCtx IBizCtx
-)
-
-func BizCtx() IBizCtx {
-	if localBizCtx == nil {
-		panic("implement not found for interface IBizCtx, forgot register?")
-	}
-	return localBizCtx
-}
-
-func RegisterBizCtx(i IBizCtx) {
-	localBizCtx = i
-}

+ 0 - 2
internal/service/middleware.go

@@ -13,8 +13,6 @@ type (
 	IMiddleware interface {
 		// 访问日志
 		Log(r *ghttp.Request)
-		// Ctx 获取用户身份
-		Ctx(r *ghttp.Request)
 		// LoginFilter 登录过滤拦截
 		LoginFilter(r *ghttp.Request)
 		// CORS 允许跨域请求

+ 0 - 33
internal/service/session.go

@@ -1,33 +0,0 @@
-// ================================================================================
-// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
-// You can delete these comments if you wish manually maintain this interface file.
-// ================================================================================
-
-package service
-
-import (
-	"context"
-	"jyOrderManager/internal/model"
-)
-
-type (
-	ISession interface {
-		GetUser(ctx context.Context) *model.User
-		//CreateSession(ctx context.Context, phone, openid, unionid, miniprogramCode string) int
-	}
-)
-
-var (
-	localSession ISession
-)
-
-func Session() ISession {
-	if localSession == nil {
-		panic("implement not found for interface ISession, forgot register?")
-	}
-	return localSession
-}
-
-func RegisterSession(i ISession) {
-	localSession = i
-}