mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-08-13 17:53:45 +08:00
接入清分和订单异常待办
This commit is contained in:
@@ -93,6 +93,6 @@ public class OrderAbnormalRecordController extends BaseController {
|
||||
@Log(title = "订单异常记录", businessType = BusinessType.DELETE)
|
||||
@DeleteMapping("/{ids}")
|
||||
public AjaxResult remove(@PathVariable Integer[] ids) {
|
||||
return toAjax(orderAbnormalRecordService.deleteOrderAbnormalRecordByIds(ids));
|
||||
return toAjax(orderAbnormalRecordService.deleteOrderAbnormalRecordByIds(ids, getUsername()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -219,4 +219,4 @@ sms:
|
||||
todo:
|
||||
operator-admin-role-id: 3
|
||||
retention-days: 180
|
||||
route-whitelist: invoiceDetail,financeDetail,accountUserInfo
|
||||
route-whitelist: invoiceDetail,financeDetail,accountUserInfo,AbnormalRecord
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
package com.jsowell.pile.service;
|
||||
|
||||
import com.jsowell.pile.constant.AdapayClearingTodoConstants;
|
||||
import com.jsowell.pile.domain.AdapayUnsplitRecord;
|
||||
import com.jsowell.pile.domain.OrderBasicInfo;
|
||||
import com.jsowell.pile.domain.PileMerchantInfo;
|
||||
import com.jsowell.pile.service.impl.AdapayClearingTodoServiceImpl;
|
||||
import com.jsowell.system.domain.dto.TodoTaskCreateCommand;
|
||||
import com.jsowell.system.service.TodoTaskAssigneeService;
|
||||
import com.jsowell.system.service.TodoTaskService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
|
||||
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 AdapayClearingTodoServiceImplTest {
|
||||
@Test
|
||||
void failedAndRecovered_shouldCreateThenCompleteTodo() {
|
||||
Dependencies dependencies = new Dependencies();
|
||||
AdapayClearingTodoServiceImpl service = dependencies.createService();
|
||||
OrderBasicInfo orderInfo = OrderBasicInfo.builder().build();
|
||||
orderInfo.setMerchantId("100");
|
||||
when(dependencies.orderService.getOrderInfoByOrderCode("C100")).thenReturn(orderInfo);
|
||||
PileMerchantInfo merchantInfo = new PileMerchantInfo();
|
||||
merchantInfo.setDeptId("200");
|
||||
when(dependencies.merchantService.selectPileMerchantInfoById(100L)).thenReturn(merchantInfo);
|
||||
when(dependencies.assigneeService.findActiveOperatorAdminUserIdsByDeptTree(200L))
|
||||
.thenReturn(Collections.singletonList(8L));
|
||||
AdapayUnsplitRecord record = AdapayUnsplitRecord.builder()
|
||||
.paymentId("payment-100")
|
||||
.orderCode("C100")
|
||||
.refundFlag("SUCCESS")
|
||||
.splitFlag("FAILED")
|
||||
.build();
|
||||
|
||||
service.syncUnsplitRecordTodo(record);
|
||||
|
||||
ArgumentCaptor<TodoTaskCreateCommand> captor = ArgumentCaptor.forClass(TodoTaskCreateCommand.class);
|
||||
verify(dependencies.todoTaskService).createTask(captor.capture());
|
||||
assertEquals(AdapayClearingTodoConstants.TASK_TYPE, captor.getValue().getTaskType());
|
||||
assertEquals(AdapayClearingTodoConstants.BUSINESS_TYPE, captor.getValue().getBusinessType());
|
||||
assertEquals("payment-100", captor.getValue().getBusinessId());
|
||||
assertEquals("financeDetail", captor.getValue().getRouteName());
|
||||
|
||||
record.setSplitFlag("SUCCESS");
|
||||
service.syncUnsplitRecordTodo(record);
|
||||
verify(dependencies.todoTaskService).completeByBusinessAsSystem(
|
||||
AdapayClearingTodoConstants.BUSINESS_TYPE, "payment-100", null, "adapay-clearing");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
private static class Dependencies {
|
||||
private final OrderBasicInfoService orderService = mock(OrderBasicInfoService.class);
|
||||
private final PileMerchantInfoService merchantService = mock(PileMerchantInfoService.class);
|
||||
private final TodoTaskAssigneeService assigneeService = mock(TodoTaskAssigneeService.class);
|
||||
private final TodoTaskService todoTaskService = mock(TodoTaskService.class);
|
||||
|
||||
private AdapayClearingTodoServiceImpl createService() {
|
||||
AdapayClearingTodoServiceImpl service = new AdapayClearingTodoServiceImpl();
|
||||
setField(service, "orderBasicInfoService", orderService);
|
||||
setField(service, "pileMerchantInfoService", merchantService);
|
||||
setField(service, "todoTaskAssigneeService", assigneeService);
|
||||
setField(service, "todoTaskService", todoTaskService);
|
||||
return service;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.jsowell.pile.service;
|
||||
|
||||
import com.jsowell.pile.domain.AdapayUnsplitRecord;
|
||||
import com.jsowell.pile.mapper.AdapayUnsplitRecordMapper;
|
||||
import com.jsowell.web.controller.pile.AdapayUnsplitRecordServiceImpl;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
class AdapayUnsplitRecordTodoLinkTest {
|
||||
@Test
|
||||
void flagUpdate_shouldSyncTodoWithPersistedRecord() {
|
||||
AdapayUnsplitRecordMapper mapper = mock(AdapayUnsplitRecordMapper.class);
|
||||
AdapayClearingTodoService todoService = mock(AdapayClearingTodoService.class);
|
||||
AdapayUnsplitRecordServiceImpl service = newService(mapper, todoService);
|
||||
AdapayUnsplitRecord updateRecord = AdapayUnsplitRecord.builder()
|
||||
.id(1)
|
||||
.paymentId("payment-100")
|
||||
.splitFlag("FAILED")
|
||||
.build();
|
||||
AdapayUnsplitRecord persistedRecord = AdapayUnsplitRecord.builder()
|
||||
.id(1)
|
||||
.paymentId("payment-100")
|
||||
.orderCode("C100")
|
||||
.refundFlag("SUCCESS")
|
||||
.splitFlag("FAILED")
|
||||
.build();
|
||||
when(mapper.insertOrUpdateSelective(updateRecord)).thenReturn(1);
|
||||
when(mapper.selectByPrimaryKey(1)).thenReturn(persistedRecord);
|
||||
|
||||
service.insertOrUpdateSelective(updateRecord);
|
||||
|
||||
verify(todoService).syncUnsplitRecordTodo(persistedRecord);
|
||||
}
|
||||
|
||||
@Test
|
||||
void amountOnlyUpdate_shouldNotSyncTodo() {
|
||||
AdapayUnsplitRecordMapper mapper = mock(AdapayUnsplitRecordMapper.class);
|
||||
AdapayClearingTodoService todoService = mock(AdapayClearingTodoService.class);
|
||||
AdapayUnsplitRecordServiceImpl service = newService(mapper, todoService);
|
||||
AdapayUnsplitRecord updateRecord = AdapayUnsplitRecord.builder()
|
||||
.id(1)
|
||||
.paymentId("payment-100")
|
||||
.build();
|
||||
when(mapper.insertOrUpdateSelective(updateRecord)).thenReturn(1);
|
||||
|
||||
service.insertOrUpdateSelective(updateRecord);
|
||||
|
||||
verify(todoService, never()).syncUnsplitRecordTodo(updateRecord);
|
||||
}
|
||||
|
||||
private static AdapayUnsplitRecordServiceImpl newService(AdapayUnsplitRecordMapper mapper,
|
||||
AdapayClearingTodoService todoService) {
|
||||
AdapayUnsplitRecordServiceImpl service = new AdapayUnsplitRecordServiceImpl();
|
||||
setField(service, "adapayUnsplitRecordMapper", mapper);
|
||||
setField(service, "adapayClearingTodoService", todoService);
|
||||
return service;
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
package com.jsowell.pile.service;
|
||||
|
||||
import com.jsowell.pile.constant.OrderAbnormalTodoConstants;
|
||||
import com.jsowell.pile.domain.OrderAbnormalRecord;
|
||||
import com.jsowell.pile.domain.PileMerchantInfo;
|
||||
import com.jsowell.pile.mapper.OrderAbnormalRecordMapper;
|
||||
import com.jsowell.pile.service.impl.OrderAbnormalRecordServiceImpl;
|
||||
import com.jsowell.pile.vo.base.PileInfoVO;
|
||||
import com.jsowell.system.domain.dto.TodoTaskCreateCommand;
|
||||
import com.jsowell.system.service.TodoTaskAssigneeService;
|
||||
import com.jsowell.system.service.TodoTaskService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.doAnswer;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
class OrderAbnormalRecordTodoTest {
|
||||
@Test
|
||||
void insert_shouldCreateTodoForEachMerchantAdmin() {
|
||||
Dependencies dependencies = new Dependencies();
|
||||
OrderAbnormalRecordServiceImpl service = dependencies.createService();
|
||||
OrderAbnormalRecord record = new OrderAbnormalRecord();
|
||||
record.setOrderCode("transaction-100");
|
||||
record.setPileSn("pile-100");
|
||||
record.setStopReasonMsg("平台未找到原订单");
|
||||
doAnswer(invocation -> {
|
||||
OrderAbnormalRecord value = invocation.getArgument(0);
|
||||
value.setId(55);
|
||||
return 1;
|
||||
}).when(dependencies.mapper).insertOrderAbnormalRecord(record);
|
||||
when(dependencies.pileBasicInfoService.selectPileInfoBySn("pile-100"))
|
||||
.thenReturn(PileInfoVO.builder().merchantId("100").build());
|
||||
PileMerchantInfo merchantInfo = new PileMerchantInfo();
|
||||
merchantInfo.setDeptId("200");
|
||||
when(dependencies.merchantService.selectPileMerchantInfoById(100L)).thenReturn(merchantInfo);
|
||||
when(dependencies.assigneeService.findActiveOperatorAdminUserIdsByDeptTree(200L))
|
||||
.thenReturn(Arrays.asList(8L, 9L));
|
||||
|
||||
service.insertOrderAbnormalRecord(record);
|
||||
|
||||
ArgumentCaptor<TodoTaskCreateCommand> captor = ArgumentCaptor.forClass(TodoTaskCreateCommand.class);
|
||||
verify(dependencies.todoTaskService, times(2)).createTask(captor.capture());
|
||||
TodoTaskCreateCommand command = captor.getAllValues().get(0);
|
||||
assertEquals(OrderAbnormalTodoConstants.TASK_TYPE, command.getTaskType());
|
||||
assertEquals(OrderAbnormalTodoConstants.BUSINESS_TYPE, command.getBusinessType());
|
||||
assertEquals("55", command.getBusinessId());
|
||||
assertEquals(OrderAbnormalTodoConstants.ROUTE_NAME, command.getRouteName());
|
||||
assertEquals("100", command.getAssigneeMerchantId());
|
||||
assertEquals(8L, command.getAssigneeUserId());
|
||||
}
|
||||
|
||||
@Test
|
||||
void delete_shouldCancelBusinessTodos() {
|
||||
Dependencies dependencies = new Dependencies();
|
||||
OrderAbnormalRecordServiceImpl service = dependencies.createService();
|
||||
Integer[] ids = {55, 56};
|
||||
when(dependencies.mapper.deleteOrderAbnormalRecordByIds(ids)).thenReturn(2);
|
||||
|
||||
service.deleteOrderAbnormalRecordByIds(ids, "admin");
|
||||
|
||||
verify(dependencies.todoTaskService).cancelByBusiness(
|
||||
OrderAbnormalTodoConstants.BUSINESS_TYPE, "55", null, "admin", "订单异常记录已关闭");
|
||||
verify(dependencies.todoTaskService).cancelByBusiness(
|
||||
OrderAbnormalTodoConstants.BUSINESS_TYPE, "56", null, "admin", "订单异常记录已关闭");
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
private static class Dependencies {
|
||||
private final OrderAbnormalRecordMapper mapper = mock(OrderAbnormalRecordMapper.class);
|
||||
private final PileBasicInfoService pileBasicInfoService = mock(PileBasicInfoService.class);
|
||||
private final PileMerchantInfoService merchantService = mock(PileMerchantInfoService.class);
|
||||
private final TodoTaskAssigneeService assigneeService = mock(TodoTaskAssigneeService.class);
|
||||
private final TodoTaskService todoTaskService = mock(TodoTaskService.class);
|
||||
|
||||
private OrderAbnormalRecordServiceImpl createService() {
|
||||
OrderAbnormalRecordServiceImpl service = new OrderAbnormalRecordServiceImpl();
|
||||
setField(service, "orderAbnormalRecordMapper", mapper);
|
||||
setField(service, "pileBasicInfoService", pileBasicInfoService);
|
||||
setField(service, "pileMerchantInfoService", merchantService);
|
||||
setField(service, "todoTaskAssigneeService", assigneeService);
|
||||
setField(service, "todoTaskService", todoTaskService);
|
||||
return service;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -129,6 +129,18 @@ class TodoTaskServiceImplTest {
|
||||
verify(mapper, never()).insertTodoTask(any(SysTodoTask.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void createTask_shouldAllowOrderAbnormalRoute() {
|
||||
SysTodoTaskMapper mapper = mock(SysTodoTaskMapper.class);
|
||||
TodoTaskServiceImpl service = newService(mapper);
|
||||
TodoTaskCreateCommand command = createCommand();
|
||||
command.setRouteName("AbnormalRecord");
|
||||
|
||||
service.createTask(command);
|
||||
|
||||
verify(mapper).insertTodoTask(any(SysTodoTask.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
void createTask_shouldRejectNestedRouteParams() {
|
||||
SysTodoTaskMapper mapper = mock(SysTodoTaskMapper.class);
|
||||
|
||||
Reference in New Issue
Block a user