package service import ( "fmt" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/factory" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/users/command" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/application/users/query" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/domain" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/infrastructure/serviceGateway" "gitlab.fjmaimaimai.com/mmm-go/partnermg/pkg/lib" ) type UsersService struct { } func NewUsersService(option map[string]interface{}) *UsersService { newUsersService := new(UsersService) return newUsersService } func (service UsersService) UserLoginBySecretKey(cmd command.LoginBySecretKeyCommand) (interface{}, error) { var err error if err = cmd.ValidateCommand(); err != nil { return nil, err } //向统一用户中心确认密钥信息并获取用户数据 ucenterService := serviceGateway.NewMmmUserCenterServiceGateway() loginResp, err := ucenterService.RequestUCenterLoginBySecret(cmd.Code) if err != nil { e := fmt.Sprintf("通过密钥(code=%s)从统一用户中心获取数据失败:%s", cmd.Code, err.Error()) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } if err := loginResp.IsOK(); err != nil { e := fmt.Sprintf("登录失败:%s", err) return nil, lib.ThrowError(lib.BUSINESS_ERROR, e) } adminBusinessService := serviceGateway.NewMmmBusinessAdminServiceGateway() getUserAuthResp, err := adminBusinessService.GetUserAuth(loginResp.Data.Muid) if err != nil { e := fmt.Sprintf("用户鉴权失败:%s", err) return nil, lib.ThrowError(lib.BUSINESS_ERROR, e) } if err := getUserAuthResp.IsOK(); err != nil { return nil, lib.ThrowError(lib.BUSINESS_ERROR, "该公司没有操作权限") } if !getUserAuthResp.Data.UserAuth { return nil, lib.ThrowError(lib.BUSINESS_ERROR, "该公司没有操作权限") } var ( transactionContext, _ = factory.CreateTransactionContext(nil) ) if err = transactionContext.StartTransaction(); err != nil { return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error()) } defer func() { transactionContext.RollbackTransaction() }() var ( companyRespository domain.CompanyRepository userRespository domain.UsersRepository companyData domain.Company usersData domain.Users ) if companyRespository, err = factory.CreateCompanyRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if userRespository, err = factory.CreateUsersRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } //检索本系统的公司数据判断公司权限 companyData, err = companyRespository.FindOne(domain.CompanyFindOneOptions{ AdminCompanyId: loginResp.Data.CompanyId, }) if err != nil { e := fmt.Sprintf("获取公司(admin_company_id=%d)数据失败:%s", loginResp.Data.CompanyId, err.Error()) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } //检索本系统的用户数据 usersData, err = userRespository.FindOne(domain.UsersFindOneQuery{ Id: loginResp.Data.Muid, CompanyId: companyData.Id, }) if err != nil { e := fmt.Sprintf("获取用户(id=%d;CompanyId=%d)数据失败:%s", loginResp.Data.Muid, companyData.Id, err.Error()) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } //确认用户权限 if !usersData.IsUsable() { return nil, lib.ThrowError(lib.BUSINESS_ERROR, "用户被禁用") } err = transactionContext.CommitTransaction() newJwt := lib.NewMyToken(usersData.Id, companyData.Id) newToken, err := newJwt.CreateJWTToken() //生成token returnData := map[string]interface{}{ "access": map[string]interface{}{ "accessToken": newToken, "expiresIn": lib.JWtExpiresSecond, }, } return returnData, nil } //GetAdminpPofile 登录后获取用户的权限配置数据 func (service UsersService) GetUserPofile(userId int64) (interface{}, error) { var ( transactionContext, _ = factory.CreateTransactionContext(nil) err error ) if err = transactionContext.StartTransaction(); err != nil { return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error()) } defer func() { transactionContext.RollbackTransaction() }() var ( userRespository domain.UsersRepository usersData domain.Users permissionRepository domain.AdminPermissionRepository permissionList []domain.AdminPermission ) if userRespository, err = factory.CreateUsersRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if permissionRepository, err = factory.CreateAdminPermissionRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } usersData, err = userRespository.FindOne(domain.UsersFindOneQuery{ Id: userId, }) if err != nil { e := fmt.Sprintf("获取用户(Id=%d)数据失败:%s", userId, err.Error()) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } var permissionQuery domain.PermissionFindOption permissionList, err = permissionRepository.Find(permissionQuery) if err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } err = transactionContext.CommitTransaction() returnData := service.buildUserPofile(usersData, permissionList) return returnData, nil } //buildUserPofile 组装前端需要的数据 ,用户登录后获取的配置 func (service UsersService) buildUserPofile(userData domain.Users, permissionList []domain.AdminPermission) map[string]interface{} { menus := make([]map[string]interface{}, 0, len(permissionList)) for _, v := range permissionList { m := map[string]interface{}{ "code": v.Code, "icon": v.Icon, "parentId": v.ParentId, "sort": v.Sort, "name": v.Name, "id": v.Id, "status": 0, //状态 1-启用 0-禁用,前端需要 } if userData.IsSuperAdmin() { m["status"] = 1 menus = append(menus, m) continue } for _, p := range userData.Permission { if p.Id == v.Id { m["status"] = 1 break } if p.Id == v.ParentId { m["status"] = 1 break } } menus = append(menus, m) } user := map[string]string{ "id": fmt.Sprint(userData.Id), "name": userData.Name, "adminType": "2", // 前端需要的管理员类型 1-超级管理员 2-子管理员 } if userData.IsSuperAdmin() { user["adminType"] = "1" } respData := map[string]interface{}{ "user": user, "menus": menus, } return respData } //ValidateAdminpPermission 校验用户的操作权限 func (service UsersService) ValidateAdminpPermission(queryOption query.ValidatePermissionQuery) (bool, error) { var ( transactionContext, _ = factory.CreateTransactionContext(nil) err error ) if err = transactionContext.StartTransaction(); err != nil { return false, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error()) } defer func() { transactionContext.RollbackTransaction() }() var ( userRespository domain.UsersRepository usersData domain.Users ) if userRespository, err = factory.CreateUsersRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return false, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } usersData, err = userRespository.FindOne(domain.UsersFindOneQuery{ Id: queryOption.UserId, }) if err != nil { return false, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if !usersData.IsUsable() { return false, nil } err = transactionContext.CommitTransaction() ok := usersData.HasPermissionByCode(queryOption.PermissionCode) return ok, nil } //获取用户列表 func (service UsersService) GetUserList(queryOption query.UserListQuery) (int, []map[string]interface{}, error) { var ( transactionContext, _ = factory.CreateTransactionContext(nil) err error ) if err = transactionContext.StartTransaction(); err != nil { return 0, nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error()) } defer func() { transactionContext.RollbackTransaction() }() var ( userRespository domain.UsersRepository usersData []domain.Users cnt int permissionRepository domain.AdminPermissionRepository permissionList []domain.AdminPermission ) if userRespository, err = factory.CreateUsersRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return 0, nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if permissionRepository, err = factory.CreateAdminPermissionRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return 0, nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } cnt, usersData, err = userRespository.Find(domain.UsersFindQuery{ UserNameMatch: queryOption.UserNameMatch, Offset: queryOption.Offset, Limit: queryOption.Limit, CompanyId: queryOption.CompanyId, }) var permissionQuery = domain.PermissionFindOption{} permissionList, err = permissionRepository.Find(permissionQuery) if err != nil { return 0, nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } err = transactionContext.CommitTransaction() result := service.buildGetUserList(usersData, permissionList) return cnt, result, nil } //buildGetUserList 组装构建前端需要的用户列表数据 func (service UsersService) buildGetUserList(usersData []domain.Users, permissionData []domain.AdminPermission) []map[string]interface{} { result := make([]map[string]interface{}, 0, len(usersData)) permissionMap := map[int64]domain.AdminPermission{} for i := range permissionData { if permissionData[i].ParentId > 0 { continue } permissionMap[permissionData[i].Id] = permissionData[i] } for i := range usersData { permissionTypes := []string{} if usersData[i].IsSuperAdmin() { for _, pd := range permissionData { if pd.ParentId > 0 { continue } permissionTypes = append(permissionTypes, pd.Name) } } else { for _, vv := range usersData[i].Permission { if pm, ok := permissionMap[vv.Id]; ok { permissionTypes = append(permissionTypes, pm.Name) } } } m := map[string]interface{}{ "id": usersData[i].Id, "account": usersData[i].Phone, "name": usersData[i].Name, "permission": permissionTypes, "isAdmin": 0, "partnership": len(usersData[i].AccessPartners), } if usersData[i].IsSuperAdmin() { m["isAdmin"] = 1 } result = append(result, m) } return result } func (service UsersService) GetUserData(userId int64, companyId int64) (map[string]interface{}, error) { var ( transactionContext, _ = factory.CreateTransactionContext(nil) err error ) if err = transactionContext.StartTransaction(); err != nil { return nil, lib.ThrowError(lib.TRANSACTION_ERROR, err.Error()) } defer func() { transactionContext.RollbackTransaction() }() var ( userRespository domain.UsersRepository perterRespository domain.PartnerInfoRepository usersData domain.Users pertnerList []domain.PartnerInfo ) if userRespository, err = factory.CreateUsersRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if perterRespository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } usersData, err = userRespository.FindOne(domain.UsersFindOneQuery{ Id: userId, CompanyId: companyId, }) if err != nil { e := fmt.Sprintf("获取用户(id=%d;company_id=%d)数据失败;%s", userId, companyId, err) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } var partnerIds []int64 for _, v := range usersData.AccessPartners { partnerIds = append(partnerIds, v.Id) } if len(partnerIds) > 0 { pertnerList, err = perterRespository.Find(domain.PartnerFindQuery{ Ids: partnerIds, }) if err != nil { e := fmt.Sprintf("获取合伙人数据失败:%s", err) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } } transactionContext.CommitTransaction() return service.buildGetUserData(&usersData, pertnerList) } //buildGetUserData 构建前端需要的数据 func (service UsersService) buildGetUserData(userData *domain.Users, partnerList []domain.PartnerInfo) (map[string]interface{}, error) { result := map[string]interface{}{ "id": userData.Id, "permissionType": []int64{}, "name": userData.Name, "account": userData.Phone, "isAdmin": 0, "status": 0, "checkedPartner": []map[string]interface{}{}, } if userData.IsSuperAdmin() { result["isAdmin"] = 1 } if userData.IsUsable() { result["status"] = 1 } permissionIds := make([]int64, 0, len(userData.Permission)) for _, v := range userData.Permission { permissionIds = append(permissionIds, v.Id) } if userData.IsSuperAdmin() { transactionContext, _ := factory.CreateTransactionContext(nil) var permissionRepository domain.AdminPermissionRepository var err error if permissionRepository, err = factory.CreateAdminPermissionRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } permissionList, err := permissionRepository.Find(domain.PermissionFindOption{}) if err != nil { e := fmt.Sprintf("获取权限列表数据失败:%s", err) return nil, lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } permissionIds = make([]int64, 0) for _, v := range permissionList { permissionIds = append(permissionIds, v.Id) } } result["permissionType"] = permissionIds checkedPartner := make([]map[string]interface{}, 0, len(partnerList)) for i := range partnerList { m := map[string]interface{}{ "id": partnerList[i].Partner.Id, "name": partnerList[i].Partner.PartnerName, } checkedPartner = append(checkedPartner, m) } result["checkedPartner"] = checkedPartner return result, nil } //EditUserPermission 编辑用户的权限 func (service UsersService) EditUserPermission(cmd command.EditUserPermissionCommand) error { var ( transactionContext, _ = factory.CreateTransactionContext(nil) err error ) if err = transactionContext.StartTransaction(); err != nil { return lib.ThrowError(lib.TRANSACTION_ERROR, err.Error()) } defer func() { transactionContext.RollbackTransaction() }() var ( userRespository domain.UsersRepository usersData domain.Users permissionRepository domain.AdminPermissionRepository permissionList []domain.AdminPermission partnerRespository domain.PartnerInfoRepository partnerList []domain.PartnerInfo ) if userRespository, err = factory.CreateUsersRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } usersData, err = userRespository.FindOne(domain.UsersFindOneQuery{ Id: cmd.Id, }) if err != nil { e := fmt.Sprintf("获取用户(id=%d)数据失败,%s", cmd.Id, err) return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } if !usersData.InCompany(cmd.CompanyId) { return lib.ThrowError(lib.BUSINESS_ERROR, "提交的数据异常") } if permissionRepository, err = factory.CreateAdminPermissionRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if len(cmd.PermissionType) > 0 { permissionList, err = permissionRepository.Find(domain.PermissionFindOption{ Ids: cmd.PermissionType, }) if err != nil { e := fmt.Sprintf("获取权限列表数据失败:%s", err) return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } } if partnerRespository, err = factory.CreatePartnerInfoRepository(map[string]interface{}{ "transactionContext": transactionContext, }); err != nil { return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, err.Error()) } if len(cmd.CheckedPartner) > 0 { partnerList, err = partnerRespository.Find(domain.PartnerFindQuery{ Ids: cmd.CheckedPartner, CompanyId: cmd.CompanyId, }) if err != nil { e := fmt.Sprintf("获取合伙人列表数据失败:%s", err) return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } } var ( partners = make([]domain.Partner, 0, len(partnerList)) permissionsBase = make([]domain.AdminPermissionBase, 0) ) for i := range partnerList { p := partnerList[i].Partner partners = append(partners, p) } for i := range permissionList { if permissionList[i].Code == domain.PERMINSSION_ADMIN_USER && !usersData.IsSuperAdmin() { return lib.ThrowError(lib.BUSINESS_ERROR, "操作异常") } p := domain.AdminPermissionBase{ Id: permissionList[i].Id, Code: permissionList[i].Code, } permissionsBase = append(permissionsBase, p) } updateMap := map[string]interface{}{ "AccessPartners": partners, } if !usersData.IsSuperAdmin() { updateMap["Permission"] = permissionsBase } _ = usersData.Update(updateMap) err = userRespository.Edit(&usersData) if err != nil { e := fmt.Sprintf("更新用户(id=%d)数据失败:%s", usersData.Id, err) return lib.ThrowError(lib.INTERNAL_SERVER_ERROR, e) } err = transactionContext.CommitTransaction() return nil }