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.
@@ -7,7 +7,7 @@ import { User } from './user';
7
7
  import { Shopping } from './shopping';
8
8
  import { Mail } from '../services/mail.js';
9
9
  import { AutoSendEmail } from './auto-send-email.js';
10
- import { saasConfig } from '../../config';
10
+ import { ConfigSetting, saasConfig } from '../../config';
11
11
  import { InitialFakeData } from './initial-fake-data.js';
12
12
  import { LineMessage } from './line-message';
13
13
  import { ApiPublic } from './public-table-check.js';
@@ -15,6 +15,7 @@ import { App } from '../../services/app.js';
15
15
  import { UserUpdate } from './user-update.js';
16
16
  import { Firebase } from '../../modules/firebase.js';
17
17
  import { Invoice } from './invoice.js';
18
+ import process from 'process';
18
19
 
19
20
  type ScheduleItem = {
20
21
  second: number;
@@ -43,11 +44,11 @@ export class Schedule {
43
44
 
44
45
  async isDatabasePass(app: string) {
45
46
  const SQL = `
46
- SELECT *
47
- FROM ${saasConfig.SAAS_NAME}.app_config
48
- WHERE appName = \'${app}\'
49
- AND (refer_app is null OR refer_app = appName);
50
- `;
47
+ SELECT *
48
+ FROM ${saasConfig.SAAS_NAME}.app_config
49
+ WHERE appName = \'${app}\'
50
+ AND (refer_app is null OR refer_app = appName);
51
+ `;
51
52
  return (await db.query(SQL, [])).length > 0;
52
53
  }
53
54
 
@@ -78,15 +79,15 @@ export class Schedule {
78
79
  const config = await new User(app).getConfigV2({ key: 'login_config', user_id: 'manager' });
79
80
  if (config?.auto_cancel_order_timer && config.auto_cancel_order_timer > 0) {
80
81
  const orders = await db.query(
81
- `SELECT * FROM \`${app}\`.t_checkout
82
- WHERE
83
- status = 0
84
- AND order_status='0'
85
- AND progress='wait'
86
- AND payment_method != 'cash_on_delivery'
82
+ `SELECT *
83
+ FROM \`${app}\`.t_checkout
84
+ WHERE status = 0
85
+ AND order_status = '0'
86
+ AND progress = 'wait'
87
+ AND payment_method != 'cash_on_delivery'
87
88
  AND created_time < NOW() - INTERVAL ${config.auto_cancel_order_timer} HOUR
88
- AND (orderData->>'$.proof_purchase' IS NULL)
89
- ORDER BY id DESC;`,
89
+ AND (orderData->>'$.proof_purchase' IS NULL)
90
+ ORDER BY id DESC;`,
90
91
  []
91
92
  );
92
93
  await Promise.all(
@@ -117,7 +118,11 @@ export class Schedule {
117
118
  for (const app of Schedule.app) {
118
119
  try {
119
120
  if (await this.perload(app)) {
120
- const users = await db.query(`select * from \`${app}\`.t_user `, []);
121
+ const users = await db.query(
122
+ `select *
123
+ from \`${app}\`.t_user `,
124
+ []
125
+ );
121
126
  for (const user of users) {
122
127
  //更新會籍
123
128
  await new User(app).checkMember(user, true);
@@ -170,8 +175,8 @@ export class Schedule {
170
175
 
171
176
  const users = await db.query(
172
177
  `SELECT *
173
- FROM \`${app}\`.t_user
174
- WHERE MONTH (JSON_EXTRACT(userData, '$.birth')) = MONTH (CURDATE());`,
178
+ FROM \`${app}\`.t_user
179
+ WHERE MONTH (JSON_EXTRACT(userData, '$.birth')) = MONTH (CURDATE());`,
175
180
  []
176
181
  );
177
182
 
@@ -235,8 +240,8 @@ export class Schedule {
235
240
  // 當月生日之顧客
236
241
  const users = await db.query(
237
242
  `SELECT *
238
- FROM \`${app}\`.t_user
239
- WHERE MONTH (JSON_EXTRACT(userData, '$.birth')) = MONTH (CURDATE());`,
243
+ FROM \`${app}\`.t_user
244
+ WHERE MONTH (JSON_EXTRACT(userData, '$.birth')) = MONTH (CURDATE());`,
240
245
  []
241
246
  );
242
247
 
@@ -302,11 +307,11 @@ export class Schedule {
302
307
  try {
303
308
  if (await this.perload(app)) {
304
309
  const orders = await db.query(
305
- `SELECT * FROM \`${app}\`.t_triggers
306
- WHERE
307
- tag = 'triggerInvoice' AND
308
- status = 0 AND
309
- DATE_FORMAT(trigger_time, '%Y-%m-%d %H') = DATE_FORMAT(NOW(), '%Y-%m-%d %H');`,
310
+ `SELECT *
311
+ FROM \`${app}\`.t_triggers
312
+ WHERE tag = 'triggerInvoice'
313
+ AND status = 0
314
+ AND DATE_FORMAT(trigger_time, '%Y-%m-%d %H') = DATE_FORMAT(NOW(), '%Y-%m-%d %H');`,
310
315
  []
311
316
  );
312
317
  for (const order of orders) {
@@ -330,11 +335,11 @@ export class Schedule {
330
335
  try {
331
336
  if (await this.perload(app)) {
332
337
  const emails = await db.query(
333
- `SELECT * FROM \`${app}\`.t_triggers
334
- WHERE
335
- tag = 'sendFCM' AND
336
- status = 0 AND
337
- DATE_FORMAT(trigger_time, '%Y-%m-%d %H:%i') = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');`,
338
+ `SELECT *
339
+ FROM \`${app}\`.t_triggers
340
+ WHERE tag = 'sendFCM'
341
+ AND status = 0
342
+ AND DATE_FORMAT(trigger_time, '%Y-%m-%d %H:%i') = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');`,
338
343
  []
339
344
  );
340
345
  for (const email of emails) {
@@ -351,6 +356,7 @@ export class Schedule {
351
356
  setTimeout(() => this.autoSendMail(sec), sec * 1000);
352
357
  console.log(`autoSendMail-Stop`, (new Date().getTime() - clock.getTime()) / 1000);
353
358
  }
359
+
354
360
  async autoSendMail(sec: number) {
355
361
  let clock = new Date();
356
362
  console.log(`autoSendLine`);
@@ -358,11 +364,11 @@ export class Schedule {
358
364
  try {
359
365
  if (await this.perload(app)) {
360
366
  const emails = await db.query(
361
- `SELECT * FROM \`${app}\`.t_triggers
362
- WHERE
363
- tag = 'sendMailBySchedule' AND
364
- status = 0 AND
365
- DATE_FORMAT(trigger_time, '%Y-%m-%d %H:%i') = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');`,
367
+ `SELECT *
368
+ FROM \`${app}\`.t_triggers
369
+ WHERE tag = 'sendMailBySchedule'
370
+ AND status = 0
371
+ AND DATE_FORMAT(trigger_time, '%Y-%m-%d %H:%i') = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');`,
366
372
  []
367
373
  );
368
374
  for (const email of emails) {
@@ -386,10 +392,10 @@ export class Schedule {
386
392
  try {
387
393
  if (await this.perload(app)) {
388
394
  const emails = await db.query(
389
- `SELECT * FROM \`${app}\`.t_triggers
390
- WHERE
391
- tag = 'sendLineBySchedule' AND
392
- DATE_FORMAT(trigger_time, '%Y-%m-%d %H:%i') = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');`,
395
+ `SELECT *
396
+ FROM \`${app}\`.t_triggers
397
+ WHERE tag = 'sendLineBySchedule'
398
+ AND DATE_FORMAT(trigger_time, '%Y-%m-%d %H:%i') = DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i');`,
393
399
  []
394
400
  );
395
401
 
@@ -429,7 +435,9 @@ export class Schedule {
429
435
  if (
430
436
  (
431
437
  await db.query(
432
- `select count(1) from \`${saasConfig.SAAS_NAME}\`.currency_config where updated='${date_index}'`,
438
+ `select count(1)
439
+ from \`${saasConfig.SAAS_NAME}\`.currency_config
440
+ where updated = '${date_index}'`,
433
441
  []
434
442
  )
435
443
  )[0]['count(1)'] === 0
@@ -444,10 +452,11 @@ export class Schedule {
444
452
  axios
445
453
  .request(config)
446
454
  .then(async (response: any) => {
447
- await db.query(`insert into \`${saasConfig.SAAS_NAME}\`.currency_config (\`json\`,updated) values (?,?)`, [
448
- JSON.stringify(response.data),
449
- date_index,
450
- ]);
455
+ await db.query(
456
+ `insert into \`${saasConfig.SAAS_NAME}\`.currency_config (\`json\`, updated)
457
+ values (?, ?)`,
458
+ [JSON.stringify(response.data), date_index]
459
+ );
451
460
  setTimeout(() => this.currenciesUpdate(sec), sec * 1000);
452
461
  })
453
462
  .catch((error: any) => {
@@ -460,21 +469,56 @@ export class Schedule {
460
469
  }
461
470
  }
462
471
 
472
+ async visitLogs(sec: number) {
473
+ let clock = new Date();
474
+
475
+ function convertTimeZone(date: string) {
476
+ return `CONVERT_TZ(${date}, '+00:00', '+08:00')`;
477
+ }
478
+ console.log(`visitLogs`);
479
+ for (const app of Schedule.app) {
480
+ try {
481
+ if (await this.perload(app)) {
482
+ const count = await db.query(
483
+ ` SELECT COUNT(DISTINCT mac_address) as count , CONVERT_TZ(NOW(), '+00:00', '+08:00') as now
484
+ FROM ${process.env.GLITTER_DB}.t_monitor
485
+ WHERE app_name = ${db.escape(app)}
486
+ AND req_type = 'file'
487
+ AND ${convertTimeZone('created_time')} BETWEEN (DATE_SUB(${convertTimeZone('NOW()')}
488
+ , INTERVAL 1 DAY))
489
+ AND ${convertTimeZone('NOW()')}`,
490
+ []
491
+ );
492
+ await db.query(`replace into \`${app}\`.visit_logs (date, count,tag_name) values (?, ? , ?)`,[count[0]['now'], count[0]['count'],(`${count[0]['now'].toISOString()}`).substring(0,10)]);
493
+ }
494
+ } catch (e) {
495
+ console.error('BAD_REQUEST', 'visitLogs Error: ' + e, null);
496
+ }
497
+ }
498
+ setTimeout(() => this.visitLogs(sec), sec * 1000);
499
+ console.log(`visitLogs-Stop`, (new Date().getTime() - clock.getTime()) / 1000);
500
+ }
501
+
463
502
  main() {
464
- const scheduleList: ScheduleItem[] = [
465
- // { second: 10, status: false, func: 'example', desc: '排程啟用範例' },
466
- { second: 3600, status: true, func: 'birthRebate', desc: '生日禮發放購物金' },
467
- { second: 3600, status: true, func: 'birthBlessMail', desc: '生日祝福信件' },
468
- { second: 600, status: true, func: 'renewMemberLevel', desc: '更新會員分級' },
469
- { second: 30, status: true, func: 'resetVoucherHistory', desc: '未付款歷史優惠券重設' },
470
- { second: 30, status: true, func: 'autoSendMail', desc: '自動排程寄送信件' },
471
- { second: 30, status: true, func: 'autoSendFCM', desc: '自動排程寄送FCM' },
472
- { second: 30, status: true, func: 'autoSendLine', desc: '自動排程寄送line訊息' },
473
- { second: 3600 * 24, status: true, func: 'currenciesUpdate', desc: '多國貨幣的更新排程' },
474
- // { second: 3600 * 24, status: false, func: 'initialSampleApp', desc: '重新刷新示範商店' },
475
- { second: 30, status: true, func: 'autoCancelOrder', desc: '自動取消未付款未出貨訂單' },
476
- { second: 30, status: true, func: 'autoTriggerInvoice', desc: '自動開立發票' },
477
- ];
503
+ const scheduleList: ScheduleItem[] = ConfigSetting.is_local
504
+ ? //線下測試環境
505
+ [ { second: 60 * 5, status: true, func: 'visitLogs', desc: '更新每天造訪人數' },]
506
+ : //線上環境
507
+ [
508
+ // { second: 10, status: false, func: 'example', desc: '排程啟用範例' },
509
+ { second: 3600, status: true, func: 'birthRebate', desc: '生日禮發放購物金' },
510
+ { second: 3600, status: true, func: 'birthBlessMail', desc: '生日祝福信件' },
511
+ { second: 600, status: true, func: 'renewMemberLevel', desc: '更新會員分級' },
512
+ { second: 30, status: true, func: 'resetVoucherHistory', desc: '未付款歷史優惠券重設' },
513
+ { second: 30, status: true, func: 'autoSendMail', desc: '自動排程寄送信件' },
514
+ { second: 30, status: true, func: 'autoSendFCM', desc: '自動排程寄送FCM' },
515
+ { second: 30, status: true, func: 'autoSendLine', desc: '自動排程寄送line訊息' },
516
+ { second: 3600 * 24, status: true, func: 'currenciesUpdate', desc: '多國貨幣的更新排程' },
517
+ // { second: 3600 * 24, status: false, func: 'initialSampleApp', desc: '重新刷新示範商店' },
518
+ { second: 30, status: true, func: 'autoCancelOrder', desc: '自動取消未付款未出貨訂單' },
519
+ { second: 30, status: true, func: 'autoTriggerInvoice', desc: '自動開立發票' },
520
+ { second: 60 * 5, status: true, func: 'visitLogs', desc: '更新每天造訪人數' },
521
+ ];
478
522
  try {
479
523
  scheduleList.forEach(schedule => {
480
524
  if (schedule.status && typeof this[schedule.func] === 'function') {
package/src/run.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isDanielEnv = void 0;
6
+ exports.isDanielEnv = isDanielEnv;
7
7
  const path_1 = __importDefault(require("path"));
8
8
  const fs_1 = __importDefault(require("fs"));
9
9
  const index_1 = require("./index");
@@ -13,7 +13,7 @@ const danielPath = `/Users/daniellin/Desktop/GlitterEnv/staging.env`;
13
13
  const zackPath = `/Users/wangjianzhi/Desktop/CODENEX/staging.env`;
14
14
  if (fs_1.default.existsSync(path_1.default.resolve(wangPath))) {
15
15
  console.log('使用 Wang 路徑環境');
16
- config_1.ConfigSetting.runSchedule = false;
16
+ config_1.ConfigSetting.runSchedule = true;
17
17
  config_1.ConfigSetting.setConfig(wangPath);
18
18
  }
19
19
  if (fs_1.default.existsSync(path_1.default.resolve(danielPath))) {
@@ -29,7 +29,6 @@ if (fs_1.default.existsSync(path_1.default.resolve(zackPath))) {
29
29
  function isDanielEnv() {
30
30
  return fs_1.default.existsSync(path_1.default.resolve(danielPath));
31
31
  }
32
- exports.isDanielEnv = isDanielEnv;
33
32
  (0, index_1.initial)(4000).then(async () => {
34
33
  });
35
34
  //# sourceMappingURL=run.js.map
package/src/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["run.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,4CAAoB;AACpB,mCAAkC;AAClC,qCAAyC;AAEzC,MAAM,QAAQ,GAAG,sGAAsG,CAAC;AACxH,MAAM,UAAU,GAAG,iDAAiD,CAAC;AACrE,MAAM,QAAQ,GAAG,gDAAgD,CAAC;AAElE,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,sBAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAClC,sBAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,sBAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAClC,sBAAa,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,sBAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAClC,sBAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACjD,CAAC;AAFD,kCAEC;AAED,IAAA,eAAO,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;AAG9B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["run.ts"],"names":[],"mappings":";;;;;AA2BA,kCAEC;AA7BD,gDAAwB;AACxB,4CAAoB;AACpB,mCAAkC;AAClC,qCAAyC;AAEzC,MAAM,QAAQ,GAAG,sGAAsG,CAAC;AACxH,MAAM,UAAU,GAAG,iDAAiD,CAAC;AACrE,MAAM,QAAQ,GAAG,gDAAgD,CAAC;AAElE,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,sBAAa,CAAC,WAAW,GAAG,IAAI,CAAC;IACjC,sBAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,sBAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAClC,sBAAa,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;AACtC,CAAC;AAED,IAAI,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,sBAAa,CAAC,WAAW,GAAG,KAAK,CAAC;IAClC,sBAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,YAAE,CAAC,UAAU,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,IAAA,eAAO,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;AAG9B,CAAC,CAAC,CAAC"}
package/src/run.ts CHANGED
@@ -9,7 +9,7 @@ const zackPath = `/Users/wangjianzhi/Desktop/CODENEX/staging.env`;
9
9
 
10
10
  if (fs.existsSync(path.resolve(wangPath))) {
11
11
  console.log('使用 Wang 路徑環境');
12
- ConfigSetting.runSchedule = false;
12
+ ConfigSetting.runSchedule = true;
13
13
  ConfigSetting.setConfig(wangPath);
14
14
  }
15
15
 
File without changes