diff --git a/go/controllers/app_aggregate.go b/go/controllers/app_aggregate.go index d04ed81..e4f4c65 100644 --- a/go/controllers/app_aggregate.go +++ b/go/controllers/app_aggregate.go @@ -194,9 +194,18 @@ func (c *AppAggregateController) noTenantHome(claims *jwtutil.Claims) map[string } } + // 展示姓名取统一身份昵称(个人中心可改),不再把账号/手机号当名字下发 + displayName := "" + var ai models.AuthIdentity + if err := models.Orm.QueryTable(new(models.AuthIdentity)). + Filter("id", uint64(claims.UserID)). + Filter("delete_time__isnull", true).One(&ai); err == nil && ai.Nickname != nil { + displayName = strings.TrimSpace(*ai.Nickname) + } + return map[string]interface{}{ "user": map[string]interface{}{ - "account": claims.Username, "tenant": "", "tid": 0, "need_tenant": true, + "name": displayName, "account": claims.Username, "tenant": "", "tid": 0, "need_tenant": true, }, "modules": modules, "menus": menus, @@ -396,15 +405,19 @@ func (c *AppAggregateController) appUser(claims *jwtutil.Claims, uid, tid uint64 out := map[string]interface{}{ "uid": uid, "tid": tid, - "name": "用户", + "name": "", "account": "", "role_name": "", "tenant": "", "tenant_id": tid, "avatar": "", } - if claims.Username != "" { - out["name"] = claims.Username + // 姓名只取真实资料(统一身份昵称,个人中心可改),不再用账号/手机号冒充 + var ai models.AuthIdentity + if err := models.Orm.QueryTable(new(models.AuthIdentity)). + Filter("id", uint64(claims.UserID)). + Filter("delete_time__isnull", true).One(&ai); err == nil && ai.Nickname != nil { + out["name"] = strings.TrimSpace(*ai.Nickname) } var tu models.SystemTenantUser if models.Orm.QueryTable(new(models.SystemTenantUser)). diff --git a/go/controllers/app_auth.go b/go/controllers/app_auth.go index 4d66457..fdf8d40 100644 --- a/go/controllers/app_auth.go +++ b/go/controllers/app_auth.go @@ -168,12 +168,14 @@ func (c *AppAuthController) UpdateCurrentUserProfile() { } uid := services.ResolveTenantUID(uint64(claims.TenantId), uint64(claims.UserID)) - num, err := models.Orm.QueryTable(new(models.SystemTenantUser)). + // 尚未加入企业(tid=0)的新注册用户没有老表行,属正常情况; + // 姓名仍写入统一身份,工作台首页直接读它显示。 + _, err = models.Orm.QueryTable(new(models.SystemTenantUser)). Filter("uid", uid). Filter("tid", claims.TenantId). Update(map[string]interface{}{"name": name, "email": email}) - if err != nil || num == 0 { - c.serveJSON(map[string]interface{}{"code": 400, "msg": "未找到当前企业下的用户资料"}) + if err != nil { + c.serveJSON(map[string]interface{}{"code": 500, "msg": "资料更新失败,请重试"}) return } _, _ = models.Orm.QueryTable(new(models.AuthIdentity)). diff --git a/go/controllers/onboarding.go b/go/controllers/onboarding.go index 5962e51..8f410a2 100644 --- a/go/controllers/onboarding.go +++ b/go/controllers/onboarding.go @@ -249,7 +249,9 @@ func (c *OnboardingController) issueNoTenantTokens(identityID uint64, mobile str } // Status GET /api/onboarding/status -// 返回企业绑定、最新申请状态、微信手机号(前端只读展示)。 +// 返回已绑定企业列表、申请记录、微信手机号(前端只读展示)。 +// 「我的 → 企业绑定」用 tenants + applies 展示多租户与审核进度; +// apply 保留最新一条,兼容首次加入企业的工作台分流逻辑。 func (c *OnboardingController) Status() { cl := c.mustClaims() if cl == nil { @@ -264,46 +266,65 @@ func (c *OnboardingController) Status() { mobile = *ai.Mobile } + // 一人多企业:返回全部启用中的绑定,默认企业排在最前 var binds []models.AuthTenantUser _, _ = models.Orm.QueryTable(new(models.AuthTenantUser)). Filter("identity_id", identityID). Filter("status", 1). + OrderBy("-is_default", "id"). All(&binds) - hasTenant := len(binds) > 0 + tenants := make([]map[string]interface{}, 0, len(binds)) + for _, b := range binds { + name := "" + var t models.SystemTenant + if err := models.Orm.QueryTable(new(models.SystemTenant)).Filter("id", b.Tid).One(&t); err == nil { + name = t.TenantName + } + tenants = append(tenants, map[string]interface{}{ + "tid": b.Tid, "tenant_name": name, "is_default": b.IsDefault, + }) + } tenantName := "" tid := uint64(0) - if hasTenant { + if len(tenants) > 0 { + tenantName, _ = tenants[0]["tenant_name"].(string) tid = binds[0].Tid - var t models.SystemTenant - if err := models.Orm.QueryTable(new(models.SystemTenant)).Filter("id", tid).One(&t); err == nil { - tenantName = t.TenantName - } } - var applyData interface{} - var apply models.AuthTenantApply - if err := models.Orm.QueryTable(new(models.AuthTenantApply)). + // 最近 20 条申请:可同时存在多家企业的待审绑定申请 + var rows []models.AuthTenantApply + _, _ = models.Orm.QueryTable(new(models.AuthTenantApply)). Filter("identity_id", identityID). Filter("delete_time__isnull", true). - OrderBy("-id").One(&apply); err == nil { - applyData = map[string]interface{}{ - "id": apply.ID, - "type": apply.Type, - "status": apply.Status, - "tenant_name": apply.TenantName, - "reject_reason": apply.RejectReason, - "department_name": apply.DepartmentName, - "position_name": apply.PositionName, - "applicant_name": apply.ApplicantName, - } + OrderBy("-id").Limit(20). + All(&rows) + applies := make([]map[string]interface{}, 0, len(rows)) + for _, a := range rows { + applies = append(applies, map[string]interface{}{ + "id": a.ID, + "type": a.Type, + "status": a.Status, + "tenant_name": a.TenantName, + "reject_reason": a.RejectReason, + "department_name": a.DepartmentName, + "position_name": a.PositionName, + "applicant_name": a.ApplicantName, + "create_time": a.CreateTime, + }) + } + var applyData interface{} + if len(applies) > 0 { + applyData = applies[0] } c.ok(map[string]interface{}{ - "has_tenant": hasTenant, + "has_tenant": len(tenants) > 0, "tid": tid, "tenant_name": tenantName, "mobile": mobile, "mobile_mask": maskPhone(mobile), + "tenants": tenants, + "applies": applies, "apply": applyData, }) } @@ -383,10 +404,8 @@ func (c *OnboardingController) ApplyJoin() { if cl == nil { return } - if c.hasTenant(uint64(cl.UserID)) { - c.fail(400, "你已加入企业,无需重复申请") - return - } + // 一人可绑定多家企业:已加入企业也能继续申请绑定其他企业。 + // 「是否已绑定该企业 / 是否重复待审」由 CreateJoinApply 内部按 tid 判定。 var req struct { Tid uint64 `json:"tid"` ApplicantName string `json:"applicant_name"` @@ -429,10 +448,7 @@ func (c *OnboardingController) ApplyCreate() { if cl == nil { return } - if c.hasTenant(uint64(cl.UserID)) { - c.fail(400, "你已加入企业,无需重复申请") - return - } + // 多租户:已有企业也允许再创建一家(同身份只允许一条待审创建申请,由 CreateTenantApply 校验) var req services.TenantCreateApplyInput if !c.readJSON(&req) { return diff --git a/uniapp/components/MainTabbar.vue b/uniapp/components/MainTabbar.vue index d164897..ff1463c 100644 --- a/uniapp/components/MainTabbar.vue +++ b/uniapp/components/MainTabbar.vue @@ -2,7 +2,7 @@ diff --git a/uniapp/components/sub/SubFunctions.vue b/uniapp/components/sub/SubFunctions.vue index d408758..be93491 100644 --- a/uniapp/components/sub/SubFunctions.vue +++ b/uniapp/components/sub/SubFunctions.vue @@ -1,10 +1,6 @@