From 3143f136e117f6d3a512ff973d4b902133b5577e Mon Sep 17 00:00:00 2001 From: chenyuan Date: Tue, 11 Aug 2026 21:56:41 +0800 Subject: [PATCH] feat: validate consumer behavior survey report --- .../stu/StudentTrainingAnswerController.java | 17 +++++ ...umerBehaviorStepFourValidationRequest.java | 20 ++++++ ...sumerBehaviorStepFourValidationResult.java | 11 ++++ .../ConsumerBehaviorStepFourService.java | 9 +++ .../ConsumerBehaviorStepFourServiceImpl.java | 48 ++++++++++++++ ...nsumerBehaviorStepFourServiceImplTest.java | 64 +++++++++++++++++++ 6 files changed, 169 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepFourService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImplTest.java diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java index 6e8ce19..ea3673c 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -34,6 +34,8 @@ import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepTwoValidationReque import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepThreeValidationResult; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationResult; import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorWordPreviewResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService; @@ -50,6 +52,7 @@ import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepFourService; import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepOneService; import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepTwoService; import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepThreeService; +import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepFourService; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; @@ -111,6 +114,9 @@ public class StudentTrainingAnswerController { @Autowired private ConsumerBehaviorStepThreeService consumerBehaviorStepThreeService; + @Autowired + private ConsumerBehaviorStepFourService consumerBehaviorStepFourService; + @GetMapping("/{taskKey}") @ApiOperation("查询当前学生指定实训任务答案") public ResultEntity detail(@PathVariable String taskKey, @@ -304,6 +310,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/consumer-behavior/step-4/validate") + @ApiOperation("消费者需求与行为第四步校验") + public ResultEntity validateConsumerBehaviorStepFour( + @RequestBody ConsumerBehaviorStepFourValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", consumerBehaviorStepFourService.validate(answer, TokenProvider.getJWTUser(request))); + } catch (ServiceException e) { + return new ResultEntity<>(e.getCode(), e.getMessage()); + } + } + @PostMapping(value = "/consumer-behavior/step-3/word-preview", consumes = "multipart/form-data") @ApiOperation("消费者需求与行为第三步Word预览") public ResultEntity previewConsumerBehaviorStepThreeWord( diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationRequest.java new file mode 100644 index 0000000..f58cdcd --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationRequest.java @@ -0,0 +1,20 @@ +package com.sztzjy.linkCommerce.entity.dto; + +import java.util.List; + +public class ConsumerBehaviorStepFourValidationRequest { + private List rows; + + public List getRows() { return rows; } + public void setRows(List rows) { this.rows = rows; } + + public static class ReportRow { + private String title; + private String content; + + public String getTitle() { return title; } + public void setTitle(String title) { this.title = title; } + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationResult.java new file mode 100644 index 0000000..78bdf0e --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepFourValidationResult.java @@ -0,0 +1,11 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class ConsumerBehaviorStepFourValidationResult { + 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; } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepFourService.java b/src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepFourService.java new file mode 100644 index 0000000..fa2f9e5 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepFourService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationResult; + +public interface ConsumerBehaviorStepFourService { + ConsumerBehaviorStepFourValidationResult validate(ConsumerBehaviorStepFourValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImpl.java new file mode 100644 index 0000000..2721c29 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImpl.java @@ -0,0 +1,48 @@ +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.ConsumerBehaviorStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationResult; +import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepFourService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class ConsumerBehaviorStepFourServiceImpl implements ConsumerBehaviorStepFourService { + private static final int REQUIRED_REPORT_ROWS = 5; + + @Override + public ConsumerBehaviorStepFourValidationResult validate(ConsumerBehaviorStepFourValidationRequest request, JwtUser user) { + requireStudent(user); + List rows = request == null ? null : request.getRows(); + if (rows == null || rows.size() != REQUIRED_REPORT_ROWS) { + throw badRequest("问卷调研报告需填写 5 个报告模块"); + } + for (ConsumerBehaviorStepFourValidationRequest.ReportRow row : rows) { + if (row == null || StringUtils.isBlank(row.getTitle()) || StringUtils.isBlank(row.getContent())) { + throw badRequest("请完整填写每个报告模块的标题和内容"); + } + } + ConsumerBehaviorStepFourValidationResult result = new ConsumerBehaviorStepFourValidationResult(); + result.setValid(true); + result.setMessage("校验通过"); + return result; + } + + private void requireStudent(JwtUser user) { + if (user == null || StringUtils.isBlank(user.getUserId())) { + throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再提交"); + } + if (user.getRoleId() != 4) { + throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可提交实训答案"); + } + } + + private ServiceException badRequest(String message) { + return new ServiceException(HttpStatus.BAD_REQUEST, message); + } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImplTest.java new file mode 100644 index 0000000..e0a8e43 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepFourServiceImplTest.java @@ -0,0 +1,64 @@ +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.ConsumerBehaviorStepFourValidationRequest; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ConsumerBehaviorStepFourServiceImplTest { + + @Test + void acceptsFiveCompletedReportModulesForStudent() { + ConsumerBehaviorStepFourServiceImpl service = new ConsumerBehaviorStepFourServiceImpl(); + + assertTrue(service.validate(validRequest(), student()).isValid()); + } + + @Test + void rejectsIncompleteReportRows() { + ConsumerBehaviorStepFourServiceImpl service = new ConsumerBehaviorStepFourServiceImpl(); + ConsumerBehaviorStepFourValidationRequest request = validRequest(); + request.getRows().get(2).setContent(" "); + + assertThrows(ServiceException.class, () -> service.validate(request, student())); + } + + @Test + void rejectsNonStudent() { + ConsumerBehaviorStepFourServiceImpl service = new ConsumerBehaviorStepFourServiceImpl(); + + assertThrows(ServiceException.class, () -> service.validate(validRequest(), teacher())); + } + + private ConsumerBehaviorStepFourValidationRequest validRequest() { + ConsumerBehaviorStepFourValidationRequest request = new ConsumerBehaviorStepFourValidationRequest(); + request.setRows(Arrays.asList(row("调研背景", "说明调研背景与目的"), row("调研方法", "说明样本与渠道"), row("决策因素", "分析购买决策因素"), row("群体差异", "分析不同群体差异"), row("结论建议", "提出产品建议"))); + return request; + } + + private ConsumerBehaviorStepFourValidationRequest.ReportRow row(String title, String content) { + ConsumerBehaviorStepFourValidationRequest.ReportRow row = new ConsumerBehaviorStepFourValidationRequest.ReportRow(); + row.setTitle(title); + row.setContent(content); + return row; + } + + private JwtUser student() { + JwtUser user = new JwtUser(); + user.setUserId("stu-1"); + user.setRoleId(4); + return user; + } + + private JwtUser teacher() { + JwtUser user = new JwtUser(); + user.setUserId("teacher-1"); + user.setRoleId(2); + return user; + } +}