diff --git a/jsowell-admin/src/test/java/com/jsowell/pile/service/OrderInvoiceRecordTodoTest.java b/jsowell-admin/src/test/java/com/jsowell/pile/service/OrderInvoiceRecordTodoTest.java index c7c59385e..e2412b211 100644 --- a/jsowell-admin/src/test/java/com/jsowell/pile/service/OrderInvoiceRecordTodoTest.java +++ b/jsowell-admin/src/test/java/com/jsowell/pile/service/OrderInvoiceRecordTodoTest.java @@ -26,7 +26,7 @@ import static org.mockito.Mockito.when; class OrderInvoiceRecordTodoTest { @Test - void insert_shouldCreateTodoForEachMerchantUser() { + void insert_shouldCreateTodoForEachMerchantAdmin() { OrderInvoiceRecordMapper mapper = mock(OrderInvoiceRecordMapper.class); PileMerchantInfoService merchantService = mock(PileMerchantInfoService.class); TodoTaskAssigneeService assigneeService = mock(TodoTaskAssigneeService.class); @@ -44,7 +44,7 @@ class OrderInvoiceRecordTodoTest { PileMerchantInfo merchantInfo = new PileMerchantInfo(); merchantInfo.setDeptId("200"); when(merchantService.selectPileMerchantInfoById(100L)).thenReturn(merchantInfo); - when(assigneeService.findActiveUserIdsByDeptTree(200L)).thenReturn(Arrays.asList(8L, 9L)); + when(assigneeService.findActiveOperatorAdminUserIdsByDeptTree(200L)).thenReturn(Arrays.asList(8L, 9L)); when(todoTaskService.createTask(any(TodoTaskCreateCommand.class))).thenReturn(new SysTodoTask()); service.insertOrderInvoiceRecord(invoiceRecord); @@ -56,6 +56,8 @@ class OrderInvoiceRecordTodoTest { commands.get(0).getAssigneeUserId(), commands.get(1).getAssigneeUserId())); assertEquals("ORDER_INVOICE_RECORD", commands.get(0).getBusinessType()); assertEquals("55", commands.get(0).getBusinessId()); + assertEquals("充电订单开票申请", commands.get(0).getTitle()); + assertEquals("有新的充电订单开票申请需要处理,申请单号:55", commands.get(0).getSummary()); assertEquals("invoiceDetail", commands.get(0).getRouteName()); assertEquals(TodoTaskConstants.PRIORITY_IMPORTANT, commands.get(0).getPriority()); assertEquals("INVOICE_REVIEW:ORDER_INVOICE_RECORD:55:8", commands.get(0).getIdempotentKey()); diff --git a/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskAssigneeServiceImplTest.java b/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskAssigneeServiceImplTest.java new file mode 100644 index 000000000..6b7438b3a --- /dev/null +++ b/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskAssigneeServiceImplTest.java @@ -0,0 +1,52 @@ +package com.jsowell.system.service; + +import com.jsowell.system.mapper.SysUserMapper; +import com.jsowell.system.service.impl.TodoTaskAssigneeServiceImpl; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class TodoTaskAssigneeServiceImplTest { + @Test + void findOperatorAdmins_shouldUseConfiguredRole() { + SysUserMapper mapper = mock(SysUserMapper.class); + TodoTaskAssigneeServiceImpl service = new TodoTaskAssigneeServiceImpl(); + setField(service, "userMapper", mapper); + setField(service, "operatorAdminRoleId", 7L); + when(mapper.selectActiveUserIdsByDeptTreeAndRole(200L, 7L)) + .thenReturn(Collections.singletonList(8L)); + + assertEquals(Collections.singletonList(8L), + service.findActiveOperatorAdminUserIdsByDeptTree(200L)); + verify(mapper).selectActiveUserIdsByDeptTreeAndRole(200L, 7L); + } + + @Test + void findOperatorAdmins_shouldFallbackToExistingMerchantAdminRole() { + SysUserMapper mapper = mock(SysUserMapper.class); + TodoTaskAssigneeServiceImpl service = new TodoTaskAssigneeServiceImpl(); + setField(service, "userMapper", mapper); + when(mapper.selectActiveUserIdsByDeptTreeAndRole(200L, 3L)) + .thenReturn(Collections.singletonList(8L)); + + service.findActiveOperatorAdminUserIdsByDeptTree(200L); + + verify(mapper).selectActiveUserIdsByDeptTreeAndRole(200L, 3L); + } + + private static void setField(Object target, String fieldName, Object value) { + try { + Field field = target.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(target, value); + } catch (Exception exception) { + throw new RuntimeException(exception); + } + } +} diff --git a/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskServiceImplTest.java b/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskServiceImplTest.java index a8b2dea89..8e105de24 100644 --- a/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskServiceImplTest.java +++ b/jsowell-admin/src/test/java/com/jsowell/system/service/TodoTaskServiceImplTest.java @@ -121,7 +121,7 @@ class TodoTaskServiceImplTest { private static TodoTaskCreateCommand createCommand() { return TodoTaskCreateCommand.builder() .taskType("INVOICE_REVIEW") - .title("司机开票申请") + .title("充电订单开票申请") .businessType("INVOICE_APPLY") .businessId("100") .routeName("InvoiceApplyDetail") diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java index 63be22e8b..c30c45d8c 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderInvoiceRecordServiceImpl.java @@ -251,9 +251,9 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService return; } - List assigneeUserIds = todoTaskAssigneeService.findActiveUserIdsByDeptTree(merchantDeptId); + List assigneeUserIds = todoTaskAssigneeService.findActiveOperatorAdminUserIdsByDeptTree(merchantDeptId); if (CollectionUtils.isEmpty(assigneeUserIds)) { - log.warn("开票申请运营商部门下没有正常用户,无法创建待办,invoiceId={}, deptId={}", + log.warn("开票申请运营商部门下没有正常管理员,无法创建待办,invoiceId={}, deptId={}", invoiceRecord.getId(), merchantInfo.getDeptId()); return; } @@ -263,8 +263,8 @@ public class OrderInvoiceRecordServiceImpl implements OrderInvoiceRecordService + invoiceRecord.getId() + ":" + assigneeUserId; todoTaskService.createTask(TodoTaskCreateCommand.builder() .taskType(TODO_TASK_TYPE) - .title("司机开票申请") - .summary("有新的司机开票申请需要处理,申请单号:" + invoiceRecord.getId()) + .title("充电订单开票申请") + .summary("有新的充电订单开票申请需要处理,申请单号:" + invoiceRecord.getId()) .businessType(TODO_BUSINESS_TYPE) .businessId(String.valueOf(invoiceRecord.getId())) .routeName(TODO_ROUTE_NAME) diff --git a/jsowell-system/src/main/java/com/jsowell/system/constant/TodoTaskConstants.java b/jsowell-system/src/main/java/com/jsowell/system/constant/TodoTaskConstants.java index e748ec4c2..9dd0bb538 100644 --- a/jsowell-system/src/main/java/com/jsowell/system/constant/TodoTaskConstants.java +++ b/jsowell-system/src/main/java/com/jsowell/system/constant/TodoTaskConstants.java @@ -25,6 +25,8 @@ public final class TodoTaskConstants { public static final int DEFAULT_HOME_LIMIT = 3; public static final int MAX_HOME_LIMIT = 10; + /** 现有运营商创建流程使用的运营商管理员角色 ID,正式环境可通过配置覆盖。 */ + public static final long DEFAULT_OPERATOR_ADMIN_ROLE_ID = 3L; public static boolean isActiveStatus(String status) { return STATUS_PENDING.equals(status) || STATUS_PROCESSING.equals(status); diff --git a/jsowell-system/src/main/java/com/jsowell/system/mapper/SysUserMapper.java b/jsowell-system/src/main/java/com/jsowell/system/mapper/SysUserMapper.java index 89b2fb07d..66ab510ee 100644 --- a/jsowell-system/src/main/java/com/jsowell/system/mapper/SysUserMapper.java +++ b/jsowell-system/src/main/java/com/jsowell/system/mapper/SysUserMapper.java @@ -27,6 +27,16 @@ public interface SysUserMapper { */ List selectActiveUserIdsByDeptTree(@Param("deptId") Long deptId); + /** + * 查询部门及下级部门中拥有指定角色的正常用户 ID。 + * + * @param deptId 部门 ID + * @param roleId 角色 ID + * @return 用户 ID 集合 + */ + List selectActiveUserIdsByDeptTreeAndRole(@Param("deptId") Long deptId, + @Param("roleId") Long roleId); + /** * 根据条件分页查询已配用户角色列表 * diff --git a/jsowell-system/src/main/java/com/jsowell/system/service/TodoTaskAssigneeService.java b/jsowell-system/src/main/java/com/jsowell/system/service/TodoTaskAssigneeService.java index ef8b85607..41d69c37b 100644 --- a/jsowell-system/src/main/java/com/jsowell/system/service/TodoTaskAssigneeService.java +++ b/jsowell-system/src/main/java/com/jsowell/system/service/TodoTaskAssigneeService.java @@ -9,4 +9,6 @@ import java.util.List; */ public interface TodoTaskAssigneeService { List findActiveUserIdsByDeptTree(Long deptId); + + List findActiveOperatorAdminUserIdsByDeptTree(Long deptId); } diff --git a/jsowell-system/src/main/java/com/jsowell/system/service/impl/TodoTaskAssigneeServiceImpl.java b/jsowell-system/src/main/java/com/jsowell/system/service/impl/TodoTaskAssigneeServiceImpl.java index e7dfe6332..69abb15af 100644 --- a/jsowell-system/src/main/java/com/jsowell/system/service/impl/TodoTaskAssigneeServiceImpl.java +++ b/jsowell-system/src/main/java/com/jsowell/system/service/impl/TodoTaskAssigneeServiceImpl.java @@ -1,9 +1,11 @@ package com.jsowell.system.service.impl; import com.jsowell.common.exception.ServiceException; +import com.jsowell.system.constant.TodoTaskConstants; import com.jsowell.system.mapper.SysUserMapper; import com.jsowell.system.service.TodoTaskAssigneeService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.util.List; @@ -15,6 +17,9 @@ import java.util.List; */ @Service public class TodoTaskAssigneeServiceImpl implements TodoTaskAssigneeService { + @Value("${todo.operator-admin-role-id:3}") + private Long operatorAdminRoleId; + @Autowired private SysUserMapper userMapper; @@ -25,4 +30,14 @@ public class TodoTaskAssigneeServiceImpl implements TodoTaskAssigneeService { } return userMapper.selectActiveUserIdsByDeptTree(deptId); } + + @Override + public List findActiveOperatorAdminUserIdsByDeptTree(Long deptId) { + if (deptId == null || deptId <= 0) { + throw new ServiceException("待办接收部门不能为空"); + } + Long roleId = operatorAdminRoleId == null || operatorAdminRoleId <= 0 + ? TodoTaskConstants.DEFAULT_OPERATOR_ADMIN_ROLE_ID : operatorAdminRoleId; + return userMapper.selectActiveUserIdsByDeptTreeAndRole(deptId, roleId); + } } diff --git a/jsowell-system/src/main/resources/mapper/system/SysUserMapper.xml b/jsowell-system/src/main/resources/mapper/system/SysUserMapper.xml index 85c2a3105..6934ef764 100644 --- a/jsowell-system/src/main/resources/mapper/system/SysUserMapper.xml +++ b/jsowell-system/src/main/resources/mapper/system/SysUserMapper.xml @@ -107,6 +107,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) order by u.user_id + +