skill-home 0.3.55 → 0.3.56

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 (247) hide show
  1. package/dist/cli/cmd_read.js +139 -115
  2. package/dist/cli/cmd_read.js.map +1 -1
  3. package/dist/cli/config.d.ts.map +1 -1
  4. package/dist/cli/config.js +2 -1
  5. package/dist/cli/config.js.map +1 -1
  6. package/dist/entries/catalog.generated.d.ts +11 -0
  7. package/dist/entries/catalog.generated.d.ts.map +1 -0
  8. package/dist/entries/catalog.generated.js +10 -0
  9. package/dist/entries/catalog.generated.js.map +1 -0
  10. package/dist/entries/en.d.ts +2162 -0
  11. package/dist/entries/en.d.ts.map +1 -0
  12. package/dist/entries/en.js +2234 -0
  13. package/dist/entries/en.js.map +1 -0
  14. package/dist/entries/index.d.ts +15 -0
  15. package/dist/entries/index.d.ts.map +1 -0
  16. package/dist/entries/index.js +15 -0
  17. package/dist/entries/index.js.map +1 -0
  18. package/dist/entries/zh.d.ts +2162 -0
  19. package/dist/entries/zh.d.ts.map +1 -0
  20. package/dist/entries/zh.js +2234 -0
  21. package/dist/entries/zh.js.map +1 -0
  22. package/dist/express/pages/express.d.ts.map +1 -1
  23. package/dist/express/pages/express.js +55 -39
  24. package/dist/express/pages/express.js.map +1 -1
  25. package/dist/express/pages/list.d.ts.map +1 -1
  26. package/dist/express/pages/list.js +61 -46
  27. package/dist/express/pages/list.js.map +1 -1
  28. package/dist/express/pages/missing.d.ts.map +1 -1
  29. package/dist/express/pages/missing.js +52 -34
  30. package/dist/express/pages/missing.js.map +1 -1
  31. package/dist/express/pages/stock.d.ts.map +1 -1
  32. package/dist/express/pages/stock.js +79 -41
  33. package/dist/express/pages/stock.js.map +1 -1
  34. package/dist/express/shopping.d.ts.map +1 -1
  35. package/dist/express/shopping.js +29 -27
  36. package/dist/express/shopping.js.map +1 -1
  37. package/dist/family/care.d.ts.map +1 -1
  38. package/dist/family/care.js +31 -27
  39. package/dist/family/care.js.map +1 -1
  40. package/dist/family/pages/family_borrow.d.ts.map +1 -1
  41. package/dist/family/pages/family_borrow.js +135 -69
  42. package/dist/family/pages/family_borrow.js.map +1 -1
  43. package/dist/family/pages/family_members.d.ts.map +1 -1
  44. package/dist/family/pages/family_members.js +81 -34
  45. package/dist/family/pages/family_members.js.map +1 -1
  46. package/dist/fetch/backup.d.ts.map +1 -1
  47. package/dist/fetch/backup.js +14 -5
  48. package/dist/fetch/backup.js.map +1 -1
  49. package/dist/fetch/db.d.ts +23 -0
  50. package/dist/fetch/db.d.ts.map +1 -1
  51. package/dist/fetch/db.js +28 -9
  52. package/dist/fetch/db.js.map +1 -1
  53. package/dist/fetch/domains.d.ts.map +1 -1
  54. package/dist/fetch/domains.js +28 -24
  55. package/dist/fetch/domains.js.map +1 -1
  56. package/dist/fetch/masterKey.d.ts.map +1 -1
  57. package/dist/fetch/masterKey.js +2 -1
  58. package/dist/fetch/masterKey.js.map +1 -1
  59. package/dist/health.d.ts.map +1 -1
  60. package/dist/health.js +89 -68
  61. package/dist/health.js.map +1 -1
  62. package/dist/help/helpFile.d.ts +2 -5
  63. package/dist/help/helpFile.d.ts.map +1 -1
  64. package/dist/help/helpFile.js +44 -32
  65. package/dist/help/helpFile.js.map +1 -1
  66. package/dist/help/lookup.d.ts.map +1 -1
  67. package/dist/help/lookup.js +31 -25
  68. package/dist/help/lookup.js.map +1 -1
  69. package/dist/items/add.d.ts.map +1 -1
  70. package/dist/items/add.js +5 -4
  71. package/dist/items/add.js.map +1 -1
  72. package/dist/items/detail.d.ts.map +1 -1
  73. package/dist/items/detail.js +3 -2
  74. package/dist/items/detail.js.map +1 -1
  75. package/dist/items/inventory.d.ts.map +1 -1
  76. package/dist/items/inventory.js +7 -6
  77. package/dist/items/inventory.js.map +1 -1
  78. package/dist/items/pages/add_form.d.ts.map +1 -1
  79. package/dist/items/pages/add_form.js +26 -25
  80. package/dist/items/pages/add_form.js.map +1 -1
  81. package/dist/items/pages/browse.d.ts.map +1 -1
  82. package/dist/items/pages/browse.js +15 -14
  83. package/dist/items/pages/browse.js.map +1 -1
  84. package/dist/items/pages/category_manage.d.ts.map +1 -1
  85. package/dist/items/pages/category_manage.js +27 -27
  86. package/dist/items/pages/category_manage.js.map +1 -1
  87. package/dist/items/pages/confirm.d.ts.map +1 -1
  88. package/dist/items/pages/confirm.js +22 -21
  89. package/dist/items/pages/confirm.js.map +1 -1
  90. package/dist/items/pages/detail.d.ts.map +1 -1
  91. package/dist/items/pages/detail.js +32 -31
  92. package/dist/items/pages/detail.js.map +1 -1
  93. package/dist/items/pages/duplicates.d.ts.map +1 -1
  94. package/dist/items/pages/duplicates.js +15 -14
  95. package/dist/items/pages/duplicates.js.map +1 -1
  96. package/dist/items/pages/history.d.ts.map +1 -1
  97. package/dist/items/pages/history.js +45 -41
  98. package/dist/items/pages/history.js.map +1 -1
  99. package/dist/items/pages/inventory_diff.d.ts.map +1 -1
  100. package/dist/items/pages/inventory_diff.js +23 -20
  101. package/dist/items/pages/inventory_diff.js.map +1 -1
  102. package/dist/items/pages/inventory_records.d.ts.map +1 -1
  103. package/dist/items/pages/inventory_records.js +29 -26
  104. package/dist/items/pages/inventory_records.js.map +1 -1
  105. package/dist/items/pages/inventory_round.d.ts.map +1 -1
  106. package/dist/items/pages/inventory_round.js +46 -34
  107. package/dist/items/pages/inventory_round.js.map +1 -1
  108. package/dist/items/pages/locate.d.ts.map +1 -1
  109. package/dist/items/pages/locate.js +20 -19
  110. package/dist/items/pages/locate.js.map +1 -1
  111. package/dist/items/pages/move_checklist.d.ts.map +1 -1
  112. package/dist/items/pages/move_checklist.js +28 -25
  113. package/dist/items/pages/move_checklist.js.map +1 -1
  114. package/dist/items/pages/photo_wall.d.ts.map +1 -1
  115. package/dist/items/pages/photo_wall.js +25 -25
  116. package/dist/items/pages/photo_wall.js.map +1 -1
  117. package/dist/items/pages/photos.d.ts.map +1 -1
  118. package/dist/items/pages/photos.js +29 -31
  119. package/dist/items/pages/photos.js.map +1 -1
  120. package/dist/items/pages/receipt.d.ts.map +1 -1
  121. package/dist/items/pages/receipt.js +58 -52
  122. package/dist/items/pages/receipt.js.map +1 -1
  123. package/dist/items/pages/relations.d.ts.map +1 -1
  124. package/dist/items/pages/relations.js +22 -23
  125. package/dist/items/pages/relations.js.map +1 -1
  126. package/dist/items/pages/search_list.d.ts.map +1 -1
  127. package/dist/items/pages/search_list.js +17 -16
  128. package/dist/items/pages/search_list.js.map +1 -1
  129. package/dist/items/pages/tag_manage.d.ts.map +1 -1
  130. package/dist/items/pages/tag_manage.js +51 -44
  131. package/dist/items/pages/tag_manage.js.map +1 -1
  132. package/dist/items/pages/undo_select.d.ts.map +1 -1
  133. package/dist/items/pages/undo_select.js +25 -24
  134. package/dist/items/pages/undo_select.js.map +1 -1
  135. package/dist/items/search.d.ts.map +1 -1
  136. package/dist/items/search.js +4 -3
  137. package/dist/items/search.js.map +1 -1
  138. package/dist/items/tag.d.ts.map +1 -1
  139. package/dist/items/tag.js +15 -13
  140. package/dist/items/tag.js.map +1 -1
  141. package/dist/items/update.d.ts.map +1 -1
  142. package/dist/items/update.js +24 -23
  143. package/dist/items/update.js.map +1 -1
  144. package/dist/outfit/outfit.d.ts.map +1 -1
  145. package/dist/outfit/outfit.js +70 -31
  146. package/dist/outfit/outfit.js.map +1 -1
  147. package/dist/outfit/pages/outfit_picker.d.ts.map +1 -1
  148. package/dist/outfit/pages/outfit_picker.js +89 -40
  149. package/dist/outfit/pages/outfit_picker.js.map +1 -1
  150. package/dist/outfit/pages/travel_trip.d.ts.map +1 -1
  151. package/dist/outfit/pages/travel_trip.js +82 -38
  152. package/dist/outfit/pages/travel_trip.js.map +1 -1
  153. package/dist/outfit/pages/trip_outfit_plan.d.ts.map +1 -1
  154. package/dist/outfit/pages/trip_outfit_plan.js +87 -48
  155. package/dist/outfit/pages/trip_outfit_plan.js.map +1 -1
  156. package/dist/outfit/pages/wardrobe_analyze.d.ts.map +1 -1
  157. package/dist/outfit/pages/wardrobe_analyze.js +85 -36
  158. package/dist/outfit/pages/wardrobe_analyze.js.map +1 -1
  159. package/dist/outfit/pages/wardrobe_season.d.ts.map +1 -1
  160. package/dist/outfit/pages/wardrobe_season.js +101 -40
  161. package/dist/outfit/pages/wardrobe_season.js.map +1 -1
  162. package/dist/outfit/trip.d.ts.map +1 -1
  163. package/dist/outfit/trip.js +35 -14
  164. package/dist/outfit/trip.js.map +1 -1
  165. package/dist/policy/category.d.ts.map +1 -1
  166. package/dist/policy/category.js +2 -1
  167. package/dist/policy/category.js.map +1 -1
  168. package/dist/policy/item.d.ts.map +1 -1
  169. package/dist/policy/item.js +3 -2
  170. package/dist/policy/item.js.map +1 -1
  171. package/dist/policy/routes.en.generated.d.ts +18 -0
  172. package/dist/policy/routes.en.generated.d.ts.map +1 -0
  173. package/dist/policy/routes.en.generated.js +14 -0
  174. package/dist/policy/routes.en.generated.js.map +1 -0
  175. package/dist/policy/wakewords.d.ts.map +1 -1
  176. package/dist/policy/wakewords.js +20 -1
  177. package/dist/policy/wakewords.js.map +1 -1
  178. package/dist/receipt/pages/accounts.d.ts.map +1 -1
  179. package/dist/receipt/pages/accounts.js +62 -36
  180. package/dist/receipt/pages/accounts.js.map +1 -1
  181. package/dist/receipt/pages/certificates.d.ts.map +1 -1
  182. package/dist/receipt/pages/certificates.js +74 -54
  183. package/dist/receipt/pages/certificates.js.map +1 -1
  184. package/dist/receipt/pages/purchase_records.d.ts.map +1 -1
  185. package/dist/receipt/pages/purchase_records.js +82 -59
  186. package/dist/receipt/pages/purchase_records.js.map +1 -1
  187. package/dist/receipt/pages/warranty.d.ts.map +1 -1
  188. package/dist/receipt/pages/warranty.js +36 -24
  189. package/dist/receipt/pages/warranty.js.map +1 -1
  190. package/dist/receipt/ticket.d.ts.map +1 -1
  191. package/dist/receipt/ticket.js +65 -64
  192. package/dist/receipt/ticket.js.map +1 -1
  193. package/dist/render/copyArea.d.ts.map +1 -1
  194. package/dist/render/copyArea.js +39 -26
  195. package/dist/render/copyArea.js.map +1 -1
  196. package/dist/render/html.d.ts.map +1 -1
  197. package/dist/render/html.js +19 -4
  198. package/dist/render/html.js.map +1 -1
  199. package/dist/render/views.d.ts.map +1 -1
  200. package/dist/render/views.js +4 -3
  201. package/dist/render/views.js.map +1 -1
  202. package/dist/setup/pages/backup_receipt.d.ts.map +1 -1
  203. package/dist/setup/pages/backup_receipt.js +85 -35
  204. package/dist/setup/pages/backup_receipt.js.map +1 -1
  205. package/dist/setup/pages/first_use_wizard.d.ts.map +1 -1
  206. package/dist/setup/pages/first_use_wizard.js +100 -33
  207. package/dist/setup/pages/first_use_wizard.js.map +1 -1
  208. package/dist/setup/pages/health_report.d.ts.map +1 -1
  209. package/dist/setup/pages/health_report.js +74 -37
  210. package/dist/setup/pages/health_report.js.map +1 -1
  211. package/dist/setup/pages/import_restore.d.ts.map +1 -1
  212. package/dist/setup/pages/import_restore.js +79 -34
  213. package/dist/setup/pages/import_restore.js.map +1 -1
  214. package/dist/shared/params.d.ts.map +1 -1
  215. package/dist/shared/params.js +4 -3
  216. package/dist/shared/params.js.map +1 -1
  217. package/dist/space/location.d.ts.map +1 -1
  218. package/dist/space/location.js +29 -19
  219. package/dist/space/location.js.map +1 -1
  220. package/dist/space/pages/fixed_spot.d.ts.map +1 -1
  221. package/dist/space/pages/fixed_spot.js +51 -42
  222. package/dist/space/pages/fixed_spot.js.map +1 -1
  223. package/dist/space/pages/location_manage.d.ts.map +1 -1
  224. package/dist/space/pages/location_manage.js +59 -48
  225. package/dist/space/pages/location_manage.js.map +1 -1
  226. package/dist/space/pages/space_view.d.ts.map +1 -1
  227. package/dist/space/pages/space_view.js +67 -70
  228. package/dist/space/pages/space_view.js.map +1 -1
  229. package/dist/space/pages/suggest_storage.d.ts.map +1 -1
  230. package/dist/space/pages/suggest_storage.js +78 -64
  231. package/dist/space/pages/suggest_storage.js.map +1 -1
  232. package/dist/stats/pages/expiring.d.ts.map +1 -1
  233. package/dist/stats/pages/expiring.js +99 -61
  234. package/dist/stats/pages/expiring.js.map +1 -1
  235. package/dist/stats/pages/idle.d.ts.map +1 -1
  236. package/dist/stats/pages/idle.js +95 -59
  237. package/dist/stats/pages/idle.js.map +1 -1
  238. package/dist/stats/pages/inventory_stat.d.ts.map +1 -1
  239. package/dist/stats/pages/inventory_stat.js +98 -47
  240. package/dist/stats/pages/inventory_stat.js.map +1 -1
  241. package/dist/stats/pages/overview.d.ts.map +1 -1
  242. package/dist/stats/pages/overview.js +137 -70
  243. package/dist/stats/pages/overview.js.map +1 -1
  244. package/dist/stats/stats.d.ts.map +1 -1
  245. package/dist/stats/stats.js +7 -4
  246. package/dist/stats/stats.js.map +1 -1
  247. package/package.json +4 -3
@@ -7,6 +7,59 @@
7
7
  // 可见行只放中文(无拉丁字母,`AI` 一律转写,映射见 scene-stats.md)。
8
8
  import { readFileSync } from 'node:fs';
9
9
  import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
10
+ import { m } from '../../entries/index.js';
11
+ /** 本页可见文案(渲染期取词:写成函数,模块加载时不取词)。 */
12
+ function pageText() {
13
+ return {
14
+ k001: m('skill-home.stats-pages-inventory-stat.c001'),
15
+ k002: m('skill-home.stats-pages-inventory-stat.c002'),
16
+ k003: m('skill-home.stats-pages-inventory-stat.c003'),
17
+ k004: m('skill-home.stats-pages-inventory-stat.c004'),
18
+ k005: m('skill-home.stats-pages-inventory-stat.c005'),
19
+ k006: m('skill-home.stats-pages-inventory-stat.c006'),
20
+ k007: m('skill-home.stats-pages-inventory-stat.c007'),
21
+ k008: m('skill-home.stats-pages-inventory-stat.c008'),
22
+ k009: m('skill-home.stats-pages-inventory-stat.c009'),
23
+ k010: m('skill-home.stats-pages-inventory-stat.c010'),
24
+ k011: m('skill-home.stats-pages-inventory-stat.c011'),
25
+ k012: m('skill-home.stats-pages-inventory-stat.c012'),
26
+ k013: m('skill-home.stats-pages-inventory-stat.c013'),
27
+ k014: m('skill-home.stats-pages-inventory-stat.c014'),
28
+ k015: m('skill-home.stats-pages-inventory-stat.c015'),
29
+ k016: m('skill-home.stats-pages-inventory-stat.c016'),
30
+ k017: m('skill-home.stats-pages-inventory-stat.c017'),
31
+ k018: m('skill-home.stats-pages-inventory-stat.c018'),
32
+ k019: m('skill-home.stats-pages-inventory-stat.c019'),
33
+ k020: m('skill-home.stats-pages-inventory-stat.c020'),
34
+ k021: m('skill-home.stats-pages-inventory-stat.c021'),
35
+ k022: (p0) => m('skill-home.stats-pages-inventory-stat.c022', { p0: String(p0) }),
36
+ k023: m('skill-home.stats-pages-inventory-stat.c023'),
37
+ k024: m('skill-home.stats-pages-inventory-stat.c024'),
38
+ k025: m('skill-home.stats-pages-inventory-stat.c025'),
39
+ k026: m('skill-home.stats-pages-inventory-stat.c026'),
40
+ k027: m('skill-home.stats-pages-inventory-stat.c027'),
41
+ k028: m('skill-home.stats-pages-inventory-stat.c028'),
42
+ k029: m('skill-home.stats-pages-inventory-stat.c029'),
43
+ k030: m('skill-home.stats-pages-inventory-stat.c030'),
44
+ k031: m('skill-home.stats-pages-inventory-stat.c031'),
45
+ k032: m('skill-home.stats-pages-inventory-stat.c032'),
46
+ k033: m('skill-home.stats-pages-inventory-stat.c033'),
47
+ k034: m('skill-home.stats-pages-inventory-stat.c034'),
48
+ k035: m('skill-home.stats-pages-inventory-stat.c035'),
49
+ k036: m('skill-home.stats-pages-inventory-stat.c036'),
50
+ k037: m('skill-home.stats-pages-inventory-stat.c037'),
51
+ k038: m('skill-home.stats-pages-inventory-stat.c038'),
52
+ k039: m('skill-home.stats-pages-inventory-stat.c039'),
53
+ k040: m('skill-home.stats-pages-inventory-stat.c040'),
54
+ k041: m('skill-home.stats-pages-inventory-stat.c041'),
55
+ k042: m('skill-home.stats-pages-inventory-stat.c042'),
56
+ k043: m('skill-home.stats-pages-inventory-stat.c043'),
57
+ k044: m('skill-home.stats-pages-inventory-stat.c044'),
58
+ k045: m('skill-home.stats-pages-inventory-stat.c045'),
59
+ k046: m('skill-home.stats-pages-inventory-stat.c046'),
60
+ k047: m('skill-home.stats-pages-inventory-stat.c047'),
61
+ };
62
+ }
10
63
  export const FAMILY = 'inventory_stat';
11
64
  export const PAGE_META = {
12
65
  domain: 'stats',
@@ -43,13 +96,16 @@ export const REQUIRED_BLOCKS = {
43
96
  ]
44
97
  };
45
98
  // 可见转写(无拉丁字母;原文在 data-need 属性里一字未动)。
46
- const SHOWN = {
47
- '空态:还没有盘点记录+完成首次盘点引导': '空态:还没有盘点记录,完成首次盘点引导',
48
- '异常:数据解析失败/数据校验失败': '异常:数据解析失败,数据校验失败',
49
- '盘点明细(时间/范围/缺/多/异/状态)': '盘点明细(时间,范围,缺,多,异,状态)',
50
- 'AI建议': '智能建议',
51
- };
52
- const showOf = (b) => SHOWN[b] ?? b;
99
+ /** 本页可见文案(渲染期取词:写成函数,模块加载时不取词)。 */
100
+ function shownText() {
101
+ return {
102
+ '空态:还没有盘点记录+完成首次盘点引导': m('skill-home.stats-pages-inventory-stat.c053'),
103
+ '异常:数据解析失败/数据校验失败': m('skill-home.stats-pages-inventory-stat.c054'),
104
+ '盘点明细(时间/范围/缺/多/异/状态)': m('skill-home.stats-pages-inventory-stat.c055'),
105
+ 'AI建议': m('skill-home.stats-pages-inventory-stat.c056'),
106
+ };
107
+ }
108
+ const showOf = (b) => shownText()[b] ?? b;
53
109
  // 可见文本归一:半角拉丁字母转全角(机审只认半角为英文裸词;载荷原文不动)。
54
110
  function latinFree(s) {
55
111
  return s.replace(/[A-Za-z]/g, (c) => String.fromCharCode(c.charCodeAt(0) + 0xFEE0));
@@ -97,69 +153,64 @@ const CSS = '<style>'
97
153
  + '@media(max-width:560px){.st-cards{grid-template-columns:repeat(auto-fit,minmax(96px,1fr));gap:8px}'
98
154
  + '.st-card{box-sizing:border-box;padding:10px}.st-card span{font-size:19px}.st-actions .st-btn{flex:1 1 100%}}'
99
155
  + '</style>';
100
- const JS = '<script>(function(){var t=null;function toast(m){var e=document.getElementById("stToast");e.textContent=m;e.classList.add("show");clearTimeout(t);t=setTimeout(function(){e.classList.remove("show")},2000)}'
101
- + 'function fb(s){var a=document.createElement("textarea");a.value=s;document.body.appendChild(a);a.select();try{document.execCommand("copy");toast("已复制")}catch(e){toast("复制失败,请长按手动复制")}a.remove()}'
102
- + 'function cp(s){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(s).then(function(){toast("已复制")},function(){fb(s)})}else{fb(s)}}'
103
- + 'document.querySelectorAll("button[data-t]").forEach(function(b){b.addEventListener("click",function(){cp(b.getAttribute("data-t"))})})})();</script>';
156
+ /** 内联脚本(渲染期取词:写成函数,模块加载时不取词)。 */
157
+ function pageScript() {
158
+ const SX = {
159
+ k001: m('skill-home.stats-pages-inventory-stat.c050'),
160
+ k002: m('skill-home.stats-pages-inventory-stat.c051'),
161
+ k003: m('skill-home.stats-pages-inventory-stat.c052'),
162
+ };
163
+ return '<script>(function(){var t=null;function toast(m){var e=document.getElementById("stToast");e.textContent=m;e.classList.add("show");clearTimeout(t);t=setTimeout(function(){e.classList.remove("show")},2000)}'
164
+ + "function fb(s){var a=document.createElement(\"textarea\");a.value=s;document.body.appendChild(a);a.select();try{document.execCommand(\"copy\");toast(\"" + SX.k001 + "\")}catch(e){toast(\"" + SX.k002 + "\")}a.remove()}"
165
+ + "function cp(s){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(s).then(function(){toast(\"" + SX.k003 + "\")},function(){fb(s)})}else{fb(s)}}"
166
+ + 'document.querySelectorAll("button[data-t]").forEach(function(b){b.addEventListener("click",function(){cp(b.getAttribute("data-t"))})})})();</script>';
167
+ }
104
168
  // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
105
169
  // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
106
170
  // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
107
171
  export function renderFamilyPage(env, ctx) {
172
+ const L = pageText();
108
173
  const template = readFileSync(new URL('../../../templates/stats/inventory_stat.html', import.meta.url), 'utf8');
109
174
  const d = (env.data ?? {});
110
- const m = d.metrics ?? {};
111
- const records = typeof m.records === 'number' ? m.records : 0;
112
- const items = typeof m.items === 'number' ? m.items : 0;
175
+ const metrics = d.metrics ?? {};
176
+ const records = typeof metrics.records === 'number' ? metrics.records : 0;
177
+ const items = typeof metrics.items === 'number' ? metrics.items : 0;
113
178
  const diffTotal = typeof d.inventoryDiffTotal === 'number' ? d.inventoryDiffTotal : 0;
114
179
  const rows = Array.isArray(d.inventoryDetail) ? d.inventoryDetail : [];
115
- const head = '<div class="fam-head"><span class="fam-name" data-family="inventory_stat">统计总览</span><span class="fam-key" data-key="' + escapeHtml(PAGE_META.key) + '">盘点统计</span></div>';
180
+ const head = '<div class="fam-head">' + '<span class="fam-name" data-family="inventory_stat">' + L.k001 + '</span>' + '<span class="fam-key" data-key="' + escapeHtml(PAGE_META.key) + '">' + L.k002 + '</span>' + '</div>';
116
181
  // 摘要不复述两张卡的两个数(盘点记录条数/库内物品件数):只说卡片里没有的差异口径结论。
117
182
  // #817(⑤文案不冗余):h1 由场景名回填=本页名「盘点统计」,hero 胶囊换成本页主题词(与 39/41 两页同款处置)。
118
- const hero = '<div class="st st-hero"><span class="st-wake">库存差异</span><p class="st-lead">'
119
- + (records === 0 ? '还没有盘点记录,先完成首次盘点' : '历次盘点的差异累加在「遗留差异」那一格') + '</p></div>';
120
- const cards = '<div class="st st-cards">'
121
- + '<div class="st-card"><b>盘点记录</b><span>' + records + '</span><small>历史盘点条数</small></div>'
122
- + '<div class="st-card"><b>库内物品</b><span>' + items + '</span><small>盘点覆盖范围基数</small></div>'
123
- + '<div class="st-card"><b>有无数据</b><span>' + (records > 0 ? '有' : '无') + '</span><small>有没有盘点过</small></div></div>';
183
+ const hero = '<div class="st st-hero">' + '<span class="st-wake">' + L.k003 + '</span>' + '<p class="st-lead">' + (records === 0 ? L.k005 : L.k004) + '</p>' + '</div>';
184
+ const cards = '<div class="st st-cards">' + '<div class="st-card">' + '<b>' + L.k006 + '</b>' + '<span>' + records + '</span>' + '<small>' + L.k007 + '</small>' + '</div>' + '<div class="st-card">' + '<b>' + L.k008 + '</b>' + '<span>' + items + '</span>' + '<small>' + L.k009 + '</small>' + '</div>' + '<div class="st-card">' + '<b>' + L.k010 + '</b>' + '<span>' + (records > 0 ? L.k012 : L.k011) + '</span>' + '<small>' + L.k013 + '</small>' + '</div>' + '</div>';
124
185
  // 建议按遗留差异是否为 0 分支:为 0 时不再让人去复查不存在的东西(#865:改吃全表合计,不再只看最近一条)。
125
- const sug = '<div class="st st-sug">' + (records === 0 ? '先完成首次盘点,这里才会出现完成率与趋势' : diffTotal > 0 ? '建议优先复查遗留差异,再补下一次盘点' : '没有遗留差异要复查,可以直接补下一次盘点') + '</div>';
186
+ const sug = '<div class="st st-sug">' + (records === 0 ? L.k016 : diffTotal > 0 ? L.k015 : L.k014) + '</div>';
126
187
  // #865:明细逐条出(时间/范围/缺/多/异/状态),范围照老页面的写法归一成中文;
127
188
  // 「异」与「状态」两列本库盘点表还没有(老库权威 DDL 里有,落库另票),缺列时不占位、只用一行说明点出。
128
- const scopeCn = (s, loc) => (s === '' || s === 'all' ? '全屋' : s === 'location' ? (loc || '按位置') : s);
129
- const missCols = [rows.some((r) => r.diff === null) ? '异' : '', rows.some((r) => !r.status) ? '状态' : ''].filter(Boolean);
130
- const detailRows = rows.map((r) => '<div class="st-drow"><div class="st-dhead"><span class="st-dname">'
131
- + escapeHtml(latinFree(scopeCn(r.scope, r.location))) + '</span><span class="st-hint">' + escapeHtml(String(r.date || '')) + '</span></div>'
132
- + '<div class="st-dcells"><span class="st-dcell"><b>缺</b>' + r.missing + '</span><span class="st-dcell"><b>多</b>' + r.extra + '</span>'
133
- + (r.diff === null ? '' : '<span class="st-dcell"><b>异</b>' + r.diff + '</span>')
134
- + (r.status ? '<span class="st-dcell"><b>状态</b>' + escapeHtml(latinFree(r.status)) + '</span>' : '') + '</div></div>').join('');
189
+ const scopeCn = (s, loc) => (s === '' || s === 'all' ? m('skill-home.stats-pages-inventory-stat.c057') : s === 'location' ? (loc || m('skill-home.stats-pages-inventory-stat.c058')) : s);
190
+ const missCols = [rows.some((r) => r.diff === null) ? m('skill-home.stats-pages-inventory-stat.c048') : '', rows.some((r) => !r.status) ? m('skill-home.stats-pages-inventory-stat.c049') : ''].filter(Boolean);
191
+ const detailRows = rows.map((r) => '<div class="st-drow">' + '<div class="st-dhead">' + '<span class="st-dname">' + escapeHtml(latinFree(scopeCn(r.scope, r.location))) + '</span>' + '<span class="st-hint">' + escapeHtml(String(r.date || '')) + '</span>' + '</div>' + '<div class="st-dcells">' + '<span class="st-dcell">' + '<b>' + L.k017 + '</b>' + r.missing + '</span>' + '<span class="st-dcell">' + '<b>' + L.k018 + '</b>' + r.extra + '</span>' + (r.diff === null ? '' : '<span class="st-dcell">' + '<b>' + L.k019 + '</b>' + r.diff + '</span>') + (r.status ? '<span class="st-dcell">' + '<b>' + L.k020 + '</b>' + escapeHtml(latinFree(r.status)) + '</span>' : '') + '</div>' + '</div>').join('');
135
192
  const detail = records > 0
136
- ? '<div class="st st-sec"><h2 class="st-sec-t">盘点明细 <span class="st-hint">最近 ' + rows.length + ' 次</span></h2>'
137
- + (rows.length ? detailRows : '<p><span class="st-badge st-ok">最近一次盘点已在库</span></p>')
138
- + (missCols.length ? '<div class="st-sub">本库盘点表还没有' + missCols.join('与') + ',落库后这里自动出现</div>' : '')
139
- + '<div class="st-actions"><button class="st-btn pri" data-t="帮我复查最近一次盘点的遗留差异">复查盘点</button></div></div>'
140
- : '<div class="st st-empty"><b>还没有盘点记录</b>完成首次盘点后,这里会显示完成率,差异趋势与优先盘点建议'
141
- + '<div class="st-actions center"><button class="st-btn pri" data-t="帮我开始第一次盘点">复制首次盘点</button></div></div>';
193
+ ? '<div class="st st-sec">' + '<h2 class="st-sec-t">' + L.k021 + '<span class="st-hint">' + L.k022(String(rows.length)) + '</span>' + '</h2>' + (rows.length ? detailRows : '<p>' + '<span class="st-badge st-ok">' + L.k023 + '</span>' + '</p>') + (missCols.length ? '<div class="st-sub">' + L.k026 + missCols.join(L.k025) + L.k024 + '</div>' : '') + '<div class="st-actions">' + '<button class="st-btn pri" data-t="' + L.k027 + '">' + L.k028 + '</button>' + '</div>' + '</div>'
194
+ : '<div class="st st-empty">' + '<b>' + L.k029 + '</b>' + L.k030 + '<div class="st-actions center">' + '<button class="st-btn pri" data-t="' + L.k031 + '">' + L.k032 + '</button>' + '</div>' + '</div>';
142
195
  // #865:完成率与遗留差异总数进「完成率与趋势」块(老 inventory_stat.py 的 total_diff 口径);
143
196
  // 完成率要状态列,本库没有就不显示这一格,改由上面那行说明点出,不编数。
144
197
  const comp = d.completion ?? null;
145
- const trend = '<div class="st st-sec"><h2 class="st-sec-t">完成率与趋势</h2>'
146
- + (records > 0
147
- ? '<div class="st-meta">'
148
- + '<div class="st-meta-i"><b>盘点总数</b><span>' + records + ' 次</span></div>'
149
- + '<div class="st-meta-i"><b>遗留差异</b><span>' + diffTotal + ' 件</span></div>'
150
- + (comp ? '<div class="st-meta-i"><b>完成率</b><span>' + comp.pct + '%</span></div>' : '') + '</div>'
151
- + (comp ? '' : '<div class="st-sub">完成率要盘点状态,本库盘点表还没有这一列</div>')
152
- : '<div class="st-empty"><b>趋势数据不足</b>多盘点几次,完成率曲线与遗留差异总数会在这里成形</div>') + '</div>';
198
+ const trend = '<div class="st st-sec">' + '<h2 class="st-sec-t">' + L.k033 + '</h2>' + (records > 0
199
+ ? '<div class="st-meta">'
200
+ + '<div class="st-meta-i">' + '<b>' + L.k041 + '</b>' + '<span>' + records + L.k040 + '</span>' + '</div>'
201
+ + '<div class="st-meta-i">' + '<b>' + L.k039 + '</b>' + '<span>' + diffTotal + L.k038 + '</span>' + '</div>'
202
+ + (comp ? '<div class="st-meta-i">' + '<b>' + L.k037 + '</b>' + '<span>' + comp.pct + '%</span></div>' : '') + '</div>'
203
+ + (comp ? '' : '<div class="st-sub">' + L.k036 + '</div>')
204
+ : '<div class="st-empty">' + '<b>' + L.k034 + '</b>' + L.k035 + '</div>') + '</div>';
153
205
  const tail = '<div class="st-actions">' + homeCopyArea({
154
206
  data: { envelope: env },
155
207
  log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
156
208
  }) + '</div>';
157
- const raw = '<details hidden class="st st-raw"><summary>原始回执(给排查用)</summary><pre>' + escapeHtml(JSON.stringify(env)) + '</pre></details>';
158
- const blocks = '<details hidden class="st-blocks"><summary>必需块登记(契约对账用)</summary>'
159
- + sectionOf('fields', '字段') + sectionOf('operations', '操作') + sectionOf('empty', '空态与异常') + sectionOf('status', '状态词') + '</details>';
209
+ const raw = '<details hidden class="st st-raw">' + '<summary>' + L.k042 + '</summary>' + '<pre>' + escapeHtml(JSON.stringify(env)) + '</pre>' + '</details>';
210
+ const blocks = '<details hidden class="st-blocks">' + '<summary>' + L.k043 + '</summary>' + sectionOf('fields', L.k044) + sectionOf('operations', L.k045) + sectionOf('empty', L.k046) + sectionOf('status', L.k047) + '</details>';
160
211
  const content = CSS + head + '<div class="fam-content st">' + hero + cards + sug + detail + trend + '</div>'
161
212
  + tail + raw + blocks
162
- + '<div class="st-toast" id="stToast"></div>' + JS;
213
+ + '<div class="st-toast" id="stToast"></div>' + pageScript();
163
214
  return fillTemplate(template, content);
164
215
  }
165
216
  //# sourceMappingURL=inventory_stat.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"inventory_stat.js","sourceRoot":"","sources":["../../../src/stats/pages/inventory_stat.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inventory_stat.js","sourceRoot":"","sources":["../../../src/stats/pages/inventory_stat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../src/stats/pages/overview.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG/C,eAAO,MAAM,MAAM,EAAG,UAAmB,CAAC;AAE1C,eAAO,MAAM,SAAS;;;;;qBAKU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CAC1I,CAAC;AAEX,eAAO,MAAM,eAAe,EA0BvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AA4FF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAkHvH"}
1
+ {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../../src/stats/pages/overview.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAsF/C,eAAO,MAAM,MAAM,EAAG,UAAmB,CAAC;AAE1C,eAAO,MAAM,SAAS;;;;;qBAKU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;mBACgB,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,EAAE;CAC1I,CAAC;AAEX,eAAO,MAAM,eAAe,EA0BvB;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAuGF,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAyFvH"}
@@ -7,6 +7,87 @@
7
7
  // 可见行只放中文(无拉丁字母,`AI/TOP/prompt/N` 一律转写,映射见 scene-stats.md)。
8
8
  import { readFileSync } from 'node:fs';
9
9
  import { fillTemplate, escapeHtml, homeCopyArea, homeCopyLog, homeNowStamp } from '../../render/index.js';
10
+ import { m } from '../../entries/index.js';
11
+ /** 本页可见文案(渲染期取词:写成函数,模块加载时不取词)。 */
12
+ function pageText() {
13
+ return {
14
+ k001: m('skill-home.stats-pages-overview.c001'),
15
+ k002: m('skill-home.stats-pages-overview.c002'),
16
+ k003: m('skill-home.stats-pages-overview.c003'),
17
+ k004: m('skill-home.stats-pages-overview.c004'),
18
+ k005: m('skill-home.stats-pages-overview.c005'),
19
+ k006: m('skill-home.stats-pages-overview.c006'),
20
+ k007: m('skill-home.stats-pages-overview.c007'),
21
+ k008: m('skill-home.stats-pages-overview.c008'),
22
+ k009: m('skill-home.stats-pages-overview.c009'),
23
+ k010: m('skill-home.stats-pages-overview.c010'),
24
+ k011: m('skill-home.stats-pages-overview.c011'),
25
+ k012: m('skill-home.stats-pages-overview.c012'),
26
+ k013: m('skill-home.stats-pages-overview.c013'),
27
+ k014: (p0) => m('skill-home.stats-pages-overview.c014', { p0: String(p0) }),
28
+ k015: m('skill-home.stats-pages-overview.c015'),
29
+ k016: (p0) => m('skill-home.stats-pages-overview.c016', { p0: String(p0) }),
30
+ k017: m('skill-home.stats-pages-overview.c017'),
31
+ k018: m('skill-home.stats-pages-overview.c018'),
32
+ k019: m('skill-home.stats-pages-overview.c019'),
33
+ k020: m('skill-home.stats-pages-overview.c020'),
34
+ k021: m('skill-home.stats-pages-overview.c021'),
35
+ k022: m('skill-home.stats-pages-overview.c022'),
36
+ k023: m('skill-home.stats-pages-overview.c023'),
37
+ k024: m('skill-home.stats-pages-overview.c024'),
38
+ k025: m('skill-home.stats-pages-overview.c025'),
39
+ k026: m('skill-home.stats-pages-overview.c026'),
40
+ k027: m('skill-home.stats-pages-overview.c027'),
41
+ k028: m('skill-home.stats-pages-overview.c028'),
42
+ k029: m('skill-home.stats-pages-overview.c029'),
43
+ k030: m('skill-home.stats-pages-overview.c030'),
44
+ k031: m('skill-home.stats-pages-overview.c031'),
45
+ k032: m('skill-home.stats-pages-overview.c032'),
46
+ k033: m('skill-home.stats-pages-overview.c033'),
47
+ k034: m('skill-home.stats-pages-overview.c034'),
48
+ k035: m('skill-home.stats-pages-overview.c035'),
49
+ k036: m('skill-home.stats-pages-overview.c036'),
50
+ k037: m('skill-home.stats-pages-overview.c037'),
51
+ k038: m('skill-home.stats-pages-overview.c038'),
52
+ k039: m('skill-home.stats-pages-overview.c039'),
53
+ k040: m('skill-home.stats-pages-overview.c040'),
54
+ k041: m('skill-home.stats-pages-overview.c041'),
55
+ k042: m('skill-home.stats-pages-overview.c042'),
56
+ k043: m('skill-home.stats-pages-overview.c043'),
57
+ k044: (p0) => m('skill-home.stats-pages-overview.c044', { p0: String(p0) }),
58
+ k045: (p0) => m('skill-home.stats-pages-overview.c045', { p0: String(p0) }),
59
+ k046: m('skill-home.stats-pages-overview.c046'),
60
+ k047: m('skill-home.stats-pages-overview.c047'),
61
+ k048: (p0) => m('skill-home.stats-pages-overview.c048', { p0: String(p0) }),
62
+ k049: m('skill-home.stats-pages-overview.c049'),
63
+ k050: (p0) => m('skill-home.stats-pages-overview.c050', { p0: String(p0) }),
64
+ k051: m('skill-home.stats-pages-overview.c051'),
65
+ k052: m('skill-home.stats-pages-overview.c052'),
66
+ k053: m('skill-home.stats-pages-overview.c053'),
67
+ k054: m('skill-home.stats-pages-overview.c054'),
68
+ k055: m('skill-home.stats-pages-overview.c055'),
69
+ k056: m('skill-home.stats-pages-overview.c056'),
70
+ k057: m('skill-home.stats-pages-overview.c057'),
71
+ k058: m('skill-home.stats-pages-overview.c058'),
72
+ k059: m('skill-home.stats-pages-overview.c059'),
73
+ k060: m('skill-home.stats-pages-overview.c060'),
74
+ k061: m('skill-home.stats-pages-overview.c061'),
75
+ k062: m('skill-home.stats-pages-overview.c062'),
76
+ k063: m('skill-home.stats-pages-overview.c063'),
77
+ k064: m('skill-home.stats-pages-overview.c064'),
78
+ k065: m('skill-home.stats-pages-overview.c065'),
79
+ k066: m('skill-home.stats-pages-overview.c066'),
80
+ k067: m('skill-home.stats-pages-overview.c067'),
81
+ k068: m('skill-home.stats-pages-overview.c068'),
82
+ k069: m('skill-home.stats-pages-overview.c069'),
83
+ k070: m('skill-home.stats-pages-overview.c070'),
84
+ k071: m('skill-home.stats-pages-overview.c071'),
85
+ k072: m('skill-home.stats-pages-overview.c072'),
86
+ k073: m('skill-home.stats-pages-overview.c073'),
87
+ k074: m('skill-home.stats-pages-overview.c074'),
88
+ k075: m('skill-home.stats-pages-overview.c075'),
89
+ };
90
+ }
10
91
  export const FAMILY = 'overview';
11
92
  export const PAGE_META = {
12
93
  domain: 'stats',
@@ -44,16 +125,19 @@ export const REQUIRED_BLOCKS = {
44
125
  ]
45
126
  };
46
127
  // 可见转写(无拉丁字母;原文在 data-need 属性里一字未动)。
47
- const SHOWN = {
48
- '空态:还没有物品+录入第一批引导': '空态:还没有物品,录入第一批引导',
49
- '分区空态:暂无分类/位置/状态数据': '分区空态:暂无分类,位置,状态数据',
50
- '异常:数据解析失败/数据校验失败': '异常:数据解析失败,数据校验失败',
51
- '摘要(件数/总价/价格覆盖率/近30天变动)': '摘要(件数,总价,价格覆盖率,近30天变动)',
52
- '价值TOP': '价值排行',
53
- '高频TOP': '高频排行',
54
- '点柱子复制筛选浏览prompt': '点柱子复制筛选浏览指令',
55
- };
56
- const showOf = (b) => SHOWN[b] ?? b;
128
+ /** 本页可见文案(渲染期取词:写成函数,模块加载时不取词)。 */
129
+ function shownText() {
130
+ return {
131
+ '空态:还没有物品+录入第一批引导': m('skill-home.stats-pages-overview.c082'),
132
+ '分区空态:暂无分类/位置/状态数据': m('skill-home.stats-pages-overview.c083'),
133
+ '异常:数据解析失败/数据校验失败': m('skill-home.stats-pages-overview.c084'),
134
+ '摘要(件数/总价/价格覆盖率/近30天变动)': m('skill-home.stats-pages-overview.c085'),
135
+ '价值TOP': m('skill-home.stats-pages-overview.c086'),
136
+ '高频TOP': m('skill-home.stats-pages-overview.c087'),
137
+ '点柱子复制筛选浏览prompt': m('skill-home.stats-pages-overview.c088'),
138
+ };
139
+ }
140
+ const showOf = (b) => shownText()[b] ?? b;
57
141
  // 可见文本归一:半角拉丁字母转全角(机审只认半角为英文裸词;载荷原文不动)。
58
142
  // 数字与日期原样保留。
59
143
  function latinFree(s) {
@@ -118,51 +202,50 @@ const CSS = '<style>'
118
202
  + '.st-toast.show{opacity:1}@media(max-width:560px){.st-card span{font-size:19px}.st-actions .st-btn{flex:1 1 100%}'
119
203
  + '.st-drow{grid-template-columns:minmax(0,1fr) 54px 30px;gap:6px}.st-tcols{gap:4px}}'
120
204
  + '</style>';
121
- const JS = '<script>(function(){var t=null;function toast(m){var e=document.getElementById("stToast");e.textContent=m;e.classList.add("show");clearTimeout(t);t=setTimeout(function(){e.classList.remove("show")},2000)}'
122
- + 'function fb(s){var a=document.createElement("textarea");a.value=s;document.body.appendChild(a);a.select();try{document.execCommand("copy");toast("已复制")}catch(e){toast("复制失败,请长按手动复制")}a.remove()}'
123
- + 'function cp(s){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(s).then(function(){toast("已复制")},function(){fb(s)})}else{fb(s)}}'
124
- + 'document.querySelectorAll("button[data-t]").forEach(function(b){b.addEventListener("click",function(){cp(b.getAttribute("data-t"))})});'
125
- + 'document.querySelectorAll("[data-bar]").forEach(function(r){r.addEventListener("click",function(){cp(r.getAttribute("data-bar"))})});})();</script>';
205
+ /** 内联脚本(渲染期取词:写成函数,模块加载时不取词)。 */
206
+ function pageScript() {
207
+ const SX = {
208
+ k001: m('skill-home.stats-pages-overview.c079'),
209
+ k002: m('skill-home.stats-pages-overview.c080'),
210
+ k003: m('skill-home.stats-pages-overview.c081'),
211
+ };
212
+ return '<script>(function(){var t=null;function toast(m){var e=document.getElementById("stToast");e.textContent=m;e.classList.add("show");clearTimeout(t);t=setTimeout(function(){e.classList.remove("show")},2000)}'
213
+ + "function fb(s){var a=document.createElement(\"textarea\");a.value=s;document.body.appendChild(a);a.select();try{document.execCommand(\"copy\");toast(\"" + SX.k001 + "\")}catch(e){toast(\"" + SX.k002 + "\")}a.remove()}"
214
+ + "function cp(s){if(navigator.clipboard&&navigator.clipboard.writeText){navigator.clipboard.writeText(s).then(function(){toast(\"" + SX.k003 + "\")},function(){fb(s)})}else{fb(s)}}"
215
+ + 'document.querySelectorAll("button[data-t]").forEach(function(b){b.addEventListener("click",function(){cp(b.getAttribute("data-t"))})});'
216
+ + 'document.querySelectorAll("[data-bar]").forEach(function(r){r.addEventListener("click",function(){cp(r.getAttribute("data-bar"))})});})();</script>';
217
+ }
126
218
  // 装配入口:真 envelope(真命令链产出)+本族模板 → 同形整页。
127
219
  // fail-closed:模板缺失/标记异常(fillTemplate 内抛)不返空页。
128
220
  // 复制区走共用件(卡路里同款三格式+六段日志);`ctx.command` 由交付链供给(含 params),直调缺省按本族主 key。
129
221
  export function renderFamilyPage(env, ctx) {
222
+ const L = pageText();
130
223
  const template = readFileSync(new URL('../../../templates/stats/overview.html', import.meta.url), 'utf8');
131
224
  const d = (env.data ?? {});
132
- const m = d.metrics ?? {};
133
- const n = (k) => (typeof m[k] === 'number' ? m[k] : 0);
225
+ const metrics = d.metrics ?? {};
226
+ const n = (k) => (typeof metrics[k] === 'number' ? metrics[k] : 0);
134
227
  // #865:高频排行吃 `topFreq`(完整名称+最后使用日);缺该字段时回落既有 `top.*` 指标(既有键不动)。
135
228
  const tops = (Array.isArray(d.topFreq) && d.topFreq.length
136
229
  ? d.topFreq
137
- : Object.entries(m).filter(([k]) => k.startsWith('top.')).map(([k, v]) => ({ name: k.slice(4), count: v, lastAccessedAt: '' })))
230
+ : Object.entries(metrics).filter(([k]) => k.startsWith('top.')).map(([k, v]) => ({ name: k.slice(4), count: v, lastAccessedAt: '' })))
138
231
  .slice().sort((a, b) => b.count - a.count);
139
232
  const topMax = tops.length ? Math.max(...tops.map((t) => t.count), 1) : 1;
140
- const head = '<div class="fam-head"><span class="fam-name" data-family="overview">统计总览</span><span class="fam-key" data-key="' + escapeHtml(PAGE_META.key) + '">统物品</span></div>';
233
+ const head = '<div class="fam-head">' + '<span class="fam-name" data-family="overview">' + L.k001 + '</span>' + '<span class="fam-key" data-key="' + escapeHtml(PAGE_META.key) + '">' + L.k002 + '</span>' + '</div>';
141
234
  // 摘要不复述五张卡的数字:只说卡片里没有的结论(价格是否补全),覆盖率数字留给价值排行那块。
142
- const lead = n('items') === 0 ? '还没有物品,先录入第一批物品'
143
- : (n('price.cover') >= 100 ? '价格已经补全,总价与价值排行覆盖全部物品' : '还有物品没补价,总价与价值排行只算得上已经有价格的那部分');
235
+ const lead = n('items') === 0 ? m('skill-home.stats-pages-overview.c076')
236
+ : (n('price.cover') >= 100 ? m('skill-home.stats-pages-overview.c077') : m('skill-home.stats-pages-overview.c078'));
144
237
  // #817:h1 与页族名已经是「统物品」,hero 胶囊不再同名,改说这一页的范围。
145
- const hero = '<div class="st st-hero"><span class="st-wake">全部物品</span><p class="st-lead">' + lead + '</p></div>';
146
- const cards = '<div class="st st-cards">'
147
- + '<div class="st-card"><b>物品条数</b><span>' + n('items') + '</span><small>库内全部物品</small></div>'
148
- + '<div class="st-card"><b>物品总件数</b><span>' + n('quantity') + '</span><small>按数量合计</small></div>'
149
- + '<div class="st-card"><b>位置点</b><span>' + n('locations') + '</span><small>有东西放着的位置</small></div>'
150
- + '<div class="st-card"><b>标签数</b><span>' + n('tags') + '</span><small>不同标签个数</small></div>'
151
- + '<div class="st-card"><b>分类数</b><span>' + n('categories') + '</span><small>启用中的分类</small></div></div>';
152
- const freqRows = tops.length ? tops.map((t) => '<div class="st-row" data-bar="帮我筛选浏览物品:'
153
- + escapeHtml(t.name) + '" role="button" tabindex="0"><div class="st-name">' + escapeHtml(latinFree(t.name))
154
- // #865:最后使用日来自 `topFreq.lastAccessedAt`(老「高频 TOP」表带这一列);标签与日期各占一格,无值不占位。
155
- + (t.lastAccessedAt ? '<div class="st-sub"><span class="st-kv"><b>最后使用</b>'
156
- + escapeHtml(String(t.lastAccessedAt).slice(0, 10)) + '</span></div>' : '')
157
- + '<div class="st-track"><span class="st-fill" style="width:' + Math.round((t.count / topMax) * 100) + '%"></span></div></div>'
158
- + '<div class="st-num">' + t.count + '次</div></div>').join('')
159
- : '<div class="st-empty"><b>还没有访问记录</b>多看看几件物品,这里就会出现高频排行</div>';
160
- const freq = '<div class="st st-sec"><h2 class="st-sec-t">高频排行</h2>'
161
- + '<div class="st-legend"><span><i style="background:#0a63d6"></i>柱长代表访问次数,点一行复制筛选浏览指令</span></div>' + freqRows + '</div>';
238
+ const hero = '<div class="st st-hero">' + '<span class="st-wake">' + L.k003 + '</span>' + '<p class="st-lead">' + lead + '</p>' + '</div>';
239
+ const cards = '<div class="st st-cards">' + '<div class="st-card">' + '<b>' + L.k004 + '</b>' + '<span>' + n('items') + '</span>' + '<small>' + L.k005 + '</small>' + '</div>' + '<div class="st-card">' + '<b>' + L.k006 + '</b>' + '<span>' + n('quantity') + '</span>' + '<small>' + L.k007 + '</small>' + '</div>' + '<div class="st-card">' + '<b>' + L.k008 + '</b>' + '<span>' + n('locations') + '</span>' + '<small>' + L.k009 + '</small>' + '</div>' + '<div class="st-card">' + '<b>' + L.k010 + '</b>' + '<span>' + n('tags') + '</span>' + '<small>' + L.k011 + '</small>' + '</div>' + '<div class="st-card">' + '<b>' + L.k012 + '</b>' + '<span>' + n('categories') + '</span>' + '<small>' + L.k013 + '</small>' + '</div>' + '</div>';
240
+ const freqRows = tops.length ? tops.map((t) => '<div class="st-row" data-bar="' + L.k014(String(escapeHtml(t.name))) + '" role="button" tabindex="0">' + '<div class="st-name">' + escapeHtml(latinFree(t.name)) + (t.lastAccessedAt ? '<div class="st-sub">' + '<span class="st-kv">' + '<b>' + L.k015 + '</b>'
241
+ + escapeHtml(String(t.lastAccessedAt).slice(0, 10)) + '</span></div>' : '') + '<div class="st-track">' + '<span class="st-fill" style="width:' + Math.round((t.count / topMax) * 100) + '%">' + '</span>' + '</div>' + '</div>' + '<div class="st-num">' + L.k016(String(t.count)) + '</div>' + '</div>').join('')
242
+ : '<div class="st-empty">' + '<b>' + L.k017 + '</b>' + L.k018 + '</div>';
243
+ const freq = '<div class="st st-sec">' + '<h2 class="st-sec-t">' + L.k019 + '</h2>' + '<div class="st-legend">' + '<span>' + '<i style="background:#0a63d6">' + '</i>' + L.k020 + '</span>' + '</div>' + freqRows + '</div>';
162
244
  // #865:四个分布各出逐项计数(老 `top_category_rows`/`_location_distribution`/`_status_distribution`/`_owner_distribution` 口径)。
163
245
  // 口径原文只住 `data-need` 属性;可见行是「名称+柱长+计数」,三格定宽栅格,窄屏不掉字也不靠分隔符拼串。
164
246
  const dims = d.distributions ?? {};
165
247
  const dimRows = (rows) => {
248
+ const L = pageText();
166
249
  const list = Array.isArray(rows) ? rows.slice(0, 8) : [];
167
250
  if (!list.length)
168
251
  return '';
@@ -171,45 +254,31 @@ export function renderFamilyPage(env, ctx) {
171
254
  // 挤进一个串看不出哪个是哪个;拆开也避免同一串在多行重复时被判据当成重复句。
172
255
  return '<div class="st-dim">' + list.map((r) => '<div class="st-drow"><span class="st-dname">'
173
256
  + escapeHtml(latinFree(r.name)) + '</span><span class="st-track st-dtrack"><span class="st-fill" style="width:'
174
- + Math.round((r.count / max) * 100) + '%"></span></span><span class="st-dnum">' + r.count + ' 件'
257
+ + Math.round((r.count / max) * 100) + '%"></span></span><span class="st-dnum">' + r.count + L.k021
175
258
  + (typeof r.pct === 'number' ? '<span class="st-dpct">' + r.pct + '%</span>' : '') + '</span></div>').join('') + '</div>';
176
259
  };
177
260
  const dist = (t, ctx, cmd, label, rows) => '<div class="st-row"><div class="st-name">' + t + '<div class="st-sub">' + ctx + '</div></div>'
178
261
  + '<div><button class="st-btn soft" data-t="' + escapeHtml(cmd) + '">' + label + '</button></div></div>' + dimRows(rows);
179
262
  // #817 第二波(②层级清):灰字原是「无逐维明细」——数据口径术语,读的人不知道那是什么;
180
263
  // 改成说这一块怎么用(点右边按钮复制该维统计)。
181
- const dists = '<div class="st st-sec"><h2 class="st-sec-t">分布 <span class="st-hint">点右侧按钮,复制该维统计</span></h2>'
182
- + dist('分类分布', '库内共有' + n('categories') + '个分类', '帮我按分类统计物品数量', '复制分类统计', dims.categories)
183
- + dist('位置分布', '库内共有' + n('locations') + '个位置点', '帮我按位置统计物品数量', '复制位置统计', dims.locations)
184
- + dist('状态分布', '库内共有' + n('items') + '件物品', '帮我按状态统计物品数量', '复制状态统计', dims.statuses)
185
- // #817 第二波(②层级清):四块里只有这一块没有总量(check 要「四个分布分块是否有总量与入口」)——补上。
186
- + dist('归属分布', '默认归使用者,库内共 ' + n('items') + ' 件', '帮我按归属人统计物品数量', '复制归属统计', dims.owners) + '</div>';
264
+ const dists = '<div class="st st-sec">' + '<h2 class="st-sec-t">' + L.k022 + '<span class="st-hint">' + L.k023 + '</span>' + '</h2>' + dist(L.k028, L.k027 + n('categories') + L.k026, L.k025, L.k024, dims.categories) + dist(L.k033, L.k032 + n('locations') + L.k031, L.k030, L.k029, dims.locations) + dist(L.k038, L.k037 + n('items') + L.k036, L.k035, L.k034, dims.statuses) + dist(L.k043, L.k042 + n('items') + L.k041, L.k040, L.k039, dims.owners) + '</div>';
187
265
  // #865:价值排行吃 `topValue`(带分类名,价格大于 0 口径);缺该字段时回落既有 `value.*` 指标。
188
266
  const vals = (Array.isArray(d.topValue) && d.topValue.length
189
267
  ? d.topValue
190
- : Object.entries(m).filter(([k]) => k.startsWith('value.')).map(([k, v]) => ({ name: k.slice(6), price: v, category: '' })))
268
+ : Object.entries(metrics).filter(([k]) => k.startsWith('value.')).map(([k, v]) => ({ name: k.slice(6), price: v, category: '' })))
191
269
  .slice().sort((a, b) => b.price - a.price);
192
270
  const valMax = vals.length ? Math.max(...vals.map((t) => t.price), 1) : 1;
193
- const valRows = vals.map((t) => '<div class="st-row" data-bar="帮我筛选浏览物品:' + escapeHtml(t.name) + '" role="button" tabindex="0">'
194
- + '<div class="st-name">' + escapeHtml(latinFree(t.name))
195
- + (t.category ? '<div class="st-sub">' + escapeHtml(latinFree(t.category)) + '</div>' : '')
196
- + '<div class="st-track"><span class="st-fill" style="width:' + Math.round((t.price / valMax) * 100) + '%"></span></div></div>'
197
- + '<div class="st-num">' + t.price + ' 元</div></div>').join('');
271
+ const valRows = vals.map((t) => '<div class="st-row" data-bar="' + L.k044(String(escapeHtml(t.name))) + '" role="button" tabindex="0">' + '<div class="st-name">' + escapeHtml(latinFree(t.name)) + (t.category ? '<div class="st-sub">' + escapeHtml(latinFree(t.category)) + '</div>' : '') + '<div class="st-track">' + '<span class="st-fill" style="width:' + Math.round((t.price / valMax) * 100) + '%">' + '</span>' + '</div>' + '</div>' + '<div class="st-num">' + L.k045(String(t.price)) + '</div>' + '</div>').join('');
198
272
  // #817 第二波(⑥分隔符不懒政):原先三个口径(覆盖率/有价格件数/合计价值)挤在标题那一行的小灰字里,
199
273
  // 靠「,」硬串;改成三格注脚,一格一个口径名+一个值,窄屏自动折行。
200
- const priceMeta = '<div class="st-meta">'
201
- + '<div class="st-meta-i"><b>价格覆盖率</b><span>' + n('price.cover') + '%</span></div>'
202
- + '<div class="st-meta-i"><b>已有价格</b><span>' + n('price.covered') + ' 件</span></div>'
203
- + '<div class="st-meta-i"><b>合计价值</b><span>' + n('price.total') + ' 元</span></div></div>';
204
- const more = '<div class="st st-sec"><h2 class="st-sec-t">价值排行</h2>' + priceMeta
205
- + (vals.length ? valRows + '<div class="st-actions"><button class="st-btn soft" data-t="帮我找出没有价格的物品,我逐个补价">复制补价提示</button></div>' : '<div class="st-empty"><b>还没有价格数据</b>给物品补上价格后,这里会出现价值排行'
206
- + '<div class="st-actions center"><button class="st-btn" data-t="帮我找出没有价格的物品,我逐个补价">复制补价提示</button></div></div>') + '</div>';
207
- const empty = n('items') === 0 ? '<div class="st st-empty"><b>还没有物品</b>录入第一批物品后,这里就是你的家底总览'
208
- + '<div class="st-actions center"><button class="st-btn pri" data-t="帮我录入第一批物品">复制初始化</button></div></div>' : '';
274
+ const priceMeta = '<div class="st-meta">' + '<div class="st-meta-i">' + '<b>' + L.k046 + '</b>' + '<span>' + n('price.cover') + '%' + '</span>' + '</div>' + '<div class="st-meta-i">' + '<b>' + L.k047 + '</b>' + '<span>' + L.k048(String(n('price.covered'))) + '</span>' + '</div>' + '<div class="st-meta-i">' + '<b>' + L.k049 + '</b>' + '<span>' + L.k050(String(n('price.total'))) + '</span>' + '</div>' + '</div>';
275
+ const more = '<div class="st st-sec">' + '<h2 class="st-sec-t">' + L.k051 + '</h2>' + priceMeta + (vals.length ? valRows + '<div class="st-actions">' + '<button class="st-btn soft" data-t="' + L.k056 + '">' + L.k057 + '</button>' + '</div>' : '<div class="st-empty">' + '<b>' + L.k054 + '</b>' + L.k055
276
+ + '<div class="st-actions center">' + '<button class="st-btn" data-t="' + L.k052 + '">' + L.k053 + '</button>' + '</div>' + '</div>') + '</div>';
277
+ const empty = n('items') === 0 ? '<div class="st st-empty">' + '<b>' + L.k058 + '</b>' + L.k059 + '<div class="st-actions center">' + '<button class="st-btn pri" data-t="' + L.k060 + '">' + L.k061 + '</button>' + '</div>' + '</div>' : '';
209
278
  // 建议不复述卡片数字(条数/位置数/最常看的名字都在卡片里):只说按排行能做什么。
210
279
  const sug = '<div class="st st-sug">' + (tops.length
211
- ? '访问热度已经攒下来,按高频排行把常用品固定到顺手的位置,闲置久了的顺路清理'
212
- : '多让助手查几次物品详情,高频排行才攒得出数据') + '</div>';
280
+ ? L.k063
281
+ : L.k062) + '</div>';
213
282
  // #865:趋势吃 `trend.buckets`(近30天四桶:近7天/8-14天/15-21天/22-30天,老 `_trend_buckets` 分档)。
214
283
  // 每桶两柱(录入/废弃)+桶下计数;桶全空时仍给诚实空态,不画一条零线冒充曲线。
215
284
  const buckets = Array.isArray(d.trend?.buckets) ? d.trend.buckets : [];
@@ -219,20 +288,18 @@ export function renderFamilyPage(env, ctx) {
219
288
  ? '<div class="st-trend">' + buckets.map((b) => '<div class="st-tb"><div class="st-tcols">'
220
289
  + '<span class="st-tcell"><span class="st-tcol"><i class="st-tfill" style="height:' + trendPct(b.added) + '"></i></span><b>' + b.added + '</b></span>'
221
290
  + '<span class="st-tcell"><span class="st-tcol del"><i class="st-tfill" style="height:' + trendPct(b.discarded) + '"></i></span><b>' + b.discarded + '</b></span>'
222
- + '</div><div class="st-tl">' + escapeHtml(b.label) + '</div></div>').join('')
223
- + '</div><div class="st-legend"><span><i style="background:#0a63d6"></i>录入</span><span><i style="background:#c7cbd1"></i>废弃</span></div>'
224
- + '<div class="st-sub">' + escapeHtml(d.trend?.note ?? '') + '</div>'
225
- : '<div class="st-empty"><b>趋势数据不足</b>库内还没有足量的变更记录,攒够之后这里给近30天的变动曲线</div>';
226
- const trend = '<div class="st st-sec"><h2 class="st-sec-t">趋势 <span class="st-hint">近30天变动</span></h2>' + trendChart + '</div>';
227
- const raw = '<details hidden class="st st-raw"><summary>原始回执(给排查用)</summary><pre>' + escapeHtml(JSON.stringify(env)) + '</pre></details>';
291
+ + '</div><div class="st-tl">' + escapeHtml(b.label) + '</div></div>').join('') + '</div>' + '<div class="st-legend">' + '<span>' + '<i style="background:#0a63d6">' + '</i>' + L.k064 + '</span>' + '<span>' + '<i style="background:#c7cbd1">' + '</i>' + L.k065 + '</span>' + '</div>' + '<div class="st-sub">' + escapeHtml(d.trend?.note ?? '') + '</div>'
292
+ : '<div class="st-empty">' + '<b>' + L.k066 + '</b>' + L.k067 + '</div>';
293
+ const trend = '<div class="st st-sec">' + '<h2 class="st-sec-t">' + L.k068 + '<span class="st-hint">' + L.k069 + '</span>' + '</h2>' + trendChart + '</div>';
294
+ const raw = '<details hidden class="st st-raw">' + '<summary>' + L.k070 + '</summary>' + '<pre>' + escapeHtml(JSON.stringify(env)) + '</pre>' + '</details>';
228
295
  const tail = '<div class="st-actions">' + homeCopyArea({
229
296
  data: { envelope: env },
230
297
  log: { envelope: env, copyLog: homeCopyLog({ command: ctx?.command ?? 'home-cmd-read ' + PAGE_META.key, actionAt: ctx?.actionAt ?? homeNowStamp() }) },
231
298
  }) + '</div>';
232
- const blocks = '<details hidden class="st-blocks"><summary>必需块登记(契约对账用)</summary>' + sectionOf('fields', '字段') + sectionOf('operations', '操作') + sectionOf('empty', '空态与异常') + sectionOf('status', '状态词') + '</details>';
299
+ const blocks = '<details hidden class="st-blocks">' + '<summary>' + L.k071 + '</summary>' + sectionOf('fields', L.k072) + sectionOf('operations', L.k073) + sectionOf('empty', L.k074) + sectionOf('status', L.k075) + '</details>';
233
300
  const content = CSS + head + '<div class="fam-content st">' + hero + cards + empty + freq + dists + more + trend + sug + '</div>'
234
301
  + tail + raw + blocks
235
- + '<div class="st-toast" id="stToast"></div>' + JS;
302
+ + '<div class="st-toast" id="stToast"></div>' + pageScript();
236
303
  return fillTemplate(template, content);
237
304
  }
238
305
  //# sourceMappingURL=overview.js.map