fix: localize hardware cost step three validation

bugfix/ai-assessment-evidence-rescore
陈沅 1 month ago
parent 8a738c3105
commit 046bc1fe96

@ -50,10 +50,10 @@ public class HardwareCostStepThreeServiceImpl implements HardwareCostStepThreeSe
List<HardwareCostStepThreeItem> source = request == null ? null : request.getItems(); List<HardwareCostStepThreeItem> source = request == null ? null : request.getItems();
if (source == null || source.size() < MIN_EXPENSE_ROWS || source.size() > MAX_EXPENSE_ROWS) { if (source == null || source.size() < MIN_EXPENSE_ROWS || source.size() > MAX_EXPENSE_ROWS) {
throw new ServiceException(HttpStatus.BAD_REQUEST, throw new ServiceException(HttpStatus.BAD_REQUEST,
"Please provide between " + MIN_EXPENSE_ROWS + " and " + MAX_EXPENSE_ROWS + " manufacturing cost items."); "请填写 " + MIN_EXPENSE_ROWS + " 至 " + MAX_EXPENSE_ROWS + " 项制造费用。");
} }
if (bomTotals == null) { if (bomTotals == null) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "Please save the Step 2 BOM calculation first."); throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存第 2 步物料 BOM 成本核算。");
} }
BigDecimal smallManufacturingCost = BigDecimal.ZERO; BigDecimal smallManufacturingCost = BigDecimal.ZERO;
@ -64,13 +64,13 @@ public class HardwareCostStepThreeServiceImpl implements HardwareCostStepThreeSe
String expenseName = row == null ? "" : StringUtils.trimToEmpty(row.getExpenseName()); String expenseName = row == null ? "" : StringUtils.trimToEmpty(row.getExpenseName());
if (StringUtils.isBlank(expenseName)) { if (StringUtils.isBlank(expenseName)) {
throw new ServiceException(HttpStatus.BAD_REQUEST, throw new ServiceException(HttpStatus.BAD_REQUEST,
"Please enter a manufacturing expense name at row " + (index + 1) + "."); "请填写第 " + (index + 1) + " 行的制造费用名称。");
} }
if (row.getSmallBatchUnitCost() == null || row.getLargeBatchUnitCost() == null if (row.getSmallBatchUnitCost() == null || row.getLargeBatchUnitCost() == null
|| row.getSmallBatchUnitCost().compareTo(BigDecimal.ZERO) < 0 || row.getSmallBatchUnitCost().compareTo(BigDecimal.ZERO) < 0
|| row.getLargeBatchUnitCost().compareTo(BigDecimal.ZERO) < 0) { || row.getLargeBatchUnitCost().compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST, throw new ServiceException(HttpStatus.BAD_REQUEST,
"Please enter non-negative costs for both batches at row " + (index + 1) + "."); "请填写第 " + (index + 1) + " 行两种批量的非负制造费用。");
} }
HardwareCostStepThreeItem item = new HardwareCostStepThreeItem(); HardwareCostStepThreeItem item = new HardwareCostStepThreeItem();
item.setExpenseName(expenseName); item.setExpenseName(expenseName);
@ -85,7 +85,7 @@ public class HardwareCostStepThreeServiceImpl implements HardwareCostStepThreeSe
largeManufacturingCost = scale(largeManufacturingCost); largeManufacturingCost = scale(largeManufacturingCost);
HardwareCostStepThreeValidationResult result = new HardwareCostStepThreeValidationResult(); HardwareCostStepThreeValidationResult result = new HardwareCostStepThreeValidationResult();
result.setValid(true); result.setValid(true);
result.setMessage("Manufacturing and unit total costs have been calculated."); result.setMessage("制造成本与单件总成本已核算完成。");
result.setItems(normalized); result.setItems(normalized);
result.setSmallBatchManufacturingCost(smallManufacturingCost); result.setSmallBatchManufacturingCost(smallManufacturingCost);
result.setLargeBatchManufacturingCost(largeManufacturingCost); result.setLargeBatchManufacturingCost(largeManufacturingCost);
@ -100,12 +100,12 @@ public class HardwareCostStepThreeServiceImpl implements HardwareCostStepThreeSe
TeachingClassStudent membership = teachingClassStudentMapper.selectActiveByStudentUserId(user.getUserId()); TeachingClassStudent membership = teachingClassStudentMapper.selectActiveByStudentUserId(user.getUserId());
TrainingTask task = trainingTaskMapper.selectByTaskKey(TASK_KEY); TrainingTask task = trainingTaskMapper.selectByTaskKey(TASK_KEY);
if (membership == null || task == null) { if (membership == null || task == null) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "Current training task context was not found."); throw new ServiceException(HttpStatus.BAD_REQUEST, "未找到当前实训任务信息。");
} }
StudentTrainingAnswer answer = studentTrainingAnswerMapper.selectByStudentClassAndTask( StudentTrainingAnswer answer = studentTrainingAnswerMapper.selectByStudentClassAndTask(
user.getUserId(), membership.getTeachingClassId(), task.getId()); user.getUserId(), membership.getTeachingClassId(), task.getId());
if (answer == null || StringUtils.isBlank(answer.getStep2Answer())) { if (answer == null || StringUtils.isBlank(answer.getStep2Answer())) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "Please save the Step 2 BOM calculation first."); throw new ServiceException(HttpStatus.BAD_REQUEST, "请先完成并保存第 2 步物料 BOM 成本核算。");
} }
try { try {
JsonNode saved = objectMapper.readTree(answer.getStep2Answer()); JsonNode saved = objectMapper.readTree(answer.getStep2Answer());
@ -113,23 +113,23 @@ public class HardwareCostStepThreeServiceImpl implements HardwareCostStepThreeSe
} catch (ServiceException e) { } catch (ServiceException e) {
throw e; throw e;
} catch (Exception e) { } catch (Exception e) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "The saved Step 2 BOM calculation cannot be read."); throw new ServiceException(HttpStatus.BAD_REQUEST, "已保存的第 2 步物料 BOM 成本核算无法读取。");
} }
} }
private BigDecimal readMoney(JsonNode source, String field) { private BigDecimal readMoney(JsonNode source, String field) {
JsonNode value = source.path(field); JsonNode value = source.path(field);
if (value.isMissingNode() || value.isNull() || StringUtils.isBlank(value.asText())) { if (value.isMissingNode() || value.isNull() || StringUtils.isBlank(value.asText())) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "The saved Step 2 BOM calculation is incomplete."); throw new ServiceException(HttpStatus.BAD_REQUEST, "已保存的第 2 步物料 BOM 成本核算不完整。");
} }
try { try {
BigDecimal amount = new BigDecimal(value.asText()); BigDecimal amount = new BigDecimal(value.asText());
if (amount.compareTo(BigDecimal.ZERO) < 0) { if (amount.compareTo(BigDecimal.ZERO) < 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "The saved Step 2 BOM calculation is invalid."); throw new ServiceException(HttpStatus.BAD_REQUEST, "已保存的第 2 步物料 BOM 成本核算无效。");
} }
return scale(amount); return scale(amount);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "The saved Step 2 BOM calculation is invalid."); throw new ServiceException(HttpStatus.BAD_REQUEST, "已保存的第 2 步物料 BOM 成本核算无效。");
} }
} }
@ -139,10 +139,10 @@ public class HardwareCostStepThreeServiceImpl implements HardwareCostStepThreeSe
private void requireStudent(JwtUser user) { private void requireStudent(JwtUser user) {
if (user == null || StringUtils.isBlank(user.getUserId())) { if (user == null || StringUtils.isBlank(user.getUserId())) {
throw new ServiceException(HttpStatus.UNAUTHORIZED, "Please log in first."); throw new ServiceException(HttpStatus.UNAUTHORIZED, "请先登录后再操作。");
} }
if (user.getRoleId() != 4) { if (user.getRoleId() != 4) {
throw new ServiceException(HttpStatus.FORBIDDEN, "Only students can validate training answers."); throw new ServiceException(HttpStatus.FORBIDDEN, "仅学生可以校验实训答案。");
} }
} }

@ -60,6 +60,21 @@ class HardwareCostStepThreeServiceImplTest {
new HardwareCostStepThreeServiceImpl.BomTotals(new BigDecimal("1"), new BigDecimal("1")))); new HardwareCostStepThreeServiceImpl.BomTotals(new BigDecimal("1"), new BigDecimal("1"))));
} }
@Test
void reportsChineseRowSpecificPromptWhenManufacturingExpenseNameIsBlank() {
ServiceException exception = assertThrows(ServiceException.class, () -> service.validateAgainstBomTotals(
request(
item("设备折旧费", "1", "1"),
item("生产运维费", "1", "1"),
item("人员薪酬", "1", "1"),
item("场地租赁费", "1", "1"),
item("包装费用", "1", "1"),
item("", "1", "1")),
new HardwareCostStepThreeServiceImpl.BomTotals(new BigDecimal("1"), new BigDecimal("1"))));
assertEquals("请填写第 6 行的制造费用名称。", exception.getMessage());
}
private HardwareCostStepThreeValidationRequest request(HardwareCostStepThreeItem... items) { private HardwareCostStepThreeValidationRequest request(HardwareCostStepThreeItem... items) {
HardwareCostStepThreeValidationRequest request = new HardwareCostStepThreeValidationRequest(); HardwareCostStepThreeValidationRequest request = new HardwareCostStepThreeValidationRequest();
request.setItems(Arrays.asList(items)); request.setItems(Arrays.asList(items));

Loading…
Cancel
Save