123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508 |
- package service
-
- import (
- "wechat-conf/utils"
- )
-
- const (
- PAGENUM = 10
- )
-
- // SysServ 系统处理
- type SysServ struct {
- ctx *utils.Context
- }
-
- // NewSysServ 初始化
- func NewSysServ(ctx *utils.Context) *SysServ {
- return &SysServ{
- ctx: ctx,
- }
- }
-
- // // AuthAndInitCtx 鉴权
- // // gctx 是 beego 框架中的 Context
- // func (s *SysServ) AuthAndInitCtx(gctx *context.Context) map[string]interface{} {
- // // 确认机构
- // orgID := gctx.Input.Query(":org")
- // if orgID == "" {
- // return map[string]interface{}{
- // "code": http.StatusBadRequest,
- // "error": errors.New("接口地址访问不正确"),
- // }
- // }
- // if err := s.SetOrgByID(orgID); err != nil {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": err,
- // }
- // }
-
- // // 客户端类型
- // // 通过 UA 判断
- // clientType := utils.GetClientType(gctx.Request)
-
- // // pc 管理端
- // if clientType == utils.ClientAdmin {
- // return s.authPCAdmin(gctx)
- // }
-
- // // 小程序 端
- // if strings.Index(gctx.Input.URI(), "/wechat/mini") > -1 {
- // return s.authMini(gctx)
- // }
-
- // // wechat 端
- // if clientType == utils.ClientWechat {
- // return s.authWechat(gctx)
- // }
-
- // // if clientType == utils.ClientMini {
- // // return s.authMini(gctx)
- // // }
-
- // return map[string]interface{}{
- // "code": http.StatusBadRequest,
- // "error": errors.New("暂无该客户端的 API"),
- // }
- // }
-
- // // NewToken 设置 TOKEN
- // // 15 分钟后过期
- // func (s *SysServ) NewToken(batch string) string {
- // var token *utils.JWTToken
- // exp := time.Now().Local().Add(15 * time.Second)
-
- // if s.ctx.Get("userMap") != nil {
- // userMap := s.ctx.Get("userMap").(model.TaUserMapping)
-
- // token = &utils.JWTToken{
- // Guest: false,
- // ID: userMap.Openid,
- // Expire: exp,
- // BatchNo: batch,
- // }
- // } else if s.ctx.Get("user") != nil {
- // user := s.ctx.Get("user").(model.SysUser)
-
- // token = &utils.JWTToken{
- // Guest: false,
- // ID: user.UserId,
- // Expire: exp,
- // BatchNo: batch,
- // }
- // } else {
- // token = &utils.JWTToken{
- // Guest: true,
- // Expire: exp,
- // }
- // }
-
- // tokenEncodeStr, err := utils.CreateToken(token.ToMap())
- // if err != nil {
- // utils.LogError("系统生成 Token 失败: " + err.Error())
- // return ""
- // }
-
- // // 入库
- // if !token.Guest {
- // if err := models.InsertToken(tokenEncodeStr, token.ID, batch, exp); err != nil {
- // utils.LogError("入库 Token 失败: " + err.Error())
- // return tokenEncodeStr
- // }
- // }
-
- // return tokenEncodeStr
- // }
-
- // // authPCAdmin
- // // 管理端 API 校验
- // func (s *SysServ) authPCAdmin(gctx *context.Context) map[string]interface{} {
- // if !s.needAuth(gctx) {
- // return nil
- // }
-
- // // 获取 token
- // token, err := s.getToken(gctx)
- // if err != nil {
- // // token 报错一律视为需要重新登录
- // return map[string]interface{}{
- // "code": http.StatusUnauthorized,
- // "error": err,
- // }
- // }
-
- // if token.ID == "" || token.Guest == true {
- // return map[string]interface{}{
- // "code": http.StatusUnauthorized,
- // "error": errors.New("用户未登录"),
- // }
- // }
-
- // if err := s.SetUserProfile(token.ID); err != nil {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": err,
- // }
- // }
-
- // return nil
- // }
-
- // func (s *SysServ) authWechat(gctx *context.Context) map[string]interface{} {
- // var wxUser *utils.WechatUser
- // var openID string
-
- // if beego.BConfig.RunMode == "dev" {
- // openID = "OPENID"
- // } else {
- // // 初始化微信配置
- // if err := s.initWechatClient(s.org.OrgId); err != nil {
- // utils.LogError("初始化微信服务失败: " + err.Error())
-
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("初始化微信服务失败"),
- // }
- // }
-
- // // 微信 code
- // code := gctx.Input.Query("code")
-
- // // 获取 token
- // token, err := s.getToken(gctx)
- // if err != nil {
- // tokenStr := s.ctx.Get("token").(string)
- // if tokenStr != "" {
- // // token 报错一律视为需要重新登录
- // return map[string]interface{}{
- // "code": http.StatusUnauthorized,
- // "error": err,
- // "message": map[string]interface{}{
- // "appid": utils.GetWxAppID(s.org.OrgId),
- // },
- // }
- // }
- // }
-
- // // 未登录 或 未验证
- // if token == nil || token.ID == "" {
- // if code == "" {
- // return map[string]interface{}{
- // "code": http.StatusUnauthorized,
- // "error": errors.New("请授权微信用户登录"),
- // "message": map[string]interface{}{
- // "appid": utils.GetWxAppID(s.org.OrgId),
- // },
- // }
- // }
-
- // // 微信用户信息
- // var err error
- // wxUser, err = s.wechartSignIn(gctx, code)
- // if err != nil {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": err,
- // }
- // }
-
- // if wxUser == nil {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("请先关注公众号"),
- // }
- // }
-
- // utils.LogError("获取到微信人员: ", wxUser)
-
- // openID = wxUser.OpenID
- // } else {
- // openID = token.ID
- // }
- // }
-
- // // 查询数据库是否存在已有映射
- // userMapList, err := models.GetUserMappingByOpenID(openID)
- // if err != nil {
- // utils.LogError("校验人员失败: " + err.Error())
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("校验人员失败"),
- // }
- // }
-
- // var userMapping *model.TaUserMapping
- // for _, ump := range userMapList {
- // if openID == ump.Openid && models.ACCMAP_WECHAT == ump.AccountType {
- // userMapping = &ump
- // }
- // }
-
- // // 如果尚无人员映射信息, 代表人员初次使用本系统
- // if userMapping == nil {
- // // 如果没有微信用户信息, 代表产生了未知异常
- // if wxUser == nil || wxUser.OpenID == "" {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("系统异常, 请清空缓存后重试"),
- // }
- // }
-
- // wxInfoJSON, err := json.Marshal(wxUser)
- // if err != nil {
- // utils.LogError("转换微信json信息失败: " + err.Error())
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("微信信息异常"),
- // }
- // }
-
- // userMapping = &model.TaUserMapping{
- // AccountType: models.ACCMAP_WECHAT,
- // Openid: openID,
- // Uuid: wxUser.UnionID,
- // AccountInfo: string(wxInfoJSON),
- // }
- // }
-
- // // 防止JSON解析失败
- // if userMapping.AccountInfo == "" {
- // userMapping.AccountInfo = "{}"
- // }
-
- // // 更新映射信息, 没有的话则插入
- // err = models.EditUserMapping(userMapping)
- // if err != nil {
- // utils.LogError("保存用户映射信息失败: " + err.Error())
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("更新用户信息失败"),
- // }
- // }
- // s.ctx.Set("userMap", *userMapping)
-
- // // if !s.needAuth(gctx) {
- // // return nil
- // // }
-
- // var cust *model.TaCustomer
-
- // // 如果只有映射, 但是没有人员信息
- // // 则新增人员
- // if userMapping.UserId == "" {
- // cust, err = s.saveNewCustomer(wxUser, userMapping)
- // if err != nil {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": err,
- // }
- // }
- // } else {
- // cust, err = models.GetCustomerByID(userMapping.UserId)
- // if err != nil {
- // utils.LogError("查询用户信息失败: " + err.Error())
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": err,
- // }
- // }
- // }
- // s.ctx.Set("customer", *cust)
-
- // if cust.UserId != "" {
- // if err := s.SetUserProfile(cust.UserId); err != nil {
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": err,
- // }
- // }
- // }
-
- // return nil
- // }
-
- // // 小程序端暂时无人员或者其他业务要求
- // func (s *SysServ) authMini(gctx *context.Context) map[string]interface{} {
- // if err := s.initMiniClient(s.org.OrgId); err != nil {
- // utils.LogError("初始化小程序服务失败: " + err.Error())
-
- // return map[string]interface{}{
- // "code": http.StatusInternalServerError,
- // "error": errors.New("初始化小程序服务失败"),
- // }
- // }
-
- // return nil
- // }
-
- // // wechartSignIn 使用 code 微信登录
- // func (s *SysServ) wechartSignIn(gctx *context.Context, code string) (*utils.WechatUser, error) {
- // // 获取 微信信息
- // // 可能出现的情况是 openid 获取到了, 但是详情没有获取到
- // wxUserMap, err := utils.WxClientFor(s.org.OrgId).GetUserInfo(code)
- // if err != nil {
- // utils.LogError("获取微信信息失败: " + err.Error())
-
- // if wxUserMap == nil {
- // return nil, errors.New("获取微信信息失败")
- // }
- // }
-
- // return utils.MapToWechatUser(wxUserMap), nil
- // }
-
- // func (s *SysServ) getToken(gctx *context.Context) (*utils.JWTToken, error) {
- // tokenEnStr := gctx.Input.Query("token")
- // if tokenEnStr == "" {
- // tokenRaw := gctx.Input.Header(utils.TokenHeader)
- // if tokenRaw == "" {
- // return new(utils.JWTToken), nil
- // }
-
- // tokenEnStr = strings.Trim(strings.TrimLeft(tokenRaw, utils.TokenSchema), " ")
- // } else {
- // tokenEnStr = strings.Trim(strings.TrimLeft(tokenEnStr, utils.TokenSchema), " ")
- // }
-
- // s.ctx.Set("token", tokenEnStr)
-
- // token, err := utils.PareseToken(tokenEnStr)
- // if err != nil {
- // utils.LogError("解析 Token 失败: " + err.Error())
- // return nil, errors.New("解析Token失败或已过期")
- // }
-
- // // 校验 token
- // tk, err := models.GetToken(tokenEnStr)
- // if err != nil {
- // utils.LogError("查询 Token 失败: " + err.Error())
- // return nil, errors.New("校验Token失败或已过期")
- // }
-
- // if tk.Status == models.STATUS_DEL {
- // return nil, errors.New("超时 或者 Token 已过期")
- // }
-
- // s.ctx.Set("token-batch", tk.BatchNo)
- // return utils.MapToJWTToken(token), nil
- // }
-
- // // UpdateTokenExpire 更新 token 为过期
- // // 如果发生错误, 此处选择忽略
- // func (s *SysServ) UpdateTokenExpire(token, uid string) {
- // if err := models.UpdateTokenExpire(token, uid); err != nil {
- // utils.LogError("更新 Token 过期失败: " + err.Error())
- // }
- // }
-
- // func (s *SysServ) needAuth(gctx *context.Context) bool {
- // route := gctx.Input.URL()
- // apiPrefix := beego.AppConfig.String("api::prefix")
- // guestAPI := beego.AppConfig.String("api::guest")
-
- // if strings.Index(route, apiPrefix+strings.Split(guestAPI, ":")[0]) > -1 {
- // return false
- // }
-
- // return true
- // }
-
- // // SetUserProfile 设置用户信息
- // func (s *SysServ) SetUserProfile(id string) error {
- // user, err := models.GetPureUserInfo(id)
- // if err != nil {
- // return utils.LogError("获取用户基本信息失败: " + err.Error())
- // }
- // s.ctx.Set("user", *user)
-
- // cases, err := models.GetUserCase(id)
- // if err != nil {
- // return utils.LogError("获取用户案场信息失败: " + err.Error())
- // }
- // s.ctx.Set("cases", cases)
-
- // found := false
- // for _, cs := range cases {
- // if cs.IsBelong == models.BOOL_TRUE {
- // found = true
- // s.ctx.Set("currentCase", cs)
- // }
- // }
-
- // if !found {
- // utils.LogError("用户没有设置默认案场")
- // }
-
- // return nil
- // }
-
- // // saveNewCustomer 新增用户
- // func (s *SysServ) saveNewCustomer(wxUser *utils.WechatUser, userMap *model.TaUserMapping) (*model.TaCustomer, error) {
- // cust := model.TaCustomer{
- // CustomerName: wxUser.NickName,
- // Name: wxUser.NickName,
- // Sex: int(wxUser.Sex),
- // Headimgurl: wxUser.HeadImgURL,
- // OrgId: s.org.OrgId,
- // }
-
- // if err := models.SaveCustomer(&cust); err != nil {
- // utils.LogError("更新客户信息失败: " + err.Error())
- // return nil, errors.New("更新客户信息失败")
- // }
-
- // account := new(model.TaCustomerAccount)
- // account.CustomerId = cust.CustomerId
- // account.CustomerName = cust.CustomerName
- // account.OrgId = cust.OrgId
- // account.Amount = "0"
- // account.Points = "0"
- // account.PayedAmount = "0"
- // account.PayedPoints = "0"
-
- // if err := models.SaveAccount(account); err != nil {
- // utils.LogError("插入账户信息失败: " + err.Error())
- // return nil, errors.New("更新客户信息失败")
- // }
-
- // // 更新映射表信息
- // userMap.UserId = cust.CustomerId
- // if err := models.UpdateUserMapping(userMap, []string{"user_id"}); err != nil {
- // utils.LogError("更新用户映射信息失败:" + err.Error())
- // return nil, errors.New("映射用户信息失败")
- // }
-
- // return &cust, nil
- // }
-
- // // initWechatClient 初始化微信客户端
- // func (s *SysServ) initWechatClient(orgID string) error {
- // cert, err := models.GetWeChatConfig(orgID, models.WECHAT_WX)
- // if err != nil {
- // utils.LogError("获取微信配置失败: " + err.Error())
- // return errors.New("获取微信配置失败")
- // }
-
- // if cert == nil {
- // return errors.New("未找到微信配置")
- // }
-
- // utils.WxClientSingleton(orgID, cert)
- // return nil
- // }
-
- // func (s *SysServ) initMiniClient(orgID string) error {
- // cert, err := models.GetWeChatConfig(orgID, models.WECHAT_MINI)
- // if err != nil {
- // utils.LogError("获取小程序配置失败: " + err.Error())
- // return errors.New("获取小程序配置失败")
- // }
-
- // if cert == nil {
- // return errors.New("未找到小程序配置")
- // }
-
- // utils.MiniClientSingleton(orgID, cert)
- // return nil
- // }
|