@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,123 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-07-22 15:57:39
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-08-27 21:28:31
6
+ */
7
+ import { computed, inject, reactive, toValue } from 'vue'
8
+ import type { EiInfo } from '@eplat/ei'
9
+ import type { Ref } from 'vue'
10
+ import { merge } from 'xe-utils'
11
+ import { useForm } from '@/hooks/useForm'
12
+ import { isEmpty } from '@/utils/is'
13
+
14
+ export function createFormConfig() {
15
+ const { commonVxeInput, commonVxeTextarea, commonFormSelect, commonVxeDatePicker, createFormRules, validator, validateField, getFormData } = useForm()
16
+
17
+ const { detailInfo, businessType, fileCount } = inject('__PMPC0101__info__') as any
18
+
19
+ const initLoadEiInfo = toValue(inject<Ref<EiInfo> | undefined>('__eiInfo__', undefined))
20
+ // console.log('initLoadEiInfo',initLoadEiInfo)
21
+
22
+ const jyzzControl = initLoadEiInfo?.get('jyzzControl')
23
+
24
+ const defaultData = {
25
+ operateType: businessType.value,
26
+ }
27
+
28
+ const formData = reactive(merge({
29
+ pcContractMainId: '',
30
+ pcContractMainHisId: '',
31
+ operateType: '',
32
+ changePersonName: '',
33
+ changeDate: '',
34
+ changeAgreementNo: '',
35
+ isChangeLegalTerms: '',
36
+ changeDesc: '',
37
+ }, defaultData, detailInfo.value, {
38
+ fileCount: fileCount.value,
39
+ }))
40
+
41
+ const baseFields = computed(() => {
42
+ return [
43
+ {
44
+ field: 'operateType',
45
+ title: '操作类型',
46
+ itemRender: commonFormSelect('brmerp.pm.operateType', {
47
+ disabled: true,
48
+ }),
49
+ },
50
+ {
51
+ field: 'changePersonName',
52
+ title: '变更人',
53
+ visibleMethod: ({ data }) => !isEmpty(data.pcContractMainHisId),
54
+ itemRender: commonVxeInput({
55
+ disabled: true,
56
+ }),
57
+ },
58
+ {
59
+ field: 'changeDate',
60
+ title: '变更时间',
61
+ visibleMethod: ({ data }) => !isEmpty(data.pcContractMainHisId),
62
+ itemRender: commonVxeDatePicker({
63
+ type: 'datetime',
64
+ valueFormat: 'yyyy-MM-dd HH:mm:ss',
65
+ labelFormat: 'yyyy-MM-dd HH:mm:ss',
66
+ disabled: true,
67
+ }),
68
+ },
69
+ {
70
+ field: 'changeAgreementNo',
71
+ title: '变更协议号',
72
+ itemRender: commonVxeInput(),
73
+ },
74
+ {
75
+ field: 'isChangeLegalTerms',
76
+ title: '法务条款变更',
77
+ visibleMethod: () => ['0', '1'].includes(jyzzControl),
78
+ itemRender: commonFormSelect('brmerp.bm.yesOrNo'),
79
+ required: ['1'].includes(jyzzControl),
80
+ },
81
+ {
82
+ field: 'fileCount',
83
+ title: '附件信息',
84
+ slots: {
85
+ default: 'fileCount_default',
86
+ },
87
+ visibleMethod: () => !isEmpty(formData.pcContractMainHisId),
88
+ },
89
+ {
90
+ field: 'changeDesc',
91
+ title: '变更说明',
92
+ itemRender: commonVxeTextarea(5),
93
+ span: 24,
94
+ required: true,
95
+ },
96
+ ]
97
+ })
98
+
99
+ const getData = () => {
100
+ const data = getFormData(baseFields.value, formData)
101
+ data.pcContractMainHisId = formData.pcContractMainHisId
102
+ data.pcContractMainId = formData.pcContractMainId
103
+ delete data.fileCount
104
+ return data
105
+ }
106
+
107
+ const formRules = computed(() => createFormRules(baseFields.value))
108
+
109
+ const formConfig = reactive({
110
+ data: formData,
111
+ items: baseFields,
112
+ titleWidth: 170,
113
+ rules: formRules,
114
+ })
115
+
116
+ return {
117
+ formData,
118
+ getData,
119
+ formConfig,
120
+ validator,
121
+ validateField,
122
+ }
123
+ }
@@ -0,0 +1,103 @@
1
+ <!--
2
+ * @Author: 谢力
3
+ * @Date: 2025-07-22 15:57:39
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-10-20 17:30:12
6
+ -->
7
+ <template>
8
+ <BxRoundedContainer>
9
+ <BxContainer title="变更信息">
10
+ <VxePlusForm
11
+ ref="xForm"
12
+ :disabled="!editable"
13
+ :title-asterisk="editable"
14
+ :form-options="formConfig"
15
+ >
16
+ <template #fileCount_default="{ data }">
17
+ <div class="flex-row align-center-row">
18
+ <el-button type="primary" @click="handleUpload">
19
+ 附件管理
20
+ </el-button>
21
+ <span class="font16 ml10 red bold">附件个数:{{ data.fileCount }}</span>
22
+ </div>
23
+ </template>
24
+ </VxePlusForm>
25
+ </BxContainer>
26
+ </BxRoundedContainer>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import { computed, inject, ref } from 'vue'
31
+ import type { Ref } from 'vue'
32
+ import { ElMessage } from 'element-plus'
33
+ import { createFormConfig } from './formConfig'
34
+ import { useFileUpload } from '@/hooks/useFileUpload'
35
+
36
+ const xForm = ref<any>(null)
37
+
38
+ const { editable, detailInfo, fileCount, foreignFlag } = inject('__PMPC0101__info__') as any
39
+
40
+ const { getId } = inject('__PMPC0101__method__') as any
41
+
42
+ const { main: mainModule } = inject('__PMPC0101__module__') as { main: Ref }
43
+
44
+ const baseModule = computed(() => mainModule?.value?.base)
45
+
46
+ const baseModuleFormData = computed(() => baseModule?.value?.formData)
47
+
48
+ const { formData, getData, formConfig, validator } = createFormConfig()
49
+
50
+ const { openFileBFSS0001 } = useFileUpload()
51
+
52
+ function handleUpload() {
53
+ if (!detailInfo.value[getId('pcContractMainId')]) {
54
+ return ElMessage.warning('请先保存变更信息!')
55
+ }
56
+ if (editable.value && foreignFlag.value && !detailInfo.value.pcContractCode) {
57
+ return ElMessage.warning('请先生成合同号!')
58
+ }
59
+ const bizTypeCode = editable.value ? 'PM_CONTRACT_PROPOSE' : 'PM_CONTRACT_PROPOSE,PM_CONTRACT_FORMAL,PM_CONTRACT_CORRECT,PM_CONTRACT_END'
60
+ const flag = editable.value ? 'operate' : 'view'
61
+ const bizBillId = detailInfo.value.pcContractMainId
62
+ const bizBillCode = detailInfo.value.pcContractCode
63
+ const bizBillVersion = detailInfo.value.contractVersion
64
+ const bookId = detailInfo.value.bookId
65
+ const verFlag = editable.value ? 'Y' : 'N'
66
+ const fileTypeCode = ''
67
+ openFileBFSS0001({
68
+ bizTypeCode,
69
+ contractId: bizBillId,
70
+ bizBillId,
71
+ bizBillCode,
72
+ bizBillVersion,
73
+ fileTypeCode,
74
+ flag,
75
+ bookId,
76
+ verFlag,
77
+ data: baseModuleFormData.value,
78
+ editable: editable.value,
79
+ cb: ({ total }) => {
80
+ formData.fileCount = total
81
+ },
82
+ })
83
+ }
84
+
85
+ function handleValidator(flag: boolean = true) {
86
+ return validator(xForm, flag)
87
+ }
88
+
89
+ function updateFormData(data) {
90
+ Object.assign(formData, data, {
91
+ fileCount: fileCount.value,
92
+ })
93
+ }
94
+
95
+ defineExpose({
96
+ formData,
97
+ getData,
98
+ validator: handleValidator,
99
+ updateFormData,
100
+ })
101
+ </script>
102
+
103
+ <style scoped></style>
@@ -0,0 +1,48 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-06-26 15:30:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-09-11 14:04:33
6
+ */
7
+ import { computed } from 'vue'
8
+ import { useTable } from '@/hooks/useTable'
9
+
10
+ export function createTableColumns() {
11
+ const { createColumns, commonVxeInput, createEditRules, validator } = useTable()
12
+
13
+ const columns = computed(() => {
14
+ return createColumns([
15
+ // {
16
+ // type: 'seq',
17
+ // width: 60,
18
+ // },
19
+ {
20
+ field: 'originClauseContent',
21
+ title: '原条款内容',
22
+ editRender: commonVxeInput(),
23
+ required: true,
24
+ },
25
+ {
26
+ field: 'changedClauseContent',
27
+ title: '变更后条款内容',
28
+ editRender: commonVxeInput(),
29
+ required: true,
30
+ },
31
+ ].map((col) => {
32
+ return {
33
+ ...col,
34
+ width: (col as any).width ?? '',
35
+ } as any
36
+ })).value
37
+ })
38
+
39
+ const tableValidator = (...args: any[]) => {
40
+ return (validator as any)(...args)
41
+ }
42
+
43
+ return {
44
+ columns,
45
+ editRules: computed(() => createEditRules(columns.value)),
46
+ tableValidator,
47
+ }
48
+ }
@@ -0,0 +1,202 @@
1
+ <template>
2
+ <BxRoundedContainer>
3
+ <BxContainer title="非标合同文本变更">
4
+ <VxePlusTable
5
+ :id="tablePageId"
6
+ ref="xGrid"
7
+ class="pb0"
8
+ :auto-load="autoLoad"
9
+ :columns="columns"
10
+ :show-checkbox="editable"
11
+ :is-edit="editable"
12
+ :edit-rules="editRules"
13
+ :left-buttons="['ADD_CLAUSE']"
14
+ :service-config="serviceConfig"
15
+ :transform-params="transformParams"
16
+ :virtual-x-config="{ enabled: false }"
17
+ :virtual-y-config="{ enabled: false }"
18
+ :checkbox-config="{
19
+ visibleMethod: ({ row }) => !(diffable && row.diffable),
20
+ checkMethod: ({ row }) => !(diffable && row.diffable),
21
+ }"
22
+ :before-edit-method="({ row }) => editable && !(diffable && row.diffable)"
23
+ min-height="179px"
24
+ max-height="403px"
25
+ v-on="gridEvents"
26
+ />
27
+ </BxContainer>
28
+ </BxRoundedContainer>
29
+ </template>
30
+
31
+ <script setup lang="ts">
32
+ import { computed, inject, nextTick, reactive, ref, watch } from 'vue'
33
+ import { ElMessage, ElMessageBox } from 'element-plus'
34
+ import { createTableColumns } from './columns'
35
+ import { createEiBlock, sendService } from '@/utils/eiTools'
36
+ import { isEmpty } from '@/utils/is'
37
+
38
+ const xGrid = ref<any>(null)
39
+
40
+ const { editable, detailInfo, diffable, pageId } = inject('__PMPC0101__info__') as any
41
+
42
+ const { getId } = inject('__PMPC0101__method__') as any
43
+
44
+ const { columns, editRules, tableValidator } = createTableColumns() as any
45
+
46
+ const autoLoad = computed(() => !!detailInfo.value[getId('pcContractMainId')])
47
+
48
+ const tablePageId = computed(() => `${pageId.value}_resultClause`)
49
+
50
+ function getTableData() {
51
+ const $grid = xGrid.value.getGridInstance()
52
+ const { tableData } = $grid.getTableData()
53
+ if (diffable.value) {
54
+ return tableData.filter(row => !row.diffable)
55
+ }
56
+ return tableData
57
+ }
58
+
59
+ async function handleValidator(flag?) {
60
+ try {
61
+ await tableValidator(xGrid, flag ?? diffable.value ? getTableData() : true)
62
+ return Promise.resolve(true)
63
+ }
64
+ catch (error) {
65
+ return Promise.reject(error)
66
+ }
67
+ }
68
+
69
+ function reload() {
70
+ xGrid.value.reload()
71
+ }
72
+
73
+ const serviceConfig = reactive({
74
+ serviceName: 'ACAT30',
75
+ queryMethod: 'query',
76
+ })
77
+
78
+ function transformParams(formEi) {
79
+ formEi.set(`inqu_status-0-pcContractMainHisId`, detailInfo.value.pcContractMainHisId)
80
+ return formEi
81
+ }
82
+
83
+ const gridEvents = reactive({
84
+ toolbarButtonClick: ({ code, $grid }) => {
85
+ switch (code) {
86
+ case 'ADD_CLAUSE':
87
+ handleAdd($grid)
88
+ break
89
+ case 'DEL_CLAUSE':
90
+ handleDelete($grid)
91
+ break
92
+ case 'SAVE_CLAUSE':
93
+ handleSave()
94
+ break
95
+ }
96
+ },
97
+ })
98
+
99
+ // 新增操作
100
+ async function handleAdd($grid) {
101
+ if (!detailInfo.value[getId('pcContractMainId')]) {
102
+ return ElMessage.warning('请先保存合同信息!')
103
+ }
104
+ const checkedRows = [
105
+ {
106
+ [getId('nonstandardClauseChangeId')]: '',
107
+ originClauseContent: '',
108
+ changedClauseContent: '',
109
+ },
110
+ ]
111
+ const { rows: newRows } = await $grid.insertAt(checkedRows)
112
+ $grid.setEditRow(newRows[newRows.length - 1])
113
+ }
114
+
115
+ // 删除
116
+ async function handleDelete($grid) {
117
+ if (!detailInfo.value[getId('pcContractMainId')]) {
118
+ return ElMessage.warning('请先保存合同信息!')
119
+ }
120
+ const checkboxRecords = $grid.getCheckboxRecords()
121
+ if (!checkboxRecords.length) {
122
+ ElMessage.warning(`请选中一条数据`)
123
+ return
124
+ }
125
+ try {
126
+ await ElMessageBox.confirm(`确定要删除吗?`)
127
+ const rows = checkboxRecords.filter((row) => {
128
+ return !isEmpty(row[getId('nonstandardClauseChangeId')])
129
+ })
130
+ if (rows.length) {
131
+ await sendService({
132
+ serviceName: 'ACAT30',
133
+ methodName: 'delete',
134
+ eiBlocks: [
135
+ createEiBlock(rows.map((item) => {
136
+ return {
137
+ [getId('nonstandardClauseChangeId')]: item[getId('nonstandardClauseChangeId')],
138
+ }
139
+ }), 'resultClause'),
140
+ ],
141
+ })
142
+ ElMessage.success('删除成功')
143
+ reload()
144
+ }
145
+ else {
146
+ $grid.removeCheckboxRow()
147
+ }
148
+ }
149
+ catch {
150
+
151
+ }
152
+ }
153
+
154
+ // 保存
155
+ async function handleSave() {
156
+ if (!detailInfo.value[getId('pcContractMainId')]) {
157
+ return ElMessage.warning('请先保存合同信息!')
158
+ }
159
+ const tableData = getTableData()
160
+ if (!tableData.length) {
161
+ return ElMessage.warning('至少需要1条明细数据')
162
+ }
163
+ try {
164
+ await handleValidator()
165
+ await sendService({
166
+ serviceName: 'ACAT30',
167
+ methodName: 'saveInfo',
168
+ eiBlocks: [
169
+ createEiBlock(tableData.map((item) => {
170
+ return {
171
+ ...item,
172
+ contractMainHisId: detailInfo.value.pcContractMainHisId,
173
+ contractMainId: detailInfo.value.pcContractMainId,
174
+ contractCode: detailInfo.value.pcContractCode,
175
+ contractType: 'PC',
176
+ }
177
+ }), 'resultClause'),
178
+ ],
179
+ })
180
+ ElMessage.success('保存成功')
181
+ reload()
182
+ }
183
+ catch {
184
+
185
+ }
186
+ }
187
+
188
+ watch(() => editable.value, () => {
189
+ nextTick(() => {
190
+ xGrid.value?.btnSetDisable(['ADD_CLAUSE', 'DEL_CLAUSE', 'SAVE_CLAUSE'], !editable.value)
191
+ })
192
+ }, {
193
+ immediate: true,
194
+ })
195
+
196
+ defineExpose({
197
+ reload,
198
+ validator: handleValidator,
199
+ })
200
+ </script>
201
+
202
+ <style scoped></style>
@@ -0,0 +1,117 @@
1
+ /*
2
+ * @Author: 谢力
3
+ * @Date: 2025-07-22 15:57:39
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-08-08 14:36:40
6
+ */
7
+ import { computed, inject, reactive, toValue } from 'vue'
8
+ import type { EiInfo } from '@eplat/ei'
9
+ import type { Ref } from 'vue'
10
+ import { merge } from 'xe-utils'
11
+ import { useForm } from '@/hooks/useForm'
12
+ import { isEmpty } from '@/utils/is'
13
+
14
+ export function createFormConfig() {
15
+ const { commonVxeInput, commonVxeTextarea, commonFormSelect, commonVxeDatePicker, createFormRules, validator, validateField, getFormData } = useForm()
16
+
17
+ const { detailInfo, businessType, fileCount } = inject('__PMPC0101__info__') as any
18
+
19
+ const initLoadEiInfo = toValue(inject<Ref<EiInfo> | undefined>('__eiInfo__', undefined))
20
+ // console.log('initLoadEiInfo',initLoadEiInfo)
21
+
22
+ const jyzzControl = initLoadEiInfo?.get('jyzzControl')
23
+
24
+ const defaultData = {
25
+ operateType: businessType.value,
26
+ }
27
+
28
+ const formData = reactive(merge({
29
+ pcContractMainId: '',
30
+ pcContractMainHisId: '',
31
+ operateType: '',
32
+ revisePersonName: '',
33
+ reviseDate: '',
34
+ isChangeLegalTerms: '',
35
+ reviseDesc: '',
36
+ }, defaultData, detailInfo.value, {
37
+ fileCount: fileCount.value,
38
+ }))
39
+
40
+ const baseFields = computed(() => {
41
+ return [
42
+ {
43
+ field: 'operateType',
44
+ title: '操作类型',
45
+ itemRender: commonFormSelect('brmerp.pm.operateType', {
46
+ disabled: true,
47
+ }),
48
+ },
49
+ {
50
+ field: 'revisePersonName',
51
+ title: '修正人',
52
+ visibleMethod: ({ data }) => !isEmpty(data.pcContractMainHisId),
53
+ itemRender: commonVxeInput({
54
+ disabled: true,
55
+ }),
56
+ },
57
+ {
58
+ field: 'reviseDate',
59
+ title: '修正时间',
60
+ visibleMethod: ({ data }) => !isEmpty(data.pcContractMainHisId),
61
+ itemRender: commonVxeDatePicker({
62
+ type: 'datetime',
63
+ valueFormat: 'yyyy-MM-dd HH:mm:ss',
64
+ labelFormat: 'yyyy-MM-dd HH:mm:ss',
65
+ disabled: true,
66
+ }),
67
+ },
68
+ {
69
+ field: 'isChangeLegalTerms',
70
+ title: '法务条款变更',
71
+ visibleMethod: () => ['0', '1'].includes(jyzzControl),
72
+ itemRender: commonFormSelect('brmerp.bm.yesOrNo'),
73
+ required: ['1'].includes(jyzzControl),
74
+ },
75
+ {
76
+ field: 'fileCount',
77
+ title: '附件信息',
78
+ slots: {
79
+ default: 'fileCount_default',
80
+ },
81
+ visibleMethod: () => !isEmpty(formData.pcContractMainHisId),
82
+ },
83
+ {
84
+ field: 'reviseDesc',
85
+ title: '修正说明',
86
+ itemRender: commonVxeTextarea(5),
87
+ span: 24,
88
+ required: true,
89
+ },
90
+ ]
91
+ })
92
+
93
+ const getData = () => {
94
+ const data = getFormData(baseFields.value, formData)
95
+ data.pcContractMainHisId = formData.pcContractMainHisId
96
+ data.pcContractMainId = formData.pcContractMainId
97
+ delete data.fileCount
98
+ return data
99
+ }
100
+
101
+ const formRules = computed(() => createFormRules(baseFields.value))
102
+
103
+ const formConfig = reactive({
104
+ data: formData,
105
+ items: baseFields,
106
+ titleWidth: 170,
107
+ rules: formRules,
108
+ })
109
+
110
+ return {
111
+ formData,
112
+ getData,
113
+ formConfig,
114
+ validator,
115
+ validateField,
116
+ }
117
+ }
@@ -0,0 +1,103 @@
1
+ <!--
2
+ * @Author: 谢力
3
+ * @Date: 2025-07-22 15:57:39
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-10-20 17:30:07
6
+ -->
7
+ <template>
8
+ <BxRoundedContainer>
9
+ <BxContainer title="修正信息">
10
+ <VxePlusForm
11
+ ref="xForm"
12
+ :disabled="!editable"
13
+ :title-asterisk="editable"
14
+ :form-options="formConfig"
15
+ >
16
+ <template #fileCount_default="{ data }">
17
+ <div class="flex-row align-center-row">
18
+ <el-button type="primary" @click="handleUpload">
19
+ 附件管理
20
+ </el-button>
21
+ <span class="font16 ml10 red bold">附件个数:{{ data.fileCount }}</span>
22
+ </div>
23
+ </template>
24
+ </VxePlusForm>
25
+ </BxContainer>
26
+ </BxRoundedContainer>
27
+ </template>
28
+
29
+ <script setup lang="ts">
30
+ import { computed, inject, ref } from 'vue'
31
+ import type { Ref } from 'vue'
32
+ import { ElMessage } from 'element-plus'
33
+ import { createFormConfig } from './formConfig'
34
+ import { useFileUpload } from '@/hooks/useFileUpload'
35
+
36
+ const xForm = ref<any>(null)
37
+
38
+ const { editable, detailInfo, fileCount, foreignFlag } = inject('__PMPC0101__info__') as any
39
+
40
+ const { getId } = inject('__PMPC0101__method__') as any
41
+
42
+ const { main: mainModule } = inject('__PMPC0101__module__') as { main: Ref }
43
+
44
+ const baseModule = computed(() => mainModule?.value?.base)
45
+
46
+ const baseModuleFormData = computed(() => baseModule?.value?.formData)
47
+
48
+ const { formData, getData, formConfig, validator } = createFormConfig()
49
+
50
+ const { openFileBFSS0001 } = useFileUpload()
51
+
52
+ function handleUpload() {
53
+ if (!detailInfo.value[getId('pcContractMainId')]) {
54
+ return ElMessage.warning('请先保存修正信息!')
55
+ }
56
+ if (editable.value && foreignFlag.value && !detailInfo.value.pcContractCode) {
57
+ return ElMessage.warning('请先生成合同号!')
58
+ }
59
+ const bizTypeCode = editable.value ? 'PM_CONTRACT_CORRECT' : 'PM_CONTRACT_PROPOSE,PM_CONTRACT_FORMAL,PM_CONTRACT_CORRECT,PM_CONTRACT_END'
60
+ const flag = editable.value ? 'operate' : 'view'
61
+ const bizBillId = detailInfo.value.pcContractMainId
62
+ const bizBillCode = detailInfo.value.pcContractCode
63
+ const bizBillVersion = detailInfo.value.contractVersion
64
+ const bookId = detailInfo.value.bookId
65
+ const verFlag = editable.value ? 'Y' : 'N'
66
+ const fileTypeCode = ''
67
+ openFileBFSS0001({
68
+ bizTypeCode,
69
+ contractId: bizBillId,
70
+ bizBillId,
71
+ bizBillCode,
72
+ bizBillVersion,
73
+ fileTypeCode,
74
+ flag,
75
+ bookId,
76
+ verFlag,
77
+ data: baseModuleFormData.value,
78
+ editable: editable.value,
79
+ cb: ({ total }) => {
80
+ formData.fileCount = total
81
+ },
82
+ })
83
+ }
84
+
85
+ function handleValidator(flag: boolean = true) {
86
+ return validator(xForm, flag)
87
+ }
88
+
89
+ function updateFormData(data) {
90
+ Object.assign(formData, data, {
91
+ fileCount: fileCount.value,
92
+ })
93
+ }
94
+
95
+ defineExpose({
96
+ formData,
97
+ getData,
98
+ validator: handleValidator,
99
+ updateFormData,
100
+ })
101
+ </script>
102
+
103
+ <style scoped></style>