ts-glitter 16.4.2 → 16.4.3

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 (52) hide show
  1. package/lowcode/Entry.js +3 -3
  2. package/lowcode/Entry.ts +3 -3
  3. package/lowcode/cms-plugin/module/order-setting.js +20 -2
  4. package/lowcode/cms-plugin/module/order-setting.ts +19 -2
  5. package/lowcode/cms-plugin/module/product-excel.js +32 -27
  6. package/lowcode/cms-plugin/module/product-excel.ts +40 -32
  7. package/lowcode/cms-plugin/module/product-setting.js +21 -5
  8. package/lowcode/cms-plugin/module/product-setting.ts +21 -5
  9. package/lowcode/cms-plugin/shopping-product-setting.ts +0 -1
  10. package/lowcode/cms-plugin/stock-history.js +1467 -540
  11. package/lowcode/cms-plugin/stock-history.ts +1530 -556
  12. package/lowcode/css/editor.css +8 -2
  13. package/lowcode/glitter-base/route/stock.js +1 -0
  14. package/lowcode/glitter-base/route/stock.ts +11 -2
  15. package/lowcode/jspage/function-page/setting_editor.ts +8 -0
  16. package/package.json +1 -1
  17. package/src/api-public/controllers/index.js +5 -0
  18. package/src/api-public/controllers/index.js.map +1 -1
  19. package/src/api-public/controllers/index.ts +5 -0
  20. package/src/api-public/controllers/shopee.d.ts +3 -0
  21. package/src/api-public/controllers/shopee.js +8 -0
  22. package/src/api-public/controllers/shopee.js.map +1 -0
  23. package/src/api-public/controllers/shopee.ts +45 -0
  24. package/src/api-public/controllers/stock.js +1 -0
  25. package/src/api-public/controllers/stock.js.map +1 -1
  26. package/src/api-public/controllers/stock.ts +1 -0
  27. package/src/api-public/services/ai-pointes.js.map +1 -1
  28. package/src/api-public/services/fake-data-model/fake-order.js.map +1 -1
  29. package/src/api-public/services/fake-data-model/fake-product.js.map +1 -1
  30. package/src/api-public/services/shopee.d.ts +7 -0
  31. package/src/api-public/services/shopee.js +19 -0
  32. package/src/api-public/services/shopee.js.map +1 -0
  33. package/src/api-public/services/shopee.ts +37 -0
  34. package/src/api-public/services/shopping.js +16 -2
  35. package/src/api-public/services/shopping.js.map +1 -1
  36. package/src/api-public/services/shopping.ts +23 -2
  37. package/src/api-public/services/sms-pointes.js.map +1 -1
  38. package/src/api-public/services/stock.d.ts +10 -1
  39. package/src/api-public/services/stock.js +136 -7
  40. package/src/api-public/services/stock.js.map +1 -1
  41. package/src/api-public/services/stock.ts +174 -17
  42. package/src/api-public/services/wallet.js.map +1 -1
  43. package/src/config.d.ts +2 -0
  44. package/src/config.js +2 -0
  45. package/src/config.js.map +1 -1
  46. package/src/config.ts +2 -0
  47. package/src/modules/tool.d.ts +1 -0
  48. package/src/modules/tool.js +12 -1
  49. package/src/modules/tool.js.map +1 -1
  50. package/src/modules/tool.ts +13 -114
  51. package/src/services/saas-table-check.js +2 -2
  52. package/src/services/saas-table-check.js.map +1 -1
@@ -8,46 +8,78 @@ import { ApiShop } from '../glitter-base/route/shopping.js';
8
8
  import { ApiStock } from '../glitter-base/route/stock.js';
9
9
  import { StockStores } from './stock-stores.js';
10
10
  import { StockVendors } from './stock-vendors.js';
11
+ import { CheckInput } from '../modules/checkInput.js';
11
12
  const html = String.raw;
12
13
  const typeConfig = {
13
14
  restocking: {
14
15
  name: '進貨',
16
+ status: {
17
+ 0: {
18
+ title: '已完成',
19
+ badge: 'info',
20
+ },
21
+ 1: {
22
+ title: '已補貨',
23
+ badge: 'info',
24
+ },
25
+ 2: {
26
+ title: '待進貨',
27
+ badge: 'warning',
28
+ },
29
+ 3: {
30
+ title: '核對中',
31
+ badge: 'warning',
32
+ },
33
+ 4: {
34
+ title: '已暫停',
35
+ badge: 'normal',
36
+ },
37
+ 5: {
38
+ title: '待補貨',
39
+ badge: 'notify',
40
+ },
41
+ 6: {
42
+ title: '已取消',
43
+ badge: 'notify',
44
+ },
45
+ },
15
46
  },
16
47
  transfer: {
17
48
  name: '調撥',
49
+ status: {
50
+ 0: {
51
+ title: '已完成',
52
+ badge: 'info',
53
+ },
54
+ 1: {
55
+ title: '已補貨',
56
+ badge: 'info',
57
+ },
58
+ 2: {
59
+ title: '待調撥',
60
+ badge: 'warning',
61
+ },
62
+ 3: {
63
+ title: '核對中',
64
+ badge: 'warning',
65
+ },
66
+ 4: {
67
+ title: '已暫停',
68
+ badge: 'normal',
69
+ },
70
+ 5: {
71
+ title: '待補貨',
72
+ badge: 'notify',
73
+ },
74
+ 6: {
75
+ title: '已取消',
76
+ badge: 'notify',
77
+ },
78
+ },
18
79
  },
19
80
  checking: {
20
81
  name: '盤點',
21
- },
22
- };
23
- const statusConfig = {
24
- 0: {
25
- title: '已完成',
26
- badge: 'info',
27
- },
28
- 1: {
29
- title: '已補貨',
30
- badge: 'info',
31
- },
32
- 2: {
33
- title: '待進貨',
34
- badge: 'warning',
35
- },
36
- 3: {
37
- title: '核對中',
38
- badge: 'warning',
39
- },
40
- 4: {
41
- title: '已暫停',
42
- badge: 'normal',
43
- },
44
- 5: {
45
- title: '待補貨',
46
- badge: 'notify',
47
- },
48
- 6: {
49
- title: '已取消',
50
- badge: 'notify',
82
+ status: {},
51
83
  },
52
84
  };
53
85
  export class StockHistory {
@@ -68,6 +100,7 @@ export class StockHistory {
68
100
  check_according: 'all',
69
101
  note: '',
70
102
  product_list: [],
103
+ changeLogs: [],
71
104
  },
72
105
  };
73
106
  };
@@ -96,7 +129,29 @@ export class StockHistory {
96
129
  return this.checkList(gvc, vm);
97
130
  }
98
131
  if (vm.view === 'replace') {
99
- return this.replaceOrder(gvc, vm);
132
+ const glitter = gvc.glitter;
133
+ const dialog = new ShareDialog(glitter);
134
+ dialog.dataLoading({ visible: true });
135
+ return new Promise((resolve) => {
136
+ ApiStock.getStockHistory({
137
+ page: 0,
138
+ limit: 1,
139
+ order_id: vm.data.order_id,
140
+ search: '',
141
+ type: vm.data.type,
142
+ }).then((r) => {
143
+ if (r.result && r.response.data[0]) {
144
+ resolve(r.response.data[0]);
145
+ }
146
+ else {
147
+ resolve(emptyData());
148
+ }
149
+ });
150
+ }).then((data) => {
151
+ dialog.dataLoading({ visible: false });
152
+ vm.data = data;
153
+ return this.replaceOrder(gvc, vm);
154
+ });
100
155
  }
101
156
  if (vm.view === 'create') {
102
157
  vm.data = emptyData();
@@ -113,38 +168,84 @@ export class StockHistory {
113
168
  let vmi = undefined;
114
169
  function getDatalist() {
115
170
  return vm.dataList.map((dd) => {
116
- return [
117
- {
118
- key: '進貨單編號',
119
- value: `<span class="fs-7">${dd.order_id}</span>`,
120
- },
121
- {
122
- key: '進貨日期',
123
- value: `<span class="fs-7">${dd.created_time}</span>`,
124
- },
125
- {
126
- key: '庫存點名稱',
127
- value: `<span class="fs-7">${(() => {
128
- const store = vm.storeList.find((s) => s.id === dd.content.store_in);
129
- return store ? store.name : '';
130
- })()}</span>`,
131
- },
132
- {
133
- key: '總金額',
134
- value: `<span class="fs-7">$ ${(dd.content.total_price || 0).toLocaleString()}</span>`,
135
- },
136
- {
137
- key: '供應商',
138
- value: `<span class="fs-7">${(() => {
139
- const vendor = vm.vendorList.find((v) => v.id === dd.content.vendor);
140
- return vendor ? vendor.name : '';
141
- })()}</span>`,
142
- },
143
- {
144
- key: '進貨狀態',
145
- value: `<span class="fs-7">${StockHistory.getStatusBadge(dd.status)}</span>`,
146
- },
147
- ];
171
+ switch (dd.type) {
172
+ case 'restocking':
173
+ return [
174
+ {
175
+ key: `${typeData.name}單編號`,
176
+ value: `<span class="fs-7">${dd.order_id}</span>`,
177
+ },
178
+ {
179
+ key: `${typeData.name}日期`,
180
+ value: `<span class="fs-7">${dd.created_time}</span>`,
181
+ },
182
+ {
183
+ key: '庫存點名稱',
184
+ value: html `<span class="fs-7"
185
+ >${(() => {
186
+ const store = vm.storeList.find((s) => s.id === dd.content.store_in);
187
+ return store ? store.name : '';
188
+ })()}</span
189
+ >`,
190
+ },
191
+ {
192
+ key: '總金額',
193
+ value: `<span class="fs-7">$ ${(dd.content.total_price || 0).toLocaleString()}</span>`,
194
+ },
195
+ {
196
+ key: '供應商',
197
+ value: html `<span class="fs-7"
198
+ >${(() => {
199
+ const vendor = vm.vendorList.find((v) => v.id === dd.content.vendor);
200
+ return vendor ? vendor.name : '';
201
+ })()}</span
202
+ >`,
203
+ },
204
+ {
205
+ key: `${typeData.name}狀態`,
206
+ value: `<span class="fs-7">${StockHistory.getStatusBadge(dd.type, dd.status)}</span>`,
207
+ },
208
+ ];
209
+ case 'transfer':
210
+ return [
211
+ {
212
+ key: `${typeData.name}單編號`,
213
+ value: `<span class="fs-7">${dd.order_id}</span>`,
214
+ },
215
+ {
216
+ key: `${typeData.name}日期`,
217
+ value: `<span class="fs-7">${dd.created_time}</span>`,
218
+ },
219
+ {
220
+ key: '調出庫存點',
221
+ value: html `<span class="fs-7"
222
+ >${(() => {
223
+ const store = vm.storeList.find((s) => s.id === dd.content.store_out);
224
+ return store ? store.name : '';
225
+ })()}</span
226
+ >`,
227
+ },
228
+ {
229
+ key: '調入庫存點',
230
+ value: html `<span class="fs-7"
231
+ >${(() => {
232
+ const store = vm.storeList.find((s) => s.id === dd.content.store_in);
233
+ return store ? store.name : '';
234
+ })()}</span
235
+ >`,
236
+ },
237
+ {
238
+ key: '備註',
239
+ value: `<span class="fs-7">${dd.content.note}</span>`,
240
+ },
241
+ {
242
+ key: `${typeData.name}狀態`,
243
+ value: `<span class="fs-7">${StockHistory.getStatusBadge(dd.type, dd.status)}</span>`,
244
+ },
245
+ ];
246
+ case 'checking':
247
+ return [];
248
+ }
148
249
  });
149
250
  }
150
251
  return BgWidget.container(html ` <div class="title-container">
@@ -252,13 +353,13 @@ export class StockHistory {
252
353
  iconId: glitter.getUUID(),
253
354
  type: 'all',
254
355
  };
255
- function specDatalist(page, limit) {
356
+ function checkSpecTable(page, limit) {
256
357
  const x = (page - 1) * limit;
257
358
  const specs = vm.data.content.product_list.slice(x, x + limit);
258
359
  return specs.map((dd, index) => {
259
- var _a, _b, _c;
360
+ var _a, _b, _c, _d, _e;
260
361
  const realData = vm.data.content.product_list[x + index];
261
- return [
362
+ const startArr = [
262
363
  {
263
364
  key: '商品',
264
365
  value: `<span class="fs-7">${dd.title || '-'}</span>`,
@@ -275,32 +376,8 @@ export class StockHistory {
275
376
  key: '商品條碼',
276
377
  value: `<span class="fs-7">${dd.sku || '-'}</span>`,
277
378
  },
278
- {
279
- key: '原定進貨數量',
280
- value: `<span class="fs-7">${(_a = dd.transfer_count) !== null && _a !== void 0 ? _a : 0}</span>`,
281
- },
282
- {
283
- key: '實際到貨數量',
284
- value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
285
- <input
286
- class="form-control"
287
- type="number"
288
- min="0"
289
- style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
290
- onchange="${gvc.event((e) => {
291
- let n = parseInt(e.value, 10);
292
- if (n < 0) {
293
- n = 0;
294
- e.value = n;
295
- }
296
- realData.recent_count = isNaN(n) ? undefined : n;
297
- gvc.notifyDataChange(cvm.buttonsId);
298
- gvc.notifyDataChange(`${cvm.iconId}${index}`);
299
- })}"
300
- value="${(_b = dd.recent_count) !== null && _b !== void 0 ? _b : ''}"
301
- />
302
- </div>`,
303
- },
379
+ ];
380
+ const endArr = [
304
381
  {
305
382
  key: '備註',
306
383
  value: html ` <div style="width: 120px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
@@ -311,7 +388,7 @@ export class StockHistory {
311
388
  onchange="${gvc.event((e) => {
312
389
  realData.note = e.value;
313
390
  })}"
314
- value="${(_c = dd.note) !== null && _c !== void 0 ? _c : ''}"
391
+ value="${(_a = dd.note) !== null && _a !== void 0 ? _a : ''}"
315
392
  />
316
393
  </div>`,
317
394
  },
@@ -323,24 +400,87 @@ export class StockHistory {
323
400
  if (realData.recent_count === undefined) {
324
401
  return '';
325
402
  }
326
- if (realData.transfer_count === realData.recent_count) {
327
- return html `<i class="fa-solid fa-circle-check"></i>`;
328
- }
329
- if (realData.transfer_count !== realData.recent_count) {
403
+ if (realData.transfer_count > realData.recent_count) {
330
404
  return html `<i class="fa-light fa-circle-exclamation"></i>`;
331
405
  }
332
- return '';
406
+ return html `<i class="fa-solid fa-circle-check"></i>`;
333
407
  },
334
408
  }),
335
409
  },
336
410
  ];
411
+ switch (vm.data.type) {
412
+ case 'restocking':
413
+ return [
414
+ ...startArr,
415
+ {
416
+ key: '原定進貨數量',
417
+ value: `<span class="fs-7">${(_b = dd.transfer_count) !== null && _b !== void 0 ? _b : 0}</span>`,
418
+ },
419
+ {
420
+ key: '實際到貨數量',
421
+ value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
422
+ <input
423
+ class="form-control"
424
+ type="number"
425
+ min="0"
426
+ style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
427
+ onchange="${gvc.event((e) => {
428
+ let n = parseInt(e.value, 10);
429
+ if (n < 0) {
430
+ n = 0;
431
+ e.value = n;
432
+ }
433
+ realData.recent_count = isNaN(n) ? undefined : n;
434
+ gvc.notifyDataChange(cvm.buttonsId);
435
+ gvc.notifyDataChange(`${cvm.iconId}${index}`);
436
+ })}"
437
+ value="${(_c = dd.recent_count) !== null && _c !== void 0 ? _c : ''}"
438
+ />
439
+ </div>`,
440
+ },
441
+ ...endArr,
442
+ ];
443
+ case 'transfer':
444
+ return [
445
+ ...startArr,
446
+ {
447
+ key: '原定調入數量',
448
+ value: `<span class="fs-7">${(_d = dd.transfer_count) !== null && _d !== void 0 ? _d : 0}</span>`,
449
+ },
450
+ {
451
+ key: '實際調入數量',
452
+ value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
453
+ <input
454
+ class="form-control"
455
+ type="number"
456
+ min="0"
457
+ style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
458
+ onchange="${gvc.event((e) => {
459
+ let n = parseInt(e.value, 10);
460
+ if (n < 0) {
461
+ n = 0;
462
+ e.value = n;
463
+ }
464
+ realData.recent_count = isNaN(n) ? undefined : n;
465
+ gvc.notifyDataChange(cvm.buttonsId);
466
+ gvc.notifyDataChange(`${cvm.iconId}${index}`);
467
+ })}"
468
+ value="${(_e = dd.recent_count) !== null && _e !== void 0 ? _e : ''}"
469
+ />
470
+ </div>`,
471
+ },
472
+ ...endArr,
473
+ ];
474
+ case 'checking':
475
+ return [...startArr, ...endArr];
476
+ }
337
477
  });
338
478
  }
339
479
  return BgWidget.container(html `
340
480
  <div class="title-container">
341
481
  ${BgWidget.goBack(gvc.event(() => {
342
482
  vm.view = 'replace';
343
- }))}${BgWidget.title('進貨核對')}
483
+ }))}${BgWidget.title(`${typeData.name}核對`)}
344
484
  <div class="flex-fill"></div>
345
485
  </div>
346
486
  <div class="title-container">
@@ -417,7 +557,7 @@ export class StockHistory {
417
557
  vm.data.content.product_list = response;
418
558
  vmi.pageSize = Math.ceil(response.length / limit);
419
559
  vmi.originalData = response;
420
- vmi.tableData = specDatalist(vmi.page, limit);
560
+ vmi.tableData = checkSpecTable(vmi.page, limit);
421
561
  vmi.loading = false;
422
562
  vmi.callback();
423
563
  });
@@ -439,237 +579,381 @@ export class StockHistory {
439
579
  })}
440
580
  `);
441
581
  }
442
- static createOrder(gvc, vm) {
582
+ static getFormStructure(gvc, vm) {
443
583
  const glitter = gvc.glitter;
444
- const dialog = new ShareDialog(glitter);
445
- const typeData = typeConfig[vm.type];
446
- const dvm = {
447
- id: glitter.getUUID(),
448
- tableId: glitter.getUUID(),
449
- totalId: glitter.getUUID(),
450
- variantIds: [],
451
- tableLoading: true,
452
- };
453
- function getFormStructure() {
454
- var _a;
455
- switch (vm.type) {
456
- case 'restocking':
457
- return [
458
- html ` <div class="row">
459
- <div class="col-12 col-md-6">
460
- <div class="tx_normal">進貨單編號</div>
461
- ${BgWidget.mbContainer(8)}
462
- ${BgWidget.editeInput({
463
- gvc: gvc,
464
- title: '',
465
- default: vm.data.order_id || '系統將自動產生流水號',
466
- placeHolder: '',
467
- callback: () => { },
468
- readonly: true,
469
- })}
470
- </div>
471
- ${document.body.clientWidth > 768 ? '' : BgWidget.mbContainer(18)}
472
- <div class="col-12 col-md-6">
473
- <div class="tx_normal">進貨日期</div>
474
- ${BgWidget.mbContainer(8)}
475
- ${BgWidget.editeInput({
476
- gvc: gvc,
477
- title: '',
478
- type: 'date',
479
- default: (_a = vm.data.created_time) !== null && _a !== void 0 ? _a : '',
480
- placeHolder: '請輸入進貨日期',
481
- callback: (text) => {
482
- vm.data.created_time = text;
483
- },
484
- })}
485
- </div>
486
- </div>`,
487
- html `<div class="row">
488
- <div class="col-12 col-md-6">
489
- <div class="tx_normal">供應商</div>
490
- ${BgWidget.mbContainer(8)}
491
- ${gvc.bindView((() => {
492
- const id = glitter.getUUID();
493
- let dataList = [];
494
- let loading = true;
495
- return {
496
- bind: id,
497
- view: () => {
498
- var _a;
499
- if (loading) {
500
- return BgWidget.spinner({
501
- container: { style: 'margin-top: 0;' },
502
- circle: { visible: false },
503
- });
504
- }
505
- else {
506
- return BgWidget.selectOptionAndClickEvent({
507
- gvc: gvc,
508
- default: (_a = vm.data.content.vendor) !== null && _a !== void 0 ? _a : '',
509
- options: dataList.map((item) => {
510
- return {
511
- key: item.id,
512
- value: item.name,
513
- note: item.address,
514
- };
515
- }),
516
- showNote: BgWidget.grayNote((() => {
517
- const d = dataList.find((item) => {
518
- return item.id === vm.data.content.vendor;
584
+ switch (vm.type) {
585
+ case 'restocking':
586
+ return [
587
+ html `<div class="row">
588
+ <div class="col-12 col-md-6">
589
+ <div class="tx_normal">供應商</div>
590
+ ${BgWidget.mbContainer(8)}
591
+ ${gvc.bindView((() => {
592
+ const id = glitter.getUUID();
593
+ let dataList = [];
594
+ let loading = true;
595
+ return {
596
+ bind: id,
597
+ view: () => {
598
+ var _a;
599
+ if (loading) {
600
+ return BgWidget.spinner({
601
+ container: { style: 'margin-top: 0;' },
602
+ circle: { visible: false },
603
+ });
604
+ }
605
+ else {
606
+ return BgWidget.selectOptionAndClickEvent({
607
+ gvc: gvc,
608
+ default: (_a = vm.data.content.vendor) !== null && _a !== void 0 ? _a : '',
609
+ options: dataList.map((item) => {
610
+ return {
611
+ key: item.id,
612
+ value: item.name,
613
+ note: item.address,
614
+ };
615
+ }),
616
+ showNote: BgWidget.grayNote((() => {
617
+ const d = dataList.find((item) => {
618
+ return item.id === vm.data.content.vendor;
619
+ });
620
+ return d ? d.address : '';
621
+ })(), 'margin: 0 4px;'),
622
+ callback: (data) => {
623
+ vm.data.content.vendor = data ? data.key : '';
624
+ gvc.notifyDataChange(id);
625
+ },
626
+ clickElement: {
627
+ html: html `<div>新增供應商</div>
628
+ <div>
629
+ <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
630
+ </div>`,
631
+ event: (gvc2) => {
632
+ const newVendorData = StockVendors.emptyData();
633
+ BgWidget.settingDialog({
634
+ gvc: gvc2,
635
+ title: '新增供應點',
636
+ innerHTML: (gvc2) => {
637
+ return StockHistory.vendorForm(gvc2, newVendorData);
638
+ },
639
+ footer_html: (gvc2) => {
640
+ return `${BgWidget.cancel(gvc2.event(() => {
641
+ gvc2.closeDialog();
642
+ }))}
643
+ ${BgWidget.save(gvc2.event(() => {
644
+ StockVendors.verifyStoreForm(glitter, 'create', newVendorData, (response) => {
645
+ gvc2.closeDialog();
646
+ vm.data.content.vendor = response.id;
647
+ loading = true;
648
+ gvc.notifyDataChange(id);
649
+ });
650
+ }), '完成')}`;
651
+ },
519
652
  });
520
- return d ? d.address : '';
521
- })(), 'margin: 0 4px;'),
522
- callback: (data) => {
523
- vm.data.content.vendor = data ? data.key : '';
524
- gvc.notifyDataChange(id);
525
653
  },
526
- clickElement: {
527
- html: html `<div>新增供應商</div>
528
- <div>
529
- <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
530
- </div>`,
531
- event: (gvc2) => {
532
- const newVendorData = StockVendors.emptyData();
533
- BgWidget.settingDialog({
534
- gvc: gvc2,
535
- title: '新增供應點',
536
- innerHTML: (gvc2) => {
537
- return StockHistory.vendorForm(gvc2, newVendorData);
538
- },
539
- footer_html: (gvc2) => {
540
- return `${BgWidget.cancel(gvc2.event(() => {
654
+ },
655
+ });
656
+ }
657
+ },
658
+ divCreate: {},
659
+ onCreate: () => {
660
+ if (loading) {
661
+ ApiUser.getPublicConfig('vendor_manager', 'manager').then((dd) => {
662
+ if (dd.result && dd.response.value) {
663
+ dataList = dd.response.value.list;
664
+ }
665
+ loading = false;
666
+ gvc.notifyDataChange(id);
667
+ });
668
+ }
669
+ },
670
+ };
671
+ })())}
672
+ </div>
673
+ <div class="col-12 col-md-6">
674
+ <div class="tx_normal">庫存點</div>
675
+ ${BgWidget.mbContainer(8)}
676
+ ${gvc.bindView((() => {
677
+ const id = glitter.getUUID();
678
+ let dataList = [];
679
+ let loading = true;
680
+ return {
681
+ bind: id,
682
+ view: () => {
683
+ var _a;
684
+ if (loading) {
685
+ return BgWidget.spinner({
686
+ container: { style: 'margin-top: 0;' },
687
+ circle: { visible: false },
688
+ });
689
+ }
690
+ else {
691
+ return BgWidget.selectOptionAndClickEvent({
692
+ gvc: gvc,
693
+ default: (_a = vm.data.content.store_in) !== null && _a !== void 0 ? _a : '',
694
+ options: dataList.map((item) => {
695
+ return {
696
+ key: item.id,
697
+ value: item.name,
698
+ note: item.address,
699
+ };
700
+ }),
701
+ showNote: BgWidget.grayNote((() => {
702
+ const d = dataList.find((item) => {
703
+ return item.id === vm.data.content.store_in;
704
+ });
705
+ return d ? d.address : '';
706
+ })(), 'margin: 0 4px;'),
707
+ callback: (data) => {
708
+ vm.data.content.store_in = data ? data.key : '';
709
+ gvc.notifyDataChange(id);
710
+ },
711
+ clickElement: {
712
+ html: html `<div>新增庫存點</div>
713
+ <div>
714
+ <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
715
+ </div>`,
716
+ event: (gvc2) => {
717
+ const newStoreData = StockStores.emptyData();
718
+ BgWidget.settingDialog({
719
+ gvc: gvc2,
720
+ title: '新增庫存點',
721
+ innerHTML: (gvc2) => {
722
+ return StockHistory.storeForm(gvc2, newStoreData);
723
+ },
724
+ footer_html: (gvc2) => {
725
+ return `${BgWidget.cancel(gvc2.event(() => {
726
+ gvc2.closeDialog();
727
+ }))}
728
+ ${BgWidget.save(gvc2.event(() => {
729
+ StockStores.verifyStoreForm(glitter, 'create', newStoreData, (response) => {
541
730
  gvc2.closeDialog();
542
- }))}
543
- ${BgWidget.save(gvc2.event(() => {
544
- StockVendors.verifyStoreForm(glitter, 'create', newVendorData, (response) => {
545
- gvc2.closeDialog();
546
- vm.data.content.vendor = response.id;
547
- loading = true;
548
- gvc.notifyDataChange(id);
549
- });
550
- }), '完成')}`;
551
- },
552
- });
553
- },
731
+ vm.data.content.store_in = response.id;
732
+ loading = true;
733
+ gvc.notifyDataChange(id);
734
+ });
735
+ }), '完成')}`;
736
+ },
737
+ });
554
738
  },
555
- });
556
- }
557
- },
558
- divCreate: {},
559
- onCreate: () => {
560
- if (loading) {
561
- ApiUser.getPublicConfig('vendor_manager', 'manager').then((dd) => {
562
- if (dd.result && dd.response.value) {
563
- dataList = dd.response.value.list;
564
- }
565
- loading = false;
739
+ },
740
+ });
741
+ }
742
+ },
743
+ divCreate: {},
744
+ onCreate: () => {
745
+ if (loading) {
746
+ ApiUser.getPublicConfig('store_manager', 'manager').then((dd) => {
747
+ if (dd.result && dd.response.value) {
748
+ dataList = dd.response.value.list;
749
+ }
750
+ loading = false;
751
+ gvc.notifyDataChange(id);
752
+ });
753
+ }
754
+ },
755
+ };
756
+ })())}
757
+ </div>
758
+ </div> `,
759
+ ];
760
+ case 'transfer':
761
+ return [
762
+ html `<div class="row">
763
+ <div class="col-12 col-md-6">
764
+ <div class="tx_normal">調出庫存點</div>
765
+ ${BgWidget.mbContainer(8)}
766
+ ${gvc.bindView((() => {
767
+ const id = glitter.getUUID();
768
+ let dataList = [];
769
+ let loading = true;
770
+ return {
771
+ bind: id,
772
+ view: () => {
773
+ var _a;
774
+ if (loading) {
775
+ return BgWidget.spinner({
776
+ container: { style: 'margin-top: 0;' },
777
+ circle: { visible: false },
778
+ });
779
+ }
780
+ else {
781
+ return BgWidget.selectOptionAndClickEvent({
782
+ gvc: gvc,
783
+ default: (_a = vm.data.content.store_out) !== null && _a !== void 0 ? _a : '',
784
+ options: dataList.map((item) => {
785
+ return {
786
+ key: item.id,
787
+ value: item.name,
788
+ note: item.address,
789
+ };
790
+ }),
791
+ showNote: BgWidget.grayNote((() => {
792
+ const d = dataList.find((item) => {
793
+ return item.id === vm.data.content.store_out;
794
+ });
795
+ return d ? d.address : '';
796
+ })(), 'margin: 0 4px;'),
797
+ callback: (data) => {
798
+ vm.data.content.store_out = data ? data.key : '';
566
799
  gvc.notifyDataChange(id);
567
- });
568
- }
569
- },
570
- };
571
- })())}
572
- </div>
573
- <div class="col-12 col-md-6">
574
- <div class="tx_normal">庫存點</div>
575
- ${BgWidget.mbContainer(8)}
576
- ${gvc.bindView((() => {
577
- const id = glitter.getUUID();
578
- let dataList = [];
579
- let loading = true;
580
- return {
581
- bind: id,
582
- view: () => {
583
- var _a;
584
- if (loading) {
585
- return BgWidget.spinner({
586
- container: { style: 'margin-top: 0;' },
587
- circle: { visible: false },
588
- });
589
- }
590
- else {
591
- return BgWidget.selectOptionAndClickEvent({
592
- gvc: gvc,
593
- default: (_a = vm.data.content.store_in) !== null && _a !== void 0 ? _a : '',
594
- options: dataList.map((item) => {
595
- return {
596
- key: item.id,
597
- value: item.name,
598
- note: item.address,
599
- };
600
- }),
601
- showNote: BgWidget.grayNote((() => {
602
- const d = dataList.find((item) => {
603
- return item.id === vm.data.content.store_in;
800
+ },
801
+ clickElement: {
802
+ html: html `<div>新增庫存點</div>
803
+ <div>
804
+ <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
805
+ </div>`,
806
+ event: (gvc2) => {
807
+ const newStoreData = StockStores.emptyData();
808
+ BgWidget.settingDialog({
809
+ gvc: gvc2,
810
+ title: '新增庫存點',
811
+ innerHTML: (gvc2) => {
812
+ return StockHistory.storeForm(gvc2, newStoreData);
813
+ },
814
+ footer_html: (gvc2) => {
815
+ return `${BgWidget.cancel(gvc2.event(() => {
816
+ gvc2.closeDialog();
817
+ }))}
818
+ ${BgWidget.save(gvc2.event(() => {
819
+ StockStores.verifyStoreForm(glitter, 'create', newStoreData, (response) => {
820
+ gvc2.closeDialog();
821
+ vm.data.content.store_out = response.id;
822
+ loading = true;
823
+ gvc.notifyDataChange(id);
824
+ });
825
+ }), '完成')}`;
826
+ },
604
827
  });
605
- return d ? d.address : '';
606
- })(), 'margin: 0 4px;'),
607
- callback: (data) => {
608
- vm.data.content.store_in = data ? data.key : '';
609
- gvc.notifyDataChange(id);
610
828
  },
611
- clickElement: {
612
- html: html `<div>新增庫存點</div>
613
- <div>
614
- <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
615
- </div>`,
616
- event: (gvc2) => {
617
- const newStoreData = StockStores.emptyData();
618
- BgWidget.settingDialog({
619
- gvc: gvc2,
620
- title: '新增庫存點',
621
- innerHTML: (gvc2) => {
622
- return StockHistory.storeForm(gvc2, newStoreData);
623
- },
624
- footer_html: (gvc2) => {
625
- return `${BgWidget.cancel(gvc2.event(() => {
829
+ },
830
+ });
831
+ }
832
+ },
833
+ divCreate: {},
834
+ onCreate: () => {
835
+ if (loading) {
836
+ ApiUser.getPublicConfig('store_manager', 'manager').then((dd) => {
837
+ if (dd.result && dd.response.value) {
838
+ dataList = dd.response.value.list;
839
+ }
840
+ loading = false;
841
+ gvc.notifyDataChange(id);
842
+ });
843
+ }
844
+ },
845
+ };
846
+ })())}
847
+ </div>
848
+ <div class="col-12 col-md-6">
849
+ <div class="tx_normal">調入庫存點</div>
850
+ ${BgWidget.mbContainer(8)}
851
+ ${gvc.bindView((() => {
852
+ const id = glitter.getUUID();
853
+ let dataList = [];
854
+ let loading = true;
855
+ return {
856
+ bind: id,
857
+ view: () => {
858
+ var _a;
859
+ if (loading) {
860
+ return BgWidget.spinner({
861
+ container: { style: 'margin-top: 0;' },
862
+ circle: { visible: false },
863
+ });
864
+ }
865
+ else {
866
+ return BgWidget.selectOptionAndClickEvent({
867
+ gvc: gvc,
868
+ default: (_a = vm.data.content.store_in) !== null && _a !== void 0 ? _a : '',
869
+ options: dataList.map((item) => {
870
+ return {
871
+ key: item.id,
872
+ value: item.name,
873
+ note: item.address,
874
+ };
875
+ }),
876
+ showNote: BgWidget.grayNote((() => {
877
+ const d = dataList.find((item) => {
878
+ return item.id === vm.data.content.store_in;
879
+ });
880
+ return d ? d.address : '';
881
+ })(), 'margin: 0 4px;'),
882
+ callback: (data) => {
883
+ vm.data.content.store_in = data ? data.key : '';
884
+ gvc.notifyDataChange(id);
885
+ },
886
+ clickElement: {
887
+ html: html `<div>新增庫存點</div>
888
+ <div>
889
+ <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
890
+ </div>`,
891
+ event: (gvc2) => {
892
+ const newStoreData = StockStores.emptyData();
893
+ BgWidget.settingDialog({
894
+ gvc: gvc2,
895
+ title: '新增庫存點',
896
+ innerHTML: (gvc2) => {
897
+ return StockHistory.storeForm(gvc2, newStoreData);
898
+ },
899
+ footer_html: (gvc2) => {
900
+ return `${BgWidget.cancel(gvc2.event(() => {
901
+ gvc2.closeDialog();
902
+ }))}
903
+ ${BgWidget.save(gvc2.event(() => {
904
+ StockStores.verifyStoreForm(glitter, 'create', newStoreData, (response) => {
626
905
  gvc2.closeDialog();
627
- }))}
628
- ${BgWidget.save(gvc2.event(() => {
629
- StockStores.verifyStoreForm(glitter, 'create', newStoreData, (response) => {
630
- gvc2.closeDialog();
631
- vm.data.content.store_in = response.id;
632
- loading = true;
633
- gvc.notifyDataChange(id);
634
- });
635
- }), '完成')}`;
636
- },
637
- });
638
- },
906
+ vm.data.content.store_in = response.id;
907
+ loading = true;
908
+ gvc.notifyDataChange(id);
909
+ });
910
+ }), '完成')}`;
911
+ },
912
+ });
639
913
  },
640
- });
641
- }
642
- },
643
- divCreate: {},
644
- onCreate: () => {
645
- if (loading) {
646
- ApiUser.getPublicConfig('store_manager', 'manager').then((dd) => {
647
- if (dd.result && dd.response.value) {
648
- dataList = dd.response.value.list;
649
- }
650
- loading = false;
651
- gvc.notifyDataChange(id);
652
- });
653
- }
654
- },
655
- };
656
- })())}
657
- </div>
658
- </div> `,
659
- ];
660
- case 'transfer':
661
- return [];
662
- case 'checking':
663
- return [];
664
- }
914
+ },
915
+ });
916
+ }
917
+ },
918
+ divCreate: {},
919
+ onCreate: () => {
920
+ if (loading) {
921
+ ApiUser.getPublicConfig('store_manager', 'manager').then((dd) => {
922
+ if (dd.result && dd.response.value) {
923
+ dataList = dd.response.value.list;
924
+ }
925
+ loading = false;
926
+ gvc.notifyDataChange(id);
927
+ });
928
+ }
929
+ },
930
+ };
931
+ })())}
932
+ </div>
933
+ </div> `,
934
+ ];
935
+ case 'checking':
936
+ return [];
665
937
  }
938
+ }
939
+ static createOrder(gvc, vm) {
940
+ const glitter = gvc.glitter;
941
+ const dialog = new ShareDialog(glitter);
942
+ const typeData = typeConfig[vm.type];
943
+ const dvm = {
944
+ id: glitter.getUUID(),
945
+ tableId: glitter.getUUID(),
946
+ totalId: glitter.getUUID(),
947
+ variantIds: [],
948
+ tableLoading: true,
949
+ };
666
950
  function specDatalist(page, limit) {
667
951
  const x = (page - 1) * limit;
668
952
  const specs = vm.data.content.product_list.slice(x, x + limit);
669
953
  return specs.map((dd, index) => {
670
- var _a, _b, _c;
954
+ var _a, _b, _c, _d;
671
955
  const realData = vm.data.content.product_list[x + index];
672
- return [
956
+ const startArr = [
673
957
  {
674
958
  key: '商品',
675
959
  value: `<span class="fs-7">${dd.title || '-'}</span>`,
@@ -682,61 +966,8 @@ export class StockHistory {
682
966
  key: '存貨單位(SKU)',
683
967
  value: `<span class="fs-7">${dd.sku || '-'}</span>`,
684
968
  },
685
- {
686
- key: '進貨成本',
687
- value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
688
- <input
689
- class="form-control"
690
- type="number"
691
- min="0"
692
- style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
693
- onchange="${gvc.event((e) => {
694
- let n = parseInt(e.value, 10);
695
- if (n < 0) {
696
- n = 0;
697
- e.value = n;
698
- }
699
- realData.cost = n;
700
- gvc.notifyDataChange(`subtotoal_${index}`);
701
- })}"
702
- value="${(_a = dd.cost) !== null && _a !== void 0 ? _a : 0}"
703
- />
704
- </div>`,
705
- },
706
- {
707
- key: '數量',
708
- value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
709
- <input
710
- class="form-control"
711
- type="number"
712
- min="0"
713
- style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
714
- onchange="${gvc.event((e) => {
715
- let n = parseInt(e.value, 10);
716
- if (n < 0) {
717
- n = 0;
718
- e.value = n;
719
- }
720
- realData.transfer_count = n;
721
- gvc.notifyDataChange(`subtotoal_${index}`);
722
- })}"
723
- value="${(_b = dd.transfer_count) !== null && _b !== void 0 ? _b : 0}"
724
- />
725
- </div>`,
726
- },
727
- {
728
- key: '小計',
729
- value: gvc.bindView({
730
- bind: `subtotoal_${index}`,
731
- view: () => {
732
- const subtotal = dd.cost * dd.transfer_count;
733
- return html `<span class="fs-7">$ ${subtotal.toLocaleString()}</span>`;
734
- },
735
- onCreate: () => {
736
- gvc.notifyDataChange(dvm.totalId);
737
- },
738
- }),
739
- },
969
+ ];
970
+ const endArr = [
740
971
  {
741
972
  key: '備註',
742
973
  value: html ` <div style="width: 120px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
@@ -747,11 +978,105 @@ export class StockHistory {
747
978
  onchange="${gvc.event((e) => {
748
979
  realData.note = e.value;
749
980
  })}"
750
- value="${(_c = dd.note) !== null && _c !== void 0 ? _c : ''}"
981
+ value="${(_a = dd.note) !== null && _a !== void 0 ? _a : ''}"
751
982
  />
752
983
  </div>`,
753
984
  },
754
985
  ];
986
+ switch (vm.data.type) {
987
+ case 'restocking':
988
+ return [
989
+ ...startArr,
990
+ {
991
+ key: '進貨成本',
992
+ value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
993
+ <input
994
+ class="form-control"
995
+ type="number"
996
+ min="0"
997
+ style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
998
+ onchange="${gvc.event((e) => {
999
+ let n = parseInt(e.value, 10);
1000
+ if (n < 0) {
1001
+ n = 0;
1002
+ e.value = n;
1003
+ }
1004
+ realData.cost = n;
1005
+ gvc.notifyDataChange(`subtotoal_${index}`);
1006
+ })}"
1007
+ value="${(_b = dd.cost) !== null && _b !== void 0 ? _b : 0}"
1008
+ />
1009
+ </div>`,
1010
+ },
1011
+ {
1012
+ key: '數量',
1013
+ value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
1014
+ <input
1015
+ class="form-control"
1016
+ type="number"
1017
+ min="0"
1018
+ style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
1019
+ onchange="${gvc.event((e) => {
1020
+ let n = parseInt(e.value, 10);
1021
+ if (n < 0) {
1022
+ n = 0;
1023
+ e.value = n;
1024
+ }
1025
+ realData.transfer_count = n;
1026
+ gvc.notifyDataChange(`subtotoal_${index}`);
1027
+ })}"
1028
+ value="${(_c = dd.transfer_count) !== null && _c !== void 0 ? _c : 0}"
1029
+ />
1030
+ </div>`,
1031
+ },
1032
+ {
1033
+ key: '小計',
1034
+ value: gvc.bindView({
1035
+ bind: `subtotoal_${index}`,
1036
+ view: () => {
1037
+ const subtotal = dd.cost * dd.transfer_count;
1038
+ return html `<span class="fs-7">$ ${subtotal.toLocaleString()}</span>`;
1039
+ },
1040
+ onCreate: () => {
1041
+ gvc.notifyDataChange(dvm.totalId);
1042
+ },
1043
+ }),
1044
+ },
1045
+ ...endArr,
1046
+ ];
1047
+ case 'transfer':
1048
+ return [
1049
+ ...startArr,
1050
+ {
1051
+ key: '來源庫存數量',
1052
+ value: 'unknown',
1053
+ },
1054
+ {
1055
+ key: '調入數量',
1056
+ value: html ` <div style="width: 100px" onclick="${gvc.event((e, event) => event.stopPropagation())}">
1057
+ <input
1058
+ class="form-control"
1059
+ type="number"
1060
+ min="0"
1061
+ style="border-radius: 10px; border: 1px solid #DDD; padding-left: 18px;"
1062
+ onchange="${gvc.event((e) => {
1063
+ let n = parseInt(e.value, 10);
1064
+ if (n < 0) {
1065
+ n = 0;
1066
+ e.value = n;
1067
+ }
1068
+ realData.transfer_count = n;
1069
+ gvc.notifyDataChange(`subtotoal_${index}`);
1070
+ })}"
1071
+ value="${(_d = dd.transfer_count) !== null && _d !== void 0 ? _d : 0}"
1072
+ />
1073
+ </div>`,
1074
+ },
1075
+ ...endArr,
1076
+ ];
1077
+ case 'checking':
1078
+ return [...startArr, ...endArr];
1079
+ }
755
1080
  });
756
1081
  }
757
1082
  return BgWidget.container([
@@ -768,16 +1093,45 @@ export class StockHistory {
768
1093
  return {
769
1094
  bind: dvm.id,
770
1095
  view: () => {
771
- var _a;
1096
+ var _a, _b;
772
1097
  return [
773
1098
  BgWidget.mainCard([
774
1099
  html ` <div class="tx_700">${typeData.name}單資料</div>`,
775
- ...getFormStructure(),
1100
+ html ` <div class="row">
1101
+ <div class="col-12 col-md-6">
1102
+ <div class="tx_normal">${typeData.name}編號</div>
1103
+ ${BgWidget.mbContainer(8)}
1104
+ ${BgWidget.editeInput({
1105
+ gvc: gvc,
1106
+ title: '',
1107
+ default: vm.data.order_id || '系統將自動產生流水號',
1108
+ placeHolder: '',
1109
+ callback: () => { },
1110
+ readonly: true,
1111
+ })}
1112
+ </div>
1113
+ ${document.body.clientWidth > 768 ? '' : BgWidget.mbContainer(18)}
1114
+ <div class="col-12 col-md-6">
1115
+ <div class="tx_normal">${typeData.name}日期</div>
1116
+ ${BgWidget.mbContainer(8)}
1117
+ ${BgWidget.editeInput({
1118
+ gvc: gvc,
1119
+ title: '',
1120
+ type: 'date',
1121
+ default: (_a = vm.data.created_time) !== null && _a !== void 0 ? _a : '',
1122
+ placeHolder: `請輸入${typeData.name}日期`,
1123
+ callback: (text) => {
1124
+ vm.data.created_time = text;
1125
+ },
1126
+ })}
1127
+ </div>
1128
+ </div>`,
1129
+ ...this.getFormStructure(gvc, vm),
776
1130
  html ` <div class="tx_normal">備註</div>
777
1131
  ${EditorElem.editeText({
778
1132
  gvc: gvc,
779
1133
  title: '',
780
- default: (_a = vm.data.content.note) !== null && _a !== void 0 ? _a : '',
1134
+ default: (_b = vm.data.content.note) !== null && _b !== void 0 ? _b : '',
781
1135
  placeHolder: '請輸入備註',
782
1136
  callback: (text) => {
783
1137
  vm.data.content.note = text;
@@ -786,7 +1140,7 @@ export class StockHistory {
786
1140
  ].join(BgWidget.mbContainer(18))),
787
1141
  BgWidget.mainCard([
788
1142
  html `
789
- <div class="tx_700">進貨商品</div>
1143
+ <div class="tx_700">${typeData.name}商品</div>
790
1144
  ${BgWidget.mbContainer(18)}
791
1145
  ${gvc.bindView({
792
1146
  bind: dvm.tableId,
@@ -797,61 +1151,111 @@ export class StockHistory {
797
1151
  });
798
1152
  dvm.tableLoading = false;
799
1153
  }
800
- return [
801
- BgWidget.tableV3({
802
- gvc: gvc,
803
- getData: (vd) => {
804
- vmi = vd;
805
- const limit = 99999;
806
- this.setVariantList(dvm.variantIds, vm.data, (response) => {
807
- vm.data.content.product_list = response;
808
- vmi.pageSize = Math.ceil(response.length / limit);
809
- vmi.originalData = response;
810
- vmi.tableData = specDatalist(vmi.page, limit);
811
- vmi.loading = false;
812
- vmi.callback();
813
- });
814
- },
815
- rowClick: () => { },
816
- filter: [],
817
- hiddenPageSplit: true,
818
- }),
819
- html `<div
820
- class="w-100 d-flex align-items-center justify-content-center cursor_pointer"
821
- style="color: #36B; font-size: 16px; font-weight: 400;"
822
- onclick="${gvc.event(() => {
823
- BgWidget.variantDialog({
824
- gvc,
825
- title: '新增商品規格',
826
- default: dvm.variantIds,
827
- callback: (resultData) => {
828
- dvm.variantIds = resultData;
829
- gvc.notifyDataChange(dvm.tableId);
830
- },
831
- });
832
- })}"
833
- >
834
- <div>新增進貨商品</div>
835
- <div>
836
- <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
837
- </div>
838
- </div>`,
839
- BgWidget.horizontalLine({ margin: 1.75 }),
840
- gvc.bindView({
841
- bind: dvm.totalId,
842
- view: () => {
843
- const total = vm.data.content.product_list.reduce((sum, item) => {
844
- return sum + item.cost * item.transfer_count;
845
- }, 0);
846
- return html ` <div class="flex-fill"></div>
847
- <div class="d-flex justify-content-between tx_700" style="width: 200px;">
848
- <div>進貨總成本</div>
849
- <div>$ ${total.toLocaleString()}</div>
850
- </div>`;
851
- },
852
- divCreate: { class: 'd-flex w-100' },
853
- }),
854
- ].join('');
1154
+ switch (vm.data.type) {
1155
+ case 'restocking':
1156
+ return [
1157
+ BgWidget.tableV3({
1158
+ gvc: gvc,
1159
+ getData: (vd) => {
1160
+ vmi = vd;
1161
+ const limit = 99999;
1162
+ this.setVariantList(dvm.variantIds, vm.data, (response) => {
1163
+ vm.data.content.product_list = response;
1164
+ vmi.pageSize = Math.ceil(response.length / limit);
1165
+ vmi.originalData = response;
1166
+ vmi.tableData = specDatalist(vmi.page, limit);
1167
+ vmi.loading = false;
1168
+ vmi.callback();
1169
+ });
1170
+ },
1171
+ rowClick: () => { },
1172
+ filter: [],
1173
+ hiddenPageSplit: true,
1174
+ }),
1175
+ html `<div
1176
+ class="w-100 d-flex align-items-center justify-content-center cursor_pointer"
1177
+ style="color: #36B; font-size: 16px; font-weight: 400;"
1178
+ onclick="${gvc.event(() => {
1179
+ BgWidget.variantDialog({
1180
+ gvc,
1181
+ title: '搜尋商品',
1182
+ default: dvm.variantIds,
1183
+ callback: (resultData) => {
1184
+ dvm.variantIds = resultData;
1185
+ gvc.notifyDataChange(dvm.tableId);
1186
+ },
1187
+ });
1188
+ })}"
1189
+ >
1190
+ <div>新增${typeData.name}商品</div>
1191
+ <div>
1192
+ <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
1193
+ </div>
1194
+ </div>`,
1195
+ BgWidget.horizontalLine({ margin: 1.75 }),
1196
+ gvc.bindView({
1197
+ bind: dvm.totalId,
1198
+ view: () => {
1199
+ const total = vm.data.content.product_list.reduce((sum, item) => {
1200
+ return sum + item.cost * item.transfer_count;
1201
+ }, 0);
1202
+ return html ` <div class="flex-fill"></div>
1203
+ <div class="d-flex justify-content-between tx_700" style="width: 200px;">
1204
+ <div>進貨總成本</div>
1205
+ <div>$ ${total.toLocaleString()}</div>
1206
+ </div>`;
1207
+ },
1208
+ divCreate: { class: 'd-flex w-100' },
1209
+ }),
1210
+ ].join('');
1211
+ case 'transfer':
1212
+ return [
1213
+ BgWidget.tableV3({
1214
+ gvc: gvc,
1215
+ getData: (vd) => {
1216
+ vmi = vd;
1217
+ const limit = 99999;
1218
+ this.setVariantList(dvm.variantIds, vm.data, (response) => {
1219
+ vm.data.content.product_list = response;
1220
+ vmi.pageSize = Math.ceil(response.length / limit);
1221
+ vmi.originalData = response;
1222
+ vmi.tableData = specDatalist(vmi.page, limit);
1223
+ vmi.loading = false;
1224
+ vmi.callback();
1225
+ });
1226
+ },
1227
+ rowClick: () => { },
1228
+ filter: [],
1229
+ hiddenPageSplit: true,
1230
+ }),
1231
+ html `<div
1232
+ class="w-100 d-flex align-items-center justify-content-center cursor_pointer"
1233
+ style="color: #36B; font-size: 16px; font-weight: 400;"
1234
+ onclick="${gvc.event(() => {
1235
+ if (CheckInput.isEmpty(vm.data.content.store_out)) {
1236
+ dialog.errorMessage({ text: '請先選擇「調出庫存點」' });
1237
+ return;
1238
+ }
1239
+ BgWidget.variantDialog({
1240
+ gvc,
1241
+ title: '搜尋商品',
1242
+ default: dvm.variantIds,
1243
+ callback: (resultData) => {
1244
+ dvm.variantIds = resultData;
1245
+ gvc.notifyDataChange(dvm.tableId);
1246
+ },
1247
+ });
1248
+ })}"
1249
+ >
1250
+ <div>新增${typeData.name}商品</div>
1251
+ <div>
1252
+ <i class="fa-solid fa-plus ps-2" style="font-size: 16px; height: 14px; width: 14px;"></i>
1253
+ </div>
1254
+ </div>`,
1255
+ ].join('');
1256
+ case 'checking':
1257
+ return ['全部商品', '特定分類', '特定商品'].join('');
1258
+ }
855
1259
  },
856
1260
  })}
857
1261
  `,
@@ -868,6 +1272,38 @@ export class StockHistory {
868
1272
  vm.view = 'mainList';
869
1273
  }))}
870
1274
  ${BgWidget.save(gvc.event(() => {
1275
+ if (CheckInput.isEmpty(vm.data.created_time)) {
1276
+ dialog.errorMessage({ text: `請輸入${typeData.name}時間` });
1277
+ return;
1278
+ }
1279
+ if (vm.data.type === 'restocking') {
1280
+ if (CheckInput.isEmpty(vm.data.content.vendor)) {
1281
+ dialog.errorMessage({ text: '請輸入供應商' });
1282
+ return;
1283
+ }
1284
+ if (CheckInput.isEmpty(vm.data.content.store_in)) {
1285
+ dialog.errorMessage({ text: '請輸入庫存點' });
1286
+ return;
1287
+ }
1288
+ }
1289
+ if (vm.data.type === 'transfer') {
1290
+ if (CheckInput.isEmpty(vm.data.content.store_out)) {
1291
+ dialog.errorMessage({ text: '請輸入調出庫存點' });
1292
+ return;
1293
+ }
1294
+ if (CheckInput.isEmpty(vm.data.content.store_in)) {
1295
+ dialog.errorMessage({ text: '請輸入調入庫存點' });
1296
+ return;
1297
+ }
1298
+ if (vm.data.content.store_in === vm.data.content.store_out) {
1299
+ dialog.errorMessage({ text: '調出與調入的庫存點不可相同' });
1300
+ return;
1301
+ }
1302
+ }
1303
+ if (vm.data.content.product_list.length === 0) {
1304
+ dialog.errorMessage({ text: `請新增${typeData.name}商品` });
1305
+ return;
1306
+ }
871
1307
  dialog.dataLoading({ visible: true });
872
1308
  if (vm.data.id === '') {
873
1309
  ApiStock.postStockHistory(vm.data).then((r) => {
@@ -897,29 +1333,34 @@ export class StockHistory {
897
1333
  </div>`,
898
1334
  ].join('<div class="my-2"></div>'));
899
1335
  }
900
- static replaceOrder(gvc, vm) {
901
- const glitter = gvc.glitter;
902
- const dialog = new ShareDialog(glitter);
903
- const typeData = typeConfig[vm.type];
904
- let vmi = undefined;
905
- function specDatalist(page, limit) {
906
- const x = (page - 1) * limit;
907
- const nonDetailed = [0, 1, 2].includes(vm.data.status);
908
- return vm.data.content.product_list.slice(x, x + limit).map((dd, index) => {
909
- if (nonDetailed) {
1336
+ static restockingDetailTable(json) {
1337
+ const x = (json.page - 1) * json.limit;
1338
+ return json.list.slice(x, x + json.limit).map((dd) => {
1339
+ var _a, _b, _c;
1340
+ const startArr = [
1341
+ {
1342
+ key: '商品',
1343
+ value: `<span class="fs-7">${dd.title || '-'}</span>`,
1344
+ },
1345
+ {
1346
+ key: '規格',
1347
+ value: `<span class="fs-7">${dd.spec}</span>`,
1348
+ },
1349
+ {
1350
+ key: '存貨單位(SKU)',
1351
+ value: `<span class="fs-7">${dd.sku || '-'}</span>`,
1352
+ },
1353
+ ];
1354
+ const endArr = [
1355
+ {
1356
+ key: '備註',
1357
+ value: `<span class="fs-7">${dd.note || '-'}</span>`,
1358
+ },
1359
+ ];
1360
+ switch (json.type) {
1361
+ case 'nonDetails':
910
1362
  return [
911
- {
912
- key: '商品',
913
- value: `<span class="fs-7">${dd.title || '-'}</span>`,
914
- },
915
- {
916
- key: '規格',
917
- value: `<span class="fs-7">${dd.spec}</span>`,
918
- },
919
- {
920
- key: '存貨單位(SKU)',
921
- value: `<span class="fs-7">${dd.sku || '-'}</span>`,
922
- },
1363
+ ...startArr,
923
1364
  {
924
1365
  key: '進貨成本',
925
1366
  value: `<span class="fs-7">${dd.cost || '-'}</span>`,
@@ -935,26 +1376,11 @@ export class StockHistory {
935
1376
  return html `<span class="fs-7">$ ${subtotal.toLocaleString()}</span>`;
936
1377
  })(),
937
1378
  },
938
- {
939
- key: '備註',
940
- value: `<span class="fs-7">${dd.note || '-'}</span>`,
941
- },
1379
+ ...endArr,
942
1380
  ];
943
- }
944
- else {
1381
+ case 'details':
945
1382
  return [
946
- {
947
- key: '商品',
948
- value: `<span class="fs-7">${dd.title || '-'}</span>`,
949
- },
950
- {
951
- key: '規格',
952
- value: `<span class="fs-7">${dd.spec}</span>`,
953
- },
954
- {
955
- key: '存貨單位(SKU)',
956
- value: `<span class="fs-7">${dd.sku || '-'}</span>`,
957
- },
1383
+ ...startArr,
958
1384
  {
959
1385
  key: '進貨成本',
960
1386
  value: `<span class="fs-7">${dd.cost || '-'}</span>`,
@@ -1002,21 +1428,176 @@ export class StockHistory {
1002
1428
  return html `<span class="fs-7">$ ${subtotal.toLocaleString()}</span>`;
1003
1429
  })(),
1004
1430
  },
1431
+ ...endArr,
1432
+ ];
1433
+ case 'logs':
1434
+ return [
1435
+ ...startArr,
1436
+ {
1437
+ key: `原訂進貨數量`,
1438
+ value: `<span class="fs-7">${dd.transfer_count || '-'}</span>`,
1439
+ },
1440
+ {
1441
+ key: '實際進貨數量',
1442
+ value: `<span class="fs-7">${((_a = dd.recent_count) !== null && _a !== void 0 ? _a : 0) - ((_b = dd.replenishment_count) !== null && _b !== void 0 ? _b : 0)}</span>`,
1443
+ },
1444
+ {
1445
+ key: '差異數量',
1446
+ value: (() => {
1447
+ var _a;
1448
+ if (dd.recent_count === undefined) {
1449
+ return html `<span class="fs-7">-</span>`;
1450
+ }
1451
+ const n = dd.recent_count - dd.transfer_count - ((_a = dd.replenishment_count) !== null && _a !== void 0 ? _a : 0);
1452
+ if (n === 0) {
1453
+ return html `<span class="fs-7">0</span>`;
1454
+ }
1455
+ else if (n < 0) {
1456
+ return html `<span class="fs-7 tc_danger">${n}</span>`;
1457
+ }
1458
+ else if (dd.recent_count > dd.transfer_count) {
1459
+ return html `<span class="fs-7 tc_success">+${n}</span>`;
1460
+ }
1461
+ })(),
1462
+ },
1005
1463
  {
1006
- key: '備註',
1007
- value: `<span class="fs-7">${dd.note || '-'}</span>`,
1464
+ key: '此次補貨數量',
1465
+ value: dd.replenishment_count ? html `<span class="fs-7 tc_success">+${(_c = dd.replenishment_count) !== null && _c !== void 0 ? _c : 0}</span>` : html `<span class="fs-7">-</span>`,
1008
1466
  },
1467
+ ...endArr,
1009
1468
  ];
1010
- }
1011
- });
1012
- }
1469
+ }
1470
+ });
1471
+ }
1472
+ static transferDetailTable(json) {
1473
+ const x = (json.page - 1) * json.limit;
1474
+ return json.list.slice(x, x + json.limit).map((dd) => {
1475
+ var _a, _b, _c;
1476
+ const startArr = [
1477
+ {
1478
+ key: '商品',
1479
+ value: `<span class="fs-7">${dd.title || '-'}</span>`,
1480
+ },
1481
+ {
1482
+ key: '規格',
1483
+ value: `<span class="fs-7">${dd.spec}</span>`,
1484
+ },
1485
+ {
1486
+ key: '存貨單位(SKU)',
1487
+ value: `<span class="fs-7">${dd.sku || '-'}</span>`,
1488
+ },
1489
+ ];
1490
+ const endArr = [
1491
+ {
1492
+ key: '備註',
1493
+ value: `<span class="fs-7">${dd.note || '-'}</span>`,
1494
+ },
1495
+ ];
1496
+ switch (json.type) {
1497
+ case 'nonDetails':
1498
+ return [
1499
+ ...startArr,
1500
+ {
1501
+ key: '來源庫存數量',
1502
+ value: `<span class="fs-7">unknown1</span>`,
1503
+ },
1504
+ {
1505
+ key: '預計調入數量',
1506
+ value: `<span class="fs-7">${dd.transfer_count || '-'}</span>`,
1507
+ },
1508
+ ...endArr,
1509
+ ];
1510
+ case 'details':
1511
+ return [
1512
+ ...startArr,
1513
+ {
1514
+ key: '來源庫存數量',
1515
+ value: `<span class="fs-7">unknown1</span>`,
1516
+ },
1517
+ {
1518
+ key: '原訂調入數量',
1519
+ value: `<span class="fs-7">${dd.transfer_count || '-'}</span>`,
1520
+ },
1521
+ {
1522
+ key: '實際調入數量',
1523
+ value: `<span class="fs-7">${dd.recent_count || '-'}</span>`,
1524
+ },
1525
+ {
1526
+ key: '差異數量',
1527
+ value: (() => {
1528
+ if (dd.recent_count === undefined) {
1529
+ return html `<span class="fs-7">-</span>`;
1530
+ }
1531
+ const n = dd.recent_count - dd.transfer_count;
1532
+ if (n === 0) {
1533
+ return html `<span class="fs-7">0</span>`;
1534
+ }
1535
+ else if (n < 0) {
1536
+ return html `<span class="fs-7 tc_danger">${n}</span>`;
1537
+ }
1538
+ else if (dd.recent_count > dd.transfer_count) {
1539
+ return html `<span class="fs-7 tc_success">+${n}</span>`;
1540
+ }
1541
+ })(),
1542
+ },
1543
+ ...endArr,
1544
+ ];
1545
+ case 'logs':
1546
+ return [
1547
+ ...startArr,
1548
+ {
1549
+ key: '原訂調入數量',
1550
+ value: `<span class="fs-7">${dd.transfer_count || '-'}</span>`,
1551
+ },
1552
+ {
1553
+ key: '實際調入數量',
1554
+ value: `<span class="fs-7">${((_a = dd.recent_count) !== null && _a !== void 0 ? _a : 0) - ((_b = dd.replenishment_count) !== null && _b !== void 0 ? _b : 0)}</span>`,
1555
+ },
1556
+ {
1557
+ key: '差異數量',
1558
+ value: (() => {
1559
+ var _a;
1560
+ if (dd.recent_count === undefined) {
1561
+ return html `<span class="fs-7">-</span>`;
1562
+ }
1563
+ const n = dd.recent_count - dd.transfer_count - ((_a = dd.replenishment_count) !== null && _a !== void 0 ? _a : 0);
1564
+ if (n === 0) {
1565
+ return html `<span class="fs-7">0</span>`;
1566
+ }
1567
+ else if (n < 0) {
1568
+ return html `<span class="fs-7 tc_danger">${n}</span>`;
1569
+ }
1570
+ else if (dd.recent_count > dd.transfer_count) {
1571
+ return html `<span class="fs-7 tc_success">+${n}</span>`;
1572
+ }
1573
+ })(),
1574
+ },
1575
+ {
1576
+ key: '此次補貨數量',
1577
+ value: dd.replenishment_count ? html `<span class="fs-7 tc_success">+${(_c = dd.replenishment_count) !== null && _c !== void 0 ? _c : 0}</span>` : html `<span class="fs-7">-</span>`,
1578
+ },
1579
+ ...endArr,
1580
+ ];
1581
+ }
1582
+ });
1583
+ }
1584
+ static replaceOrder(gvc, vm) {
1585
+ const typeData = typeConfig[vm.type];
1586
+ let vmi = undefined;
1587
+ const transfer_total = vm.data.content.product_list.reduce((sum, item) => {
1588
+ return sum + item.cost * item.transfer_count;
1589
+ }, 0);
1590
+ const recent_total = vm.data.content.product_list.reduce((sum, item) => {
1591
+ var _a;
1592
+ return sum + item.cost * ((_a = item.recent_count) !== null && _a !== void 0 ? _a : 0);
1593
+ }, 0);
1013
1594
  return BgWidget.container([
1014
1595
  html ` <div class="title-container">
1015
1596
  ${BgWidget.goBack(gvc.event(() => {
1016
1597
  vm.view = 'mainList';
1017
1598
  }))}
1018
1599
  <div>${BgWidget.title(vm.data.order_id)}</div>
1019
- <span class="d-none mt-1 ms-2 fs-7">${StockHistory.getStatusBadge(vm.data.status)}</span>
1600
+ <span class="mt-1 ms-2 fs-7">${StockHistory.getStatusBadge(vm.data.type, vm.data.status)}</span>
1020
1601
  </div>
1021
1602
  <div class="flex-fill"></div>`,
1022
1603
  html ` <div class="d-flex justify-content-center ${document.body.clientWidth < 768 ? 'flex-column' : ''}" style="gap: 24px">
@@ -1024,11 +1605,18 @@ export class StockHistory {
1024
1605
  BgWidget.mainCard([
1025
1606
  html ` <div class="tx_700">${typeData.name}單資料</div>`,
1026
1607
  BgWidget.horizontalLine({ margin: 0 }),
1027
- html ` <div class="d-flex flex-wrap" style="gap: 18px 0;">${this.getContentHTML(gvc, vm.data)}</div> `,
1608
+ html `
1609
+ <div class="d-flex flex-wrap" style="gap: 18px 0;">
1610
+ ${this.getContentHTML(gvc, vm.data, {
1611
+ transfer_total,
1612
+ recent_total,
1613
+ })}
1614
+ </div>
1615
+ `,
1028
1616
  ].join(BgWidget.mbContainer(18))),
1029
1617
  BgWidget.mainCard([
1030
1618
  html `
1031
- <div class="tx_700">進貨商品</div>
1619
+ <div class="tx_700">${typeData.name}商品</div>
1032
1620
  ${BgWidget.mbContainer(18)}
1033
1621
  ${[
1034
1622
  BgWidget.tableV3({
@@ -1042,7 +1630,46 @@ export class StockHistory {
1042
1630
  vm.data.content.product_list = response;
1043
1631
  vmi.pageSize = Math.ceil(response.length / limit);
1044
1632
  vmi.originalData = response;
1045
- vmi.tableData = specDatalist(vmi.page, limit);
1633
+ switch (vm.data.type) {
1634
+ case 'restocking':
1635
+ if ([0, 1, 2].includes(vm.data.status)) {
1636
+ vmi.tableData = this.restockingDetailTable({
1637
+ type: 'nonDetails',
1638
+ list: vm.data.content.product_list,
1639
+ page: vmi.page,
1640
+ limit,
1641
+ });
1642
+ }
1643
+ else {
1644
+ vmi.tableData = this.restockingDetailTable({
1645
+ type: 'details',
1646
+ list: vm.data.content.product_list,
1647
+ page: vmi.page,
1648
+ limit,
1649
+ });
1650
+ }
1651
+ break;
1652
+ case 'transfer':
1653
+ if ([0, 1, 2].includes(vm.data.status)) {
1654
+ vmi.tableData = this.transferDetailTable({
1655
+ type: 'nonDetails',
1656
+ list: vm.data.content.product_list,
1657
+ page: vmi.page,
1658
+ limit,
1659
+ });
1660
+ }
1661
+ else {
1662
+ vmi.tableData = this.transferDetailTable({
1663
+ type: 'details',
1664
+ list: vm.data.content.product_list,
1665
+ page: vmi.page,
1666
+ limit,
1667
+ });
1668
+ }
1669
+ break;
1670
+ case 'checking':
1671
+ break;
1672
+ }
1046
1673
  vmi.loading = false;
1047
1674
  vmi.callback();
1048
1675
  });
@@ -1051,23 +1678,99 @@ export class StockHistory {
1051
1678
  filter: [],
1052
1679
  hiddenPageSplit: true,
1053
1680
  }),
1054
- BgWidget.horizontalLine({ margin: 1.75 }),
1055
1681
  (() => {
1056
- const total = vm.data.content.product_list.reduce((sum, item) => {
1057
- return sum + item.cost * item.transfer_count;
1058
- }, 0);
1059
- return html ` <div class="d-flex w-100">
1060
- <div class="flex-fill"></div>
1061
- <div class="d-flex justify-content-between tx_700" style="width: 200px;">
1062
- <div>進貨總成本</div>
1063
- <div>$ ${total.toLocaleString()}</div>
1064
- </div>
1065
- </div>`;
1682
+ if (vm.data.type !== 'restocking') {
1683
+ return '';
1684
+ }
1685
+ const priceHTML = (obj) => {
1686
+ var _a, _b;
1687
+ return html `<div class="d-flex w-100 mb-2">
1688
+ <div class="flex-fill"></div>
1689
+ <div class="d-flex justify-content-between" style="width: 250px;">
1690
+ <div class="${(_a = obj.className) !== null && _a !== void 0 ? _a : ''}">${obj.name}</div>
1691
+ ${obj.incompletion
1692
+ ? html `<div style="color: #8D8D8D">商品尚未核對完成</div>`
1693
+ : html `<div class="${(_b = obj.className) !== null && _b !== void 0 ? _b : ''}">$ ${obj.price.toLocaleString()}</div>`}
1694
+ </div>
1695
+ </div>`;
1696
+ };
1697
+ return [
1698
+ BgWidget.horizontalLine({ margin: 1.75 }),
1699
+ priceHTML({
1700
+ name: '原訂總成本',
1701
+ price: transfer_total,
1702
+ }),
1703
+ priceHTML({
1704
+ name: '實際總成本',
1705
+ price: recent_total,
1706
+ className: 'tx_700',
1707
+ incompletion: vm.data.status === 4,
1708
+ }),
1709
+ priceHTML({
1710
+ name: '差異金額',
1711
+ price: transfer_total - recent_total,
1712
+ className: 'tx_700',
1713
+ incompletion: vm.data.status === 4,
1714
+ }),
1715
+ ].join('');
1066
1716
  })(),
1067
1717
  ].join('')}
1068
1718
  `,
1069
1719
  ].join(BgWidget.mbContainer(18))),
1070
- BgWidget.mainCard([html ` <div class="tx_700">${typeData.name}紀錄</div>`].join(BgWidget.mbContainer(18))),
1720
+ BgWidget.mainCard([
1721
+ html ` <div class="tx_700">${typeData.name}紀錄</div>`,
1722
+ vm.data.content.changeLogs
1723
+ .sort((a, b) => {
1724
+ return a.time > b.time ? -1 : 1;
1725
+ })
1726
+ .map((log) => {
1727
+ return html `<div class="d-flex justify-content-between align-items-center mt-2">
1728
+ <div class="d-flex align-items-center">
1729
+ <div class="me-3">${log.time}</div>
1730
+ <div class="me-1">${log.text}</div>
1731
+ ${log.status === 1 || log.status === 5
1732
+ ? html `<i
1733
+ class="fa-thin fa-square-list cursor_pointer"
1734
+ onclick="${gvc.event(() => {
1735
+ BgWidget.dialog({
1736
+ gvc,
1737
+ title: `${typeData.name}紀錄`,
1738
+ width: 1000,
1739
+ innerHTML: (gvc) => {
1740
+ return BgWidget.tableV3({
1741
+ gvc: gvc,
1742
+ getData: (vd) => {
1743
+ var _a;
1744
+ vmi = vd;
1745
+ const limit = 99999;
1746
+ this.getVariantInfo((_a = log.product_list) !== null && _a !== void 0 ? _a : [], (response) => {
1747
+ vmi.pageSize = Math.ceil(response.length / limit);
1748
+ vmi.originalData = response;
1749
+ vmi.tableData = this.restockingDetailTable({
1750
+ type: 'logs',
1751
+ list: response,
1752
+ page: vmi.page,
1753
+ limit,
1754
+ });
1755
+ vmi.loading = false;
1756
+ vmi.callback();
1757
+ });
1758
+ },
1759
+ rowClick: () => { },
1760
+ filter: [],
1761
+ hiddenPageSplit: true,
1762
+ });
1763
+ },
1764
+ });
1765
+ })}"
1766
+ ></i>`
1767
+ : ''}
1768
+ </div>
1769
+ <div>${log.user}</div>
1770
+ </div>`;
1771
+ })
1772
+ .join(''),
1773
+ ].join(BgWidget.mbContainer(18))),
1071
1774
  ].join(BgWidget.mbContainer(18)))}
1072
1775
  </div>`,
1073
1776
  BgWidget.mbContainer(240),
@@ -1204,8 +1907,8 @@ export class StockHistory {
1204
1907
  ].join('')}
1205
1908
  </div>`;
1206
1909
  }
1207
- static getStatusBadge(status) {
1208
- const statusData = statusConfig[status];
1910
+ static getStatusBadge(type, status) {
1911
+ const statusData = typeConfig[type].status[status];
1209
1912
  switch (statusData.badge) {
1210
1913
  case 'info':
1211
1914
  return BgWidget.infoInsignia(statusData.title);
@@ -1219,7 +1922,7 @@ export class StockHistory {
1219
1922
  return statusData.title;
1220
1923
  }
1221
1924
  }
1222
- static getContentHTML(gvc, data) {
1925
+ static getContentHTML(gvc, data, obj) {
1223
1926
  const glitter = gvc.glitter;
1224
1927
  const vm = {
1225
1928
  id: glitter.getUUID(),
@@ -1228,6 +1931,7 @@ export class StockHistory {
1228
1931
  storeList: [],
1229
1932
  vendorList: [],
1230
1933
  };
1934
+ const typeData = typeConfig[data.type];
1231
1935
  return gvc.bindView({
1232
1936
  bind: vm.id,
1233
1937
  view: () => {
@@ -1239,21 +1943,71 @@ export class StockHistory {
1239
1943
  });
1240
1944
  }
1241
1945
  else {
1242
- const total = vm.data.content.product_list.reduce((sum, item) => {
1243
- return sum + item.cost * item.transfer_count;
1244
- }, 0);
1245
1946
  const vendor = vm.vendorList.find((v) => v.id === vm.data.content.vendor);
1246
- const store = vm.storeList.find((s) => s.id === vm.data.content.store_in);
1247
- return [
1248
- { title: '進貨單編號', value: vm.data.order_id },
1249
- { title: '進貨日期', value: vm.data.created_time },
1250
- { title: '進貨單狀態', value: StockHistory.getStatusBadge(vm.data.status) },
1251
- { title: '供應商', value: vendor ? vendor.name : '' },
1252
- { title: '庫存點', value: store ? store.name : '' },
1253
- { title: '原定總成本 / 實際總成本', value: `$${total.toLocaleString()} / -` },
1254
- { title: '差異金額', value: (total - 0).toLocaleString() },
1255
- { title: '備註', value: (_a = vm.data.content.note) !== null && _a !== void 0 ? _a : '', width: 40 },
1256
- ]
1947
+ const storeIn = vm.storeList.find((s) => s.id === vm.data.content.store_in);
1948
+ const storeOut = vm.storeList.find((s) => s.id === vm.data.content.store_out);
1949
+ const startArr = [
1950
+ {
1951
+ title: `${typeData.name}單編號`,
1952
+ value: vm.data.order_id,
1953
+ },
1954
+ {
1955
+ title: `${typeData.name}日期`,
1956
+ value: vm.data.created_time,
1957
+ },
1958
+ {
1959
+ title: `${typeData.name}單狀態`,
1960
+ value: typeConfig[vm.data.type].status[vm.data.status].title,
1961
+ },
1962
+ ];
1963
+ const endArr = [
1964
+ {
1965
+ title: '備註',
1966
+ value: (_a = vm.data.content.note) !== null && _a !== void 0 ? _a : '',
1967
+ width: 40,
1968
+ },
1969
+ ];
1970
+ const arr = (() => {
1971
+ switch (data.type) {
1972
+ case 'restocking':
1973
+ return [
1974
+ ...startArr,
1975
+ {
1976
+ title: '供應商',
1977
+ value: vendor ? vendor.name : '',
1978
+ },
1979
+ {
1980
+ title: '庫存點',
1981
+ value: storeIn ? storeIn.name : '',
1982
+ },
1983
+ {
1984
+ title: '原定總成本 / 實際總成本',
1985
+ value: `$${obj.transfer_total.toLocaleString()} / $${obj.recent_total.toLocaleString()}`,
1986
+ },
1987
+ {
1988
+ title: '差異金額',
1989
+ value: `$${(obj.transfer_total - obj.recent_total).toLocaleString()}`,
1990
+ },
1991
+ ...endArr,
1992
+ ];
1993
+ case 'transfer':
1994
+ return [
1995
+ ...startArr,
1996
+ {
1997
+ title: '調出庫存點',
1998
+ value: storeOut ? storeOut.name : '',
1999
+ },
2000
+ {
2001
+ title: '調出庫入點',
2002
+ value: storeIn ? storeIn.name : '',
2003
+ },
2004
+ ...endArr,
2005
+ ];
2006
+ case 'checking':
2007
+ return [...startArr, ...endArr];
2008
+ }
2009
+ })();
2010
+ return arr
1257
2011
  .map((item) => {
1258
2012
  var _a;
1259
2013
  return html `<div style="${document.body.clientWidth > 768 ? `width: ${(_a = item.width) !== null && _a !== void 0 ? _a : 20}%;` : ''}">
@@ -1287,6 +2041,7 @@ export class StockHistory {
1287
2041
  static getButtonBar(gvc, vm) {
1288
2042
  const glitter = gvc.glitter;
1289
2043
  const dialog = new ShareDialog(glitter);
2044
+ const typeData = typeConfig[vm.data.type];
1290
2045
  const buttonList = [
1291
2046
  BgWidget.cancel(gvc.event(() => {
1292
2047
  if (vm.view === 'replace') {
@@ -1297,55 +2052,203 @@ export class StockHistory {
1297
2052
  }
1298
2053
  }), '返回'),
1299
2054
  ];
1300
- function updateData(status) {
1301
- vm.data.status = status;
1302
- ApiStock.putStockHistory(vm.data).then((r) => {
1303
- dialog.dataLoading({ visible: false });
1304
- if (r.result && r.response) {
1305
- dialog.successMessage({ text: '保存成功' });
1306
- setTimeout(() => {
1307
- vm.view = 'replace';
1308
- }, 700);
1309
- }
1310
- else {
1311
- dialog.successMessage({ text: '保存失敗' });
1312
- }
2055
+ function updateData(status, warningText) {
2056
+ dialog.warningMessage({
2057
+ callback: (bool) => {
2058
+ if (bool) {
2059
+ vm.data.status = status;
2060
+ ApiStock.putStockHistory(vm.data).then((r) => {
2061
+ dialog.dataLoading({ visible: false });
2062
+ if (r.result && r.response) {
2063
+ dialog.successMessage({ text: '更新成功' });
2064
+ setTimeout(() => {
2065
+ vm.view = 'replace';
2066
+ }, 700);
2067
+ }
2068
+ else {
2069
+ dialog.successMessage({ text: '更新失敗' });
2070
+ }
2071
+ });
2072
+ }
2073
+ },
2074
+ text: warningText && warningText.length > 0 ? warningText : `確定要更新此${typeData.name}單?`,
1313
2075
  });
1314
2076
  }
1315
2077
  function deleteData() {
1316
- ApiStock.deleteStockHistory(vm.data).then((r) => {
1317
- dialog.dataLoading({ visible: false });
1318
- if (r.result && r.response) {
1319
- dialog.successMessage({ text: '刪除成功' });
1320
- setTimeout(() => {
1321
- vm.view = 'mainList';
1322
- }, 700);
1323
- }
1324
- else {
1325
- dialog.successMessage({ text: '刪除失敗' });
1326
- }
2078
+ dialog.warningMessage({
2079
+ callback: (bool) => {
2080
+ if (bool) {
2081
+ ApiStock.deleteStockHistory(vm.data).then((r) => {
2082
+ dialog.dataLoading({ visible: false });
2083
+ if (r.result && r.response) {
2084
+ dialog.successMessage({ text: '刪除成功' });
2085
+ setTimeout(() => {
2086
+ vm.view = 'mainList';
2087
+ }, 700);
2088
+ }
2089
+ else {
2090
+ dialog.successMessage({ text: '刪除失敗' });
2091
+ }
2092
+ });
2093
+ }
2094
+ },
2095
+ text: (() => {
2096
+ switch (vm.data.type) {
2097
+ case 'restocking':
2098
+ return html `
2099
+ <div class="my-2">
2100
+ <div class="tx_normal">刪除${typeData.name}單後將無法復原,${typeData.name}記錄將被移除,且不會</div>
2101
+ <div class="tx_normal">對現有庫存數量產生影響。確定要刪除此${typeData.name}單嗎?</div>
2102
+ ${BgWidget.mbContainer(8)}
2103
+ <div class="tx_gray_14">※提醒您,請確認${typeData.name}單貨品是否已到貨,若已到貨,請先進</div>
2104
+ <div class="tx_gray_14">行核對,確保庫存正確,避免退貨單扣除尚未新增的庫存。</div>
2105
+ </div>
2106
+ `;
2107
+ case 'transfer':
2108
+ return html `
2109
+ <div class="my-2">
2110
+ <div class="tx_normal">刪除調撥單後將無法復原,調撥記錄將被移除,且不會</div>
2111
+ <div class="tx_normal">對現有庫存數量產生影響。確定要刪除此調撥單嗎?</div>
2112
+ ${BgWidget.mbContainer(8)}
2113
+ <div class="tx_gray_14">※提醒您,請確認調撥單貨品是否已到貨,若已到貨,請先進</div>
2114
+ <div class="tx_gray_14">行核對,避免退還原庫存點時,扣除尚未新增的庫存。</div>
2115
+ </div>
2116
+ `;
2117
+ case 'checking':
2118
+ return html `
2119
+ <div class="my-2">
2120
+ <div class="tx_normal">刪除盤點單後將無法復原,確定要刪除此調撥單嗎?</div>
2121
+ </div>
2122
+ `;
2123
+ }
2124
+ })(),
1327
2125
  });
1328
2126
  }
1329
2127
  if (vm.view === 'replace') {
1330
2128
  if ([2].includes(vm.data.status)) {
1331
2129
  buttonList.push(BgWidget.danger(gvc.event(() => {
1332
2130
  deleteData();
1333
- }), '刪除進貨單'));
2131
+ }), `刪除${typeData.name}單`));
1334
2132
  }
1335
2133
  if ([5].includes(vm.data.status)) {
1336
- buttonList.push(BgWidget.grayButton(gvc.event(() => {
1337
- updateData(1);
1338
- }), '完成進貨'));
2134
+ buttonList.push(BgWidget.grayButton(`完成${typeData.name}}`, gvc.event(() => {
2135
+ updateData(0, (() => {
2136
+ switch (vm.data.type) {
2137
+ case 'restocking':
2138
+ return html `
2139
+ <div class="my-2">
2140
+ <div class="tx_normal">目前${typeData.name}的商品數量與原訂數量存在差異,</div>
2141
+ <div class="tx_normal">確定要完成${typeData.name}嗎?</div>
2142
+ ${BgWidget.mbContainer(8)}
2143
+ <div class="tx_gray_14">※完成${typeData.name}後,此${typeData.name}單將被標記為已完成,</div>
2144
+ <div class="tx_gray_14">後續無法再進行補貨操作。</div>
2145
+ </div>
2146
+ `;
2147
+ case 'transfer':
2148
+ return html `
2149
+ <div class="my-2">
2150
+ <div class="tx_normal">目前調撥的商品數量與原訂數量存在差異,</div>
2151
+ <div class="tx_normal">確定要完成調撥嗎?</div>
2152
+ ${BgWidget.mbContainer(8)}
2153
+ <div class="tx_gray_14">※完成調撥後,此調撥單將被標記為已完成,</div>
2154
+ <div class="tx_gray_14">後續無法再進行補貨操作。</div>
2155
+ </div>
2156
+ `;
2157
+ case 'checking':
2158
+ return html `finished check`;
2159
+ }
2160
+ })());
2161
+ })));
1339
2162
  }
1340
2163
  if ([0, 1, 4, 5].includes(vm.data.status)) {
2164
+ const text = (() => {
2165
+ switch (vm.data.status) {
2166
+ case 4:
2167
+ switch (vm.data.type) {
2168
+ case 'restocking':
2169
+ case 'transfer':
2170
+ return html `
2171
+ <div class="my-2">
2172
+ <div class="tx_normal">${typeData.name}單目前處於「已暫停」狀態,請完成所有商品數量的</div>
2173
+ <div class="tx_normal">核對,確認庫存數據無誤後再進行取消操作。</div>
2174
+ </div>
2175
+ `;
2176
+ case 'checking':
2177
+ return '';
2178
+ }
2179
+ case 5:
2180
+ switch (vm.data.type) {
2181
+ case 'restocking':
2182
+ return html `
2183
+ <div class="my-2">
2184
+ <div class="tx_normal">取消後將無法再修正,確定要取消此${typeData.name}單嗎?</div>
2185
+ ${BgWidget.mbContainer(8)}
2186
+ <div class="tx_gray_14">※請確認商品是否已補貨,若已補貨但尚未核對,</div>
2187
+ <div class="tx_gray_14">取消${typeData.name}單可能會導致庫存數據不正確。</div>
2188
+ ${BgWidget.mbContainer(8)}
2189
+ <div class="tx_gray_14">※取消後請新增「${typeData.name}退回單」,並退還商品與發票。</div>
2190
+ </div>
2191
+ `;
2192
+ case 'transfer':
2193
+ return html `
2194
+ <div class="my-2">
2195
+ <div class="tx_normal">取消後將無法再修正,確定要取消此${typeData.name}單嗎?</div>
2196
+ ${BgWidget.mbContainer(8)}
2197
+ <div class="tx_gray_14">※請確認商品是否已補貨,若已補貨但尚未核對,</div>
2198
+ <div class="tx_gray_14">取消${typeData.name}單可能會導致庫存數據不正確。</div>
2199
+ ${BgWidget.mbContainer(8)}
2200
+ <div class="tx_gray_14">※取消後請新增全新的「調撥單」,並退還商品。</div>
2201
+ </div>
2202
+ `;
2203
+ case 'checking':
2204
+ return html `
2205
+ <div class="my-2">
2206
+ <div class="tx_normal">取消後將無法再修正,確定要取消此${typeData.name}單嗎?</div>
2207
+ ${BgWidget.mbContainer(8)}
2208
+ <div class="tx_gray_14">※提醒您,此盤點單存在數量差異,請確認該差異是否無需更新至庫存。</div>
2209
+ </div>
2210
+ `;
2211
+ }
2212
+ default:
2213
+ switch (vm.data.type) {
2214
+ case 'restocking':
2215
+ return html `
2216
+ <div class="my-2">
2217
+ <div class="tx_normal">取消後將無法復原,確定要取消此${typeData.name}單嗎?</div>
2218
+ ${BgWidget.mbContainer(8)}
2219
+ <div class="tx_gray_14">※提醒您,取消${typeData.name}單後,請新增「${typeData.name}退回單」並將</div>
2220
+ <div class="tx_gray_14">商品及發票一併退還給供應商,確保退貨流程完整。</div>
2221
+ </div>
2222
+ `;
2223
+ case 'transfer':
2224
+ return html `
2225
+ <div class="my-2">
2226
+ <div class="tx_normal">取消後將無法復原,確定要取消此${typeData.name}單嗎?</div>
2227
+ ${BgWidget.mbContainer(8)}
2228
+ <div class="tx_gray_14">※提醒您,取消後請新增一張全新的「調撥單」,將商</div>
2229
+ <div class="tx_gray_14">品調回原庫存點,以確保庫存準確且流程完整。</div>
2230
+ </div>
2231
+ `;
2232
+ case 'checking':
2233
+ return html `
2234
+ <div class="my-2">
2235
+ <div class="tx_normal">取消後將無法復原,確定要取消此${typeData.name}單嗎?</div>
2236
+ ${BgWidget.mbContainer(8)}
2237
+ <div class="tx_gray_14">※提醒您,若盤點單已提交且存在數量差異,系統將回</div>
2238
+ <div class="tx_gray_14">復至調整前的庫存狀態。</div>
2239
+ </div>
2240
+ `;
2241
+ }
2242
+ }
2243
+ })();
1341
2244
  buttonList.push(BgWidget.danger(gvc.event(() => {
1342
- updateData(6);
1343
- }), '取消進貨單'));
2245
+ updateData(6, text);
2246
+ }), `取消${typeData.name}單`));
1344
2247
  }
1345
2248
  if ([2, 4, 5].includes(vm.data.status)) {
1346
2249
  buttonList.push(BgWidget.save(gvc.event(() => {
1347
2250
  vm.view = 'checkList';
1348
- }), '進貨核對'));
2251
+ }), `${typeData.name}核對`));
1349
2252
  }
1350
2253
  }
1351
2254
  if (vm.view === 'checkList') {
@@ -1353,7 +2256,7 @@ export class StockHistory {
1353
2256
  return typeof item.recent_count === 'number' && !isNaN(item.recent_count);
1354
2257
  });
1355
2258
  const isEqual = vm.data.content.product_list.every((item) => {
1356
- return typeof item.recent_count === 'number' && !isNaN(item.recent_count) && item.recent_count === item.transfer_count;
2259
+ return typeof item.recent_count === 'number' && !isNaN(item.recent_count) && item.recent_count >= item.transfer_count;
1357
2260
  });
1358
2261
  buttonList.push(BgWidget.cancel(gvc.event(() => {
1359
2262
  if (isEqual) {
@@ -1425,5 +2328,29 @@ export class StockHistory {
1425
2328
  callback(product_list);
1426
2329
  });
1427
2330
  }
2331
+ static getVariantInfo(dataList, callback) {
2332
+ ApiShop.getVariants({
2333
+ page: 0,
2334
+ limit: 99999,
2335
+ id_list: dataList.map((item) => item.variant_id).join(','),
2336
+ productType: 'all',
2337
+ }).then((r) => {
2338
+ let product_list = [];
2339
+ if (r.result && r.response.data) {
2340
+ r.response.data.forEach((item) => {
2341
+ const origin = dataList.find((o) => {
2342
+ return o.variant_id === item.id;
2343
+ });
2344
+ const title = item.product_content.title;
2345
+ const spec = item.variant_content.spec;
2346
+ const sku = item.variant_content.sku;
2347
+ if (origin) {
2348
+ product_list.push(Object.assign(Object.assign({}, origin), { title: title, spec: spec && spec.length > 0 ? spec.join('/') : '單一規格', sku: sku !== null && sku !== void 0 ? sku : '' }));
2349
+ }
2350
+ });
2351
+ }
2352
+ callback(product_list);
2353
+ });
2354
+ }
1428
2355
  }
1429
2356
  window.glitter.setModule(import.meta.url, StockHistory);