@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,228 @@
1
+ import { computed, inject, reactive } from 'vue'
2
+ import type { Ref } from 'vue'
3
+ import XEUtils, { merge } from 'xe-utils'
4
+ import { getCodeSetByService } from '@/utils/eiTools'
5
+ import { useForm } from '@/hooks/useForm'
6
+ import { isEmpty } from '@/utils/is'
7
+ import { useValidator } from '@/hooks/useValidator'
8
+ import AMAF0602 from '@/views/AM/AF/AMAF0602.vue'
9
+
10
+ export function createFormConfig({ xForm }) {
11
+ const { commonVxeInput, commonFormSelect, commonSelectDialog, createFormRules, validator, validateField, getFormData, updateInvalidStatus } = useForm()
12
+
13
+ const { validateNumber } = useValidator()
14
+
15
+ const { diffable, detailInfo, diffInfo } = inject('__AMAF0601__info__') as any
16
+
17
+ const { getId } = inject('__AMAF0601__method__') as any
18
+
19
+ const { record: recordModule } = inject('__AMAF0601__module__') as { record: Ref }
20
+
21
+ const formData = reactive(merge({
22
+ [getId('afContractRecordDebarmainId')]: '',
23
+ ifBidding: '',
24
+ hasBidding: '',
25
+ biddingProjectTypeId: '',
26
+ biddingProjectTypeDId: '',
27
+ biddingContractAmt: '',
28
+ noBiddingRecord: '',
29
+ noBiddingReasonname: '',
30
+ noBiddingReason: '',
31
+ biddingMode: '',
32
+ inviteBiddingReason: '',
33
+ inviteBiddingReasonname: '',
34
+ biddingOrg: '',
35
+ biddingOrgOther: '',
36
+ noBhReason: '',
37
+ }, detailInfo.value, {
38
+ biddingContractAmt: !isEmpty(detailInfo.value.biddingContractAmt) ? XEUtils.toFixed(Number.parseFloat(detailInfo.value.biddingContractAmt), 2) : '',
39
+ }))
40
+
41
+ const baseFields = computed(() => {
42
+ return [
43
+ {
44
+ field: 'ifBidding',
45
+ title: '是否应招',
46
+ itemRender: commonFormSelect('brmerp.amaf.ifBidding'),
47
+ required: true,
48
+ },
49
+ {
50
+ field: 'hasBidding',
51
+ title: '是否已招',
52
+ itemRender: commonFormSelect('brmerp.bm.yesOrNo'),
53
+ },
54
+ {
55
+ field: 'biddingProjectTypeId',
56
+ title: '项目类型大类',
57
+ itemRender: commonFormSelect('brmerp.amaf.biddingProjectType', {
58
+ cascadeFields: 'biddingProjectTypeDId',
59
+ cascadePromiseFnFields: 'biddingProjectTypeDId',
60
+ cascadePromiseFnItemFields: 'value',
61
+ }),
62
+ },
63
+ {
64
+ field: 'biddingProjectTypeDId',
65
+ title: '项目类型细类',
66
+ itemRender: commonFormSelect(null, {
67
+ cascadePromiseFn: (params) => {
68
+ const biddingProjectTypeDId = params.getBlock('inqu_status').getCell(0, 'biddingProjectTypeDId')
69
+ params.set('codeset', 'brmerp.amaf.biddingProjectTypeD')
70
+ params.set('itemEname', biddingProjectTypeDId)
71
+ return getCodeSetByService({
72
+ serviceName: 'AMAF0601',
73
+ methodName: 'queryCodeSetItemSobInfo',
74
+ params,
75
+ blockName: 'list',
76
+ value: 'value',
77
+ label: 'label',
78
+ })
79
+ },
80
+ }),
81
+ },
82
+ {
83
+ field: 'biddingContractAmt',
84
+ title: '合同估算价(含税)',
85
+ formatter: ({ itemValue }) => !isEmpty(itemValue) ? XEUtils.toFixed(Number.parseFloat(itemValue), 2) : '',
86
+ itemRender: commonVxeInput(),
87
+ validator: ({ itemValue }) => {
88
+ const result = validateNumber(itemValue, 2)
89
+ if (!result.status) {
90
+ return Promise.reject(result.msg)
91
+ }
92
+ const biddingContractAmt = Number.parseFloat(itemValue)
93
+ if (biddingContractAmt <= 0) {
94
+ return Promise.reject('必须大于0')
95
+ }
96
+ return Promise.resolve(true)
97
+ },
98
+ },
99
+ {
100
+ field: 'noBiddingRecord',
101
+ title: '不招标备案情况',
102
+ itemRender: commonFormSelect('brmerp.amaf.noBiddingRecord', null, {
103
+ events: {
104
+ change({ currData, isInit }) {
105
+ if (isInit) {
106
+ return
107
+ }
108
+ // console.log('currData.noBiddingRecord',currData)
109
+ if (detailInfo.value[getId('afContractRecordDebarmainId')]) {
110
+ const tableData = recordModule.value.getTableData()
111
+ const noBiddingRecord = currData?.value
112
+ if (tableData.length && noBiddingRecord !== detailInfo.value.noBiddingRecord) {
113
+ setTimeout(() => {
114
+ updateInvalidStatus(xForm, 'noBiddingRecord', '招标备案号信息明细和所选不招标备案情况不匹配,请删除不匹配的招标备案号信息明细后再切换不招标备案情况', false)
115
+ formData.noBiddingRecord = detailInfo.value.noBiddingRecord
116
+ }, 500)
117
+ }
118
+ }
119
+ },
120
+ },
121
+ }),
122
+ },
123
+ {
124
+ field: 'noBiddingReasonname',
125
+ title: '不招标理由',
126
+ visibleMethod: ({ data }) => ['A', 'C'].includes(data.noBiddingRecord),
127
+ itemRender: commonSelectDialog({
128
+ title: '不招标理由',
129
+ width: 800,
130
+ component: AMAF0602,
131
+ componentParam: {
132
+ disableIds: ['recordCode'],
133
+ param: computed(() => {
134
+ return {
135
+ recordCode: formData.noBiddingRecord === 'A' ? '1005' : '1006',
136
+ }
137
+ }),
138
+ },
139
+ }, {
140
+ events: {
141
+ change({ currData }) {
142
+ formData.noBiddingReason = currData?.value_code || ''
143
+ formData.noBiddingReasonname = currData?.value || ''
144
+ },
145
+ },
146
+ }),
147
+ },
148
+ {
149
+ field: 'biddingMode',
150
+ title: '招标方式',
151
+ itemRender: commonFormSelect('brmerp.amaf.biddingMode'),
152
+ },
153
+ {
154
+ field: 'inviteBiddingReasonname',
155
+ title: '邀请招标原因',
156
+ itemRender: commonSelectDialog({
157
+ title: '邀请招标原因',
158
+ width: 800,
159
+ component: AMAF0602,
160
+ componentParam: {
161
+ disableIds: ['recordCode'],
162
+ param: {
163
+ recordCode: '1007',
164
+ },
165
+ },
166
+ }, {
167
+ events: {
168
+ change({ currData }) {
169
+ formData.inviteBiddingReason = currData?.value_code || ''
170
+ formData.inviteBiddingReasonname = currData?.value || ''
171
+ },
172
+ },
173
+ }),
174
+ },
175
+ {
176
+ field: 'biddingOrg',
177
+ title: '招标实施机构',
178
+ itemRender: commonFormSelect('brmerp.amaf.biddingOrg'),
179
+ },
180
+ {
181
+ field: 'biddingOrgOther',
182
+ title: '招标实施机构(其他)',
183
+ visibleMethod: ({ data }) => data.biddingOrg === 'B',
184
+ itemRender: commonVxeInput(),
185
+ },
186
+ {
187
+ field: 'noBhReason',
188
+ title: '非宝华实施原因',
189
+ itemRender: commonVxeInput(),
190
+ },
191
+ ]
192
+ })
193
+
194
+ const getData = () => {
195
+ const data = getFormData(baseFields.value, formData)
196
+ data[getId('afContractRecordDebarmainId')] = formData[getId('afContractRecordDebarmainId')]
197
+ data.noBiddingReason = formData.noBiddingReason
198
+ data.inviteBiddingReason = formData.inviteBiddingReason
199
+ return data
200
+ }
201
+
202
+ const formRules = computed(() => createFormRules(baseFields.value))
203
+
204
+ const diffConfig = computed(() => {
205
+ const fields = baseFields.value.filter(item => ((item as any).visible ?? true) && !isEmpty(item.field)).map(item => item.field)
206
+ const enabled = diffable.value && Object.keys(diffInfo.value).some(field => fields.includes(field))
207
+ return {
208
+ enabled,
209
+ data: diffInfo.value,
210
+ }
211
+ })
212
+
213
+ const formConfig = reactive({
214
+ data: formData,
215
+ items: baseFields,
216
+ titleWidth: 140,
217
+ rules: formRules,
218
+ diffConfig,
219
+ })
220
+
221
+ return {
222
+ formData,
223
+ getData,
224
+ formConfig,
225
+ validator,
226
+ validateField,
227
+ }
228
+ }
@@ -0,0 +1,110 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-08-27 19:23:12
6
+ */
7
+ import { computed, inject } from 'vue'
8
+ import { useTable } from '@/hooks/useTable'
9
+ import { useCodeSetStore } from '@/stores/modules/codeSet'
10
+ import AMAF0602 from '@/views/AM/AF/AMAF0602.vue'
11
+
12
+ export function createTableColumns() {
13
+ const { createColumns, commonVxeInput, commonTableSelect, commonSelectDialog, createEditRules, validator } = useTable()
14
+
15
+ const { detailInfo, diffable } = inject('__AMAF0601__info__') as any
16
+
17
+ const { getCodeSetTextByCode } = useCodeSetStore()
18
+
19
+ const columns = computed(() => {
20
+ return createColumns([
21
+ // {
22
+ // type: 'seq',
23
+ // width: 60,
24
+ // },
25
+ {
26
+ field: 'operationType',
27
+ title: '变更状态',
28
+ editRender: commonTableSelect('BRMERP.ac.contractChangeStatus'),
29
+ visible: false,
30
+ },
31
+ {
32
+ field: 'afContractRecordNotdebarId',
33
+ title: '变更状态',
34
+ width: 100,
35
+ fixed: 'left',
36
+ formatter: ({ row }) => getCodeSetTextByCode('BRMERP.ac.contractChangeStatus', row.operationType),
37
+ visible: diffable.value,
38
+ },
39
+ {
40
+ field: 'operateType',
41
+ title: '操作类型',
42
+ width: 100,
43
+ fixed: 'left',
44
+ visible: diffable.value,
45
+ formatter: ({ row, cellValue }) => {
46
+ if (['U'].includes(row.operationType)) {
47
+ return cellValue
48
+ }
49
+ },
50
+ },
51
+ {
52
+ field: 'notBiddingRecordNo',
53
+ title: '备案号',
54
+ editRender: commonVxeInput(),
55
+ required: true,
56
+ },
57
+ {
58
+ field: 'notBiddingRecordExplain',
59
+ title: '不招标理由',
60
+ visible: ['A', 'C'].includes(detailInfo.value.noBiddingRecord),
61
+ editRender: commonSelectDialog({
62
+ title: '不招标理由',
63
+ width: 800,
64
+ component: AMAF0602,
65
+ fields: 'notBiddingRecordExplain',
66
+ dialogFields: 'value',
67
+ componentParam: {
68
+ disableIds: ['recordCode'],
69
+ param: {
70
+ recordCode: detailInfo.value.noBiddingRecord === 'A' ? '1005' : '1006',
71
+ },
72
+ },
73
+ }),
74
+ required: true,
75
+ },
76
+ {
77
+ field: 'buyerName',
78
+ title: '采购人单位名称',
79
+ editRender: commonVxeInput(),
80
+ },
81
+ {
82
+ field: 'notBiddingRemark',
83
+ title: '品类/项目描述',
84
+ editRender: commonVxeInput(),
85
+ required: true,
86
+ },
87
+ ].map((col) => {
88
+ if (col.field !== 'seq') {
89
+ (col as any).slots = {
90
+ ...(col as any).slots,
91
+ default: `${col.field}_default`,
92
+ }
93
+ }
94
+ return {
95
+ ...col,
96
+ width: (col as any).width ?? '',
97
+ } as any
98
+ })).value
99
+ })
100
+
101
+ const tableValidator = (...args: any[]) => {
102
+ return (validator as any)(...args)
103
+ }
104
+
105
+ return {
106
+ columns,
107
+ editRules: computed(() => createEditRules(columns.value)),
108
+ tableValidator,
109
+ }
110
+ }
@@ -0,0 +1,130 @@
1
+ <!--
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-09-05 16:05:57
6
+ -->
7
+ <template>
8
+ <div class="flex-col dialog-c-h">
9
+ <div>
10
+ <BxContainer id="INQU" class="pt0" title="查询条件" :form-ref="xForm" @btn-click="btnClick">
11
+ <VxePlusForm id="BMBR01_result" ref="xForm" folding :form-options="formConfig" />
12
+ </BxContainer>
13
+ </div>
14
+ <BxContainer class="pt0 flex-1" title="查询结果">
15
+ <VxePlusTable
16
+ id="BMBR01_result"
17
+ ref="xGrid"
18
+ :columns="columns"
19
+ :form-config="tableFormConfig"
20
+ :service-config="serviceConfig"
21
+ :show-checkbox="true"
22
+ min-height=""
23
+ height="auto"
24
+ max-height=""
25
+ v-on="gridEvents"
26
+ />
27
+ </BxContainer>
28
+ </div>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { computed, nextTick, onMounted, reactive, ref } from 'vue'
33
+ import type { PropType } from 'vue'
34
+ import { createTableColumns } from './component/BMBR01/columns'
35
+ import { createFormConfig } from './component/BMBR01/formConfig'
36
+ import { dialogProps, useDialog } from '@/hooks/useDialog'
37
+
38
+ const props = defineProps({
39
+ param: {
40
+ type: Object,
41
+ default: () => ({}),
42
+ },
43
+ selectMode: {
44
+ type: String as PropType<'single' | 'multi'>,
45
+ default: 'single',
46
+ },
47
+ disableIds: {
48
+ type: Array,
49
+ default: () => ([]),
50
+ },
51
+ toolbarHidden: {
52
+ type: Boolean,
53
+ default: false,
54
+ },
55
+ toolbarButtonHiddenIds: {
56
+ type: Array,
57
+ default: () => ([]),
58
+ },
59
+ ...dialogProps,
60
+ })
61
+
62
+ const emit = defineEmits(['dialogDbclick'])
63
+
64
+ const xForm = ref<any>(null)
65
+ const xGrid = ref<any>(null)
66
+
67
+ const { formConfig, tableFormConfig } = createFormConfig(props.param, props.disableIds)
68
+
69
+ /**
70
+ * 列表字段渲染
71
+ */
72
+ const { columns } = createTableColumns() as any
73
+
74
+ const { backfillFn } = useDialog(props, emit)
75
+
76
+ /**
77
+ * 不同按钮映射不同方法
78
+ */
79
+ const gridEvents = reactive({
80
+ toolbarButtonClick: ({ code, $grid }) => {
81
+ switch (code) {
82
+ case 'CONFIRM':
83
+ backfillFn($grid, {}, props.selectMode)
84
+ break
85
+ }
86
+ },
87
+ })
88
+
89
+ /**
90
+ * 列表使用查询方法
91
+ */
92
+ const serviceConfig = reactive({
93
+ serviceName: 'BMBR01',
94
+ queryMethod: 'pageQueryLike',
95
+ })
96
+
97
+ /**
98
+ * 表单查询按钮
99
+ * @param btn
100
+ */
101
+ function btnClick(btn: any) {
102
+ if (btn.code === 'QUERY') {
103
+ xGrid.value.reload()
104
+ }
105
+ if (btn.code === 'RESET') {
106
+ const $form = xForm.value.getFormInstance()
107
+ $form.reset()
108
+ nextTick(() => {
109
+ xGrid.value.reload()
110
+ })
111
+ }
112
+ }
113
+
114
+ const toolbarHiddenIds = computed(() => {
115
+ if (props.toolbarHidden) {
116
+ return ['BTN_ADD', 'BTN_COPY', 'BTN_VALID', 'BTN_DELETE', 'BTN_CANCEL']
117
+ }
118
+ return props.toolbarButtonHiddenIds
119
+ })
120
+
121
+ onMounted(() => {
122
+ nextTick(() => {
123
+ if (toolbarHiddenIds.value.length) {
124
+ xGrid.value.btnSetVisible(toolbarHiddenIds.value, false)
125
+ }
126
+ })
127
+ })
128
+ </script>
129
+
130
+ <style scoped></style>
@@ -0,0 +1,94 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-08-07 10:25:26
6
+ */
7
+ import { computed } from 'vue'
8
+ import { useTable } from '@/hooks/useTable'
9
+ import { queryBookInfo } from '@/api/modules/auth'
10
+
11
+ export function createTableColumns() {
12
+ const { createColumns, commonTableSelect, createEditRules, validator } = useTable()
13
+
14
+ const columns = computed(() => {
15
+ return createColumns([
16
+ {
17
+ field: 'belongBookId',
18
+ title: '所属账套',
19
+ width: 160,
20
+ editRender: commonTableSelect('BMBF11.queryBookInfo', {
21
+ promiseFn: async () => {
22
+ try {
23
+ const list = await queryBookInfo() as any
24
+ return Promise.resolve((list || []).map((item) => {
25
+ return {
26
+ value: item.beBookId,
27
+ label: item.bookName,
28
+ }
29
+ }))
30
+ }
31
+ catch {
32
+ return Promise.resolve([])
33
+ }
34
+ },
35
+ }, {
36
+ enabled: false,
37
+ }),
38
+ },
39
+ {
40
+ field: 'formulaCode',
41
+ title: '价格公式编号',
42
+ },
43
+ {
44
+ field: 'formulaCustomCode',
45
+ title: '价格公式号',
46
+ },
47
+ {
48
+ field: 'matterCode',
49
+ title: '物料代码',
50
+ },
51
+ {
52
+ field: 'matterName',
53
+ title: '物料名称',
54
+ },
55
+ {
56
+ field: 'formulaStatus',
57
+ title: '价格公式状态',
58
+ editRender: commonTableSelect('BRMERP.bm.formulaStatus', null, {
59
+ enabled: false,
60
+ }),
61
+ },
62
+ {
63
+ field: 'applySupplierName',
64
+ title: '适应供应商',
65
+ },
66
+ {
67
+ field: 'formulaSubType',
68
+ title: '价格公式子类型',
69
+ editRender: commonTableSelect('BRMERP.bm.formulaSubType10', null, {
70
+ enabled: false,
71
+ }),
72
+ },
73
+ {
74
+ field: 'remark',
75
+ title: '备注',
76
+ },
77
+ ].map((col) => {
78
+ return {
79
+ ...col,
80
+ width: (col as any).width ?? '',
81
+ } as any
82
+ })).value
83
+ })
84
+
85
+ const tableValidator = (...args: any[]) => {
86
+ return (validator as any)(...args)
87
+ }
88
+
89
+ return {
90
+ columns,
91
+ editRules: computed(() => createEditRules(columns.value)),
92
+ tableValidator,
93
+ }
94
+ }
@@ -0,0 +1,108 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-08-07 10:24:09
6
+ */
7
+ import { computed, reactive } from 'vue'
8
+ import { merge } from 'xe-utils'
9
+ import { useForm } from '@/hooks/useForm'
10
+ import { queryBookInfo } from '@/api/modules/auth'
11
+
12
+ export function createFormConfig(formParams, disableIds) {
13
+ const { commonVxeInput, commonFormSelect, getFormData } = useForm()
14
+
15
+ const formData = reactive(merge({
16
+ formulaType: '10',
17
+ belongBookId: '',
18
+ formulaCode: '',
19
+ matterName: '',
20
+ formulaStatus: '',
21
+ matterCode: '',
22
+ formulaCustomCode: '',
23
+ }, formParams))
24
+
25
+ const baseFields = computed(() => {
26
+ return [
27
+ {
28
+ field: 'belongBookId',
29
+ title: '所属账套',
30
+ itemRender: commonFormSelect('BMBF11.queryBookInfo', {
31
+ promiseFn: async () => {
32
+ try {
33
+ const list = await queryBookInfo() as any
34
+ return Promise.resolve((list || []).map((item) => {
35
+ return {
36
+ value: item.beBookId,
37
+ label: item.bookName,
38
+ }
39
+ }))
40
+ }
41
+ catch {
42
+ return Promise.resolve([])
43
+ }
44
+ },
45
+ }),
46
+ },
47
+ {
48
+ field: 'formulaCode',
49
+ title: '价格公式编号',
50
+ itemRender: commonVxeInput(),
51
+ },
52
+ {
53
+ field: 'matterName',
54
+ title: '物料名称',
55
+ itemRender: commonVxeInput(),
56
+ },
57
+ {
58
+ field: 'formulaStatus',
59
+ title: '价格公式状态',
60
+ itemRender: commonFormSelect('BRMERP.bm.formulaStatus'),
61
+ },
62
+ {
63
+ field: 'matterCode',
64
+ title: '物料代码',
65
+ itemRender: commonVxeInput(),
66
+ },
67
+ {
68
+ field: 'formulaCustomCode',
69
+ title: '价格公式号',
70
+ itemRender: commonVxeInput(),
71
+ },
72
+ ].map((item) => {
73
+ if (item.field && item.itemRender.props) {
74
+ item.itemRender.props = {
75
+ ...item.itemRender.props,
76
+ disabled: item.itemRender.props.disabled ?? disableIds.includes(item.field),
77
+ }
78
+ if (disableIds.includes(item.field)) {
79
+ (item as any).resetValue = formParams[item.field]
80
+ }
81
+ }
82
+ return item
83
+ })
84
+ })
85
+
86
+ const formConfig = reactive({
87
+ data: formData,
88
+ items: baseFields,
89
+ titleWidth: 120,
90
+ })
91
+
92
+ const tableFormConfig = reactive({
93
+ data: formData,
94
+ })
95
+
96
+ const getData = () => {
97
+ const data = getFormData(baseFields.value, formData)
98
+ data.formulaType = formData.formulaType
99
+ return data
100
+ }
101
+
102
+ return {
103
+ formData,
104
+ formConfig,
105
+ tableFormConfig,
106
+ getData,
107
+ }
108
+ }