fix: 企微审批选填附件控件为空列表时跳过,避免非客户收款退款提交失败
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m33s

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
邹进
2026-10-14 17:10:48 +09:00
parent bcb1ce0653
commit 7e54fe2ba7

View File

@@ -101,7 +101,7 @@ func buildApprovalForm(ctx context.Context, businessType string, applicationID,
attachmentCount := 0
for _, mapping := range mappings {
raw, exists := lookupSnapshotValue(snapshot, mapping.BusinessField)
if !exists || raw == nil {
if !exists || raw == nil || isEmptyFileValue(mapping, raw) {
if requiredControls[mapping.ControlID] {
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少模板必填字段: "+mapping.BusinessField)
}
@@ -125,6 +125,23 @@ func buildApprovalForm(ctx context.Context, businessType string, applicationID,
return approvalFormBuildResult{Contents: contents}, nil
}
// isEmptyFileValue 判断附件控件的快照值是否为空列表;空列表按未填写处理,由模板必填与业务必填规则决定是否拦截。
func isEmptyFileValue(mapping dto.WeComControlMappingItem, raw any) bool {
if !strings.EqualFold(strings.TrimSpace(mapping.ControlType), "file") {
return false
}
switch value := raw.(type) {
case []any:
return len(value) == 0
case []string:
return len(value) == 0
case string:
return strings.TrimSpace(value) == ""
default:
return false
}
}
// lookupSnapshotValue 支持用点分路径读取嵌套业务快照,避免模板映射绑定具体 DTO。
func lookupSnapshotValue(snapshot map[string]any, path string) (any, bool) {
segments := strings.Split(strings.TrimSpace(path), ".")