ts-glitter 21.0.9 → 21.1.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/lowcode/Entry.js +1 -1
- package/lowcode/Entry.ts +1 -1
- package/lowcode/cms-plugin/data-analyze-orders.js +1 -0
- package/lowcode/cms-plugin/data-analyze-orders.ts +1 -1
- package/lowcode/cms-plugin/data-analyze.js +21 -1
- package/lowcode/cms-plugin/data-analyze.ts +24 -25
- package/package.json +1 -1
- package/src/api-public/controllers/index.js.map +1 -1
- package/src/api-public/controllers/index.ts +1 -0
- package/src/api-public/services/checkout-event.js +1 -3
- package/src/api-public/services/checkout-event.js.map +1 -1
- package/src/api-public/services/data-analyze.d.ts +4 -4
- package/src/api-public/services/data-analyze.js +205 -283
- package/src/api-public/services/data-analyze.js.map +1 -1
- package/src/api-public/services/data-analyze.ts +214 -332
- package/src/api-public/services/public-table-check.js +13 -0
- package/src/api-public/services/public-table-check.js.map +1 -1
- package/src/api-public/services/public-table-check.ts +13 -0
- package/src/api-public/services/schedule.d.ts +1 -0
- package/src/api-public/services/schedule.js +87 -54
- package/src/api-public/services/schedule.js.map +1 -1
- package/src/api-public/services/schedule.ts +101 -57
- package/src/run.js +2 -3
- package/src/run.js.map +1 -1
- package/src/run.ts +1 -1
- /package/{vp00rqhw1r.json → ye8r333y6g.json} +0 -0
|
@@ -28,7 +28,7 @@ export class DataAnalyze {
|
|
|
28
28
|
// 以 t_voucher_history 更新資料舉例
|
|
29
29
|
const jsonData = await db.query(
|
|
30
30
|
`SELECT *
|
|
31
|
-
|
|
31
|
+
FROM \`${this.app}\`.t_voucher_history`,
|
|
32
32
|
[]
|
|
33
33
|
);
|
|
34
34
|
const t0 = performance.now();
|
|
@@ -139,15 +139,15 @@ export class DataAnalyze {
|
|
|
139
139
|
async getRecentActiveUser() {
|
|
140
140
|
try {
|
|
141
141
|
const recentSQL = `
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
142
|
+
SELECT *
|
|
143
|
+
FROM \`${this.app}\`.t_user
|
|
144
|
+
WHERE online_time BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW();
|
|
145
145
|
`;
|
|
146
146
|
const recent_users = await db.query(recentSQL, []);
|
|
147
147
|
const monthSQL = `
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
SELECT *
|
|
149
|
+
FROM \`${this.app}\`.t_user
|
|
150
|
+
WHERE MONTH (online_time) = MONTH (NOW()) AND YEAR (online_time) = YEAR (NOW());
|
|
151
151
|
`;
|
|
152
152
|
const month_users = await db.query(monthSQL, []);
|
|
153
153
|
return { recent: recent_users.length, months: month_users.length };
|
|
@@ -161,13 +161,13 @@ export class DataAnalyze {
|
|
|
161
161
|
const orderCountingSQL = await this.getOrderCountingSQL();
|
|
162
162
|
|
|
163
163
|
const getCheckoutsSQL = (monthOffset: number) => `
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
164
|
+
SELECT *
|
|
165
|
+
FROM \`${this.app}\`.t_checkout
|
|
166
|
+
WHERE MONTH (created_time) = MONTH (DATE_SUB(NOW()
|
|
167
|
+
, INTERVAL ${monthOffset} MONTH))
|
|
168
|
+
AND YEAR (created_time) = YEAR (DATE_SUB(NOW()
|
|
169
|
+
, INTERVAL ${monthOffset} MONTH))
|
|
170
|
+
AND (${orderCountingSQL});
|
|
171
171
|
`;
|
|
172
172
|
|
|
173
173
|
const calculateTotal = (checkouts: any[]): number =>
|
|
@@ -229,18 +229,18 @@ export class DataAnalyze {
|
|
|
229
229
|
// 組裝 SQL 查詢
|
|
230
230
|
const orderCountingSQL = await this.getOrderCountingSQL();
|
|
231
231
|
const checkoutSQL = `
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
232
|
+
SELECT *
|
|
233
|
+
FROM \`${this.app}\`.t_checkout
|
|
234
|
+
WHERE ${
|
|
235
|
+
duration === 'day'
|
|
236
|
+
? `created_time BETWEEN NOW() AND NOW() + INTERVAL 1 DAY - INTERVAL 1 SECOND`
|
|
237
|
+
: duration === 'month'
|
|
238
|
+
? `created_time BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()`
|
|
239
|
+
: sqlConditions.length
|
|
240
|
+
? sqlConditions.join(' AND ')
|
|
241
|
+
: '1=1'
|
|
242
|
+
}
|
|
243
|
+
AND (${orderCountingSQL});
|
|
244
244
|
`;
|
|
245
245
|
|
|
246
246
|
const checkouts = await db.query(checkoutSQL, []);
|
|
@@ -251,7 +251,7 @@ export class DataAnalyze {
|
|
|
251
251
|
|
|
252
252
|
checkouts.forEach(({ orderData }: { orderData: any }) => {
|
|
253
253
|
orderData.lineItems?.forEach((item: any) => {
|
|
254
|
-
item.collection=item.collection??[];
|
|
254
|
+
item.collection = item.collection ?? [];
|
|
255
255
|
const existing = productMap.get(item.title);
|
|
256
256
|
const collections = new Set(item.collection.filter((c: string) => c.trim().length > 0));
|
|
257
257
|
|
|
@@ -310,13 +310,13 @@ export class DataAnalyze {
|
|
|
310
310
|
const orderCountingSQL = await this.getOrderCountingSQL();
|
|
311
311
|
|
|
312
312
|
const getCheckoutCountSQL = (monthOffset: number) => `
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
313
|
+
SELECT id
|
|
314
|
+
FROM \`${this.app}\`.t_checkout
|
|
315
|
+
WHERE MONTH (created_time) = MONTH (DATE_SUB(NOW()
|
|
316
|
+
, INTERVAL ${monthOffset} MONTH))
|
|
317
|
+
AND YEAR (created_time) = YEAR (DATE_SUB(NOW()
|
|
318
|
+
, INTERVAL ${monthOffset} MONTH))
|
|
319
|
+
AND ${orderCountingSQL};
|
|
320
320
|
`;
|
|
321
321
|
|
|
322
322
|
const recentMonthCheckouts = await db.query(getCheckoutCountSQL(0), []);
|
|
@@ -351,10 +351,10 @@ export class DataAnalyze {
|
|
|
351
351
|
const queries = Array.from({ length: 14 }, async (_, index) => {
|
|
352
352
|
const dayOffset = `DATE_SUB(DATE(NOW()), INTERVAL ${index} DAY)`;
|
|
353
353
|
const monthCheckoutSQL = `
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
354
|
+
SELECT orderData ->>'$.orderSource' as orderSource, orderData
|
|
355
|
+
FROM \`${this.app}\`.t_checkout
|
|
356
|
+
WHERE DATE (${convertTimeZone('created_time')}) = ${dayOffset}
|
|
357
|
+
AND ${orderCountingSQL};
|
|
358
358
|
`;
|
|
359
359
|
|
|
360
360
|
return db.query(monthCheckoutSQL, []).then(data => {
|
|
@@ -408,10 +408,10 @@ export class DataAnalyze {
|
|
|
408
408
|
const queries = Array.from({ length: 30 }, async (_, index) => {
|
|
409
409
|
const dayOffset = `DATE_SUB(DATE(NOW()), INTERVAL ${index} DAY)`;
|
|
410
410
|
const monthCheckoutSQL = `
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
411
|
+
SELECT orderData ->>'$.orderSource' as orderSource, orderData
|
|
412
|
+
FROM \`${this.app}\`.t_checkout
|
|
413
|
+
WHERE DATE (${convertTimeZone('created_time')}) = ${dayOffset}
|
|
414
|
+
AND ${orderCountingSQL};
|
|
415
415
|
`;
|
|
416
416
|
|
|
417
417
|
return db.query(monthCheckoutSQL, []).then(data => {
|
|
@@ -469,10 +469,10 @@ export class DataAnalyze {
|
|
|
469
469
|
const queries = Array.from({ length: days }, async (_, index) => {
|
|
470
470
|
const dayOffset = `DATE_SUB(DATE("${endDate}"), INTERVAL ${index} DAY)`;
|
|
471
471
|
const monthCheckoutSQL = `
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
472
|
+
SELECT orderData ->>'$.orderSource' as orderSource, orderData
|
|
473
|
+
FROM \`${this.app}\`.t_checkout
|
|
474
|
+
WHERE DATE (${convertTimeZone('created_time')}) = ${dayOffset}
|
|
475
|
+
AND ${orderCountingSQL};
|
|
476
476
|
`;
|
|
477
477
|
|
|
478
478
|
return db.query(monthCheckoutSQL, []).then(data => {
|
|
@@ -526,11 +526,11 @@ export class DataAnalyze {
|
|
|
526
526
|
const queries = Array.from({ length: 12 }, async (_, index) => {
|
|
527
527
|
const monthOffset = `DATE_FORMAT(DATE_SUB(${convertTimeZone('NOW()')}, INTERVAL ${index} MONTH), '%Y-%m')`;
|
|
528
528
|
const monthCheckoutSQL = `
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
529
|
+
SELECT orderData ->>'$.orderSource' as orderSource, orderData
|
|
530
|
+
FROM \`${this.app}\`.t_checkout
|
|
531
|
+
WHERE DATE_FORMAT(${convertTimeZone('created_time')}
|
|
532
|
+
, '%Y-%m') = ${monthOffset}
|
|
533
|
+
AND ${orderCountingSQL};
|
|
534
534
|
`;
|
|
535
535
|
|
|
536
536
|
return db.query(monthCheckoutSQL, []).then(data => {
|
|
@@ -581,14 +581,14 @@ export class DataAnalyze {
|
|
|
581
581
|
await new Promise(resolve => {
|
|
582
582
|
for (let index = 0; index < 12; index++) {
|
|
583
583
|
const monthCheckoutSQL = `
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
584
|
+
SELECT orderData
|
|
585
|
+
FROM \`${this.app}\`.t_checkout
|
|
586
|
+
WHERE
|
|
587
|
+
MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
588
|
+
, INTERVAL ${index} MONTH))
|
|
589
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
590
|
+
, INTERVAL ${index} MONTH))
|
|
591
|
+
AND ${orderCountingSQL};
|
|
592
592
|
`;
|
|
593
593
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
594
594
|
pass++;
|
|
@@ -659,16 +659,16 @@ export class DataAnalyze {
|
|
|
659
659
|
await new Promise(resolve => {
|
|
660
660
|
for (let index = 0; index < 14; index++) {
|
|
661
661
|
const monthCheckoutSQL = `
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
662
|
+
SELECT orderData
|
|
663
|
+
FROM \`${this.app}\`.t_checkout
|
|
664
|
+
WHERE
|
|
665
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
|
|
666
|
+
, INTERVAL ${index} DAY))
|
|
667
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
668
|
+
, INTERVAL ${index} DAY))
|
|
669
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
670
|
+
, INTERVAL ${index} DAY))
|
|
671
|
+
AND ${orderCountingSQL};
|
|
672
672
|
`;
|
|
673
673
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
674
674
|
pass++;
|
|
@@ -738,16 +738,16 @@ export class DataAnalyze {
|
|
|
738
738
|
await new Promise(resolve => {
|
|
739
739
|
for (let index = 0; index < 30; index++) {
|
|
740
740
|
const monthCheckoutSQL = `
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
741
|
+
SELECT orderData
|
|
742
|
+
FROM \`${this.app}\`.t_checkout
|
|
743
|
+
WHERE
|
|
744
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
|
|
745
|
+
, INTERVAL ${index} DAY))
|
|
746
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
747
|
+
, INTERVAL ${index} DAY))
|
|
748
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
749
|
+
, INTERVAL ${index} DAY))
|
|
750
|
+
AND ${orderCountingSQL};
|
|
751
751
|
`;
|
|
752
752
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
753
753
|
pass++;
|
|
@@ -831,16 +831,16 @@ export class DataAnalyze {
|
|
|
831
831
|
await new Promise(resolve => {
|
|
832
832
|
for (let index = 0; index < days; index++) {
|
|
833
833
|
const monthCheckoutSQL = `
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
834
|
+
SELECT orderData
|
|
835
|
+
FROM \`${this.app}\`.t_checkout
|
|
836
|
+
WHERE
|
|
837
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
838
|
+
, INTERVAL ${index} DAY))
|
|
839
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
840
|
+
, INTERVAL ${index} DAY))
|
|
841
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
842
|
+
, INTERVAL ${index} DAY))
|
|
843
|
+
AND ${orderCountingSQL};
|
|
844
844
|
`;
|
|
845
845
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
846
846
|
pass++;
|
|
@@ -909,14 +909,14 @@ export class DataAnalyze {
|
|
|
909
909
|
await new Promise(resolve => {
|
|
910
910
|
for (let index = 0; index < 12; index++) {
|
|
911
911
|
const monthCheckoutSQL = `
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
912
|
+
SELECT orderData
|
|
913
|
+
FROM \`${this.app}\`.t_checkout
|
|
914
|
+
WHERE
|
|
915
|
+
MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
916
|
+
, INTERVAL ${index} MONTH))
|
|
917
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
918
|
+
, INTERVAL ${index} MONTH))
|
|
919
|
+
AND ${orderCountingSQL};
|
|
920
920
|
`;
|
|
921
921
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
922
922
|
pass++;
|
|
@@ -992,16 +992,16 @@ export class DataAnalyze {
|
|
|
992
992
|
await new Promise(resolve => {
|
|
993
993
|
for (let index = 0; index < 14; index++) {
|
|
994
994
|
const monthCheckoutSQL = `
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
995
|
+
SELECT orderData
|
|
996
|
+
FROM \`${this.app}\`.t_checkout
|
|
997
|
+
WHERE
|
|
998
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
|
|
999
|
+
, INTERVAL ${index} DAY))
|
|
1000
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1001
|
+
, INTERVAL ${index} DAY))
|
|
1002
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1003
|
+
, INTERVAL ${index} DAY))
|
|
1004
|
+
AND ${orderCountingSQL};
|
|
1005
1005
|
`;
|
|
1006
1006
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
1007
1007
|
pass++;
|
|
@@ -1077,16 +1077,16 @@ export class DataAnalyze {
|
|
|
1077
1077
|
await new Promise(resolve => {
|
|
1078
1078
|
for (let index = 0; index < 30; index++) {
|
|
1079
1079
|
const monthCheckoutSQL = `
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1080
|
+
SELECT orderData
|
|
1081
|
+
FROM \`${this.app}\`.t_checkout
|
|
1082
|
+
WHERE
|
|
1083
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1084
|
+
, INTERVAL ${index} DAY))
|
|
1085
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1086
|
+
, INTERVAL ${index} DAY))
|
|
1087
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1088
|
+
, INTERVAL ${index} DAY))
|
|
1089
|
+
AND ${orderCountingSQL};
|
|
1090
1090
|
`;
|
|
1091
1091
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
1092
1092
|
pass++;
|
|
@@ -1165,16 +1165,16 @@ export class DataAnalyze {
|
|
|
1165
1165
|
await new Promise(resolve => {
|
|
1166
1166
|
for (let index = 0; index < days; index++) {
|
|
1167
1167
|
const monthCheckoutSQL = `
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1168
|
+
SELECT orderData
|
|
1169
|
+
FROM \`${this.app}\`.t_checkout
|
|
1170
|
+
WHERE
|
|
1171
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
1172
|
+
, INTERVAL ${index} DAY))
|
|
1173
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
1174
|
+
, INTERVAL ${index} DAY))
|
|
1175
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
1176
|
+
, INTERVAL ${index} DAY))
|
|
1177
|
+
AND ${orderCountingSQL}
|
|
1178
1178
|
`;
|
|
1179
1179
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
1180
1180
|
pass++;
|
|
@@ -1240,150 +1240,60 @@ export class DataAnalyze {
|
|
|
1240
1240
|
async getActiveRecentYear() {
|
|
1241
1241
|
const utTimer = new UtTimer('GET-RECENT-ACTIVE-USER-YEAR');
|
|
1242
1242
|
const checkPoint = utTimer.checkPoint;
|
|
1243
|
-
const endDate = moment.tz('Asia/Taipei').toDate();
|
|
1244
|
-
endDate.setMonth(endDate.getMonth() + 1, 1);
|
|
1245
|
-
|
|
1246
|
-
const startDate = moment.tz('Asia/Taipei').toDate();
|
|
1247
|
-
startDate.setMonth(endDate.getMonth() - 12);
|
|
1248
|
-
|
|
1249
|
-
const sql = `
|
|
1250
|
-
SELECT mac_address, created_time
|
|
1251
|
-
FROM \`${saasConfig.SAAS_NAME}\`.t_monitor
|
|
1252
|
-
WHERE app_name = ${db.escape(this.app)}
|
|
1253
|
-
AND req_type = 'file'
|
|
1254
|
-
AND created_time BETWEEN '${startDate.toISOString()}' AND '${endDate.toISOString()}'
|
|
1255
|
-
GROUP BY id, mac_address
|
|
1256
|
-
`;
|
|
1257
|
-
console.log(`getActiveRecentYear: ${sql}`);
|
|
1258
|
-
checkPoint(`sql-start`)
|
|
1259
|
-
const queryData = await db.query(sql, []);
|
|
1260
|
-
|
|
1261
|
-
checkPoint(`sql-end-${queryData.length}`)
|
|
1262
1243
|
const now = moment.tz('Asia/Taipei').toDate(); // 當前時間
|
|
1263
|
-
const dataList = Array.from({ length: 12 }, (_, index) => {
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
const date = moment.tz(item.created_time, 'UTC').clone().tz('Asia/Taipei').toDate();
|
|
1273
|
-
return date.getFullYear() === year && date.getMonth() + 1 === month;
|
|
1244
|
+
const dataList = await Promise.all(Array.from({ length: 12 }, (_, index) => index).map((dd, index) => {
|
|
1245
|
+
return new Promise(async (resolve, reject) => {
|
|
1246
|
+
const sql = `
|
|
1247
|
+
select sum(count)
|
|
1248
|
+
from \`${this.app}\`.visit_logs where
|
|
1249
|
+
MONTH(${convertTimeZone('date')}) = MONTH(DATE_SUB(${convertTimeZone('NOW()')}, INTERVAL ${index} MONTH))
|
|
1250
|
+
`;
|
|
1251
|
+
const queryData = await db.query(sql, []);
|
|
1252
|
+
resolve((queryData[0] && queryData[0]['sum(count)']) || 0);
|
|
1274
1253
|
});
|
|
1275
|
-
|
|
1276
|
-
// 計算不重複的 mac_address
|
|
1277
|
-
const uniqueMacAddresses = new Set(filteredData.map((item: any) => item.mac_address));
|
|
1278
|
-
|
|
1279
|
-
return {
|
|
1280
|
-
year,
|
|
1281
|
-
month,
|
|
1282
|
-
total_count: filteredData.length,
|
|
1283
|
-
unique_count: uniqueMacAddresses.size,
|
|
1284
|
-
};
|
|
1285
|
-
});
|
|
1286
|
-
|
|
1287
|
-
const result = dataList.map(data => data.unique_count);
|
|
1288
|
-
checkPoint(`data-end`)
|
|
1254
|
+
}));
|
|
1289
1255
|
return {
|
|
1290
|
-
count_array:
|
|
1256
|
+
count_array: dataList.reverse(), // 將結果反轉,保證時間順序為最近到最遠
|
|
1291
1257
|
};
|
|
1292
1258
|
}
|
|
1293
1259
|
|
|
1294
1260
|
async getActiveRecentWeek() {
|
|
1295
|
-
const
|
|
1296
|
-
|
|
1297
|
-
FROM \`${saasConfig.SAAS_NAME}\`.t_monitor
|
|
1298
|
-
WHERE app_name = ${db.escape(this.app)}
|
|
1299
|
-
AND req_type = 'file'
|
|
1300
|
-
AND ${convertTimeZone('created_time')} BETWEEN (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1301
|
-
, INTERVAL 14 DAY))
|
|
1302
|
-
AND ${convertTimeZone('NOW()')}
|
|
1303
|
-
GROUP BY id, mac_address
|
|
1304
|
-
`;
|
|
1305
|
-
|
|
1306
|
-
const queryData = await db.query(sql, []);
|
|
1307
|
-
|
|
1261
|
+
const utTimer = new UtTimer('GET-RECENT-ACTIVE-USER-WEEK');
|
|
1262
|
+
const checkPoint = utTimer.checkPoint;
|
|
1308
1263
|
const now = moment.tz('Asia/Taipei').toDate(); // 當前時間
|
|
1309
|
-
const dataList = Array.from({ length: 14 }, (_, index) => {
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
const filteredData = queryData.filter((item: any) => {
|
|
1319
|
-
const date = moment.tz(item.created_time, 'UTC').clone().tz('Asia/Taipei').toDate();
|
|
1320
|
-
return date.getFullYear() === year && date.getMonth() + 1 === month && date.getDate() === day;
|
|
1264
|
+
const dataList = await Promise.all(Array.from({ length: 14 }, (_, index) => index).map((dd, index) => {
|
|
1265
|
+
return new Promise(async (resolve, reject) => {
|
|
1266
|
+
const sql = `
|
|
1267
|
+
select count
|
|
1268
|
+
from \`${this.app}\`.visit_logs where
|
|
1269
|
+
DATE(${convertTimeZone('date')}) = DATE(DATE_SUB(${convertTimeZone('NOW()')}, INTERVAL ${index} DAY))
|
|
1270
|
+
`;
|
|
1271
|
+
const queryData = await db.query(sql, []);
|
|
1272
|
+
resolve((queryData[0] && queryData[0]['count']) || 0);
|
|
1321
1273
|
});
|
|
1322
|
-
|
|
1323
|
-
// 計算不重複的 mac_address
|
|
1324
|
-
const uniqueMacAddresses = new Set(filteredData.map((item: any) => item.mac_address));
|
|
1325
|
-
|
|
1326
|
-
return {
|
|
1327
|
-
year,
|
|
1328
|
-
month,
|
|
1329
|
-
day,
|
|
1330
|
-
total_count: filteredData.length,
|
|
1331
|
-
unique_count: uniqueMacAddresses.size,
|
|
1332
|
-
};
|
|
1333
|
-
});
|
|
1334
|
-
|
|
1335
|
-
const result = dataList.map(data => data.unique_count);
|
|
1336
|
-
|
|
1274
|
+
}));
|
|
1337
1275
|
return {
|
|
1338
|
-
count_array:
|
|
1276
|
+
count_array: dataList.reverse(), // 將結果反轉,保證時間順序為最近到最遠
|
|
1339
1277
|
};
|
|
1340
1278
|
}
|
|
1341
1279
|
|
|
1342
1280
|
async getActiveRecentMonth() {
|
|
1343
|
-
const
|
|
1344
|
-
|
|
1345
|
-
FROM \`${saasConfig.SAAS_NAME}\`.t_monitor
|
|
1346
|
-
WHERE app_name = ${db.escape(this.app)}
|
|
1347
|
-
AND req_type = 'file'
|
|
1348
|
-
AND ${convertTimeZone('created_time')} BETWEEN (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1349
|
-
, INTERVAL 30 DAY))
|
|
1350
|
-
AND ${convertTimeZone('NOW()')}
|
|
1351
|
-
GROUP BY id, mac_address
|
|
1352
|
-
`;
|
|
1353
|
-
|
|
1354
|
-
const queryData = await db.query(sql, []);
|
|
1355
|
-
|
|
1281
|
+
const utTimer = new UtTimer('GET-RECENT-ACTIVE-USER-WEEK');
|
|
1282
|
+
const checkPoint = utTimer.checkPoint;
|
|
1356
1283
|
const now = moment.tz('Asia/Taipei').toDate(); // 當前時間
|
|
1357
|
-
const dataList = Array.from({ length: 30 }, (_, index) => {
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
const filteredData = queryData.filter((item: any) => {
|
|
1367
|
-
const date = moment.tz(item.created_time, 'UTC').clone().tz('Asia/Taipei').toDate();
|
|
1368
|
-
return date.getFullYear() === year && date.getMonth() + 1 === month && date.getDate() === day;
|
|
1284
|
+
const dataList = await Promise.all(Array.from({ length: 30 }, (_, index) => index).map((dd, index) => {
|
|
1285
|
+
return new Promise(async (resolve, reject) => {
|
|
1286
|
+
const sql = `
|
|
1287
|
+
select count
|
|
1288
|
+
from \`${this.app}\`.visit_logs where
|
|
1289
|
+
DATE(${convertTimeZone('date')}) = DATE(DATE_SUB(${convertTimeZone('NOW()')}, INTERVAL ${index} DAY))
|
|
1290
|
+
`;
|
|
1291
|
+
const queryData = await db.query(sql, []);
|
|
1292
|
+
resolve((queryData[0] && queryData[0]['count']) || 0);
|
|
1369
1293
|
});
|
|
1370
|
-
|
|
1371
|
-
// 計算不重複的 mac_address
|
|
1372
|
-
const uniqueMacAddresses = new Set(filteredData.map((item: any) => item.mac_address));
|
|
1373
|
-
|
|
1374
|
-
return {
|
|
1375
|
-
year,
|
|
1376
|
-
month,
|
|
1377
|
-
day,
|
|
1378
|
-
total_count: filteredData.length,
|
|
1379
|
-
unique_count: uniqueMacAddresses.size,
|
|
1380
|
-
};
|
|
1381
|
-
});
|
|
1382
|
-
|
|
1383
|
-
const result = dataList.map(data => data.unique_count);
|
|
1384
|
-
|
|
1294
|
+
}));
|
|
1385
1295
|
return {
|
|
1386
|
-
count_array:
|
|
1296
|
+
count_array: dataList.reverse(), // 將結果反轉,保證時間順序為最近到最遠
|
|
1387
1297
|
};
|
|
1388
1298
|
}
|
|
1389
1299
|
|
|
@@ -1392,50 +1302,22 @@ export class DataAnalyze {
|
|
|
1392
1302
|
const formatStartDate = `"${Tool.replaceDatetime(qData.start)}"`;
|
|
1393
1303
|
const formatEndDate = `"${Tool.replaceDatetime(qData.end)}"`;
|
|
1394
1304
|
const days = this.diffDates(new Date(qData.start), new Date(qData.end));
|
|
1395
|
-
const
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
const now = moment(qData.end).tz('Asia/Taipei').clone().toDate(); // 當前時間
|
|
1409
|
-
const dataList = Array.from({ length: days }, (_, index) => {
|
|
1410
|
-
const targetDate = new Date(now.getTime());
|
|
1411
|
-
targetDate.setDate(new Date(now.getTime()).getDate() - index); // 設定為第 index 天前的日期
|
|
1412
|
-
|
|
1413
|
-
const year = targetDate.getFullYear();
|
|
1414
|
-
const month = targetDate.getMonth() + 1; // 月份從 0 開始,需要加 1
|
|
1415
|
-
const day = targetDate.getDate();
|
|
1416
|
-
|
|
1417
|
-
// 篩選該日期的資料
|
|
1418
|
-
const filteredData = queryData.filter((item: any) => {
|
|
1419
|
-
const date = moment.tz(item.created_time, 'UTC').clone().tz('Asia/Taipei').toDate();
|
|
1420
|
-
return date.getFullYear() === year && date.getMonth() + 1 === month && date.getDate() === day;
|
|
1305
|
+
const utTimer = new UtTimer('GET-RECENT-ACTIVE-USER-WEEK');
|
|
1306
|
+
const checkPoint = utTimer.checkPoint;
|
|
1307
|
+
const now = moment.tz('Asia/Taipei').toDate(); // 當前時間
|
|
1308
|
+
const dataList = await Promise.all(Array.from({ length: days }, (_, index) => index).map((dd, index) => {
|
|
1309
|
+
return new Promise(async (resolve, reject) => {
|
|
1310
|
+
const sql = `
|
|
1311
|
+
select count
|
|
1312
|
+
from \`${this.app}\`.visit_logs where
|
|
1313
|
+
DATE(${convertTimeZone('date')}) = DATE(DATE_SUB(${convertTimeZone('NOW()')}, INTERVAL ${index} DAY))
|
|
1314
|
+
`;
|
|
1315
|
+
const queryData = await db.query(sql, []);
|
|
1316
|
+
resolve((queryData[0] && queryData[0]['count']) || 0);
|
|
1421
1317
|
});
|
|
1422
|
-
|
|
1423
|
-
// 計算不重複的 mac_address
|
|
1424
|
-
const uniqueMacAddresses = new Set(filteredData.map((item: any) => item.mac_address));
|
|
1425
|
-
|
|
1426
|
-
return {
|
|
1427
|
-
year,
|
|
1428
|
-
month,
|
|
1429
|
-
day,
|
|
1430
|
-
total_count: filteredData.length,
|
|
1431
|
-
unique_count: uniqueMacAddresses.size,
|
|
1432
|
-
};
|
|
1433
|
-
});
|
|
1434
|
-
|
|
1435
|
-
const result = dataList.map(data => data.unique_count);
|
|
1436
|
-
|
|
1318
|
+
}));
|
|
1437
1319
|
return {
|
|
1438
|
-
count_array:
|
|
1320
|
+
count_array: dataList.reverse(), // 將結果反轉,保證時間順序為最近到最遠
|
|
1439
1321
|
};
|
|
1440
1322
|
}
|
|
1441
1323
|
|
|
@@ -1446,16 +1328,16 @@ export class DataAnalyze {
|
|
|
1446
1328
|
await new Promise(resolve => {
|
|
1447
1329
|
for (let index = 0; index < 30; index++) {
|
|
1448
1330
|
const monthCheckoutSQL = `
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1331
|
+
SELECT count(1)
|
|
1332
|
+
FROM \`${this.app}\`.t_user
|
|
1333
|
+
WHERE
|
|
1334
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1335
|
+
, INTERVAL ${index} DAY))
|
|
1336
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1337
|
+
, INTERVAL ${index} DAY))
|
|
1338
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1339
|
+
, INTERVAL ${index} DAY))
|
|
1340
|
+
AND status <> 0;
|
|
1459
1341
|
`;
|
|
1460
1342
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
1461
1343
|
countArray[index] = data[0]['count(1)'];
|
|
@@ -1494,16 +1376,16 @@ export class DataAnalyze {
|
|
|
1494
1376
|
await new Promise(resolve => {
|
|
1495
1377
|
for (let index = 0; index < days; index++) {
|
|
1496
1378
|
const monthCheckoutSQL = `
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
1501
|
-
|
|
1502
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1379
|
+
SELECT count(1)
|
|
1380
|
+
FROM \`${this.app}\`.t_user
|
|
1381
|
+
WHERE
|
|
1382
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
1383
|
+
, INTERVAL ${index} DAY))
|
|
1384
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
1385
|
+
, INTERVAL ${index} DAY))
|
|
1386
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone(formatEndDate)}
|
|
1387
|
+
, INTERVAL ${index} DAY))
|
|
1388
|
+
AND status <> 0;
|
|
1507
1389
|
`;
|
|
1508
1390
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
1509
1391
|
countArray[index] = data[0]['count(1)'];
|
|
@@ -1538,16 +1420,16 @@ export class DataAnalyze {
|
|
|
1538
1420
|
await new Promise(resolve => {
|
|
1539
1421
|
for (let index = 0; index < 14; index++) {
|
|
1540
1422
|
const monthCheckoutSQL = `
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
|
|
1545
|
-
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1550
|
-
|
|
1423
|
+
SELECT count(1)
|
|
1424
|
+
FROM \`${this.app}\`.t_user
|
|
1425
|
+
WHERE
|
|
1426
|
+
DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1427
|
+
, INTERVAL ${index} DAY))
|
|
1428
|
+
AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1429
|
+
, INTERVAL ${index} DAY))
|
|
1430
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1431
|
+
, INTERVAL ${index} DAY))
|
|
1432
|
+
AND status <> 0;
|
|
1551
1433
|
`;
|
|
1552
1434
|
db.query(monthCheckoutSQL, []).then(data => {
|
|
1553
1435
|
countArray[index] = data[0]['count(1)'];
|
|
@@ -1589,12 +1471,12 @@ export class DataAnalyze {
|
|
|
1589
1471
|
await new Promise(resolve => {
|
|
1590
1472
|
for (let index = 0; index < 12; index++) {
|
|
1591
1473
|
const monthRegisterSQL = `
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1474
|
+
SELECT count(1)
|
|
1475
|
+
FROM \`${this.app}\`.t_user
|
|
1476
|
+
WHERE MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1477
|
+
, INTERVAL ${index} MONTH))
|
|
1478
|
+
AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
|
|
1479
|
+
, INTERVAL ${index} MONTH))
|
|
1598
1480
|
`;
|
|
1599
1481
|
db.query(monthRegisterSQL, []).then(data => {
|
|
1600
1482
|
pass++;
|