vue2-client 1.15.61 → 1.15.63

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 (134) hide show
  1. package/package.json +110 -110
  2. package/src/base-client/components/common/XButtons/XButtons.vue +3 -12
  3. package/src/base-client/components/his/XTextCard/XTextCard.vue +207 -207
  4. package/src/base-client/components/his/threeTestOrders/editor.vue +111 -111
  5. package/src/components/FileImageItem/FileItem.vue +321 -305
  6. package/src/pages/WorkflowDetail/WorkflowDetail.vue +391 -379
  7. package/src/pages/WorkflowDetail/WorkflowPageDetail/worklog.vue +97 -0
  8. package/.history/public/his/editor/editor_20250606134713.html +0 -51
  9. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527173925.vue +0 -509
  10. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174316.vue +0 -524
  11. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174419.vue +0 -524
  12. package/.history/src/base-client/components/common/AddressSearchCombobox/AddressSearchCombobox_20250527174422.vue +0 -524
  13. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172825.vue +0 -207
  14. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172945.vue +0 -211
  15. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611172949.vue +0 -212
  16. package/.history/src/base-client/components/common/XAddReport/XAddReport_20250611173010.vue +0 -212
  17. package/.history/src/base-client/components/common/XForm/XFormItem_20250508134122.vue +0 -1320
  18. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171604.vue +0 -1332
  19. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171613.vue +0 -1331
  20. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171703.vue +0 -1331
  21. package/.history/src/base-client/components/common/XForm/XFormItem_20250527171720.vue +0 -1331
  22. package/.history/src/base-client/components/common/XForm/XFormItem_20250527174327.vue +0 -1339
  23. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612092804.vue +0 -731
  24. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612112546.vue +0 -748
  25. package/.history/src/base-client/components/common/XReportGrid/XReportTrGroup_20250612113808.vue +0 -748
  26. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115237.vue +0 -1071
  27. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115346.vue +0 -1078
  28. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115350.vue +0 -1077
  29. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115415.vue +0 -1077
  30. package/.history/src/base-client/components/common/XReportGrid/XReport_20250612115429.vue +0 -1077
  31. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611091619.vue +0 -442
  32. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092547.vue +0 -442
  33. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092552.vue +0 -442
  34. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092744.vue +0 -475
  35. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092955.vue +0 -475
  36. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611092957.vue +0 -475
  37. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095652.vue +0 -477
  38. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095701.vue +0 -477
  39. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611095704.vue +0 -477
  40. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100005.vue +0 -473
  41. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100011.vue +0 -473
  42. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100014.vue +0 -473
  43. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100833.vue +0 -473
  44. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100853.vue +0 -473
  45. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611100940.vue +0 -473
  46. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101011.vue +0 -473
  47. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101013.vue +0 -473
  48. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101014.vue +0 -473
  49. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101159.vue +0 -473
  50. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101238.vue +0 -474
  51. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101240.vue +0 -474
  52. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101242.vue +0 -474
  53. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101404.vue +0 -472
  54. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101410.vue +0 -472
  55. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101459.vue +0 -472
  56. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101500.vue +0 -472
  57. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101502.vue +0 -472
  58. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101504.vue +0 -472
  59. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101610.vue +0 -501
  60. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101700.vue +0 -501
  61. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101702.vue +0 -501
  62. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101741.vue +0 -504
  63. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101749.vue +0 -504
  64. package/.history/src/base-client/components/his/XHisEditor/XHisEditor_20250611101759.vue +0 -504
  65. package/.history/src/base-client/components/his/XHisEditor/dome_20250611091349.vue +0 -131
  66. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105854.vue +0 -160
  67. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105902.vue +0 -160
  68. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105924.vue +0 -160
  69. package/.history/src/base-client/components/his/XHisEditor/dome_20250611105932.vue +0 -158
  70. package/.history/src/base-client/components/his/XList/XList_20250609135848.vue +0 -173
  71. package/.history/src/base-client/components/his/XList/XList_20250609141026.vue +0 -222
  72. package/.history/src/base-client/components/his/XList/XList_20250609141035.vue +0 -229
  73. package/.history/src/base-client/components/his/XList/XList_20250609141103.vue +0 -229
  74. package/.history/src/base-client/components/his/XList/XList_20250609141105.vue +0 -229
  75. package/.history/src/base-client/components/his/XList/XList_20250609141334.vue +0 -241
  76. package/.history/src/base-client/components/his/XList/XList_20250609141404.vue +0 -241
  77. package/.history/src/base-client/components/his/XList/XList_20250609141406.vue +0 -241
  78. package/.history/src/base-client/components/his/XList/XList_20250609141801.vue +0 -245
  79. package/.history/src/base-client/components/his/XList/XList_20250609142033.vue +0 -245
  80. package/.history/src/base-client/components/his/XList/XList_20250609142038.vue +0 -245
  81. package/.history/src/base-client/components/his/XList/XList_20250609142435.vue +0 -255
  82. package/.history/src/base-client/components/his/XList/XList_20250609142503.vue +0 -255
  83. package/.history/src/base-client/components/his/XList/XList_20250609142504.vue +0 -255
  84. package/.history/src/base-client/components/his/XList/XList_20250609143012.vue +0 -270
  85. package/.history/src/base-client/components/his/XList/XList_20250609143044.vue +0 -270
  86. package/.history/src/base-client/components/his/XList/XList_20250609143046.vue +0 -270
  87. package/.history/src/base-client/components/his/XList/XList_20250609143210.vue +0 -270
  88. package/.history/src/base-client/components/his/XList/XList_20250609144339.vue +0 -294
  89. package/.history/src/base-client/components/his/XList/XList_20250609144410.vue +0 -294
  90. package/.history/src/base-client/components/his/XList/XList_20250609144412.vue +0 -294
  91. package/.history/src/base-client/components/his/XList/XList_20250609144647.vue +0 -303
  92. package/.history/src/base-client/components/his/XList/XList_20250609144716.vue +0 -303
  93. package/.history/src/base-client/components/his/XList/XList_20250609144729.vue +0 -303
  94. package/.history/src/base-client/components/his/XList/XList_20250609151232.vue +0 -288
  95. package/.history/src/base-client/components/his/XList/XList_20250609151247.vue +0 -288
  96. package/.history/src/base-client/components/his/XList/XList_20250609151252.vue +0 -288
  97. package/.history/src/base-client/components/his/XList/XList_20250609161220.vue +0 -317
  98. package/.history/src/base-client/components/his/XList/XList_20250609161258.vue +0 -306
  99. package/.history/src/base-client/components/his/XList/XList_20250609161319.vue +0 -306
  100. package/.history/src/base-client/components/his/XList/XList_20250609161320.vue +0 -306
  101. package/.history/src/base-client/components/his/XList/XList_20250704142024.vue +0 -495
  102. package/.history/src/base-client/components/his/XList/XList_20250704142033.vue +0 -495
  103. package/.history/src/base-client/components/his/XList/XList_20250704142040.vue +0 -494
  104. package/.history/src/base-client/components/his/XList/XList_20250704142211.vue +0 -494
  105. package/.history/src/base-client/components/his/XList/XList_20250704142214.vue +0 -494
  106. package/.history/src/base-client/components/his/XList/XList_20250704143010.vue +0 -495
  107. package/.history/src/base-client/components/his/XList/XList_20250704143203.vue +0 -495
  108. package/.history/src/base-client/components/his/XList/XList_20250707095101.vue +0 -492
  109. package/.history/src/base-client/components/his/XList/XList_20250707100152.vue +0 -492
  110. package/.history/src/base-client/components/his/XList/XList_20250707100200.vue +0 -485
  111. package/.history/src/base-client/components/his/XList/XList_20250707100208.vue +0 -485
  112. package/.history/src/base-client/components/his/XList/XList_20250707100259.vue +0 -488
  113. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250609151519.vue +0 -222
  114. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612155514.vue +0 -183
  115. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612155556.vue +0 -183
  116. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612155600.vue +0 -183
  117. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612181609.vue +0 -206
  118. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250612181629.vue +0 -209
  119. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613095553.vue +0 -242
  120. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613095610.vue +0 -242
  121. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613095612.vue +0 -242
  122. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100041.vue +0 -251
  123. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100047.vue +0 -251
  124. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100054.vue +0 -250
  125. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100105.vue +0 -250
  126. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100107.vue +0 -250
  127. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613100114.vue +0 -250
  128. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613140844.vue +0 -238
  129. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613140910.vue +0 -238
  130. package/.history/src/base-client/components/his/XShiftSchedule/XShiftSchedule_20250613140912.vue +0 -238
  131. package/Users/objecrt/af-vue2-client/src/base-client/components/his/XShiftSchedule/XShiftSchedule.vue +0 -36
  132. package/src/base-client/components/TreeList/TreeList.vue +0 -91
  133. package/src/base-client/components/TreeList/TreeNode.vue +0 -81
  134. package/src/base-client/components/common/XCardSet/XTiltle.vue +0 -191
@@ -1,1339 +0,0 @@
1
- <template>
2
- <!-- 输入框 -->
3
- <x-form-col
4
- v-if="attr.type === 'input' && show"
5
- :occupyCol="attr.occupyCol"
6
- :labelCol="labelCol"
7
- :flex="attr.flex">
8
- <a-form-model-item
9
- :rules="rules"
10
- :ref="attr.model"
11
- :label="showLabel?attr.name:undefined"
12
- :prop="attr.prop ? attr.prop : attr.model">
13
- <!-- 如果配置了后置按钮插槽 -->
14
- <a-input-group
15
- v-if="((attr.inputOnAfterName && attr.inputOnAfterFunc) || (attr.inputOnAfterIcon && attr.inputOnAfterIconFunc)) && mode !== '查询'"
16
- style="display: flex; width: 100%; padding: 4px 0"
17
- compact>
18
- <a-input
19
- v-model="form[attr.model]"
20
- :read-only="readOnly"
21
- :disabled="disabled && !readOnly"
22
- :whitespace="true"
23
- @input="attr.dataChangeFunc && debouncedDataChangeFunc()"
24
- :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
25
- @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
26
- @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
27
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
28
- :ref="`${attr.model}input`"/>
29
- <a-button
30
- v-if="attr.inputOnAfterName && attr.inputOnAfterFunc && !attr.inputOnAfterName.includes('|')"
31
- style="width: auto; min-width: 4rem;max-width: 6rem"
32
- type="primary"
33
- @click="emitFunc(attr.inputOnAfterFunc,attr)">
34
- {{ attr.inputOnAfterName }}
35
- </a-button>
36
- <!-- 仅可以配置 一个按钮 以及 一个图标插槽 -->
37
- <a-button
38
- style="width: 2rem; flex-shrink: 0;"
39
- v-else-if="attr.inputOnAfterIcon"
40
- :type="attr.inputOnAfterIcon && attr.inputOnAfterName ? 'primary' :''"
41
- :icon="attr.inputOnAfterIcon || 'question'"
42
- @click="emitFunc(attr.inputOnAfterIconFunc,attr)">
43
- </a-button>
44
- <!-- 状态按钮 -->
45
- <x-status-button
46
- v-else
47
- :states="parseStates(attr.inputOnAfterName, attr.inputOnAfterFunc)"
48
- v-on="generateDynamicEvents(attr.inputOnAfterFunc, attr)"
49
- style="width: auto; min-width: 4rem; max-width: 6rem"
50
- />
51
- </a-input-group>
52
- <a-input-number
53
- v-else-if="attr.numberInput && !readOnly"
54
- v-model="form[attr.model]"
55
- :whitespace="true"
56
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
57
- :disabled="disabled && !readOnly"
58
- style="width:100%"
59
- @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
60
- @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
61
- :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
62
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
63
- :ref="`${attr.model}input`"/>
64
- <a-input
65
- v-else
66
- v-model="form[attr.model]"
67
- :whitespace="true"
68
- :read-only="readOnly"
69
- :disabled="disabled && !readOnly"
70
- @input="attr.dataChangeFunc && debouncedDataChangeFunc()"
71
- :suffix="attr.inputSuffix && mode !== '新增' ? attr.inputSuffix : ''"
72
- style="width:100%"
73
- @blur="mode !== '查询' && attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
74
- @keyup.enter="mode !== '查询' && attr.inputOnEnterFunc && emitFunc(attr.inputOnEnterFunc, attr)"
75
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
76
- :ref="`${attr.model}input`"/>
77
- </a-form-model-item>
78
- </x-form-col>
79
- <!-- 下拉框 -->
80
- <x-form-col
81
- v-else-if="attr.type === 'select' && show"
82
- :labelCol="labelCol"
83
- :flex="attr.flex">
84
- <a-form-model-item
85
- :rules="rules"
86
- v-if="!attr.showMode || mode === '查询' || attr.showMode === 'select' "
87
- :ref="attr.model"
88
- :label="showLabel?attr.name:undefined"
89
- :prop="attr.prop ? attr.prop : attr.model">
90
- <!-- <span slot="label" class="label-box">{{ showLabel?attr.name:undefined }}</span>-->
91
- <a-select
92
- v-if="!attr.lazyLoad || attr.lazyLoad === 'false'"
93
- v-model="form[attr.model]"
94
- :disabled="disabled"
95
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
96
- :filter-option="filterOption"
97
- :getPopupContainer="getPopupContainer"
98
- dropdownClassName="custom-dropdown"
99
- :dropdownMatchSelectWidth="false"
100
- :dropdownStyle="{ position: 'absolute'}"
101
- :placeholder="attr.placeholder ? attr.placeholder : '请选择'"
102
- show-search
103
- :allowClear="true"
104
- >
105
- <a-select-option
106
- v-if="mode === '查询'"
107
- key="999999"
108
- value="">全部
109
- </a-select-option>
110
- <template v-if="attr.keys">
111
- <a-select-option
112
- v-for="(item,index) in attr.keys"
113
- :key="index.value"
114
- :value="item.value + ''">
115
- {{ item.label }}
116
- </a-select-option>
117
- </template>
118
- <template v-else>
119
- <template
120
- v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
121
- ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
122
- <a-select-option
123
- v-for="(item,index) in option"
124
- :key="index.value"
125
- :value="item.value + ''">
126
- <template v-if="attr.keyName.indexOf('config@') !== -1 && item.status">
127
- <!-- 徽标(badge) -->
128
- <a-badge v-if="item.status !== 'gary'" :color="item.status" :text="item.label"/>
129
- <a-badge v-else color="#D9D9D9" :text="item.label"/>
130
- </template>
131
- <template v-else>
132
- {{ item.label }}
133
- </template>
134
- </a-select-option>
135
- </template>
136
- <template
137
- v-else-if="attr.keyName.indexOf('async ') !== -1 || attr.keyName.indexOf('function ') !== -1">
138
- <a-select-option
139
- v-for="(item,index) in optionForFunc"
140
- :key="index.value"
141
- :value="item.value + ''">
142
- <template>
143
- {{ item.label }}
144
- </template>
145
- </a-select-option>
146
- </template>
147
- <template v-else>
148
- <a-select-option
149
- v-for="item in $appdata.getDictionaryList(attr.keyName)"
150
- :key="item.value"
151
- :value="item.value + ''">
152
- <!-- 徽标(badge) -->
153
- <x-badge
154
- :badge-key="attr.keyName"
155
- :replaceText="item.text"
156
- :value="item.value"
157
- :service-name="serviceName"
158
- :env="env"/>
159
- </a-select-option>
160
- </template>
161
- </template>
162
- </a-select>
163
- <a-select
164
- v-else
165
- v-model="form[attr.model]"
166
- :disabled="disabled"
167
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
168
- :filter-option="filterOption"
169
- :getPopupContainer="getPopupContainer"
170
- dropdownClassName="custom-dropdown"
171
- :dropdownMatchSelectWidth="false"
172
- :dropdownStyle="{ position: 'absolute'}"
173
- :placeholder="attr.placeholder ? attr.placeholder : '搜索' + attr.name"
174
- show-search
175
- @search="fetchFunction"
176
- >
177
- <template #notFoundContent>
178
- <a-spin v-if="searching" size="small"/>
179
- </template>
180
- <a-select-option
181
- v-if="mode === '查询'"
182
- key="999999"
183
- value="">全部
184
- </a-select-option>
185
- <a-select-option
186
- v-for="(item,index) in option"
187
- :key="index"
188
- :value="item.value + ''">{{ item.label }}
189
- </a-select-option>
190
- </a-select>
191
- </a-form-model-item>
192
- <a-form-model-item
193
- :rules="rules"
194
- v-else-if="attr.showMode === 'radioGroup'"
195
- :ref="attr.model"
196
- :label="showLabel?attr.name:undefined"
197
- :prop="attr.prop ? attr.prop : attr.model">
198
- <a-radio-group v-model="form[attr.model]">
199
- <a-radio-button v-for="modeItem in option" :key="modeItem.value" :value="modeItem.value">
200
- {{ modeItem.label }}
201
- </a-radio-button>
202
- </a-radio-group>
203
- </a-form-model-item>
204
- <a-form-model-item
205
- v-else-if="attr.showMode === 'clickChange' && option.length > 0"
206
- :ref="attr.model"
207
- :label="showLabel?attr.name:undefined"
208
- :prop="attr.prop ? attr.prop : attr.model">
209
- <XClickChangeBtn></XClickChangeBtn>
210
- </a-form-model-item>
211
- </x-form-col>
212
- <!-- 多选框 -->
213
- <x-form-col
214
- v-else-if="attr.type === 'checkbox' && show"
215
- :labelCol="labelCol"
216
- :flex="attr.flex">
217
- <a-form-model-item
218
- :rules="rules"
219
- v-if="!attr.showMode || mode === '查询' || attr.showMode === 'select' "
220
- :ref="attr.model"
221
- :label="showLabel?attr.name:undefined"
222
- :prop="attr.prop ? attr.prop : attr.model">
223
- <a-select
224
- class="multiple_select"
225
- style="width:100%"
226
- v-if="!attr.lazyLoad || attr.lazyLoad === 'false'"
227
- v-model="form[attr.model]"
228
- :disabled="disabled"
229
- :filter-option="filterOption"
230
- :getPopupContainer="getPopupContainer"
231
- :placeholder="attr.placeholder ? attr.placeholder : '请选择'"
232
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
233
- mode="multiple"
234
- show-search
235
- allowClear
236
- >
237
- <template v-if="attr.keys">
238
- <a-select-option
239
- v-for="(item,index) in attr.keys"
240
- :key="index"
241
- :value="item.value + ''">
242
- {{ item.label }}
243
- </a-select-option>
244
- </template>
245
- <template v-else>
246
- <template
247
- v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
248
- ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
249
- <a-select-option
250
- v-for="(item,index) in option"
251
- :key="index"
252
- :value="item.value">{{ item.label }}
253
- </a-select-option>
254
- </template>
255
- <template v-else>
256
- <a-select-option
257
- v-for="item in $appdata.getDictionaryList(attr.keyName)"
258
- :key="item.value"
259
- :value="item.value + ''">{{ item.text }}
260
- </a-select-option>
261
- </template>
262
- </template>
263
- </a-select>
264
- <a-select
265
- v-else
266
- class="multiple_select"
267
- v-model="form[attr.model]"
268
- :disabled="disabled"
269
- :filter-option="filterOption"
270
- :getPopupContainer="getPopupContainer"
271
- :placeholder="attr.placeholder ? attr.placeholder : '搜索' + attr.name"
272
- mode="multiple"
273
- style="width:100%"
274
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
275
- show-search
276
- allowClear
277
- @search="fetchFunction"
278
- >
279
- <template #notFoundContent>
280
- <a-spin v-if="searching" size="small"/>
281
- </template>
282
- <a-select-option
283
- v-for="(item,index) in option"
284
- :key="index"
285
- :value="item.value + ''">{{ item.label }}
286
- </a-select-option>
287
- </a-select>
288
- </a-form-model-item>
289
- <a-form-model-item
290
- :rules="rules"
291
- v-else
292
- :ref="attr.model"
293
- :label="showLabel?attr.name:undefined"
294
- :prop="attr.prop ? attr.prop : attr.model">
295
- <a-checkbox-group
296
- v-model="form[attr.model]"
297
- :options="option"
298
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
299
- />
300
- </a-form-model-item>
301
- </x-form-col>
302
- <!-- 单选框 -->
303
- <x-form-col
304
- v-else-if="attr.type === 'radio' && show"
305
- :labelCol="labelCol"
306
- :flex="attr.flex">
307
- <a-form-model-item
308
- :rules="rules"
309
- v-if="!attr.showMode || attr.type === 'radio' "
310
- :ref="attr.model"
311
- :label="showLabel?attr.name:undefined"
312
- :prop="attr.prop ? attr.prop : attr.model">
313
- <a-radio-group
314
- v-model="form[attr.model]"
315
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
316
- >
317
- <template v-if="attr.keys">
318
- <a-radio v-for="(item,index) in attr.keys" :key="index" :value="item.value">
319
- {{ item.label }}
320
- </a-radio>
321
- </template>
322
- <template v-else>
323
- <template
324
- v-if="attr.keyName.indexOf('logic@') !== -1 || attr.keyName.indexOf('config@') !== -1
325
- ||attr.keyName.indexOf('search@') !== -1 || attr.keyName.indexOf('search@') !== -1">
326
- <a-radio v-for="(item,index) in option" :key="index" :value="item.value">
327
- {{ item.label }}
328
- </a-radio>
329
- </template>
330
- <template v-else>
331
- <a-radio v-for="(item,index) in $appdata.getDictionaryList(attr.keyName)" :key="index" :value="item.value">
332
- {{ item.text }}
333
- </a-radio>
334
- </template>
335
- </template>
336
- </a-radio-group>
337
- </a-form-model-item>
338
- <a-form-model-item
339
- :rules="rules"
340
- v-else-if="attr.showMode === 'radioGroup'"
341
- :ref="attr.model"
342
- :label="showLabel?attr.name:undefined"
343
- :prop="attr.prop ? attr.prop : attr.model">
344
- <a-radio-group v-model="form[attr.model]">
345
- <a-radio-button v-for="modeItem in option" :key="modeItem.value" :value="modeItem.value">
346
- {{ modeItem.label }}
347
- </a-radio-button>
348
- </a-radio-group>
349
- </a-form-model-item>
350
- <a-form-model-item
351
- :rules="rules"
352
- v-else-if="attr.showMode === 'clickChange' && option.length > 0"
353
- :ref="attr.model"
354
- :label="showLabel?attr.name:undefined"
355
- :prop="attr.prop ? attr.prop : attr.model">
356
- <XClickChangeBtn></XClickChangeBtn>
357
- </a-form-model-item>
358
- </x-form-col>
359
- <!-- 时间 日期 框整合 -->
360
- <x-form-col
361
- v-else-if="['datePicker', 'rangePicker', 'yearPicker', 'monthPicker', 'yearRangePicker', 'monthRangePicker'].includes(attr.type) && show"
362
- :labelCol="labelCol"
363
- :flex="attr.flex">
364
- <a-form-model-item
365
- :rules="rules"
366
- :ref="attr.model"
367
- :label="showLabel?attr.name:undefined"
368
- :prop="attr.prop ? attr.prop : attr.model">
369
- <XFormDatePicker
370
- :attr="attr"
371
- :mode="mode"
372
- :disabled="disabled"
373
- :readOnly="readOnly"
374
- :showLabel="showLabel"
375
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
376
- v-model="form[attr.model]"/>
377
- </a-form-model-item>
378
- </x-form-col>
379
- <!-- 文本域 -->
380
- <x-form-col
381
- v-else-if="attr.type === 'textarea' && show"
382
- :labelCol="labelCol"
383
- :flex="attr.flex">
384
- <!-- :style="layout === 'inline'?{width:'calc(100% - 60px)'}:{}"-->
385
- <a-form-model-item
386
- :rules="rules"
387
- :ref="attr.model"
388
- :label="showLabel?attr.name:undefined"
389
- :prop="attr.prop ? attr.prop : attr.model">
390
- <a-textarea
391
- v-model="form[attr.model]"
392
- style="width: 100%;"
393
- :disabled="disabled"
394
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
395
- :rows="4"/>
396
- </a-form-model-item>
397
- </x-form-col>
398
- <!-- 文件上传 -->
399
- <x-form-col
400
- v-else-if="(attr.type === 'file' || attr.type === 'image') && show"
401
- :labelCol="labelCol"
402
- :flex="attr.flex">
403
- <a-form-model-item
404
- :rules="rules"
405
- :ref="attr.model"
406
- :label="showLabel?attr.name:undefined"
407
- :prop="attr.prop ? attr.prop : attr.model">
408
- <upload
409
- :files="files"
410
- :images="images"
411
- :model="attr"
412
- v-bind="attr"
413
- :service-name="serviceName"
414
- @setFiles="setFiles"></upload>
415
- </a-form-model-item>
416
- </x-form-col>
417
- <!-- 省市区选择框 -->
418
- <x-form-col
419
- v-else-if="attr.type === 'citySelect' && show"
420
- :labelCol="labelCol"
421
- :flex="attr.flex">
422
- <a-form-model-item
423
- :rules="rules"
424
- :ref="attr.model"
425
- :label="showLabel?attr.name:undefined"
426
- :prop="attr.prop ? attr.prop : attr.model">
427
- <citySelect
428
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
429
- ref="citySelect"
430
- v-model="form[attr.model]"
431
- :contexts="attr.contexts"
432
- :value-type="attr.valueType"
433
- :default-value="form[attr.model]"></citySelect>
434
- </a-form-model-item>
435
- </x-form-col>
436
- <!-- 地点搜索框 -->
437
- <x-form-col
438
- v-else-if="attr.type === 'addressSearch' && show"
439
- :labelCol="labelCol"
440
- :occupyCol="attr.occupyCol"
441
- :flex="attr.flex">
442
- <a-form-model-item
443
- :rules="rules"
444
- :ref="attr.model"
445
- :label="showLabel?attr.name:undefined"
446
- :prop="attr.prop ? attr.prop : attr.model">
447
- <address-search-combobox
448
- :emitFunc="emitFunc"
449
- :attr="attr"
450
- :read-only="readOnly"
451
- v-model="searchResult"
452
- :resultKeys="{ address: attr.model, coords: `${attr.model}_lng_lat` }"
453
- ref="addressSearchCombobox"
454
- searchResultType="Object"
455
- @onSelect="addressSearchComboboxSelect"
456
- @onDivisionsChange="onDivisionsChange"
457
- ></address-search-combobox>
458
- </a-form-model-item>
459
- </x-form-col>
460
- <!-- 人员选择框 -->
461
- <x-form-col
462
- v-else-if="attr.type === 'personSetting' && show"
463
- :labelCol="labelCol"
464
- :flex="attr.flex">
465
- <a-form-model-item
466
- :rules="rules"
467
- :ref="attr.model"
468
- :label="showLabel?attr.name:undefined"
469
- :prop="attr.prop ? attr.prop : attr.model">
470
- <PersonSetting v-model="form[attr.model]"></PersonSetting>
471
- </a-form-model-item>
472
- </x-form-col>
473
- <!-- 树形选择框 -->
474
- <x-form-col
475
- v-else-if="attr.type === 'treeSelect' && show"
476
- :labelCol="labelCol"
477
- :flex="attr.flex">
478
- <x-tree-select
479
- :rules="rules"
480
- @onChange="attr.dataChangeFunc && debouncedDataChangeFunc()"
481
- v-model="form[attr.model]"
482
- :attr="attr"
483
- @mounted="itemMounted"
484
- ref="xTreeSelect">
485
- </x-tree-select>
486
- </x-form-col>
487
- <!-- 列表选择框 -->
488
- <x-form-col
489
- v-else-if="attr.type === 'listSelect' && show"
490
- :labelCol="labelCol"
491
- :flex="attr.flex">
492
- <a-form-model-item
493
- :rules="rules"
494
- :ref="attr.model"
495
- :label="showLabel?attr.name:undefined"
496
- :style="layout === 'inline'&& attr.occupyCol && attr.occupyCol > 1? {width:`calc(100% - ${attr.occupyCol * 1.533}rem)`}:{}"
497
- :prop="attr.prop ? attr.prop : attr.model">
498
- <a-popover
499
- ref="rowChoosePopover"
500
- :visible="rowChoosePopoverVisible"
501
- title="选择数据"
502
- placement="bottom"
503
- trigger="focus"
504
- :arrowPointAtCenter="true"
505
- :overlayStyle="{ width: '1000px', height: '30vh' }">
506
- <template #content>
507
- <x-report
508
- v-if="isCover"
509
- :use-oss-for-img="false"
510
- :config-name="queryParamsName"
511
- :service-name="serviceName"
512
- :show-img-in-cell="true"
513
- :display-only="true"
514
- :edit-mode="false"
515
- :show-save-button="true"
516
- :no-padding="true"
517
- :dont-format="true"
518
- @rowChoose="rowChoose"
519
- @cancel="closeRowChooseInput"
520
- >
521
- </x-report>
522
- <x-form-table
523
- v-else
524
- title="请选择数据"
525
- :queryParamsName="queryParamsName"
526
- :rowSelectMode="true"
527
- :allowSelectRowNum="1"
528
- :service-name="serviceName"
529
- :fixed-query-form="rowChooseFixedQueryValue"
530
- @rowChoose="rowChoose"
531
- @afterQuery="rowChooseSearchAfterQuery"
532
- ref="rowChooseTable">
533
- <template #button>
534
- <a-button @click="closeRowChooseInput">
535
- 关闭
536
- </a-button>
537
- </template>
538
- </x-form-table>
539
- </template>
540
- <a-input
541
- v-model="form[attr.model]"
542
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
543
- @change="searchRowChooseData"
544
- @focus="showCloseRowChooseInput"/>
545
- </a-popover>
546
- </a-form-model-item>
547
- </x-form-col>
548
- <!-- 评分框 -->
549
- <x-form-col
550
- v-else-if="attr.type === 'rate' && show"
551
- :labelCol="labelCol"
552
- :flex="attr.flex">
553
- <a-form-model-item
554
- :rules="rules"
555
- :ref="attr.model"
556
- :label="showLabel?attr.name:undefined"
557
- :prop="attr.prop ? attr.prop : attr.model">
558
- <x-rate
559
- v-model="form[attr.model]"
560
- :mode="mode"
561
- :disabled="disabled"
562
- :query-type="attr.queryType"
563
- :max-count="attr.maxCount"
564
- :allow-half="attr.allowHalf"
565
- :icon="attr.rateIcon"
566
- :placeholder="attr.placeholder ? attr.placeholder : '请选择'+attr.name.replace(/\s*/g, '')"
567
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
568
- />
569
- </a-form-model-item>
570
- </x-form-col>
571
- <!-- 区间选择器 -->
572
- <x-form-col
573
- v-else-if="attr.type === 'intervalPicker' && show"
574
- :labelCol="labelCol"
575
- :flex="attr.flex">
576
- <a-form-model-item
577
- :rules="rules"
578
- :ref="attr.model"
579
- :label="showLabel?attr.name:undefined"
580
- :prop="attr.prop ? attr.prop : attr.model">
581
- <x-interval-picker
582
- v-model="form[attr.model]"
583
- :mode="mode"
584
- :read-only="readOnly"
585
- :disabled="disabled && !readOnly"
586
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
587
- :start-placeholder="attr.startPlaceholder || '起始值'"
588
- :end-placeholder="attr.endPlaceholder || '结束值'"
589
- @blur="attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
590
- />
591
- </a-form-model-item>
592
- </x-form-col>
593
- <!-- 车牌号选择 -->
594
- <x-form-col
595
- v-else-if="attr.type === 'licensePlate' && show"
596
- :labelCol="labelCol"
597
- :flex="attr.flex">
598
- <a-form-model-item
599
- :rules="rules"
600
- :ref="attr.model"
601
- :label="showLabel?attr.name:undefined"
602
- :style="layout === 'inline'&& attr.occupyCol && attr.occupyCol > 1? {width:`calc(100% - ${attr.occupyCol * 1.533}rem)`}:{}"
603
- :prop="attr.prop ? attr.prop : attr.model">
604
- <!-- 如果配置了后置按钮插槽 -->
605
- <a-input
606
- v-if="mode ==='查询'"
607
- v-model="form[attr.model]"
608
- :whitespace="true"
609
- :read-only="readOnly"
610
- :disabled="disabled && !readOnly"
611
- style="width:100%"
612
- @blur="attr.inputOnBlurFunc && emitFunc(attr.inputOnBlurFunc,attr)"
613
- :placeholder="attr.placeholder ? attr.placeholder : '请输入'+attr.name.replace(/\s*/g, '')"
614
- :ref="`${attr.model}input`"/>
615
- <x-license-plate
616
- v-else
617
- v-model="form[attr.model]"
618
- @change="attr.dataChangeFunc && debouncedDataChangeFunc()"
619
- ></x-license-plate>
620
- </a-form-model-item>
621
- </x-form-col>
622
- <!-- 录音 -->
623
- <x-form-col
624
- v-else-if="attr.type === 'recording' && show"
625
- :labelCol="labelCol"
626
- :flex="attr.flex">
627
- <recording
628
- ref="recording"
629
- @recordingData="recordingData"
630
- >
631
- </recording>
632
- </x-form-col>
633
- <!-- 表格录入 -->
634
- <x-form-col
635
- v-else-if="attr.type === 'rowEdit' && show"
636
- :labelCol="labelCol"
637
- :flex="attr.flex">
638
- <a-form-model-item
639
- :rules="rules"
640
- :ref="attr.model"
641
- :label="showLabel?attr.name:undefined"
642
- :prop="attr.prop ? attr.prop : attr.model">
643
- <x-form-table
644
- :key="'childTable_' + attr.model"
645
- :title="attr.name"
646
- :queryParamsName="attr.crud"
647
- :localEditMode="true"
648
- :fixed-query-form="childTableFixedQueryForm(attr)"
649
- :service-name="serviceName"
650
- @hook:mounted="(h)=>onComponentMounted(h, attr)"
651
- :ref="'childXFormTable_' + attr.model">
652
- </x-form-table>
653
- </a-form-model-item>
654
- </x-form-col>
655
- </template>
656
- <script>
657
- import { debounce } from 'ant-design-vue/lib/vc-table/src/utils'
658
- import XFormCol from '@vue2-client/base-client/components/common/XFormCol'
659
- import XBadge from '@vue2-client/base-client/components/common/XBadge'
660
- import CitySelect from '@vue2-client/base-client/components/common/CitySelect'
661
- import PersonSetting from '@vue2-client/base-client/components/common/PersonSetting'
662
- import AddressSearchCombobox from '@vue2-client/base-client/components/common/AddressSearchCombobox'
663
- import Upload from '@vue2-client/base-client/components/common/Upload'
664
- import moment from 'moment'
665
- import { getConfigByName, runLogic, getConfigByNameAsync } from '@vue2-client/services/api/common'
666
- import * as util from '@vue2-client/utils/util'
667
- import XTreeSelect from '@vue2-client/base-client/components/common/XForm/XTreeSelect'
668
- import { searchToListOption, searchToOption } from '@vue2-client/services/v3Api'
669
- import { mapState } from 'vuex'
670
- import { executeStrFunctionByContext } from '@vue2-client/utils/runEvalFunction'
671
- import XLicensePlate from '@vue2-client/base-client/components/common/XLicensePlate/XLicensePlate.vue'
672
- import XStatusButton from './XStatusButton.vue'
673
- import XClickChangeBtn from './itemComponent/XClickChangeBtn'
674
- import 'moment/locale/zh-cn'
675
- import XFormDatePicker from '@vue2-client/base-client/components/common/XDatePicker/index.vue'
676
- import XIntervalPicker from '@vue2-client/base-client/components/common/XIntervalPicker/XIntervalPicker.vue'
677
- import XRate from '@vue2-client/base-client/components/common/XRate/index.vue'
678
-
679
- export default {
680
- name: 'XFormItem',
681
- components: {
682
- XFormDatePicker,
683
- XFormTable: () => import('@vue2-client/base-client/components/common/XFormTable/XFormTable.vue'),
684
- Recording: () => import('@vue2-client/base-client/components/common/Recording/Recording.vue'),
685
- XReport: () => import('@vue2-client/base-client/components/common/XReportGrid/XReport.vue'),
686
- XLicensePlate,
687
- XTreeSelect,
688
- XFormCol,
689
- XBadge,
690
- CitySelect,
691
- PersonSetting,
692
- AddressSearchCombobox,
693
- Upload,
694
- XStatusButton,
695
- XClickChangeBtn,
696
- XIntervalPicker,
697
- XRate
698
- },
699
- data () {
700
- // 检索去抖
701
- this.fetchFunction = debounce(this.fetchFunction, 800)
702
- return {
703
- option: [],
704
- // 最后检索版本
705
- lastFetchId: 0,
706
- // 检索中
707
- searching: false,
708
- searchResult: '',
709
- optionForFunc: [],
710
- // 控制当前表单项是否展示
711
- show: true,
712
- // moment
713
- moment,
714
- // 行选择器浮层是否显示
715
- rowChoosePopoverVisible: false,
716
- // 行选择器CRUD固定查询值
717
- rowChooseFixedQueryValue: undefined
718
- }
719
- },
720
- props: {
721
- attr: {
722
- type: Object,
723
- default:
724
- () => {
725
- return {}
726
- }
727
- },
728
- form: {
729
- type: Object,
730
- required:
731
- true
732
- },
733
- disabled: {
734
- type: Boolean,
735
- default:
736
- () => {
737
- return false
738
- }
739
- },
740
- readOnly: {
741
- type: Boolean,
742
- default:
743
- () => {
744
- return false
745
- }
746
- },
747
- mode: {
748
- type: String,
749
- default:
750
- () => {
751
- return '查询'
752
- }
753
- },
754
- files: {
755
- type: Array,
756
- default:
757
- () => {
758
- return []
759
- }
760
- },
761
- images: {
762
- type: Array,
763
- default:
764
- () => {
765
- return []
766
- }
767
- },
768
- serviceName: {
769
- type: String,
770
- default:
771
- undefined
772
- },
773
- // 调用logic获取数据源的追加参数
774
- getDataParams: {
775
- type: Object,
776
- default:
777
- undefined
778
- },
779
- // 布局
780
- layout: {
781
- type: String,
782
- default:
783
- 'horizontal'
784
- },
785
- // 环境
786
- env: {
787
- type: String,
788
- default:
789
- () => {
790
- return 'prod'
791
- }
792
- },
793
- // 设置表单值
794
- setForm: {
795
- type: Function,
796
- default: (val) => {
797
- console.log(val)
798
- }
799
- },
800
- showLabel: {
801
- type: Boolean,
802
- default:
803
- () => {
804
- return true
805
- }
806
- },
807
- labelCol: {
808
- type: Object,
809
- default: () => {
810
- return { span: 8 }
811
- }
812
- },
813
- rules: {
814
- type: Array,
815
- default:
816
- () => {
817
- return undefined
818
- }
819
- }
820
- },
821
- provide () {
822
- return {
823
- FormItemContext: this
824
- }
825
- },
826
- created () {
827
- this.init()
828
- if (this.attr.keyName && (this.attr?.keyName?.toString().indexOf('async ') !== -1 || this.attr?.keyName?.toString()?.indexOf('function') !== -1)) {
829
- this.debouncedUpdateOptions = debounce(this.updateOptions, 200)
830
- }
831
- if (this.attr.dataChangeFunc) {
832
- this.debouncedDataChangeFunc = debounce(this.dataChangeFunc, 200)
833
- // 执行一次
834
- this.dataChangeFunc()
835
- }
836
- if (this.attr.showFormItemFunc) {
837
- this.debouncedShowFormItemFunc = debounce(this.showFormItemFunc, 100)
838
- // 执行一次
839
- this.showFormItemFunc()
840
- }
841
- if (this.attr.showQueryFormItemFunc) {
842
- this.debouncedShowQueryFormItemFunc = debounce(this.showQueryFormItemFunc, 100)
843
- // 执行一次
844
- this.showFormItemFunc()
845
- }
846
- // 人员联动框增加监听
847
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动人员')) {
848
- this.debouncedUserLinkFunc = debounce(() => this.updateResOptions('人员'), 200)
849
- }
850
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动部门')) {
851
- this.debouncedDepLinkFunc = debounce(() => this.updateResOptions('部门'), 200)
852
- }
853
- // xTreeSelect 自己调用 mounted
854
- if (this.attr.type !== 'treeSelect') {
855
- this.$emit('mounted', this.attr)
856
- }
857
- },
858
- computed: {
859
- ...mapState('account', { currUser: 'user' }),
860
- queryParamsName () {
861
- if (this.attr.keyName.startsWith('function')) {
862
- // 调用异步函数获取内容
863
- return executeStrFunctionByContext(this, this.attr.keyName, [this.form, runLogic, this.mode, getConfigByNameAsync])
864
- } else {
865
- // 按现有方式处理
866
- return this.attr.keyName.split('@')[this.attr.keyName.split('@').length - 1]
867
- }
868
- },
869
- // 判断弹出时是否Cover,弹出只支持Cover以及CRUD
870
- isCover () {
871
- // 如果 queryParamsName 为空,返回空
872
- if (!this.queryParamsName) {
873
- return false
874
- }
875
- const result = this.queryParamsName.endsWith('Cover')
876
- return result
877
- },
878
- },
879
- watch: {
880
- attr: {
881
- handler () {
882
- this.init()
883
- },
884
- deep: true
885
- },
886
- form: {
887
- handler (newVal, oldVal) {
888
- // 如果是从函数获取 options
889
- if (this.attr.keyName && (this.attr.keyName.toString().indexOf('async ') !== -1 || this.attr.keyName.toString().indexOf('function') !== -1)) {
890
- this.debouncedUpdateOptions()
891
- }
892
- // 如果有自定义是否展示表单项函数
893
- if (this.attr.showFormItemFunc) {
894
- this.debouncedShowFormItemFunc()
895
- }
896
- // 如果有自定义是否展示查询表单项函数
897
- if (this.attr.showQueryFormItemFunc) {
898
- this.debouncedShowQueryFormItemFunc()
899
- }
900
- // 地址搜索框赋值
901
- if (this.attr.type === 'addressSearch') {
902
- this.$refs.addressSearchCombobox.addressInput = this.form[this.attr.model]
903
- }
904
- // 数据源来自人员联动时更新数据
905
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动人员')) {
906
- this.debouncedUserLinkFunc()
907
- }
908
- // 数据源来自人员联动时更新数据
909
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString().endsWith(']联动部门')) {
910
- this.debouncedDepLinkFunc()
911
- }
912
- },
913
- deep: true
914
- }
915
- },
916
- inject: {
917
- getComponentByName: {
918
- default: () => () => {
919
- console.warn('getComponentByName is not provided')
920
- return null // 或者返回一个默认的函数
921
- },
922
- },
923
- registerComponent: {
924
- default: () => () => {
925
- console.warn('registerComponent is not provided')
926
- return null // 或者返回一个默认的函数
927
- },
928
- },
929
- getSelf: {
930
- default: () => () => {
931
- console.warn('getSelf is not provided')
932
- return null // 或者返回一个默认的函数
933
- },
934
- },
935
- XFormContext: {
936
- default: () => () => {
937
- console.warn('XFormContext is not provided')
938
- return null // 或者返回一个默认的函数
939
- },
940
- },
941
- setRequired: {
942
- default: () => () => {
943
- console.warn('setRequired is not provided')
944
- return null // 或者返回一个默认的函数
945
- },
946
- },
947
- removeRequired: {
948
- default: () => () => {
949
- console.warn('removeRequired is not provided')
950
- return null // 或者返回一个默认的函数
951
- },
952
- }
953
- },
954
- methods: {
955
- // 把内部的crud表单录入放到表单中,以便外部可以调用
956
- onComponentMounted (h, attr) {
957
- console.log('crud表单', h)
958
- if (attr.crud) {
959
- this.registerComponent(attr.model, this.$refs['childXFormTable_' + attr.model])
960
- }
961
- },
962
- childTableFixedQueryForm (item) {
963
- console.log('传递的form', this.form)
964
- if (this.modifyModelData?.primaryKeyData) {
965
- const fixedForm = {}
966
- fixedForm[item.childTableForeignKeyName] = Object.values(this.modifyModelData.primaryKeyData)[0]
967
- return fixedForm
968
- }
969
- return null
970
- },
971
- // 动态生成事件绑定对象
972
- generateDynamicEvents (inputOnAfterFunc, attr) {
973
- const events = {}
974
- const states = this.parseStates(attr.inputOnAfterName, inputOnAfterFunc)
975
-
976
- states.forEach((state) => {
977
- // 动态绑定事件名到 emitFunc
978
- events[state.event] = () => {
979
- console.info('事件名', state.event)
980
- this.emitFunc(state.event, attr)
981
- }
982
- })
983
-
984
- return events // 返回 { state1Event: handler, state2Event: handler, ... }
985
- },
986
- parseStates (input, events) {
987
- const eventNames = events.split('|')
988
- return input.split('|').map((label, index) => ({
989
- label,
990
- event: eventNames[index] // 如果没有提供事件名称,则使用默认值
991
- }))
992
- },
993
- focusInput () {
994
- if (this.attr.defaultFocus) {
995
- this.$nextTick(h => {
996
- const el = this.$refs[`${this.attr.model}input`]?.$el
997
- let inputEl
998
- if (el) {
999
- if (el.tagName.toLowerCase() === 'input') {
1000
- inputEl = el
1001
- } else {
1002
- inputEl = el.querySelector('input')
1003
- }
1004
- }
1005
- if (inputEl) {
1006
- inputEl.focus()
1007
- if (inputEl.type === 'number') {
1008
- if (inputEl.valueAsNumber) {
1009
- inputEl.setSelectionRange(0, inputEl.valueAsNumber.toString().length)
1010
- }
1011
- } else {
1012
- if (inputEl.value) {
1013
- inputEl.setSelectionRange(0, inputEl.value.length)
1014
- }
1015
- }
1016
- }
1017
- })
1018
- }
1019
- },
1020
- // 更新人员下拉框数据
1021
- async updateResOptions (type) {
1022
- if (this?.attr?.keyName?.toString()?.startsWith('search@根据表单项[') && this?.attr?.keyName?.toString()?.endsWith(`]联动${type}`)) {
1023
- const startIndex = this.attr.keyName.indexOf('[') + 1
1024
- const endIndex = this.attr.keyName.indexOf(']', startIndex)
1025
- const fromModel = this.attr.keyName.substring(startIndex, endIndex).replace('.', '_')
1026
- const formModelData = Array.isArray(this.form[fromModel])
1027
- ? this.form[fromModel]
1028
- : [this.form[fromModel]]
1029
- if (fromModel?.length && formModelData?.length) {
1030
- const searchData = { source: `获取${type}`, userid: this.currUser.id, filter: formModelData, filterType: fromModel.indexOf('org') > -1 ? 'org' : 'dep' }
1031
- await searchToListOption(searchData, res => {
1032
- this.getDataCallback(
1033
- res.filter(h => {
1034
- if (fromModel.indexOf('org') > -1) {
1035
- return formModelData?.includes(h.orgid || h.f_organization_id || h.parentid)
1036
- } else {
1037
- return formModelData?.includes(h?.parentid)
1038
- }
1039
- }
1040
- )
1041
- )
1042
- })
1043
- }
1044
- }
1045
- },
1046
- // js 函数作为数据源
1047
- async updateOptions () {
1048
- if (this.attr.keyName && (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1)) {
1049
- this.optionForFunc = await executeStrFunctionByContext(this, this.attr.keyName, [this.form, runLogic, this.mode, getConfigByNameAsync])
1050
- }
1051
- },
1052
- async dataChangeFunc () {
1053
- if (this.attr.dataChangeFunc) {
1054
- await executeStrFunctionByContext(this, this.attr.dataChangeFunc, [this.form, this.setForm, this.attr, util, this.mode, runLogic, getConfigByNameAsync])
1055
- }
1056
- },
1057
- async showFormItemFunc () {
1058
- if (this.attr.showFormItemFunc) {
1059
- const obj = executeStrFunctionByContext(this, this.attr.showFormItemFunc, [this.form, this.setForm, this.attr, util, this.mode])
1060
- // 判断是 bool 还是 obj 兼容
1061
- if (typeof obj === 'boolean') {
1062
- this.show = obj
1063
- } else if (obj && typeof obj === 'object') {
1064
- // obj 是一个对象,并且不是数组
1065
- this.show = obj?.show
1066
- this.readOnly = obj?.readOnly
1067
- }
1068
- } else {
1069
- this.show = true
1070
- }
1071
- },
1072
- async showQueryFormItemFunc () {
1073
- if (this.attr.showQueryFormItemFunc) {
1074
- const obj = executeStrFunctionByContext(this, this.attr.showQueryFormItemFunc, [this.form, this.setForm, this.attr, util, this.mode])
1075
- // 判断是 bool 还是 obj 兼容
1076
- if (typeof obj === 'boolean') {
1077
- this.show = obj
1078
- } else if (obj && typeof obj === 'object') {
1079
- // obj 是一个对象,并且不是数组
1080
- this.show = obj?.show
1081
- this.readOnly = obj?.readOnly
1082
- }
1083
- } else {
1084
- this.show = true
1085
- }
1086
- },
1087
- init () {
1088
- if (!this.attr.flex) {
1089
- if (this.mode === '新增/修改') {
1090
- if (['horizontal', 'vertical'].includes(this.layout) || ['textarea', 'file', 'image'].includes(this.attr.type)) {
1091
- // 新增修改表单 horizontal 模式下默认为一行
1092
- this.attr.flex = {
1093
- xs: 24,
1094
- sm: 24,
1095
- md: 24,
1096
- lg: 24,
1097
- xl: 24,
1098
- xxl: 24,
1099
- fullWidth: true
1100
- }
1101
- } else {
1102
- // 新增修改表单 vertical 模式下默认为1列
1103
- this.attr.flex = {
1104
- xs: 24,
1105
- sm: 12,
1106
- md: 8,
1107
- lg: 8,
1108
- xl: 6,
1109
- xxl: 6
1110
- }
1111
- }
1112
- } else {
1113
- this.attr.flex = {
1114
- xs: 24,
1115
- sm: 24,
1116
- md: 8,
1117
- lg: 6,
1118
- xl: 6,
1119
- xxl: 6
1120
- }
1121
- }
1122
- }
1123
- if (this.attr.keyName && typeof this.attr.keyName === 'string') {
1124
- if (this.attr.keyName.indexOf('logic@') !== -1) {
1125
- this.getData({}, res => this.getDataCallback(res))
1126
- } else if (this.attr.keyName.indexOf('search@') !== -1) {
1127
- // `tool.getFullTree(this.getRights().where(row.getType()==$organization$))`
1128
- // 判断是否根据角色查询
1129
- let source = this.attr.keyName.substring(7)
1130
- const userid = this.currUser.id
1131
- let roleName = 'roleName'
1132
- if (source.startsWith('根据角色[') && source.endsWith(']获取人员')) {
1133
- const startIndex = source.indexOf('[') + 1
1134
- const endIndex = source.indexOf(']', startIndex)
1135
- roleName = source.substring(startIndex, endIndex)
1136
- source = '根据角色获取人员'
1137
- }
1138
- const searchData = { source, userid, roleName }
1139
- // 判断是否根据某个表单项联动 仅返回列表结构并筛选
1140
- if (source.startsWith('根据表单项[') && source.endsWith(']联动人员')) {
1141
- this.updateResOptions('人员')
1142
- } else if (source.startsWith('根据表单项[') && source.endsWith(']联动部门')) {
1143
- this.updateResOptions('部门')
1144
- } else if (this.attr.type === 'select' || this.attr.type === 'checkbox') {
1145
- // 仅获取最内层数据
1146
- searchToListOption(searchData, res => this.getDataCallback(res))
1147
- } else {
1148
- // 其他资源通用逻辑
1149
- searchToOption(searchData, res => this.getDataCallback(res))
1150
- }
1151
- } else if (this.attr.keyName.indexOf('config@') !== -1) {
1152
- const configName = this.attr.keyName.substring(7)
1153
- getConfigByName(configName, this.serviceName, res => {
1154
- this.getDataCallback(res.value)
1155
- }, this.env === 'dev')
1156
- } else if (this.attr.keyName.indexOf('async ') !== -1 || this.attr.keyName.indexOf('function ') !== -1) {
1157
- this.updateOptions()
1158
- }
1159
- } else if (this.attr.keys) {
1160
- this.getDataCallback(this.attr.keys)
1161
- }
1162
- this.focusInput()
1163
- },
1164
- addressSearchComboboxSelect (data) {
1165
- const result = JSON.parse(data)
1166
- if (result) {
1167
- // 如果是坐标搜索,只存放坐标
1168
- if (this.attr.type === 'coordinateSearch') {
1169
- if (Array.isArray(result)) {
1170
- this.form[this.attr.model] = result[0]
1171
- } else if (typeof result === 'object') {
1172
- this.form[this.attr.model] = result[this.attr.resultKeys?.coords || 'coords']
1173
- }
1174
- } else {
1175
- // 普通地址搜索,存放地址和坐标
1176
- if (Array.isArray(result)) {
1177
- this.form[this.attr.model] = result[0]
1178
- this.form[`${this.attr.model}_lng_lat`] = result[1]
1179
- } else if (typeof result === 'object') {
1180
- this.form[this.attr.model] = result[this.attr.resultKeys?.address || 'address']
1181
- this.form[`${this.attr.model}_lng_lat`] = result[this.attr.resultKeys?.coords || 'coords']
1182
- }
1183
- }
1184
- }
1185
- },
1186
- onDivisionsChange (data) {
1187
- this.emitFunc('addressSearchComboboxSelect', {
1188
- key: this.attr.model,
1189
- value: data
1190
- })
1191
- },
1192
- getDataCallback (res) {
1193
- this.option = res
1194
- if (this.attr.type === 'treeSelect') {
1195
- this.$nextTick(() => {
1196
- this.$refs.xTreeSelect.init({
1197
- option: this.option,
1198
- form: this.form,
1199
- queryType: this.attr.queryType,
1200
- name: this.attr.name,
1201
- model: this.attr.model,
1202
- mode: this.mode,
1203
- disabled: this.disabled
1204
- })
1205
- })
1206
- } else if (this.attr.type === 'radio' || ['radioGroup', 'clickChange'].includes(this.attr.showMode)) {
1207
- this.initRadioValue()
1208
- }
1209
- },
1210
- initRadioValue () {
1211
- const model = this.attr.model
1212
- if (this.mode === '新增/修改' && (this.form[model] === undefined || this.form[model] === null) && !this.attr.prop) {
1213
- if (this.attr.keys && this.attr.keys.length > 1) {
1214
- this.form[model] = this.attr.keys[0].value
1215
- } else if (this.option.length > 1) {
1216
- this.form[model] = this.option[0].value
1217
- }
1218
- }
1219
- },
1220
- // 文件框时设置上传组件的值
1221
- setFiles (fileIds) {
1222
- if (!this.form[this.attr.model]) {
1223
- this.form[this.attr.model] = []
1224
- }
1225
- this.form[this.attr.model] = [...fileIds]
1226
- },
1227
- // 懒加载检索方法
1228
- fetchFunction (value) {
1229
- this.lastFetchId += 1
1230
- const fetchId = this.lastFetchId
1231
- this.option = []
1232
- this.searching = true
1233
- this.getData({
1234
- word: value
1235
- }, res => {
1236
- if (fetchId !== this.lastFetchId) {
1237
- return
1238
- }
1239
- this.option = res
1240
- this.searching = false
1241
- })
1242
- },
1243
- // 获取数据
1244
- getData (value, callbackFun) {
1245
- if (value !== '') {
1246
- const logicName = this.attr.keyName
1247
- const logic = logicName.substring(6)
1248
- // 调用logic前设置参数
1249
- if (this.getDataParams && this.getDataParams[this.attr.model]) {
1250
- Object.assign(value, this.getDataParams[this.attr.model])
1251
- }
1252
- runLogic(logic, Object.assign(value, {
1253
- orgId: this.currUser.orgid,
1254
- userId: this.currUser.id
1255
- }), this.serviceName, this.env === 'dev').then(res => {
1256
- callbackFun(res)
1257
- }).catch(e => {
1258
- callbackFun([])
1259
- console.error('获取数据失败:' + e)
1260
- })
1261
- }
1262
- },
1263
- filterOption (input, option) {
1264
- const child = option.componentOptions.children[0]
1265
- if (child.text) {
1266
- return child.text.toLowerCase().indexOf(input.toLowerCase()) >= 0
1267
- } else if (child.elm.innerText) {
1268
- return child.elm.innerText.toLowerCase().indexOf(input.toLowerCase()) >= 0
1269
- } else {
1270
- return child.child.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
1271
- }
1272
- },
1273
- // 表单项变更函数中调用 控制表单组中表单项组名为 groupName 的表单是否展示
1274
- // func:x-form-show(显示)/x-form-no-show(不显示)
1275
- emitShowFormFunc (func, groupName) {
1276
- this.emitFunc(func, groupName)
1277
- },
1278
- emitFunc (func, data) {
1279
- this.$emit('x-form-item-emit-func', func, data, data?.model ? this.form[data.model] : this.form)
1280
- },
1281
- itemMounted (h) {
1282
- this.$emit('mounted', h)
1283
- },
1284
- rowChoose (rows) {
1285
- this.$emit('rowChoose', rows, this.attr, this.closeRowChooseInput)
1286
- },
1287
- searchRowChooseData () {
1288
- if (this.searching) {
1289
- return
1290
- }
1291
- this.lastFetchId += 1
1292
- const fetchId = this.lastFetchId
1293
- this.searching = true
1294
- if (fetchId !== this.lastFetchId) {
1295
- return
1296
- }
1297
- this.rowChooseFixedQueryValue = []
1298
- this.rowChooseFixedQueryValue[this.attr.model] = this.form[this.attr.model]
1299
- this.$nextTick(() => {
1300
- this.$refs.rowChooseTable.refresh(true)
1301
- })
1302
- },
1303
- showCloseRowChooseInput () {
1304
- this.rowChoosePopoverVisible = true
1305
- },
1306
- closeRowChooseInput () {
1307
- this.rowChoosePopoverVisible = false
1308
- },
1309
- rowChooseSearchAfterQuery () {
1310
- this.searching = false
1311
- },
1312
- // 获取 recording 转换后的数据
1313
- getRecodingData () {
1314
- return this.$refs.recording.getRecordingData()
1315
- },
1316
- recordingData (data) {
1317
- this.emitFunc('recordingData', data)
1318
- },
1319
- getPopupContainer (triggerNode) {
1320
- return document.body
1321
- // return triggerNode.parentNode
1322
- },
1323
- }
1324
- }
1325
- </script>
1326
-
1327
- <style lang="less" scoped>
1328
- .custom-dropdown {
1329
- position: absolute;
1330
- z-index: 1050;
1331
- }
1332
- .multiple_select {
1333
- :deep(.ant-select-selection){
1334
- max-height: 32px;
1335
- overflow-y: scroll;
1336
- }
1337
- }
1338
-
1339
- </style>