From dd45d9c60aafa49a16f1d3bba95765bbf76e68a0 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 15:02:13 +0800 Subject: [PATCH 1/3] feat: validate product factors step three --- ...mentFactorsStepThreeValidationRequest.java | 23 ++++++++ ...pmentFactorsStepThreeValidationResult.java | 11 ++++ ...uctDevelopmentFactorsStepThreeService.java | 9 +++ ...evelopmentFactorsStepThreeServiceImpl.java | 44 +++++++++++++++ ...opmentFactorsStepThreeServiceImplTest.java | 55 +++++++++++++++++++ 5 files changed, 142 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepThreeService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImplTest.java diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationRequest.java new file mode 100644 index 0000000..ba903ec --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationRequest.java @@ -0,0 +1,23 @@ +package com.sztzjy.linkCommerce.entity.dto; + +import java.util.List; + +public class ProductDevelopmentFactorsStepThreeValidationRequest { + private List factors; + + public List getFactors() { return factors; } + public void setFactors(List factors) { this.factors = factors; } + + public static class Row { + private String dimension; + private String successAnalysis; + private String failedAnalysis; + + public String getDimension() { return dimension; } + public void setDimension(String value) { dimension = value; } + public String getSuccessAnalysis() { return successAnalysis; } + public void setSuccessAnalysis(String value) { successAnalysis = value; } + public String getFailedAnalysis() { return failedAnalysis; } + public void setFailedAnalysis(String value) { failedAnalysis = value; } + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationResult.java new file mode 100644 index 0000000..98f1ac8 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepThreeValidationResult.java @@ -0,0 +1,11 @@ +package com.sztzjy.linkCommerce.entity.dto; + +public class ProductDevelopmentFactorsStepThreeValidationResult { + private boolean valid; + private String message; + + public boolean isValid() { return valid; } + public void setValid(boolean value) { valid = value; } + public String getMessage() { return message; } + public void setMessage(String value) { message = value; } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepThreeService.java b/src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepThreeService.java new file mode 100644 index 0000000..8836b8a --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepThreeService.java @@ -0,0 +1,9 @@ +package com.sztzjy.linkCommerce.service; + +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; + +public interface ProductDevelopmentFactorsStepThreeService { + ProductDevelopmentFactorsStepThreeValidationResult validate(ProductDevelopmentFactorsStepThreeValidationRequest request, JwtUser user); +} diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImpl.java new file mode 100644 index 0000000..f39362c --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImpl.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.ProductDevelopmentFactorsStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; +import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepThreeService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; + +@Service +public class ProductDevelopmentFactorsStepThreeServiceImpl implements ProductDevelopmentFactorsStepThreeService { + private static final Set DIMENSIONS = new LinkedHashSet<>(Arrays.asList("供应链与成本控制", "商业模式", "市场反馈")); + + @Override + public ProductDevelopmentFactorsStepThreeValidationResult validate(ProductDevelopmentFactorsStepThreeValidationRequest 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 || request.getFactors() == null || request.getFactors().size() != DIMENSIONS.size()) { + throw badRequest("请完成供应链与成本控制、商业模式和市场反馈分析"); + } + + Set submitted = new LinkedHashSet<>(); + for (ProductDevelopmentFactorsStepThreeValidationRequest.Row row : request.getFactors()) { + String dimension = row == null ? "" : StringUtils.trimToEmpty(row.getDimension()); + if (!DIMENSIONS.contains(dimension) || !submitted.add(dimension)) throw badRequest("提交的分析维度不完整或重复"); + if (!StringUtils.isNotBlank(row.getSuccessAnalysis())) throw badRequest("请填写" + dimension + "的成功产品分析"); + if (!StringUtils.isNotBlank(row.getFailedAnalysis())) throw badRequest("请填写" + dimension + "的失败产品分析"); + } + if (!submitted.equals(DIMENSIONS)) throw badRequest("请完成供应链与成本控制、商业模式和市场反馈分析"); + + ProductDevelopmentFactorsStepThreeValidationResult result = new ProductDevelopmentFactorsStepThreeValidationResult(); + result.setValid(true); + result.setMessage("校验通过"); + return result; + } + + private ServiceException badRequest(String message) { return new ServiceException(HttpStatus.BAD_REQUEST, message); } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImplTest.java new file mode 100644 index 0000000..3a8f00f --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepThreeServiceImplTest.java @@ -0,0 +1,55 @@ +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.ProductDevelopmentFactorsStepThreeValidationRequest; +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 ProductDevelopmentFactorsStepThreeServiceImplTest { + @Test + void acceptsCompleteStudentAnalyses() { + assertTrue(new ProductDevelopmentFactorsStepThreeServiceImpl().validate(valid(), student()).isValid()); + } + + @Test + void rejectsBlankOrForgedAnalyses() { + ProductDevelopmentFactorsStepThreeServiceImpl service = new ProductDevelopmentFactorsStepThreeServiceImpl(); + ProductDevelopmentFactorsStepThreeValidationRequest blank = valid(); + blank.getFactors().get(2).setFailedAnalysis(" "); + assertThrows(ServiceException.class, () -> service.validate(blank, student())); + ProductDevelopmentFactorsStepThreeValidationRequest forged = valid(); + forged.getFactors().get(2).setDimension("伪造维度"); + assertThrows(ServiceException.class, () -> service.validate(forged, student())); + } + + @Test + void rejectsNonStudent() { + assertThrows(ServiceException.class, () -> new ProductDevelopmentFactorsStepThreeServiceImpl().validate(valid(), teacher())); + } + + private ProductDevelopmentFactorsStepThreeValidationRequest valid() { + ProductDevelopmentFactorsStepThreeValidationRequest request = new ProductDevelopmentFactorsStepThreeValidationRequest(); + request.setFactors(Arrays.asList( + row("供应链与成本控制", "成本可控且供应稳定", "关键器件单一供应"), + row("商业模式", "订阅服务形成闭环", "盈利模式不清晰"), + row("市场反馈", "用户留存高且复购稳定", "退货率高且反馈差") + )); + return request; + } + + private ProductDevelopmentFactorsStepThreeValidationRequest.Row row(String dimension, String success, String failed) { + ProductDevelopmentFactorsStepThreeValidationRequest.Row row = new ProductDevelopmentFactorsStepThreeValidationRequest.Row(); + row.setDimension(dimension); + row.setSuccessAnalysis(success); + row.setFailedAnalysis(failed); + 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("tea-1"); user.setRoleId(2); return user; } +} From a4e7257c15bd430cb429ca1e9fe81beff6f3f6db Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 15:04:20 +0800 Subject: [PATCH 2/3] feat: expose product factors step three validation --- .../stu/StudentTrainingAnswerController.java | 17 ++++++++++++++++ .../StudentTrainingAnswerControllerTest.java | 20 +++++++++++++++++++ 2 files changed, 37 insertions(+) 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 1adb26e..154f63c 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -16,12 +16,15 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepOneValida import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepOneValidationResult; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValidationResult; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepOneService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepTwoService; +import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepThreeService; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; @@ -56,6 +59,9 @@ public class StudentTrainingAnswerController { @Autowired private ProductDevelopmentFactorsStepTwoService productDevelopmentFactorsStepTwoService; + @Autowired + private ProductDevelopmentFactorsStepThreeService productDevelopmentFactorsStepThreeService; + @GetMapping("/{taskKey}") @ApiOperation("查询当前学生指定实训任务答案") public ResultEntity detail(@PathVariable String taskKey, @@ -153,6 +159,17 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/product-development-factors/step-3/validate") + @ApiOperation("产品开发关键因素第三步校验") + public ResultEntity validateProductDevelopmentFactorsStepThree( + @RequestBody ProductDevelopmentFactorsStepThreeValidationRequest answer, HttpServletRequest request) { + try { + return new ResultEntity<>(HttpStatus.OK, "校验通过", productDevelopmentFactorsStepThreeService.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/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java index ee7c3c8..801bc42 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerControllerTest.java @@ -15,12 +15,15 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepOneValida import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepOneValidationResult; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValidationResult; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationResult; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepOneService; import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepTwoService; +import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepThreeService; import com.sztzjy.linkCommerce.util.ResultEntity; import org.junit.jupiter.api.Test; import org.springframework.http.HttpStatus; @@ -135,6 +138,23 @@ class StudentTrainingAnswerControllerTest { verify(service).validate(any(ProductDevelopmentFactorsStepTwoValidationRequest.class), any(JwtUser.class)); } + @Test + void validateProductDevelopmentFactorsStepThreeUsesTheAuthenticatedStudentAndReturnsTheValidationResult() { + StudentTrainingAnswerController controller = new StudentTrainingAnswerController(); + ProductDevelopmentFactorsStepThreeService service = mock(ProductDevelopmentFactorsStepThreeService.class); + ReflectionTestUtils.setField(controller, "productDevelopmentFactorsStepThreeService", service); + ProductDevelopmentFactorsStepThreeValidationResult validation = new ProductDevelopmentFactorsStepThreeValidationResult(); + validation.setValid(true); + when(service.validate(any(ProductDevelopmentFactorsStepThreeValidationRequest.class), any(JwtUser.class))).thenReturn(validation); + + ResultEntity result = controller + .validateProductDevelopmentFactorsStepThree(new ProductDevelopmentFactorsStepThreeValidationRequest(), authenticatedStudentRequest()); + + assertEquals(HttpStatus.OK, result.getStatusCode()); + assertEquals(validation, result.getBody().getData()); + verify(service).validate(any(ProductDevelopmentFactorsStepThreeValidationRequest.class), any(JwtUser.class)); + } + private HttpServletRequest authenticatedStudentRequest() { JwtUser user = new JwtUser(); user.setUserId("stu-1"); From 0cbe4ae00c5df0cd0b5b0b029b599254b07306fc Mon Sep 17 00:00:00 2001 From: chenyuan Date: Fri, 7 Aug 2026 15:21:46 +0800 Subject: [PATCH 3/3] feat: validate product factors step four --- .../stu/StudentTrainingAnswerController.java | 13 ++++++++++++ ...pmentFactorsStepFourValidationRequest.java | 6 ++++++ ...opmentFactorsStepFourValidationResult.java | 2 ++ ...ductDevelopmentFactorsStepFourService.java | 5 +++++ ...DevelopmentFactorsStepFourServiceImpl.java | 19 +++++++++++++++++ ...lopmentFactorsStepFourServiceImplTest.java | 21 +++++++++++++++++++ 6 files changed, 66 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationRequest.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationResult.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepFourService.java create mode 100644 src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImpl.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImplTest.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 154f63c..cbf8e22 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/stu/StudentTrainingAnswerController.java @@ -18,6 +18,8 @@ import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValida import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepThreeValidationRequest; 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.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepTwoService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepThreeService; @@ -25,6 +27,7 @@ import com.sztzjy.linkCommerce.service.NewProductSurveyStepFourService; 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.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; @@ -61,6 +64,8 @@ public class StudentTrainingAnswerController { @Autowired private ProductDevelopmentFactorsStepThreeService productDevelopmentFactorsStepThreeService; + @Autowired + private ProductDevelopmentFactorsStepFourService productDevelopmentFactorsStepFourService; @GetMapping("/{taskKey}") @ApiOperation("查询当前学生指定实训任务答案") @@ -170,6 +175,14 @@ public class StudentTrainingAnswerController { } } + @PostMapping("/product-development-factors/step-4/validate") + @ApiOperation("产品开发关键因素第四步校验") + public ResultEntity validateProductDevelopmentFactorsStepFour( + @RequestBody ProductDevelopmentFactorsStepFourValidationRequest answer, HttpServletRequest request) { + try { return new ResultEntity<>(HttpStatus.OK, "校验通过", productDevelopmentFactorsStepFourService.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/ProductDevelopmentFactorsStepFourValidationRequest.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationRequest.java new file mode 100644 index 0000000..d21ff49 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationRequest.java @@ -0,0 +1,6 @@ +package com.sztzjy.linkCommerce.entity.dto; +public class ProductDevelopmentFactorsStepFourValidationRequest { + private String successFactors, failedFactors; + public String getSuccessFactors() { return successFactors; } public void setSuccessFactors(String value) { successFactors = value; } + public String getFailedFactors() { return failedFactors; } public void setFailedFactors(String value) { failedFactors = value; } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationResult.java b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationResult.java new file mode 100644 index 0000000..1c67e17 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/entity/dto/ProductDevelopmentFactorsStepFourValidationResult.java @@ -0,0 +1,2 @@ +package com.sztzjy.linkCommerce.entity.dto; +public class ProductDevelopmentFactorsStepFourValidationResult { private boolean valid; private String message; public boolean isValid() { return valid; } public void setValid(boolean value) { valid = value; } public String getMessage() { return message; } public void setMessage(String value) { message = value; } } diff --git a/src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepFourService.java b/src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepFourService.java new file mode 100644 index 0000000..70ccb28 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/ProductDevelopmentFactorsStepFourService.java @@ -0,0 +1,5 @@ +package com.sztzjy.linkCommerce.service; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepFourValidationResult; +public interface ProductDevelopmentFactorsStepFourService { ProductDevelopmentFactorsStepFourValidationResult validate(ProductDevelopmentFactorsStepFourValidationRequest request, JwtUser user); } diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImpl.java new file mode 100644 index 0000000..09d1335 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImpl.java @@ -0,0 +1,19 @@ +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.ProductDevelopmentFactorsStepFourValidationRequest; +import com.sztzjy.linkCommerce.entity.dto.ProductDevelopmentFactorsStepFourValidationResult; +import com.sztzjy.linkCommerce.service.ProductDevelopmentFactorsStepFourService; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +@Service public class ProductDevelopmentFactorsStepFourServiceImpl implements ProductDevelopmentFactorsStepFourService { + public ProductDevelopmentFactorsStepFourValidationResult validate(ProductDevelopmentFactorsStepFourValidationRequest 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.isNotBlank(request.getSuccessFactors())) throw bad("请填写产品成功的关键因素"); + if (!StringUtils.isNotBlank(request.getFailedFactors())) throw bad("请填写产品失败的关键因素"); + ProductDevelopmentFactorsStepFourValidationResult result = new ProductDevelopmentFactorsStepFourValidationResult(); result.setValid(true); result.setMessage("校验通过"); return result; + } + private ServiceException bad(String message) { return new ServiceException(HttpStatus.BAD_REQUEST, message); } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImplTest.java new file mode 100644 index 0000000..d65c1cc --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/ProductDevelopmentFactorsStepFourServiceImplTest.java @@ -0,0 +1,21 @@ +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.ProductDevelopmentFactorsStepFourValidationRequest; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +class ProductDevelopmentFactorsStepFourServiceImplTest { + @Test void acceptsCompleteStudentSummary() { assertTrue(new ProductDevelopmentFactorsStepFourServiceImpl().validate(valid(), student()).isValid()); } + @Test void rejectsBlankSummaryOrNonStudent() { + ProductDevelopmentFactorsStepFourValidationRequest blank = valid(); blank.setFailedFactors(" "); + assertThrows(ServiceException.class, () -> new ProductDevelopmentFactorsStepFourServiceImpl().validate(blank, student())); + assertThrows(ServiceException.class, () -> new ProductDevelopmentFactorsStepFourServiceImpl().validate(valid(), teacher())); + } + private ProductDevelopmentFactorsStepFourValidationRequest valid() { ProductDevelopmentFactorsStepFourValidationRequest value = new ProductDevelopmentFactorsStepFourValidationRequest(); value.setSuccessFactors("成功关键因素"); value.setFailedFactors("失败关键因素"); return value; } + 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("tea-1"); user.setRoleId(2); return user; } +}