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 611a999..c755c1f 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -43,6 +43,8 @@ import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepTwoValidationReque import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepThreeValidationResult; +import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepFourValidationResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService; @@ -62,6 +64,7 @@ import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepFourService; import com.sztzjy.linkCommerce.service.ConsumerScenarioStepOneService; import com.sztzjy.linkCommerce.service.ConsumerScenarioStepTwoService; import com.sztzjy.linkCommerce.service.ConsumerScenarioStepThreeService; +import com.sztzjy.linkCommerce.service.ConsumerScenarioStepFourService; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; @@ -135,6 +138,9 @@ public class StudentTrainingAnswerController { @Autowired private ConsumerScenarioStepThreeService consumerScenarioStepThreeService; + @Autowired + private ConsumerScenarioStepFourService consumerScenarioStepFourService; + @GetMapping("/{taskKey}") @ApiOperation("查询当前学生指定实训任务答案") public ResultEntity detail(@PathVariable String taskKey, @@ -372,6 +378,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/consumer-scenario/step-4/validate") + @ApiOperation("消费场景解构第四步校验") + public ResultEntity validateConsumerScenarioStepFour( + @RequestBody ConsumerScenarioStepFourValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验完成", consumerScenarioStepFourService.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/ConsumerScenarioStepFourValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerScenarioStepFourValidationRequest.java new file mode 100644 index 0000000..a8cccd0 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerScenarioStepFourValidationRequest.java @@ -0,0 +1,45 @@ +package com.sztzjy.linkCommerce.entity.dto; + +import java.util.List; + +public class ConsumerScenarioStepFourValidationRequest { + private List rows; + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public static class JourneyOptimizationRow { + private String stageId; + private String painPoint; + private String optimizationSuggestion; + + public String getStageId() { + return stageId; + } + + public void setStageId(String stageId) { + this.stageId = stageId; + } + + public String getPainPoint() { + return painPoint; + } + + public void setPainPoint(String painPoint) { + this.painPoint = painPoint; + } + + public String getOptimizationSuggestion() { + return optimizationSuggestion; + } + + public void setOptimizationSuggestion(String optimizationSuggestion) { + this.optimizationSuggestion = optimizationSuggestion; + } + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerScenarioStepFourValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerScenarioStepFourValidationResult.java new file mode 100644 index 0000000..b0f9c8a --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ConsumerScenarioStepFourValidationResult.java @@ -0,0 +1,22 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class ConsumerScenarioStepFourValidationResult { + 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/ConsumerScenarioStepFourService.java b/src/main/java/com/sztzjy/linkCommerce/service/ConsumerScenarioStepFourService.java new file mode 100644 index 0000000..8ee2257 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/ConsumerScenarioStepFourService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepFourValidationResult; + +public interface ConsumerScenarioStepFourService { + ConsumerScenarioStepFourValidationResult validate(ConsumerScenarioStepFourValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerScenarioStepFourServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerScenarioStepFourServiceImpl.java new file mode 100644 index 0000000..a2cad49 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/ConsumerScenarioStepFourServiceImpl.java @@ -0,0 +1,51 @@ +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.ConsumerScenarioStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepFourValidationResult; +import com.sztzjy.linkCommerce.service.ConsumerScenarioStepFourService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; + +@Service +public class ConsumerScenarioStepFourServiceImpl implements ConsumerScenarioStepFourService { + private static final List STAGE_IDS = Arrays.asList( + "problem-awareness", "information-search", "evaluation-decision", "purchase-conversion", "post-purchase" + ); + + @Override + public ConsumerScenarioStepFourValidationResult validate(ConsumerScenarioStepFourValidationRequest request, JwtUser user) { + requireStudent(user); + List rows = request == null ? null : request.getRows(); + if (rows == null || rows.size() != STAGE_IDS.size() || rows.stream().anyMatch(row -> row == null) + || rows.stream().map(ConsumerScenarioStepFourValidationRequest.JourneyOptimizationRow::getStageId).distinct().count() != STAGE_IDS.size() + || rows.stream().anyMatch(row -> !STAGE_IDS.contains(row.getStageId()))) { + throw badRequest("请完整填写五个购买旅程阶段的优化分析"); + } + if (rows.stream().anyMatch(row -> StringUtils.isBlank(row.getPainPoint()) || StringUtils.isBlank(row.getOptimizationSuggestion()))) { + throw badRequest("请完整填写五个阶段的痛点和优化建议"); + } + ConsumerScenarioStepFourValidationResult result = new ConsumerScenarioStepFourValidationResult(); + 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/ConsumerScenarioStepFourServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerScenarioStepFourServiceImplTest.java new file mode 100644 index 0000000..4bc55a2 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/ConsumerScenarioStepFourServiceImplTest.java @@ -0,0 +1,66 @@ +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.ConsumerScenarioStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepFourValidationResult; +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 ConsumerScenarioStepFourServiceImplTest { + private final ConsumerScenarioStepFourServiceImpl service = new ConsumerScenarioStepFourServiceImpl(); + + @Test + void acceptsCompleteJourneyOptimizations() { + ConsumerScenarioStepFourValidationResult result = service.validate(request(), student()); + + assertTrue(result.isValid()); + } + + @Test + void rejectsIncompleteOptimization() { + ConsumerScenarioStepFourValidationRequest request = request(); + request.getRows().get(1).setOptimizationSuggestion(" "); + + assertThrows(ServiceException.class, () -> service.validate(request, student())); + } + + @Test + void rejectsNonStudent() { + JwtUser teacher = student(); + teacher.setRoleId(3); + + assertThrows(ServiceException.class, () -> service.validate(request(), teacher)); + } + + private ConsumerScenarioStepFourValidationRequest request() { + ConsumerScenarioStepFourValidationRequest request = new ConsumerScenarioStepFourValidationRequest(); + request.setRows(Arrays.asList( + row("problem-awareness"), + row("information-search"), + row("evaluation-decision"), + row("purchase-conversion"), + row("post-purchase") + )); + return request; + } + + private ConsumerScenarioStepFourValidationRequest.JourneyOptimizationRow row(String stageId) { + ConsumerScenarioStepFourValidationRequest.JourneyOptimizationRow row = new ConsumerScenarioStepFourValidationRequest.JourneyOptimizationRow(); + row.setStageId(stageId); + row.setPainPoint("信息不够清晰"); + row.setOptimizationSuggestion("提供清晰指引和服务支持"); + return row; + } + + private JwtUser student() { + JwtUser user = new JwtUser(); + user.setUserId("stu-1"); + user.setRoleId(4); + return user; + } +}