wangkaiyue %!s(int64=2) %!d(string=hai) anos
achega
8e7784b0aa

+ 60 - 0
api/v1/aiChatApi.go

@@ -0,0 +1,60 @@
+package v1
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+type CommonRes struct {
+	ErrorMsg  string      `json:"error_msg"`
+	ErrorCode int64       `json:"error_code"`
+	Data      interface{} `json:"data"`
+}
+
+// ChatHistoryReq 历史记录
+type ChatHistoryReq struct {
+	g.Meta   `path:"/chatHistory" tags:"AiChat" method:"post" summary:"查询聊天历史记录"`
+	PageSize int `v:"between:1,20" dc:"每页数据量"`
+	PageNum  int `v:"between:1,20" dc:"页码"`
+}
+
+type History struct {
+	Id         string `json:"id" dc:"信息加密id"`
+	Content    string `json:"content" dc:"内容"`
+	Type       int    `json:"type" dc:"1:用户提问 2:智能助手回复"`
+	Useful     int    `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
+	CreateTime int64  `json:"create_time" dc:"聊天时间"`
+}
+
+type ChatHistoryRes struct {
+	Data      []History `json:"data"`
+	ErrorMsg  string    `json:"error_msg"`
+	ErrorCode int64     `json:"error_code"`
+}
+
+// EvaluateReq 评价
+type EvaluateReq struct {
+	g.Meta    `path:"/evaluate" tags:"AiChat" method:"post" summary:"评价回复的问题"`
+	MessageId string `v:"required"`
+	Evaluate  int    `v:"in:-1,1" dc:"-1:没用;1:有用"`
+}
+
+type EvaluateRes struct {
+}
+
+// GuessQuestionReq 猜你想问
+type GuessQuestionReq struct {
+	g.Meta `path:"/guessQuestion" tags:"AiChat" method:"post" summary:"获取场景下的猜你想问"`
+	Href   string `v:"required|length:6,16"`
+}
+
+type GuessQuestionRes struct {
+}
+
+// UsuallyProblemReq 常见问题
+type UsuallyProblemReq struct {
+	g.Meta `path:"/usuallyProblem" tags:"AiChat" method:"post" summary:"获取场景下的常见问题"`
+	Href   string `v:"required|length:6,16"`
+}
+
+type UsuallyProblemRes struct {
+}

+ 10 - 0
go.mod

@@ -0,0 +1,10 @@
+module aiChat
+
+go 1.15
+
+require (
+	app.yhyue.com/moapp/jybase v0.0.0-20230405040249-a36a23595798
+	github.com/gogf/gf/contrib/drivers/mysql/v2 v2.3.3
+	github.com/gogf/gf/contrib/nosql/redis/v2 v2.3.3
+	github.com/gogf/gf/v2 v2.3.1
+)

+ 36 - 0
internal/cmd/cmd.go

@@ -0,0 +1,36 @@
+package cmd
+
+import (
+	"aiChat/internal/controller"
+	"aiChat/utility"
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/os/gcmd"
+)
+
+var (
+	Main = gcmd.Command{
+		Name:  "aiChat",
+		Usage: "main",
+		Brief: "start http aiChat server",
+		Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
+			s := g.Server()
+			s.Use(utility.MiddlewareHandlerResponse)
+			s.Group("/aiChat", func(group *ghttp.RouterGroup) {
+				group.ALL("/ws", controller.ChatWs)               //websocket 聊天
+				group.ALL("/chatHistory", controller.ChatHistory) //历史记录
+				group.ALL("/evaluate", controller.Evaluate)
+
+				group.Bind(
+					//	controller.ChatHistory,    //历史记录
+					//	controller.Evaluate,       //评价
+					//	controller.GuessQuestion,  //猜你想问
+					controller.UsuallyProblem, //常见问题
+				)
+			})
+			s.Run()
+			return nil
+		},
+	}
+)

+ 1 - 0
internal/consts/consts.go

@@ -0,0 +1 @@
+package consts

+ 43 - 0
internal/controller/chatHistory.go

@@ -0,0 +1,43 @@
+package controller
+
+import (
+	v1 "aiChat/api/v1"
+	"aiChat/internal/model"
+	"aiChat/utility"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/os/glog"
+)
+
+// ChatHistory 获取聊天记录
+func ChatHistory(r *ghttp.Request) {
+	final := func() (res v1.ChatHistoryRes) {
+		res = v1.ChatHistoryRes{}
+		session, _ := utility.GetSession(r)
+		if session.AccountId == 0 {
+			res.ErrorCode = -1
+			res.ErrorMsg = "未登陆"
+			return
+		}
+		pageSize := r.Get("PageSize", 5).Int()
+		pageNum := r.Get("PageNum", 0).Int()
+		history, err := model.Message.GetMessage(session.AccountId, pageNum, pageSize)
+		if err != nil {
+			glog.Error(r.Context(), "%d查询聊天记录异常,error:%s", session.AccountId, err)
+			res.ErrorCode = -1
+			res.ErrorMsg = "数据查询异常"
+			return
+		}
+		for _, v := range history {
+			res.Data = append(res.Data, v1.History{
+				Id:         encrypt.SE.Encode2Hex(v.Id),
+				Content:    v.Content,
+				Type:       v.Type,
+				Useful:     v.Useful,
+				CreateTime: v.CreateTime.Unix(),
+			})
+		}
+		return
+	}()
+	r.Response.Write(final)
+}

+ 40 - 0
internal/controller/chatWs.go

@@ -0,0 +1,40 @@
+package controller
+
+import (
+	"aiChat/internal/model"
+	"aiChat/utility"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/gogf/gf/v2/os/glog"
+)
+
+// ChatWs 聊天websocket请求
+var ChatWs = func(r *ghttp.Request) {
+	session, _ := utility.GetSession(r)
+	wsChat := model.NewMessage(gctx.New(), session.AccountId)
+	// 创建ws链接
+	ws, err := r.WebSocket()
+	if err != nil {
+		glog.Error(wsChat.Ctx, session.AccountId, "建立连接出错", err)
+		r.Exit()
+	}
+	if session.AccountId == 0 {
+		_ = ws.WriteJSON(g.Map{
+			"error_code": -1,
+			"error_msg":  "无用户身份",
+		})
+		return
+	}
+	for {
+		// 接受客户端信息
+		_, msg, err := ws.ReadMessage()
+		if err != nil {
+			glog.Info(wsChat.Ctx, session.AccountId, "接收消息出错", err)
+			_ = ws.Close()
+			return
+		}
+		// 处理ws
+		wsChat.Handle(ws, msg, r.GetClientIp(), r.UserAgent())
+	}
+}

+ 37 - 0
internal/controller/evaluate.go

@@ -0,0 +1,37 @@
+package controller
+
+import (
+	v1 "aiChat/api/v1"
+	"aiChat/internal/model"
+	"aiChat/utility"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"github.com/gogf/gf/v2/net/ghttp"
+)
+
+// Evaluate 点评问答
+func Evaluate(r *ghttp.Request) {
+	final := func() (res v1.CommonRes) {
+		session, _ := utility.GetSession(r)
+		if session.AccountId == 0 {
+			res.ErrorCode = -1
+			res.ErrorMsg = "未登陆"
+			return
+		}
+		evaluate := r.Get("Evaluate").Int()
+		id := encrypt.SE.Decode4Hex(r.Get("MessageId").String())
+		if id == "" {
+			res.ErrorCode = -1
+			res.ErrorMsg = "未找到记录"
+			return
+		}
+		err := model.Message.Evaluate(session.AccountId, id, evaluate)
+		if err != nil {
+			res.ErrorCode = -1
+			res.ErrorMsg = "评价异常"
+			return
+		}
+		res.Data = true
+		return
+	}()
+	r.Response.Write(final)
+}

+ 18 - 0
internal/controller/guessQuestion.go

@@ -0,0 +1,18 @@
+package controller
+
+import (
+	v1 "aiChat/api/v1"
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+var (
+	GuessQuestion = cGuessQuestion{}
+)
+
+type cGuessQuestion struct{}
+
+func (c *cGuessQuestion) Method(ctx context.Context, req *v1.GuessQuestionReq) (res *v1.GuessQuestionRes, err error) {
+	g.RequestFromCtx(ctx).Response.Writeln("Hi!")
+	return
+}

+ 18 - 0
internal/controller/usuallyProblem.go

@@ -0,0 +1,18 @@
+package controller
+
+import (
+	v1 "aiChat/api/v1"
+	"context"
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+var (
+	UsuallyProblem = cUsuallyProblem{}
+)
+
+type cUsuallyProblem struct{}
+
+func (c *cUsuallyProblem) Method(ctx context.Context, req *v1.UsuallyProblemReq) (res *v1.UsuallyProblemRes, err error) {
+	g.RequestFromCtx(ctx).Response.Writeln("Hi!123123", req.Href)
+	return
+}

+ 88 - 0
internal/model/message.go

@@ -0,0 +1,88 @@
+package model
+
+import (
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/os/gctx"
+	"github.com/gogf/gf/v2/os/glog"
+	"github.com/gogf/gf/v2/util/gconv"
+	"time"
+)
+
+var (
+	Message = &cMessage{
+		Arr: make([]*SaveMessage, 0, 100),
+	}
+)
+
+type cMessage struct {
+	Arr []*SaveMessage
+}
+
+type ResHistory struct {
+	Id         string    `json:"id" dc:"信息加密id"`
+	Content    string    `json:"content" dc:"内容"`
+	Type       int       `json:"type" dc:"1:用户提问 2:智能助手回复"`
+	Useful     int       `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
+	CreateTime time.Time `json:"create_time" dc:"聊天时间"`
+}
+
+type SaveMessage struct {
+	Content    string `json:"content" dc:"内容"`
+	Type       int    `json:"type" dc:"1:用户提问 2:智能助手回复"`
+	Useful     int    `json:"useful" dc:"1:有用 -1:无用 0:暂无评价"`
+	Item       int    `json:"item" dc:"1:常见问题 2:业务意图 3:chatGpt"`
+	Refer      string `json:"refer" dc:"会话来源地址"`
+	PersonId   int64  `json:"person_id" dc:"自然人id"`
+	CreateTime string `json:"create_time" dc:"时间"`
+}
+
+// SaveMessage 保存聊天信息
+func (m *cMessage) SaveMessage(msg *SaveMessage) {
+	m.Arr = append(m.Arr, msg)
+	if len(m.Arr) > 0 {
+		tmp, ctx := m.Arr, gctx.New()
+		m.Arr = make([]*SaveMessage, 0, 5)
+
+		val := gconv.Maps(tmp)
+		r, err := g.Model("ai_message").Data(val).Insert()
+		if err != nil {
+			glog.Error(ctx, "插入聊天记录异常,error:%s\ndata:%v", err, val)
+		}
+		affect, _ := r.RowsAffected()
+		if len(tmp) == gconv.Int(affect) {
+			glog.Error(ctx, "插入聊天记录异常 共%d条 插入%d条,error:%s\ndata:%v", len(tmp), affect, err, val)
+		} else {
+			glog.Info(ctx, "插入%d条聊天记录成功", affect)
+		}
+	}
+}
+
+// GetMessage 查询聊天信息
+func (m *cMessage) GetMessage(userId int64, pageNum, pageSize int) (h []ResHistory, err error) {
+	err = g.Model("ai_message").Where("person_id = ?", userId).OrderDesc("create_time").OrderDesc("id").Limit(pageNum, (pageNum+1)*pageSize).Scan(&h)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// Evaluate 评价
+func (m *cMessage) Evaluate(userId int64, megId string, value int) error {
+	res, err := g.Model("ai_message").One("id =? and person_id =? and type=2", megId, userId)
+	if err != nil {
+		return err
+	}
+	if res == nil {
+		return fmt.Errorf("未找到记录")
+	}
+	if gconv.Int(res.Map()["useful"]) != 0 {
+		return fmt.Errorf("已评价")
+	}
+	r, _ := g.Model("ai_message").Data(g.Map{"useful": value}).Where("id =? and person_id =? and type=2", megId, userId).Update()
+	affect, _ := r.RowsAffected()
+	if affect != 1 {
+		return fmt.Errorf("评价异常")
+	}
+	return nil
+}

+ 30 - 0
internal/model/message_test.go

@@ -0,0 +1,30 @@
+package model
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"encoding/json"
+	"fmt"
+	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
+	"testing"
+	"time"
+)
+
+func Test_cMessage_SaveMessage(t *testing.T) {
+	for i := 0; i < 10; i++ {
+		Message.SaveMessage(&SaveMessage{
+			Content:    "111",
+			Type:       1,
+			Item:       1,
+			Refer:      "demo",
+			PersonId:   450062,
+			CreateTime: time.Now().Format(date.Date_Full_Layout),
+		})
+	}
+}
+
+func Test_cMessage_GetMessage(t *testing.T) {
+	list := Message.GetMessage(450062, 0, 5)
+	fmt.Println(list)
+	b, _ := json.Marshal(list)
+	fmt.Println(string(b))
+}

+ 60 - 0
internal/model/ws.go

@@ -0,0 +1,60 @@
+package model
+
+import (
+	. "app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	"context"
+	"github.com/gogf/gf/v2/encoding/gjson"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/os/glog"
+	"time"
+)
+
+type Req struct {
+	Context string `json:"context"` //内容
+	History []struct {
+		Q string `json:"q"` //问题
+		A string `json:"a"` //答案
+	} `json:"history,omitempty"` //会话上下文,会话历史
+	Href string `json:"href,omitempty"` //咨询页面
+}
+
+type wsChat struct {
+	Ctx    context.Context
+	UserId int64
+}
+
+func NewMessage(ctx context.Context, userId int64) *wsChat {
+	return &wsChat{
+		Ctx:    ctx,
+		UserId: userId,
+	}
+}
+
+// Handle 处理消息
+func (m *wsChat) Handle(ws *ghttp.WebSocket, msg []byte, ip, agent string) {
+	defer Catch()
+	req := &Req{}
+	if err := gjson.Unmarshal(msg, req); err != nil {
+		glog.Errorf(m.Ctx, "%d 接收消息Unmarshal出错:%v", m.UserId, err)
+	}
+	Message.SaveMessage(&SaveMessage{
+		Content:    req.Context,
+		Type:       1,
+		Useful:     0,
+		Refer:      "",
+		PersonId:   m.UserId,
+		CreateTime: time.Now().Format(date.Date_Full_Layout),
+	})
+	//switch req.Type {
+	//case ReqType_Heartbeat: //用户端心跳
+	//	cache.SetUserHeartbeat(userId)
+	//	nws.SendMsg(ws, &User{Id: userId}, &Resp{Type: RespType_Heartbeat})
+	//case ReqType_CustomerService_Heartbeat: //客服端心跳
+	//	nws.SendMsg(ws, &User{Id: userId}, &Resp{Type: RespType_Heartbeat})
+	//	cache.SetCustomerServiceHeartbeat(entId, entUserId, userId)
+	//}
+
+	//查询检索库
+
+}

+ 29 - 0
internal/service/session.go

@@ -0,0 +1,29 @@
+// ==========================================================================
+// Code generated by GoFrame CLI tool. DO NOT EDIT.
+// ==========================================================================
+
+package service
+
+import (
+	"aiChat/utility"
+	"context"
+)
+
+type ISession interface {
+	SetUser(ctx context.Context, user *utility.JySession) error
+	GetUser(ctx context.Context) *utility.JySession
+	RemoveUser(ctx context.Context) error
+}
+
+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
+}

+ 12 - 0
main.go

@@ -0,0 +1,12 @@
+package main
+
+import (
+	"aiChat/internal/cmd"
+	_ "github.com/gogf/gf/contrib/drivers/mysql/v2"
+	_ "github.com/gogf/gf/contrib/nosql/redis/v2"
+	"github.com/gogf/gf/v2/os/gctx"
+)
+
+func main() {
+	cmd.Main.Run(gctx.New())
+}

+ 49 - 0
manifest/config/config.yaml

@@ -0,0 +1,49 @@
+server:
+  address:     ":8000"
+  openapiPath: "/api.json"
+  swaggerPath: "/swagger"
+  graceful: true # 是否开启平滑重启特性,开启时将会在本地增加10000的本地TCP端口用于进程间通信。默认false
+  gracefulTimeout: 2 # 父进程在平滑重启后多少秒退出,默认2秒。若请求耗时大于该值,可能会导致请求中断
+
+redis:
+  session:
+    address: 192.168.3.11:1713
+
+  main:
+    address: 192.168.3.206:1712
+
+database:
+  default:
+    link: "mysql:root:=PDT49#80Z!RVv52_z@tcp(192.168.3.217:4000)/base_service"
+    maxIdle: "5"
+    maxOpen: "5"
+
+mysql:
+  dBName: base_service
+  address: "192.168.3.217:4000"
+  userName: root
+  passWord: "=PDT49#80Z!RVv52_z"
+  maxOpenConns: 5
+  maxIdleConns: 5
+
+logger:
+  path:                  "logs"        # 日志文件路径。默认为空,表示关闭,仅输出到终端
+  file:                  "{Y-m-d}.log" # 日志文件格式。默认为"{Y-m-d}.log"
+  prefix:                ""            # 日志内容输出前缀。默认为空
+  level:                 "all"         # 日志输出级别
+  ctxKeys:               []            # 自定义Context上下文变量名称,自动打印Context的变量到日志中。默认为空
+  header:                true          # 是否打印日志的头信息。默认true
+  stdout:                true          # 日志是否同时输出到终端。默认true
+  rotateSize:            0             # 按照日志文件大小对文件进行滚动切分。默认为0,表示关闭滚动切分特性
+  rotateExpire:          0             # 按照日志文件时间间隔对文件滚动切分。默认为0,表示关闭滚动切分特性
+  rotateBackupLimit:     0             # 按照切分的文件数量清理切分文件,当滚动切分特性开启时有效。默认为0,表示不备份,切分则删除
+  rotateBackupExpire:    0             # 按照切分的文件有效期清理切分文件,当滚动切分特性开启时有效。默认为0,表示不备份,切分则删除
+  rotateBackupCompress:  0             # 滚动切分文件的压缩比(0-9)。默认为0,表示不压缩
+  rotateCheckInterval:   "1h"          # 滚动切分的时间检测间隔,一般不需要设置。默认为1小时
+  stdoutColorDisabled:   false         # 关闭终端的颜色打印。默认开启
+  writerColorEnable:     false         # 日志文件是否带上颜色。默认false,表示不带颜色
+
+
+
+
+

+ 67 - 0
utility/resMiddleware.go

@@ -0,0 +1,67 @@
+package utility
+
+import (
+	"github.com/gogf/gf/v2/errors/gcode"
+	"github.com/gogf/gf/v2/errors/gerror"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"net/http"
+)
+
+// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
+//
+// This Source Code Form is subject to the terms of the MIT License.
+// If a copy of the MIT was not distributed with this file,
+// You can obtain one at https://github.com/gogf/gf.
+
+// DefaultHandlerResponse is the default implementation of HandlerResponse.
+type DefaultHandlerResponse struct {
+	Code    int         `json:"error_code"    dc:"Error code"`
+	Message string      `json:"error_msg" dc:"Error message"`
+	Data    interface{} `json:"data"    dc:"Result data for certain request according API definition"`
+}
+
+// MiddlewareHandlerResponse is the default middleware handling handler response object and its error.
+func MiddlewareHandlerResponse(r *ghttp.Request) {
+	r.Middleware.Next()
+
+	// There's custom buffer content, it then exits current handler.
+	if r.Response.BufferLength() > 0 {
+		return
+	}
+
+	var (
+		msg  string
+		err  = r.GetError()
+		res  = r.GetHandlerResponse()
+		code = gerror.Code(err)
+	)
+	if err != nil {
+		if code == gcode.CodeNil {
+			code = gcode.CodeInternalError
+		}
+		msg = err.Error()
+	} else {
+		if r.Response.Status > 0 && r.Response.Status != http.StatusOK {
+			msg = http.StatusText(r.Response.Status)
+			switch r.Response.Status {
+			case http.StatusNotFound:
+				code = gcode.CodeNotFound
+			case http.StatusForbidden:
+				code = gcode.CodeNotAuthorized
+			default:
+				code = gcode.CodeUnknown
+			}
+			// It creates error as it can be retrieved by other middlewares.
+			err = gerror.NewCode(code, msg)
+			r.SetError(err)
+		} else {
+			code = gcode.CodeOK
+		}
+	}
+
+	r.Response.WriteJson(DefaultHandlerResponse{
+		Code:    code.Code(),
+		Message: msg,
+		Data:    res,
+	})
+}

+ 80 - 0
utility/sessionMiddleware.go

@@ -0,0 +1,80 @@
+package utility
+
+import (
+	"fmt"
+	"github.com/gogf/gf/v2/encoding/gjson"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/util/gconv"
+	"net/url"
+)
+
+const (
+	JY_SESSIONNAME = "SESSIONID"
+)
+
+// JySession 剑鱼程序SESSION获取
+type JySession struct {
+	UserId            string // 上下文用户信息
+	NewUid            int64  // 新用户id
+	EntId             int64  // 当前企业id
+	EntName           string // 当前企业名称
+	Phone             string // 手机号
+	Data              g.Map  // 当前Session管理对象
+	EntUserId         int64  //当前企业用户id
+	UserName          string //用户名称
+	UserPositionId    int64  //个人职位id
+	UserAccountId     int64  //个人账户id
+	EntUserPositionId int64  //企业职位id
+
+	EntUserName  string //企业员工姓名
+	PersonId     int64  //自然人id
+	AccountId    int64  //账户id
+	EntAccountId int64  //企业账户id
+	PositionId   int64  //职位id
+	PositionType int64  //职位类型
+	MgoUserId    string //mongodb用户id
+
+}
+
+func GetSession(r *ghttp.Request) (jSession *JySession, err error) {
+	jSession = &JySession{}
+	cookie, err := r.Request.Cookie(JY_SESSIONNAME)
+	if err != nil {
+		return
+	}
+	if cookie.Value == "" {
+		err = fmt.Errorf("cookie 内容为空")
+		return
+	}
+	findKey, _ := url.QueryUnescape(cookie.Value)
+	rVal, err := g.Redis("session").Get(r.GetCtx(), findKey)
+	if err != nil {
+		return nil, err
+	}
+
+	var data map[string]interface{}
+	err = gjson.Unmarshal(rVal.Bytes(), &data)
+	jSession.Phone, _ = data["phone"].(string)
+	jSession.UserId, _ = data["userId"].(string)
+	jSession.EntName, _ = data["entName"].(string)
+	jSession.EntId = gconv.Int64(data["entId"])
+	jSession.NewUid = gconv.Int64(data["base_user_id"])
+	jSession.EntUserId = gconv.Int64(data["entUserId"])
+	jSession.UserName, _ = data["userName"].(string)
+
+	jSession.EntUserName, _ = data["entUserName"].(string)
+	jSession.UserPositionId = gconv.Int64(data["userPositionId"])
+	jSession.UserAccountId = gconv.Int64(data["userAccountId"])
+	jSession.EntUserPositionId = gconv.Int64(data["entUserPositionId"])
+
+	jSession.PersonId = gconv.Int64(data["personId"])
+	jSession.AccountId = gconv.Int64(data["accountId"])
+	jSession.EntAccountId = gconv.Int64(data["entAccountId"])
+	jSession.PositionId = gconv.Int64(data["positionId"])
+	jSession.PositionType = gconv.Int64(data["positionType"])
+	jSession.MgoUserId = gconv.String(data["mgoUserId"])
+
+	jSession.Data = data
+	return
+}