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 6690949..5f892de 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -12,6 +12,8 @@ import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepTwoValid import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepThreeValidationResult; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationRequest; @@ -30,6 +32,7 @@ import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepThreeService; +import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepFourService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; @@ -66,6 +69,9 @@ public class StudentTrainingAnswerController { @Autowired private MarketOpportunitySelectionStepThreeService marketOpportunitySelectionStepThreeService; + @Autowired + private MarketOpportunitySelectionStepFourService marketOpportunitySelectionStepFourService; + @Autowired private NewProductSurveyStepTwoService newProductSurveyStepTwoService; @@ -156,6 +162,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/market-opportunity-selection/step-4/validate") + @ApiOperation("市场机会识别与选品第四步校验") + public ResultEntity validateMarketOpportunitySelectionStepFour( + @RequestBody MarketOpportunitySelectionStepFourValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", marketOpportunitySelectionStepFourService.validate(answer, TokenProvider.getJWTUser(request))); + } catch (ServiceException e) { + return new ResultEntity<>(e.getCode(), e.getMessage()); + } + } + @PostMapping("/new-product-survey/step-2/validate") @ApiOperation("新产品调查与分析第二步校验") public ResultEntity validateNewProductSurveyStepTwo( diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/MarketOpportunitySelectionStepFourValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/MarketOpportunitySelectionStepFourValidationRequest.java new file mode 100644 index 0000000..e6d95d3 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/MarketOpportunitySelectionStepFourValidationRequest.java @@ -0,0 +1,8 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class MarketOpportunitySelectionStepFourValidationRequest { + private String visualizationUrl; + + public String getVisualizationUrl() { return visualizationUrl; } + public void setVisualizationUrl(String visualizationUrl) { this.visualizationUrl = visualizationUrl; } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/MarketOpportunitySelectionStepFourValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/MarketOpportunitySelectionStepFourValidationResult.java new file mode 100644 index 0000000..e275e3d --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/MarketOpportunitySelectionStepFourValidationResult.java @@ -0,0 +1,11 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class MarketOpportunitySelectionStepFourValidationResult { + 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/MarketOpportunitySelectionStepFourService.java b/src/main/java/com/sztzjy/linkCommerce/service/MarketOpportunitySelectionStepFourService.java new file mode 100644 index 0000000..5abad62 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/MarketOpportunitySelectionStepFourService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationResult; + +public interface MarketOpportunitySelectionStepFourService { + MarketOpportunitySelectionStepFourValidationResult validate(MarketOpportunitySelectionStepFourValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFourServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFourServiceImpl.java new file mode 100644 index 0000000..140e62c --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFourServiceImpl.java @@ -0,0 +1,32 @@ +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.StudentTrainingAnswer; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationResult; +import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepFourService; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +@Service +public class MarketOpportunitySelectionStepFourServiceImpl implements MarketOpportunitySelectionStepFourService { + private static final String TASK_KEY = "market-opportunity-selection"; + + @Autowired private StudentTrainingAnswerService studentTrainingAnswerService; + + @Override + public MarketOpportunitySelectionStepFourValidationResult validate(MarketOpportunitySelectionStepFourValidationRequest request, JwtUser user) { + if (user == null || StringUtils.isBlank(user.getUserId())) throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再校验"); + if (user.getRoleId() != 4) throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可进行实训校验"); + StudentTrainingAnswer savedAnswer = studentTrainingAnswerService.get(TASK_KEY, null, user); + if (savedAnswer == null || StringUtils.isBlank(savedAnswer.getStep3Answer())) throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存第 3 步综合得分计算"); + if (request == null || StringUtils.isBlank(request.getVisualizationUrl())) throw new ServiceException(HttpStatus.BAD_REQUEST, "请上传数据可视化结果图"); + MarketOpportunitySelectionStepFourValidationResult result = new MarketOpportunitySelectionStepFourValidationResult(); + result.setValid(true); result.setMessage("校验通过"); + return result; + } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java index 7353a0e..9df784c 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java @@ -11,6 +11,8 @@ import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepTwoValid import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepThreeValidationResult; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.NewProductSurveyStepThreeValidationRequest; @@ -27,6 +29,7 @@ import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepThreeService; +import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepFourService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; @@ -102,6 +105,18 @@ class StudentTrainingAnswerControllerTest { verify(service).validate(any(MarketOpportunitySelectionStepThreeValidationRequest.class), any(JwtUser.class)); } + @Test + void validateMarketOpportunitySelectionStepFourUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { + StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); + MarketOpportunitySelectionStepFourService service = mock(MarketOpportunitySelectionStepFourService.class); + ReflectionTestUtils.setField(controller, "marketOpportunitySelectionStepFourService", service); + MarketOpportunitySelectionStepFourValidationResult validation = new MarketOpportunitySelectionStepFourValidationResult(); validation.setValid(true); + when(service.validate(any(MarketOpportunitySelectionStepFourValidationRequest.class), any(JwtUser.class))).thenReturn(validation); + ResultEntity result = controller.validateMarketOpportunitySelectionStepFour(new MarketOpportunitySelectionStepFourValidationRequest(), authenticatedStudentRequest()); + assertEquals(HttpStatus.OK, result.getStatusCode()); assertEquals(validation, result.getBody().getData()); + verify(service).validate(any(MarketOpportunitySelectionStepFourValidationRequest.class), any(JwtUser.class)); + } + @Test void validateStepTwoUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFourServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFourServiceImplTest.java new file mode 100644 index 0000000..cbc4172 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/MarketOpportunitySelectionStepFourServiceImplTest.java @@ -0,0 +1,50 @@ +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.StudentTrainingAnswer; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.MarketOpportunitySelectionStepFourValidationResult; +import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; +import org.junit.jupiter.api.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +class MarketOpportunitySelectionStepFourServiceImplTest { + @Test + void validateAcceptsVisualizationAfterStepThreeIsSaved() { + MarketOpportunitySelectionStepFourValidationResult result = serviceWithStepThree().validate(request("/profile/visualization.png"), student()); + assertTrue(result.isValid()); + } + + @Test + void validateRejectsMissingImageAndMissingStepThree() { + assertThrows(ServiceException.class, () -> serviceWithStepThree().validate(request(""), student())); + MarketOpportunitySelectionStepFourServiceImpl service = new MarketOpportunitySelectionStepFourServiceImpl(); + StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); + ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); + when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(null); + assertThrows(ServiceException.class, () -> service.validate(request("/profile/visualization.png"), student())); + } + + private MarketOpportunitySelectionStepFourServiceImpl serviceWithStepThree() { + MarketOpportunitySelectionStepFourServiceImpl service = new MarketOpportunitySelectionStepFourServiceImpl(); + StudentTrainingAnswerService answers = mock(StudentTrainingAnswerService.class); + StudentTrainingAnswer answer = new StudentTrainingAnswer(); answer.setStep3Answer("{\"scores\":{}}"); + when(answers.get(anyString(), any(), any(JwtUser.class))).thenReturn(answer); + ReflectionTestUtils.setField(service, "studentTrainingAnswerService", answers); + return service; + } + + private MarketOpportunitySelectionStepFourValidationRequest request(String url) { + MarketOpportunitySelectionStepFourValidationRequest request = new MarketOpportunitySelectionStepFourValidationRequest(); request.setVisualizationUrl(url); return request; + } + + private JwtUser student() { JwtUser user = new JwtUser(); user.setUserId("stu-1"); user.setRoleId(4); return user; } +}