feat: validate consumer scenario journey ordering

main
chenyuan 3 weeks ago
parent 4f4798c42d
commit a936b92da5

@ -37,6 +37,8 @@ import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepThreeValidationRes
import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorStepFourValidationResult;
import com.sztzjy.linkCommerce.entity.dto.ConsumerBehaviorWordPreviewResult;
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
import com.sztzjy.linkCommerce.service.NewProductSurveyStepOneService;
import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepOneService;
import com.sztzjy.linkCommerce.service.MarketOpportunitySelectionStepTwoService;
@ -53,6 +55,7 @@ import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepOneService;
import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepTwoService;
import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepThreeService;
import com.sztzjy.linkCommerce.service.ConsumerBehaviorStepFourService;
import com.sztzjy.linkCommerce.service.ConsumerScenarioStepOneService;
import com.sztzjy.linkCommerce.service.StudentTrainingAnswerService;
import com.sztzjy.linkCommerce.util.ResultEntity;
import io.swagger.annotations.Api;
@ -117,6 +120,9 @@ public class StudentTrainingAnswerController {
@Autowired
private ConsumerBehaviorStepFourService consumerBehaviorStepFourService;
@Autowired
private ConsumerScenarioStepOneService consumerScenarioStepOneService;
@GetMapping("/{taskKey}")
@ApiOperation("查询当前学生指定实训任务答案")
public ResultEntity<StudentTrainingAnswer> detail(@PathVariable String taskKey,
@ -321,6 +327,17 @@ public class StudentTrainingAnswerController {
}
}
@PostMapping("/consumer-scenario/step-1/validate")
@ApiOperation("消费场景解构第一步校验")
public ResultEntity<ConsumerScenarioStepOneValidationResult> validateConsumerScenarioStepOne(
@RequestBody ConsumerScenarioStepOneValidationRequest answer, HttpServletRequest request) {
try {
return new ResultEntity<>(HttpStatus.OK, "校验完成", consumerScenarioStepOneService.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<ConsumerBehaviorWordPreviewResult> previewConsumerBehaviorStepThreeWord(

@ -0,0 +1,15 @@
package com.sztzjy.linkCommerce.entity.dto;
import java.util.List;
public class ConsumerScenarioStepOneValidationRequest {
private List<String> stageOrder;
public List<String> getStageOrder() {
return stageOrder;
}
public void setStageOrder(List<String> stageOrder) {
this.stageOrder = stageOrder;
}
}

@ -0,0 +1,22 @@
package com.sztzjy.linkCommerce.entity.dto;
public class ConsumerScenarioStepOneValidationResult {
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.ConsumerScenarioStepOneValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
public interface ConsumerScenarioStepOneService {
ConsumerScenarioStepOneValidationResult validate(ConsumerScenarioStepOneValidationRequest request, JwtUser user);
}

@ -0,0 +1,54 @@
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.ConsumerScenarioStepOneValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
import com.sztzjy.linkCommerce.service.ConsumerScenarioStepOneService;
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 ConsumerScenarioStepOneServiceImpl implements ConsumerScenarioStepOneService {
private static final List<String> STANDARD_ORDER = Arrays.asList(
"problem-awareness",
"information-search",
"evaluation-decision",
"purchase-conversion",
"post-purchase"
);
@Override
public ConsumerScenarioStepOneValidationResult validate(ConsumerScenarioStepOneValidationRequest request, JwtUser user) {
requireStudent(user);
List<String> stageOrder = request == null ? null : request.getStageOrder();
if (stageOrder == null || stageOrder.size() != STANDARD_ORDER.size()
|| stageOrder.stream().distinct().count() != STANDARD_ORDER.size()
|| !stageOrder.containsAll(STANDARD_ORDER)) {
throw badRequest("提交的购买旅程阶段不完整,请重新排序");
}
boolean valid = STANDARD_ORDER.equals(stageOrder);
ConsumerScenarioStepOneValidationResult result = new ConsumerScenarioStepOneValidationResult();
result.setValid(valid);
result.setMessage(valid ? "排序正确,可以进入下一步。" : "排序还不正确,请根据消费者购买旅程再次调整。");
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,58 @@
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.ConsumerScenarioStepOneValidationRequest;
import com.sztzjy.linkCommerce.entity.dto.ConsumerScenarioStepOneValidationResult;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ConsumerScenarioStepOneServiceImplTest {
@Test
void acceptsTheStandardJourneyOrder() {
ConsumerScenarioStepOneValidationResult result = new ConsumerScenarioStepOneServiceImpl().validate(request(
"problem-awareness", "information-search", "evaluation-decision", "purchase-conversion", "post-purchase"), student());
assertTrue(result.isValid());
}
@Test
void returnsAnIncorrectResultForAnUnorderedJourney() {
ConsumerScenarioStepOneValidationResult result = new ConsumerScenarioStepOneServiceImpl().validate(request(
"information-search", "problem-awareness", "evaluation-decision", "purchase-conversion", "post-purchase"), student());
assertFalse(result.isValid());
}
@Test
void rejectsIncompleteJourneyData() {
assertThrows(ServiceException.class, () -> new ConsumerScenarioStepOneServiceImpl().validate(request(
"problem-awareness", "information-search"), student()));
}
@Test
void rejectsNonStudent() {
JwtUser teacher = new JwtUser();
teacher.setRoleId(2);
assertThrows(ServiceException.class, () -> new ConsumerScenarioStepOneServiceImpl().validate(request(
"problem-awareness", "information-search", "evaluation-decision", "purchase-conversion", "post-purchase"), teacher));
}
private ConsumerScenarioStepOneValidationRequest request(String... stageOrder) {
ConsumerScenarioStepOneValidationRequest request = new ConsumerScenarioStepOneValidationRequest();
request.setStageOrder(Arrays.asList(stageOrder));
return request;
}
private JwtUser student() {
JwtUser user = new JwtUser();
user.setUserId("stu-1");
user.setRoleId(4);
return user;
}
}
Loading…
Cancel
Save