@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,738 @@
1
+ <template>
2
+ <BxRoundedContainer>
3
+ <BxContainer id="INQU_PARTY" ref="container" title="客商信息" @btn-click="btnClick">
4
+ <div v-if="!isEmpty(detailInfo.partyCaseSituation)" class="bold pb10 flex-row font16 pt10 text-[#555]">
5
+ <span class="mr5“">客商案件情况:</span>
6
+ <span class="flex-1">{{ detailInfo.partyCaseSituation }}</span>
7
+ </div>
8
+ <Major ref="major" class="mt5" />
9
+ <VxePlusTable
10
+ v-if="showPartyFlag"
11
+ :id="tablePageId"
12
+ ref="xGrid"
13
+ class="pb0"
14
+ :auto-load="autoLoad"
15
+ :columns="columns"
16
+ :show-checkbox="editable"
17
+ :is-edit="editable"
18
+ :edit-rules="editRules"
19
+ :service-config="serviceConfig"
20
+ :transform-params="transformParams"
21
+ :transform-response="transformResponse"
22
+ :loading="loading"
23
+ :after-load="afterLoad"
24
+ :span-method="rowspanMethod"
25
+ :virtual-x-config="{ enabled: false }"
26
+ :virtual-y-config="{ enabled: false }"
27
+ :checkbox-config="{
28
+ visibleMethod: ({ row }) => !(diffable && row.diffable),
29
+ checkMethod: ({ row }) => !(diffable && row.diffable),
30
+ }"
31
+ :before-edit-method="({ row }) => editable && !(diffable && row.diffable)"
32
+ min-height="179px"
33
+ max-height="403px"
34
+ v-on="gridEvents"
35
+ >
36
+ <template #billAmt_header="{ column }">
37
+ <span v-if="editable" class="vxe-cell--required-icon">
38
+ <i />
39
+ </span>
40
+ <span>{{ column.title }}</span>
41
+ </template>
42
+ <template #prepayAmt_header="{ column }">
43
+ <span v-if="editable" class="vxe-cell--required-icon">
44
+ <i />
45
+ </span>
46
+ <span>{{ column.title }}</span>
47
+ </template>
48
+ <template #overLoadingScale_header="{ column }">
49
+ <span v-if="editable" class="vxe-cell--required-icon">
50
+ <i />
51
+ </span>
52
+ <span>{{ column.title }}</span>
53
+ </template>
54
+ <template #partyGroupCode_header="{ column }">
55
+ <span v-if="editable" class="vxe-cell--required-icon">
56
+ <i />
57
+ </span>
58
+ <span>{{ column.title }}</span>
59
+ </template>
60
+ <template v-for="column in columns" #[column.slots.default]="{ row }">
61
+ <span v-if="['partyGroupCode'].includes(column.field)" :key="`${column.field}-cell`" class="cursor-pointer text-blue-500 underline" :class="{ 'text-red-500 line-through-1': diffable && row.diffable && row[`${column.field}__diffable`] }" @click="handleEdit(row)">{{ row.partyGroupCode }}</span>
62
+ <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>
63
+ <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>
64
+ <span v-else :key="`${column.field}`" :class="diffable && row.diffable && row[`${column.field}__diffable`] && 'text-red-500 line-through-1'">{{ row[column.field] }}</span>
65
+ </template>
66
+ </VxePlusTable>
67
+ </BxContainer>
68
+ </BxRoundedContainer>
69
+ </template>
70
+
71
+ <script setup lang="ts">
72
+ import { computed, inject, nextTick, onMounted, reactive, ref, watch } from 'vue'
73
+ import type { Ref } from 'vue'
74
+ import { ElMessage, ElMessageBox } from 'element-plus'
75
+ import { useDialog } from '@vxe-plus/components'
76
+ import { has } from 'xe-utils'
77
+ import Qs from 'qs'
78
+ import { createTableColumns } from './columns'
79
+ import Major from './Major/index.vue'
80
+ import { createEiBlock, sendService } from '@/utils/eiTools'
81
+ import { isEmpty, isNumber } from '@/utils/is'
82
+ import { compareData, openV6Page } from '@/utils'
83
+ import { useCodeSetStore } from '@/stores/modules/codeSet'
84
+ import PMPC9703 from '@/views/PM/PC/component/PMPC9703/index.vue'
85
+
86
+ const xGrid = ref<any>(null)
87
+ const container = ref<any>(null)
88
+ const major = ref<any>(null)
89
+ const showPartyFlag = ref(false)
90
+
91
+ const { addable, editable, detailInfo, businessType, diffable, pageId, isCorrecte, isCorrecteOrChange, isFirstVersion, hedgingFlag } = inject('__PMPC0101__info__') as any
92
+
93
+ const { updateDetailInfo, saveDetail, fetchDetailInfo, getId, getData } = inject('__PMPC0101__method__') as any
94
+
95
+ const { main: mainModule } = inject('__PMPC0101__module__') as { main: Ref }
96
+
97
+ const baseModule = computed(() => mainModule?.value?.base)
98
+
99
+ const baseModuleFormData = computed(() => baseModule?.value?.formData)
100
+
101
+ const majorFormData = computed(() => major?.value?.formData)
102
+
103
+ const { columns, editRules, tableValidator } = createTableColumns() as any
104
+
105
+ const { getCodeSetTextByCode } = useCodeSetStore()
106
+
107
+ const autoLoad = computed(() => !!detailInfo.value[getId('pcContractMainId')])
108
+
109
+ const tablePageId = computed(() => `${pageId.value}_result_1`)
110
+
111
+ function getTableData() {
112
+ if (showPartyFlag.value) {
113
+ const $grid = xGrid.value.getGridInstance()
114
+ const { tableData } = $grid.getTableData()
115
+ if (diffable.value) {
116
+ return tableData.filter(row => !row.diffable)
117
+ }
118
+ return tableData
119
+ }
120
+ return []
121
+ }
122
+
123
+ async function handleValidator(flag?) {
124
+ try {
125
+ // if (flag !== false && tableFlag) {
126
+ // const tableData = getTableData()
127
+ // if (!tableData.length) {
128
+ // scrollIntoView(container.value.$el)
129
+ // ElMessage.warning('至少需要1条客商信息')
130
+ // return Promise.reject(false)
131
+ // }
132
+ // }
133
+ await major.value.validator(flag)
134
+ if (showPartyFlag.value) {
135
+ await tableValidator(xGrid, flag ?? diffable.value ? getTableData() : true)
136
+ }
137
+ return Promise.resolve(true)
138
+ }
139
+ catch (error) {
140
+ return Promise.reject(error)
141
+ }
142
+ }
143
+
144
+ function reload() {
145
+ if (showPartyFlag.value) {
146
+ xGrid.value.reload()
147
+ }
148
+ else {
149
+ showPartyFlag.value = true
150
+ }
151
+ }
152
+
153
+ const serviceConfig = reactive({
154
+ serviceName: isCorrecteOrChange.value ? 'PMPC9703' : isFirstVersion.value ? 'PMPC0102' : 'PMPC0101',
155
+ queryMethod: isCorrecteOrChange.value ? 'queryContractPartyCompareForVue' : 'queryContractParty',
156
+ })
157
+
158
+ function transformParams(formEi) {
159
+ formEi.set(`inqu_status-0-pcContractMainId`, detailInfo.value.pcContractMainId)
160
+ formEi.set(`inqu_status-0-${getId('pcContractMainId')}`, detailInfo.value[getId('pcContractMainId')])
161
+ formEi.set(`inqu_status-0-isSign`, 'Y')
162
+ formEi.set(`inqu_status-0-majorExcludeFlag`, 'N')
163
+ if (isFirstVersion.value) {
164
+ formEi.set(`inqu_status-0-operateType`, '10')
165
+ }
166
+ return formEi
167
+ }
168
+
169
+ function transformResponse(data) {
170
+ if (diffable.value) {
171
+ return (data || []).map((item) => {
172
+ item.operateType = `${isCorrecte.value ? '修正' : '变更'}后`
173
+ return item
174
+ })
175
+ }
176
+ return data
177
+ }
178
+
179
+ async function getTradePropertyCode(rows) {
180
+ try {
181
+ const data = await sendService({
182
+ serviceName: 'PMPC0101',
183
+ methodName: 'save',
184
+ eiBlocks: [
185
+ createEiBlock({
186
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
187
+ }),
188
+ createEiBlock(rows.map((item) => {
189
+ return {
190
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
191
+ [getId('pcContractPartyId')]: item[getId('pcContractPartyId')],
192
+ }
193
+ }), 'result'),
194
+ ],
195
+ blockName: 'primaryId',
196
+ })
197
+ const tradePropertyCode = data && data[0]
198
+ if (tradePropertyCode) {
199
+ return Promise.resolve(tradePropertyCode)
200
+ }
201
+ }
202
+ catch {
203
+
204
+ }
205
+ return Promise.reject(false)
206
+ }
207
+
208
+ async function getSupplierCreditFlag(rows) {
209
+ try {
210
+ const data = await sendService({
211
+ serviceName: 'PMPC0101',
212
+ methodName: 'save',
213
+ eiBlocks: [
214
+ createEiBlock({
215
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
216
+ }),
217
+ createEiBlock(rows.map((item) => {
218
+ return {
219
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
220
+ [getId('pcContractPartyId')]: item[getId('pcContractPartyId')],
221
+ }
222
+ }), 'result'),
223
+ ],
224
+ blockName: 'primaryId',
225
+ })
226
+ const supplierCreditFlag = data && data[0]
227
+ if (supplierCreditFlag) {
228
+ return Promise.resolve(supplierCreditFlag)
229
+ }
230
+ }
231
+ catch {
232
+
233
+ }
234
+ return Promise.reject(false)
235
+ }
236
+
237
+ const isInit = ref(true)
238
+
239
+ function refresh() {
240
+ isInit.value = false
241
+ reload()
242
+ }
243
+
244
+ function rowspanMethod({ row, _rowIndex, column, visibleData }) {
245
+ if (diffable.value) {
246
+ const fields = ['pcContractPartyId']
247
+ if (editable.value) {
248
+ fields.push('checkbox')
249
+ }
250
+ const cellValue = row[column.field]
251
+ const isCheckbox = column.field === 'checkbox'
252
+ const flag = isCheckbox ? ['D', 'U'].includes(row.operationType) : true
253
+ if (cellValue && fields.includes(column.field) && flag) {
254
+ const prevRow = visibleData[_rowIndex - 1]
255
+ let nextRow = visibleData[_rowIndex + 1]
256
+ if (prevRow && prevRow[column.field] === cellValue) {
257
+ return { rowspan: 0, colspan: 0 }
258
+ }
259
+ else {
260
+ let countRowspan = 1
261
+ while (nextRow && nextRow[column.field] === cellValue) {
262
+ nextRow = visibleData[++countRowspan + _rowIndex]
263
+ }
264
+ if (countRowspan > 1) {
265
+ return { rowspan: countRowspan, colspan: 1 }
266
+ }
267
+ }
268
+ }
269
+ }
270
+ }
271
+
272
+ const loading = ref(!!detailInfo.value[getId('pcContractMainId')] && diffable.value && showPartyFlag.value)
273
+
274
+ // 获取diff数据
275
+ async function getDiffData(data, rowId) {
276
+ if (!diffable.value) {
277
+ return
278
+ }
279
+ if (data && data.length) {
280
+ try {
281
+ loading.value = true
282
+ const diffResult = await sendService({
283
+ serviceName: 'PMPC9703',
284
+ methodName: 'queryContractPartyForVue',
285
+ eiBlocks: [
286
+ createEiBlock({
287
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
288
+ }, 'inqu_status'),
289
+ ],
290
+ blockName: 'result_1',
291
+ loading: false,
292
+ }) as any
293
+ console.log('diffResult', diffResult)
294
+ const rowHisId = getId(rowId)
295
+ const excludes = ['operationType', 'operateType', 'custom', rowId, rowHisId]
296
+ const deleteRows = data.filter(row => ['D'].includes(row.operationType)).map((item) => {
297
+ const diffData = columns.value.reduce((ob, column) => {
298
+ const field = column.field
299
+ if (!excludes.includes(field)) {
300
+ ob[`${field}__diffable`] = true
301
+ }
302
+ return ob
303
+ }, {})
304
+ return {
305
+ ...item,
306
+ ...diffData,
307
+ diffable: true,
308
+ }
309
+ })
310
+ const diffList = diffResult.filter(row => !isEmpty(row[rowId]))
311
+ let newRows = [] as any[]
312
+ if (diffList && diffList.length) {
313
+ const updateRowsOb = data.filter(row => ['U'].includes(row.operationType)).reduce((updateOb, row) => {
314
+ const originRows = diffList.filter(item => item[rowId] === row[rowId]).map((originRow) => {
315
+ const diffData = columns.value.reduce((ob, column) => {
316
+ const field = column.field
317
+ if (has(originRow, field) && !excludes.includes(field)) {
318
+ const originValue = originRow[field]
319
+ const currentValue = row[field]
320
+ if (isNumber(originValue) && isNumber(currentValue)) {
321
+ if (Number(originValue) !== Number(currentValue)) {
322
+ ob[`${field}__diffable`] = true
323
+ }
324
+ }
325
+ else if (originValue !== currentValue) {
326
+ ob[`${field}__diffable`] = true
327
+ }
328
+ }
329
+ return ob
330
+ }, {})
331
+ return {
332
+ ...originRow,
333
+ ...diffData,
334
+ isDiff: Object.keys(diffData).length > 0,
335
+ diffable: true,
336
+ operationType: 'U',
337
+ operateType: `${isCorrecte.value ? '修正' : '变更'}前`,
338
+ }
339
+ }).filter(originRow => originRow.isDiff)
340
+ if (originRows.length) {
341
+ updateOb[row[rowId]] = originRows
342
+ }
343
+ return updateOb
344
+ }, {})
345
+ newRows = data.reduce((rows, row) => {
346
+ if (['U'].includes(row.operationType)) {
347
+ if (updateRowsOb[row[rowId]] && updateRowsOb[row[rowId]].length) {
348
+ return rows.concat(row, ...updateRowsOb[row[rowId]])
349
+ }
350
+ }
351
+ else if (['D'].includes(row.operationType)) {
352
+ const deleteRow = deleteRows.find(item => item[rowId] === row[rowId])
353
+ return rows.concat(deleteRow ?? row)
354
+ }
355
+ return rows.concat(row)
356
+ }, [])
357
+ }
358
+ else {
359
+ newRows = data.map((row) => {
360
+ if (['D'].includes(row.operationType)) {
361
+ const deleteRow = deleteRows.find(item => item[rowId] === row[rowId])
362
+ if (deleteRow) {
363
+ return deleteRow
364
+ }
365
+ }
366
+ return row
367
+ })
368
+ }
369
+ console.log('newRows', newRows)
370
+ if (newRows && newRows.length) {
371
+ setTimeout(() => {
372
+ nextTick(() => {
373
+ const $grid = xGrid.value?.getGridInstance()
374
+ if ($grid) {
375
+ $grid.loadData(newRows.map((row) => {
376
+ return {
377
+ ...row,
378
+ checkbox: `${row.operationType}-${row[rowId]}`,
379
+ }
380
+ }))
381
+ }
382
+ loading.value = false
383
+ })
384
+ }, 100)
385
+ return
386
+ }
387
+ }
388
+ catch {
389
+
390
+ }
391
+ }
392
+ loading.value = false
393
+ }
394
+
395
+ async function afterLoad({ data }) {
396
+ if (!detailInfo.value[getId('pcContractMainId')]) {
397
+ return
398
+ }
399
+ if (!data.length) {
400
+ showPartyFlag.value = false
401
+ }
402
+ if (!showPartyFlag.value) {
403
+ return
404
+ }
405
+ if (diffable.value) {
406
+ getDiffData(data, 'pcContractPartyId')
407
+ }
408
+ return
409
+ if (isInit.value) {
410
+ return
411
+ }
412
+ if (!data.length) {
413
+ nextTick(async () => {
414
+ const formData = {
415
+ tradePropertyCode: '',
416
+ supplierCreditFlag: '',
417
+ }
418
+ try {
419
+ await saveDetail(formData, false)
420
+ const detailData = await fetchDetailInfo({
421
+ id: detailInfo.value[getId('pcContractMainId')],
422
+ }, false)
423
+ const newData = (detailData && detailData[0]) || {}
424
+ console.log('newDetailInfo', newData)
425
+ updateDetailInfo(newData)
426
+ baseModule.value?.updateFormData?.(formData)
427
+ }
428
+ catch {
429
+
430
+ }
431
+ })
432
+ return
433
+ }
434
+ Promise.allSettled([
435
+ getTradePropertyCode(data),
436
+ getSupplierCreditFlag(data),
437
+ ]).then((results) => {
438
+ const fields = [] as any
439
+ const tradePropertyCodeResult = results[0]
440
+ const tradePropertyCodeStatus = tradePropertyCodeResult && tradePropertyCodeResult.status === 'fulfilled'
441
+ if (tradePropertyCodeStatus) {
442
+ fields.push({
443
+ field: 'tradePropertyCode',
444
+ value: tradePropertyCodeResult.value,
445
+ })
446
+ }
447
+ const supplierCreditFlagResult = results[1]
448
+ const supplierCreditFlagStatus = supplierCreditFlagResult && supplierCreditFlagResult.status === 'fulfilled'
449
+ if (supplierCreditFlagStatus) {
450
+ fields.push({
451
+ field: 'supplierCreditFlag',
452
+ value: supplierCreditFlagResult.value,
453
+ })
454
+ }
455
+ if (fields.length) {
456
+ const formData = fields.reduce((ob, item) => {
457
+ ob[item.field] = item.value
458
+ return ob
459
+ }, {})
460
+ nextTick(async () => {
461
+ baseModule.value?.updateFormData?.(formData)
462
+ if (supplierCreditFlagStatus) {
463
+ await nextTick(() => {
464
+ const fullData = getData()
465
+ const payment = fullData.explain?.pay?.payment
466
+ Object.assign(formData, payment)
467
+ })
468
+ }
469
+ try {
470
+ await saveDetail(formData, false)
471
+ const detailData = await fetchDetailInfo({
472
+ id: detailInfo.value[getId('pcContractMainId')],
473
+ }, false)
474
+ const newData = (detailData && detailData[0]) || {}
475
+ console.log('newDetailInfo', newData)
476
+ updateDetailInfo(newData)
477
+ }
478
+ catch {
479
+
480
+ }
481
+ })
482
+ }
483
+ })
484
+ }
485
+
486
+ const gridEvents = reactive({
487
+ toolbarButtonClick: ({ code, $grid }) => {
488
+ switch (code) {
489
+ case 'DELETE_PARTY_SIGN':
490
+ handleDelete($grid)
491
+ break
492
+ }
493
+ },
494
+ })
495
+
496
+ function btnClick({ code }) {
497
+ if (code === 'ADD_PARTY_SIGN') {
498
+ handleAdd()
499
+ }
500
+ else if (code === 'HONEST_PROTOCOL') {
501
+ const path = ['UMUC07', decodeURIComponent(Qs.stringify({
502
+ 'inqu_status-0-corpName': majorFormData.value?.partyName || majorFormData.value?.partyNameEn || '',
503
+ 'inqu_status-0-corpGroupCode': majorFormData.value?.partyGroupCode || '',
504
+ 'inqu_status-0-ucCorpId': majorFormData.value?.partyCorpId || '',
505
+ }))].join('?')
506
+ openV6Page(`${import.meta.env.VITE_EPLAT_TO_URL}${path}`)
507
+ }
508
+ }
509
+
510
+ const { openDialog } = useDialog()
511
+
512
+ // 新增操作
513
+ function handleAdd() {
514
+ if (!detailInfo.value[getId('pcContractMainId')]) {
515
+ return ElMessage.warning('请先保存合同信息!')
516
+ }
517
+ openDialog(PMPC9703, {
518
+ title: '客商信息',
519
+ pageId: 'PMPC9703',
520
+ componentParam: {
521
+ baseInfo: baseModuleFormData.value,
522
+ getId,
523
+ formParams: {
524
+ isSign: 'Y',
525
+ },
526
+ otherInfo: {
527
+ isCorrecteOrChange: isCorrecteOrChange.value,
528
+ },
529
+ signable: true,
530
+ editMode: 'add',
531
+ },
532
+ }, async (data, exposed) => {
533
+ try {
534
+ await sendService({
535
+ serviceName: 'PMPC9703',
536
+ methodName: 'insertWithoutValidation',
537
+ eiBlocks: [
538
+ createEiBlock({
539
+ ...data,
540
+ isSign: 'Y',
541
+ pcContractMainId: detailInfo.value.pcContractMainId,
542
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
543
+ businessType: businessType.value,
544
+ }, 'inqu_status'),
545
+ ],
546
+ })
547
+ exposed.close()
548
+ ElMessage.success('新增成功')
549
+ refresh()
550
+ }
551
+ catch {
552
+
553
+ }
554
+ })
555
+ }
556
+
557
+ // 删除
558
+ async function handleDelete($grid) {
559
+ if (!detailInfo.value[getId('pcContractMainId')]) {
560
+ return ElMessage.warning('请先保存合同信息!')
561
+ }
562
+ const checkboxRecords = $grid.getCheckboxRecords()
563
+ if (!checkboxRecords.length) {
564
+ ElMessage.warning(`请选中一条数据`)
565
+ return
566
+ }
567
+ const majorParty = checkboxRecords.find(row => row.isMajor === 'Y')
568
+ if (majorParty) {
569
+ const partyName = majorParty.partyName || majorParty.partyNameEn || ''
570
+ if (partyName) {
571
+ ElMessage.warning(`主客商【${partyName}】不允许删除`)
572
+ }
573
+ else {
574
+ ElMessage.warning(`主客商不允许删除`)
575
+ }
576
+ return
577
+ }
578
+ try {
579
+ await ElMessageBox.confirm(`确定要删除吗?`)
580
+ const rows = checkboxRecords.filter((row) => {
581
+ return !isEmpty(row[getId('pcContractPartyId')])
582
+ })
583
+ if (rows.length) {
584
+ await sendService({
585
+ serviceName: isCorrecteOrChange.value ? 'PMPC0102' : 'PMPC0101',
586
+ methodName: 'deleteContractParty',
587
+ eiBlocks: [
588
+ createEiBlock(rows.map((item) => {
589
+ return {
590
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
591
+ [getId('pcContractPartyId')]: item[getId('pcContractPartyId')],
592
+ }
593
+ }), 'result_1'),
594
+ ],
595
+ })
596
+ ElMessage.success('删除成功')
597
+ refresh()
598
+ }
599
+ else {
600
+ $grid.removeCheckboxRow()
601
+ }
602
+ }
603
+ catch {
604
+
605
+ }
606
+ }
607
+
608
+ // 编辑
609
+ async function handleEdit(row) {
610
+ try {
611
+ const data = await sendService({
612
+ serviceName: 'PMPC9703',
613
+ methodName: isCorrecteOrChange.value ? 'detailForCompare' : 'detail',
614
+ eiBlocks: [
615
+ createEiBlock({
616
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
617
+ pcContractPartyId: row.pcContractPartyId,
618
+ [getId('pcContractPartyId')]: row[getId('pcContractPartyId')],
619
+ businessType: businessType.value,
620
+ }, 'inqu_status'),
621
+ ],
622
+ blockName: 'inqu_status,inqu_status2',
623
+ })
624
+ const rowData = data && (data as any).inqu_status
625
+ const newData = (rowData && rowData[0]) || {}
626
+ console.log('newData', newData)
627
+ const diffInfo = ref({}) as any
628
+ if (diffable.value) {
629
+ const diffData = data && (data as any).inqu_status2
630
+ diffInfo.value = compareData((diffData && diffData[0]) || {}, newData)
631
+ }
632
+ openDialog(PMPC9703, {
633
+ title: '客商信息',
634
+ pageId: 'PMPC9703',
635
+ componentParam: {
636
+ editable: editable.value && !(diffable.value && row.diffable),
637
+ diffable: diffable.value,
638
+ formParams: newData,
639
+ baseInfo: baseModuleFormData.value,
640
+ diffInfo: diffInfo.value,
641
+ getId,
642
+ otherInfo: {
643
+ hedgingFlag: hedgingFlag.value && !isCorrecteOrChange.value && row.isMajor === 'Y',
644
+ isCorrecteOrChange: isCorrecteOrChange.value,
645
+ },
646
+ signable: true,
647
+ editMode: 'edit',
648
+ },
649
+ }, async (data, exposed) => {
650
+ try {
651
+ await sendService({
652
+ serviceName: 'PMPC9703',
653
+ methodName: 'update',
654
+ eiBlocks: [
655
+ createEiBlock({
656
+ ...newData,
657
+ ...data,
658
+ pcContractMainId: detailInfo.value.pcContractMainId,
659
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
660
+ businessType: businessType.value,
661
+ }, 'inqu_status'),
662
+ ],
663
+ })
664
+ exposed.close()
665
+ ElMessage.success('更新成功')
666
+ refresh()
667
+ }
668
+ catch {
669
+
670
+ }
671
+ })
672
+ }
673
+ catch {
674
+
675
+ }
676
+ }
677
+
678
+ async function getPartyFlag() {
679
+ try {
680
+ const params = {
681
+ pcContractMainId: detailInfo.value.pcContractMainId,
682
+ [getId('pcContractMainId')]: detailInfo.value[getId('pcContractMainId')],
683
+ isSign: 'Y',
684
+ majorExcludeFlag: 'N',
685
+ } as any
686
+ if (isFirstVersion.value) {
687
+ params.operateType = '10'
688
+ }
689
+ const partyList = await sendService({
690
+ serviceName: isCorrecteOrChange.value ? 'PMPC9703' : isFirstVersion.value ? 'PMPC0102' : 'PMPC0101',
691
+ methodName: isCorrecteOrChange.value ? 'queryContractPartyCompareForVue' : 'queryContractParty',
692
+ loading: false,
693
+ eiBlocks: [
694
+ createEiBlock(params, 'inqu_status'),
695
+ ],
696
+ blockName: 'result_1',
697
+ }) as any[]
698
+ console.log('partyList', partyList)
699
+ showPartyFlag.value = !!partyList.length
700
+ return
701
+ }
702
+ catch {
703
+
704
+ }
705
+ showPartyFlag.value = false
706
+ }
707
+
708
+ watch([
709
+ () => editable.value,
710
+ () => showPartyFlag.value,
711
+ () => isCorrecteOrChange.value,
712
+ () => addable.value,
713
+ ], () => {
714
+ nextTick(() => {
715
+ xGrid.value?.btnSetDisable(['DELETE_PARTY_SIGN'], isCorrecteOrChange.value || !editable.value)
716
+ xGrid.value?.btnSetVisible(['ADD_PARTY', 'DELETE_PARTY'], false)
717
+ container.value?.btnSetDisable(['ADD_PARTY_SIGN'], isCorrecteOrChange.value || !editable.value)
718
+ container.value?.btnSetVisible(['HONEST_PROTOCOL'], !addable.value)
719
+ })
720
+ }, {
721
+ immediate: true,
722
+ })
723
+
724
+ onMounted(() => {
725
+ if (autoLoad.value) {
726
+ getPartyFlag()
727
+ }
728
+ })
729
+
730
+ defineExpose({
731
+ reload,
732
+ validator: handleValidator,
733
+ major,
734
+ getData: () => major.value.getData(),
735
+ })
736
+ </script>
737
+
738
+ <style scoped></style>