feat: validate target user rfm upload
parent
c47616b1ec
commit
4929b26861
@ -0,0 +1,17 @@
|
||||
package com.sztzjy.linkCommerce.entity.dto;
|
||||
|
||||
public class TargetUserProfileStepOneValidationRequest {
|
||||
private String excelUrl;
|
||||
private String excelName;
|
||||
private Integer previewRowCount;
|
||||
private Integer previewColumnCount;
|
||||
|
||||
public String getExcelUrl() { return excelUrl; }
|
||||
public void setExcelUrl(String excelUrl) { this.excelUrl = excelUrl; }
|
||||
public String getExcelName() { return excelName; }
|
||||
public void setExcelName(String excelName) { this.excelName = excelName; }
|
||||
public Integer getPreviewRowCount() { return previewRowCount; }
|
||||
public void setPreviewRowCount(Integer previewRowCount) { this.previewRowCount = previewRowCount; }
|
||||
public Integer getPreviewColumnCount() { return previewColumnCount; }
|
||||
public void setPreviewColumnCount(Integer previewColumnCount) { this.previewColumnCount = previewColumnCount; }
|
||||
}
|
||||
@ -0,0 +1,11 @@
|
||||
package com.sztzjy.linkCommerce.entity.dto;
|
||||
|
||||
public class TargetUserProfileStepOneValidationResult {
|
||||
private boolean valid;
|
||||
private String message;
|
||||
|
||||
public boolean isValid() { return valid; }
|
||||
public void setValid(boolean valid) { this.valid = valid; }
|
||||
public String getMessage() { return message; }
|
||||
public void setMessage(String message) { this.message = message; }
|
||||
}
|
||||
@ -0,0 +1,9 @@
|
||||
package com.sztzjy.linkCommerce.service;
|
||||
|
||||
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||
import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepOneValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepOneValidationResult;
|
||||
|
||||
public interface TargetUserProfileStepOneService {
|
||||
TargetUserProfileStepOneValidationResult validate(TargetUserProfileStepOneValidationRequest request, JwtUser user);
|
||||
}
|
||||
@ -0,0 +1,40 @@
|
||||
package com.sztzjy.linkCommerce.service.impl;
|
||||
|
||||
import com.sztzjy.linkCommerce.config.exception.handler.ServiceException;
|
||||
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||
import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepOneValidationRequest;
|
||||
import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepOneValidationResult;
|
||||
import com.sztzjy.linkCommerce.service.TargetUserProfileStepOneService;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.Locale;
|
||||
|
||||
@Service
|
||||
public class TargetUserProfileStepOneServiceImpl implements TargetUserProfileStepOneService {
|
||||
@Override
|
||||
public TargetUserProfileStepOneValidationResult validate(TargetUserProfileStepOneValidationRequest request, JwtUser user) {
|
||||
if (user == null || StringUtils.isBlank(user.getUserId())) {
|
||||
throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再校验");
|
||||
}
|
||||
if (user.getRoleId() != 4) {
|
||||
throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可进行实训校验");
|
||||
}
|
||||
if (request == null || StringUtils.isBlank(request.getExcelUrl()) || StringUtils.isBlank(request.getExcelName())) {
|
||||
throw new ServiceException(HttpStatus.BAD_REQUEST, "请上传 RFM 用户分层分析结果 Excel 数据");
|
||||
}
|
||||
String excelName = request.getExcelName().trim().toLowerCase(Locale.ROOT);
|
||||
if (!excelName.endsWith(".xls") && !excelName.endsWith(".xlsx")) {
|
||||
throw new ServiceException(HttpStatus.BAD_REQUEST, "仅支持 .xls、.xlsx 格式的 Excel 文件");
|
||||
}
|
||||
if (request.getPreviewRowCount() == null || request.getPreviewRowCount() < 1
|
||||
|| request.getPreviewColumnCount() == null || request.getPreviewColumnCount() < 1) {
|
||||
throw new ServiceException(HttpStatus.BAD_REQUEST, "Excel 文件需要包含可预览的表头和数据");
|
||||
}
|
||||
TargetUserProfileStepOneValidationResult result = new TargetUserProfileStepOneValidationResult();
|
||||
result.setValid(true);
|
||||
result.setMessage("校验通过");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,39 @@
|
||||
package com.sztzjy.linkCommerce.service.impl;
|
||||
|
||||
import com.sztzjy.linkCommerce.config.exception.handler.ServiceException;
|
||||
import com.sztzjy.linkCommerce.config.security.JwtUser;
|
||||
import com.sztzjy.linkCommerce.entity.dto.TargetUserProfileStepOneValidationRequest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
class TargetUserProfileStepOneServiceImplTest {
|
||||
@Test
|
||||
void validatesStudentRfmExcelWithPreview() {
|
||||
assertTrue(new TargetUserProfileStepOneServiceImpl().validate(request("rfm.xlsx", 20, 6), student()).isValid());
|
||||
}
|
||||
|
||||
@Test
|
||||
void rejectsNonExcelFileAndUnpreviewableWorkbook() {
|
||||
TargetUserProfileStepOneServiceImpl service = new TargetUserProfileStepOneServiceImpl();
|
||||
assertThrows(ServiceException.class, () -> service.validate(request("rfm.pdf", 2, 6), student()));
|
||||
assertThrows(ServiceException.class, () -> service.validate(request("rfm.xlsx", 0, 0), student()));
|
||||
}
|
||||
|
||||
private TargetUserProfileStepOneValidationRequest request(String excelName, int rows, int columns) {
|
||||
TargetUserProfileStepOneValidationRequest request = new TargetUserProfileStepOneValidationRequest();
|
||||
request.setExcelName(excelName);
|
||||
request.setExcelUrl("/profile/" + excelName);
|
||||
request.setPreviewRowCount(rows);
|
||||
request.setPreviewColumnCount(columns);
|
||||
return request;
|
||||
}
|
||||
|
||||
private JwtUser student() {
|
||||
JwtUser user = new JwtUser();
|
||||
user.setUserId("stu-1");
|
||||
user.setRoleId(4);
|
||||
return user;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue