1
This commit is contained in:
+10
-3
@@ -52,9 +52,16 @@ public class NotificationRecipientResolver {
|
||||
}
|
||||
|
||||
private List<IamMembership> byRole(CreateNotificationRequest request) {
|
||||
var role = roles.selectOne(new LambdaQueryWrapper<com.baiyue.iam.entity.IamRole>()
|
||||
.eq(com.baiyue.iam.entity.IamRole::getTenantId, request.tenantId())
|
||||
.eq(com.baiyue.iam.entity.IamRole::getRoleCode, request.roleCode()).eq(com.baiyue.iam.entity.IamRole::getStatus,"ACTIVE").last("LIMIT 1"));
|
||||
String appCode = request.recipientType() == com.baiyue.iam.notification.dto.NotificationDtos.RecipientType.TENANT_ROLE
|
||||
? "MERCHANT" : "PLATFORM";
|
||||
// Merchant members can be assigned tenant-specific roles or platform-provided merchant roles (tenant 0).
|
||||
var candidates = roles.selectList(new LambdaQueryWrapper<com.baiyue.iam.entity.IamRole>()
|
||||
.in(com.baiyue.iam.entity.IamRole::getTenantId, request.tenantId(), 0L)
|
||||
.eq(com.baiyue.iam.entity.IamRole::getAppCode, appCode)
|
||||
.eq(com.baiyue.iam.entity.IamRole::getRoleCode, request.roleCode())
|
||||
.eq(com.baiyue.iam.entity.IamRole::getStatus, "ACTIVE")
|
||||
.orderByDesc(com.baiyue.iam.entity.IamRole::getTenantId));
|
||||
var role = candidates.isEmpty() ? null : candidates.get(0);
|
||||
if (role == null) fail("角色编码不存在,请检查角色编码是否正确");
|
||||
List<Long> ids = membershipRoles.selectList(new LambdaQueryWrapper<com.baiyue.iam.entity.IamMembershipRole>()
|
||||
.eq(com.baiyue.iam.entity.IamMembershipRole::getTenantId,request.tenantId())
|
||||
|
||||
+9
-3
@@ -12,7 +12,9 @@ import java.util.regex.Pattern;
|
||||
|
||||
@Component
|
||||
public class NotificationTemplateRenderer {
|
||||
private static final Pattern VARIABLE = Pattern.compile("\\{\\{([a-z][a-z0-9_]{0,31})}}" );
|
||||
// ${name} is the format inserted by the template editor; retain {{name}} for existing templates.
|
||||
private static final Pattern VARIABLE = Pattern.compile(
|
||||
"\\$\\{([a-z][a-z0-9_]{0,31})}|\\{\\{([a-z][a-z0-9_]{0,31})}}" );
|
||||
|
||||
public String render(String template, Set<String> whitelist, Map<String, String> variables) {
|
||||
Set<String> used = placeholders(template);
|
||||
@@ -20,7 +22,11 @@ public class NotificationTemplateRenderer {
|
||||
if (!whitelist.containsAll(variables.keySet())) fail("NOTIFICATION_VARIABLE_NOT_ALLOWED");
|
||||
if (!variables.keySet().containsAll(used)) fail("NOTIFICATION_VARIABLE_MISSING");
|
||||
String rendered = template;
|
||||
for (String key : used) rendered = rendered.replace("{{" + key + "}}", variables.get(key));
|
||||
for (String key : used) {
|
||||
String value = variables.get(key);
|
||||
rendered = rendered.replace("${" + key + "}", value)
|
||||
.replace("{{" + key + "}}", value);
|
||||
}
|
||||
if (rendered.length() > 10_000) fail("NOTIFICATION_TEMPLATE_RENDER_TOO_LONG");
|
||||
return rendered;
|
||||
}
|
||||
@@ -33,7 +39,7 @@ public class NotificationTemplateRenderer {
|
||||
|
||||
private Set<String> placeholders(String value) {
|
||||
Set<String> keys = new HashSet<>(); Matcher matcher = VARIABLE.matcher(value);
|
||||
while (matcher.find()) keys.add(matcher.group(1));
|
||||
while (matcher.find()) keys.add(matcher.group(1) != null ? matcher.group(1) : matcher.group(2));
|
||||
return keys;
|
||||
}
|
||||
|
||||
|
||||
@@ -139,8 +139,8 @@ public class ProfileResourceService {
|
||||
if (tenant == null || !"MERCHANT".equals(tenant.getTenantType())) {
|
||||
throw new BizException(ResultCode.NOT_FOUND, "Enterprise not found / 企业客户不存在");
|
||||
}
|
||||
if (!"PROFILE_REQUIRED".equals(tenant.getStatus()) && !"REJECTED".equals(tenant.getStatus())) {
|
||||
throw new BizException(ResultCode.CONFLICT, "Qualifications can only be uploaded before review / 仅待完善或已驳回客户可上传资质");
|
||||
if (!platformCanUpdateQualifications(tenant)) {
|
||||
throw new BizException(ResultCode.CONFLICT, "Qualifications can only be uploaded before review / 仅待完善、已驳回或已审核客户可上传资质");
|
||||
}
|
||||
requireOptionalQualificationType(request.qualificationType());
|
||||
String certificateNo = resolveCertificateNo(tenant, request.qualificationType(), request.certificateNo());
|
||||
@@ -163,6 +163,7 @@ public class ProfileResourceService {
|
||||
IamTenantQualification qualification = createQualification(tenant.getId(), request.qualificationType(),
|
||||
certificateNo, request.documentUrl(), request.originalFileName());
|
||||
qualification.setValidTo(request.validTo());
|
||||
markPlatformQualificationApproved(tenant, qualification);
|
||||
repository.saveQualification(qualification);
|
||||
return new PlatformQualificationRegistrationResponse(
|
||||
qualification.getId(), null, tenant.getStatus(), replacedDocumentUrl);
|
||||
@@ -173,7 +174,7 @@ public class ProfileResourceService {
|
||||
resourceId = "#request.tenantId", description = "上传企业必填资质包", captureAfter = false)
|
||||
public RequiredQualificationPackageResponse submitRequiredQualificationPackage(
|
||||
RequiredQualificationPackageRequest request) {
|
||||
return registerRequiredQualificationPackage(request, "商户在送审前替换文件");
|
||||
return registerRequiredQualificationPackage(request, "商户在送审前替换文件", false);
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@@ -181,16 +182,17 @@ public class ProfileResourceService {
|
||||
resourceId = "#request.tenantId", description = "平台代客户上传必填资质包", captureAfter = false)
|
||||
public RequiredQualificationPackageResponse registerPlatformRequiredQualificationPackage(
|
||||
RequiredQualificationPackageRequest request) {
|
||||
return registerRequiredQualificationPackage(request, "平台在送审前替换文件");
|
||||
return registerRequiredQualificationPackage(request, "平台在送审前替换文件", true);
|
||||
}
|
||||
|
||||
private RequiredQualificationPackageResponse registerRequiredQualificationPackage(
|
||||
RequiredQualificationPackageRequest request, String replacementComment) {
|
||||
RequiredQualificationPackageRequest request, String replacementComment, boolean platformManaged) {
|
||||
IamTenant tenant = tenantRepository.findTenantForUpdate(request.tenantId());
|
||||
if (tenant == null || !"MERCHANT".equals(tenant.getTenantType())) {
|
||||
throw new BizException(ResultCode.NOT_FOUND, "Enterprise not found / 企业客户不存在");
|
||||
}
|
||||
if (!"PROFILE_REQUIRED".equals(tenant.getStatus()) && !"REJECTED".equals(tenant.getStatus())) {
|
||||
if (platformManaged ? !platformCanUpdateQualifications(tenant)
|
||||
: (!"PROFILE_REQUIRED".equals(tenant.getStatus()) && !"REJECTED".equals(tenant.getStatus()))) {
|
||||
throw new BizException(ResultCode.CONFLICT,
|
||||
"Qualifications can only be uploaded before review / 仅待完善或已驳回客户可上传资质");
|
||||
}
|
||||
@@ -212,12 +214,14 @@ public class ProfileResourceService {
|
||||
IamTenantQualification businessLicense = createQualification(tenant.getId(), "BUSINESS_LICENSE",
|
||||
creditCode, request.businessLicenseDocumentUrl(), request.businessLicenseOriginalFileName());
|
||||
businessLicense.setValidTo(request.businessLicenseValidTo());
|
||||
if (platformManaged) markPlatformQualificationApproved(tenant, businessLicense);
|
||||
repository.saveQualification(businessLicense);
|
||||
IamTenantQualification legalPersonId = null;
|
||||
if (hasLegalPersonId) {
|
||||
legalPersonId = createQualification(tenant.getId(), "LEGAL_PERSON_ID",
|
||||
null, request.legalPersonIdDocumentUrl().trim(), request.legalPersonIdOriginalFileName());
|
||||
legalPersonId.setValidTo(request.legalPersonIdValidTo());
|
||||
if (platformManaged) markPlatformQualificationApproved(tenant, legalPersonId);
|
||||
repository.saveQualification(legalPersonId);
|
||||
}
|
||||
if (!creditCode.equals(tenant.getUnifiedSocialCreditCode())) {
|
||||
@@ -314,6 +318,17 @@ public class ProfileResourceService {
|
||||
&& !"SUPERSEDED".equals(qualification.getStatus());
|
||||
}
|
||||
|
||||
private boolean platformCanUpdateQualifications(IamTenant tenant) {
|
||||
return "PROFILE_REQUIRED".equals(tenant.getStatus()) || "REJECTED".equals(tenant.getStatus())
|
||||
|| "ACTIVE".equals(tenant.getStatus()) || "DISABLED".equals(tenant.getStatus());
|
||||
}
|
||||
|
||||
private void markPlatformQualificationApproved(IamTenant tenant, IamTenantQualification qualification) {
|
||||
if ("ACTIVE".equals(tenant.getStatus()) || "DISABLED".equals(tenant.getStatus())) {
|
||||
qualification.setStatus("APPROVED");
|
||||
}
|
||||
}
|
||||
|
||||
private void requireMerchant(long tenantId) {
|
||||
IamTenant tenant = tenantRepository.findTenant(tenantId);
|
||||
if (tenant == null || tenant.getId() == null || tenant.getId().longValue() != tenantId
|
||||
|
||||
Reference in New Issue
Block a user