leniu-dev 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/mysql-config.json +34 -0
- package/.claude/skills/jenkins-deploy/SKILL.md +21 -5
- package/.claude/skills/jenkins-deploy/assets/jk_build.py +29 -14
- package/.claude/skills/leniu-java-amount-handling/SKILL.md +461 -0
- package/.claude/skills/leniu-java-export/SKILL.md +570 -0
- package/.claude/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.claude/skills/leniu-java-total-line/SKILL.md +196 -0
- package/.claude/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.claude/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.claude/skills/leniu-mealtime/SKILL.md +215 -0
- package/.claude/skills/leniu-report-customization/SKILL.md +415 -0
- package/.claude/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.claude/skills/leniu-report-standard-customization/SKILL.md +391 -0
- package/.claude/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.claude/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.claude/skills/loki-log-query/SKILL.md +25 -55
- package/.claude/skills/loki-log-query/environments.json +45 -0
- package/.claude/skills/mysql-debug/SKILL.md +6 -12
- package/.codex/skills/jenkins-deploy/SKILL.md +21 -5
- package/.codex/skills/jenkins-deploy/assets/env_param.template.json +51 -0
- package/.codex/skills/jenkins-deploy/assets/jk_build.py +415 -0
- package/.codex/skills/leniu-java-export/SKILL.md +570 -0
- package/.codex/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.codex/skills/leniu-java-total-line/SKILL.md +196 -0
- package/.codex/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.codex/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.codex/skills/leniu-mealtime/SKILL.md +215 -0
- package/.codex/skills/leniu-report-customization/SKILL.md +415 -0
- package/.codex/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.codex/skills/leniu-report-standard-customization/SKILL.md +391 -0
- package/.codex/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.codex/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.codex/skills/loki-log-query/SKILL.md +25 -55
- package/.codex/skills/mysql-debug/SKILL.md +6 -12
- package/.cursor/skills/jenkins-deploy/SKILL.md +21 -5
- package/.cursor/skills/jenkins-deploy/assets/env_param.template.json +51 -0
- package/.cursor/skills/jenkins-deploy/assets/jk_build.py +415 -0
- package/.cursor/skills/leniu-java-export/SKILL.md +570 -0
- package/.cursor/skills/leniu-java-report-query-param/SKILL.md +291 -0
- package/.cursor/skills/leniu-java-total-line/SKILL.md +196 -0
- package/.cursor/skills/leniu-marketing-price-rule-customizer/SKILL.md +301 -0
- package/.cursor/skills/leniu-marketing-recharge-rule-customizer/SKILL.md +285 -0
- package/.cursor/skills/leniu-mealtime/SKILL.md +215 -0
- package/.cursor/skills/leniu-report-customization/SKILL.md +415 -0
- package/.cursor/skills/leniu-report-customization/references/table-fields.md +93 -0
- package/.cursor/skills/leniu-report-standard-customization/SKILL.md +391 -0
- package/.cursor/skills/leniu-report-standard-customization/references/analysis-module.md +64 -0
- package/.cursor/skills/leniu-report-standard-customization/references/table-fields.md +113 -0
- package/.cursor/skills/loki-log-query/SKILL.md +25 -55
- package/.cursor/skills/mysql-debug/SKILL.md +6 -12
- package/bin/index.js +59 -15
- package/package.json +1 -1
- package/src/skills/jenkins-deploy/SKILL.md +150 -0
- package/src/skills/jenkins-deploy/assets/env_param.template.json +51 -0
- package/src/skills/jenkins-deploy/assets/jk_build.py +415 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# 报表基础表完整字段说明
|
|
2
|
+
|
|
3
|
+
## report_order_info(报表订单主表)
|
|
4
|
+
|
|
5
|
+
> v5.29 后,正向下单和逆向退款**都存在这张表中**,通过 `consumeType` 区分。
|
|
6
|
+
|
|
7
|
+
| 字段 | 类型 | 说明 |
|
|
8
|
+
|------|------|------|
|
|
9
|
+
| `orderId` | Long | 主键。正向=订单ID,退款=退款单ID |
|
|
10
|
+
| `relationOrderId` | Long | 关联订单ID(退款记录指向原始订单) |
|
|
11
|
+
| `consumeType` | Integer | **1=消费,2=退款** |
|
|
12
|
+
| `orderRefundState` | Integer | **1=未退单,2=已退单(全退),3=部分退单** |
|
|
13
|
+
| `payableAmount` | BigDecimal | 应付金额(分) |
|
|
14
|
+
| `realAmount` | BigDecimal | 实付金额(分) |
|
|
15
|
+
| `refundAmount` | BigDecimal | 累计退款金额(分) |
|
|
16
|
+
| `realRefundAmount` | BigDecimal | 实际退款金额(分,退款记录为负数) |
|
|
17
|
+
| `walletAmount` | BigDecimal | 个人钱包支付金额(分) |
|
|
18
|
+
| `subsidyAmount` | BigDecimal | 补贴钱包支付金额(分) |
|
|
19
|
+
| `redEnvelopeAmount` | BigDecimal | 红包支付金额(分) |
|
|
20
|
+
| `accPayAmount` | BigDecimal | 账户支付金额(分) |
|
|
21
|
+
| `outPayAmount` | BigDecimal | 外部支付金额(分) |
|
|
22
|
+
| `payTime` | LocalDateTime | 支付时间(退款=审核时间) |
|
|
23
|
+
| `orderTime` | LocalDateTime | 下单时间 |
|
|
24
|
+
| `orderDate` | LocalDate | 就餐日期 |
|
|
25
|
+
| `status` | Integer | 消费状态:0=未消费,1=已消费 |
|
|
26
|
+
| `mealtimeType` | Integer | 餐次类型 |
|
|
27
|
+
| `orderType` | Integer | 订单类型(1当餐/2预订/3报餐/4扫码/5餐桌/6自助/11商城/12超市/21补扣/22外部) |
|
|
28
|
+
| `canteenId/canteenName` | Long/String | 食堂 |
|
|
29
|
+
| `stallId/stallName` | Long/String | 档口 |
|
|
30
|
+
| `areaId/areaName` | Long/String | 区域 |
|
|
31
|
+
| `custId/custName/custNum` | - | 用户信息 |
|
|
32
|
+
| `orgId/orgFullId/orgName/orgFullName` | - | 组织信息 |
|
|
33
|
+
| `payType` | Integer | 支付方式 |
|
|
34
|
+
| `payChannel` | Integer | 支付渠道 |
|
|
35
|
+
| `nuClearMode` | Integer | 核身方式(1刷卡/2刷脸/3扫码) |
|
|
36
|
+
| `sourceType` | Integer | 来源类型 |
|
|
37
|
+
| `ifOnline` | Integer | 是否在线订单(1是/2否) |
|
|
38
|
+
| `psnType/psnTypeName` | Integer/String | 用户类别 |
|
|
39
|
+
| `personType` | Integer | 人员归类(1职工/2患者/3陪护/4其他,医院版) |
|
|
40
|
+
|
|
41
|
+
## report_order_detail(报表订单菜品明细表)
|
|
42
|
+
|
|
43
|
+
| 字段 | 类型 | 说明 |
|
|
44
|
+
|------|------|------|
|
|
45
|
+
| `detailId` | Long | 明细主键 |
|
|
46
|
+
| `orderId` | Long | 关联订单ID |
|
|
47
|
+
| `goodsDishesId/goodsDishesName` | Long/String | 菜品信息 |
|
|
48
|
+
| `salePrice` | BigDecimal | 售卖价格(分) |
|
|
49
|
+
| `prefPrice` | BigDecimal | 优惠价格(分) |
|
|
50
|
+
| `price` | BigDecimal | 计算价格(分,最终价格) |
|
|
51
|
+
| `quantity` | Integer | 数量/重量 |
|
|
52
|
+
| `totalAmount` | BigDecimal | 订单详情总金额(分) |
|
|
53
|
+
| `realAmount` | BigDecimal | 实际付款金额(分) |
|
|
54
|
+
| `detailState` | Integer | **1=正常,2=已退菜(全退),3=部分退菜** |
|
|
55
|
+
| `goodsRefundNum` | Integer | 商品已退数量 |
|
|
56
|
+
| `refundAmount` | BigDecimal | 商品退款金额(分) |
|
|
57
|
+
| `detailType` | Integer | 明细类别(1菜品/2套餐/3商品/4按键/5补扣/6报餐) |
|
|
58
|
+
| `costPrice` | BigDecimal | 成本价格 |
|
|
59
|
+
|
|
60
|
+
## report_account_flow(账户变动流水主表)
|
|
61
|
+
|
|
62
|
+
| 字段 | 类型 | 说明 |
|
|
63
|
+
|------|------|------|
|
|
64
|
+
| `flowId` | Long | 主键(雪花ID) |
|
|
65
|
+
| `custId` | Long | 人员ID |
|
|
66
|
+
| `flowType` | Integer | 交易类型(AccTradeTypeEnum) |
|
|
67
|
+
| `flowRealAmount` | BigDecimal | 实际交易金额 |
|
|
68
|
+
| `flowAmount` | BigDecimal | 交易金额 |
|
|
69
|
+
| `accTotalBal` | BigDecimal | 所有钱包可用余额之和(不含冻结) |
|
|
70
|
+
| `accAllBal` | BigDecimal | 所有钱包总余额(含冻结) |
|
|
71
|
+
| `payTime` | LocalDateTime | 支付时间 |
|
|
72
|
+
| `ordTime` | LocalDateTime | 订单时间 |
|
|
73
|
+
| `status` | Integer | 消费状态:0=未消费,1=已消费 |
|
|
74
|
+
| `manageCost` | BigDecimal | 管理费 |
|
|
75
|
+
| `rechargeSource` | Integer | 充值来源 |
|
|
76
|
+
| `payChannel` | Integer | 支付渠道 |
|
|
77
|
+
| `payType` | Integer | 支付方式 |
|
|
78
|
+
|
|
79
|
+
> 注意:`custName`、`mobile`、`mobileSuffix` 使用 SM4 加密存储。
|
|
80
|
+
|
|
81
|
+
## report_account_flow_detail(账户流水钱包明细表)
|
|
82
|
+
|
|
83
|
+
| 字段 | 类型 | 说明 |
|
|
84
|
+
|------|------|------|
|
|
85
|
+
| `id` | Long | 自增主键 |
|
|
86
|
+
| `flowId` | Long | 关联主流水 |
|
|
87
|
+
| `walletId` | Long | 钱包类型(AccWalletIdEnum) |
|
|
88
|
+
| `flowType` | Integer | 交易类型 |
|
|
89
|
+
| `amount` | BigDecimal | 本钱包支付金额(转出类型取负值) |
|
|
90
|
+
| `walletBal` | BigDecimal | 本钱包可用余额 |
|
|
91
|
+
| `allWalletBal` | BigDecimal | 本钱包总余额(含冻结) |
|
|
92
|
+
| `frozenBalance` | BigDecimal | 冻结余额 |
|
|
93
|
+
| `payTime` | LocalDateTime | 支付时间 |
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: leniu-report-standard-customization
|
|
3
|
+
description: |
|
|
4
|
+
leniu-tengyun-core 标准版(core-report 模块)定制报表开发指南。基于独立 report_order_info / report_refund / report_account_flow 等报表基础表实现汇总报表。
|
|
5
|
+
|
|
6
|
+
触发场景:
|
|
7
|
+
- 在标准版(core-report 模块)中开发定制汇总报表
|
|
8
|
+
- 基于标准版退款表(report_refund)处理退款统计
|
|
9
|
+
- 开发账户流水报表(日结/操作员/钱包消费/消费汇总)
|
|
10
|
+
- 开发经营分析报表(营业额/用户/菜品/评价/充值/设备分析)
|
|
11
|
+
- 开发商户维度的消费/充值汇总报表
|
|
12
|
+
|
|
13
|
+
触发词:标准版报表、core-report、report_refund、report_refund_detail、经营分析、营业额分析、用户活跃度、菜品排行、操作员统计、账户日结、钱包消费汇总、商户消费汇总、ReportOrderConsumeService、ReportAccountConsumeService
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# leniu 标准版定制报表开发指南
|
|
17
|
+
|
|
18
|
+
> 详细字段说明见 `references/table-fields.md`,经营分析详情见 `references/analysis-module.md`
|
|
19
|
+
|
|
20
|
+
## 版本识别(必读)
|
|
21
|
+
|
|
22
|
+
**本 skill 仅适用于标准版(core-report 独立模块)**。
|
|
23
|
+
|
|
24
|
+
| 判断方式 | 标准版(本指南) | v5.29 版本 |
|
|
25
|
+
|---------|--------------|-----------|
|
|
26
|
+
| 目录结构 | `core-report/` 独立模块 | `sys-canteen/` 内嵌 |
|
|
27
|
+
| 退款存储 | 独立 `report_refund` 表(**正数**) | 合并入 `report_order_info`(`consumeType=2`,**负数**) |
|
|
28
|
+
| 第二阶段 | `fix()` 按日重算 | `batchConsume()` 增量累加 |
|
|
29
|
+
| consumeType | **无此字段** | 1=消费,2=退款 |
|
|
30
|
+
|
|
31
|
+
> v5.29 报表请使用 `leniu-report-customization`。钱包/交易类型枚举同 v5.29,参见该 skill。
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 一、报表系统架构
|
|
36
|
+
|
|
37
|
+
### 1.1 模块结构
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
core-report/.../statistics/
|
|
41
|
+
├── config/mq/ # MQ 监听器 + 消费调度 + 线程池
|
|
42
|
+
├── order/ # 订单报表(basic/summary/fix/analysis)
|
|
43
|
+
├── account/ # 账户流水报表
|
|
44
|
+
├── merchant/ # 商户维度报表
|
|
45
|
+
├── common/ # 错误日志/定时任务
|
|
46
|
+
└── param/vo/constants/ # 公共类
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### 1.2 三大 MQ 监听器
|
|
50
|
+
|
|
51
|
+
| 监听器 | Topic/Tag |
|
|
52
|
+
|-------|-----------|
|
|
53
|
+
| `ReportOrderMQListener` | `order / order-v3-placed` |
|
|
54
|
+
| `ReportOrderRefundMQListener` | `order / order-v3-refunded` |
|
|
55
|
+
| `ReportAccountMQListener` | `acc / acc-trade-report-queue` |
|
|
56
|
+
|
|
57
|
+
### 1.3 两阶段消费模型
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
第一阶段(ORDER < 10,同步写基础表)
|
|
61
|
+
├── ORDER=1 ReportOrderInfoService → report_order_info
|
|
62
|
+
├── ORDER=2 ReportOrderDiscountService → report_order_discount
|
|
63
|
+
├── ORDER=3 ReportOrderDetailService → report_order_detail
|
|
64
|
+
├── ORDER=4 ReportOrderPayService → report_order_pay
|
|
65
|
+
├── ORDER=5 ReportRefundService → report_refund
|
|
66
|
+
├── ORDER=6 ReportRefundDetailService → report_refund_detail
|
|
67
|
+
└── ORDER=11 ReportOrderInfoSnapshotService → report_order_info_snapshot
|
|
68
|
+
|
|
69
|
+
第二阶段(ORDER >= 10,fix 按日重算汇总表,由 Redis 计数触发)
|
|
70
|
+
├── ORDER=13 ReportSumMealtimeService → 分餐次汇总
|
|
71
|
+
├── ORDER=16 ReportSumPayService → 支付渠道汇总
|
|
72
|
+
├── ORDER=17 ReportSumPayMerService → 商户支付汇总
|
|
73
|
+
├── ORDER=18 ReportSumDishesService → 菜品销售汇总
|
|
74
|
+
├── ORDER=50 ReportAnalysisCustService → 用户分析
|
|
75
|
+
└── ORDER=51 ReportAnalysisDishesSaleService→ 菜品销售分析
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 1.4 第二阶段核心逻辑(fix 重算模式)
|
|
79
|
+
|
|
80
|
+
```java
|
|
81
|
+
// ReportConsumerService.consumeOrderReport()
|
|
82
|
+
void consumeOrderReport() {
|
|
83
|
+
for (TenantInfo tenant : allTenants) {
|
|
84
|
+
Executors.doInTenant(tenant.getId(), () -> {
|
|
85
|
+
RLock lock = RedisUtil.getLock(REPORT_ORDER_LOCK);
|
|
86
|
+
lock.lock(120, TimeUnit.MINUTES);
|
|
87
|
+
try {
|
|
88
|
+
List<ReportNotConsumeDTO> list = reportOrderInfoService.queryNotConsumeData();
|
|
89
|
+
// 菜品:按 orderDate 分组调 fix
|
|
90
|
+
// 其他:按 statisticDate 分组,依次调所有 ORDER>=10 的 fix()
|
|
91
|
+
reportOrderInfoService.updateOrderMsg(list); // 标记已消费
|
|
92
|
+
} finally { lock.unlock(); }
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**触发机制**:Redis 计数器每条消息递减,达阈值(默认100)触发 + XxlJob 定时兜底。
|
|
99
|
+
|
|
100
|
+
---
|
|
101
|
+
|
|
102
|
+
## 二、核心基础表概要
|
|
103
|
+
|
|
104
|
+
### 2.1 report_order_info(仅存正向订单,无 consumeType)
|
|
105
|
+
|
|
106
|
+
关键字段:`orderId`(主键), `canteenId/stallId`, `mealtimeType`, `orderType`, `payableAmount/realAmount/refundAmount`(分), `accPayAmount/outPayAmount`, `payTime/orderDate`, `orderRefundState`(1未退/2全退/3部分退), `status`(0未消费/1已消费), `nuClearMode`, `psnType`, `ageType/holidayType`
|
|
107
|
+
|
|
108
|
+
### 2.2 report_order_detail(菜品明细)
|
|
109
|
+
|
|
110
|
+
关键字段:`detailId`, `orderId`, `goodsDishesId/goodsDishesName`, `price/totalAmount/realAmount`(分), `quantity`, `salesMode`(1按份/2称重), `detailState`(1正常/2全退/3部分退), `goodsRefundNum`, `refundAmount`, `detailType`
|
|
111
|
+
|
|
112
|
+
### 2.3 report_refund / report_refund_detail(标准版特有,退款为正数)
|
|
113
|
+
|
|
114
|
+
**report_refund**:`orderRefundId`(主键), `orderId`(原订单), `realRefundAmount`(**正数**), `applyType`(1退单/2纠错), `checkTime`
|
|
115
|
+
|
|
116
|
+
**report_refund_detail**:`orderRefundId`, `detailId`, `realQuantity`, `realRefundAmount`(**正数**)
|
|
117
|
+
|
|
118
|
+
### 2.4 其他基础表
|
|
119
|
+
|
|
120
|
+
- **report_order_pay**:`orderId`, `payType/payChannel`, `payAmount/refundAmount`
|
|
121
|
+
- **report_order_discount**:`orderId`, `changeAmount`, `changeType`(1上浮/2优惠), `changeDetailType`
|
|
122
|
+
- **report_order_info_snapshot**:订单交易快照
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 三、退款数据处理(核心重点)
|
|
127
|
+
|
|
128
|
+
### 3.1 存储模型
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
正向订单 → report_order_info(realAmount 为正)
|
|
132
|
+
退款记录 → report_refund(realRefundAmount 为正)+ report_refund_detail
|
|
133
|
+
同时更新 → report_order_info.orderRefundState + refundAmount
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### 3.2 净消费金额计算(3种方式)
|
|
137
|
+
|
|
138
|
+
**方式一:主表 refundAmount 减退(推荐)**
|
|
139
|
+
```sql
|
|
140
|
+
SELECT SUM(real_amount - IFNULL(refund_amount, 0)) AS netAmount
|
|
141
|
+
FROM report_order_info WHERE pay_time BETWEEN #{start} AND #{end}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**方式二:排除全退**
|
|
145
|
+
```sql
|
|
146
|
+
WHERE order_refund_state IN (1, 3)
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**方式三:关联 report_refund**
|
|
150
|
+
```sql
|
|
151
|
+
SELECT o.canteen_id, SUM(o.real_amount) AS consume, IFNULL(SUM(r.real_refund_amount), 0) AS refund
|
|
152
|
+
FROM report_order_info o LEFT JOIN report_refund r ON o.order_id = r.order_id
|
|
153
|
+
GROUP BY o.canteen_id
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### 3.3 菜品级别退款
|
|
157
|
+
|
|
158
|
+
```sql
|
|
159
|
+
SELECT goods_dishes_name,
|
|
160
|
+
SUM(quantity - IFNULL(goods_refund_num, 0)) AS netQuantity,
|
|
161
|
+
SUM(total_amount - IFNULL(refund_amount, 0)) AS netAmount
|
|
162
|
+
FROM report_order_detail WHERE detail_state IN (1, 3) GROUP BY goods_dishes_name
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 四、账户流水报表
|
|
168
|
+
|
|
169
|
+
### 4.1 report_account_flow(流水主表)
|
|
170
|
+
|
|
171
|
+
核心字段:`flowId`, `custId/orgId`, `payTime`, `flowType`(AccTradeTypeEnum), `flowRealAmount/flowAmount`, `manageCost`, `accTotalBal/accAllBal`, `status`
|
|
172
|
+
|
|
173
|
+
### 4.2 report_account_summary(用户账户日结表)
|
|
174
|
+
|
|
175
|
+
联合主键:`statisticDate` + `custId`。期末余额 = 期初 + 充值 - 撤销充值 + 补贴 - 撤销补贴 + 红包 + 赠送 - 消费 - 补扣 + 退款 - 提现 - 清空 - 管理费
|
|
176
|
+
|
|
177
|
+
### 4.3 AccountConsumeService 实现
|
|
178
|
+
|
|
179
|
+
| ORDER | 类 | 汇总表 |
|
|
180
|
+
|-------|---|-------|
|
|
181
|
+
| 1/2 | Flow/FlowDetail | 基础表 |
|
|
182
|
+
| 13 | AccountSummary | 日结 |
|
|
183
|
+
| 14 | AccountOperator | 操作员 |
|
|
184
|
+
| 15-17 | ConsumeSummary/Org/Type | 消费维度 |
|
|
185
|
+
| 18 | WalletConsume | 钱包 |
|
|
186
|
+
| 19 | SumRechargeMer | 商户充值 |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 五、汇总表开发标准模式
|
|
191
|
+
|
|
192
|
+
### 5.1 接口与实现
|
|
193
|
+
|
|
194
|
+
```java
|
|
195
|
+
@Service @Slf4j
|
|
196
|
+
public class ReportSumXxxService implements ReportOrderConsumeService {
|
|
197
|
+
@Override public int getOrder() { return 15; } // 10-29普通,30+菜品,50+分析
|
|
198
|
+
|
|
199
|
+
@Override public void consume(OrderChangePO payload, ReportOrderInfoDTO baseInfo) {
|
|
200
|
+
// 标准版:留空,由 fix() 统一处理
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
@Override public void fix(ReportBaseParam param) {
|
|
204
|
+
LocalDateTime start = param.getStartPayTime(), end = param.getEndPayTime();
|
|
205
|
+
mapper.delete(Wrappers.<ReportSumXxx>lambdaQuery()
|
|
206
|
+
.between(ReportSumXxx::getStatisticDate, start.toLocalDate(), end.toLocalDate()));
|
|
207
|
+
mapper.initFix(start, end);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### 5.2 fix SQL 模板
|
|
213
|
+
|
|
214
|
+
```xml
|
|
215
|
+
<insert id="initFix">
|
|
216
|
+
INSERT INTO report_sum_xxx (id, statistic_date, canteen_id, canteen_name,
|
|
217
|
+
order_count, consume_amount, refund_amount, net_amount)
|
|
218
|
+
SELECT #{id}, DATE(a.pay_time), a.canteen_id, a.canteen_name,
|
|
219
|
+
COUNT(*), SUM(a.real_amount),
|
|
220
|
+
SUM(IFNULL(a.refund_amount, 0)),
|
|
221
|
+
SUM(a.real_amount - IFNULL(a.refund_amount, 0))
|
|
222
|
+
FROM report_order_info a
|
|
223
|
+
WHERE a.pay_time BETWEEN #{startTime} AND #{endTime}
|
|
224
|
+
GROUP BY DATE(a.pay_time), a.canteen_id, a.canteen_name
|
|
225
|
+
</insert>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 5.3 查询接口(并行 + 权限)
|
|
229
|
+
|
|
230
|
+
```java
|
|
231
|
+
public ReportBaseTotalVO<XxxVO> pageSummary(XxxParam param) {
|
|
232
|
+
MgrUserAuthPO authPO = MgrUserAuthApi.getUserAuthPO();
|
|
233
|
+
CompletableFuture<List<XxxVO>> listF = supplyAsync(() -> mapper.listSummary(param, authPO));
|
|
234
|
+
CompletableFuture<XxxVO> totalF = supplyAsync(() -> mapper.getSummaryTotal(param, authPO));
|
|
235
|
+
CompletableFuture.allOf(listF, totalF).join();
|
|
236
|
+
return new ReportBaseTotalVO<>(PageVO.of(listF.join(), param.getPage()), totalF.join());
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
权限 SQL:
|
|
241
|
+
```xml
|
|
242
|
+
<if test="'-1'.toString() != authPO.roleType.toString()">
|
|
243
|
+
AND EXISTS (SELECT null FROM mgr_role_org it1
|
|
244
|
+
WHERE a.org_id = it1.org_id AND it1.role_id = #{authPO.roleId})
|
|
245
|
+
</if>
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 六、汇总模型速查
|
|
251
|
+
|
|
252
|
+
| 表 | 维度 | 金额 |
|
|
253
|
+
|----|------|------|
|
|
254
|
+
| report_sum_mealtime | date/canteen/stall/org/age/mealtime/psn/machine/source | custNum/consumeNum/realAmount/refundAmount |
|
|
255
|
+
| report_sum_pay | date/mealtime/canteen/stall/org/age/payChannel/payType | payNum/realAmount/refundAmount |
|
|
256
|
+
| report_sum_dishes | date/area/canteen/stall/reportOrderType/mealtime/cook/device/dishes/salesMode/detailType | quantity/realAmount |
|
|
257
|
+
| report_sum_pay_mer | tenantId/date/payChannel/payType | custNum/payNum/realAmount/refundAmount |
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## 七、经营分析模块
|
|
262
|
+
|
|
263
|
+
| 分析 | Service | 路由前缀 |
|
|
264
|
+
|-----|---------|---------|
|
|
265
|
+
| 营业额 | ReportAnalysisTurnoverService | `/summary/analysis/turnover/` |
|
|
266
|
+
| 用户 | ReportAnalysisCustService (ORDER=50) | `/summary/analysis/cust/` |
|
|
267
|
+
| 菜品 | ReportAnalysisDishesSaleService (ORDER=51) | `/summary/analysis/dishes/` |
|
|
268
|
+
| 满意度 | ReportAnalysisEvaluateService | `/summary/analysis/evaluate/` |
|
|
269
|
+
| 充值 | ReportAnalysisTurnoverService | `/summary/analysis/recharge/` |
|
|
270
|
+
| 设备 | ReportAnalysisTurnoverService | `/summary/analysis/device/` |
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## 八、公共模块
|
|
275
|
+
|
|
276
|
+
- **报表错误日志**(report_error_log):`reportErrorType`(1账户/2订单), `reportErrorState`(1已创建/2已处理)。定时任务 `@XxlJob("reportExceptionHandle")` 自动修复。
|
|
277
|
+
- **金额范围设置**:`POST /report/alloc/amount-scope/save`
|
|
278
|
+
- **数据修复**:`POST /summary/fix/order|account`(限31天,Redisson 锁 120 分钟)
|
|
279
|
+
|
|
280
|
+
### 核心枚举
|
|
281
|
+
|
|
282
|
+
| 枚举 | 值 |
|
|
283
|
+
|------|---|
|
|
284
|
+
| ReportClassifyEnum | 1组织/2类别/3食堂/4设备/5收入/6渠道/7餐次 |
|
|
285
|
+
| ReportPayTypeEnum | 1微信/2支付宝/3系统账户/9现金/20其他 |
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
## 九、MySQL only_full_group_by 规范(必须遵守)
|
|
290
|
+
|
|
291
|
+
> MySQL 默认开启 `sql_mode=ONLY_FULL_GROUP_BY`,SELECT 中所有非聚合列必须出现在 GROUP BY 中,且 GROUP BY 表达式必须与 SELECT 表达式**完全一致**。
|
|
292
|
+
|
|
293
|
+
### 核心规则
|
|
294
|
+
|
|
295
|
+
**SELECT 的表达式 == GROUP BY 的表达式**(字符级别完全一致)
|
|
296
|
+
|
|
297
|
+
### ❌ 错误示例(GROUP BY 与 SELECT 不一致)
|
|
298
|
+
|
|
299
|
+
```xml
|
|
300
|
+
<!-- 报错:Expression #1 of SELECT list is not in GROUP BY clause -->
|
|
301
|
+
SELECT
|
|
302
|
+
DATE_FORMAT(roi.consume_time, '%Y-%m-%d') AS statisticDate,
|
|
303
|
+
SUM(roi.real_amount) AS totalAmount
|
|
304
|
+
FROM report_order_info roi
|
|
305
|
+
GROUP BY DATE(roi.consume_time) <!-- ❌ DATE() ≠ DATE_FORMAT(..., '%Y-%m-%d') -->
|
|
306
|
+
ORDER BY DATE(roi.consume_time)
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### ✅ 正确示例(GROUP BY 与 SELECT 完全一致)
|
|
310
|
+
|
|
311
|
+
```xml
|
|
312
|
+
SELECT
|
|
313
|
+
DATE_FORMAT(roi.consume_time, '%Y-%m-%d') AS statisticDate,
|
|
314
|
+
SUM(roi.real_amount) AS totalAmount
|
|
315
|
+
FROM report_order_info roi
|
|
316
|
+
GROUP BY DATE_FORMAT(roi.consume_time, '%Y-%m-%d') <!-- ✅ 与 SELECT 完全一致 -->
|
|
317
|
+
ORDER BY DATE_FORMAT(roi.consume_time, '%Y-%m-%d') <!-- ✅ ORDER BY 也保持一致 -->
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### ❌ 错误示例(SELECT 含非聚合列未加入 GROUP BY)
|
|
321
|
+
|
|
322
|
+
```xml
|
|
323
|
+
SELECT
|
|
324
|
+
roi.canteen_id,
|
|
325
|
+
roi.canteen_name, <!-- ❌ 非聚合列未在 GROUP BY 中 -->
|
|
326
|
+
SUM(roi.real_amount) AS totalAmount
|
|
327
|
+
FROM report_order_info roi
|
|
328
|
+
GROUP BY roi.canteen_id
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
### ✅ 正确示例(所有非聚合列都在 GROUP BY 中)
|
|
332
|
+
|
|
333
|
+
```xml
|
|
334
|
+
SELECT
|
|
335
|
+
roi.canteen_id,
|
|
336
|
+
roi.canteen_name,
|
|
337
|
+
SUM(roi.real_amount) AS totalAmount
|
|
338
|
+
FROM report_order_info roi
|
|
339
|
+
GROUP BY roi.canteen_id, roi.canteen_name <!-- ✅ 所有非聚合列都在 GROUP BY -->
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### 检查清单
|
|
343
|
+
|
|
344
|
+
- [ ] SELECT 中按日期分组时使用 `DATE_FORMAT(col, '%Y-%m-%d')`,**不要用 `DATE()`**
|
|
345
|
+
- [ ] GROUP BY 表达式与 SELECT 中对应列**逐字相同**(复制粘贴而非重写)
|
|
346
|
+
- [ ] ORDER BY 中同样使用与 GROUP BY 一致的表达式
|
|
347
|
+
- [ ] SELECT 中所有非聚合列(无 SUM/COUNT/AVG/MAX/MIN 包裹)都出现在 GROUP BY 中
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 十、开发检查清单
|
|
352
|
+
|
|
353
|
+
### 建表
|
|
354
|
+
- [ ] 分组维度 + 金额汇总 + 审计字段(crby/crtime/upby/uptime/del_flag),无 tenant_id
|
|
355
|
+
|
|
356
|
+
### 实现
|
|
357
|
+
- [ ] 实现 `ReportOrderConsumeService`,设 `getOrder()`
|
|
358
|
+
- [ ] `fix()` 先删后插(**标准版核心模式**),`consume()` 留空
|
|
359
|
+
|
|
360
|
+
### 退款(标准版特有)
|
|
361
|
+
- [ ] 退款在独立 `report_refund` 表(**正数金额**)
|
|
362
|
+
- [ ] 净消费 = `real_amount - IFNULL(refund_amount, 0)`
|
|
363
|
+
- [ ] **不要使用 consumeType 字段**
|
|
364
|
+
|
|
365
|
+
### 查询
|
|
366
|
+
- [ ] ReportBaseTotalVO + CompletableFuture 并行 + MgrUserAuthPO 权限
|
|
367
|
+
- [ ] GROUP BY / ORDER BY 表达式与 SELECT 完全一致(only_full_group_by)
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
## 十一、关键代码位置
|
|
372
|
+
|
|
373
|
+
> 路径前缀均为 `core-report/.../statistics/`
|
|
374
|
+
|
|
375
|
+
| 类型 | 路径 |
|
|
376
|
+
|------|------|
|
|
377
|
+
| MQ 监听器 | `config/mq/ReportOrderMQListener.java` / `ReportAccountMQListener.java` |
|
|
378
|
+
| 消费调度 | `config/mq/service/ReportConsumerService.java` |
|
|
379
|
+
| 订单基础表 | `order/basic/model/ReportOrderInfo.java` / `ReportRefund.java` |
|
|
380
|
+
| 汇总 Service | `order/summary/service/ReportSumMealtimeService.java` / `ReportSumPayService.java` |
|
|
381
|
+
| 分析 Service | `order/analysis/service/ReportAnalysisTurnoverService.java` |
|
|
382
|
+
| 账户 Service | `account/service/ReportAccountSummaryService.java` |
|
|
383
|
+
| Fix | `order/fix/controller/ReportFixController.java` |
|
|
384
|
+
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
## 注意
|
|
388
|
+
|
|
389
|
+
- 标准版退款为独立表(正数金额),**不要使用 consumeType 字段**
|
|
390
|
+
- 标准版第二阶段用 `fix()` 按日重算,**不要使用 batchConsume() 增量模式**
|
|
391
|
+
- CRUD 用 `leniu-crud-development`,MyBatis 用 `leniu-java-mybatis`,入参用 `leniu-java-report-query-param`,合计行用 `leniu-java-total-line`,餐次用 `leniu-mealtime`
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# 经营分析模块详情
|
|
2
|
+
|
|
3
|
+
## 分析类型总览
|
|
4
|
+
|
|
5
|
+
| 分析类型 | Service | 接口数 | 路由前缀 |
|
|
6
|
+
|---------|---------|-------|---------|
|
|
7
|
+
| 营业额 | ReportAnalysisTurnoverService | 6 | `/summary/analysis/turnover/` |
|
|
8
|
+
| 用户 | ReportAnalysisCustService (ORDER=50) | 8 | `/summary/analysis/cust/` |
|
|
9
|
+
| 菜品 | ReportAnalysisDishesSaleService (ORDER=51) | 10 | `/summary/analysis/dishes/` |
|
|
10
|
+
| 满意度 | ReportAnalysisEvaluateService | 2 | `/summary/analysis/evaluate/` |
|
|
11
|
+
| 充值 | ReportAnalysisTurnoverService | 4 | `/summary/analysis/recharge/` |
|
|
12
|
+
| 设备 | ReportAnalysisTurnoverService | 2 | `/summary/analysis/device/` |
|
|
13
|
+
|
|
14
|
+
## 用户活跃度分析
|
|
15
|
+
|
|
16
|
+
### 分段枚举
|
|
17
|
+
|
|
18
|
+
- `AnalysisConsumeTimesEnum`:消费次数分段(1-10/10-20/20-30/30-40/40-50/>=50)
|
|
19
|
+
- `AnalysisConsumeAmountEnum`:消费金额分段(<200/200-400/400-600/600-800/800-1000/>=1000元)
|
|
20
|
+
- `AnalysisConsumeSlienceEnum`:沉默时长分段
|
|
21
|
+
|
|
22
|
+
### 活跃度 VO
|
|
23
|
+
|
|
24
|
+
```java
|
|
25
|
+
// ReportAnalysisActiveVO
|
|
26
|
+
activeNumber/activePercent // 活跃用户(有消费记录)
|
|
27
|
+
keepNumber/keepPercent // 保留用户(持续消费)
|
|
28
|
+
lossNumber/lossPercent // 流失用户(不再消费)
|
|
29
|
+
newNumber/newPercent // 新增用户(首次消费)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## 公共参数类
|
|
33
|
+
|
|
34
|
+
```java
|
|
35
|
+
// ReportBaseParam(所有查询参数基类)
|
|
36
|
+
PageDTO page;
|
|
37
|
+
LocalDate startDate/endDate;
|
|
38
|
+
LocalDate startOrderDate/endOrderDate;
|
|
39
|
+
Integer sumType; // 汇总类型(1按时段/2按日期)
|
|
40
|
+
Integer sumDimension; // 汇总维度
|
|
41
|
+
List<Integer> ageTypes;
|
|
42
|
+
List<Integer> holidayTypeList;
|
|
43
|
+
List<String> exportCols;
|
|
44
|
+
LocalDateTime startPayTime/endPayTime;
|
|
45
|
+
|
|
46
|
+
// ReportNotConsumeDTO(未消费数据)
|
|
47
|
+
String statisticDate; // 统计日期(支付日期)
|
|
48
|
+
String orderDate; // 就餐日期(菜品统计专用)
|
|
49
|
+
Long relationId;
|
|
50
|
+
|
|
51
|
+
// 支付信息编码: "支付方式-支付渠道-支付金额" 如 "1-1-1200;2-4-1200"
|
|
52
|
+
// 优惠信息编码: "变动类型,详情类型,金额" 如 "1,1,100;2,11,200"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## API 路由总览
|
|
56
|
+
|
|
57
|
+
| 模块 | 前缀 | 核心接口 |
|
|
58
|
+
|------|------|---------|
|
|
59
|
+
| 营业收入明细 | `/summary/basic/` | flow/page, cust/page, remote/detail/page, remote/summary/page |
|
|
60
|
+
| 订单汇总 | `/summary/order/` | organization/pay/type/classify/mealtime/dishes |
|
|
61
|
+
| 账户流水 | `/summary/account/` | flow/cust/psn/organization/operator/consume/recharge/wallet/data |
|
|
62
|
+
| 经营分析 | `/summary/analysis/` | turnover(6)/cust(8)/dishes(10)/recharge(4)/device(2)/evaluate(2) |
|
|
63
|
+
| 数据修复 | `/summary/fix/` | order, account (限31天) |
|
|
64
|
+
| 商户 | `/report/merchant/summary/` | consume, recharge |
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# 标准版报表基础表完整字段说明
|
|
2
|
+
|
|
3
|
+
## report_order_info(报表订单主表,仅正向订单)
|
|
4
|
+
|
|
5
|
+
> 标准版中此表**仅存正向订单**,退款数据在独立的 `report_refund` 表中。无 `consumeType` 字段。
|
|
6
|
+
|
|
7
|
+
| 字段 | 类型 | 说明 |
|
|
8
|
+
|------|------|------|
|
|
9
|
+
| `orderId` | Long | 主键(雪花 ID) |
|
|
10
|
+
| `machineSn` | String | 设备 SN |
|
|
11
|
+
| `orgId` | Long | 组织 ID |
|
|
12
|
+
| `custId` | Long | 人员 ID |
|
|
13
|
+
| `nuClearMode` | Integer | 核身方式(1刷卡/2刷脸/3扫码) |
|
|
14
|
+
| `sourceType` | Integer | 来源类型 |
|
|
15
|
+
| `ifOnline` | Integer | 是否在线(1是/2否) |
|
|
16
|
+
| `canteenId/canteenName` | Long/String | 食堂 |
|
|
17
|
+
| `stallId/stallName` | Long/String | 档口 |
|
|
18
|
+
| `mealtimeType` | Integer | 餐次(1早/2午/3下午茶/4晚/5夜宵) |
|
|
19
|
+
| `psnType` | Integer | 人员类别 |
|
|
20
|
+
| `payableAmount` | BigDecimal | 应付金额(分) |
|
|
21
|
+
| `discountsAmount` | BigDecimal | 优惠金额(分,取负数) |
|
|
22
|
+
| `deliveryAmount` | BigDecimal | 配送费(分) |
|
|
23
|
+
| `packingAmount` | BigDecimal | 包装费(分) |
|
|
24
|
+
| `realAmount` | BigDecimal | 实付金额(分) |
|
|
25
|
+
| `accPayAmount` | BigDecimal | 账户支付金额(分) |
|
|
26
|
+
| `outPayAmount` | BigDecimal | 外部支付金额(分) |
|
|
27
|
+
| `refundAmount` | BigDecimal | 累计退款金额(分) |
|
|
28
|
+
| `orderTime` | LocalDateTime | 下单时间 |
|
|
29
|
+
| `orderDate` | LocalDate | 就餐日期 |
|
|
30
|
+
| `orderType` | Integer | 订单类型(1当餐/2预订/3报餐/4扫码/5餐桌/6自助/11商城/12超市/21补扣/22外部) |
|
|
31
|
+
| `orderRefundState` | Integer | 退款状态(1未退/2已退/3部分退) |
|
|
32
|
+
| `payTime` | LocalDateTime | 支付时间 |
|
|
33
|
+
| `payType` | Integer | 支付方式 |
|
|
34
|
+
| `payChannel` | Integer | 支付渠道 |
|
|
35
|
+
| `ageType` | Integer | 年龄段 |
|
|
36
|
+
| `holidayType` | Integer | 节假日类型 |
|
|
37
|
+
| `status` | Integer | 消费状态(0未消费/1已消费) |
|
|
38
|
+
|
|
39
|
+
## report_order_detail(订单菜品明细表)
|
|
40
|
+
|
|
41
|
+
| 字段 | 类型 | 说明 |
|
|
42
|
+
|------|------|------|
|
|
43
|
+
| `detailId` | Long | 明细主键 |
|
|
44
|
+
| `orderId` | Long | 关联订单 ID |
|
|
45
|
+
| `goodsDishesId` | Long | 菜品 ID |
|
|
46
|
+
| `goodsDishesName` | String | 菜品名称 |
|
|
47
|
+
| `salePrice` | BigDecimal | 售卖价格(分) |
|
|
48
|
+
| `prefPrice` | BigDecimal | 优惠价格(分) |
|
|
49
|
+
| `price` | BigDecimal | 最终价格(分) |
|
|
50
|
+
| `weightUnit` | BigDecimal | 每份重量(g) |
|
|
51
|
+
| `quantity` | Integer | 数量/重量 |
|
|
52
|
+
| `salesMode` | Integer | 销售方式(1按份/2称重) |
|
|
53
|
+
| `detailType` | Integer | 类别(1菜品/2套餐/3商品/4按键/5补扣/6报餐) |
|
|
54
|
+
| `totalAmount` | BigDecimal | 总金额(分) |
|
|
55
|
+
| `realAmount` | BigDecimal | 实付金额(分) |
|
|
56
|
+
| `detailState` | Integer | 状态(1正常/2已退菜/3部分退菜) |
|
|
57
|
+
| `goodsRefundNum` | Integer | 已退数量 |
|
|
58
|
+
| `refundAmount` | BigDecimal | 退款金额(分) |
|
|
59
|
+
|
|
60
|
+
## report_refund(退款主表,标准版特有)
|
|
61
|
+
|
|
62
|
+
| 字段 | 类型 | 说明 |
|
|
63
|
+
|------|------|------|
|
|
64
|
+
| `orderRefundId` | Long | 退款单主键 |
|
|
65
|
+
| `orderId` | Long | 原始订单 ID |
|
|
66
|
+
| `realRefundAmount` | BigDecimal | 退款金额(**正数**) |
|
|
67
|
+
| `applyTime` | LocalDateTime | 申请时间 |
|
|
68
|
+
| `applyType` | Integer | 申请类型(1退单/2纠错) |
|
|
69
|
+
| `checkTime` | LocalDateTime | 审核时间 |
|
|
70
|
+
|
|
71
|
+
## report_refund_detail(退款明细表,标准版特有)
|
|
72
|
+
|
|
73
|
+
| 字段 | 类型 | 说明 |
|
|
74
|
+
|------|------|------|
|
|
75
|
+
| `orderRefundId` | Long | 退款单 ID |
|
|
76
|
+
| `detailId` | Long | 菜品详情 ID |
|
|
77
|
+
| `realQuantity` | Integer | 退单数量 |
|
|
78
|
+
| `realRefundAmount` | BigDecimal | 退款金额(**正数**) |
|
|
79
|
+
|
|
80
|
+
## report_account_flow(账户流水主表)
|
|
81
|
+
|
|
82
|
+
核心字段:`flowId`(主键), `custId`, `orgId`, `payTime`, `flowType`(AccTradeTypeEnum), `flowRealAmount`, `flowAmount`, `manageCost`, `accTotalBal`(可用余额), `accAllBal`(含冻结), `rechargeSource`, `payChannel/payType`, `status`(0未消费/1已消费)
|
|
83
|
+
|
|
84
|
+
附加字段:`rechargeOperate`(1单人/2批量/3导入/4赠送), `withdrawSource`(1小程序/2web/3openapi/4注销), `operateSource`(1手动清空/2批量/3定时/4注销)
|
|
85
|
+
|
|
86
|
+
## report_account_flow_detail(流水钱包明细)
|
|
87
|
+
|
|
88
|
+
字段:`flowId`, `walletId`(1个人/2补贴/4红包), `amount`(转出取负值), `walletBal`, `flowType`, `frozenBalance`, `allWalletBal`
|
|
89
|
+
|
|
90
|
+
## report_account_summary(用户账户日结表)
|
|
91
|
+
|
|
92
|
+
联合主键:`statisticDate` + `custId`
|
|
93
|
+
|
|
94
|
+
**期末余额公式**:
|
|
95
|
+
```
|
|
96
|
+
endAmount = beginAmount
|
|
97
|
+
+ rechargeAmount - rechargeRevokeAmount
|
|
98
|
+
+ subsidyAmount - subsidyRevokeAmount
|
|
99
|
+
+ luckAmount + giftAmount
|
|
100
|
+
- consumeAmount - consumeRepairAmount
|
|
101
|
+
+ consumeRefundAmount
|
|
102
|
+
- withdrawAmount - clearAmount - manageCostAmount
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
附加维度:充值渠道详分(微信/支付宝/现金/银行/第三方)、提现渠道详分、各钱包余额及冻结金额
|
|
106
|
+
|
|
107
|
+
## report_order_pay(订单支付表)
|
|
108
|
+
|
|
109
|
+
字段:`orderId`, `payType`, `payChannel`, `outTradeNo`, `payAmount`, `refundAmount`, `payableAmount`
|
|
110
|
+
|
|
111
|
+
## report_order_discount(订单优惠表)
|
|
112
|
+
|
|
113
|
+
字段:`orderId`, `changeAmount`, `changeType`(1上浮/2优惠), `changeDetailType`(1上浮/11菜品优惠/12打折/13累计减免/14固定减免)
|