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