123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689 |
- package service
-
- import (
- "errors"
- "spaceofcheng/services/models"
- "spaceofcheng/services/models/card"
- "spaceofcheng/services/models/cases"
- "spaceofcheng/services/models/coupon"
- "spaceofcheng/services/models/customer"
- "spaceofcheng/services/models/goods"
- "spaceofcheng/services/models/model"
- "spaceofcheng/services/models/system"
- "spaceofcheng/services/utils"
-
- "github.com/astaxie/beego"
- "github.com/yl10/kit/encrypt"
- )
-
- // UserServ 系统处理
- type UserServ struct {
- ctx *utils.Context
- dao *system.UserDAO
- casedao *cases.CaseDAO
- customerdao *customer.CustomerDAO
- carddao *card.CardDAO
- coupondao *coupon.CouponDAO
- ordersdao *goods.GoodsDAO
- }
-
- // NewUserServ 初始化
- func NewUserServ(ctx *utils.Context) *UserServ {
- return &UserServ{
- ctx: ctx,
- dao: system.NewUserDAO(ctx),
- casedao: cases.NewCaseDAO(ctx),
- customerdao: customer.NewCustomerDAO(ctx),
- carddao: card.NewCardDAO(ctx),
- coupondao: coupon.NewCouponDAO(ctx),
- ordersdao: goods.NewGoodsDAO(ctx),
- }
- }
-
- // GetUserList 获取用户列表
- func (s *UserServ) GetUserList(username, typeid, caseids string, page int, pageSize int) (map[string]interface{}, error) {
- if pageSize == 0 {
- pageSize = PAGENUM
- }
- if page == 0 {
- page = 1
- }
- userList, err := s.dao.GetUserList(username, typeid, caseids, page, pageSize)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- total, err := s.dao.GetUserCount(username, typeid, caseids)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
-
- return map[string]interface{}{
- "list": userList,
- "pagesize": pageSize,
- "pagenum": total,
- "page": page,
- }, nil
- }
-
- // GetCurrentEnvVars 获取当前环境相关变量
- func (s *UserServ) GetCurrentEnvVars() (map[string]interface{}, error) {
- // 当前用户信息
- userRaw := s.ctx.Get("user")
- if userRaw == nil {
- return nil, utils.LogError("无有效用户信息")
- }
-
- user := userRaw.(model.SysUser)
- user.Pwd = ""
- // 当前用户案场
- sessionCase := s.ctx.Get("cases").([]model.SysUserCase)
- // caseIDs := ""
- // for _, value := range sessionCase {
- // if caseIDs != "" {
- // caseIDs = caseIDs + ","
- // }
- // caseIDs = caseIDs + value.CaseId
- // }
- // cases, err := s.casedao.GetCaseByIDs(caseIDs)
- // if err != nil {
- // beego.Error(err)
- // return nil, err
- // }
- // 当前用户角色
- roles, err := s.dao.GetUserRole(user.UserId)
- if err != nil {
- return nil, utils.LogError(err)
- }
- // 当前用户菜单
- menus, err := s.dao.GetUserMenu(user.UserId)
- if err != nil {
- beego.Error(err)
- return nil, utils.LogError(err)
- }
-
- rtn := map[string]interface{}{
- "user": user,
- "cases": sessionCase,
- "roles": roles,
- "menus": menus,
- "clienturl": beego.AppConfig.String("clienturl"),
- }
-
- return rtn, nil
- }
-
- // GetUserByID 根据用户ID获取用户信息
- func (s *UserServ) GetUserByID(userid string) (*system.UserInfo, error) {
- userinfo, err := s.dao.GetUserByID(userid)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- if userinfo != nil {
- userinfo.Pwd = ""
- usertype, err := s.dao.GetUserType(userid)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- userinfo.UserType = usertype
-
- usertag, err := s.dao.GetUserTag(userid)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- userinfo.UserTag = usertag
-
- usercase, err := s.dao.GetUserCase(userid)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- userinfo.UserCase = usercase
- }
- // userrole, err := s.dao.GetUserRole(userid)
- // if err != nil {
- // return nil, err
- // }
- // userinfo.UserRole = userrole
-
- // usermenu, err := s.dao.GetUserMenu(userid)
- // if err != nil {
- // return nil, err
- // }
- // userinfo.UserMenu = usermenu
-
- return userinfo, nil
- }
-
- // SaveUser 用户保存
- func (s *UserServ) SaveUser(user system.SysUserForm) (*model.SysUser, error) {
- var userInfo model.SysUser
- userInfo.UserId = user.UserId
- userInfo.UserId = user.UserId
-
- userInfo.UserId = user.UserId
- userInfo.UserName = user.UserName
- userInfo.RealName = user.RealName
- userInfo.OrgId = user.OrgId
- userInfo.Sex = user.Sex
- userInfo.WorkNo = user.WorkNo
- userInfo.Email = user.Email
- userInfo.Phone = user.Phone
- userInfo.Headimgurl = user.Headimgurl
- var flag bool = true
- for i := 0; i < 4; i++ {
- code := s.dao.GenerateRecommendCode()
- i, err := s.dao.IsCodeExist(code)
- if err != nil {
- return nil, errors.New("生成推荐码失败!请重新点击保存。")
- }
- if i <= 0 {
- userInfo.RecommendCode = code
- flag = false
- break
- }
- }
- if flag {
- return nil, errors.New("生成推荐码失败!请重新点击保存。")
- }
-
- org := s.ctx.Get("org").(model.SysOrg)
- user.OrgId = org.OrgId
- userInfo.OrgId = user.OrgId
- var err error
- var newUSer *model.SysUser
-
- if user.UserName == "" {
- return nil, errors.New("用户名不允许为空!")
- }
- if user.RealName == "" {
- return nil, errors.New("用户真实姓名不允许为空!")
- }
- if user.Phone == "" {
- return nil, errors.New("用户手机号不能为空!")
- }
- // 手机号码与用户名校验
- var isok bool
- isok, err = s.dao.CheckUserName(user.UserId, user.UserName, user.OrgId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- if !isok {
- return nil, errors.New("用户名重复!")
- }
- isok, err = s.dao.CheckUserPhone(user.UserId, user.Phone, user.OrgId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- if !isok {
- return nil, errors.New("手机号码重复!")
- }
- if user.UserId != "" {
- err = s.dao.UpdateUser(userInfo)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- // 删除用户对应的标签、用户类型及所属案场
- err = s.dao.DelUserTag(user.UserId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- err = s.dao.DelUserType(user.UserId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- // err = s.dao.DelUserBelongCase(user.UserId)
- // if err != nil {
- // beego.Error(err)
- // return nil, err
- // }
- err = s.dao.DelUserCase(user.UserId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- newUSer = &userInfo
- } else {
- l, err := s.dao.IsCodeExist(userInfo.RecommendCode)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- if l > 0 {
- return nil, errors.New("此推荐码已被使用!")
- }
- newUSer, err = s.dao.AddUser(userInfo)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- }
-
- // 保存用户的标签、用户类型及所属案场
- err = s.dao.SaveUserTag(newUSer.UserId, user.TagIds)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- err = s.dao.SaveUserType(newUSer.UserId, user.TypeId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- caseInfo, err := s.casedao.GetCaseByID(user.BelongCaseId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- if caseInfo == nil {
- return nil, errors.New("所属案场不存在!")
- }
- has, err := s.dao.GetUserCreatedCaseHas(newUSer.UserId, user.BelongCaseId)
- if err != nil {
- return nil, errors.New("获取用户所属案场失败!")
- }
- if has {
- err = s.dao.UpdateUserCaseBelong(newUSer.UserId, user.BelongCaseId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- } else {
- var userCase model.SysUserCase
- userCase.CaseId = user.BelongCaseId
- userCase.CaseName = caseInfo.CaseName
- userCase.IsBelong = 1
- userCase.UserId = newUSer.UserId
- err = s.dao.SaveUserCase(userCase)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- }
-
- // 保存用户标签案场信息
- err = s.dao.SaveUserCaseByUserTag(newUSer.UserId, user.BelongCaseId)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
- newUSer.Pwd = ""
-
- // 保存用户后判断用户是否在客户表中,如果存在,更新
- cust, err := s.customerdao.GetCustomerByPhone(newUSer.Phone)
- if err != nil {
- utils.LogError(err.Error())
- return nil, err
- }
- if cust != nil {
- cust.UserId = newUSer.UserId
- err = s.customerdao.UpdateCustomer(cust, []string{
- "user_id",
- })
- if err != nil {
- utils.LogError(err.Error())
- return nil, err
- }
- // 更新用户映射信息
- customerMap, err := s.customerdao.GetCustWithWXByID(cust.CustomerId)
- if err != nil {
- utils.LogError(err.Error())
- return nil, err
- }
- var userMap = model.TaUserMapping{
- UserId: cust.CustomerId,
- MappingId: customerMap.MappingId,
- }
- if err := s.dao.UpdateUserMapping(&userMap, []string{"user_id"}); err != nil {
- utils.LogError("更新用户映射信息失败:" + err.Error())
- return nil, errors.New("映射用户信息失败")
- }
- }
- return newUSer, err
- }
-
- // UpdatePassword 密码修改
- func (s *UserServ) UpdatePassword(oriPasswd, newPasswd string, user *model.SysUser) error {
- if !s.dao.ValidatePassword(user, oriPasswd) {
- return errors.New("密码错误!")
- }
-
- if err := s.dao.UpdatePassword(user.UserId, newPasswd); err != nil {
- return err
- }
-
- return nil
- }
-
- // ResetPassword 重设密码
- func (s *UserServ) ResetPassword(userid string) error {
- newPasswd := encrypt.Md5("123456")
- if err := s.dao.UpdatePassword(userid, newPasswd); err != nil {
- return err
- }
-
- return nil
- }
-
- // UserMapping 用户隐射
- func (s *UserServ) UserMapping(userMapping model.TaUserMapping) error {
- err := s.dao.SaveUserMapping(&userMapping)
- if err != nil {
- return err
- }
- // info := make(map[string]string)
- // err = json.Unmarshal([]byte(userMapping.AccountInfo), &info)
- // if err != nil {
- // beego.Error("Umarshal failed:", err)
- // return err
- // }
- // // 根据用户类型更新用户表中的数据
- // switch userMapping.UserType {
- // case USERTYPE_USER:
- // err = s.dao.UpdateUserHeadImg(userMapping.UserId, info["headimgurl"])
- // break
- // case USERTYPE_CUSTOMER:
- // err = s.dao.UpdateCustomerHeadImg(userMapping.UserId, info["nickname"], info["headimgurl"])
- // break
- // }
- return nil
- }
-
- // DelUser 删除用户
- func (s *UserServ) DelUser(userid string) error {
- err := s.dao.DelUser(userid)
- if err != nil {
- return err
- }
- // 删除与前台客户的关联
- err = s.dao.UnleashCustomerUser(userid)
- return err
- }
-
- // GetUserTypes 获取用户类型
- func (s *UserServ) GetUserTypes(orgid string) ([]model.TdUserType, error) {
- types, err := s.dao.GetUserTypes(orgid)
- return types, err
- }
-
- // GetUserRoles 获取用户角色
- func (s *UserServ) GetUserRoles(userid string) ([]model.SysRole, error) {
- if userid == "" {
- return nil, utils.LogError("没有对应的用户信息!")
- }
- userroles, err := s.dao.GetUserRole(userid)
- return userroles, err
- }
-
- // SaveUserRole 保存用户对应角色
- func (s *UserServ) SaveUserRole(userid, roleids string) error {
- if userid == "" {
- return utils.LogError("没有对应的用户信息!")
- }
- if roleids == "" {
- return utils.LogError("没有对应的角色信息!")
- }
- err := s.dao.DelUserRole(userid)
- if err != nil {
- return err
- }
- err = s.dao.SaveUserRole(userid, roleids)
- if err != nil {
- return err
- }
- err = s.dao.DelUserMenu(userid)
- if err != nil {
- return err
- }
- err = s.dao.SaveUserMenu(userid)
- return err
- }
-
- // GetUserCustomer 获取我的推荐客户
- func (s *UserServ) GetUserCustomer(userid, isrecommend, key string, page int, pageSize int) ([]system.CustomerInfo, error) {
- if pageSize == 0 {
- pageSize = PAGENUM
- }
- if page == 0 {
- page = 1
- }
- customers, err := s.dao.GetUserCustomer(userid, isrecommend, key, page, pageSize)
- return customers, err
- }
-
- // CheckUserSignIn 校验用户登录
- func (s *UserServ) CheckUserSignIn(userName, userPassword string) (*model.SysUser, error) {
- user, err := s.dao.GetUserByName(userName)
- if err != nil {
- beego.Error(err)
- return nil, err
- }
-
- if user == nil {
- return nil, errors.New("账户不存在")
- }
-
- if user.Status != models.STATUS_NORMAL {
- return nil, errors.New("用户账户异常")
- }
-
- if !s.dao.ValidatePassword(user, userPassword) {
- return nil, errors.New("用户密码不正确")
- }
-
- return user, nil
- }
-
- // GetUserByTel 根据电话获取用户信息
- func (s *UserServ) GetUserByTel(tel string) (*model.SysUser, error) {
- user, err := s.dao.GetUserByPhone(tel)
- return user, err
- }
-
- // GetForbidUsers 获取所有禁止人员信息
- func (s *UserServ) GetForbidUsers() ([]model.TaForbidUser, error) {
- customer := s.ctx.Get("customer").(model.TaCustomer)
- if customer.CustomerId == "" || customer.UserId == "" {
- return nil, errors.New("当前用户没有权限查看用户信息")
- }
- caseinfo, err := s.dao.GetUserBelongCase(customer.UserId)
- if err != nil {
- return nil, err
- }
- // if err := utils.NewAuthEngine(s.ctx).CheckCase(caseid); err != nil {
- // return nil, err
- // }
- users, err := s.dao.GetForbidUsers(caseinfo.CaseId)
- return users, err
- }
-
- // SaveForbidUser 保存禁止人员信息
- func (s *UserServ) SaveForbidUser(userid string, forbidtype string) error {
- user, err := s.dao.GetUserByID(userid)
- if err != nil {
- return err
- }
- if user.Status != models.STATUS_NORMAL {
- return errors.New("设置的用户状态异常!不允许操作!")
- }
-
- usercase, err := s.dao.GetUserBelongCase(userid)
- if err != nil {
- return err
- }
- if usercase.CaseId == "" {
- return errors.New("用户不存在所属案场!不允许操作!")
- }
- if err := utils.NewAuthEngine(s.ctx).CheckCase(usercase.CaseId); err != nil {
- return err
- }
- fibUsers, err := s.dao.GetForbidUserByUserID(userid)
- if err != nil {
- return err
- }
- if fibUsers != nil && len(fibUsers) > 0 {
- for _, u := range fibUsers {
- if u.ForbidType == forbidtype && u.Status == models.STATUS_NORMAL {
- return errors.New("当前人员已经被禁止!不允许重复禁止")
- }
- }
- }
-
- var usertype = ""
- if len(user.UserType) > 0 {
- usertype = user.UserType[0].TypeId
- }
-
- var forbiduser = model.TaForbidUser{
- UserId: user.UserId,
- UserType: usertype,
- ForbidType: forbidtype,
- CaseId: usercase.CaseId,
- }
-
- err = s.dao.SaveForbidUser(&forbiduser)
- if err != nil {
- return err
- }
- // 发送短信
- if forbidtype == models.FORBID_COUPON {
- utils.SendSMS("couponclose", user.Phone)
- } else {
- utils.SendSMS("goodsclose", user.Phone)
- }
-
- return nil
- }
-
- // OpenForbidUser 开启禁止人员
- func (s *UserServ) OpenForbidUser(userid string, forbidtype string) error {
- user, err := s.dao.GetUserByID(userid)
- if err != nil {
- return err
- }
- if user.Status != models.STATUS_NORMAL {
- return errors.New("设置的用户状态异常!不允许操作!")
- }
-
- usercase, err := s.dao.GetUserBelongCase(userid)
- if err != nil {
- return err
- }
- if usercase.CaseId == "" {
- return errors.New("用户不存在所属案场!不允许操作!")
- }
- if err := utils.NewAuthEngine(s.ctx).CheckCase(usercase.CaseId); err != nil {
- return err
- }
- fibUsers, err := s.dao.GetForbidUserByUserID(userid)
- if err != nil {
- return err
- }
- var ishas = false
- var forbiduser = model.TaForbidUser{}
- if fibUsers != nil && len(fibUsers) > 0 {
- for _, u := range fibUsers {
- if u.ForbidType == forbidtype && u.Status == models.STATUS_NORMAL {
- ishas = true
- forbiduser = u
- }
- }
- }
-
- if !ishas {
- return errors.New("用户没有被关闭的功能!")
- }
- err = s.dao.OpenForbidUser(&forbiduser)
- return err
- }
-
- // GetCaseUserByType 根据用户类型获取人员信息
- func (s *UserServ) GetCaseUserByType(usertype string) ([]system.UserWithCouponAndCard, error) {
- customer := s.ctx.Get("customer").(model.TaCustomer)
- if customer.CustomerId == "" || customer.UserId == "" {
- return nil, errors.New("当前用户没有权限查看用户信息")
- }
- caseinfo, err := s.dao.GetUserBelongCase(customer.UserId)
- if err != nil {
- utils.LogError("获取人员归属案场失败: " + err.Error())
- return nil, errors.New("获取人员信息失败")
- }
-
- users, err := s.dao.GetCaseUserByType(caseinfo.CaseId, usertype)
- if err != nil {
- utils.LogError("获取人员信息失败: " + err.Error())
- return nil, errors.New("获取人员信息失败")
- }
-
- for inx, user := range users {
- err := s.GetUserWithDetail(caseinfo.CaseId, &user)
- if err != nil {
- return nil, err
- }
- users[inx] = user
- }
- return users, nil
- }
-
- // GetCaseUserByUserID 根据用户id获取人员信息
- func (s *UserServ) GetCaseUserByUserID(userid string) (*system.UserWithCouponAndCard, error) {
- customer := s.ctx.Get("customer").(model.TaCustomer)
- if customer.CustomerId == "" || customer.UserId == "" {
- return nil, errors.New("当前用户没有权限查看用户信息")
- }
- caseinfo, err := s.dao.GetUserBelongCase(customer.UserId)
- if err != nil {
- utils.LogError("获取人员归属案场失败: " + err.Error())
- return nil, errors.New("获取人员信息失败")
- }
- usercaseinfo, err := s.dao.GetUserBelongCase(userid)
- if err != nil {
- utils.LogError("获取人员归属案场失败: " + err.Error())
- return nil, errors.New("获取人员信息失败")
- }
- if usercaseinfo.CaseId != caseinfo.CaseId {
- return nil, errors.New("您没有权限查看此用户的数据!")
- }
- user, err := s.dao.GetUserDetailByID(userid)
- if err != nil {
- utils.LogError("获取人员信息失败: " + err.Error())
- return nil, errors.New("获取人员信息失败")
- }
- err = s.GetUserWithDetail(usercaseinfo.CaseId, user)
- if err != nil {
- return nil, err
- }
- return user, nil
- }
-
- // GetUserWithDetail 获取用户详情
- func (s *UserServ) GetUserWithDetail(caseid string, user *system.UserWithCouponAndCard) error {
- cards, err := s.carddao.GetCustomerCardByUser(caseid, user.UserId)
- if err != nil {
- utils.LogError("获取发送卡信息失败: " + err.Error())
- return errors.New("获取人员信息失败")
- }
- user.CustomerCard = cards
- coupons, err := s.coupondao.GetCustomerCouponByUser(caseid, user.UserId)
- if err != nil {
- utils.LogError("获取发送券信息失败: " + err.Error())
- return errors.New("获取人员信息失败")
- }
- user.CustomerCoupon = coupons
- details, err := s.ordersdao.GetOrderDetailByUser(caseid, user.UserId)
- if err != nil {
- utils.LogError("获取用户点单信息失败: " + err.Error())
- return errors.New("获取人员信息失败")
- }
- user.OrdersDetail = details
- return nil
- }
|