Thiết Kế Database Trong PostgreSQL Cho Hệ Thống Dịch Vụ Doanh Nghiệp
kubectl cp egi-laand-360/subscription-service-5fbdf8fbd4-9qsg h:/uploads/be-final-project.rar D:/Downloads/be-final-project.rar
@GetMapping("/download/{filename:.+}") public void downloadFile(@PathVariable String filename, HttpServletResponse response) throws IOException { Path filePath = Paths.get(uploadDir).resolve(filename).normalize();
if (!Files.exists(filePath)) {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
response.getWriter().write("File not found");
return;
}
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
// Stream dữ liệu file về client
try (InputStream inputStream = Files.newInputStream(filePath);
OutputStream outputStream = response.getOutputStream()) {
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
outputStream.flush();
}
}
{ "code": "FAILED", "desc": "Giao dịch thất bại do tài khoản không đủ số dư", "success": false, "data": { "orderCode": 987654, "amount": 1500000, "description": "Thanh toán hóa đơn VQRIO789", "accountNumber": "1122334455", "reference": "TF231106987654", "transactionDateTime": "2023-11-06 09:15:00", "currency": "VND", "paymentLinkId": "z9y8x7w6v5u4t3s2r1q0p9o8n7m6l5k4j3", "code": "01", "desc": "Tài khoản không đủ số dư", "counterAccountBankId": "VCB", "counterAccountBankName": "Ngân hàng TMCP Ngoại thương Việt Nam", "counterAccountName": "Tran Thi B", "counterAccountNumber": "9988776655", "virtualAccountName": "", "virtualAccountNumber": "" }, "signature": "a1b2c3d4e5f67890abcdef1234567890fedcba9876543210abcdef1234567890" }
{ "code": "00", "desc": "success", "data": { "orderCode": 123, "amount": 3000, "description": "VQRIO123", "accountNumber": "12345678", "reference": "TF230204212323", "transactionDateTime": "2023-02-04 18:25:00", "paymentLinkId": "124c33293c43417ab7879e14c8d9eb18", "code": "00", "desc": "Thành công", "counterAccountBankId": "", "counterAccountBankName": "", "counterAccountName": "", "counterAccountNumber": "", "virtualAccountName": "", "virtualAccountNumber": "", "currency": "VND" }, "signature": "418db70703d726b5a13091aee26b0d7a88ff184d8cf64312af6d737095b6c3ef" }
// Chuyển đổi kết quả thành danh sách OrderHistoryVo
List<OrderHistoryVo> content = groupedResults.entrySet().stream().map(entry -> {
Long orderCode = entry.getKey();
List<Object[]> orderRows = entry.getValue();
Object[] firstRow = orderRows.get(0); // Lấy thông tin từ bản ghi đầu tiên
OrderHistoryVo order = new OrderHistoryVo();
order.setOrderCode(orderCode);
order.setPaymentTime(firstRow[1] != null ? (Timestamp) firstRow[1] : null);
order.setStatus((String) firstRow[2]);
order.setTotal((Integer) firstRow[3]);
order.setGcif((String) firstRow[4]);
order.setPaymentUrl((String) firstRow[5]);
order.setCreatedDate((Timestamp) firstRow[7]);
// Xây dựng danh sách packageInfo từ tất cả các bản ghi
List<OrderHistoryVo.packageInfo> packageInfoList = orderRows.stream()
.map(row -> {
OrderHistoryVo.packageInfo packageInfo = new OrderHistoryVo.packageInfo();
packageInfo.setPackageName(row[6] != null ? (String) row[6] : null);
packageInfo.setPrice(row[8] != null ? (Integer) row[8] : null);
return packageInfo;
})
.collect(Collectors.toList());
order.setPackageInfo(packageInfoList.isEmpty() ? new ArrayList<>() : packageInfoList);
return order;
}).collect(Collectors.toList());
// Tạo PageResponse từ kết quả thu được và thông tin phân trang
PageResponse<OrderHistoryVo> pageResponse = new PageResponse<>();
pageResponse.setContent(content);
pageResponse.setNumber(results.getNumber());
pageResponse.setSize(results.getSize());
pageResponse.setTotalPages(results.getTotalPages());
pageResponse.setTotalElements(results.getTotalElements());
pageResponse.setHasContent(!content.isEmpty());
pageResponse.setFirst(results.isFirst());
pageResponse.setLast(results.isLast());
pageResponse.setHasNext(results.hasNext());
pageResponse.setHasPrevious(results.hasPrevious());
pageResponse.setNumberOfElements(content.size());
return pageResponse;
} Bài viết này giới thiệu các bảng trong hệ thống dịch vụ doanh nghiệp sử dụng PostgreSQL. Việc tổ chức dữ liệu theo từng bảng riêng biệt giúp đảm bảo tính linh hoạt và tối ưu hiệu suất truy vấn. Nếu bạn có câu hỏi hoặc góp ý, hãy để lại bình luận bên dưới!
All rights reserved