完善退款审批材料与恢复流程
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 9m35s
This commit is contained in:
@@ -51,32 +51,51 @@ func buildApprovalForm(ctx context.Context, businessType string, applicationID,
|
||||
for _, control := range template.Controls {
|
||||
requiredControls[control.ID] = control.Required
|
||||
}
|
||||
// 本变更新增字段必须配置控件映射:场景里没有该字段的映射条目时,下面的遍历永远不会看到它,
|
||||
// 该字段会被静默丢弃。因此在组装前先针对本次提交使用的映射逐一确认必须字段有条目,
|
||||
// 缺失即明确失败并指出缺哪个字段/控件;本判定与场景映射校验共用同一份 RequiredSceneFields。
|
||||
// 既有未标注必须映射的可选字段不在其中,缺失映射时保持既有静默跳过行为。
|
||||
mappingFields := make(map[string]struct{}, len(mappings))
|
||||
mappingFields := make(map[string]dto.WeComControlMappingItem, len(mappings))
|
||||
for _, item := range mappings {
|
||||
mappingFields[strings.TrimSpace(item.BusinessField)] = struct{}{}
|
||||
mappingFields[strings.TrimSpace(item.BusinessField)] = item
|
||||
}
|
||||
for _, field := range wecomapp.RequiredSceneFields(businessType) {
|
||||
if _, exists := mappingFields[field.Code]; !exists {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus,
|
||||
"企业微信审批场景缺少必须配置的控件映射: "+field.Name+"(业务字段 "+field.Code+"),请先配置该控件映射后再提交")
|
||||
requiredFields := wecomapp.RequiredSceneFields(businessType)
|
||||
if businessType == constants.ApprovalBusinessTypeRefund {
|
||||
requiredFields = append(requiredFields, wecomapp.RequiredRefundFields(snapshot)...)
|
||||
}
|
||||
for _, field := range requiredFields {
|
||||
mapping, exists := mappingFields[field.Code]
|
||||
if !exists {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "企业微信审批场景缺少必须配置的控件映射: "+field.Name+"(业务字段 "+field.Code+")")
|
||||
}
|
||||
}
|
||||
// 本变更新增字段缺失快照值时同样明确失败:映射已配置却拿不到值,静默跳过会让审批材料
|
||||
// 与本地事实不一致。该校验必须在循环之前完成——循环内的既有文件类控件会经
|
||||
// attachments.Upload 触达外部系统,若把校验留在循环内,失败可能晚于外部调用(ENG-TX-001
|
||||
// 要求事务内不得持有不可回滚的长外部 I/O,同理失败必须发生在任何外呼之前)。
|
||||
// 既有未映射(或映射到既有可选字段)的控件保持既有静默跳过行为。
|
||||
requiredFields := make(map[string]string)
|
||||
for _, field := range wecomapp.RequiredSceneFields(businessType) {
|
||||
requiredFields[field.Code] = field.Name
|
||||
if _, exists := lookupSnapshotValue(snapshot, field.Code); !exists {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus,
|
||||
"审批业务快照缺少必须提交的字段: "+field.Name+"(业务字段 "+field.Code+"),请确认已配置对应控件与业务字段映射")
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少必须提交的字段: "+field.Name)
|
||||
}
|
||||
if businessType == constants.ApprovalBusinessTypeRefund && field.Code == constants.ApprovalFieldRefundMethodCode {
|
||||
methodCode, _ := snapshot[field.Code].(string)
|
||||
methodCode = strings.TrimSpace(methodCode)
|
||||
if methodCode == "" || (methodCode != constants.RefundMethodOriginalRoute && methodCode != constants.RefundMethodCustomerAccount && methodCode != constants.RefundMethodAssetWallet && methodCode != constants.RefundMethodAgentWallet) {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少有效退款方式编码")
|
||||
}
|
||||
}
|
||||
if field.Code == constants.ApprovalFieldCustomerAccountInfo {
|
||||
value, _ := snapshot[field.Code].(string)
|
||||
if strings.TrimSpace(value) == "" {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少非空客户收款信息")
|
||||
}
|
||||
if !strings.EqualFold(mapping.ControlType, "textarea") {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "客户收款信息必须映射到多行文本控件")
|
||||
}
|
||||
}
|
||||
if field.Code == constants.ApprovalFieldCustomerVoucherKey {
|
||||
refs, err := parseApprovalFileReferences(snapshot[field.Code])
|
||||
if err != nil || len(refs) == 0 {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少客户收款凭证")
|
||||
}
|
||||
if !strings.EqualFold(mapping.ControlType, "file") {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "客户收款凭证必须映射到附件控件")
|
||||
}
|
||||
}
|
||||
}
|
||||
fieldNames := make(map[string]string, len(requiredFields))
|
||||
for _, field := range requiredFields {
|
||||
fieldNames[field.Code] = field.Name
|
||||
}
|
||||
contents := make([]map[string]any, 0, len(mappings))
|
||||
attachmentCount := 0
|
||||
@@ -86,7 +105,7 @@ func buildApprovalForm(ctx context.Context, businessType string, applicationID,
|
||||
if requiredControls[mapping.ControlID] {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少模板必填字段: "+mapping.BusinessField)
|
||||
}
|
||||
if name, required := requiredFields[strings.TrimSpace(mapping.BusinessField)]; required {
|
||||
if name, required := fieldNames[strings.TrimSpace(mapping.BusinessField)]; required {
|
||||
return approvalFormBuildResult{}, errors.New(errors.CodeInvalidStatus, "审批业务快照缺少必须提交的字段: "+name+",请确认已配置对应控件与业务字段映射")
|
||||
}
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user