feat: validate product positioning mrd

main
chenyuan 3 weeks ago
parent 5b7602bca3
commit f51133090f

@ -43,6 +43,8 @@ import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepTwoValidati
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepTwoValidationResult; import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepTwoValidationResult;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepThreeValidationRequest; import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepThreeValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepThreeValidationResult; import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepThreeValidationResult;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepFourValidationResult;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService; import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService;
import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService;
import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService; import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService;
@ -62,6 +64,7 @@ import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepFourService;
import com.sztzjy.linkCommerce.service.ProductValuePositioningStepOneService; import com.sztzjy.linkCommerce.service.ProductValuePositioningStepOneService;
import com.sztzjy.linkCommerce.service.ProductValuePositioningStepTwoService; import com.sztzjy.linkCommerce.service.ProductValuePositioningStepTwoService;
import com.sztzjy.linkCommerce.service.ProductValuePositioningStepThreeService; import com.sztzjy.linkCommerce.service.ProductValuePositioningStepThreeService;
import com.sztzjy.linkCommerce.service.ProductValuePositioningStepFourService;
import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService; import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService;
import com.sztzjy.linkCommerce.util.ResultEntity; import com.sztzjy.linkCommerce.util.ResultEntity;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
@ -135,6 +138,9 @@ public class StudentTrainingAnswerController {
@Autowired @Autowired
private ProductValuePositioningStepThreeService productValuePositioningStepThreeService; private ProductValuePositioningStepThreeService productValuePositioningStepThreeService;
@Autowired
private ProductValuePositioningStepFourService productValuePositioningStepFourService;
@GetMapping("/{taskKey}") @GetMapping("/{taskKey}")
@ApiOperation("查询当前学生指定实训任务答案") @ApiOperation("查询当前学生指定实训任务答案")
public ResultEntity<StudentTrainingAnswer> detail(@PathVariable String taskKey, public ResultEntity<StudentTrainingAnswer> detail(@PathVariable String taskKey,
@ -372,6 +378,17 @@ public class StudentTrainingAnswerController {
} }
} }
@PostMapping("/product-value-positioning/step-4/validate")
@ApiOperation("产品价值主张及定位第四步校验")
public ResultEntity<ProductValuePositioningStepFourValidationResult> validateProductValuePositioningStepFour(
@RequestBody ProductValuePositioningStepFourValidationRequest answer, HttpServletRequest request) {
try {
return new ResultEntity<>(HttpStatus.OK, "校验完成", productValuePositioningStepFourService.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") @PostMapping(value = "/consumer-behavior/step-3/word-preview", consumes = "multipart/form-data")
@ApiOperation("消费者需求与行为第三步Word预览") @ApiOperation("消费者需求与行为第三步Word预览")
public ResultEntity<ConsumerBehaviorWordPreviewResult> previewConsumerBehaviorStepThreeWord( public ResultEntity<ConsumerBehaviorWordPreviewResult> previewConsumerBehaviorStepThreeWord(

@ -0,0 +1,41 @@
package com.sztzjy.linkCommerce.entity.dto;
import java.util.List;
public class ProductValuePositioningStepFourValidationRequest {
private List<MrdRow> marketInsights;
private List<MrdRow> marketOverview;
private List<MrdRow> userAnalysis;
private List<MrdRow> competitorAnalysis;
private List<MrdRow> productRequirements;
private String productPositioning;
public List<MrdRow> getMarketInsights() { return marketInsights; }
public void setMarketInsights(List<MrdRow> marketInsights) { this.marketInsights = marketInsights; }
public List<MrdRow> getMarketOverview() { return marketOverview; }
public void setMarketOverview(List<MrdRow> marketOverview) { this.marketOverview = marketOverview; }
public List<MrdRow> getUserAnalysis() { return userAnalysis; }
public void setUserAnalysis(List<MrdRow> userAnalysis) { this.userAnalysis = userAnalysis; }
public List<MrdRow> getCompetitorAnalysis() { return competitorAnalysis; }
public void setCompetitorAnalysis(List<MrdRow> competitorAnalysis) { this.competitorAnalysis = competitorAnalysis; }
public List<MrdRow> getProductRequirements() { return productRequirements; }
public void setProductRequirements(List<MrdRow> productRequirements) { this.productRequirements = productRequirements; }
public String getProductPositioning() { return productPositioning; }
public void setProductPositioning(String productPositioning) { this.productPositioning = productPositioning; }
public static class MrdRow {
private Integer id;
private String module;
private String title;
private String content;
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getModule() { return module; }
public void setModule(String module) { this.module = module; }
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; }
}
}

@ -0,0 +1,11 @@
package com.sztzjy.linkCommerce.entity.dto;
public class ProductValuePositioningStepFourValidationResult {
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; }
}

@ -0,0 +1,9 @@
package com.sztzjy.linkCommerce.service;
import com.sztzjy.linkCommerce.config.security.JwtUser;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepFourValidationResult;
public interface ProductValuePositioningStepFourService {
ProductValuePositioningStepFourValidationResult validate(ProductValuePositioningStepFourValidationRequest request, JwtUser user);
}

@ -0,0 +1,47 @@
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.ProductValuePositioningStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepFourValidationResult;
import com.sztzjy.linkCommerce.service.ProductValuePositioningStepFourService;
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 ProductValuePositioningStepFourServiceImpl implements ProductValuePositioningStepFourService {
private static final List<Integer> REQUIRED_COUNTS = Arrays.asList(3, 2, 3, 2, 5);
@Override
public ProductValuePositioningStepFourValidationResult validate(ProductValuePositioningStepFourValidationRequest request, JwtUser user) {
requireStudent(user);
if (request == null || StringUtils.isBlank(request.getProductPositioning())) throw badRequest("请完整填写 MRD 的五组分析内容和产品定位");
List<List<ProductValuePositioningStepFourValidationRequest.MrdRow>> sections = Arrays.asList(
request.getMarketInsights(), request.getMarketOverview(), request.getUserAnalysis(), request.getCompetitorAnalysis(), request.getProductRequirements());
for (int sectionIndex = 0; sectionIndex < sections.size(); sectionIndex++) {
List<ProductValuePositioningStepFourValidationRequest.MrdRow> rows = sections.get(sectionIndex);
if (rows == null || rows.size() != REQUIRED_COUNTS.get(sectionIndex)) throw badRequest("请按 MRD 固定结构完整填写内容");
for (int index = 0; index < rows.size(); index++) {
ProductValuePositioningStepFourValidationRequest.MrdRow row = rows.get(index);
if (row == null || row.getId() == null || row.getId() != index + 1 || StringUtils.isBlank(row.getTitle()) || StringUtils.isBlank(row.getContent())) {
throw badRequest("请按 MRD 固定结构完整填写内容");
}
}
}
ProductValuePositioningStepFourValidationResult result = new ProductValuePositioningStepFourValidationResult();
result.setValid(true);
result.setMessage("MRD 文档填写完整。");
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); }
}

@ -0,0 +1,61 @@
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.ProductValuePositioningStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ProductValuePositioningStepFourValidationResult;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ProductValuePositioningStepFourServiceImplTest {
private final ProductValuePositioningStepFourServiceImpl service = new ProductValuePositioningStepFourServiceImpl();
@Test
void acceptsCompleteMrd() {
ProductValuePositioningStepFourValidationResult result = service.validate(request(), student());
assertTrue(result.isValid());
}
@Test
void rejectsIncompleteMrdRow() {
ProductValuePositioningStepFourValidationRequest request = request();
request.getUserAnalysis().get(2).setContent(" ");
assertThrows(ServiceException.class, () -> service.validate(request, student()));
}
private ProductValuePositioningStepFourValidationRequest request() {
ProductValuePositioningStepFourValidationRequest request = new ProductValuePositioningStepFourValidationRequest();
request.setMarketInsights(rows(3));
request.setMarketOverview(rows(2));
request.setUserAnalysis(rows(3));
request.setCompetitorAnalysis(rows(2));
request.setProductRequirements(rows(5));
request.setProductPositioning("面向目标用户的差异化产品定位");
return request;
}
private List<ProductValuePositioningStepFourValidationRequest.MrdRow> rows(int count) {
List<ProductValuePositioningStepFourValidationRequest.MrdRow> rows = new ArrayList<>();
for (int index = 1; index <= count; index++) {
ProductValuePositioningStepFourValidationRequest.MrdRow row = new ProductValuePositioningStepFourValidationRequest.MrdRow();
row.setId(index);
row.setTitle("标题" + index);
row.setContent("内容" + index);
rows.add(row);
}
return rows;
}
private JwtUser student() {
JwtUser user = new JwtUser();
user.setUserId("student-id");
user.setRoleId(4);
return user;
}
}
Loading…
Cancel
Save