zj
2025-02-25 dd315d5732e14fcf3df71e0cf213cc442bd8607b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
package project.c2c.internal;
 
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
 
import project.c2c.C2cUser;
import project.c2c.C2cUserService;
import project.c2c.C2cUserStatisticsService;
import util.DateUtil;
 
public class C2cUserStatisticsServiceImpl implements C2cUserStatisticsService {
 
    private NamedParameterJdbcOperations namedParameterJdbcTemplate;
    private C2cUserService c2cUserService;
 
    /*
     * 承兑商 统计数据
     */
    public void statistics() throws Throwable {
        
        // 开始时间和结束时间
        Calendar now = Calendar.getInstance();
        Date endTime = now.getTime();
        now.add(Calendar.DAY_OF_YEAR, -30);
        Date startTime = now.getTime();
        
        // 获取 30日成单数、30日成单率、30日平均放行时间、30日平均付款时间、30日交易量
        Map<String, Map<String, Object>> statisticsMap = this.getCtcUserStatistics(startTime, endTime);
        
        // 获取 30日订单数
        Map<String, Object> orderCountMap = this.getCtcUserOrderCount(startTime, endTime);
        
        // 获取 首次交易至今天数
        Map<String, Object> firstExchangeDaysMap = this.getFirstExchangeDays();
        
        // 获取 交易人数、总交易量、买交易量、卖交易量、总成单数、买成单数、卖成单数
        Map<String, Map<String, Object>> totalDatasMap = this.getTotalDatas();
        
        List<C2cUser> list = this.c2cUserService.findAll();
        for (int i = 0; i < list.size(); i++) {
            C2cUser user = list.get(i);
            
            Map<String, Object> statistics = statisticsMap.get(user.getId().toString());
            if (null == statistics) {
                statistics = new HashMap<String, Object>();
            }
            
            Map<String, Object> totalDatas = totalDatasMap.get(user.getId().toString());
            if (null == totalDatas) {
                totalDatas = new HashMap<String, Object>();
            }
            
            // 30日成单数
            long thirtyDaysOrderSucceed = 0;
            if (null != statistics.get("order_count")) {
                thirtyDaysOrderSucceed = (long) statistics.get("order_count");
            }
            user.setThirtyDaysOrder(Integer.valueOf(new Long(thirtyDaysOrderSucceed).toString()).intValue());
 
            // 30日订单数
            long thirtyDaysOrder = 0;
            if (null != orderCountMap.get("order_count")) {
                thirtyDaysOrder = (long) orderCountMap.get("order_count");
            }
            
            // 30日成单率
            double thirtyDaysOrderRatio = 0;
            if (0 != thirtyDaysOrder && 0 != thirtyDaysOrderSucceed) {
                thirtyDaysOrderRatio = Math.floor(thirtyDaysOrderSucceed / thirtyDaysOrder * 100);
            }
            user.setThirtyDaysOrderRatio(thirtyDaysOrderRatio);
            
            // 30日平均放行时间
            long thirtyDaysOrderSucceedHandle = 0;
            if (null != statistics.get("handle_order_count")) {
                thirtyDaysOrderSucceedHandle = (long) statistics.get("handle_order_count");
            }
            if (0 != thirtyDaysOrderSucceedHandle && null != statistics.get("total_pass_time")) {
                Double passTime = Math.floor(Double.valueOf(statistics.get("total_pass_time").toString()) / thirtyDaysOrderSucceedHandle);
                user.setThirtyDaysPassAverageTime((int) passTime.doubleValue());
            } else {
                user.setThirtyDaysPassAverageTime(0);
            }
            
            // 30日平均付款时间
            long thirtyDaysOrderSucceedPay = 0;
            if (null != statistics.get("pay_order_count")) {
                thirtyDaysOrderSucceedPay = (long) statistics.get("pay_order_count");
            }
            if (0 != thirtyDaysOrderSucceedPay && null != statistics.get("total_pay_time")) {
                Double payTime = Math.floor(Double.valueOf(statistics.get("total_pay_time").toString()) / thirtyDaysOrderSucceedPay);
                user.setThirtyDaysPayAverageTime((int) payTime.doubleValue());
            } else {
                user.setThirtyDaysPayAverageTime(0);
            }
            
            DecimalFormat df = new DecimalFormat("#.########");
            
            // 30日交易量
            double thirtyDaysAmount = 0;
            if (null != statistics.get("total_amount")) {
                thirtyDaysAmount = (double) statistics.get("total_amount");
            }
            user.setThirtyDaysAmount(Double.valueOf(df.format(thirtyDaysAmount)).doubleValue());
            
            // 账号创建天数
            user.setAccountCreateDays(this.getAccountCreateDays(user));
            
            // 首次交易至今天数
            int firstExchangeDays = 0;
            if (null != firstExchangeDaysMap.get(user.getId().toString())) {
                firstExchangeDays = (int) firstExchangeDaysMap.get(user.getId().toString());
            }            
            user.setFirstExchangeDays(firstExchangeDays);
            
            // 交易人数
            long exchangeUsers = 0;
            if (null != totalDatas.get("user_count")) {
                exchangeUsers = (long) totalDatas.get("user_count");
            }            
            user.setExchangeUsers(Integer.valueOf(new Long(exchangeUsers).toString()).intValue());
            
            // 总成单数
            long totalSuccessOrders = 0;
            if (null != totalDatas.get("total_order_count")) {
                totalSuccessOrders = (long) totalDatas.get("total_order_count");
            }            
            user.setTotalSuccessOrders(Integer.valueOf(new Long(totalSuccessOrders).toString()).intValue());
            
            // 买成单数
            long buySuccessOrders = 0;
            if (null != totalDatas.get("buy_order_count")) {
                buySuccessOrders = (long) totalDatas.get("buy_order_count");
            }            
            user.setBuySuccessOrders(Integer.valueOf(new Long(buySuccessOrders).toString()).intValue());
            
            // 卖成单数
            long sellSuccessOrders = 0;
            if (null != totalDatas.get("sell_order_count")) {
                sellSuccessOrders = (long) totalDatas.get("sell_order_count");
            }            
            user.setSellSuccessOrders(Integer.valueOf(new Long(sellSuccessOrders).toString()).intValue());
            
            // 总交易量
            double totalAmount = 0;
            if (null != totalDatas.get("total_amount")) {
                totalAmount = (double) totalDatas.get("total_amount");
            }            
            user.setTotalAmount(Double.valueOf(df.format(totalAmount)).doubleValue());
            
            // 买交易量
            double buyAmount = 0;
            if (null != totalDatas.get("buy_amount")) {
                buyAmount = (double) totalDatas.get("buy_amount");
            }            
            user.setBuyAmount(Double.valueOf(df.format(buyAmount)).doubleValue());
            
            // 卖交易量
            double sellAmount = 0;
            if (null != totalDatas.get("sell_amount")) {
                sellAmount = (double) totalDatas.get("sell_amount");
            }            
            user.setSellAmount(Double.valueOf(df.format(sellAmount)).doubleValue());
            
            this.c2cUserService.update(user);
        }
    }
    
    /*
     * 获取 30日成单数、30日成单率、30日平均放行时间、30日平均付款时间、30日交易量
     */
    public Map<String, Map<String, Object>> getCtcUserStatistics(Date startTime, Date endTime) {
        
        Map<String, Object> parameters = new HashMap<String, Object>();
        
        StringBuffer queryString = new StringBuffer();
        
        queryString.append(" SELECT ord.C2C_USER_ID AS c2c_user_id, COUNT(*) AS order_count, IFNULL(SUM(ord.AMOUNT_USDT), 0) AS total_amount, ");
        queryString.append(" COUNT(IF(TIMESTAMPDIFF(SECOND, ord.CREATE_TIME, ord.HANDLE_TIME) / 60 > 120, 0, 1)) AS handle_order_count, ");
        queryString.append(" COUNT(IF(TIMESTAMPDIFF(SECOND, ord.CREATE_TIME, ord.PAY_TIME) / 60 > 120, 0, 1)) AS pay_order_count, ");
        queryString.append(" SUM(IF(TIMESTAMPDIFF(SECOND, ord.CREATE_TIME, ord.HANDLE_TIME) / 60 > 120, 0, TIMESTAMPDIFF(SECOND, ord.CREATE_TIME, ord.HANDLE_TIME) / 60)) AS total_pass_time, ");
        queryString.append(" SUM(IF(TIMESTAMPDIFF(SECOND, ord.CREATE_TIME, ord.PAY_TIME) / 60 > 120, 0, TIMESTAMPDIFF(SECOND, ord.CREATE_TIME, ord.PAY_TIME) / 60)) AS total_pay_time ");
        queryString.append(" FROM T_C2C_ORDER ord ");
        queryString.append(" WHERE 1=1 AND ord.STATE = '3' ");
        
        queryString.append(" AND DATE(ord.CREATE_TIME) >= :startTime ");
        parameters.put("startTime", startTime);
    
        queryString.append(" AND DATE(ord.CREATE_TIME) <= :endTime ");
        parameters.put("endTime", endTime);
        
        queryString.append(" GROUP BY ord.C2C_USER_ID ");
        
        Map<String, Map<String, Object>> retMap = new HashMap<String, Map<String, Object>>();
 
        List<Map<String, Object>> queryForList = this.namedParameterJdbcTemplate.queryForList(queryString.toString(), parameters);
        if (null == queryForList) {
            retMap = new HashMap<String, Map<String, Object>>();
        }
        
        for (int i = 0; i < queryForList.size(); i++) {
            Map<String, Object> map = queryForList.get(i);
            
            if (null != map && null != map.get("c2c_user_id")) {                
                retMap.put(map.get("c2c_user_id").toString(), map);
            }
        }
 
        return retMap;
    }
 
    /*
     * 获取 30日订单数
     */
    public Map<String, Object> getCtcUserOrderCount(Date startTime, Date endTime) {
        
        Map<String, Object> parameters = new HashMap<String, Object>();
        
        StringBuffer queryString = new StringBuffer();
        
        queryString.append(" SELECT ord.C2C_USER_ID AS c2c_user_id, COUNT(*) AS order_count ");
        queryString.append(" FROM T_C2C_ORDER ord ");
        queryString.append(" WHERE 1=1 ");
        
        queryString.append(" AND DATE(ord.CREATE_TIME) >= :startTime ");
        parameters.put("startTime", startTime);
    
        queryString.append(" AND DATE(ord.CREATE_TIME) <= :endTime ");
        parameters.put("endTime", endTime);
        
        queryString.append(" GROUP BY ord.C2C_USER_ID ");
 
        List<Map<String, Object>> queryForList = this.namedParameterJdbcTemplate.queryForList(queryString.toString(), parameters);
        if (null == queryForList) {
            return new HashMap<String, Object>();
        }
        
        Map<String, Object> retMap = new HashMap<String, Object>();
        
        for (int i = 0; i < queryForList.size(); i++) {
            Map<String, Object> map = queryForList.get(i);
            
            if (null != map && null != map.get("c2c_user_id")) {
                
                if (null != map.get("order_count")) {
                    retMap.put(map.get("c2c_user_id").toString(), (Long) map.get("order_count"));
                } else {
                    retMap.put(map.get("c2c_user_id").toString(), 0L);
                }
            }
        }
        
        return retMap;
    }
 
    /*
     * 获取 账号创建天数
     */
    public int getAccountCreateDays(C2cUser c2cUser) {
        return DateUtil.dateNum(c2cUser.getCreateTime(), new Date());
    }
 
    /*
     * 获取 首次交易至今天数
     */
    public Map<String, Object> getFirstExchangeDays() throws Throwable {
        
        Map<String, Object> parameters = new HashMap<String, Object>();
        
        StringBuffer queryString = new StringBuffer();
        
        queryString.append(" SELECT ord.C2C_USER_ID AS c2c_user_id, MIN(ord.CREATE_TIME) AS first_time ");
        queryString.append(" FROM T_C2C_ORDER ord ");
        queryString.append(" WHERE 1=1 AND ord.STATE = '3' ");
        
        queryString.append(" GROUP BY ord.C2C_USER_ID ");
 
        List<Map<String, Object>> queryForList = this.namedParameterJdbcTemplate.queryForList(queryString.toString(), parameters);
        if (null == queryForList) {
            return new HashMap<String, Object>();
        }
        
        Map<String, Object> retMap = new HashMap<String, Object>();
        
        for (int i = 0; i < queryForList.size(); i++) {
            Map<String, Object> map = queryForList.get(i);
            
            if (null != map && null != map.get("c2c_user_id")) {
                
                try  {
                    
                    SimpleDateFormat sdfT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
                    Date firstDate = sdfT.parse(map.get("first_time").toString());
                    
                    if (null != map.get("first_time")) {
                        retMap.put(map.get("c2c_user_id").toString(), DateUtil.dateNum(firstDate, new Date()));
                    } else {
                        retMap.put(map.get("c2c_user_id").toString(), 0);
                    }
                    
                } catch (Throwable t) {
                    throw t;
                }
            }
        }
        
        return retMap;
    }
 
    /*
     * 获取 交易人数、总交易量、买交易量、卖交易量、总成单数、买成单数、卖成单数
     */
    public Map<String, Map<String, Object>> getTotalDatas() {
        
        Map<String, Object> parameters = new HashMap<String, Object>();
        
        StringBuffer queryString = new StringBuffer();
        
        queryString.append(" SELECT ord.C2C_USER_ID AS c2c_user_id, COUNT(DISTINCT ord.PARTY_ID) AS user_count, ");
        queryString.append(" COUNT(*) AS total_order_count, COUNT(IF(ord.DIRECTION = 'buy', 1, null)) AS buy_order_count, COUNT(IF(ord.DIRECTION = 'sell', 1, null)) AS sell_order_count, IFNULL(SUM(ord.AMOUNT_USDT), 0) AS total_amount, ");
        queryString.append(" IFNULL(SUM(IF(ord.DIRECTION = 'buy', ord.AMOUNT_USDT, 0)), 0) AS buy_amount, IFNULL(SUM(IF(ord.DIRECTION = 'sell', ord.AMOUNT_USDT, 0)), 0) AS sell_amount ");
        queryString.append(" FROM T_C2C_ORDER ord ");
        queryString.append(" WHERE 1=1 AND ord.STATE = '3' ");
        
        queryString.append(" GROUP BY ord.C2C_USER_ID ");
                
        Map<String, Map<String, Object>> retMap = new HashMap<String, Map<String, Object>>();
 
        List<Map<String, Object>> queryForList = this.namedParameterJdbcTemplate.queryForList(queryString.toString(), parameters);
        if (null == queryForList) {
            retMap = new HashMap<String, Map<String, Object>>();
        }
        
        for (int i = 0; i < queryForList.size(); i++) {
            Map<String, Object> map = queryForList.get(i);
            
            if (null != map && null != map.get("c2c_user_id")) {                
                retMap.put(map.get("c2c_user_id").toString(), map);
            }
        }
 
        return retMap;
    }
 
    public void setNamedParameterJdbcTemplate(NamedParameterJdbcOperations namedParameterJdbcTemplate) {
        this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
    }
 
    public void setC2cUserService(C2cUserService c2cUserService) {
        this.c2cUserService = c2cUserService;
    }
 
}