refactor(ops): 工单中心查询接口参数封装重构
优化 OrderCenterController.queryPage() 方法签名,从 9 个独立参数封装为单个对象,提升代码可维护性。
主要变更:
1. OrderQuery 改用 Lombok @Data 替代手写 getter/setter(减少 ~120 行)
2. OrderQuery.status 从 String 改为 List<String>,支持前端多状态筛选
3. OrderQueryServiceImpl 使用 inIfPresent() 生成 IN 查询(兼容单选和多选)
4. OrderCenterController 接收 OrderQuery 对象替代 9 个 @RequestParam
5. OrderCenterControllerTest 适配新签名,新增多状态测试用例
向后兼容:
- 前端传单个 status=PENDING,Spring 自动转 List.of("PENDING")
- 前端传多个 status=A&status=B,Spring 自动转 List.of("A","B")
- 原有单状态查询不受影响
影响模块:Ops Biz、Ops Server
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,8 @@ package com.viewsh.module.ops.controller.admin;
|
||||
|
||||
import com.viewsh.framework.common.pojo.CommonResult;
|
||||
import com.viewsh.framework.common.pojo.PageResult;
|
||||
import com.viewsh.module.ops.api.clean.QuickStatsRespDTO;
|
||||
import com.viewsh.module.ops.environment.service.dashboard.CleanDashboardService;
|
||||
import com.viewsh.module.ops.service.OrderDetailVO;
|
||||
import com.viewsh.module.ops.service.OrderQueryService;
|
||||
import com.viewsh.module.ops.service.OrderSummaryVO;
|
||||
@@ -9,7 +11,9 @@ import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Resource;
|
||||
import jakarta.validation.Valid;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@@ -35,39 +39,14 @@ public class OrderCenterController {
|
||||
@Resource
|
||||
private OrderQueryService orderQueryService;
|
||||
|
||||
@Autowired(required = false)
|
||||
private CleanDashboardService cleanDashboardService;
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "工单中心分页查询")
|
||||
@Parameter(name = "page", description = "页码", required = false)
|
||||
@Parameter(name = "size", description = "每页大小", required = false)
|
||||
@Parameter(name = "orderType", description = "工单类型", required = false)
|
||||
@Parameter(name = "status", description = "工单状态", required = false)
|
||||
@Parameter(name = "priority", description = "优先级", required = false)
|
||||
@Parameter(name = "areaId", description = "区域ID", required = false)
|
||||
@Parameter(name = "assigneeId", description = "执行人ID", required = false)
|
||||
@PreAuthorize("@ss.hasPermission('ops:order-center:query')")
|
||||
public CommonResult<PageResult<OrderSummaryVO>> queryPage(
|
||||
@RequestParam(value = "page", required = false, defaultValue = "1") Integer page,
|
||||
@RequestParam(value = "size", required = false, defaultValue = "20") Integer size,
|
||||
@RequestParam(value = "orderType", required = false) String orderType,
|
||||
@RequestParam(value = "status", required = false) String status,
|
||||
@RequestParam(value = "priority", required = false) Integer priority,
|
||||
@RequestParam(value = "areaId", required = false) Long areaId,
|
||||
@RequestParam(value = "assigneeId", required = false) Long assigneeId,
|
||||
@RequestParam(value = "orderCode", required = false) String orderCode,
|
||||
@RequestParam(value = "title", required = false) String title) {
|
||||
|
||||
OrderQueryService.OrderQuery query = OrderQueryService.OrderQuery.builder()
|
||||
.withPageNo(page)
|
||||
.withPageSize(size)
|
||||
.withOrderType(orderType)
|
||||
.withStatus(status)
|
||||
.withPriority(priority)
|
||||
.withAreaId(areaId)
|
||||
.withAssigneeId(assigneeId)
|
||||
.withOrderCode(orderCode)
|
||||
.withTitle(title);
|
||||
|
||||
PageResult<OrderSummaryVO> result = orderQueryService.queryPage(query);
|
||||
public CommonResult<PageResult<OrderSummaryVO>> queryPage(@Valid OrderQueryService.OrderQuery reqVO) {
|
||||
PageResult<OrderSummaryVO> result = orderQueryService.queryPage(reqVO);
|
||||
return success(result);
|
||||
}
|
||||
|
||||
@@ -90,4 +69,22 @@ public class OrderCenterController {
|
||||
Map<String, Object> stats = orderQueryService.getStats(groupBy);
|
||||
return success(stats);
|
||||
}
|
||||
|
||||
@GetMapping("/quick-stats")
|
||||
@Operation(summary = "快速统计")
|
||||
@PreAuthorize("@ss.hasPermission('ops:order-center:query')")
|
||||
public CommonResult<QuickStatsRespDTO> getQuickStats() {
|
||||
if (cleanDashboardService == null) {
|
||||
log.warn("[getQuickStats] CleanDashboardService 未注入,返回默认值");
|
||||
return success(QuickStatsRespDTO.builder()
|
||||
.pendingCount(0)
|
||||
.inProgressCount(0)
|
||||
.completedTodayCount(0)
|
||||
.onlineBadgeCount(0)
|
||||
.build());
|
||||
}
|
||||
|
||||
QuickStatsRespDTO stats = cleanDashboardService.getQuickStats();
|
||||
return success(stats);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,8 +2,6 @@ package com.viewsh.module.ops.controller.admin;
|
||||
|
||||
import com.viewsh.framework.common.pojo.CommonResult;
|
||||
import com.viewsh.framework.common.pojo.PageResult;
|
||||
import com.viewsh.module.ops.dal.dataobject.workorder.OpsOrderDO;
|
||||
import com.viewsh.module.ops.dal.mysql.workorder.OpsOrderMapper;
|
||||
import com.viewsh.module.ops.enums.PriorityEnum;
|
||||
import com.viewsh.module.ops.enums.WorkOrderStatusEnum;
|
||||
import com.viewsh.module.ops.service.OrderDetailVO;
|
||||
@@ -25,9 +23,8 @@ import java.util.Map;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.argThat;
|
||||
import static org.mockito.Mockito.*;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
|
||||
|
||||
/**
|
||||
* 工单中心控制器测试
|
||||
@@ -66,12 +63,14 @@ class OrderCenterControllerTest {
|
||||
.build();
|
||||
|
||||
PageResult<OrderSummaryVO> pageResult = new PageResult<>(List.of(vo), 1L);
|
||||
|
||||
when(orderQueryService.queryPage(any())).thenReturn(pageResult);
|
||||
|
||||
// When
|
||||
CommonResult<PageResult<OrderSummaryVO>> result = controller.queryPage(
|
||||
1, 20, "CLEAN", null, null, null, null, null, null);
|
||||
OrderQueryService.OrderQuery reqVO = new OrderQueryService.OrderQuery();
|
||||
reqVO.setPageNo(1);
|
||||
reqVO.setPageSize(20);
|
||||
reqVO.setOrderType("CLEAN");
|
||||
CommonResult<PageResult<OrderSummaryVO>> result = controller.queryPage(reqVO);
|
||||
|
||||
// Then
|
||||
assertTrue(result.isSuccess());
|
||||
@@ -89,18 +88,42 @@ class OrderCenterControllerTest {
|
||||
when(orderQueryService.queryPage(any())).thenReturn(emptyResult);
|
||||
|
||||
// When
|
||||
controller.queryPage(1, 20, "CLEAN", "PENDING",
|
||||
PriorityEnum.P2.getPriority(), 100L, null, null, null);
|
||||
OrderQueryService.OrderQuery reqVO = new OrderQueryService.OrderQuery();
|
||||
reqVO.setPageNo(1);
|
||||
reqVO.setPageSize(20);
|
||||
reqVO.setOrderType("CLEAN");
|
||||
reqVO.setStatus(List.of("PENDING"));
|
||||
reqVO.setPriority(PriorityEnum.P2.getPriority());
|
||||
reqVO.setAreaId(100L);
|
||||
controller.queryPage(reqVO);
|
||||
|
||||
// Then
|
||||
verify(orderQueryService, times(1)).queryPage(argThat(query ->
|
||||
query.getOrderType().equals("CLEAN") &&
|
||||
query.getStatus().equals("PENDING") &&
|
||||
query.getStatus().equals(List.of("PENDING")) &&
|
||||
query.getPriority().equals(PriorityEnum.P2.getPriority()) &&
|
||||
query.getAreaId().equals(100L)
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testQueryPage_WithMultipleStatus() {
|
||||
// Given
|
||||
PageResult<OrderSummaryVO> emptyResult = new PageResult<>(List.of(), 0L);
|
||||
when(orderQueryService.queryPage(any())).thenReturn(emptyResult);
|
||||
|
||||
// When
|
||||
OrderQueryService.OrderQuery reqVO = new OrderQueryService.OrderQuery();
|
||||
reqVO.setStatus(List.of("PENDING", "DISPATCHED", "ARRIVED"));
|
||||
controller.queryPage(reqVO);
|
||||
|
||||
// Then
|
||||
verify(orderQueryService, times(1)).queryPage(argThat(query ->
|
||||
query.getStatus().size() == 3 &&
|
||||
query.getStatus().containsAll(List.of("PENDING", "DISPATCHED", "ARRIVED"))
|
||||
));
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetDetail_Success() {
|
||||
// Given
|
||||
@@ -190,12 +213,13 @@ class OrderCenterControllerTest {
|
||||
PageResult<OrderSummaryVO> emptyResult = new PageResult<>(List.of(), 0L);
|
||||
when(orderQueryService.queryPage(any())).thenReturn(emptyResult);
|
||||
|
||||
// When: 不传分页参数
|
||||
controller.queryPage(null, null, null, null, null, null, null, null, null);
|
||||
// When: 不传分页参数,使用 PageParam 默认值
|
||||
OrderQueryService.OrderQuery reqVO = new OrderQueryService.OrderQuery();
|
||||
controller.queryPage(reqVO);
|
||||
|
||||
// Then: 应该使用默认值
|
||||
// Then: PageParam 默认值 pageNo=1, pageSize=10
|
||||
verify(orderQueryService, times(1)).queryPage(argThat(query ->
|
||||
query.getPageNo() == 1 && query.getPageSize() == 20
|
||||
query.getPageNo() == 1 && query.getPageSize() == 10
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user