@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,90 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2026-03-25 08:56:07
6
+ */
7
+ import { computed, inject, reactive, watch } from 'vue'
8
+ import type { Ref } from 'vue'
9
+ import { merge } from 'xe-utils'
10
+ import { useForm } from '@/hooks/useForm'
11
+ import { isEmpty } from '@/utils/is'
12
+
13
+ export function createFormConfig() {
14
+ const { commonFormRadio, createFormRules, validator, validateField, getFormData } = useForm()
15
+
16
+ const { editable, diffable, detailInfo, diffInfo, foreignExFlag } = inject('__PMPC0101__info__') as any
17
+
18
+ const { main: mainModule } = inject('__PMPC0101__module__') as { main: Ref }
19
+
20
+ const baseModule = computed(() => mainModule?.value?.base)
21
+
22
+ const baseModuleFormData = computed(() => baseModule?.value?.formData)
23
+
24
+ const formData = reactive(merge({
25
+ paymentTerms: '',
26
+ paymentCycle: '',
27
+ }, detailInfo.value, {
28
+ paymentTerms: detailInfo.value?.supplierCreditFlag === 'N' ? 'N' : (detailInfo.value?.paymentTerms ?? ''),
29
+ }))
30
+
31
+ watch(() => baseModuleFormData.value?.supplierCreditFlag, () => {
32
+ if (baseModuleFormData.value?.supplierCreditFlag === 'N') {
33
+ formData.paymentTerms = 'N'
34
+ };
35
+ }, {
36
+ immediate: true,
37
+ })
38
+
39
+ const baseFields = computed(() => {
40
+ return [
41
+ {
42
+ field: 'paymentTerms',
43
+ title: '是否预付',
44
+ itemRender: commonFormRadio('brmerp.pm.payClause', {
45
+ disabled: editable.value ? baseModuleFormData.value?.supplierCreditFlag === 'N' : true,
46
+ }),
47
+ required: true,
48
+ },
49
+ {
50
+ field: 'paymentCycle',
51
+ title: '付款周期',
52
+ visibleMethod: () => !foreignExFlag.value,
53
+ itemRender: commonFormRadio('brmerp.pm.paymentCycle'),
54
+ span: 16,
55
+ required: true,
56
+ },
57
+ ]
58
+ })
59
+
60
+ const formRules = computed(() => createFormRules(baseFields.value))
61
+
62
+ const diffConfig = computed(() => {
63
+ const fields = baseFields.value.filter(item => ((item as any).visible ?? true) && !isEmpty(item.field)).map(item => item.field)
64
+ const enabled = diffable.value && Object.keys(diffInfo.value).some(field => fields.includes(field))
65
+ return {
66
+ enabled,
67
+ data: diffInfo.value,
68
+ }
69
+ })
70
+
71
+ const formConfig = reactive({
72
+ data: formData,
73
+ items: baseFields,
74
+ titleWidth: 170,
75
+ rules: formRules,
76
+ diffConfig,
77
+ })
78
+
79
+ const getData = () => {
80
+ return getFormData(baseFields.value, formData)
81
+ }
82
+
83
+ return {
84
+ formData,
85
+ formConfig,
86
+ validator,
87
+ validateField,
88
+ getData,
89
+ }
90
+ }
@@ -0,0 +1,42 @@
1
+ <!--
2
+ * @Author: 谢力
3
+ * @Date: 2025-07-26 09:48:34
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-08-20 15:50:35
6
+ -->
7
+ <template>
8
+ <VxePlusForm
9
+ ref="xForm"
10
+ :disabled="!editable"
11
+ :title-asterisk="editable"
12
+ :form-options="formConfig"
13
+ />
14
+ </template>
15
+
16
+ <script setup lang="ts">
17
+ import { inject, ref } from 'vue'
18
+ import { createFormConfig } from './formConfig'
19
+
20
+ const xForm = ref<any>(null)
21
+
22
+ const { editable } = inject('__PMPC0101__info__') as any
23
+
24
+ const { formData, formConfig, validator, getData } = createFormConfig()
25
+
26
+ function handleValidator(flag: boolean = true) {
27
+ return validator(xForm, flag)
28
+ }
29
+
30
+ function updateFormData(data) {
31
+ Object.assign(formData, data)
32
+ }
33
+
34
+ defineExpose({
35
+ formData,
36
+ getData,
37
+ validator: handleValidator,
38
+ updateFormData,
39
+ })
40
+ </script>
41
+
42
+ <style scoped></style>
@@ -0,0 +1,376 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2026-03-25 08:56:18
6
+ */
7
+ import { computed, inject } from 'vue'
8
+ import dayjs from 'dayjs'
9
+ import { commafy, debounce } from 'xe-utils'
10
+ import { useTable } from '@/hooks/useTable'
11
+ import { useValidator } from '@/hooks/useValidator'
12
+ import { isEmpty } from '@/utils/is'
13
+ import { useCodeSetStore } from '@/stores/modules/codeSet'
14
+
15
+ export function createTableColumns() {
16
+ const { createColumns, commonVxeInput, commonTableSelect, commonVxeDatePicker, commonAutocomplete, createEditRules, validator } = useTable()
17
+
18
+ const { validateNumber } = useValidator()
19
+
20
+ const { getCodeSetTextByCode } = useCodeSetStore()
21
+
22
+ const { diffable, foreignExFlag } = inject('__PMPC0101__info__') as any
23
+
24
+ const updateRowData = debounce((row) => {
25
+ const paymentTerms = [] as any
26
+ if (!isEmpty(row.paymentCondition) && !isEmpty(row.payMethod) && !isEmpty(row.payContentCode)) {
27
+ paymentTerms.push(row.paymentCondition)
28
+ const payDateDescFlag = validateNumber(row.payDateDesc).status
29
+ if (payDateDescFlag && Number.parseFloat(row.payDateDesc) > 0) {
30
+ paymentTerms.push(`${row.payDateDesc}个工作日内`)
31
+ }
32
+ if (!isEmpty(row.payDateEstimate)) {
33
+ paymentTerms.push(`并于${dayjs(row.payDateEstimate).format('YYYY-MM-DD')}前`)
34
+ }
35
+ let payMethod = `${row.payMethod.split(',').filter(k => !isEmpty(k)).map(code => getCodeSetTextByCode('brmerp.bm.payMethod', code)).join('或')}`
36
+ const draftDateFlag = validateNumber(row.draftDate).status
37
+ if (draftDateFlag && Number.parseFloat(row.draftDate) > 0) {
38
+ payMethod += `${row.draftDate}天`
39
+ }
40
+ paymentTerms.push(`,买方以${payMethod}方式,依据`)
41
+ if (!isEmpty(row.payCondition)) {
42
+ paymentTerms.push(row.payCondition.split(',').filter(k => !isEmpty(k)).map(code => getCodeSetTextByCode('brmerp.pm.payCondition', code)).join('或'))
43
+ }
44
+ paymentTerms.push('金额支付')
45
+ const payValueFlag = validateNumber(row.payValue, 2).status
46
+ if (payValueFlag) {
47
+ const payValue = Number.parseFloat(row.payValue)
48
+ if (payValue > 0 && !isEmpty(row.payValueType)) {
49
+ const payValueType = {
50
+ AMOUNT: '元',
51
+ PERCENT: '%',
52
+ }[row.payValueType]
53
+ paymentTerms.push(`${row.payValue}${payValueType}的`)
54
+ }
55
+ }
56
+ paymentTerms.push(getCodeSetTextByCode('brmerp.pm.payContentCode', row.payContentCode))
57
+ }
58
+ if (!isEmpty(row.remark)) {
59
+ if (paymentTerms.length) {
60
+ paymentTerms.push(',')
61
+ }
62
+ paymentTerms.push(row.remark)
63
+ }
64
+ if (paymentTerms.length) {
65
+ paymentTerms.push('。')
66
+ }
67
+ if (paymentTerms.length) {
68
+ row.paymentTerms = paymentTerms.join('')
69
+ }
70
+ else {
71
+ row.paymentTerms = ''
72
+ }
73
+ }, 100)
74
+
75
+ const columns = computed(() => {
76
+ return createColumns([
77
+ // {
78
+ // type: 'seq',
79
+ // width: 60,
80
+ // },
81
+ {
82
+ field: 'operationType',
83
+ title: '变更状态',
84
+ editRender: commonTableSelect('BRMERP.ac.contractChangeStatus'),
85
+ visible: false,
86
+ },
87
+ {
88
+ field: 'pcContractPaymentId',
89
+ title: '变更状态',
90
+ width: 100,
91
+ fixed: 'left',
92
+ formatter: ({ row }) => getCodeSetTextByCode('BRMERP.ac.contractChangeStatus', row.operationType),
93
+ visible: diffable.value,
94
+ },
95
+ {
96
+ field: 'operateType',
97
+ title: '操作类型',
98
+ width: 100,
99
+ fixed: 'left',
100
+ visible: diffable.value,
101
+ formatter: ({ row, cellValue }) => {
102
+ if (['U'].includes(row.operationType)) {
103
+ return cellValue
104
+ }
105
+ },
106
+ },
107
+ {
108
+ field: 'sortNum',
109
+ title: '序号',
110
+ width: 80,
111
+ editRender: commonVxeInput(),
112
+ validator: ({ itemValue }) => {
113
+ const result = validateNumber(itemValue)
114
+ if (!result.status) {
115
+ return Promise.reject(result.msg)
116
+ }
117
+ const sortNum = Number.parseFloat(itemValue)
118
+ if (sortNum <= 0) {
119
+ return Promise.reject('必须大于0')
120
+ }
121
+ return Promise.resolve(true)
122
+ },
123
+ },
124
+ {
125
+ field: 'payContentCode',
126
+ title: '付款款项',
127
+ width: 200,
128
+ required: true,
129
+ editRender: commonTableSelect('brmerp.pm.payContentCode', null, {
130
+ enabled: foreignExFlag.value,
131
+ immediate: foreignExFlag.value,
132
+ events: {
133
+ change({ row }) {
134
+ updateRowData(row)
135
+ },
136
+ },
137
+ }),
138
+ },
139
+ {
140
+ field: 'paymentCondition',
141
+ title: '付款条件',
142
+ required: true,
143
+ width: 200,
144
+ visible: foreignExFlag.value,
145
+ editRender: commonAutocomplete('brmerp.pm.paymentCondition', null, {
146
+ immediate: true,
147
+ events: {
148
+ change({ row }) {
149
+ updateRowData(row)
150
+ },
151
+ select({ row }) {
152
+ updateRowData(row)
153
+ },
154
+ },
155
+ }),
156
+ },
157
+ {
158
+ field: 'payCondition',
159
+ title: '付款依据',
160
+ width: 200,
161
+ visible: foreignExFlag.value,
162
+ editRender: commonTableSelect('brmerp.pm.payCondition', {
163
+ multiple: true,
164
+ }, {
165
+ immediate: true,
166
+ events: {
167
+ change({ row }) {
168
+ updateRowData(row)
169
+ },
170
+ },
171
+ }),
172
+ },
173
+ {
174
+ field: 'payMethod',
175
+ title: '付款方式',
176
+ required: true,
177
+ width: 200,
178
+ visible: foreignExFlag.value,
179
+ editRender: commonTableSelect('brmerp.bm.payMethod', {
180
+ textTemplate: `{{value}}-{{label}}`,
181
+ multiple: true,
182
+ }, {
183
+ immediate: true,
184
+ events: {
185
+ change({ row }) {
186
+ updateRowData(row)
187
+ },
188
+ },
189
+ }),
190
+ },
191
+ {
192
+ field: 'payValueType',
193
+ title: '付款形式',
194
+ needable: true,
195
+ visible: foreignExFlag.value,
196
+ editRender: commonTableSelect('brmerp.pm.settlementForm', null, {
197
+ immediate: true,
198
+ events: {
199
+ change({ row, isInit }) {
200
+ if (!isInit && !isEmpty(row.payValueType)) {
201
+ row.payValue = ''
202
+ }
203
+ updateRowData(row)
204
+ },
205
+ },
206
+ }),
207
+ validator: async ({ data, itemValue }) => {
208
+ if (['10'].includes(data.payContentCode) && isEmpty(itemValue)) {
209
+ return Promise.reject('付款形式不能为空')
210
+ }
211
+ const payValue = columns.value?.find(item => item.field === 'payValue')
212
+ if (payValue && (payValue as any).validator) {
213
+ try {
214
+ await (payValue as any).validator({ itemValue: data.payValue, data })
215
+ if (!isEmpty(data.payValue) && isEmpty(itemValue)) {
216
+ return Promise.reject('付款形式不能为空')
217
+ }
218
+ }
219
+ catch {
220
+
221
+ }
222
+ }
223
+ return Promise.resolve(true)
224
+ },
225
+ },
226
+ {
227
+ field: 'payValue',
228
+ title: '金额/比例(%)',
229
+ width: 150,
230
+ needable: true,
231
+ visible: foreignExFlag.value,
232
+ formatter: ({ cellValue }) => !isEmpty(cellValue) ? commafy(Number.parseFloat(cellValue), { digits: 2 }) : '',
233
+ editRender: commonVxeInput(null, {
234
+ immediate: true,
235
+ events: {
236
+ blur({ row }) {
237
+ updateRowData(row)
238
+ },
239
+ },
240
+ }),
241
+ validator: ({ data, itemValue }) => {
242
+ if (['10'].includes(data.payContentCode) && isEmpty(itemValue)) {
243
+ return Promise.reject('金额/比例(%)不能为空')
244
+ }
245
+ if (!isEmpty(itemValue)) {
246
+ const result = validateNumber(itemValue, 2)
247
+ if (!result.status) {
248
+ return Promise.reject(result.msg)
249
+ }
250
+ const payValue = Number.parseFloat(itemValue)
251
+ if (payValue <= 0) {
252
+ return Promise.reject('必须大于0')
253
+ }
254
+ }
255
+ return Promise.resolve(true)
256
+ },
257
+ },
258
+ {
259
+ field: 'payDateDesc',
260
+ title: '付款天数',
261
+ visible: foreignExFlag.value,
262
+ formatter: ({ cellValue }) => !isEmpty(cellValue) ? commafy(Number.parseFloat(cellValue), { digits: 0 }) : '',
263
+ editRender: commonVxeInput(null, {
264
+ immediate: true,
265
+ events: {
266
+ blur({ row }) {
267
+ updateRowData(row)
268
+ },
269
+ },
270
+ }),
271
+ validator: ({ itemValue }) => {
272
+ const result = validateNumber(itemValue)
273
+ if (!result.status) {
274
+ return Promise.reject(result.msg)
275
+ }
276
+ const payDateDesc = Number.parseFloat(itemValue)
277
+ if (payDateDesc <= 0) {
278
+ return Promise.reject('必须大于0')
279
+ }
280
+ return Promise.resolve(true)
281
+ },
282
+ },
283
+ {
284
+ field: 'draftDate',
285
+ title: '票据天数',
286
+ visible: foreignExFlag.value,
287
+ formatter: ({ cellValue }) => !isEmpty(cellValue) ? commafy(Number.parseFloat(cellValue), { digits: 0 }) : '',
288
+ editRender: commonVxeInput(null, {
289
+ immediate: true,
290
+ events: {
291
+ blur({ row }) {
292
+ updateRowData(row)
293
+ },
294
+ },
295
+ }),
296
+ validator: ({ itemValue }) => {
297
+ const result = validateNumber(itemValue)
298
+ if (!result.status) {
299
+ return Promise.reject(result.msg)
300
+ }
301
+ const draftDate = Number.parseFloat(itemValue)
302
+ if (draftDate <= 0) {
303
+ return Promise.reject('必须大于0')
304
+ }
305
+ return Promise.resolve(true)
306
+ },
307
+ },
308
+ {
309
+ field: 'payDateEstimate',
310
+ title: '预计付款日期',
311
+ width: 150,
312
+ visible: foreignExFlag.value,
313
+ editRender: commonVxeDatePicker(null, {
314
+ immediate: true,
315
+ events: {
316
+ change({ row }) {
317
+ updateRowData(row)
318
+ },
319
+ },
320
+ }),
321
+ formatter: ({ cellValue }) => cellValue ? dayjs(cellValue).format('YYYY-MM-DD') : '',
322
+ },
323
+ {
324
+ field: 'patCreditDate',
325
+ title: '预计开证日期',
326
+ width: 150,
327
+ visible: foreignExFlag.value,
328
+ editRender: commonVxeDatePicker(),
329
+ formatter: ({ cellValue }) => cellValue ? dayjs(cellValue).format('YYYY-MM-DD') : '',
330
+ },
331
+ {
332
+ field: 'remark',
333
+ title: '其他说明',
334
+ width: 300,
335
+ visible: foreignExFlag.value,
336
+ editRender: commonVxeInput(null, {
337
+ immediate: true,
338
+ events: {
339
+ blur({ row }) {
340
+ updateRowData(row)
341
+ },
342
+ },
343
+ }),
344
+ },
345
+ {
346
+ field: 'paymentTerms',
347
+ title: '付款条款',
348
+ width: foreignExFlag.value ? 500 : '',
349
+ },
350
+ ].map((col) => {
351
+ if (col.field !== 'seq') {
352
+ (col as any).slots = {
353
+ ...(col as any).slots,
354
+ default: `${col.field}_default`,
355
+ }
356
+ }
357
+ if (foreignExFlag.value) {
358
+ return col
359
+ }
360
+ return {
361
+ ...col,
362
+ width: (col as any).width ?? '',
363
+ } as any
364
+ })).value
365
+ })
366
+
367
+ const tableValidator = (...args: any[]) => {
368
+ return (validator as any)(...args)
369
+ }
370
+
371
+ return {
372
+ columns,
373
+ editRules: computed(() => createEditRules(columns.value)),
374
+ tableValidator,
375
+ }
376
+ }