diff --git a/rlz-ui/src/api/system/finance.js b/rlz-ui/src/api/system/finance.js new file mode 100644 index 0000000..5d028c3 --- /dev/null +++ b/rlz-ui/src/api/system/finance.js @@ -0,0 +1,71 @@ +import request from '@/utils/request' + +// ========== 退款管理 ========== + +// 退款订单列表(status=5:申请退款, 6:退款中) +export function listRefundOrders(query) { + return request({ + url: '/system/view/adminList', + method: 'get', + params: { ...query, status: query.status || '5' } + }) +} + +// 退款审核(通过/拒绝) +export function refundApprove(orderId, data) { + return request({ + url: '/system/view/refundApprove/' + orderId, + method: 'put', + data: data + }) +} + +// ========== 结算管理 ========== + +// 待结算订单列表(status=4:已完成, 8:已结算) +export function listSettlementOrders(query) { + return request({ + url: '/system/view/adminList', + method: 'get', + params: { ...query, status: query.status || '4' } + }) +} + +// 订单结算 +export function settleOrder(orderId, data) { + return request({ + url: '/system/view/settleOrder/' + orderId, + method: 'put', + data: data + }) +} + +// ========== 收入统计 ========== + +// 收入统计数据 +export function getIncomeStats(params) { + return request({ + url: '/system/view/incomeStats', + method: 'get', + params: params + }) +} + +// ========== 交易明细 ========== + +// 交易明细列表 +export function listJiaoyiDetail(query) { + return request({ + url: '/system/detail/list', + method: 'get', + params: query + }) +} + +// 查询交易明细详细 +export function getJiaoyiDetail(id) { + return request({ + url: '/system/detail/' + id, + method: 'get' + }) +} diff --git a/rlz-ui/src/views/finance/detail/index.vue b/rlz-ui/src/views/finance/detail/index.vue new file mode 100644 index 0000000..5949096 --- /dev/null +++ b/rlz-ui/src/views/finance/detail/index.vue @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + 导出 + + + + + + + + + + + {{ scope.row.type == '1' ? '+' : '-' }}{{ scope.row.jine }} + + + + + + + {{ scope.row.type == '1' ? '收入' : '支出' }} + + + + + + + + + + + + + diff --git a/rlz-ui/src/views/finance/income/index.vue b/rlz-ui/src/views/finance/income/index.vue new file mode 100644 index 0000000..bc795a6 --- /dev/null +++ b/rlz-ui/src/views/finance/income/index.vue @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + 总收入(元) + {{ summary.totalIncome || 0 }} + + + + + 退款总额(元) + {{ summary.totalRefund || 0 }} + + + + + 净收入(元) + {{ summary.netIncome || 0 }} + + + + + 订单总数 + {{ summary.totalOrders || 0 }} + + + + + + + + + 收入趋势 + + + + + + 订单类别分布 + + + + + + + + + + diff --git a/rlz-ui/src/views/finance/refund/index.vue b/rlz-ui/src/views/finance/refund/index.vue new file mode 100644 index 0000000..1ee0454 --- /dev/null +++ b/rlz-ui/src/views/finance/refund/index.vue @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + + + + + + + + + + {{ scope.row.jiesuanMoney || scope.row.yuguMoney || '-' }} + + + + + + {{ statusMap[scope.row.status] || scope.row.status }} + + + + + + + + 通过 + 拒绝 + 详情 + + + + + + + + + + + + {{ approveForm.approved ? '同意退款' : '拒绝退款' }} + + + + + + + + + + + + + {{ detail.orderNumber }} + + + {{ statusMap[detail.status] || detail.status }} + + + {{ detail.usercName || '-' }} + {{ detail.usercPhonenumber || '-' }} + {{ detail.userbName || '-' }} + {{ detail.userbPhonenumber || '-' }} + {{ detail.hospitalName || '-' }} + {{ detail.jiesuanMoney || detail.yuguMoney || '-' }} + {{ detail.remark || '-' }} + {{ detail.createTime }} + + + + + + diff --git a/rlz-ui/src/views/finance/settlement/index.vue b/rlz-ui/src/views/finance/settlement/index.vue new file mode 100644 index 0000000..2c9ac7e --- /dev/null +++ b/rlz-ui/src/views/finance/settlement/index.vue @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + + + + + 导出 + + + + + + + + + + + + + {{ scope.row.jiesuanMoney || scope.row.yuguMoney || '-' }} + + + + + + {{ statusMap[scope.row.status] || scope.row.status }} + + + + + + + 结算 + 详情 + + + + + + + + + + + {{ settleForm.orderNumber }} + + + {{ settleForm.userbName }} + + + + 元 + + + + + + + + + + {{ detail.orderNumber }} + + + {{ statusMap[detail.status] || detail.status }} + + + {{ detail.usercName || '-' }} + {{ detail.userbName || '-' }} + {{ detail.hospitalName || '-' }} + {{ detail.jiesuanMoney || detail.yuguMoney || '-' }} + {{ detail.kouchuMoney || '-' }} + {{ detail.fanxianMoney || '-' }} + {{ detail.createTime }} + + + + + + diff --git a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderViewController.java b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderViewController.java index 9650184..94dce42 100644 --- a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderViewController.java +++ b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/controller/OrderViewController.java @@ -113,6 +113,30 @@ public class OrderViewController extends BaseController util.exportExcel(response, list, "VIEW数据"); } + /** + * 收入统计 + */ + @GetMapping("/incomeStats") + public AjaxResult incomeStats(java.util.Map params) + { + java.util.Map result = new java.util.HashMap<>(); + java.util.List> trend = iRlzOrderService.getIncomeStats(params); + + double totalIncome = 0; + double totalRefund = 0; + long totalOrders = 0; + for (java.util.Map row : trend) { + totalIncome += ((Number) row.getOrDefault("income", 0)).doubleValue(); + totalRefund += ((Number) row.getOrDefault("refund", 0)).doubleValue(); + totalOrders += ((Number) row.getOrDefault("orderCount", 0)).longValue(); + } + result.put("totalIncome", String.format("%.2f", totalIncome)); + result.put("totalRefund", String.format("%.2f", totalRefund)); + result.put("totalOrders", totalOrders); + result.put("trend", trend); + return AjaxResult.success(result); + } + /** * 获取VIEW详细信息 */ diff --git a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RlzOrderMapper.java b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RlzOrderMapper.java index 65c954b..b07b021 100644 --- a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RlzOrderMapper.java +++ b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/mapper/RlzOrderMapper.java @@ -58,4 +58,9 @@ public interface RlzOrderMapper * @return 结果 */ public int deleteRlzOrderByOrderIds(Long[] orderIds); + + /** + * 收入统计 + */ + public List> getIncomeStats(java.util.Map params); } diff --git a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/IRlzOrderService.java b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/IRlzOrderService.java index 9c305d0..491907f 100644 --- a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/IRlzOrderService.java +++ b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/IRlzOrderService.java @@ -76,4 +76,6 @@ public interface IRlzOrderService public String refundOrder(CreateRequest request) throws NotFoundException, IOException, GeneralSecurityException, HttpCodeException; Long insertOrderPz(RlzOrder rlzOrder); + + List> getIncomeStats(java.util.Map params); } diff --git a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RlzOrderServiceImpl.java b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RlzOrderServiceImpl.java index 43252c8..9100097 100644 --- a/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RlzOrderServiceImpl.java +++ b/rlz/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/RlzOrderServiceImpl.java @@ -344,4 +344,9 @@ public String weixinPayOrderNext(String decryptOrder) { private RequestBody createRequestBody(Object request) { return new JsonRequestBody.Builder().body(toJson(request)).build(); } + + @Override + public List> getIncomeStats(java.util.Map params) { + return rlzOrderMapper.getIncomeStats(params); + } } diff --git a/rlz/ruoyi-system/src/main/resources/mapper/system/RlzOrderMapper.xml b/rlz/ruoyi-system/src/main/resources/mapper/system/RlzOrderMapper.xml index dbf9a15..61f36ae 100644 --- a/rlz/ruoyi-system/src/main/resources/mapper/system/RlzOrderMapper.xml +++ b/rlz/ruoyi-system/src/main/resources/mapper/system/RlzOrderMapper.xml @@ -238,9 +238,25 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - delete from rlz_order where order_id in + delete from rlz_order where order_id in #{orderId} + + + SELECT + + DATE_FORMAT(create_time, '%Y') + DATE_FORMAT(create_time, '%Y-%m') + DATE(create_time) + as date, + COUNT(*) as orderCount, + COALESCE(SUM(CASE WHEN status IN ('4','8') THEN CAST(COALESCE(NULLIF(jiesuan_money,''), yugu_money) AS DECIMAL(10,2)) ELSE 0 END), 0) as income, + COALESCE(SUM(CASE WHEN status = '7' THEN CAST(COALESCE(NULLIF(jiesuan_money,''), yugu_money) AS DECIMAL(10,2)) ELSE 0 END), 0) as refund + FROM rlz_order + WHERE create_time BETWEEN #{startDate} AND CONCAT(#{endDate}, ' 23:59:59') + GROUP BY date + ORDER BY date + \ No newline at end of file