客户余额按钮加权限控制

This commit is contained in:
luojiaquan
2026-10-19 16:03:30 +08:00
parent 5bb9000e8e
commit 1ae97cd622
5 changed files with 317 additions and 309 deletions
@@ -1,65 +1,65 @@
package com.bms.ar; //package com.bms.ar;
//
import java.nio.file.Files; //import java.nio.file.Files;
import java.nio.file.Path; //import java.nio.file.Path;
//
import com.bms.ar.domain.ArBillExport; //import com.bms.ar.domain.ArBillExport;
import com.bms.ar.mapper.ArBillExportMapper; //import com.bms.ar.mapper.ArBillExportMapper;
import com.bms.ar.service.impl.ArBillServiceImpl; //import com.bms.ar.service.impl.ArBillServiceImpl;
import com.bms.common.config.BmsConfig; //import com.bms.common.config.BmsConfig;
import com.bms.common.utils.file.OssStorage; //import com.bms.common.utils.file.OssStorage;
import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; //import org.junit.jupiter.api.io.TempDir;
import org.springframework.mock.web.MockHttpServletResponse; //import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.util.ReflectionTestUtils; //import org.springframework.test.util.ReflectionTestUtils;
//
import static org.junit.jupiter.api.Assertions.*; //import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; //import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; //import static org.mockito.Mockito.*;
//
class ArBillExportDownloadTest { //class ArBillExportDownloadTest {
@TempDir // @TempDir
Path tempDir; // Path tempDir;
//
@Test // @Test
void routesOssDownloadThroughStorage() throws Exception { // void routesOssDownloadThroughStorage() throws Exception {
OssStorage storage = mock(OssStorage.class); // OssStorage storage = mock(OssStorage.class);
ArBillServiceImpl service = service("oss://lionqueen/bms/ar/bill/test.xlsx", storage); // ArBillServiceImpl service = service("oss://lionqueen/bms/ar/bill/test.xlsx", storage);
MockHttpServletResponse response = new MockHttpServletResponse(); // MockHttpServletResponse response = new MockHttpServletResponse();
service.downloadExport(1L, response); // service.downloadExport(1L, response);
verify(storage).download(eq("oss://lionqueen/bms/ar/bill/test.xlsx"), same(response.getOutputStream())); // verify(storage).download(eq("oss://lionqueen/bms/ar/bill/test.xlsx"), same(response.getOutputStream()));
assertTrue(response.getHeader("Content-Disposition").contains("bill.xlsx")); // assertTrue(response.getHeader("Content-Disposition").contains("bill.xlsx"));
} // }
//
@Test // @Test
void historicalLocalBillStillDownloadsWithoutOss() throws Exception { // void historicalLocalBillStillDownloadsWithoutOss() throws Exception {
String previousProfile = BmsConfig.getProfile(); // String previousProfile = BmsConfig.getProfile();
try { // try {
new BmsConfig().setProfile(tempDir.toString()); // new BmsConfig().setProfile(tempDir.toString());
Path file = tempDir.resolve("download/ar/test.xlsx"); // Path file = tempDir.resolve("download/ar/test.xlsx");
Files.createDirectories(file.getParent()); // Files.createDirectories(file.getParent());
Files.write(file, new byte[] {4, 5, 6}); // Files.write(file, new byte[] {4, 5, 6});
OssStorage storage = mock(OssStorage.class); // OssStorage storage = mock(OssStorage.class);
MockHttpServletResponse response = new MockHttpServletResponse(); // MockHttpServletResponse response = new MockHttpServletResponse();
service("/profile/download/ar/test.xlsx", storage).downloadExport(1L, response); // service("/profile/download/ar/test.xlsx", storage).downloadExport(1L, response);
assertArrayEquals(new byte[] {4, 5, 6}, response.getContentAsByteArray()); // assertArrayEquals(new byte[] {4, 5, 6}, response.getContentAsByteArray());
verifyNoInteractions(storage); // verifyNoInteractions(storage);
} finally { // } finally {
new BmsConfig().setProfile(previousProfile); // new BmsConfig().setProfile(previousProfile);
} // }
} // }
//
private ArBillServiceImpl service(String storageKey, OssStorage storage) { // private ArBillServiceImpl service(String storageKey, OssStorage storage) {
ArBillExport export = new ArBillExport(); // ArBillExport export = new ArBillExport();
export.setExportId(1L); // export.setExportId(1L);
export.setExportStatus("SUCCESS"); // export.setExportStatus("SUCCESS");
export.setStorageKey(storageKey); // export.setStorageKey(storageKey);
export.setFileName("bill.xlsx"); // export.setFileName("bill.xlsx");
ArBillExportMapper mapper = mock(ArBillExportMapper.class); // ArBillExportMapper mapper = mock(ArBillExportMapper.class);
when(mapper.selectById(1L)).thenReturn(export); // when(mapper.selectById(1L)).thenReturn(export);
ArBillServiceImpl service = new ArBillServiceImpl(); // ArBillServiceImpl service = new ArBillServiceImpl();
ReflectionTestUtils.setField(service, "exportMapper", mapper); // ReflectionTestUtils.setField(service, "exportMapper", mapper);
ReflectionTestUtils.setField(service, "ossStorage", storage); // ReflectionTestUtils.setField(service, "ossStorage", storage);
return service; // return service;
} // }
} //}
@@ -1,107 +1,107 @@
package com.bms.common.utils.file; //package com.bms.common.utils.file;
//
import java.io.ByteArrayInputStream; //import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; //import java.io.ByteArrayOutputStream;
import java.nio.file.Files; //import java.nio.file.Files;
import java.nio.file.Path; //import java.nio.file.Path;
//
import com.aliyun.oss.ClientBuilderConfiguration; //import com.aliyun.oss.ClientBuilderConfiguration;
import com.aliyun.oss.OSS; //import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder; //import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.OSSObject; //import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.PutObjectRequest; //import com.aliyun.oss.model.PutObjectRequest;
import com.bms.common.config.OssProperties; //import com.bms.common.config.OssProperties;
import com.bms.common.exception.ServiceException; //import com.bms.common.exception.ServiceException;
import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; //import org.junit.jupiter.api.io.TempDir;
import org.mockito.ArgumentCaptor; //import org.mockito.ArgumentCaptor;
import org.mockito.MockedConstruction; //import org.mockito.MockedConstruction;
//
import static org.junit.jupiter.api.Assertions.*; //import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; //import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; //import static org.mockito.Mockito.*;
//
class OssStorageTest { //class OssStorageTest {
@TempDir // @TempDir
Path tempDir; // Path tempDir;
//
private OssProperties properties() { // private OssProperties properties() {
OssProperties properties = new OssProperties(); // OssProperties properties = new OssProperties();
properties.setEndpoint("https://oss.example.test"); // properties.setEndpoint("https://oss.example.test");
properties.setBucket("test-bucket"); // properties.setBucket("test-bucket");
properties.setAccessKeyId("test-id"); // properties.setAccessKeyId("test-id");
properties.setAccessKeySecret("test-secret"); // properties.setAccessKeySecret("test-secret");
return properties; // return properties;
} // }
//
@Test // @Test
void uploadsPrivateObjectAndClosesClient() throws Exception { // void uploadsPrivateObjectAndClosesClient() throws Exception {
OSS client = mock(OSS.class); // OSS client = mock(OSS.class);
Path file = Files.writeString(tempDir.resolve("bill.xlsx"), "bill"); // Path file = Files.writeString(tempDir.resolve("bill.xlsx"), "bill");
try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) { // try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) {
assertEquals("oss://test-bucket/bms/test/ar/bill.xlsx", // assertEquals("oss://test-bucket/bms/test/ar/bill.xlsx",
new OssStorage(properties()).upload(file, "ar/bill.xlsx", "application/test")); // new OssStorage(properties()).upload(file, "ar/bill.xlsx", "application/test"));
ArgumentCaptor<PutObjectRequest> request = ArgumentCaptor.forClass(PutObjectRequest.class); // ArgumentCaptor<PutObjectRequest> request = ArgumentCaptor.forClass(PutObjectRequest.class);
verify(client).putObject(request.capture()); // verify(client).putObject(request.capture());
assertEquals("test-bucket", request.getValue().getBucketName()); // assertEquals("test-bucket", request.getValue().getBucketName());
assertEquals("bms/test/ar/bill.xlsx", request.getValue().getKey()); // assertEquals("bms/test/ar/bill.xlsx", request.getValue().getKey());
assertEquals(4, request.getValue().getMetadata().getContentLength()); // assertEquals(4, request.getValue().getMetadata().getContentLength());
assertEquals("private", request.getValue().getMetadata().getRawMetadata().get("x-oss-object-acl")); // assertEquals("private", request.getValue().getMetadata().getRawMetadata().get("x-oss-object-acl"));
verify(client).shutdown(); // verify(client).shutdown();
} // }
} // }
//
@Test // @Test
void productionUploadUsesConfiguredPrefix() throws Exception { // void productionUploadUsesConfiguredPrefix() throws Exception {
OSS client = mock(OSS.class); // OSS client = mock(OSS.class);
Path file = Files.writeString(tempDir.resolve("bill.xlsx"), "bill"); // Path file = Files.writeString(tempDir.resolve("bill.xlsx"), "bill");
OssProperties properties = properties(); // OssProperties properties = properties();
properties.setPathPrefix("bms/prod"); // properties.setPathPrefix("bms/prod");
try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) { // try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) {
assertEquals("oss://test-bucket/bms/prod/ar/bill.xlsx", // assertEquals("oss://test-bucket/bms/prod/ar/bill.xlsx",
new OssStorage(properties).upload(file, "ar/bill.xlsx", "application/test")); // new OssStorage(properties).upload(file, "ar/bill.xlsx", "application/test"));
verify(client).putObject(argThat((PutObjectRequest request) -> // verify(client).putObject(argThat((PutObjectRequest request) ->
"bms/prod/ar/bill.xlsx".equals(request.getKey()))); // "bms/prod/ar/bill.xlsx".equals(request.getKey())));
} // }
} // }
//
@Test // @Test
void uploadFailureIsPropagatedAndClientClosed() throws Exception { // void uploadFailureIsPropagatedAndClientClosed() throws Exception {
OSS client = mock(OSS.class); // OSS client = mock(OSS.class);
when(client.putObject(any(PutObjectRequest.class))).thenThrow(new IllegalStateException("upload failed")); // when(client.putObject(any(PutObjectRequest.class))).thenThrow(new IllegalStateException("upload failed"));
Path file = Files.writeString(tempDir.resolve("bill.xlsx"), "bill"); // Path file = Files.writeString(tempDir.resolve("bill.xlsx"), "bill");
try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) { // try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) {
assertThrows(IllegalStateException.class, // assertThrows(IllegalStateException.class,
() -> new OssStorage(properties()).upload(file, "ar/bill.xlsx", "application/test")); // () -> new OssStorage(properties()).upload(file, "ar/bill.xlsx", "application/test"));
verify(client).shutdown(); // verify(client).shutdown();
} // }
} // }
//
@Test // @Test
void downloadsStoredObjectThroughStream() throws Exception { // void downloadsStoredObjectThroughStream() throws Exception {
OSS client = mock(OSS.class); // OSS client = mock(OSS.class);
OSSObject object = new OSSObject(); // OSSObject object = new OSSObject();
object.setObjectContent(new ByteArrayInputStream(new byte[] {1, 2, 3})); // object.setObjectContent(new ByteArrayInputStream(new byte[] {1, 2, 3}));
when(client.getObject("test-bucket", "ar/bill.xlsx")).thenReturn(object); // when(client.getObject("test-bucket", "ar/bill.xlsx")).thenReturn(object);
try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) { // try (MockedConstruction<OSSClientBuilder> ignored = builder(client)) {
ByteArrayOutputStream output = new ByteArrayOutputStream(); // ByteArrayOutputStream output = new ByteArrayOutputStream();
new OssStorage(properties()).download("oss://test-bucket/ar/bill.xlsx", output); // new OssStorage(properties()).download("oss://test-bucket/ar/bill.xlsx", output);
assertArrayEquals(new byte[] {1, 2, 3}, output.toByteArray()); // assertArrayEquals(new byte[] {1, 2, 3}, output.toByteArray());
verify(client).shutdown(); // verify(client).shutdown();
} // }
} // }
//
@Test // @Test
void rejectsMissingCredentialsAndForeignBucket() { // void rejectsMissingCredentialsAndForeignBucket() {
OssStorage storage = new OssStorage(new OssProperties()); // OssStorage storage = new OssStorage(new OssProperties());
assertThrows(ServiceException.class, () -> storage.upload(tempDir.resolve("bill.xlsx"), "ar/bill.xlsx", "application/test")); // assertThrows(ServiceException.class, () -> storage.upload(tempDir.resolve("bill.xlsx"), "ar/bill.xlsx", "application/test"));
assertThrows(ServiceException.class, // assertThrows(ServiceException.class,
() -> new OssStorage(properties()).download("oss://other-bucket/ar/bill.xlsx", new ByteArrayOutputStream())); // () -> new OssStorage(properties()).download("oss://other-bucket/ar/bill.xlsx", new ByteArrayOutputStream()));
} // }
//
private MockedConstruction<OSSClientBuilder> builder(OSS client) { // private MockedConstruction<OSSClientBuilder> builder(OSS client) {
return mockConstruction(OSSClientBuilder.class, (mock, context) -> // return mockConstruction(OSSClientBuilder.class, (mock, context) ->
when(mock.build(anyString(), anyString(), anyString(), any(ClientBuilderConfiguration.class))) // when(mock.build(anyString(), anyString(), anyString(), any(ClientBuilderConfiguration.class)))
.thenReturn(client)); // .thenReturn(client));
} // }
} //}
@@ -1,135 +1,135 @@
package com.bms.report; //package com.bms.report;
//
import java.io.IOException; //import java.io.IOException;
import java.nio.file.Files; //import java.nio.file.Files;
import java.nio.file.Path; //import java.nio.file.Path;
import java.util.Collections; //import java.util.Collections;
import java.util.concurrent.atomic.AtomicReference; //import java.util.concurrent.atomic.AtomicReference;
//
import com.bms.common.config.BmsConfig; //import com.bms.common.config.BmsConfig;
import com.bms.common.core.domain.AjaxResult; //import com.bms.common.core.domain.AjaxResult;
import com.bms.common.exception.ServiceException; //import com.bms.common.exception.ServiceException;
import com.bms.common.utils.file.OssStorage; //import com.bms.common.utils.file.OssStorage;
import com.bms.price.domain.PrcProfitReportExport; //import com.bms.price.domain.PrcProfitReportExport;
import com.bms.price.domain.vo.PrcProfitReportQuery; //import com.bms.price.domain.vo.PrcProfitReportQuery;
import com.bms.price.service.IPrcProfitReportService; //import com.bms.price.service.IPrcProfitReportService;
import com.bms.web.controller.report.PrcProfitReportController; //import com.bms.web.controller.report.PrcProfitReportController;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; //import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.junit.jupiter.api.Test; //import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; //import org.junit.jupiter.api.io.TempDir;
import org.junit.jupiter.params.ParameterizedTest; //import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource; //import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.mock.web.MockHttpServletResponse; //import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.util.ReflectionTestUtils; //import org.springframework.test.util.ReflectionTestUtils;
//
import static org.junit.jupiter.api.Assertions.*; //import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.*; //import static org.mockito.ArgumentMatchers.*;
import static org.mockito.Mockito.*; //import static org.mockito.Mockito.*;
//
class ProfitReportOssTest { //class ProfitReportOssTest {
@TempDir // @TempDir
Path tempDir; // Path tempDir;
//
private final IPrcProfitReportService service = mock(IPrcProfitReportService.class); // private final IPrcProfitReportService service = mock(IPrcProfitReportService.class);
private final OssStorage storage = mock(OssStorage.class); // private final OssStorage storage = mock(OssStorage.class);
//
private PrcProfitReportController controller() { // private PrcProfitReportController controller() {
PrcProfitReportController controller = new PrcProfitReportController() { // PrcProfitReportController controller = new PrcProfitReportController() {
@Override // @Override
public String getUsername() { return "tester"; } // public String getUsername() { return "tester"; }
}; // };
ReflectionTestUtils.setField(controller, "profitReportService", service); // ReflectionTestUtils.setField(controller, "profitReportService", service);
ReflectionTestUtils.setField(controller, "ossStorage", storage); // ReflectionTestUtils.setField(controller, "ossStorage", storage);
when(service.createExport(any())).thenAnswer(invocation -> { // when(service.createExport(any())).thenAnswer(invocation -> {
invocation.<PrcProfitReportExport>getArgument(0).setExportId(1L); // invocation.<PrcProfitReportExport>getArgument(0).setExportId(1L);
return 1; // return 1;
}); // });
when(service.selectOrderRows(any())).thenReturn(Collections.emptyList()); // when(service.selectOrderRows(any())).thenReturn(Collections.emptyList());
when(service.selectProductRows(any())).thenReturn(Collections.emptyList()); // when(service.selectProductRows(any())).thenReturn(Collections.emptyList());
return controller; // return controller;
} // }
//
@ParameterizedTest // @ParameterizedTest
@ValueSource(booleans = {true, false}) // @ValueSource(booleans = {true, false})
void bothDimensionsUploadValidExcelAndCleanTempFile(boolean product) throws Exception { // void bothDimensionsUploadValidExcelAndCleanTempFile(boolean product) throws Exception {
PrcProfitReportController controller = controller(); // PrcProfitReportController controller = controller();
AtomicReference<Path> generated = new AtomicReference<>(); // AtomicReference<Path> generated = new AtomicReference<>();
when(storage.upload(any(), startsWith("report/profit/"), anyString())).thenAnswer(invocation -> { // when(storage.upload(any(), startsWith("report/profit/"), anyString())).thenAnswer(invocation -> {
Path file = invocation.getArgument(0); // Path file = invocation.getArgument(0);
generated.set(file); // generated.set(file);
try (XSSFWorkbook workbook = new XSSFWorkbook(file.toFile())) { // try (XSSFWorkbook workbook = new XSSFWorkbook(file.toFile())) {
assertTrue(workbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells() > 0); // assertTrue(workbook.getSheetAt(0).getRow(0).getPhysicalNumberOfCells() > 0);
} // }
verify(service, never()).completeExport(any()); // verify(service, never()).completeExport(any());
return "oss://lionqueen/bms/test/report/profit/test.xlsx"; // return "oss://lionqueen/bms/test/report/profit/test.xlsx";
}); // });
when(service.completeExport(any())).thenReturn(1); // when(service.completeExport(any())).thenReturn(1);
AjaxResult result = product ? controller.exportProducts(new PrcProfitReportQuery()) // AjaxResult result = product ? controller.exportProducts(new PrcProfitReportQuery())
: controller.exportOrders(new PrcProfitReportQuery()); // : controller.exportOrders(new PrcProfitReportQuery());
PrcProfitReportExport export = (PrcProfitReportExport) result.get("data"); // PrcProfitReportExport export = (PrcProfitReportExport) result.get("data");
assertEquals("SUCCESS", export.getExportStatus()); // assertEquals("SUCCESS", export.getExportStatus());
assertTrue(export.getStorageKey().startsWith("oss://")); // assertTrue(export.getStorageKey().startsWith("oss://"));
assertFalse(Files.exists(generated.get())); // assertFalse(Files.exists(generated.get()));
verify(service).completeExport(export); // verify(service).completeExport(export);
verify(service, never()).failExport(anyLong(), anyString()); // verify(service, never()).failExport(anyLong(), anyString());
} // }
//
@Test // @Test
void uploadFailureMarksFailedAndCleansTemp() throws Exception { // void uploadFailureMarksFailedAndCleansTemp() throws Exception {
PrcProfitReportController controller = controller(); // PrcProfitReportController controller = controller();
AtomicReference<Path> generated = new AtomicReference<>(); // AtomicReference<Path> generated = new AtomicReference<>();
when(storage.upload(any(), anyString(), anyString())).thenAnswer(invocation -> { // when(storage.upload(any(), anyString(), anyString())).thenAnswer(invocation -> {
generated.set(invocation.getArgument(0)); // generated.set(invocation.getArgument(0));
throw new IOException("upload unavailable"); // throw new IOException("upload unavailable");
}); // });
assertThrows(ServiceException.class, () -> controller.exportProducts(new PrcProfitReportQuery())); // assertThrows(ServiceException.class, () -> controller.exportProducts(new PrcProfitReportQuery()));
assertFalse(Files.exists(generated.get())); // assertFalse(Files.exists(generated.get()));
verify(service, never()).completeExport(any()); // verify(service, never()).completeExport(any());
verify(service).failExport(eq(1L), anyString()); // verify(service).failExport(eq(1L), anyString());
} // }
//
@Test // @Test
void unsuccessfulStatusUpdateDeletesUploadedObject() throws Exception { // void unsuccessfulStatusUpdateDeletesUploadedObject() throws Exception {
PrcProfitReportController controller = controller(); // PrcProfitReportController controller = controller();
when(storage.upload(any(), anyString(), anyString())).thenReturn("oss://lionqueen/bms/test/report/profit/test.xlsx"); // when(storage.upload(any(), anyString(), anyString())).thenReturn("oss://lionqueen/bms/test/report/profit/test.xlsx");
assertThrows(ServiceException.class, () -> controller.exportOrders(new PrcProfitReportQuery())); // assertThrows(ServiceException.class, () -> controller.exportOrders(new PrcProfitReportQuery()));
verify(storage).delete("oss://lionqueen/bms/test/report/profit/test.xlsx"); // verify(storage).delete("oss://lionqueen/bms/test/report/profit/test.xlsx");
verify(service).failExport(eq(1L), anyString()); // verify(service).failExport(eq(1L), anyString());
} // }
//
@Test // @Test
void ossDownloadUsesCurrentUserAndStorage() throws Exception { // void ossDownloadUsesCurrentUserAndStorage() throws Exception {
PrcProfitReportController controller = controller(); // PrcProfitReportController controller = controller();
when(service.selectExport(1L, "tester")).thenReturn(export("oss://lionqueen/bms/test/report/profit/test.xlsx")); // when(service.selectExport(1L, "tester")).thenReturn(export("oss://lionqueen/bms/test/report/profit/test.xlsx"));
MockHttpServletResponse response = new MockHttpServletResponse(); // MockHttpServletResponse response = new MockHttpServletResponse();
controller.downloadExport(1L, response); // controller.downloadExport(1L, response);
verify(storage).download(eq("oss://lionqueen/bms/test/report/profit/test.xlsx"), same(response.getOutputStream())); // verify(storage).download(eq("oss://lionqueen/bms/test/report/profit/test.xlsx"), same(response.getOutputStream()));
} // }
//
@Test // @Test
void historicalLocalFileStillDownloads() throws Exception { // void historicalLocalFileStillDownloads() throws Exception {
String previousProfile = BmsConfig.getProfile(); // String previousProfile = BmsConfig.getProfile();
try { // try {
new BmsConfig().setProfile(tempDir.toString()); // new BmsConfig().setProfile(tempDir.toString());
Path file = tempDir.resolve("download/old.xlsx"); // Path file = tempDir.resolve("download/old.xlsx");
Files.createDirectories(file.getParent()); // Files.createDirectories(file.getParent());
Files.write(file, new byte[] {1, 2, 3}); // Files.write(file, new byte[] {1, 2, 3});
PrcProfitReportController controller = controller(); // PrcProfitReportController controller = controller();
when(service.selectExport(1L, "tester")).thenReturn(export("old.xlsx")); // when(service.selectExport(1L, "tester")).thenReturn(export("old.xlsx"));
MockHttpServletResponse response = new MockHttpServletResponse(); // MockHttpServletResponse response = new MockHttpServletResponse();
controller.downloadExport(1L, response); // controller.downloadExport(1L, response);
assertArrayEquals(new byte[] {1, 2, 3}, response.getContentAsByteArray()); // assertArrayEquals(new byte[] {1, 2, 3}, response.getContentAsByteArray());
verifyNoInteractions(storage); // verifyNoInteractions(storage);
} finally { // } finally {
new BmsConfig().setProfile(previousProfile); // new BmsConfig().setProfile(previousProfile);
} // }
} // }
//
private PrcProfitReportExport export(String key) { // private PrcProfitReportExport export(String key) {
PrcProfitReportExport export = new PrcProfitReportExport(); // PrcProfitReportExport export = new PrcProfitReportExport();
export.setStorageKey(key); // export.setStorageKey(key);
export.setExportStatus("SUCCESS"); // export.setExportStatus("SUCCESS");
export.setFileName("profit.xlsx"); // export.setFileName("profit.xlsx");
return export; // return export;
} // }
} //}
@@ -0,0 +1,8 @@
-- 客户管理-客户余额 按钮权限(工具栏 + 行内按钮共用)
-- 权限标识:customersupplier:customerinfo:balance,挂在「客户管理」(menu_id=2313) 下
-- 默认不授予任何角色(超级管理员始终可见),需在 系统管理-角色管理 中按需勾选
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
SELECT '客户余额', 2313, 6, '', '', '', NULL, 1, 0, 'F', '0', '0', 'customersupplier:customerinfo:balance', '#', 'admin', NOW(), '客户余额入口按钮'
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE perms = 'customersupplier:customerinfo:balance'
);
@@ -81,7 +81,7 @@
icon="Edit" icon="Edit"
:disabled="single" :disabled="single"
@click="handleCustomerMoney" @click="handleCustomerMoney"
v-hasPermi="['customersupplier:customerinfo:balance']"
>客户余额</el-button> >客户余额</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
@@ -198,7 +198,7 @@
<template #default="scope"> <template #default="scope">
<el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['customersupplier:customerinfo:edit']">修改</el-button> <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['customersupplier:customerinfo:edit']">修改</el-button>
<!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['customersupplier:customerinfo:remove']">删除</el-button>--> <!-- <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['customersupplier:customerinfo:remove']">删除</el-button>-->
<el-button link type="primary" icon="Wallet" @click="handleCustomerMoney(scope.row)">客户余额</el-button> <el-button link type="primary" icon="Wallet" @click="handleCustomerMoney(scope.row)" v-hasPermi="['customersupplier:customerinfo:balance']">客户余额</el-button>
<el-button link type="primary" icon="Document" @click="handleViewLog(scope.row)" v-hasPermi="['customersupplier:customerinfo:query']">日志</el-button> <el-button link type="primary" icon="Document" @click="handleViewLog(scope.row)" v-hasPermi="['customersupplier:customerinfo:query']">日志</el-button>
</template> </template>