From 1ce291ceefa7ac9725bb2f77f0f9e8d90ab4b385 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Tue, 11 Aug 2026 18:36:17 +0800 Subject: [PATCH] feat: validate consumer behavior hypotheses --- .../stu/StudentTrainingAnswerController.java | 17 +++++ ...sumerBehaviorStepOneValidationRequest.java | 23 ++++++ ...nsumerBehaviorStepOneValidationResult.java | 11 +++ .../ConsumerBehaviorStepOneService.java | 9 +++ .../ConsumerBehaviorStepOneServiceImpl.java | 44 ++++++++++++ ...onsumerBehaviorStepOneServiceImplTest.java | 71 +++++++++++++++++++ 6 files changed, 175 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepOneService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImplTest.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 5f892de..c6dbeef 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -28,6 +28,8 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeVali import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepFourValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepFourValidationResult; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepOneValidationResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService; @@ -40,6 +42,7 @@ import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepOneService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepTwoService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepThreeService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepFourService; +import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepOneService; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; @@ -91,6 +94,9 @@ public class StudentTrainingAnswerController { @Autowired private ProductDevelopmentFactorsStepFourService productDevelopmentFactorsStepFourService; + @Autowired + private ConsumerBehaviorStepOneService consumerBehaviorStepOneService; + @GetMapping("/{taskKey}") @ApiOperation("查询当前学生指定实训任务答案") public ResultEntity detail(@PathVariable String taskKey, @@ -251,6 +257,17 @@ public class StudentTrainingAnswerController { catch (ServiceException e) { return new ResultEntity<>(e.getCode(), e.getMessage()); } } + @PostMapping("/consumer-behavior/step-1/validate") + @ApiOperation("消费者需求与行为第一步校验") + public ResultEntity validateConsumerBehaviorStepOne( + @RequestBody ConsumerBehaviorStepOneValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", consumerBehaviorStepOneService.validate(answer, TokenProvider.getJWTUser(request))); + } catch (ServiceException e) { + return new ResultEntity<>(e.getCode(), e.getMessage()); + } + } + @DeleteMapping("/{taskKey}") @ApiOperation("删除当前学生指定实训任务答案") public ResultEntity delete(@PathVariable String taskKey, diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationRequest.java new file mode 100644 index 0000000..201c0a5 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationRequest.java @@ -0,0 +1,23 @@ +package com.sztzjy.linkCommerce.entity.dto; + +import java.util.List; + +public class ConsumerBehaviorStepOneValidationRequest { + private List hypotheses; + + public List getHypotheses() { return hypotheses; } + public void setHypotheses(List hypotheses) { this.hypotheses = hypotheses; } + + public static class Hypothesis { + private String targetGroup; + private String keyFinding; + private String coreHypothesis; + + public String getTargetGroup() { return targetGroup; } + public void setTargetGroup(String targetGroup) { this.targetGroup = targetGroup; } + public String getKeyFinding() { return keyFinding; } + public void setKeyFinding(String keyFinding) { this.keyFinding = keyFinding; } + public String getCoreHypothesis() { return coreHypothesis; } + public void setCoreHypothesis(String coreHypothesis) { this.coreHypothesis = coreHypothesis; } + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationResult.java new file mode 100644 index 0000000..dbda3d8 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerBehaviorStepOneValidationResult.java @@ -0,0 +1,11 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class ConsumerBehaviorStepOneValidationResult { + 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/ConsumerBehaviorStepOneService.java b/src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepOneService.java new file mode 100644 index 0000000..1b3a287 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/ConsumerBehaviorStepOneService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepOneValidationResult; + +public interface ConsumerBehaviorStepOneService { + ConsumerBehaviorStepOneValidationResult validate(ConsumerBehaviorStepOneValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImpl.java new file mode 100644 index 0000000..8711f0b --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImpl.java @@ -0,0 +1,44 @@ +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.ConsumerBehaviorStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepOneValidationResult; +import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepOneService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +@Service +public class ConsumerBehaviorStepOneServiceImpl implements ConsumerBehaviorStepOneService { + @Override + public ConsumerBehaviorStepOneValidationResult validate(ConsumerBehaviorStepOneValidationRequest request, JwtUser user) { + requireStudent(user); + if (request == null || request.getHypotheses() == null || request.getHypotheses().isEmpty()) { + throw badRequest("请至少填写一条目标人群与问卷核心假设"); + } + for (ConsumerBehaviorStepOneValidationRequest.Hypothesis hypothesis : request.getHypotheses()) { + if (hypothesis == null || StringUtils.isBlank(hypothesis.getTargetGroup()) + || StringUtils.isBlank(hypothesis.getKeyFinding()) || StringUtils.isBlank(hypothesis.getCoreHypothesis())) { + throw badRequest("请完整填写目标人群、实训8关键发现和问卷核心假设"); + } + } + ConsumerBehaviorStepOneValidationResult result = new ConsumerBehaviorStepOneValidationResult(); + 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/ConsumerBehaviorStepOneServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImplTest.java new file mode 100644 index 0000000..6d7159b --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerBehaviorStepOneServiceImplTest.java @@ -0,0 +1,71 @@ +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.ConsumerBehaviorStepOneValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepOneValidationResult; +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 ConsumerBehaviorStepOneServiceImplTest { + + @Test + void acceptsStudentWithCompleteTargetHypotheses() { + ConsumerBehaviorStepOneServiceImpl service = new ConsumerBehaviorStepOneServiceImpl(); + + ConsumerBehaviorStepOneValidationResult result = service.validate(validRequest(), student()); + + assertTrue(result.isValid()); + } + + @Test + void rejectsIncompleteTargetHypothesis() { + ConsumerBehaviorStepOneServiceImpl service = new ConsumerBehaviorStepOneServiceImpl(); + ConsumerBehaviorStepOneValidationRequest request = validRequest(); + request.getHypotheses().get(1).setCoreHypothesis(" "); + + assertThrows(ServiceException.class, () -> service.validate(request, student())); + } + + @Test + void rejectsNonStudent() { + ConsumerBehaviorStepOneServiceImpl service = new ConsumerBehaviorStepOneServiceImpl(); + + assertThrows(ServiceException.class, () -> service.validate(validRequest(), teacher())); + } + + private ConsumerBehaviorStepOneValidationRequest validRequest() { + ConsumerBehaviorStepOneValidationRequest request = new ConsumerBehaviorStepOneValidationRequest(); + request.setHypotheses(Arrays.asList( + row("职场白领(25-35岁)", "高压工作、入睡困难、看重效率", "是否关注白噪声质量与智能场景联动"), + row("精致妈妈(28-38岁)", "关注宝宝睡眠、需要远程看护", "是否愿意为婴幼儿模式支付溢价"), + row("银发人群(50-65岁)", "睡眠浅易醒、担心操作复杂", "语音控制是否是刚需"))); + return request; + } + + private ConsumerBehaviorStepOneValidationRequest.Hypothesis row(String targetGroup, String keyFinding, String coreHypothesis) { + ConsumerBehaviorStepOneValidationRequest.Hypothesis row = new ConsumerBehaviorStepOneValidationRequest.Hypothesis(); + row.setTargetGroup(targetGroup); + row.setKeyFinding(keyFinding); + row.setCoreHypothesis(coreHypothesis); + 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; + } +}