Ver código fonte

fix: 个人授权 applyCompany 支持契约锁公司 id 并按多键匹配记录

与机构章定位一致,优先 qys_company_id;查询授权记录时兼容旧 openCompanyId。

Co-authored-by: Cursor <cursoragent@cursor.com>
郭铭泽 4 dias atrás
pai
commit
fd39e9fc20
2 arquivos alterados com 33 adições e 8 exclusões
  1. 5 1
      types.go
  2. 28 7
      user.go

+ 5 - 1
types.go

@@ -141,8 +141,10 @@ type PersonalSealAuthData struct {
 }
 
 // ApplyCompanyParams 个人静默签授权目标法人单位(applyCompany)。
+// 定位优先级与机构章一致:契约锁公司 id > openCompanyId > 名称/信用代码。
 type ApplyCompanyParams struct {
-	OpenCompanyID string
+	CompanyID     string // 契约锁法人单位 id(tenant_esigns.qys_company_id)
+	OpenCompanyID string // 三方 openCompanyId(新系统多为 tenant_id;旧系统可能为 org_id)
 	Name          string
 	RegisterNo    string
 }
@@ -153,8 +155,10 @@ type AuthRecord struct {
 	StartTime                 string
 	EndTime                   string
 	AuthScope                 string
+	ApplyCompanyID            string
 	ApplyCompanyOpenCompanyID string
 	ApplyCompanyName          string
+	ApplyCompanyRegisterNo    string
 }
 
 // DefaultPersonalAuthDuration 个人静默授权默认时长(旧系统 10 个月,避免跨年重叠)。

+ 28 - 7
user.go

@@ -82,12 +82,18 @@ func (c *Client) UserSignSilentURL(openUserID string, applyCompany ApplyCompanyP
 		AuthorizedMode:     []string{"FACEAUTH", "PINAUTH"},
 		CompleteToPage:     completeToPage,
 	}
-	if applyCompany.OpenCompanyID != "" || applyCompany.Name != "" || applyCompany.RegisterNo != "" {
-		req.ApplyCompany = &common.PersonalApplyCompany{
+	if applyCompany.CompanyID != "" || applyCompany.OpenCompanyID != "" || applyCompany.Name != "" || applyCompany.RegisterNo != "" {
+		pac := &common.PersonalApplyCompany{
 			Name:          applyCompany.Name,
 			RegisterNo:    applyCompany.RegisterNo,
 			OpenCompanyId: applyCompany.OpenCompanyID,
 		}
+		if applyCompany.CompanyID != "" {
+			if id, err := strconv.ParseInt(applyCompany.CompanyID, 10, 64); err == nil {
+				pac.Id = &id
+			}
+		}
+		req.ApplyCompany = pac
 	}
 	var resp struct {
 		apiResponse
@@ -132,26 +138,41 @@ func authRecordFromResponse(item v2auth_response.V2AuthSignsilentRecordResponse)
 		AuthScope: item.AuthScope,
 	}
 	if item.ApplyCompany != nil {
+		rec.ApplyCompanyID = item.ApplyCompany.Id
 		rec.ApplyCompanyOpenCompanyID = item.ApplyCompany.OpenCompanyId
 		rec.ApplyCompanyName = item.ApplyCompany.Name
+		rec.ApplyCompanyRegisterNo = item.ApplyCompany.RegisterNo
 	}
 	return rec
 }
 
-// PersonalSignAuthRecordForCompany 查询指定 openUserId 对某法人单位的静默授权记录。
-func (c *Client) PersonalSignAuthRecordForCompany(openUserID, openCompanyID, status string) (*AuthRecord, bool, error) {
+// PersonalSignAuthRecordForCompany 查询 openUserId 对指定法人单位的静默授权记录。
+func (c *Client) PersonalSignAuthRecordForCompany(openUserID string, company ApplyCompanyParams, status string) (*AuthRecord, bool, error) {
 	records, err := c.QueryPersonalSignAuthRecords(openUserID, status)
 	if err != nil {
 		return nil, false, err
 	}
 	for i := range records {
-		if records[i].ApplyCompanyOpenCompanyID == openCompanyID {
+		if authRecordMatchesCompany(&records[i], company) {
 			return &records[i], true, nil
 		}
 	}
 	return nil, false, nil
 }
 
+func authRecordMatchesCompany(rec *AuthRecord, company ApplyCompanyParams) bool {
+	if company.CompanyID != "" && rec.ApplyCompanyID != "" && company.CompanyID == rec.ApplyCompanyID {
+		return true
+	}
+	if company.OpenCompanyID != "" && rec.ApplyCompanyOpenCompanyID != "" && company.OpenCompanyID == rec.ApplyCompanyOpenCompanyID {
+		return true
+	}
+	if company.RegisterNo != "" && rec.ApplyCompanyRegisterNo != "" && company.RegisterNo == rec.ApplyCompanyRegisterNo {
+		return true
+	}
+	return false
+}
+
 // IsUserSignAuthorized 是否存在任意有效个人静默授权。
 func (c *Client) IsUserSignAuthorized(openUserID string) (bool, error) {
 	records, err := c.QueryPersonalSignAuthRecords(openUserID, "EFFECT")
@@ -162,8 +183,8 @@ func (c *Client) IsUserSignAuthorized(openUserID string) (bool, error) {
 }
 
 // IsUserSignAuthorizedForCompany 是否已对指定法人单位完成有效个人静默授权。
-func (c *Client) IsUserSignAuthorizedForCompany(openUserID, openCompanyID string) (bool, error) {
-	_, found, err := c.PersonalSignAuthRecordForCompany(openUserID, openCompanyID, "EFFECT")
+func (c *Client) IsUserSignAuthorizedForCompany(openUserID string, company ApplyCompanyParams) (bool, error) {
+	_, found, err := c.PersonalSignAuthRecordForCompany(openUserID, company, "EFFECT")
 	return found, err
 }