ts-glitter 21.0.8 → 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.
Files changed (36) hide show
  1. package/lowcode/Entry.js +1 -1
  2. package/lowcode/Entry.ts +1 -1
  3. package/lowcode/cms-plugin/data-analyze-orders.js +1 -0
  4. package/lowcode/cms-plugin/data-analyze-orders.ts +1 -1
  5. package/lowcode/cms-plugin/data-analyze.js +21 -1
  6. package/lowcode/cms-plugin/data-analyze.ts +24 -25
  7. package/lowcode/public-components/checkout/index.js +4 -2
  8. package/lowcode/public-components/checkout/index.ts +7 -3
  9. package/lowcode/public-components/modules/cart-module.js +1 -0
  10. package/lowcode/public-components/modules/cart-module.ts +1 -0
  11. package/lowcode/public-components/user-manager/um-order.js +1 -1
  12. package/lowcode/public-components/user-manager/um-order.ts +1 -1
  13. package/package.json +1 -1
  14. package/src/api-public/controllers/index.js.map +1 -1
  15. package/src/api-public/controllers/index.ts +1 -0
  16. package/src/api-public/services/checkout-event.js +2 -1
  17. package/src/api-public/services/checkout-event.js.map +1 -1
  18. package/src/api-public/services/checkout-event.ts +2 -1
  19. package/src/api-public/services/data-analyze.d.ts +4 -4
  20. package/src/api-public/services/data-analyze.js +205 -283
  21. package/src/api-public/services/data-analyze.js.map +1 -1
  22. package/src/api-public/services/data-analyze.ts +214 -332
  23. package/src/api-public/services/public-table-check.js +13 -0
  24. package/src/api-public/services/public-table-check.js.map +1 -1
  25. package/src/api-public/services/public-table-check.ts +13 -0
  26. package/src/api-public/services/schedule.d.ts +1 -0
  27. package/src/api-public/services/schedule.js +87 -54
  28. package/src/api-public/services/schedule.js.map +1 -1
  29. package/src/api-public/services/schedule.ts +101 -57
  30. package/src/api-public/services/shopping.js +2 -0
  31. package/src/api-public/services/shopping.js.map +1 -1
  32. package/src/api-public/services/shopping.ts +1 -0
  33. package/src/run.js +2 -3
  34. package/src/run.js.map +1 -1
  35. package/src/run.ts +1 -1
  36. /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
- FROM \`${this.app}\`.t_voucher_history`,
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
- SELECT *
143
- FROM \`${this.app}\`.t_user
144
- WHERE online_time BETWEEN DATE_SUB(NOW(), INTERVAL 10 MINUTE) AND NOW();
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
- SELECT *
149
- FROM \`${this.app}\`.t_user
150
- WHERE MONTH (online_time) = MONTH (NOW()) AND YEAR (online_time) = YEAR (NOW());
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
- 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});
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
- 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});
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
- 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};
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
- SELECT orderData ->>'$.orderSource' as orderSource, orderData
355
- FROM \`${this.app}\`.t_checkout
356
- WHERE DATE (${convertTimeZone('created_time')}) = ${dayOffset}
357
- AND ${orderCountingSQL};
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
- SELECT orderData ->>'$.orderSource' as orderSource, orderData
412
- FROM \`${this.app}\`.t_checkout
413
- WHERE DATE (${convertTimeZone('created_time')}) = ${dayOffset}
414
- AND ${orderCountingSQL};
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
- SELECT orderData ->>'$.orderSource' as orderSource, orderData
473
- FROM \`${this.app}\`.t_checkout
474
- WHERE DATE (${convertTimeZone('created_time')}) = ${dayOffset}
475
- AND ${orderCountingSQL};
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
- 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};
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
- 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};
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
- 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};
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
- 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};
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
- 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};
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
- 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};
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
- 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};
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
- 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};
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
- 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}
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
- // 計算第 index 個月前的日期
1265
- const targetDate = new Date(now.getFullYear(), now.getMonth() - index, 1);
1266
-
1267
- const year = targetDate.getFullYear();
1268
- const month = targetDate.getMonth() + 1; // 月份從 0 開始,需要加 1
1269
-
1270
- // 篩選該月份的資料
1271
- const filteredData = queryData.filter((item: any) => {
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: result.reverse(), // 將結果反轉,保證時間順序為最近到最遠
1256
+ count_array: dataList.reverse(), // 將結果反轉,保證時間順序為最近到最遠
1291
1257
  };
1292
1258
  }
1293
1259
 
1294
1260
  async getActiveRecentWeek() {
1295
- const sql = `
1296
- SELECT mac_address, ${convertTimeZone('created_time')} AS created_time
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
- const targetDate = new Date(now.getTime());
1311
- targetDate.setDate(new Date(now.getTime()).getDate() - index); // 設定為第 index 天前的日期
1312
-
1313
- const year = targetDate.getFullYear();
1314
- const month = targetDate.getMonth() + 1; // 月份從 0 開始,需要加 1
1315
- const day = targetDate.getDate();
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: result.reverse(), // 將結果反轉,保證時間順序為最近到最遠
1276
+ count_array: dataList.reverse(), // 將結果反轉,保證時間順序為最近到最遠
1339
1277
  };
1340
1278
  }
1341
1279
 
1342
1280
  async getActiveRecentMonth() {
1343
- const sql = `
1344
- SELECT mac_address, ${convertTimeZone('created_time')} AS created_time
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
- const targetDate = new Date(now.getTime());
1359
- targetDate.setDate(new Date(now.getTime()).getDate() - index); // 設定為第 index 天前的日期
1360
-
1361
- const year = targetDate.getFullYear();
1362
- const month = targetDate.getMonth() + 1; // 月份從 0 開始,需要加 1
1363
- const day = targetDate.getDate();
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: result.reverse(), // 將結果反轉,保證時間順序為最近到最遠
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 sql = `
1396
- SELECT mac_address, ${convertTimeZone('created_time')} AS created_time
1397
- FROM \`${saasConfig.SAAS_NAME}\`.t_monitor
1398
- WHERE app_name = ${db.escape(this.app)}
1399
- AND req_type = 'file'
1400
- AND ${convertTimeZone('created_time')}
1401
- BETWEEN ${convertTimeZone(formatStartDate)}
1402
- AND ${convertTimeZone(formatEndDate)}
1403
- GROUP BY id, mac_address
1404
- `;
1405
-
1406
- const queryData = await db.query(sql, []);
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: result.reverse(), // 將結果反轉,保證時間順序為最近到最遠
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
- SELECT count(1)
1450
- FROM \`${this.app}\`.t_user
1451
- WHERE
1452
- DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
1453
- , INTERVAL ${index} DAY))
1454
- AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
1455
- , INTERVAL ${index} DAY))
1456
- AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
1457
- , INTERVAL ${index} DAY))
1458
- AND status <> 0;
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
- SELECT count(1)
1498
- FROM \`${this.app}\`.t_user
1499
- WHERE
1500
- DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone(formatEndDate)}
1501
- , INTERVAL ${index} DAY))
1502
- AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone(formatEndDate)}
1503
- , INTERVAL ${index} DAY))
1504
- AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone(formatEndDate)}
1505
- , INTERVAL ${index} DAY))
1506
- AND status <> 0;
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
- SELECT count(1)
1542
- FROM \`${this.app}\`.t_user
1543
- WHERE
1544
- DAY (${convertTimeZone('created_time')}) = DAY (DATE_SUB(${convertTimeZone('NOW()')}
1545
- , INTERVAL ${index} DAY))
1546
- AND MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
1547
- , INTERVAL ${index} DAY))
1548
- AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
1549
- , INTERVAL ${index} DAY))
1550
- AND status <> 0;
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
- SELECT count(1)
1593
- FROM \`${this.app}\`.t_user
1594
- WHERE MONTH (${convertTimeZone('created_time')}) = MONTH (DATE_SUB(${convertTimeZone('NOW()')}
1595
- , INTERVAL ${index} MONTH))
1596
- AND YEAR (${convertTimeZone('created_time')}) = YEAR (DATE_SUB(${convertTimeZone('NOW()')}
1597
- , INTERVAL ${index} MONTH))
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++;