Thiết Kế Database Trong PostgreSQL Cho Hệ Thống Dịch Vụ Doanh Nghiệp
Giới Thiệu
Trong bài viết này, chúng ta sẽ thảo luận về thiết kế cơ sở dữ liệu trong PostgreSQL cho một hệ thống quản lý dịch vụ doanh nghiệp. Hệ thống này sử dụng nhiều bảng để quản lý thông tin người dùng, gói dịch vụ, sản phẩm và dịch vụ liên quan đến doanh nghiệp. -- Function để tính toán tổng giá trị giỏ hàng @Query(value = "SELECT o.order_code AS orderCode, " + "o.payment_time AS paymentTime, " + "o.status, o.total, o.gcif, o.payment_url, o.created_date, " + "oi.package_name AS packageName, oi.price " + "FROM service_package.en_sale_order o " + "LEFT JOIN service_package.en_sale_order_item oi ON o.order_code = oi.order_code " + "WHERE o.user_id = :userId " + "ORDER BY o.order_code, oi.created_date DESC", countQuery = "SELECT COUNT(DISTINCT o.order_code) " + "FROM service_package.en_sale_order o " + "WHERE o.user_id = :userId", nativeQuery = true) Page<Object[]> findHistoryOrders(@Param("userId") String userId, Pageable pageable);
{ "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" }
@Override public PageResponse<OrderHistoryVo> orderHistory(int page, int size) { String userId = Objects.requireNonNull(SecurityContext.getUserInfo()).getUserId();
// Tạo Pageable object từ tham số page và size
Pageable pageable = PageRequest.of(page, size, Sort.by("order_code").ascending()
.and(Sort.by("created_date").descending()));
// Gọi repository với pageable
Page<Object[]> results = enSaleOrderRepository.findHistoryOrders(userId, pageable);
// Xử lý dữ liệu từ results
Map<Long, List<Object[]>> groupedResults = results.getContent().stream()
.collect(Collectors.groupingBy(
row -> (Long) row[0],
Collectors.toList()
));
// 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