@brms/ai-skills 0.1.0

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 (90) hide show
  1. package/README.md +256 -0
  2. package/bin/brms-skills.mjs +411 -0
  3. package/package.json +30 -0
  4. package/skills/brms-prototype-generator/SKILL.md +129 -0
  5. package/skills/brms-prototype-generator/agents/openai.yaml +7 -0
  6. package/skills/brms-prototype-generator/examples/few-shot-examples.md +577 -0
  7. package/skills/brms-prototype-generator/references/01-list-query.md +444 -0
  8. package/skills/brms-prototype-generator/references/02-form-entry.md +129 -0
  9. package/skills/brms-prototype-generator/references/03-detail-display.md +125 -0
  10. package/skills/brms-prototype-generator/references/04-composite-page-package.md +339 -0
  11. package/skills/brms-prototype-generator/references/05-dialog-patterns.md +113 -0
  12. package/skills/brms-prototype-generator/references/06-backend-request-patterns.md +118 -0
  13. package/skills/brms-prototype-generator/references/resource-index.md +46 -0
  14. package/skills/brms-prototype-generator/references/system-prompt.md +242 -0
  15. package/skills/brms-prototype-generator/scripts/analyze-doc.mjs +554 -0
  16. package/skills/brms-prototype-generator/scripts/check-project.mjs +228 -0
  17. package/skills/brms-prototype-generator/scripts/discover-targets.mjs +158 -0
  18. package/skills/brms-prototype-generator/scripts/install-codex.mjs +74 -0
  19. package/skills/brms-prototype-generator/scripts/plan-pages.mjs +390 -0
  20. package/skills/brms-prototype-generator/scripts/validate-generated.mjs +838 -0
  21. package/skills/brms-prototype-generator/templates/user-input-template.md +182 -0
  22. package/skills/brms-vxe-plus-developer/SKILL.md +105 -0
  23. package/skills/brms-vxe-plus-developer/agents/openai.yaml +7 -0
  24. package/skills/brms-vxe-plus-developer/references/prototype-to-real.md +54 -0
  25. package/skills/brms-vxe-plus-developer/references/real-base-development.md +110 -0
  26. package/skills/brms-vxe-plus-developer/references/resource-index.md +43 -0
  27. package/skills/brms-vxe-plus-developer/references/review-checklist.md +49 -0
  28. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/01-mental-model.md +150 -0
  29. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/02-vxe-plus-form.md +302 -0
  30. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/03-vxe-plus-table.md +253 -0
  31. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/04-example-map.md +488 -0
  32. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/05-request-and-eiinfo.md +170 -0
  33. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/90-anti-patterns.md +137 -0
  34. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/README.md +43 -0
  35. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/README.md +21 -0
  36. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/A1/P0/A1P01601.vue +483 -0
  37. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/A1/P1/A1P11011.vue +444 -0
  38. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/AB/BP/ABBP0201.vue +1648 -0
  39. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/AM/AF/component/AMAF0601/Bidding/formConfig.ts +228 -0
  40. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/AM/AF/component/AMAF0601/Record/columns.ts +110 -0
  41. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/BM/BR/BMBR01.vue +130 -0
  42. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/BM/BR/component/BMBR01/columns.ts +94 -0
  43. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/BM/BR/component/BMBR01/formConfig.ts +108 -0
  44. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Change/formConfig.ts +123 -0
  45. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Change/index.vue +103 -0
  46. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Clause/columns.ts +48 -0
  47. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Clause/index.vue +202 -0
  48. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Correcte/formConfig.ts +117 -0
  49. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Correcte/index.vue +103 -0
  50. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/Payment/formConfig.ts +90 -0
  51. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/Payment/index.vue +42 -0
  52. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/columns.ts +376 -0
  53. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Pay/index.vue +619 -0
  54. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Domestic/formConfig.ts +73 -0
  55. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Domestic/index.vue +47 -0
  56. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Foreign/formConfig.ts +141 -0
  57. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/Foreign/index.vue +42 -0
  58. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/columns.ts +123 -0
  59. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/Settle/index.vue +593 -0
  60. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Explain/index.vue +68 -0
  61. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Fee/columns.ts +150 -0
  62. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Fee/index.vue +235 -0
  63. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Files/columns.ts +63 -0
  64. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Files/index.vue +117 -0
  65. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Goods/columns.ts +327 -0
  66. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Goods/index.vue +790 -0
  67. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve/formConfig.ts +341 -0
  68. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve/index.vue +63 -0
  69. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve2/formConfig.ts +232 -0
  70. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Approve2/index.vue +27 -0
  71. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Diff/columns.ts +46 -0
  72. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/Diff/index.vue +92 -0
  73. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/formConfig.ts +979 -0
  74. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Base/index.vue +62 -0
  75. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Other/formConfig.ts +179 -0
  76. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Other/index.vue +140 -0
  77. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Sign/formConfig.ts +118 -0
  78. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/Sign/index.vue +44 -0
  79. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Main/index.vue +168 -0
  80. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/Major/formConfig.ts +257 -0
  81. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/Major/index.vue +47 -0
  82. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/columns.ts +256 -0
  83. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Party/index.vue +738 -0
  84. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Price/formConfig.ts +174 -0
  85. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Price/index.vue +51 -0
  86. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/PM/PC/component/PMPC0101/Top/index.vue +924 -0
  87. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/SM/SW/SMSW0101.vue +567 -0
  88. package/skills/brms-vxe-plus-developer/references/vxe-plus-knowledge/sources/project/base/src/views/demo/index.vue +448 -0
  89. package/skills/brms-vxe-plus-developer/scripts/check-project.mjs +259 -0
  90. package/skills/brms-vxe-plus-developer/scripts/check-vxe-plus-page.mjs +137 -0
@@ -0,0 +1,448 @@
1
+ <template>
2
+ <bx-container title="记1录集">
3
+ <div class="bx-container">
4
+ <!-- <div class="flex h-800px" /> -->
5
+
6
+ <div class="flex flex-col flex-1">
7
+ <VxePlusTable
8
+ id="demo_result" ref="xGrid" :columns="columns" :form-config="formConfig"
9
+ :service-config="serviceConfig" :toolbar-buttons="toolbarButtons" :show-checkbox="true" :is-edit="true"
10
+ height="500px" v-on="gridEvents"
11
+ />
12
+ </div>
13
+ </div>
14
+ </bx-container>
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { onMounted, reactive, ref } from 'vue'
19
+ import { VxePlusTable, useDialog } from '@vxe-plus/components'
20
+ import 'vxe-table/lib/style.css'
21
+ import type { VxeGridProps } from 'vxe-table'
22
+ import { EiBlock, EiInfo } from '@eplat/ei'
23
+ import { useRouter } from 'vue-router'
24
+ import { useTable } from '@/hooks/useTable'
25
+ import { getCodeSetByService } from '@/utils/eiTools'
26
+ import vxeTableDialog from '@/views/A1/P1/vxeTableDialog.vue'
27
+ import { usePageRefreshStore } from '@/stores/modules/pageRefresh'
28
+ // import { useCodeSetStore } from '@/stores/modules/codeSet'
29
+
30
+ const xGrid = ref<any>(null)
31
+ const { openDialog } = useDialog()
32
+
33
+ const formData = reactive({
34
+ cuUnitCodeLike: '',
35
+ unitNameLike: '',
36
+ unitDescLike: '',
37
+ unitClassify: '',
38
+ primaryUnitFlag: '',
39
+ systemSourceType: '',
40
+ startDate: '2025-01-01',
41
+ endDate: '2025-01-01',
42
+ })
43
+
44
+ onMounted(() => {
45
+ setTimeout(() => {
46
+ formData.cuUnitCodeLike = '123'
47
+ }, 3000)
48
+ })
49
+
50
+ // const { getCodeSetList } = useCodeSetStore()
51
+
52
+ const formConfig = reactive({
53
+ id: 'inqu_status',
54
+ data: formData,
55
+ items: [
56
+ { field: 'cuUnitCodeLike', title: '计量单位代码计量单位代码计量单位代码计量单位代码计量单位代码', itemRender: { name: 'VxeInput' } },
57
+ { field: 'select1', title: '下拉框1', titlePrefix: { content: '下拉框,值集' }, itemRender: { name: 'formSelect', props: { codeSet: 'brmerp.smss.invoiceType' } } },
58
+ {
59
+ field: 'select2',
60
+ title: '下拉框2',
61
+ titlePrefix: { content: '下拉框,接口' },
62
+ itemRender: {
63
+ name: 'formSelect',
64
+ props: {
65
+ codeSet: 'A1P004.query2',
66
+ promiseFn: (params: any) => getCodeSetByService({
67
+ serviceName: 'A1P004',
68
+ methodName: 'query',
69
+ params,
70
+ value: 'portRegionCode',
71
+ label: 'portRegionName',
72
+ }),
73
+ },
74
+ },
75
+ },
76
+ {
77
+ field: 'select3',
78
+ title: '下拉框3',
79
+ titlePrefix: { content: '下拉框,额外回填,接口' },
80
+ itemRender: {
81
+ name: 'formSelect',
82
+ props: {
83
+ codeSet: 'A1P004.query3',
84
+ fields: 'select3,cuUnitCodeLike',
85
+ selectFields: 'portRegionCode,portRegionName',
86
+ promiseFn: (params: any) => getCodeSetByService({
87
+ serviceName: 'A1P004',
88
+ methodName: 'query',
89
+ params,
90
+ value: 'portRegionCode',
91
+ label: 'portRegionName',
92
+ }),
93
+ },
94
+ },
95
+ },
96
+
97
+ {
98
+ field: 'ccCategoryCodeDa',
99
+ title: '大类',
100
+ itemRender: {
101
+ name: 'formSelect',
102
+ props: {
103
+ codeSet: 'CMCC01.queryCategoryByCategoryCodeDa',
104
+ promiseFn: params => getCodeSetByService({
105
+ serviceName: 'CMCC01',
106
+ methodName: 'queryCategoryByCategoryCodeDa',
107
+ params,
108
+ blockName: 'categoryByCategoryCodeDaBlock',
109
+ value: 'valueField',
110
+ label: 'textField',
111
+ }),
112
+ cascadeFields: 'ccCategoryCodeZhong',
113
+ cascadePromiseFnFields: 'ccCategoryCode',
114
+ cascadePromiseFnItemFields: 'valueField',
115
+ },
116
+ },
117
+ },
118
+ {
119
+ field: 'ccCategoryCodeZhong',
120
+ title: '中类',
121
+ autoLoad: false,
122
+ itemRender: {
123
+ name: 'formSelect',
124
+ props: {
125
+ codeSet: 'CMCC01.queryCategoryByCategoryCode',
126
+ cascadePromiseFn: (params) => {
127
+ params.set('inqu_status-0-level', 2)
128
+ console.log('params: ', params)
129
+ return getCodeSetByService({
130
+ serviceName: 'CMCC01',
131
+ methodName: 'queryCategoryByCategoryCode',
132
+ params,
133
+ blockName: 'categoryByParentIdBlock',
134
+ value: 'valueField',
135
+ label: 'textField',
136
+ })
137
+ },
138
+ cascadeFields: 'ccCategoryCodeXiao',
139
+ cascadePromiseFnFields: 'ccCategoryCode',
140
+ cascadePromiseFnItemFields: 'valueField',
141
+ },
142
+ },
143
+ },
144
+ // {
145
+ // field: 'ccCategoryCodeZhong',
146
+ // title: '中类',
147
+ // autoLoad: false,
148
+ // itemRender: {
149
+ // name: 'formSelect',
150
+ // props: {
151
+ // //codeSet: 'CMCC01.queryCategoryByCategoryCode',
152
+ // cascadePromiseFn: (params) => {
153
+ // const code=params.getBlock('inqu_status').getCell(0,'ccCategoryCode');
154
+ // console.log('code',code)
155
+ // return getCodeSetList('brmerp.pm.contractStatus');
156
+ // // if(code==='F01'){
157
+ // // return getCodeSetList('brmerp.pm.contractStatus');
158
+ // // }else{
159
+ // // return getCodeSetList('brmerp.pm.natureOfTrade');
160
+ // // };
161
+ // },
162
+ // filterFn : (list , data) => {
163
+ // console.log('data',data)
164
+ // if(data.ccCategoryCodeDa==='F01'){
165
+ // return list.slice(0,1);
166
+ // };
167
+ // return list;
168
+ // },
169
+ // cascadeFields: 'ccCategoryCodeXiao',
170
+ // cascadePromiseFnFields: 'ccCategoryCode',
171
+ // cascadePromiseFnItemFields: 'valueField',
172
+ // },
173
+ // },
174
+ // },
175
+ {
176
+ field: 'dialog',
177
+ title: '弹窗',
178
+ titlePrefix: { content: '弹窗' },
179
+ itemRender: {
180
+ name: 'formSelectDialog',
181
+ props: {
182
+ component: vxeTableDialog,
183
+ fields: 'dialog',
184
+ disabled: true,
185
+ dialogFields: 'productName',
186
+ componentParam: {
187
+ pageType: 'goods',
188
+ param: {
189
+ productCategory: 'MO',
190
+ },
191
+ },
192
+ },
193
+ },
194
+ },
195
+ {
196
+ field: 'upload',
197
+ title: '附件上传',
198
+ titlePrefix: { content: '附件上传' },
199
+ itemRender: {
200
+ name: 'fileUpload',
201
+ props: {
202
+ attachmentType: 'A1P001',
203
+ productCategory: 'MO',
204
+ },
205
+ },
206
+ },
207
+ {
208
+ field: 'dateRange',
209
+ title: '日期范围',
210
+ titlePrefix: { content: '日期范围' },
211
+ itemRender: {
212
+ name: 'dateRange',
213
+ props: {
214
+ startDate: 'startDate',
215
+ endDate: 'endDate',
216
+ },
217
+ },
218
+ },
219
+ ],
220
+
221
+ })
222
+
223
+ const serviceConfig = reactive({
224
+ serviceName: 'DMDA01',
225
+ queryMethod: 'query',
226
+ insertMethod: 'addUnit',
227
+ updateMethod: 'save',
228
+ deleteMethod: 'deleteUnit',
229
+ })
230
+
231
+ const columns = useTable().createColumns([
232
+ {
233
+ type: 'seq',
234
+ width: 60,
235
+ fixed: 'left',
236
+ },
237
+ {
238
+ field: 'invoiceType',
239
+ title: '发票类型',
240
+ editRender: {
241
+ name: 'tableSelect',
242
+ props: {
243
+ codeSet: 'brmerp.smss.invoiceType',
244
+ },
245
+ },
246
+ },
247
+
248
+ {
249
+ field: 'rawMaterialType',
250
+ title: '原料类型',
251
+ titlePrefix: { content: '下拉框,不级联,不额外回填,值集调用' },
252
+ editRender: {
253
+ name: 'tableSelect',
254
+ enabled: false,
255
+ props: {
256
+ codeSet: 'brmerp.a1.rawMaterialType',
257
+ },
258
+ },
259
+ },
260
+
261
+ {
262
+ field: 'inputData2',
263
+ title: '卸港区域名称2',
264
+ titlePrefix: { content: '下拉框,不级联,不额外回填,接口调用' },
265
+ editRender: {
266
+ name: 'tableSelect',
267
+ props: {
268
+ codeSet: 'A1P004.query2',
269
+ promiseFn: (params: any) => getCodeSetByService({
270
+ serviceName: 'A1P004',
271
+ methodName: 'query',
272
+ params,
273
+ value: 'portRegionCode',
274
+ label: 'portRegionName',
275
+ }),
276
+ },
277
+ },
278
+ },
279
+ {
280
+ field: 'inputData1',
281
+ title: '卸港区域1',
282
+ },
283
+ {
284
+ field: 'inputData3',
285
+ title: '卸港区域名称3',
286
+ titlePrefix: { content: '下拉框,不级联,额外回填,接口调用' },
287
+ editRender: {
288
+ name: 'tableSelect',
289
+ props: {
290
+ codeSet: 'A1P004.query3',
291
+ fields: 'inputData3,inputData1',
292
+ selectFields: 'portRegionCode,portRegionName',
293
+ promiseFn: (params: any) => getCodeSetByService({
294
+ serviceName: 'A1P004',
295
+ methodName: 'query',
296
+ params,
297
+ value: 'portRegionCode',
298
+ label: 'portRegionName',
299
+ }),
300
+ },
301
+ },
302
+ },
303
+
304
+ {
305
+ field: 'inputData4',
306
+ title: '名称4-级联',
307
+ titlePrefix: { content: '下拉框,级联,不额外回填,接口调用' },
308
+ editRender: {
309
+ name: 'tableSelect',
310
+ props: {
311
+ codeSet: 'A1P004.query4',
312
+ promiseFn: (params: any) => getCodeSetByService({
313
+ serviceName: 'A1P008',
314
+ methodName: 'query',
315
+ params,
316
+ value: 'saleRegionCode',
317
+ label: 'saleRegionName',
318
+ }),
319
+ cascadeFields: 'inputData5',
320
+ cascadePromiseFnFields: 'p0SaleRegionId',
321
+ cascadePromiseFnItemFields: 'p0SaleRegionId',
322
+ },
323
+ },
324
+ },
325
+
326
+ {
327
+ field: 'inputData5',
328
+ title: '名称5',
329
+ titlePrefix: { content: '下拉框,级联,名称4-级联数据' },
330
+ editRender: {
331
+ name: 'tableSelect',
332
+ props: {
333
+ codeSet: 'A1P004.query5',
334
+ promiseFn: (params: any) => getCodeSetByService({
335
+ serviceName: 'A1P004',
336
+ methodName: 'query',
337
+ params,
338
+ value: 'portRegionCode',
339
+ label: 'portRegionName',
340
+ }),
341
+ cascadePromiseFn: (params: any) => getCodeSetByService({
342
+ serviceName: 'A1P003',
343
+ methodName: 'cascadeQuerySaleRegionPortRel',
344
+ params,
345
+ value: 'portCode',
346
+ label: 'portName',
347
+ }),
348
+ },
349
+ },
350
+ },
351
+
352
+ {
353
+ field: 'inputData6',
354
+ title: '弹窗',
355
+ titlePrefix: { content: '弹窗' },
356
+ editRender: {
357
+ name: 'tableSelectDialog',
358
+ props: {
359
+ component: vxeTableDialog,
360
+ fields: 'inputData6',
361
+ dialogFields: 'productName',
362
+ componentParam: {
363
+ pageType: 'goods',
364
+ param: {
365
+ productCategory: 'MO',
366
+ },
367
+ },
368
+ },
369
+ },
370
+ },
371
+
372
+ {
373
+ field: 'areaCode',
374
+ title: '国家/地区代码',
375
+ },
376
+ {
377
+ field: 'areaName',
378
+ title: '国家/地区名称',
379
+
380
+ },
381
+ {
382
+ field: 'remark',
383
+ title: '备注',
384
+ },
385
+
386
+ // {
387
+ // field: 'systemSourceType',
388
+ // title: '来源系统',
389
+ // width: 250,
390
+ // codeSet: 'zvgm.bm.systemType',
391
+ // isFilter: true,
392
+ // filterType: 'select',
393
+ // isEdit: true,
394
+
395
+ // },
396
+
397
+ ])
398
+
399
+ const toolbarButtons = ref<NonNullable<VxeGridProps['toolbarConfig']>['buttons']>([
400
+ { name: '新增', code: 'add', status: 'primary' },
401
+ { name: 'cc', code: 'cc', status: 'danger' },
402
+ { name: '返回DMDA01', code: 'back', status: 'danger' },
403
+ ])
404
+
405
+ const pageRefreshStore = usePageRefreshStore()
406
+ const router = useRouter()
407
+ const gridEvents = {
408
+ toolbarButtonClick: async (obj) => {
409
+ console.log('obj: ', obj)
410
+ const { code, $grid } = obj
411
+ if (code === 'add') {
412
+ const { row: newRow } = await $grid.insertAt({})
413
+ $grid.setEditRow(newRow)
414
+ openDialog(vxeTableDialog, {
415
+ fields: 'dialog,a',
416
+ dialogFields: 'productName,productCode',
417
+ componentParam: {
418
+ pageType: 'goods',
419
+ param: { productCategory: 'MO' },
420
+ },
421
+ }, (obj: any, exposed: any) => {
422
+ console.log('obj: ', obj)
423
+ console.log('exposed: ', exposed)
424
+ exposed.close()
425
+ })
426
+ }
427
+ if (code === 'cc') {
428
+ // xGrid.value.resetForm(true)
429
+ console.log(formData)
430
+
431
+ const ei = new EiInfo()
432
+ ei.addBlock(EiBlock.build('inqu_status', [{
433
+ ccCategoryCode: '123',
434
+ }]))
435
+
436
+ ei.set('inqu_status-0-level', 1)
437
+ console.log(' ei: ', ei)
438
+ }
439
+ if (code === 'back') {
440
+ pageRefreshStore.setRefreshFlag('DMDA01')
441
+
442
+ router.back()
443
+ }
444
+ },
445
+ }
446
+ </script>
447
+
448
+ <style scoped lang="scss"></style>
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env node
2
+ import fs from 'node:fs'
3
+ import path from 'node:path'
4
+
5
+ function parseArgs(argv) {
6
+ const args = {
7
+ repoRoot: process.cwd(),
8
+ targetProject: '',
9
+ format: 'markdown',
10
+ }
11
+
12
+ for (let i = 0; i < argv.length; i += 1) {
13
+ const arg = argv[i]
14
+ if (arg === '--repo-root') {
15
+ args.repoRoot = argv[i + 1] || ''
16
+ i += 1
17
+ }
18
+ else if (arg === '--target-project') {
19
+ args.targetProject = argv[i + 1] || ''
20
+ i += 1
21
+ }
22
+ else if (arg === '--format') {
23
+ args.format = argv[i + 1] || ''
24
+ i += 1
25
+ }
26
+ else if (arg === '--help' || arg === '-h') {
27
+ args.help = true
28
+ }
29
+ else {
30
+ throw new Error(`Unknown argument: ${arg}`)
31
+ }
32
+ }
33
+
34
+ if (!['json', 'markdown', 'both'].includes(args.format))
35
+ throw new Error('--format must be one of: json, markdown, both')
36
+
37
+ return args
38
+ }
39
+
40
+ function existsDir(filePath) {
41
+ return fs.existsSync(filePath) && fs.statSync(filePath).isDirectory()
42
+ }
43
+
44
+ function existsFile(filePath) {
45
+ return fs.existsSync(filePath) && fs.statSync(filePath).isFile()
46
+ }
47
+
48
+ function readJson(filePath) {
49
+ if (!existsFile(filePath))
50
+ return null
51
+ try {
52
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'))
53
+ }
54
+ catch {
55
+ return null
56
+ }
57
+ }
58
+
59
+ function rel(filePath, root) {
60
+ return path.relative(root, filePath).replaceAll(path.sep, '/')
61
+ }
62
+
63
+ function hasAnyDependency(pkg, names) {
64
+ const deps = {
65
+ ...(pkg?.dependencies || {}),
66
+ ...(pkg?.devDependencies || {}),
67
+ }
68
+ return names.some(name => Object.prototype.hasOwnProperty.call(deps, name))
69
+ }
70
+
71
+ function readTextIfSmall(filePath) {
72
+ if (!existsFile(filePath))
73
+ return ''
74
+ const stat = fs.statSync(filePath)
75
+ if (stat.size > 1024 * 1024)
76
+ return ''
77
+ return fs.readFileSync(filePath, 'utf8')
78
+ }
79
+
80
+ function findProjects(repoRoot, targetProject) {
81
+ const projectRoot = path.join(repoRoot, 'project')
82
+ if (!existsDir(projectRoot))
83
+ return []
84
+
85
+ const explicitTarget = Boolean(targetProject)
86
+ const requested = targetProject
87
+ ? [targetProject.replaceAll('\\', '/').replace(/^project\//, '')]
88
+ : fs.readdirSync(projectRoot, { withFileTypes: true }).filter(entry => entry.isDirectory()).map(entry => entry.name)
89
+
90
+ return requested.flatMap((name) => {
91
+ const projectDir = path.join(projectRoot, name)
92
+ const packageJson = path.join(projectDir, 'package.json')
93
+ const pkg = readJson(packageJson)
94
+ const srcDir = path.join(projectDir, 'src')
95
+ const viewsDir = path.join(srcDir, 'views')
96
+ const hooksDir = path.join(srcDir, 'hooks')
97
+ const routeConfig = path.join(srcDir, 'routers', 'config', 'index.ts')
98
+ const localMenu = path.join(srcDir, 'routers', 'localMenuList.json')
99
+ const dynamicRouter = path.join(srcDir, 'routers', 'modules', 'dynamicRouter.ts')
100
+ const viteConfigText = readTextIfSmall(path.join(projectDir, 'vite.config.ts'))
101
+ const usesVxeAlias = viteConfigText.includes('@vxe-plus/components')
102
+
103
+ if (!explicitTarget && !existsDir(viewsDir))
104
+ return []
105
+
106
+ return [{
107
+ id: name,
108
+ exists: existsDir(projectDir),
109
+ packageName: pkg?.name || '',
110
+ projectDir: existsDir(projectDir) ? rel(projectDir, repoRoot) : `project/${name}`,
111
+ srcDir: existsDir(srcDir) ? rel(srcDir, repoRoot) : '',
112
+ viewsDir: existsDir(viewsDir) ? rel(viewsDir, repoRoot) : '',
113
+ hooksDir: existsDir(hooksDir) ? rel(hooksDir, repoRoot) : '',
114
+ hasVueVite: hasAnyDependency(pkg, ['vue', 'vite', '@vitejs/plugin-vue']),
115
+ hasVxePlus: hasAnyDependency(pkg, ['@vxe-plus/components', 'vxe-table', 'vxe-pc-ui']) || usesVxeAlias,
116
+ hasEiInfo: hasAnyDependency(pkg, ['@eplat/ei']),
117
+ hasFileUploadHook: existsFile(path.join(hooksDir, 'useFileUpload.ts')),
118
+ routeStyle: existsFile(routeConfig)
119
+ ? 'config'
120
+ : existsFile(localMenu)
121
+ ? 'local-menu'
122
+ : existsFile(dynamicRouter)
123
+ ? 'dynamic-router'
124
+ : 'unknown',
125
+ routeFile: existsFile(routeConfig)
126
+ ? rel(routeConfig, repoRoot)
127
+ : existsFile(localMenu)
128
+ ? rel(localMenu, repoRoot)
129
+ : existsFile(dynamicRouter)
130
+ ? rel(dynamicRouter, repoRoot)
131
+ : '',
132
+ }]
133
+ })
134
+ }
135
+
136
+ function check(repoRoot, targetProject) {
137
+ const rootPkg = readJson(path.join(repoRoot, 'package.json'))
138
+ const workspaceFile = path.join(repoRoot, 'pnpm-workspace.yaml')
139
+ const componentsPkg = readJson(path.join(repoRoot, 'libs', 'components', 'package.json'))
140
+ const localKnowledgeReadme = path.join(repoRoot, 'doc', 'components', 'vxe-plus-knowledge', 'README.md')
141
+ const vibeCodingReadme = path.join(repoRoot, 'doc', 'vibeCoding', 'README.md')
142
+ const blockers = []
143
+ const warnings = []
144
+ const signals = []
145
+
146
+ if (!rootPkg)
147
+ blockers.push('repo root is missing a readable package.json')
148
+ else
149
+ signals.push(`repo package: ${rootPkg.name || '(unnamed)'}`)
150
+
151
+ if (!existsFile(workspaceFile))
152
+ blockers.push('repo root is missing pnpm-workspace.yaml')
153
+ else
154
+ signals.push('pnpm workspace detected')
155
+
156
+ if (!componentsPkg?.name && !existsDir(path.join(repoRoot, 'libs', 'components', 'src', 'components')))
157
+ blockers.push('libs/components was not detected')
158
+ else
159
+ signals.push(`components package: ${componentsPkg?.name || 'libs/components'}`)
160
+
161
+ if (!hasAnyDependency(rootPkg, ['vxe-table', 'vxe-pc-ui']))
162
+ warnings.push('root package does not clearly declare vxe-table/vxe-pc-ui')
163
+
164
+ signals.push('packaged knowledge base: references/vxe-plus-knowledge/README.md')
165
+ if (existsFile(localKnowledgeReadme))
166
+ signals.push(`project-local knowledge base: ${rel(localKnowledgeReadme, repoRoot)}`)
167
+ else if (existsFile(vibeCodingReadme))
168
+ warnings.push(`project-local doc/components/vxe-plus-knowledge is missing; packaged knowledge base is available, and ${rel(vibeCodingReadme, repoRoot)} can be used as local supplement`)
169
+ else
170
+ warnings.push('no project-local VxePlus docs detected; use packaged knowledge base plus libs/components source and neighboring pages')
171
+
172
+ const hasExplicitTarget = Boolean(targetProject)
173
+ const projects = findProjects(repoRoot, targetProject)
174
+ if (!projects.length)
175
+ blockers.push('no project candidates found under project/*')
176
+ if (!hasExplicitTarget && projects.length > 1)
177
+ blockers.push('multiple project candidates found; ask the user to choose one and rerun with --target-project project/<name>')
178
+ if (!hasAnyDependency(rootPkg, ['@eplat/ei']) && !projects.some(project => project.hasEiInfo))
179
+ blockers.push('neither root package nor target project declares @eplat/ei')
180
+
181
+ for (const project of projects) {
182
+ if (!project.exists) {
183
+ blockers.push(`${project.projectDir} does not exist`)
184
+ continue
185
+ }
186
+ if (!project.srcDir)
187
+ blockers.push(`${project.projectDir} is missing src/`)
188
+ if (!project.viewsDir)
189
+ blockers.push(`${project.projectDir} is missing src/views/`)
190
+ if (!project.hasVueVite)
191
+ blockers.push(`${project.projectDir} does not clearly declare Vue/Vite dependencies`)
192
+ if (!project.hasVxePlus)
193
+ blockers.push(`${project.projectDir} does not clearly declare @vxe-plus/components or Vxe dependencies`)
194
+ if (!project.hasEiInfo)
195
+ warnings.push(`${project.projectDir} does not declare @eplat/ei directly; it may rely on root dependencies`)
196
+ if (!project.hasFileUploadHook)
197
+ warnings.push(`${project.projectDir} has no src/hooks/useFileUpload.ts; verify attachment flow before generating upload/view code`)
198
+ if (project.routeStyle === 'unknown')
199
+ warnings.push(`${project.projectDir} route/menu registration style was not detected`)
200
+ else
201
+ signals.push(`${project.projectDir} route style: ${project.routeStyle} (${project.routeFile})`)
202
+ }
203
+
204
+ return {
205
+ ok: blockers.length === 0,
206
+ repoRoot,
207
+ skill: 'brms-vxe-plus-developer',
208
+ needsTargetProject: !hasExplicitTarget && projects.length > 1,
209
+ blockers,
210
+ warnings,
211
+ signals,
212
+ projects,
213
+ }
214
+ }
215
+
216
+ function toMarkdown(report) {
217
+ const lines = [`# ${report.skill} Project Check`, '', `- Status: ${report.ok ? 'ok' : 'blocked'}`]
218
+ if (report.blockers.length) {
219
+ lines.push('', '## Blockers', ...report.blockers.map(item => `- ${item}`))
220
+ }
221
+ if (report.warnings.length) {
222
+ lines.push('', '## Warnings', ...report.warnings.map(item => `- ${item}`))
223
+ }
224
+ if (report.signals.length) {
225
+ lines.push('', '## Signals', ...report.signals.map(item => `- ${item}`))
226
+ }
227
+ if (report.projects.length) {
228
+ lines.push('', '## Projects')
229
+ for (const project of report.projects) {
230
+ lines.push(`- ${project.projectDir}: ${project.packageName || '(no package name)'}`)
231
+ }
232
+ }
233
+ return lines.join('\n')
234
+ }
235
+
236
+ function main() {
237
+ const args = parseArgs(process.argv.slice(2))
238
+ if (args.help) {
239
+ console.log('Usage: node scripts/check-project.mjs [--repo-root <repo>] [--target-project project/name] [--format json|markdown|both]')
240
+ process.exit(0)
241
+ }
242
+
243
+ const report = check(path.resolve(args.repoRoot), args.targetProject)
244
+ if (args.format === 'json' || args.format === 'both')
245
+ console.log(JSON.stringify(report, null, 2))
246
+ if (args.format === 'both')
247
+ console.log('\n---\n')
248
+ if (args.format === 'markdown' || args.format === 'both')
249
+ console.log(toMarkdown(report))
250
+ process.exit(report.ok ? 0 : 1)
251
+ }
252
+
253
+ try {
254
+ main()
255
+ }
256
+ catch (error) {
257
+ console.error(error instanceof Error ? error.message : String(error))
258
+ process.exit(1)
259
+ }