@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,619 @@
1
+ <template>
2
+ <BxContainer ref="container" title="付款说明" level-two>
3
+ <Payment ref="payment" />
4
+ <VxePlusTable
5
+ :id="tablePageId"
6
+ ref="xGrid"
7
+ class="pb0"
8
+ :auto-load="autoLoad"
9
+ :columns="columns"
10
+ :is-edit="editable"
11
+ :show-checkbox="editable"
12
+ :edit-rules="editRules"
13
+ :service-config="serviceConfig"
14
+ :transform-params="transformParams"
15
+ :transform-response="transformResponse"
16
+ :loading="loading"
17
+ :after-load="afterLoad"
18
+ :span-method="rowspanMethod"
19
+ :virtual-x-config="{ enabled: false }"
20
+ :virtual-y-config="{ enabled: false }"
21
+ :checkbox-config="{
22
+ visibleMethod: ({ row }) => !(diffable && row.diffable),
23
+ checkMethod: ({ row }) => !(diffable && row.diffable),
24
+ }"
25
+ :before-edit-method="({ row }) => editable && !(diffable && row.diffable)"
26
+ :left-buttons="['ADD_PAYMENT']"
27
+ min-height="179px"
28
+ max-height="403px"
29
+ v-on="gridEvents"
30
+ >
31
+ <template v-for="column in columns" #[column.slots.default]="{ row }">
32
+ <span v-if="['payContentCode'].includes(column.field)" :key="`${column.field}-cell-1`" :class="{ 'text-blue-500 cursor-pointer underline': !foreignExFlag, 'text-red-500 line-through-1': diffable && row.diffable && row[`${column.field}__diffable`] }" @click="handleEdit(row)">{{ getCodeSetTextByCode('brmerp.pm.payContentCode', row.payContentCode) }}</span>
33
+ <span v-else-if="['payCondition'].includes(column.field)" :key="`${column.field}-cell-2`" :class="diffable && row.diffable && row[`${column.field}__diffable`] && 'text-red-500 line-through-1'">{{ getCodesetName(column.editRender?.props?.codeSet, row.payCondition, column.editRender?.props?.textTemplate) }}</span>
34
+ <span v-else-if="['payMethod'].includes(column.field)" :key="`${column.field}-cell-3`" :class="diffable && row.diffable && row[`${column.field}__diffable`] && 'text-red-500 line-through-1'">{{ getCodesetName(column.editRender?.props?.codeSet, row.payMethod, column.editRender?.props?.textTemplate) }}</span>
35
+ <span v-else-if="column.editRender?.name === 'tableSelect'" :key="`${column.field}-tableSelect`" :class="diffable && row.diffable && row[`${column.field}__diffable`] && 'text-red-500 line-through-1'">{{ getCodeSetTextByCode(column.editRender?.props?.codeSet, row[column.field]) }}</span>
36
+ <span v-else-if="column.formatter" :key="`${column.field}-formatter`" :class="diffable && row.diffable && row[`${column.field}__diffable`] && 'text-red-500 line-through-1'">{{ column.formatter({ row, cellValue: row[column.field] }) }}</span>
37
+ <span v-else :key="`${column.field}`" :class="diffable && row.diffable && row[`${column.field}__diffable`] && 'text-red-500 line-through-1'">{{ row[column.field] }}</span>
38
+ </template>
39
+ </VxePlusTable>
40
+ </BxContainer>
41
+ </template>
42
+
43
+ <script setup lang="ts">
44
+ import { computed, inject, nextTick, provide, reactive, ref, watch } from 'vue'
45
+ import { useDialog } from '@vxe-plus/components'
46
+ import { ElMessage, ElMessageBox } from 'element-plus'
47
+ import { has } from 'xe-utils'
48
+ import { createTableColumns } from './columns'
49
+ import Payment from './Payment/index.vue'
50
+ import { createEiBlock, sendService } from '@/utils/eiTools'
51
+ import { compareData, scrollIntoView } from '@/utils'
52
+ import { isEmpty, isNumber } from '@/utils/is'
53
+ import { useCodeSetStore } from '@/stores/modules/codeSet'
54
+ import PMPC9906 from '@/views/PM/PC/component/PMPC9906/index.vue'
55
+
56
+ const xGrid = ref<any>(null)
57
+ const container = ref<any>(null)
58
+ const payment = ref<any>(null)
59
+
60
+ provide('__PMPC0101__explain__pay__module__', {
61
+ payment,
62
+ })
63
+
64
+ const { editable, detailInfo, businessType, diffable, pageId, foreignExFlag, isCorrecte, isCorrecteOrChange, isFirstVersion } = inject('__PMPC0101__info__') as any
65
+
66
+ const { getId } = inject('__PMPC0101__method__') as any
67
+
68
+ const { columns, editRules, tableValidator } = createTableColumns() as any
69
+
70
+ const { getCodeSetTextByCode } = useCodeSetStore()
71
+
72
+ const autoLoad = computed(() => !!detailInfo.value[getId('pcContractMainId')])
73
+
74
+ const tablePageId = computed(() => `${pageId.value}_result_5`)
75
+
76
+ function getTableData() {
77
+ const $grid = xGrid.value.getGridInstance()
78
+ const { tableData } = $grid.getTableData()
79
+ if (diffable.value) {
80
+ return tableData.filter(row => !row.diffable)
81
+ }
82
+ return tableData
83
+ }
84
+
85
+ function getCodesetName(codeset, value, textTemplate) {
86
+ if (!isEmpty(value)) {
87
+ let values
88
+ if (textTemplate) {
89
+ values = value.split(',').filter(k => !isEmpty(k)).map(code => `${code}-${getCodeSetTextByCode(codeset, code)}`)
90
+ }
91
+ else {
92
+ values = value.split(',').filter(k => !isEmpty(k)).map(code => getCodeSetTextByCode(codeset, code))
93
+ }
94
+ return values.join(',')
95
+ }
96
+ }
97
+
98
+ async function handleValidator(flag?, tableFlag?) {
99
+ try {
100
+ if (flag !== false && tableFlag) {
101
+ const tableData = getTableData()
102
+ if (!tableData.length) {
103
+ scrollIntoView(container.value.$el)
104
+ ElMessage.warning('至少需要1条付款说明')
105
+ return Promise.reject(false)
106
+ }
107
+ }
108
+ await tableValidator(xGrid, flag ?? diffable.value ? getTableData() : true)
109
+ return Promise.resolve(true)
110
+ }
111
+ catch (error) {
112
+ return Promise.reject(error)
113
+ }
114
+ }
115
+
116
+ async function validator(flag: boolean = true, tableFlag: boolean = false) {
117
+ try {
118
+ await payment.value.validator(flag)
119
+ await handleValidator(flag, tableFlag)
120
+ return Promise.resolve(true)
121
+ }
122
+ catch {
123
+ return Promise.reject(false)
124
+ }
125
+ }
126
+
127
+ function reload() {
128
+ xGrid.value.reload()
129
+ }
130
+
131
+ const serviceConfig = reactive({
132
+ serviceName: isCorrecteOrChange.value ? 'PMPC9906' : isFirstVersion.value ? 'PMPC0102' : 'PMPC0101',
133
+ queryMethod: isCorrecteOrChange.value ? 'queryContractPaymentCompare' : 'queryContractPayment',
134
+ })
135
+
136
+ function transformParams(formEi) {
137
+ formEi.set(`inqu_status-0-pcContractMainId`, detailInfo.value.pcContractMainId)
138
+ formEi.set(`inqu_status-0-${getId('pcContractMainId')}`, detailInfo.value[getId('pcContractMainId')])
139
+ if (isFirstVersion.value) {
140
+ formEi.set(`inqu_status-0-operateType`, '10')
141
+ }
142
+ return formEi
143
+ }
144
+
145
+ function transformResponse(data) {
146
+ if (diffable.value) {
147
+ return (data || []).map((item) => {
148
+ item.operateType = `${isCorrecte.value ? '修正' : '变更'}后`
149
+ return item
150
+ })
151
+ }
152
+ return data
153
+ }
154
+
155
+ function rowspanMethod({ row, _rowIndex, column, visibleData }) {
156
+ if (diffable.value) {
157
+ const fields = ['pcContractPaymentId']
158
+ if (editable.value) {
159
+ fields.push('checkbox')
160
+ }
161
+ const cellValue = row[column.field]
162
+ const isCheckbox = column.field === 'checkbox'
163
+ const flag = isCheckbox ? ['D', 'U'].includes(row.operationType) : true
164
+ if (cellValue && fields.includes(column.field) && flag) {
165
+ const prevRow = visibleData[_rowIndex - 1]
166
+ let nextRow = visibleData[_rowIndex + 1]
167
+ if (prevRow && prevRow[column.field] === cellValue) {
168
+ return { rowspan: 0, colspan: 0 }
169
+ }
170
+ else {
171
+ let countRowspan = 1
172
+ while (nextRow && nextRow[column.field] === cellValue) {
173
+ nextRow = visibleData[++countRowspan + _rowIndex]
174
+ }
175
+ if (countRowspan > 1) {
176
+ return { rowspan: countRowspan, colspan: 1 }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+
183
+ const loading = ref(!!detailInfo.value[getId('pcContractMainId')] && diffable.value)
184
+
185
+ // 获取diff数据
186
+ async function getDiffData(data, rowId) {
187
+ if (!diffable.value) {
188
+ return
189
+ }
190
+ if (data && data.length) {
191
+ try {
192
+ loading.value = true
193
+ const diffResult = await sendService({
194
+ serviceName: 'PMPC9906',
195
+ methodName: 'queryContractPaymentForVue',
196
+ eiBlocks: [
197
+ createEiBlock({
198
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
199
+ }, 'inqu_status'),
200
+ ],
201
+ blockName: 'result_5',
202
+ loading: false,
203
+ }) as any
204
+ console.log('diffResult', diffResult)
205
+ const rowHisId = getId(rowId)
206
+ const excludes = ['operationType', 'operateType', 'custom', rowId, rowHisId]
207
+ const deleteRows = data.filter(row => ['D'].includes(row.operationType)).map((item) => {
208
+ const diffData = columns.value.reduce((ob, column) => {
209
+ const field = column.field
210
+ if (!excludes.includes(field)) {
211
+ ob[`${field}__diffable`] = true
212
+ }
213
+ return ob
214
+ }, {})
215
+ return {
216
+ ...item,
217
+ ...diffData,
218
+ diffable: true,
219
+ }
220
+ })
221
+ const diffList = diffResult.filter(row => !isEmpty(row[rowId]))
222
+ let newRows = [] as any[]
223
+ if (diffList && diffList.length) {
224
+ const updateRowsOb = data.filter(row => ['U'].includes(row.operationType)).reduce((updateOb, row) => {
225
+ const originRows = diffList.filter(item => item[rowId] === row[rowId]).map((originRow) => {
226
+ const diffData = columns.value.reduce((ob, column) => {
227
+ const field = column.field
228
+ if (has(originRow, field) && !excludes.includes(field)) {
229
+ const originValue = originRow[field]
230
+ const currentValue = row[field]
231
+ if (isNumber(originValue) && isNumber(currentValue)) {
232
+ if (Number(originValue) !== Number(currentValue)) {
233
+ ob[`${field}__diffable`] = true
234
+ }
235
+ }
236
+ else if (originValue !== currentValue) {
237
+ ob[`${field}__diffable`] = true
238
+ }
239
+ }
240
+ return ob
241
+ }, {})
242
+ return {
243
+ ...originRow,
244
+ ...diffData,
245
+ isDiff: Object.keys(diffData).length > 0,
246
+ diffable: true,
247
+ operationType: 'U',
248
+ operateType: `${isCorrecte.value ? '修正' : '变更'}前`,
249
+ }
250
+ }).filter(originRow => originRow.isDiff)
251
+ if (originRows.length) {
252
+ updateOb[row[rowId]] = originRows
253
+ }
254
+ return updateOb
255
+ }, {})
256
+ newRows = data.reduce((rows, row) => {
257
+ if (['U'].includes(row.operationType)) {
258
+ if (updateRowsOb[row[rowId]] && updateRowsOb[row[rowId]].length) {
259
+ return rows.concat(row, ...updateRowsOb[row[rowId]])
260
+ }
261
+ }
262
+ else if (['D'].includes(row.operationType)) {
263
+ const deleteRow = deleteRows.find(item => item[rowId] === row[rowId])
264
+ return rows.concat(deleteRow ?? row)
265
+ }
266
+ return rows.concat(row)
267
+ }, [])
268
+ }
269
+ else {
270
+ newRows = data.map((row) => {
271
+ if (['D'].includes(row.operationType)) {
272
+ const deleteRow = deleteRows.find(item => item[rowId] === row[rowId])
273
+ if (deleteRow) {
274
+ return deleteRow
275
+ }
276
+ }
277
+ return row
278
+ })
279
+ }
280
+ console.log('newRows', newRows)
281
+ if (newRows && newRows.length) {
282
+ setTimeout(() => {
283
+ nextTick(() => {
284
+ const $grid = xGrid.value?.getGridInstance()
285
+ if ($grid) {
286
+ $grid.loadData(newRows.map((row) => {
287
+ return {
288
+ ...row,
289
+ checkbox: `${row.operationType}-${row[rowId]}`,
290
+ }
291
+ }))
292
+ }
293
+ loading.value = false
294
+ })
295
+ }, 100)
296
+ return
297
+ }
298
+ }
299
+ catch {
300
+
301
+ }
302
+ }
303
+ loading.value = false
304
+ }
305
+
306
+ function afterLoad({ data }) {
307
+ if (!detailInfo.value[getId('pcContractMainId')]) {
308
+ return
309
+ }
310
+ if (diffable.value) {
311
+ getDiffData(data, 'pcContractPaymentId')
312
+ }
313
+ }
314
+
315
+ const gridEvents = reactive({
316
+ toolbarButtonClick: ({ code, $grid }) => {
317
+ switch (code) {
318
+ case 'ADD_PAYMENT':
319
+ handleAdd($grid)
320
+ break
321
+ case 'COPY_PAYMENT':
322
+ handleCopy($grid)
323
+ break
324
+ case 'DELETE_PAYMENT':
325
+ handleDelete($grid)
326
+ break
327
+ case 'SAVE_PAYMENT_CYCLE':
328
+ handleSave()
329
+ break
330
+ }
331
+ },
332
+ })
333
+
334
+ const { openDialog } = useDialog()
335
+
336
+ // 新增操作
337
+ async function handleAdd($grid) {
338
+ if (!detailInfo.value[getId('pcContractMainId')]) {
339
+ return ElMessage.warning('请先保存合同信息!')
340
+ }
341
+ const { tableData } = $grid.getTableData()
342
+ const maxSortNum = tableData.length ? Math.max(...tableData.map(row => row.sortNum ?? 0)) : 0
343
+ if (foreignExFlag.value) {
344
+ const checkedRow = {
345
+ [getId('pcContractPaymentId')]: '',
346
+ sortNum: maxSortNum + 1,
347
+ payContentCode: '',
348
+ paymentCondition: '',
349
+ payCondition: '',
350
+ payMethod: '',
351
+ payValueType: '',
352
+ payValue: '',
353
+ payDateDesc: '',
354
+ draftDate: '',
355
+ payDateEstimate: '',
356
+ patCreditDate: '',
357
+ remark: '',
358
+ paymentTerms: '',
359
+ } as any
360
+ if (diffable.value) {
361
+ checkedRow.operationType = 'I'
362
+ }
363
+ const { row: newRow } = await $grid.insertAt(checkedRow)
364
+ $grid.setEditRow(newRow)
365
+ return
366
+ }
367
+ openDialog(PMPC9906, {
368
+ title: '付款信息明细',
369
+ pageId: 'PMPC9906',
370
+ componentParam: {
371
+ editable: editable.value,
372
+ getId,
373
+ formParams: {
374
+ sortNum: maxSortNum + 1,
375
+ },
376
+ },
377
+ }, async (data, exposed) => {
378
+ try {
379
+ await sendService({
380
+ serviceName: 'PMPC9906',
381
+ methodName: 'insert',
382
+ eiBlocks: [
383
+ createEiBlock({
384
+ ...data,
385
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
386
+ businessType: businessType.value,
387
+ }, 'inqu_status'),
388
+ ],
389
+ })
390
+ exposed.close()
391
+ ElMessage.success('新增成功')
392
+ reload()
393
+ }
394
+ catch {
395
+
396
+ }
397
+ })
398
+ }
399
+
400
+ // 复制
401
+ async function handleCopy($grid) {
402
+ return ElMessage.warning('该功能正在开发中!')
403
+ if (!detailInfo.value[getId('pcContractMainId')]) {
404
+ return ElMessage.warning('请先保存合同信息!')
405
+ }
406
+ const checkboxRecords = $grid.getCheckboxRecords()
407
+ if (!checkboxRecords.length) {
408
+ ElMessage.warning(`请选中一条数据`)
409
+ return
410
+ }
411
+ try {
412
+ await sendService({
413
+ serviceName: 'PMPC0101',
414
+ methodName: 'copyContractPayment',
415
+ eiBlocks: [
416
+ createEiBlock(checkboxRecords.map((item) => {
417
+ return {
418
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
419
+ [getId('pcContractPaymentId')]: item[getId('pcContractPaymentId')],
420
+ }
421
+ }), 'result_5'),
422
+ createEiBlock({
423
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
424
+ businessType: businessType.value,
425
+ }, 'inqu_status'),
426
+ ],
427
+ })
428
+ ElMessage.success('复制成功')
429
+ reload()
430
+ }
431
+ catch {
432
+
433
+ }
434
+ }
435
+
436
+ // 删除
437
+ async function handleDelete($grid) {
438
+ if (!detailInfo.value[getId('pcContractMainId')]) {
439
+ return ElMessage.warning('请先保存合同信息!')
440
+ }
441
+ const checkboxRecords = $grid.getCheckboxRecords()
442
+ if (!checkboxRecords.length) {
443
+ ElMessage.warning(`请选中一条数据`)
444
+ return
445
+ }
446
+ try {
447
+ await ElMessageBox.confirm(`确定要删除吗?`)
448
+ const rows = checkboxRecords.filter((row) => {
449
+ return !isEmpty(row[getId('pcContractPaymentId')])
450
+ })
451
+ if (rows.length) {
452
+ await sendService({
453
+ serviceName: 'PMPC9906',
454
+ methodName: 'delete',
455
+ eiBlocks: [
456
+ createEiBlock(rows.map((item) => {
457
+ return {
458
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
459
+ [getId('pcContractPaymentId')]: item[getId('pcContractPaymentId')],
460
+ }
461
+ }), 'result_5'),
462
+ createEiBlock({
463
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
464
+ businessType: businessType.value,
465
+ }, 'inqu_status'),
466
+ ],
467
+ })
468
+ ElMessage.success('删除成功')
469
+ reload()
470
+ }
471
+ else {
472
+ $grid.removeCheckboxRow()
473
+ }
474
+ }
475
+ catch {
476
+
477
+ }
478
+ }
479
+
480
+ // 编辑
481
+ async function handleEdit(row) {
482
+ if (foreignExFlag.value) {
483
+ return
484
+ }
485
+ try {
486
+ const data = await sendService({
487
+ serviceName: 'PMPC9906',
488
+ methodName: isCorrecteOrChange.value ? 'detailForCompare' : 'detail',
489
+ eiBlocks: [
490
+ createEiBlock({
491
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
492
+ pcContractPaymentId: row.pcContractPaymentId,
493
+ [getId('pcContractPaymentId')]: row[getId('pcContractPaymentId')],
494
+ businessType: businessType.value,
495
+ }, 'inqu_status'),
496
+ ],
497
+ blockName: 'inqu_status,inqu_status2',
498
+ })
499
+ const rowData = data && (data as any).inqu_status
500
+ const newData = (rowData && rowData[0]) || {}
501
+ console.log('newData', newData)
502
+ if (isEmpty(newData.sortNum)) {
503
+ const $grid = xGrid.value.getGridInstance()
504
+ const { tableData } = $grid.getTableData()
505
+ const maxSortNum = tableData.length ? Math.max(...tableData.map(row => row.sortNum ?? 0)) : 0
506
+ newData.sortNum = maxSortNum + 1
507
+ }
508
+ const diffInfo = ref({}) as any
509
+ if (diffable.value) {
510
+ const diffData = data && (data as any).inqu_status2
511
+ diffInfo.value = compareData((diffData && diffData[0]) || {}, newData)
512
+ }
513
+ openDialog(PMPC9906, {
514
+ title: '付款信息明细',
515
+ pageId: 'PMPC9906',
516
+ componentParam: {
517
+ editable: editable.value && !(diffable.value && row.diffable),
518
+ diffable: diffable.value,
519
+ formParams: newData,
520
+ diffInfo: diffInfo.value,
521
+ getId,
522
+ },
523
+ }, async (data, exposed) => {
524
+ try {
525
+ await sendService({
526
+ serviceName: 'PMPC9906',
527
+ methodName: 'update',
528
+ eiBlocks: [
529
+ createEiBlock({
530
+ ...row,
531
+ ...data,
532
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
533
+ businessType: businessType.value,
534
+ }, 'inqu_status'),
535
+ ],
536
+ })
537
+ exposed.close()
538
+ ElMessage.success('更新成功')
539
+ reload()
540
+ }
541
+ catch {
542
+
543
+ }
544
+ })
545
+ }
546
+ catch {
547
+
548
+ }
549
+ }
550
+
551
+ // 保存
552
+ async function handleSave() {
553
+ if (!detailInfo.value[getId('pcContractMainId')]) {
554
+ return ElMessage.warning('请先保存合同信息!')
555
+ }
556
+ const tableData = getTableData()
557
+ if (!tableData.length) {
558
+ return ElMessage.warning('至少需要1条明细数据')
559
+ }
560
+ try {
561
+ await handleValidator()
562
+ await sendService({
563
+ serviceName: 'PMPC9906',
564
+ methodName: 'saveContractPaymentBatch',
565
+ eiBlocks: [
566
+ createEiBlock(tableData.map((item) => {
567
+ return {
568
+ ...item,
569
+ pcContractMainId: detailInfo.value.pcContractMainId,
570
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
571
+ }
572
+ }), 'result_5'),
573
+ createEiBlock({
574
+ pcContractMainId: detailInfo.value.pcContractMainId,
575
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
576
+ businessType: businessType.value,
577
+ }, 'inqu_status'),
578
+ ],
579
+ })
580
+ ElMessage.success('保存成功')
581
+ reload()
582
+ }
583
+ catch {
584
+
585
+ }
586
+ }
587
+
588
+ function getData() {
589
+ return {
590
+ payment: payment.value.getData(),
591
+ }
592
+ }
593
+
594
+ function updateFormData(data) {
595
+ payment.value.updateFormData(data)
596
+ }
597
+
598
+ watch([
599
+ () => editable.value,
600
+ () => foreignExFlag.value,
601
+ ], () => {
602
+ nextTick(() => {
603
+ xGrid.value.btnSetDisable(['ADD_PAYMENT', 'COPY_PAYMENT', 'DELETE_PAYMENT', 'SAVE_PAYMENT_CYCLE'], !editable.value)
604
+ xGrid.value.btnSetVisible(['SAVE_PAYMENT_CYCLE'], foreignExFlag.value)
605
+ })
606
+ }, {
607
+ immediate: true,
608
+ })
609
+
610
+ defineExpose({
611
+ reload,
612
+ getData,
613
+ validator,
614
+ updateFormData,
615
+ payment,
616
+ })
617
+ </script>
618
+
619
+ <style scoped></style>
@@ -0,0 +1,73 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2026-03-25 08:56:39
6
+ */
7
+ import { computed, inject, reactive } from 'vue'
8
+ import { merge } from 'xe-utils'
9
+ import { useForm } from '@/hooks/useForm'
10
+ import { isEmpty } from '@/utils/is'
11
+
12
+ export function createFormConfig() {
13
+ const { commonFormRadio, commonFormSelect, createFormRules, validator, validateField, getFormData } = useForm()
14
+
15
+ const { diffable, detailInfo, diffInfo, foreignExFlag } = inject('__PMPC0101__info__') as any
16
+
17
+ const formData = reactive(merge({
18
+ settleMethod: '',
19
+ settleQmReport: '',
20
+ }, detailInfo.value, {
21
+ settleMethod: detailInfo.value?.settleMethod ?? (foreignExFlag.value ? '30' : ''),
22
+ }))
23
+
24
+ const baseFields = computed(() => {
25
+ return [
26
+ {
27
+ field: 'settleMethod',
28
+ title: '结算方式',
29
+ titleSuffix: {
30
+ content: '收付款次数超过1次即为多次,如多个结算客商、有预付款和尾款、分期付款等;如果符合多次结算条件,合同平台会自动将此标志置为Y',
31
+ },
32
+ itemRender: commonFormRadio('brmerp.pm.settleMethod'),
33
+ required: true,
34
+ },
35
+ {
36
+ field: 'settleQmReport',
37
+ title: '结算质量报告',
38
+ itemRender: commonFormSelect('brmerp.pm.contractSettlementReport'),
39
+ },
40
+ ]
41
+ })
42
+
43
+ const getData = () => {
44
+ return getFormData(baseFields.value, formData)
45
+ }
46
+
47
+ const formRules = computed(() => createFormRules(baseFields.value))
48
+
49
+ const diffConfig = computed(() => {
50
+ const fields = baseFields.value.filter(item => ((item as any).visible ?? true) && !isEmpty(item.field)).map(item => item.field)
51
+ const enabled = diffable.value && Object.keys(diffInfo.value).some(field => fields.includes(field))
52
+ return {
53
+ enabled,
54
+ data: diffInfo.value,
55
+ }
56
+ })
57
+
58
+ const formConfig = reactive({
59
+ data: formData,
60
+ items: baseFields,
61
+ titleWidth: 170,
62
+ rules: formRules,
63
+ diffConfig,
64
+ })
65
+
66
+ return {
67
+ formData,
68
+ formConfig,
69
+ validator,
70
+ validateField,
71
+ getData,
72
+ }
73
+ }